self::$update_proxy, 'operating_mode' => PROXY_OPERATING_MODE_ACTIVE, 'description' => 'Description for update', 'tls_connect' => 1, 'tls_accept'=> 1 ], [ 'name' => self::$change_active_proxy, 'operating_mode' => PROXY_OPERATING_MODE_ACTIVE, 'description' => 'Active description for refresh', 'tls_connect' => 1, 'tls_accept'=> 7, 'tls_psk_identity' => 'activerefreshpsk', 'tls_psk' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb', 'tls_issuer' => 'activerefreshpsk', 'tls_subject' => 'activerefreshpsk', 'allowed_addresses' => '127.0.1.2' ], [ 'name' => self::$change_passive_proxy, 'operating_mode' => PROXY_OPERATING_MODE_PASSIVE, 'address' => '127.9.9.9', 'port' => 10051, 'description' => '_Passive description for refresh', 'tls_connect' => 4, 'tls_accept'=> 1, 'tls_issuer' => 'passiverefreshpsk', 'tls_subject' => 'passiverefreshpsk' ] ]); } public function getLayoutData() { return [ // Data for Active proxy mode and Connections to proxy - No encryption. [ [ 'operating_mode' => 'Active', 'check_layout' => true, 'check_alert' => true, 'Connections to proxy' => 'No encryption', 'settings' => [ [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ] ] ] ], [ [ 'operating_mode' => 'Active', 'Connections to proxy' => 'PSK', 'settings' => [ [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => false], 'tls_psk' => ['visible' => true, 'enabled' => false], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => false], 'tls_psk' => ['visible' => true, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => false], 'tls_psk' => ['visible' => true, 'enabled' => false], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ] ] ] ], [ [ 'operating_mode' => 'Active', 'Connections to proxy' => 'Certificate', 'settings' => [ [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => false], 'tls_subject' => ['visible' => true, 'enabled' => false] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => true ], 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => false], 'tls_subject' => ['visible' => true, 'enabled' => false] ] ], [ 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => false ], 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => false], 'tls_subject' => ['visible' => true, 'enabled' => false] ] ] ] ] ], // Data for Passive proxy mode. [ [ 'operating_mode' => 'Passive', 'check_layout' => true, 'Connections from proxy' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'settings' => [ [ 'Connections to proxy' => 'No encryption', 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections to proxy' => 'PSK', 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections to proxy' => 'Certificate', 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ] ] ] ], [ [ 'operating_mode' => 'Passive', 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => false ], 'settings' => [ [ 'Connections to proxy' => 'No encryption', 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => false], 'tls_psk' => ['visible' => true, 'enabled' => false], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections to proxy' => 'PSK', 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => false, 'enabled' => false], 'tls_subject' => ['visible' => false, 'enabled' => false] ] ], [ 'Connections to proxy' => 'Certificate', 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => false], 'tls_psk' => ['visible' => true, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ] ] ] ], [ [ 'operating_mode' => 'Passive', 'Connections from proxy' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => true ], 'settings' => [ [ 'Connections to proxy' => 'No encryption', 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => false], 'tls_subject' => ['visible' => true, 'enabled' => false] ] ], [ 'Connections to proxy' => 'PSK', 'inputs' => [ 'tls_psk_identity' => ['visible' => true, 'enabled' => true], 'tls_psk' => ['visible' => true, 'enabled' => true], 'tls_issuer' => ['visible' => true, 'enabled' => false], 'tls_subject' => ['visible' => true, 'enabled' => false] ] ], [ 'Connections to proxy' => 'Certificate', 'inputs' => [ 'tls_psk_identity' => ['visible' => false, 'enabled' => false], 'tls_psk' => ['visible' => false, 'enabled' => false], 'tls_issuer' => ['visible' => true, 'enabled' => true], 'tls_subject' => ['visible' => true, 'enabled' => true] ] ] ] ] ] ]; } /** * @dataProvider getLayoutData */ public function testFormAdministrationProxies_Layout($data) { $this->page->login()->open('zabbix.php?action=proxy.list')->waitUntilReady(); $this->query('button:Create proxy')->one()->waitUntilClickable()->click(); $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); $this->assertEquals('New proxy', $dialog->getTitle()); $form = $this->query('id:proxy-form')->asForm()->one(); // Following checks should be performed only in first case, because form is the same in all cases. if (CTestArrayHelper::get($data, 'check_layout')) { if ($data['operating_mode'] === 'Active') { // Check fields lengths. $field_maxlengths = [ 'Proxy name' => 128, 'Proxy address' => 255, 'Description' => 65535, 'PSK identity' => 128, 'PSK' => 512, 'Issuer' => 1024, 'Subject' => 1024 ]; foreach ($field_maxlengths as $name => $maxlength) { $field = $form->getField($name); $this->assertEquals('', $field->getValue()); $this->assertEquals($maxlength, $field->getAttribute('maxlength')); } // Check form tabs. $this->assertEquals(['Proxy', 'Encryption'], $form->getTabs()); $form->checkValue(['Proxy mode' => 'Active']); } else{ $form->getField('Proxy mode')->asSegmentedRadio()->select('Passive'); // Check that 'Proxy address' is disappeared. $this->assertFalse($form->getField('Proxy address')->isVisible()); // Check Interface field for passive scenario. $selector = 'xpath:.//div[@class="table-forms-separator"]/table'; $this->assertTrue($dialog->query($selector)->one()->isEnabled()); $this->assertEquals(['Address', 'Port'], $dialog->query($selector)->one()->asTable()->getHeadersText() ); // Check interface fields values. foreach (['address' => '127.0.0.1', 'port' => '10051'] as $id => $value) { $this->assertEquals($value, $dialog->query('id', $id)->one()->getValue()); } // Check interface fields lengths. foreach (['address' => 255, 'port' => 64] as $id => $length) { $this->assertEquals($length, $dialog->query('id', $id)->one()->getAttribute('maxlength')); } } // Check Encryption tabs. $form->selectTab('Encryption'); $form->checkValue([ 'Connections to proxy' => 'No encryption', 'id:tls_accept_none' => true, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ]); } else { if ($data['operating_mode'] === 'Passive') { $form->fill(['Proxy mode' => 'Passive']); } $form->selectTab('Encryption'); } // Condition for checking connection encryption fields. $condition = ($data['operating_mode'] === 'Active') ? ($data['Connections to proxy'] !== 'No encryption') : ($data['Connections from proxy'] !== [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ]); $checked_proxy = ($data['operating_mode'] === 'Active') ? 'Active' : 'Passive'; $opposite_proxy = ($data['operating_mode'] === 'Active') ? 'Passive' : 'Active'; $this->switchAndAssertEncryption($data, $form, $condition, $checked_proxy, $opposite_proxy); if (CTestArrayHelper::get($data, 'check_alert')) { // Check alert when trying to refresh page. $this->page->refresh(); $this->assertTrue($this->page->isAlertPresent()); $this->page->acceptAlert(); // Check that after accepting alert user remained on Proxies page. $this->page->assertHeader('Proxies'); } else { $dialog->close(); } } /** * Function for switching different combinations of connections and proxy encryption * and checking fields visibility and editability. * * @param array $data given data provider * @param CFormElement $form proxy configuration form * @param boolean $condition defines if opposite proxy needs to be selected * @param string $checked_proxy name of proxy which layout is checked * @param string $opposite_proxy name of proxy which is opposite to checked proxy */ private function switchAndAssertEncryption($data, $form, $condition, $checked_proxy, $opposite_proxy) { if ($condition) { $form->selectTab('Proxy'); $form->fill(['Proxy mode' => $opposite_proxy]); $form->selectTab('Encryption'); if ($checked_proxy === 'Active') { $form->getField('Connections to proxy')->fill($data['Connections to proxy']); } else { $form->fill($data['Connections from proxy']); } $form->selectTab('Proxy'); $form->fill(['Proxy mode' => $checked_proxy]); $form->selectTab('Encryption'); $form->invalidate(); } foreach ($data['settings'] as $setting) { if ($checked_proxy === 'Active') { $form->fill($setting['Connections from proxy']); } else { $form->getField('Connections to proxy')->fill($setting['Connections to proxy']); } foreach ($setting['inputs'] as $id => $value) { $input = $form->query('id', $id)->one(false); $this->assertTrue($input->isVisible($value['visible'])); $this->assertTrue($input->isEnabled($value['enabled'])); } } } public function getCreateProxyData() { return [ [ [ 'expected' => TEST_BAD, 'proxy_fields' => [], 'error' => 'Incorrect value for field "name": cannot be empty.' ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'Minimal fields proxy 123' ] ] ] ]; } public function getUpdateProxyData() { return [ [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Active proxy 1' ], 'error' => 'Proxy "Active proxy 1" already exists.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => '' ], 'error' => 'Incorrect value for field "name": cannot be empty.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => '@#$%^&*()_+' ], 'error' => 'Invalid parameter "/1/name": invalid host name.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'πŸ˜€' ], 'error' => 'Invalid parameter "/1/name": invalid host name.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => '{$USERMACRO}' ], 'error' => 'Invalid parameter "/1/name": invalid host name.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => '{#LLDMACRO}' ], 'error' => 'Invalid parameter "/1/name": invalid host name.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π°' ], 'error' => 'Invalid parameter "/1/name": invalid host name.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Empty IP address', 'Proxy mode' => 'Passive', 'id:address' => '' ], 'error' => 'Incorrect value for field "Address": cannot be empty.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Empty port', 'Proxy mode' => 'Passive', 'id:port' => '' ], 'error' => 'Incorrect value for field "Port": cannot be empty.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Wrong Address', 'Proxy mode' => 'Passive', 'id:address' => 'πŸ™‚πŸ™‚πŸ™‚πŸ˜€πŸ˜€πŸ˜€' ], 'error' => 'Invalid parameter "/1/address": an IP or DNS is expected.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Wrong Port', 'Proxy mode' => 'Passive', 'id:port' => 65536 ], 'error' => 'Invalid parameter "/1/port": value must be one of 0-65535.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Active empty Encryption', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => false, 'id:tls_accept_certificate' => false ], 'error' => 'Incorrect value for field "Connections from proxy": cannot be empty.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Active empty PSK', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_psk' => true, 'PSK identity' => 'test' ], 'error' => 'Incorrect value for field "PSK": cannot be empty.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Active empty PSK identity', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_psk' => true, 'PSK' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb' ], 'error' => 'Incorrect value for field "PSK identity": cannot be empty.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Short PSK', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_psk' => true, 'PSK identity' => 'test', 'PSK' => '41b4d07b27a8efdcc15d474' ], 'error' => 'Invalid parameter "/1/tls_psk": minimum length is 32 characters.' ] ], [ [ 'expected' => TEST_BAD, 'proxy_fields' => [ 'Proxy name' => 'Uueven PSK', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_psk' => true, 'PSK identity' => 'test', 'PSK' => '3713AD479CE5B2FA06EB308D7AE96408A70ADE7F630191B6035E13B6DD779B68303FA08E38E38E38E38E38E38E38E38E38E37' ], 'error' => 'Invalid parameter "/1/tls_psk": an even number of hexadecimal characters is expected.' ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'All fields Passive proxy No encryption', 'Proxy mode' => 'Passive' ], 'encryption_fields' => [ 'Connections to proxy' => 'No encryption' ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => '-All fields Active proxy 123', 'Proxy mode' => 'Active', 'Proxy address' => '120.9.9.9', 'Description' => "~`!@#$%^&*()_+-=”№;:?Π₯[]{}|\\|//" ], 'encryption_fields' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true, 'PSK identity' => 'test test', 'PSK' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb', 'Issuer' => 'test test', 'Subject' => 'test test' ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'IPv6', 'Proxy mode' => 'Passive', 'id:address' => '::1', 'id:port' => 999 ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'Utf8 mb4', 'Proxy mode' => 'Active', 'Description' => 'πŸ˜ŠοΈβ€οΈβ€οΈπŸ˜‰' ], 'encryption_fields' => [ 'id:tls_accept_none' => false, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true, 'PSK identity' => 'πŸ™‚πŸ™‚πŸ™‚πŸ˜€πŸ˜€πŸ˜€', 'PSK' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb', 'Issuer' => 'πŸ˜πŸ˜‰πŸ˜‰', 'Subject' => 'πŸ’«πŸ˜ŠπŸ˜ŠπŸ™ƒπŸ™ƒ' ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'All fields Passive proxy PSK', 'Proxy mode' => 'Passive', 'id:address' => '192.168.2.3', 'id:port' => 65535 ], 'encryption_fields' => [ 'Connections to proxy' => 'PSK', 'PSK identity' => 'test', 'PSK' => '581F7BA5C7D5EB29A4AB80E25E4239A771AAFD989E68E923389685F16258F8A6B39900E38E38E38E38E38E38E38E38E38E38' ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => ' Selenium test proxy with spaces ', 'Description' => ' Test description with trailing spaces ', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_certificate' => true, 'Issuer' => ' test ', 'Subject' => ' test ' ], 'trim' => true ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'IPv6 _2', 'Proxy mode' => 'Passive', 'id:address' => 'fe80::1ff:fe23:4567:890a', 'id:port' => 0 ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'Proxy with multiline description', 'Proxy mode' => 'Active', 'Description' => "Test multiline description". "\n". "next line ~`!@#$%^&*()_+-=”№;:?Π₯[]{}|\\|//" ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'LLD macros in encryption fields', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true, 'PSK identity' => '{#LLDMACRO}', 'PSK' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb', 'Issuer' => '{#LLDMACRO}', 'Subject' => '{#LLDMACRO}' ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'User macros in encryption fields', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true, 'PSK identity' => '{$USERMACRO}', 'PSK' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb', 'Issuer' => '{$USERMACRO}', 'Subject' => '{$USERMACRO}' ] ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'All fields Passive proxy Certificate', 'Proxy mode' => 'Passive', 'id:address' => '192.168.3.99' ], 'encryption_fields' => [ 'Connections to proxy' => 'Certificate', 'Issuer' => 'test', 'Subject' => 'test' ], 'check_PSK_button' => true ] ], [ [ 'proxy_fields' => [ 'Proxy name' => 'Special symbols in encryption fields', 'Proxy mode' => 'Active' ], 'encryption_fields' => [ 'id:tls_accept_none' => true, 'id:tls_accept_psk' => true, 'id:tls_accept_certificate' => true, 'PSK identity' => "~`!@#$%^&*()_+-=”№;:?Π₯[]{}|\\|//", 'PSK' => '41b4d07b27a8efdcc15d4742e03857eba377fe010853a1499b0522df171282cb', 'Issuer' => '~`!@#$%^&*()_+-=”№;:?Π₯[]{}|\\|//', 'Subject' => '~`!@#$%^&*()_+-=”№;:?Π₯[]{}|\\|//' ] ] ] ]; } /** * @dataProvider getCreateProxyData * @dataProvider getUpdateProxyData * * @backupOnce hosts */ public function testFormAdministrationProxies_Create($data) { $this->checkForm($data); } /** * @dataProvider getUpdateProxyData */ public function testFormAdministrationProxies_Update($data) { $this->checkForm($data, true); } /** * Function for testing create or update proxy form. * * @param array $data given data provider * @param boolean $update true if update scenario, false if create */ private function checkForm($data, $update = false) { if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) { $old_hash = CDBHelper::getHash($this->sql); } $this->page->login()->open('zabbix.php?action=proxy.list')->waitUntilReady(); if ($update) { $this->query('link', self::$update_proxy)->one()->waitUntilClickable()->click(); } else { $this->query('button:Create proxy')->one()->waitUntilClickable()->click(); } $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); $form = $this->query('id:proxy-form')->asForm()->one(); $form->fill($data['proxy_fields']); if (CTestArrayHelper::get($data, 'encryption_fields')) { $form->selectTab('Encryption'); $form->invalidate(); // Fill PSK to get 'Change PSK' button enabled. if (CTestArrayHelper::get($data, 'encryption_fields.Connections to proxy') === 'PSK') { $form->fill(['Connections to proxy' => 'PSK']); } $button = $form->query('button:Change PSK')->one(false); if ($update && $button->isEnabled()) { $button->click(); $form->fill($data['encryption_fields']); } elseif (CTestArrayHelper::get($data, 'check_PSK_button')) { $this->assertFalse($button->isEnabled()); $form->fill($data['encryption_fields']); $this->assertFalse($button->isEnabled()); } else { $form->fill($data['encryption_fields']); } } $form->submit(); $this->page->waitUntilReady(); if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) { $this->assertMessage(TEST_BAD, ($update ? 'Cannot update proxy' : 'Cannot add proxy'), $data['error']); // Check that DB hash is not changed. $this->assertEquals($old_hash, CDBHelper::getHash($this->sql)); $dialog->close(); } else { $dialog->ensureNotPresent(); $this->assertMessage(TEST_GOOD, $update ? 'Proxy updated' : 'Proxy added'); // Remove leading and trailing spaces from data for assertion. if (CTestArrayHelper::get($data, 'trim', false)) { $trimmed_fields = [ 'proxy_fields' => ['Proxy name', 'Description'], 'encryption_fields' => ['Issuer', 'Subject'] ]; foreach ($trimmed_fields as $tab => $field) { foreach ($field as $i => $value) { $data[$tab][$value] = trim($data[$tab][$value]); } } } // Check values in frontend form. $this->query('link', $data['proxy_fields']['Proxy name'])->waitUntilClickable()->one()->click(); $form = $dialog->asForm(); // Remove PSK fields' values for checking. if (CTestArrayHelper::get($data, 'encryption_fields.PSK identity')) { unset($data['encryption_fields']['PSK identity']); unset($data['encryption_fields']['PSK']); // Check change PSK button if PSK fields were filled. $form->selectTab('Encryption'); $form->query('button:Change PSK')->waitUntilClickable()->one()->click(); foreach (['PSK identity', 'PSK'] as $field) { $this->assertEquals('', $form->getField($field)->waitUntilVisible()->getText()); } } $form->checkValue(array_merge($data['proxy_fields'], CTestArrayHelper::get($data, 'encryption_fields', []))); $dialog->close(); // Check DB. $this->assertEquals(1, CDBHelper::getCount('SELECT * FROM proxy WHERE name ='.zbx_dbstr($data['proxy_fields']['Proxy name']))); if ($update) { self::$update_proxy = $data['proxy_fields']['Proxy name']; } } } public function getActivePassiveProxyData() { return [ [ [ 'proxy' => self::$change_active_proxy ] ], [ [ 'proxy' => self::$change_passive_proxy ] ] ]; } /** * @dataProvider getActivePassiveProxyData */ public function testFormAdministrationProxies_RefreshConfiguration($data) { $old_hash = CDBHelper::getHash($this->sql); $this->page->login()->open('zabbix.php?action=proxy.list')->waitUntilReady(); $this->query('link', $data['proxy'])->one()->waitUntilClickable()->click(); $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); $form = $this->query('id:proxy-form')->asForm()->one(); $old_fields = $form->getFields()->asValues(); // Check alert when trying to refresh configuration. $dialog->query('button:Refresh configuration')->waitUntilClickable()->one()->click(); $this->assertTrue($this->page->isAlertPresent()); $this->assertEquals('Refresh configuration of the selected proxy?', $this->page->getAlertText()); $this->page->acceptAlert(); $this->assertMessage(TEST_GOOD, 'Request created successfully'); $dialog->close(); // Check that form fields did not change. $this->query('link', $data['proxy'])->one()->waitUntilClickable()->click(); COverlayDialogElement::find()->one()->waitUntilReady(); $form->invalidate(); $this->assertEquals($old_fields, $form->getFields()->asValues()); // Check that DB hash did not change. $this->assertEquals($old_hash, CDBHelper::getHash($this->sql)); $dialog->close(); } /** * @dataProvider getActivePassiveProxyData */ public function testFormAdministrationProxies_Clone($data) { $this->page->login()->open('zabbix.php?action=proxy.list')->waitUntilReady(); $this->query('link', $data['proxy'])->one()->waitUntilClickable()->click(); $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); $form = $this->query('id:proxy-form')->asForm()->one(); $original_fields = $form->getFields()->asValues(); // Get original passive proxy interface fields. if (strpos($data['proxy'], 'passive')) { $original_fields = $this->getInterfaceValues($dialog, $original_fields); } $new_name = 'Cloned proxy '.microtime(); // Clone proxy. $dialog->query('button:Clone')->waitUntilClickable()->one()->click(); $form->invalidate(); $form->fill(['Proxy name' => $new_name]); $form->submit(); $this->assertMessage(TEST_GOOD, 'Proxy added'); // Check cloned proxy form fields. $this->query('link', $new_name)->one()->waitUntilClickable()->click(); COverlayDialogElement::find()->one()->waitUntilReady(); $form->invalidate(); $original_fields['Proxy name'] = $new_name; $cloned_fields = $form->getFields()->asValues(); // Get cloned passive proxy interface fields. if (strpos($data['proxy'], 'passive')) { $cloned_fields = $this->getInterfaceValues($dialog, $cloned_fields); } $this->assertEquals($original_fields, $cloned_fields); $dialog->close(); } /** * Function for returning interface fields. * * @param COverlayDialogElement $dialog proxy form overlay dialog * @param array $fields passive proxy interface fields * * @return array */ private function getInterfaceValues($dialog, $fields) { foreach (['ip', 'dns', 'port'] as $id) { $fields[$id] = $dialog->query('id', $id)->one()->getValue(); } $fields['useip'] = $dialog->query('id:useip')->one()->asSegmentedRadio()->getValue(); return $fields; } /** * @dataProvider getActivePassiveProxyData */ public function testFormAdministrationProxies_SimpleUpdate($data) { $old_hash = CDBHelper::getHash($this->sql); $this->page->login()->open('zabbix.php?action=proxy.list')->waitUntilReady(); $this->query('link', $data['proxy'])->one()->waitUntilClickable()->click(); $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); $dialog->query('button:Update')->waitUntilClickable()->one()->click(); $dialog->ensureNotPresent(); // Check that user remained on Proxies page. $this->page->waitUntilReady(); $this->page->assertHeader('Proxies'); $this->assertMessage(TEST_GOOD, 'Proxy updated'); // Check name remained in frontend table. $this->assertTrue($this->query('link', $data['proxy'])->exists()); // Check that DB hash is not changed. $this->assertEquals($old_hash, CDBHelper::getHash($this->sql)); } public function getCancelData() { return [ [ [ 'action' => 'Create' ] ], [ [ 'action' => 'Update' ] ], [ [ 'action' => 'Delete' ] ], [ [ 'action' => 'Refresh configuration' ] ], [ [ 'action' => 'Clone' ] ] ]; } /** * @dataProvider getCancelData */ public function testFormAdministrationProxies_Cancel($data) { $old_hash = CDBHelper::getHash($this->sql); $fields = [ 'proxy_fields' => [ 'Proxy name' => 'Proxy for cancel', 'Proxy mode' => 'Passive', 'id:address' => '192.8.8.8', 'id:port' => 222, 'Description' => 'Description for cancel' ], 'encryption_fields' => [ 'Connections to proxy' => 'Certificate', 'Issuer' => 'Issuer for cancel', 'Subject' => 'Subject for cancel' ] ]; $this->page->login()->open('zabbix.php?action=proxy.list'); if ($data['action'] === 'Create') { $this->query('button:Create proxy')->one()->waitUntilClickable()->click(); } else { $this->query('link', self::$update_proxy)->one()->waitUntilClickable()->click(); } $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); if ($data['action'] === 'Delete' || $data['action'] === 'Refresh configuration') { $dialog->query('button', $data['action'])->waitUntilClickable()->one()->click(); $this->assertTrue($this->page->isAlertPresent()); $this->page->dismissAlert(); $dialog->close(); } else { if ($data['action'] === 'Clone') { $dialog->query('button:Clone')->waitUntilClickable()->one()->click(); $dialog->invalidate(); } $form = $dialog->asForm(); $form->fill($fields['proxy_fields']); $form->selectTab('Encryption'); $form->fill($fields['encryption_fields']); $dialog->query('button:Cancel')->one()->waitUntilClickable()->click(); $dialog->ensureNotPresent(); } // Check that user remained on Proxies page. $this->page->assertTitle('Configuration of proxies'); // Check that DB hash is not changed. $this->assertEquals($old_hash, CDBHelper::getHash($this->sql)); } public function getProxyDeleteData() { return array_merge($this->getActivePassiveProxyData(), [ [ [ 'expected' => TEST_BAD, 'proxy' => self::$delete_proxy_with_hosts, 'error' => "Host \"Host_2 with proxy\" is monitored by proxy \"Proxy_2 for filter\"." ] ], [ [ 'expected' => TEST_BAD, 'proxy' => self::$delete_proxy_with_discovery_rule, 'error' => "Proxy \"Proxy for Discovery rule\" is used by discovery rule \"Discovery rule for update\"." ] ] ]); } /** * @dataProvider getProxyDeleteData */ public function testFormAdministrationProxies_Delete($data) { if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) { $old_hash = CDBHelper::getHash($this->sql); } $this->page->login()->open('zabbix.php?action=proxy.list')->waitUntilReady(); $this->query('link', $data['proxy'])->one()->waitUntilClickable()->click(); $dialog = COverlayDialogElement::find()->one()->waitUntilReady(); $dialog->query('button:Delete')->waitUntilClickable()->one()->click(); // Check alert. $this->assertTrue($this->page->isAlertPresent()); $this->assertEquals('Delete selected proxy?', $this->page->getAlertText()); $this->page->acceptAlert(); if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) { $this->assertMessage(TEST_BAD, 'Cannot delete proxy', $data['error']); // Check that DB hash is not changed. $this->assertEquals($old_hash, CDBHelper::getHash($this->sql)); // Close dialog. $dialog->close(); } else { $dialog->ensureNotPresent(); $this->assertMessage(TEST_GOOD, 'Proxy deleted'); // Check DB. $this->assertEquals(0, CDBHelper::getCount('SELECT * FROM hosts WHERE host='.zbx_dbstr($data['proxy']))); } // Check frontend table. $this->assertEquals(array_key_exists('expected', $data), $this->query('link', $data['proxy'])->exists()); // Check that user redirected on Proxies page. $this->page->assertTitle('Configuration of proxies'); } }