'Zabbix agent', 'host' => 'Simple form test host', 'filter_check' => true] ], [ ['host' => 'Simple form test host', 'form' => 'testFormDiscoveryRule1'] ], [ ['type' => 'Zabbix agent (active)', 'host' => 'Simple form test host'] ], [ ['type' => 'Simple check', 'host' => 'Simple form test host'] ], [ ['type' => 'SNMP agent', 'host' => 'Simple form test host'] ], [ ['type' => 'Zabbix internal', 'host' => 'Simple form test host'] ], [ ['type' => 'Zabbix trapper', 'host' => 'Simple form test host'] ], [ ['type' => 'External check', 'host' => 'Simple form test host'] ], [ ['type' => 'IPMI agent', 'host' => 'Simple form test host'] ], [ ['type' => 'SSH agent', 'host' => 'Simple form test host'] ], [ ['type' => 'SSH agent', 'authtype' => 'Public key', 'host' => 'Simple form test host' ] ], [ [ 'type' => 'SSH agent', 'authtype' => 'Password', 'host' => 'Simple form test host' ] ], [ ['type' => 'TELNET agent', 'host' => 'Simple form test host'] ], [ ['type' => 'JMX agent', 'host' => 'Simple form test host'] ], [ ['type' => 'Zabbix agent', 'template' => 'Inheritance test template'] ], [ [ 'type' => 'Zabbix agent', 'template' => 'Inheritance test template', 'form' => 'testInheritanceDiscoveryRule1' ] ], [ ['type' => 'Zabbix agent (active)', 'template' => 'Inheritance test template'] ], [ ['type' => 'Simple check', 'template' => 'Inheritance test template'] ], [ ['type' => 'SNMP agent', 'template' => 'Inheritance test template'] ], [ ['type' => 'Zabbix internal', 'template' => 'Inheritance test template'] ], [ ['type' => 'Zabbix trapper', 'template' => 'Inheritance test template'] ], [ ['type' => 'External check', 'template' => 'Inheritance test template'] ], [ ['type' => 'IPMI agent', 'template' => 'Inheritance test template'] ], [ ['type' => 'SSH agent', 'template' => 'Inheritance test template'] ], [ [ 'type' => 'SSH agent', 'authtype' => 'Public key', 'template' => 'Inheritance test template' ] ], [ [ 'type' => 'SSH agent', 'authtype' => 'Password', 'template' => 'Inheritance test template' ] ], [ ['type' => 'TELNET agent', 'template' => 'Inheritance test template'] ], [ ['type' => 'JMX agent', 'template' => 'Inheritance test template'] ] ]; } /** * @dataProvider layout */ public function testFormLowLevelDiscovery_CheckLayout($data) { if (isset($data['template'])) { $this->zbxTestLogin('zabbix.php?action=template.list'); $form = $this->query('name:zbx_filter')->asForm()->waitUntilReady()->one(); $this->filterEntriesAndOpenDiscovery($form, $data['template']); $hostid = 30000; } if (isset($data['host'])) { $this->zbxTestLogin(self::HOST_LIST_PAGE); $form = $this->query('name:zbx_filter')->asForm()->waitUntilReady()->one(); $this->filterEntriesAndOpenDiscovery($form, $data['host']); if (isset($data['templatedHost'])) { $hostid = 30001; } else { $hostid = 40001; } } if (isset($data['form'])) { $this->zbxTestClickLinkTextWait($data['form']); } else { $this->zbxTestContentControlButtonClickTextWait('Create discovery rule'); } $this->zbxTestCheckTitle('Configuration of discovery rules'); $this->zbxTestCheckHeader('Discovery rules'); if (isset($data['templatedHost'])) { $this->zbxTestTextPresent('Parent discovery rules'); if (isset($data['hostTemplate'])) { $this->assertElementPresent("//a[text()='".$data['hostTemplate']."']"); } } else { $this->zbxTestTextNotPresent('Parent discovery rules'); } $this->zbxTestTextPresent('Name'); $this->zbxTestAssertVisibleId('name'); $this->zbxTestAssertAttribute("//input[@id='name']", 'maxlength', 255); $this->zbxTestAssertAttribute("//input[@id='name']", 'autofocus'); if(isset($data['templatedHost'])) { $this->zbxTestAssertAttribute("//input[@id='name']", 'readonly'); } $this->zbxTestTextPresent('Type'); if (!isset($data['templatedHost'])) { $this->zbxTestAssertVisibleId('type'); $this->zbxTestDropdownHasOptions('type', [ 'Zabbix agent', 'Zabbix agent (active)', 'Simple check', 'SNMP agent', 'Zabbix internal', 'Zabbix trapper', 'External check', 'IPMI agent', 'SSH agent', 'TELNET agent', 'JMX agent' ]); if (isset($data['type'])) { $this->zbxTestDropdownSelect('type', $data['type']); $type = $data['type']; } else { $type = $this->zbxTestGetSelectedLabel('type'); } } else { $this->zbxTestAssertVisibleId('typename'); $this->zbxTestAssertAttribute("//input[@id='typename']", 'maxlength', 255); $this->zbxTestAssertAttribute("//input[@id='typename']", 'readonly'); $type = $this->zbxTestGetValue("//input[@id='typename']"); } $this->zbxTestTextPresent('Key'); $this->zbxTestAssertVisibleId('key'); $this->zbxTestAssertAttribute("//input[@id='key']", 'maxlength', 2048); if (isset($data['templatedHost'])) { $this->zbxTestAssertAttribute("//input[@id='key']", 'readonly'); } if (isset($data['host']) && isset($data['form']) && !isset($data['templatedHost'])) { $this->zbxTestAssertElementValue('key', $this->keyForm); } if (isset($data['template']) && isset($data['form'])) { $this->zbxTestAssertElementValue('key', $this->keyInheritance); } if (isset($data['host']) && isset($data['templatedHost'])) { $this->zbxTestAssertElementValue('key', $this->keyInheritance); } if (!isset($data['form'])) { switch($type) { case 'SSH agent': $this->zbxTestAssertElementValue('key', 'ssh.run[,,,,]'); break; case 'TELNET agent': $this->zbxTestAssertElementValue('key', 'telnet.run[,,,]'); break; default: $this->zbxTestAssertElementValue('key', ''); break; } } if (!isset($data['template'])){ $interfaceType = itemTypeInterface($this->zbxTestGetValue('//*[@id="type"]')); switch ($interfaceType) { case INTERFACE_TYPE_SNMP : case INTERFACE_TYPE_IPMI : case INTERFACE_TYPE_AGENT : case INTERFACE_TYPE_ANY : case INTERFACE_TYPE_JMX : case INTERFACE_TYPE_OPT : $this->zbxTestTextPresent('Host interface'); $dbInterfaces = CDBHelper::getAll( 'SELECT type,ip,port'. ' FROM interface'. ' WHERE hostid='.$hostid. (($interfaceType == INTERFACE_TYPE_ANY || $interfaceType === INTERFACE_TYPE_OPT) ? '' : ' AND type='.$interfaceType) ); if ($dbInterfaces) { foreach ($dbInterfaces as $host_interface) { $this->zbxTestAssertElementPresentXpath('//z-select[@id="interface-select"]//li[text()="'. $host_interface['ip'].':'.$host_interface['port'].'"]'); } } else { $this->zbxTestTextPresent('No interface found'); $this->zbxTestAssertNotVisibleId('interface-select'); } break; default: $this->zbxTestTextNotVisible(['Host interface', 'No interface found']); $this->zbxTestAssertNotVisibleId('interface-select'); break; } } $this->zbxTestTextNotPresent('Additional parameters'); $this->zbxTestAssertNotVisibleId('params_ap'); if ($type == 'SSH agent' || $type == 'TELNET agent' ) { $this->zbxTestTextPresent('Executed script'); $this->zbxTestAssertVisibleId('params_es'); $this->zbxTestAssertAttribute("//textarea[@id='params_es']", 'rows', 7); } else { $this->zbxTestTextNotVisible('Executed script'); $this->zbxTestAssertNotVisibleId('params_es'); } if ($type == 'IPMI agent') { $this->zbxTestTextPresent('IPMI sensor'); $this->zbxTestAssertVisibleId('ipmi_sensor'); $this->zbxTestAssertAttribute("//input[@id='ipmi_sensor']", 'maxlength', 128); } else { $this->zbxTestTextNotVisible('IPMI sensor'); $this->zbxTestAssertNotVisibleId('ipmi_sensor'); } if ($type == 'SSH agent') { $this->zbxTestTextPresent('Authentication method'); $this->zbxTestAssertVisibleId('authtype'); $this->zbxTestDropdownHasOptions('authtype', ['Password', 'Public key']); } else { $this->zbxTestTextNotVisible('Authentication method'); $this->zbxTestAssertNotVisibleId('authtype'); } if ($type == 'SSH agent' || $type == 'TELNET agent' || $type == 'JMX agent' || $type == 'Simple check') { $this->zbxTestTextPresent('User name'); $this->zbxTestAssertVisibleId('username'); $this->zbxTestAssertAttribute("//input[@id='username']", 'maxlength', 255); if (isset($authtype) && $authtype == 'Public key') { $this->zbxTestTextPresent('Key passphrase'); } else { $this->zbxTestTextPresent('Password'); } $this->zbxTestAssertVisibleId('password'); $this->zbxTestAssertAttribute("//input[@id='password']", 'maxlength', 255); } else { $this->zbxTestTextNotVisible(['User name', 'Password', 'Key passphrase']); $this->zbxTestAssertNotVisibleId('username'); $this->zbxTestAssertNotVisibleId('password'); } if (isset($authtype) && $authtype == 'Public key') { $this->zbxTestTextPresent('Public key file'); $this->zbxTestAssertVisibleId('publickey'); $this->zbxTestAssertAttribute("//input[@id='publickey']", 'maxlength', 64); $this->zbxTestTextPresent('Private key file'); $this->zbxTestAssertVisibleId('privatekey'); $this->zbxTestAssertAttribute("//input[@id='privatekey']", 'maxlength', 64); } else { $this->zbxTestTextNotVisible('Public key file'); $this->zbxTestAssertNotVisibleId('publickey'); $this->zbxTestTextNotVisible('Private key file'); $this->zbxTestAssertNotVisibleId('publickey'); } if ($type === 'SNMP agent') { $this->zbxTestTextPresent('SNMP OID'); $this->zbxTestAssertVisibleId('snmp_oid'); $this->zbxTestAssertAttribute("//input[@id='snmp_oid']", 'maxlength', 512); $this->zbxTestAssertAttribute("//input[@id='snmp_oid']", 'placeholder', '[IF-MIB::]ifInOctets.1'); } else { $this->zbxTestTextNotVisible('SNMP OID'); $this->zbxTestAssertNotVisibleId('snmp_oid'); } switch ($type) { case 'Zabbix agent': case 'Zabbix agent (active)': case 'Simple check': case 'SNMP agent': case 'Zabbix internal': case 'External check': case 'IPMI agent': case 'SSH agent': case 'TELNET agent': case 'JMX agent': $this->zbxTestTextPresent('Update interval'); $this->zbxTestAssertVisibleId('delay'); $this->zbxTestAssertAttribute("//input[@id='delay']", 'maxlength', 255); if (!isset($data['form'])) { $this->zbxTestAssertElementValue('delay', '1m'); } break; default: $this->zbxTestTextNotVisible('Update interval'); $this->zbxTestAssertNotVisibleId('delay'); } $this->zbxTestTextPresent('Keep lost resources period'); $this->zbxTestAssertVisibleId('lifetime'); $this->zbxTestAssertAttribute("//input[@id='lifetime']", 'maxlength', 255); $this->zbxTestAssertElementValue('lifetime', '30d'); // Custom intervals isn't visible for type 'SNMP trap' and 'Zabbix trapper' if ($type === 'SNMP trap' || $type === 'Zabbix trapper') { $this->zbxTestTextNotVisible(['Custom intervals', 'Interval', 'Period']); $this->zbxTestAssertNotVisibleId('delayFlexTable'); $this->zbxTestTextNotVisible(['Flexible', 'Scheduling']); $this->zbxTestAssertNotVisibleId('delay_flex_0_delay'); $this->zbxTestAssertNotVisibleId('delay_flex_0_period'); $this->zbxTestAssertNotVisibleId('interval_add'); } else { $this->zbxTestTextPresent(['Custom intervals', 'Interval', 'Period', 'Action']); $this->zbxTestAssertVisibleId('delayFlexTable'); $this->zbxTestTextPresent(['Flexible', 'Scheduling']); $this->zbxTestAssertVisibleId('delay_flex_0_delay'); $this->zbxTestAssertAttribute("//input[@id='delay_flex_0_delay']", 'maxlength', 255); $this->zbxTestAssertAttribute("//input[@id='delay_flex_0_delay']", 'placeholder', '50s'); $this->zbxTestAssertVisibleId('delay_flex_0_period'); $this->zbxTestAssertAttribute("//input[@id='delay_flex_0_period']", 'maxlength', 255); $this->zbxTestAssertAttribute("//input[@id='delay_flex_0_period']", 'placeholder', '1-7,00:00-24:00'); $this->zbxTestAssertVisibleId('interval_add'); } if ($type == 'Zabbix trapper') { $this->zbxTestTextPresent('Allowed hosts'); $this->zbxTestAssertVisibleId('trapper_hosts'); $this->zbxTestAssertAttribute("//input[@id='trapper_hosts']", 'maxlength', 255); } else { $this->zbxTestTextNotVisible('Allowed hosts'); $this->zbxTestAssertNotVisibleId('trapper_hosts'); } $this->zbxTestTextPresent('Description'); $this->zbxTestAssertVisibleId('description'); $this->zbxTestAssertAttribute("//textarea[@id='description']", 'rows', 7); $this->zbxTestTextPresent('Enabled'); $this->zbxTestAssertElementPresentId('status'); $this->assertTrue($this->zbxTestCheckboxSelected('status')); $this->zbxTestClickWait('tab_macroTab'); if ($this->zbxTestGetText("//li[contains(@class, 'ui-tabs-active')]/a") != 'Filters') { $this->zbxTestTabSwitch('Filters'); } $this->zbxTestTextPresent('Filters'); $this->zbxTestTextPresent('Type of calculation'); $this->zbxTestTextPresent('Macro'); $this->zbxTestAssertVisibleId('conditions_0_macro'); $this->zbxTestAssertAttribute("//input[@id='conditions_0_macro']", 'maxlength', 64); $this->zbxTestTextPresent('Regular expression'); $this->zbxTestAssertVisibleId('conditions_0_value'); $this->zbxTestAssertAttribute("//input[@id='conditions_0_value']", 'maxlength', 255); if (CTestArrayHelper::get($data, 'filter_check', false)) { $operation_dropdown = $this->query('name:conditions[0][operator]')->asDropdown()->one(); foreach (['matches', 'does not match', 'exists', 'does not exist'] as $operation) { $operation_dropdown->select($operation); $this->assertEquals(in_array($operation, ['matches', 'does not match']), $this->query('id:conditions_0_value')->one()->isVisible()); } } } // Returns update data public static function update() { return CDBHelper::getDataProvider( 'select * from items'. ' where hostid = 40001 and key_ LIKE \'discovery-rule-form%\'' ); } /** * @dataProvider update */ public function testFormLowLevelDiscovery_SimpleUpdate($data) { $name = $data['name']; $sqlDiscovery = 'select itemid, hostid, name, key_, delay from items order by itemid'; $oldHashDiscovery = CDBHelper::getHash($sqlDiscovery); $this->zbxTestLogin(self::HOST_LIST_PAGE); $form = $this->query('name:zbx_filter')->asForm()->waitUntilReady()->one(); $this->filterEntriesAndOpenDiscovery($form, $this->host); $this->zbxTestClickLinkTextWait($name); $this->zbxTestClickWait('update'); $this->zbxTestCheckTitle('Configuration of discovery rules'); $this->zbxTestWaitUntilMessageTextPresent('msg-good', 'Discovery rule updated'); $this->zbxTestTextPresent("$name"); $this->assertEquals($oldHashDiscovery, CDBHelper::getHash($sqlDiscovery)); } // Returns create data public static function create() { return [ // #0 [ [ 'expected' => TEST_BAD, 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "Name": cannot be empty.', 'Incorrect value for field "Key": cannot be empty.' ] ] ], // #1 [ [ 'expected' => TEST_BAD, 'name' => 'discoveryRuleError', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "Key": cannot be empty.' ] ] ], // #2 [ [ 'expected' => TEST_BAD, 'key' => 'discovery-rule-error', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "Name": cannot be empty.' ] ] ], // #3 [ [ 'expected' => TEST_GOOD, 'name' => 'discoveryRuleNo1', 'key' => 'discovery-key-no1', 'macro' => '{#TEST_MACRO}', 'operator' => 'exists', 'formCheck' =>true, 'dbCheck' => true ] ], // #4 [ [ 'expected' => TEST_GOOD, 'name' => 'discoveryRuleNo2', 'key' => 'discovery-key-no2', 'macro' => '{#TEST_MACRO}', 'operator' => 'does not match', 'expression' => 'test expression', 'formCheck' =>true, 'dbCheck' => true, 'remove' => true ] ], // #5 [ [ 'expected' => TEST_GOOD, 'name' => 'discoveryRuleWithFilter1', 'key' => 'discovery-key-for-filter1', 'macro' => '{#TEST_MACRO}', 'operator' => 'matches', 'expression' => 'test expression', 'formCheck' =>true, 'dbCheck' => true ] ], // #6 [ ['expected' => TEST_BAD, 'name' => 'discoveryRuleNo1', 'key' => 'discovery-key-no1', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'An LLD rule with key "discovery-key-no1" already exists on the host "Simple form test host".'] ] ], // #7 [ ['expected' => TEST_BAD, 'name' => 'discoveryRuleError', 'key' => 'discovery-key-no1', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'An LLD rule with key "discovery-key-no1" already exists on the host "Simple form test host".'] ] ], // #8 Empty keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => ' ', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": cannot be empty.' ] ] ], // #9 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => '-30', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #10 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => 1, 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #11 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => 3599, 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #12 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => '59m', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #13 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => '1304w', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #14 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => '9126d', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #15 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => '219001h', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #16 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => '13140001m', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #17 Incorrect keep lost resources period [ [ 'expected' => TEST_BAD, 'name' => 'Discovery lifetime', 'key' => 'discovery-lifetime-test', 'lifetime' => 788400001, 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/lifetime": value must be one of 0, 3600-788400000.' ] ] ], // #18 Empty timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => 0, 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": cannot be equal to zero without custom intervals.' ] ] ], // #19 Incorrect timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => '-30', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Field "Update interval" is not correct: a time unit is expected' ] ] ], // #20 Incorrect timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => 86401, 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": value must be one of 0-86400.' ] ] ], // #21 Incorrect timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => '1w', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": value must be one of 0-86400.' ] ] ], // #22 Incorrect timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => '2d', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": value must be one of 0-86400.' ] ] ], // #23 Incorrect timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => '25h', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": value must be one of 0-86400.' ] ] ], // #24 Incorrect timedelay [ [ 'expected' => TEST_BAD, 'name' => 'Discovery delay', 'key' => 'discovery-delay-test', 'delay' => '1441m', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": value must be one of 0-86400.' ] ] ], // #25 Empty time flex period [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-test', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => ''] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid interval "".' ] ] ], // #26 Incorrect flex period [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-test', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-11,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid interval "1-11,00:00-24:00".' ] ] ], // #27 Incorrect flex period [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-test', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-7,00:00-25:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid interval "1-7,00:00-25:00".' ] ] ], // #28 Incorrect flex period [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-test', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-7,24:00-00:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid interval "1-7,24:00-00:00".' ] ] ], // #29 Incorrect flex period [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-test', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1,00:00-24:00;2,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid interval "1,00:00-24:00;2,00:00-24:00".' ] ] ], // #30 Multiple flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-test', 'macro' => '{#TEST_MACRO}', 'operator' => 'does not exist', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '2,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '1,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '2,00:00-24:00'] ] ] ], // #31 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '2,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '3,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '4,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '5,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '6,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #32 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex1', 'key' =>'discovery-flex-delay1', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '2,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '3,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '4,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '7,00:00-24:00'] ] ] ], // #33 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'delay' => 0, 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '2,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '3,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '4,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '5,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '6,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": must have at least one interval greater than 0.' ] ] ], // #34 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex2', 'key' =>'discovery-flex-delay2', 'delay' => 0, 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6-7,00:00-24:00'] ], 'dbCheck' => true, 'formCheck' => true ] ], // #35 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '6-7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #36 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay3', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6-7,00:00-24:00'] ] ] ], // #37 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay4', 'delay' => 0, 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-7,00:00-24:00'] ] ] ], // #38 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1-7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #39 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay5', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-7,00:00-24:00'] ] ] ], // #40 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '6-7,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6-7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #41 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6-7,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '6-7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #42 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 50, 'flexTime' => '1-7,00:00-24:00'], ['flexDelay' => 0, 'flexTime' => '1-7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #43 Delay combined with flex periods [ [ 'expected' => TEST_BAD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1-7,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '1-7,00:00-24:00'] ], 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/delay": non-active intervals cannot fill the entire time.' ] ] ], // #44 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay6', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '2,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '3,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '4,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '5,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '6,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '7,00:00-24:00', 'remove' => true], ['flexDelay' => 50, 'flexTime' => '1,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '2,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '3,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '4,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '7,00:00-24:00'] ] ] ], // #45 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex', 'key' =>'discovery-flex-delay7', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1-7,00:00-24:00', 'remove' => true], ['flexDelay' => 50, 'flexTime' => '1-7,00:00-24:00'] ] ] ], // #46 Delay combined with flex periods [ [ 'expected' => TEST_GOOD, 'name' =>'Discovery flex Check', 'key' =>'discovery-flex-delay8', 'flexPeriod' => [ ['flexDelay' => 0, 'flexTime' => '1-5,00:00-24:00', 'remove' => true], ['flexDelay' => 0, 'flexTime' => '6-7,00:00-24:00', 'remove' => true], ['flexDelay' => 50, 'flexTime' => '1-5,00:00-24:00'], ['flexDelay' => 50, 'flexTime' => '6-7,00:00-24:00'] ], 'dbCheck' => true, 'formCheck' => true ] ], // #47 [ [ 'expected' => TEST_GOOD, 'name' =>'!@#$%^&*()_+-=[]{};:"|,./<>?', 'key' =>'discovery-symbols-test', 'dbCheck' => true, 'formCheck' => true ] ], // #48 List of all item types [ [ 'expected' => TEST_GOOD, 'type' => 'Zabbix agent', 'name' => 'Zabbix agent', 'key' => 'discovery-zabbix-agent', 'dbCheck' => true ] ], // #49 Update and custom intervals are hidden if item key is mqtt.get [ [ 'expected' => TEST_GOOD, 'type' => 'Zabbix agent (active)', 'name' => 'Zabbix agent (active) mqtt', 'key' => 'mqtt.get[0]', 'dbCheck' => true, 'formCheck' => true ] ], // #50 [ [ 'expected' => TEST_GOOD, 'type' => 'Zabbix agent (active)', 'name' => 'Zabbix agent (active)', 'key' => 'discovery-zabbix-agent-active', 'dbCheck' => true, 'formCheck' => true ] ], // #51 [ [ 'expected' => TEST_GOOD, 'type' => 'Simple check', 'name' => 'Simple check', 'key' => 'discovery-simple-check', 'dbCheck' => true, 'formCheck' => true ] ], // #52 [ [ 'expected' => TEST_GOOD, 'type' => 'SNMP agent', 'name' => 'SNMP agent', 'key' => 'discovery-snmp-agent', 'snmp_oid' => '[IF-MIB::]ifInOctets.1', 'dbCheck' => true, 'formCheck' => true ] ], // #53 [ [ 'expected' => TEST_BAD, 'type' => 'SNMP agent', 'name' => 'SNMP agent', 'key' => 'test-item-snmp_oid', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "SNMP OID": cannot be empty.' ] ] ], // #54 [ [ 'expected' => TEST_BAD, 'type' => 'SNMP agent', 'name' => 'SNMP agent', 'key' => 'test-item-reuse', 'snmp_oid' => '[IF-MIB::]ifInOctets.1', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'An item with key "test-item-reuse" already exists on the host "Simple form test host".' ] ] ], // #55 [ [ 'expected' => TEST_BAD, 'type' => 'SNMP agent', 'name' => 'SNMP agent', 'key' => 'test-item-form1', 'snmp_oid' => '[IF-MIB::]ifInOctets.1', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'An item with key "test-item-form1" already exists on the host "Simple form test host".' ] ] ], // #56 [ [ 'expected' => TEST_GOOD, 'type' => 'Zabbix internal', 'name' => 'Zabbix internal', 'key' => 'discovery-zabbix-internal', 'dbCheck' => true, 'formCheck' => true ] ], // #57 [ [ 'expected' => TEST_GOOD, 'type' => 'Zabbix trapper', 'name' => 'Zabbix trapper', 'key' => 'snmptrap.fallback', 'dbCheck' => true, 'formCheck' => true, 'remove' => true ] ], // #58 [ [ 'expected' => TEST_GOOD, 'type' => 'External check', 'name' => 'External check', 'key' => 'discovery-external-check', 'dbCheck' => true, 'formCheck' => true ] ], // #59 [ [ 'expected' => TEST_GOOD, 'type' => 'IPMI agent', 'name' => 'IPMI agent', 'key' => 'discovery-ipmi-agent', 'ipmi_sensor' => 'ipmi_sensor', 'dbCheck' => true, 'formCheck' => true, 'remove' => true ] ], // #60 [ [ 'expected' => TEST_GOOD, 'type' => 'IPMI agent', 'name' => 'IPMI agent with spaces', 'key' => 'item-ipmi-agent-spaces', 'ipmi_sensor' => ' ipmi_sensor ', 'dbCheck' => true, 'formCheck' => true ] ], // #61 IPMI sensor is optional if item key is ipmi.get [ [ 'expected' => TEST_GOOD, 'type' => 'IPMI agent', 'name' => 'IPMI agent with ipmi.get', 'key' => 'ipmi.get', 'dbCheck' => true, 'formCheck' => true ] ], // #62 [ [ 'expected' => TEST_GOOD, 'type' => 'SSH agent', 'name' => 'SSH agent', 'key' => 'discovery-ssh-agent', 'username' => 'zabbix', 'params_es' => 'executed script', 'dbCheck' => true, 'formCheck' => true, 'remove' => true ] ], // #63 [ [ 'expected' => TEST_GOOD, 'type' => 'TELNET agent', 'name' => 'TELNET agent', 'key' => 'discovery-telnet-agent', 'username' => 'zabbix', 'params_es' => 'executed script', 'dbCheck' => true, 'formCheck' => true ] ], // #64 [ [ 'expected' => TEST_BAD, 'type' => 'IPMI agent', 'name' => 'IPMI agent error', 'key' => 'discovery-ipmi-agent-error', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Invalid parameter "/1/ipmi_sensor": cannot be empty.' ] ] ], // #65 [ [ 'expected' => TEST_BAD, 'type' => 'SSH agent', 'name' => 'SSH agent error', 'key' => 'discovery-ssh-agent-error', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "User name": cannot be empty.', 'Incorrect value for field "Executed script": cannot be empty.' ] ] ], // #66 [ [ 'expected' => TEST_BAD, 'type' => 'TELNET agent', 'name' => 'TELNET agent error', 'key' => 'discovery-telnet-agent-error', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "User name": cannot be empty.', 'Incorrect value for field "Executed script": cannot be empty.' ] ] ], // #67 [ [ 'expected' => TEST_GOOD, 'type' => 'JMX agent', 'name' => 'JMX agent', 'key' => 'discovery-jmx-agent', 'dbCheck' => true, 'formCheck' => true, 'remove' => true ] ], // #68 Default [ [ 'expected' => TEST_BAD, 'type' => 'SSH agent', 'name' => 'SSH agent', 'username' => 'zabbix', 'params_es' => 'script to be executed', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Check the key, please. Default example was passed.' ] ] ], // #69 Default [ [ 'expected' => TEST_BAD, 'type' => 'TELNET agent', 'name' => 'TELNET agent', 'username' => 'zabbix', 'params_es' => 'script to be executed', 'error_msg' => 'Cannot add discovery rule', 'errors' => [ 'Check the key, please. Default example was passed.' ] ] ], // #70 Default [ [ 'expected' => TEST_BAD, 'type' => 'JMX agent', 'name' => 'JMX agent', 'username' => 'zabbix', 'error_msg' => 'Page received incorrect data', 'errors' => [ 'Incorrect value for field "Key": cannot be empty.' ] ] ] ]; } /** * @dataProvider create */ public function testFormLowLevelDiscovery_SimpleCreate($data) { $this->zbxTestLogin(self::HOST_LIST_PAGE); $form = $this->query('name:zbx_filter')->asForm()->waitUntilReady()->one(); $this->filterEntriesAndOpenDiscovery($form, $this->host); $this->zbxTestContentControlButtonClickTextWait('Create discovery rule'); $this->zbxTestCheckTitle('Configuration of discovery rules'); $this->zbxTestCheckHeader('Discovery rules'); if (isset($data['type'])) { $this->zbxTestDropdownSelect('type', $data['type']); $type = $data['type']; } else { $type = $this->zbxTestGetSelectedLabel('type'); } switch ($type) { case 'Zabbix agent': case 'Simple check': case 'SNMP agent': case 'SNMP trap': case 'External check': case 'IPMI agent': case 'SSH agent': case 'TELNET agent': case 'JMX agent': $interfaceid = $this->zbxTestGetText('//z-select[@id="interface-select"]//li[not(@disabled)]'); break; default: $this->zbxTestAssertNotVisibleId('interface-select'); } if (isset($data['name'])) { $this->zbxTestInputType('name', $data['name']); } $name = $this->zbxTestGetValue("//input[@id='name']"); if (isset($data['key'])) { $this->zbxTestInputType('key', $data['key']); } $key = $this->zbxTestGetValue("//input[@id='key']"); if (isset($data['username'])) { $this->zbxTestInputType('username', $data['username']); } if (isset($data['ipmi_sensor'])) { $this->zbxTestInputType('ipmi_sensor', $data['ipmi_sensor']); $ipmi_sensor = $this->zbxTestGetValue("//input[@id='ipmi_sensor']"); } if (isset($data['params_es'])) { $this->zbxTestInputType('params_es', $data['params_es']); } if (isset($data['lifetime'])) { $this->zbxTestInputTypeOverwrite('lifetime', $data['lifetime']); } if (isset($data['delay'])) { $this->zbxTestInputTypeOverwrite('delay', $data['delay']); } if (array_key_exists('snmp_oid', $data)) { $this->zbxTestInputTypeOverwrite('snmp_oid', $data['snmp_oid']); } // Check hidden update and custom interval for mqtt.get key. if (CTestArrayHelper::get($data, 'type') === 'Zabbix agent (active)' && substr(CTestArrayHelper::get($data, 'key'), 0, 8) === 'mqtt.get') { $this->zbxTestTextNotVisible('Update interval'); $this->zbxTestAssertNotVisibleId('js-item-delay-label'); $this->zbxTestAssertNotVisibleId('js-item-delay-field'); $this->zbxTestTextNotVisible('Custom intervals'); $this->zbxTestAssertNotVisibleId('js-item-flex-intervals-label'); $this->zbxTestAssertNotVisibleId('js-item-flex-intervals-field'); } $itemFlexFlag = true; if (isset($data['flexPeriod'])) { $itemCount = 0; foreach ($data['flexPeriod'] as $period) { if (isset($period['flexDelay'])) { $this->zbxTestInputType('delay_flex_'.$itemCount.'_delay', $period['flexDelay']); } $this->zbxTestInputType('delay_flex_'.$itemCount.'_period', $period['flexTime']); $itemCount ++; $this->zbxTestClickWait('interval_add'); $this->zbxTestAssertVisibleId('delay_flex_'.$itemCount.'_delay'); $this->zbxTestAssertVisibleId('delay_flex_'.$itemCount.'_period'); if (isset($period['remove'])) { $this->zbxTestClickWait('delay_flex_'.($itemCount-1).'_remove'); } } } if (array_key_exists('macro', $data)) { $this->zbxTestTabSwitch('Filters'); $this->zbxTestInputTypeWait('conditions_0_macro', $data['macro']); $this->zbxTestDropdownSelectWait('conditions[0][operator]', $data['operator']); if (in_array($data['operator'], ['matches', 'does not match'])) { $this->zbxTestInputType('conditions_0_value', $data['expression']); } } if ($itemFlexFlag == true) { $this->zbxTestClickWait('add'); $expected = $data['expected']; switch ($expected) { case TEST_GOOD: $this->zbxTestCheckTitle('Configuration of discovery rules'); $this->zbxTestWaitUntilMessageTextPresent('msg-good', 'Discovery rule created'); $this->zbxTestTextPresent(['Item prototypes', 'Trigger prototypes', 'Graph prototypes']); break; case TEST_BAD: $this->zbxTestCheckTitle('Configuration of discovery rules'); $this->zbxTestWaitUntilMessageTextPresent('msg-bad', $data['error_msg']); foreach ($data['errors'] as $msg) { $this->zbxTestTextPresent($msg); } $this->zbxTestTextPresent(['Name', 'Type', 'Key']); break; } } if (isset($data['formCheck'])) { $this->zbxTestOpen(self::HOST_LIST_PAGE); $form = $this->query('name:zbx_filter')->asForm()->waitUntilReady()->one(); $this->filterEntriesAndOpenDiscovery($form, $this->host); if (isset ($data['dbName'])) { $dbName = $data['dbName']; } else { $dbName = $name; } $this->zbxTestClickLinkTextWait($dbName); $this->zbxTestWaitUntilElementVisible(WebDriverBy::id('name')); $this->zbxTestAssertElementValue('name', $name); $this->zbxTestAssertElementValue('key', $key); $this->zbxTestAssertElementPresentXpath("//z-select[@id='type']//li[text()='$type']"); switch ($type) { case 'Zabbix agent': case 'Simple check': case 'SNMP agent': case 'SNMP trap': case 'External check': case 'IPMI agent': case 'SSH agent': case 'TELNET agent': case 'JMX agent': $this->zbxTestAssertElementPresentXpath('//z-select[@id="interface-select"]//li[text()="'.$interfaceid.'"]'); break; case 'Zabbix agent (active)': $this->zbxTestAssertNotVisibleId('interfaceid'); // Check hidden update and custom interval for mqtt.get key. if (substr(CTestArrayHelper::get($data, 'key'), 0, 8) === 'mqtt.get') { $this->zbxTestTextNotVisible('Update interval'); $this->zbxTestAssertNotVisibleId('js-item-delay-label'); $this->zbxTestAssertNotVisibleId('js-item-delay-field'); $this->zbxTestTextNotVisible('Custom intervals'); $this->zbxTestAssertNotVisibleId('js-item-flex-intervals-label'); $this->zbxTestAssertNotVisibleId('js-item-flex-intervals-field'); } else { $this->zbxTestTextVisible('Update interval'); $this->zbxTestAssertVisibleId('js-item-delay-label'); $this->zbxTestAssertVisibleId('js-item-delay-field'); $this->zbxTestTextVisible('Custom intervals'); $this->zbxTestAssertVisibleId('js-item-flex-intervals-label'); $this->zbxTestAssertVisibleId('js-item-flex-intervals-field'); } break; default: $this->zbxTestAssertNotVisibleId('interface-select'); } // "Execute now" button availability if (in_array($type, ['Zabbix agent', 'Simple check', 'SNMP agent', 'Zabbix internal', 'External check', 'Database monitor', 'IPMI agent', 'SSH agent', 'TELNET agent', 'JMX agent', 'Dependent item'])) { $this->zbxTestClickButtonText('Execute now'); $this->zbxTestWaitUntilMessageTextPresent('msg-good', 'Request sent successfully'); } else { $this->zbxTestAssertElementPresentXpath("//button[text()='Execute now'][@disabled]"); } if (isset($data['ipmi_sensor'])) { $ipmiValue = $this->zbxTestGetValue("//input[@id='ipmi_sensor']"); $this->assertEquals($ipmi_sensor, $ipmiValue); } } if (isset($data['dbCheck'])) { $result = DBselect("SELECT name, key_ FROM items where name = '".$name."' and hostid = ".$this->hostid); while ($row = DBfetch($result)) { $this->assertEquals($row['name'], $name); $this->assertEquals($row['key_'], $key); } } if (isset($data['remove'])) { $result = DBselect("SELECT itemid FROM items where name = '".$name."' and hostid = ".$this->hostid); while ($row = DBfetch($result)) { $itemId = $row['itemid']; } $this->zbxTestOpen(self::HOST_LIST_PAGE); $form = $this->query('name:zbx_filter')->asForm()->waitUntilReady()->one(); $this->filterEntriesAndOpenDiscovery($form, $this->host); $this->zbxTestCheckboxSelect("g_hostdruleid_$itemId"); $this->zbxTestClickButton('discoveryrule.massdelete'); $this->zbxTestAcceptAlert(); $this->zbxTestWaitUntilMessageTextPresent('msg-good' ,'Discovery rule deleted'); $sql = "SELECT itemid FROM items WHERE name = '".$name."' and hostid = ".$this->hostid; $this->assertEquals(0, CDBHelper::getCount($sql), 'Discovery rule has not been deleted from DB.'); } } public static function getFiltersTabData() { return [ [ [ 'name' => 'Rule with macro does not match', 'key' => 'macro-doesnt-match-key', 'macros'=> [ ['macro' => '{#TEST_MACRO}', 'expression' => 'Test expression', 'operator' => 'does not match'] ] ] ], [ [ 'name' => 'Rule with macro exists', 'key' => 'macro-exists', 'macros'=> [ ['macro' => '{#TEST_MACRO}', 'operator' => 'exists'] ] ] ], [ [ 'name' => 'Rule with two macros And/Or', 'key' => 'two-macros-and-or-key', 'calculation' => 'And/Or', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match' ] ] ] ], [ [ 'name' => 'Rule with two macros And', 'key' => 'two-macros-and-key', 'calculation' => 'And', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'operator' => 'does not exist' ] ] ] ], [ [ 'name' => 'Rule with two macros Or', 'key' => 'two-macros-or-key', 'calculation' => 'Or', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'operator' => 'exists'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match' ] ] ] ], [ [ 'name' => 'Rule with three macros Custom expression', 'key' => 'three-macros-custom-expression-key', 'calculation' => 'Custom expression', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'operator' => 'exists' ], ['macro' => '{#TEST_MACRO3}', 'operator' => 'does not exist' ] ], 'formula' => 'not A or not (B and C)' ] ] ]; } /** * Test creation of a discovery rule with data filling in Filters tab. * * @dataProvider getFiltersTabData */ public function testFormLowLevelDiscovery_FiltersTab($data) { $this->zbxTestLogin('host_discovery.php?filter_set=1&context=host&filter_hostids%5B0%5D='.$this->hostid); $this->query('button:Create discovery rule')->one()->click(); $this->zbxTestInputTypeWait('name', $data['name']); $this->zbxTestInputType('key', $data['key']); $this->zbxTestTabSwitch('Filters'); foreach ($data['macros'] as $i => $macro) { $this->zbxTestInputTypeByXpath('//*[@id="conditions_'.$i.'_macro"]', $macro['macro']); $this->zbxTestDropdownSelectWait('conditions['.$i.'][operator]', $macro['operator']); if (in_array($macro['operator'], ['matches', 'does not match'])) { $this->zbxTestInputTypeByXpath('//*[@id="conditions_'.$i.'_value"]', $macro['expression']); } else { $this->assertFalse($this->query('id:conditions_'.$i.'_value')->one()->isVisible()); } $this->zbxTestClick('macro_add'); } if (array_key_exists('calculation', $data)) { $this->zbxTestDropdownSelectWait('evaltype', $data['calculation']); } if (array_key_exists('formula', $data)) { $this->zbxTestInputTypeWait('formula', $data['formula']); } $this->zbxTestClickWait('add'); $this->zbxTestWaitUntilMessageTextPresent('msg-good', 'Discovery rule created'); $this->zbxTestTextPresent($data['name']); $this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM items WHERE name ='.zbx_dbstr($data['name']).' AND hostid = '.$this->hostid)); } public static function getFiltersTabValidationData() { return [ // #0 [ [ 'name' => 'Rule with wrong macro', 'key' => 'macro-wrong-key', 'macros'=> [ ['macro' => '{TEST_MACRO}', 'expression' => 'Test expression', 'operator' => 'does not match'] ], 'error_message' => 'Invalid parameter "/1/filter/conditions/1/macro": a low-level discovery macro is expected.' ] ], // #1 [ [ 'name' => 'Rule with empty formula', 'key' => 'macro-empty-formula-key', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'operator' => 'exists'] ], 'calculation' => 'Custom expression', 'formula' => '', 'error_message' => 'Invalid parameter "/1/filter/formula": cannot be empty.' ] ], // #2 [ [ 'name' => 'Rule with missing argument', 'key' => 'macro-missing-argument-key', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match'], ['macro' => '{#TEST_MACRO3}', 'operator' => 'does not exist'] ], 'calculation' => 'Custom expression', 'formula' => 'A and B', 'error_message' => 'Invalid parameter "/1/filter/conditions/3/formulaid": an identifier is not '. 'defined in the formula.' ] ], // #3 [ [ 'name' => 'Rule with extra argument', 'key' => 'macro-extra-argument-key', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match'] ], 'calculation' => 'Custom expression', 'formula' => 'A and B or C', 'error_message' => 'Invalid parameter "/1/filter/formula": missing filter condition "C".' ] ], // #4 [ [ 'name' => 'Rule with wrong formula', 'key' => 'macro-wrong-formula-key', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'operator' => 'exists'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match'] ], 'calculation' => 'Custom expression', 'formula' => 'Wrong formula', 'error_message' => 'Invalid parameter "/1/filter/formula": incorrect syntax near "Wrong formula".' ] ], // #5 [ [ 'name' => 'Check case sensitive of operator in formula', 'key' => 'macro-not-in-formula-key', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match'] ], 'calculation' => 'Custom expression', 'formula'=> 'A and Not B', 'error_message' => 'Invalid parameter "/1/filter/formula": incorrect syntax near "Not B".' ] ], // #6 [ [ 'name' => 'Check case sensitive of first operator in formula', 'key' => 'macro-wrong-operator-key', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'operator' => 'exists'], ['macro' => '{#TEST_MACRO2}', 'operator' => 'does not exist'] ], 'calculation' => 'Custom expression', 'formula'=> 'NOT A and not B', 'error_message' => 'Invalid parameter "/1/filter/formula": incorrect syntax near " A and not B".' ] ], // #7 [ [ 'name' => 'Test create with only NOT in formula', 'key' => 'macro-not-formula', 'macros'=> [ ['macro' => '{#TEST_MACRO1}', 'expression' => 'Test expression 1', 'operator' => 'matches'], ['macro' => '{#TEST_MACRO2}', 'expression' => 'Test expression 2', 'operator' => 'does not match'] ], 'calculation' => 'Custom expression', 'formula'=> 'not A not B', 'error_message' => 'Invalid parameter "/1/filter/formula": incorrect syntax near " not B".' ] ] ]; } /** * @dataProvider getFiltersTabValidationData */ public function testFormLowLevelDiscovery_FiltersTabValidation($data) { $this->zbxTestLogin('host_discovery.php?form=create&context=host&hostid='.$this->hostid); $this->zbxTestInputTypeWait('name', $data['name']); $this->zbxTestInputType('key', $data['key']); $this->zbxTestTabSwitch('Filters'); foreach ($data['macros'] as $i => $macro) { $this->zbxTestInputTypeByXpath('//*[@id="conditions_'.$i.'_macro"]', $macro['macro']); $this->zbxTestDropdownSelectWait('conditions['.$i.'][operator]', $macro['operator']); if (in_array($macro['operator'], ['matches', 'does not match'])) { $this->zbxTestInputTypeByXpath('//*[@id="conditions_'.$i.'_value"]', $macro['expression']); } $this->zbxTestClick('macro_add'); } if (array_key_exists('calculation', $data)) { $this->zbxTestDropdownSelectWait('evaltype', $data['calculation']); } if (array_key_exists('formula', $data)) { $this->zbxTestInputTypeWait('formula', $data['formula']); } $this->zbxTestClickWait('add'); $this->zbxTestWaitUntilMessageTextPresent('msg-bad', 'Cannot add discovery rule'); $this->zbxTestTextPresentInMessageDetails($data['error_message']); $this->assertEquals(0, CDBHelper::getCount('SELECT NULL FROM items WHERE name ='.zbx_dbstr($data['name']).' AND hostid = '.$this->hostid)); } public function getLLDMacrosTabData() { return [ // #0 [ [ 'expected' => TEST_BAD, 'name' => 'Macro with empty path', 'key' => 'macro-with-empty-path', 'macros' => [ ['macro' => '{#MACRO}', 'path'=>''] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/1/path": cannot be empty.' ] ], // #1 [ [ 'expected' => TEST_BAD, 'name' => 'Macro without #', 'key' => 'macro-without-hash', 'macros' => [ ['macro' => '{MACRO}', 'path'=>'$.path'] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/1/lld_macro": a low-level discovery macro is expected.' ] ], // #2 [ [ 'expected' => TEST_BAD, 'name' => 'Macro with cyrillic symbols', 'key' => 'macro-with-cyrillic-symbols', 'macros' => [ ['macro' => '{#МАКРО}', 'path'=>'$.path'] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/1/lld_macro": a low-level discovery macro is expected.' ] ], // #3 [ [ 'expected' => TEST_BAD, 'name' => 'Macro with special symbols', 'key' => 'macro-with-with-special-symbols', 'macros' => [ ['macro' => '{#MACRO!@$%^&*()_+|?}', 'path'=>'$.path'] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/1/lld_macro": a low-level discovery macro is expected.' ] ], // #4 [ [ 'expected' => TEST_BAD, 'name' => 'LLD with empty macro', 'key' => 'lld-with-empty-macro', 'macros' => [ ['macro' => '', 'path'=>'$.path'] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/1/lld_macro": cannot be empty.' ] ], // #5 [ [ 'expected' => TEST_BAD, 'name' => 'LLD with context macro', 'key' => 'lld-with-context-macro', 'macros' => [ ['macro' => '{$MACRO:A}', 'path'=>'$.path'] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/1/lld_macro": a low-level discovery macro is expected.' ] ], // #6 [ [ 'expected' => TEST_BAD, 'name' => 'LLD with two equal macros', 'key' => 'lld-with-two-equal-macros', 'macros' => [ ['macro' => '{#MACRO}', 'path'=>'$.path.a'], ['macro' => '{#MACRO}', 'path'=>'$.path.b'] ], 'error_details' => 'Invalid parameter "/1/lld_macro_paths/2": value (lld_macro)=({#MACRO}) already exists.' ] ], // #7 [ [ 'expected' => TEST_GOOD, 'name' => 'LLD with valid macro and path', 'key' => 'lld-with-valid-macro-and-path', 'macros' => [ ['macro' => '{#MACRO1}', 'path'=>'$.path'], ['macro' => '{#MACRO2}', 'path'=>"$['а']['!@#$%^&*()_+']"] ] ] ] ]; } /** * Test creation of a discovery rule with data filling in Macros tab. * * @dataProvider getLLDMacrosTabData */ public function testFormLowLevelDiscovery_LLDMacrosTab($data) { $sql_items = "SELECT * FROM items ORDER BY itemid"; $old_hash = CDBHelper::getHash($sql_items); $this->page->login()->open('host_discovery.php?filter_set=1&filter_hostids%5B0%5D='.$this->hostid.'&context=host'); $this->query('button:Create discovery rule')->one()->click(); $form = $this->query('name:itemForm')->asForm()->one(); $form->getField('Name')->fill($data['name']); $form->getField('Key')->fill($data['key']); $form->selectTab('LLD macros'); $macros_table = $form->getField('LLD macros'); $button = $macros_table->query('button:Add')->one(); $last = count($data['macros']) - 1; foreach ($data['macros'] as $i => $lld_macro) { $row = $macros_table->getRows()->get($i); $row->getColumn('LLD macro')->query('tag:textarea')->one()->fill($lld_macro['macro']); $row->getColumn('JSONPath')->query('tag:textarea')->one()->fill($lld_macro['path']); if ($i !== $last) { $button->click(); } } $form->submit(); $this->page->waitUntilReady(); // Get global message. $message = CMessageElement::find()->one(); $expected = $data['expected']; switch ($expected) { case TEST_GOOD: // Check if message is positive. $this->assertTrue($message->isGood()); // Check message title. $this->assertEquals('Discovery rule created', $message->getTitle()); // Check the results in DB. $this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM items WHERE key_='.zbx_dbstr($data['key']))); // Check the results in form. $this->checkLLDMacrosFormFields($data); break; case TEST_BAD: // Check if message is negative. $this->assertTrue($message->isBad()); // Check message title. $this->assertEquals('Cannot add discovery rule', $message->getTitle()); $this->assertTrue($message->hasLine($data['error_details'])); // Check that DB hash is not changed. $this->assertEquals($old_hash, CDBHelper::getHash($sql_items)); break; } } private function checkLLDMacrosFormFields($data) { $id = CDBHelper::getValue('SELECT itemid FROM items WHERE key_='.zbx_dbstr($data['key'])); $this->page->open('host_discovery.php?form=update&context=host&itemid='.$id); $form = $this->query('name:itemForm')->asForm()->one(); $form->selectTab('LLD macros'); $table = $form->getField('LLD macros'); foreach ($data['macros'] as $i => $lld_macro) { $row = $table->getRows()->get($i); $this->assertEquals($lld_macro['macro'], $row->getColumn('LLD macro')->query('tag:textarea')->one()->getValue() ); $this->assertEquals($lld_macro['path'], $row->getColumn('JSONPath')->query('tag:textarea')->one()->getValue()); } } /** * Function for filtering necessary hosts or templates and opening their Discovery rules. * * @param CFormELement $form filter form element * @param string $name name of a host or template */ private function filterEntriesAndOpenDiscovery($form, $name) { $table = $this->query('xpath://table[@class="list-table"]')->asTable()->one(); $form->fill(['Name' => $name]); $this->query('button:Apply')->one()->waitUntilClickable()->click(); $table->waitUntilReloaded(); $table->findRow('Name', $name)->getColumn('Discovery')->query('link:Discovery')->one()->click(); } }