You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

653 lines
18 KiB

1 year ago
<?php
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
require_once dirname(__FILE__).'/../include/CWebTest.php';
require_once dirname(__FILE__).'/traits/TableTrait.php';
require_once dirname(__FILE__).'/behaviors/CMessageBehavior.php';
require_once dirname(__FILE__).'/../include/helpers/CDataHelper.php';
/**
* @backup profiles
*
* @dataSource ExecuteNowAction
*/
class testExecuteNow extends CWebTest {
use TableTrait;
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return [CMessageBehavior::class];
}
public static function getLatestDataPagetData() {
return [
// Simple items.
[
[
'items' => ['I4-trap-log']
]
],
[
[
'items' => ['I2-lvl1-trap-num', 'Download speed for scenario "Web scenario for execute now".']
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['I5-agent-txt'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['I5-agent-txt', 'I4-trap-log'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Dependent items.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl2-dep-log'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl2-dep-log'],
'message' => 'Cannot send request: wrong master item type.'
]
],
[
[
'expected' => TEST_BAD,
'items' => ['I3-web-dep'],
'message' => 'Cannot send request: wrong master item type.'
]
],
// Non-allowed master item type and its dependent item.
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl1-trap-num', 'I2-lvl3-dep-txt'],
'message' => 'Cannot send request: wrong item type.'
]
],
// Non-allowed dependent item and non-allowed simple item.
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl2-dep-log', 'I4-trap-log'],
'message' => 'Cannot send request: wrong item type.'
]
],
// Non-allowed dependent item and allowed dependent item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl3-dep-txt', 'I2-lvl2-dep-log'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Allowed dependent items.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl3-dep-txt', 'I1-lvl2-dep-log'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl3-dep-txt', 'I5-agent-txt'],
'message' => 'Request sent successfully'
]
],
// Allowed dependent item and non-allowed simple item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl3-dep-txt', 'I4-trap-log'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Web scenario item and non-allowed dependent item.
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl2-dep-log', 'Download speed for scenario "Web scenario for execute now".'],
'message' => 'Cannot send request: wrong item type.'
]
],
// Web scenario item and allowed dependent item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl3-dep-txt', 'Download speed for scenario "Web scenario for execute now".'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Web scenario item and allowed item.
[
[
'expected' => TEST_GOOD,
'items' => ['I5-agent-txt', 'Download speed for scenario "Web scenario for execute now".'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Web scenario item and dependent item from web scenario item.
[
[
'expected' => TEST_BAD,
'items' => ['I3-web-dep', 'Download speed for scenario "Web scenario for execute now".'],
'message' => 'Cannot send request: wrong item type.'
]
],
// Dependent web scenario item and allowed item type.
[
[
'expected' => TEST_GOOD,
'items' => ['I3-web-dep', 'I5-agent-txt'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
]
];
}
/**
* Check "Execute now" button on Latest data page.
*
* @dataProvider getLatestDataPagetData
*/
public function testExecuteNow_LatestDataPage($data) {
// Login and select host group for testing.
$this->page->login()->open('zabbix.php?action=latest.view')->waitUntilReady();
$table = $this->query('xpath://table['.CXPathHelper::fromClass('overflow-ellipsis').']')->asTable()->one();
$filter_form = $this->query('name:zbx_filter')->asForm()->one();
$filter_form->fill(['Host groups' => 'HG-for-executenow']);
$filter_form->submit();
$table->waitUntilReloaded();
$this->selectItemsAndExecuteNow($data, $table);
}
public static function getIemContexMenuData() {
return [
// Simple items.
[
[
'item' => 'I4-trap-log'
]
],
[
[
'item' => 'I2-lvl1-trap-num'
]
],
[
[
'expected' => TEST_GOOD,
'item' => 'I5-agent-txt'
]
],
// Web scenario item.
[
[
'item' => 'Download speed for scenario "Web scenario for execute now".'
]
],
// Dependent items.
[
[
'expected' => TEST_BAD,
'item' => 'I3-web-dep',
'message' => 'Cannot send request: wrong master item type.'
]
],
[
[
'expected' => TEST_GOOD,
'item' => 'I1-lvl2-dep-log'
]
],
[
[
'expected' => TEST_BAD,
'item' => 'I2-lvl2-dep-log',
'message' => 'Cannot send request: wrong master item type.'
]
]
];
}
/**
* Check "Execute now" option in Item context menu on Latest data page.
*
* @dataProvider getIemContexMenuData
*/
public function testExecuteNow_ContextMenu($data) {
// Login and select host group for testing.
$this->page->login()->open('zabbix.php?action=latest.view')->waitUntilReady();
$filter_form = $this->query('name:zbx_filter')->asForm()->one();
$filter_form->fill(['Host groups' => 'HG-for-executenow']);
$filter_form->submit();
$this->page->waitUntilReady();
$this->query('link', $data['item'])->one()->click();
$popup = CPopupMenuElement::find()->waitUntilVisible()->one();
// Disabled "Execute now" option in context menu.
if (!array_key_exists('expected', $data)) {
$this->assertFalse($popup->getItem('Execute now')->isEnabled());
return;
}
$popup->fill('Execute now');
if ($data['expected'] === TEST_GOOD) {
$this->assertMessage(TEST_GOOD, 'Request sent successfully');
}
else {
$this->assertMessage(TEST_BAD, 'Cannot execute operation', $data['message']);
}
}
public static function getIemsListData() {
return [
// Simple items.
[
[
'items' => ['I4-trap-log']
]
],
[
[
'items' => ['I2-lvl1-trap-num']
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['I5-agent-txt'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['I5-agent-txt', 'I4-trap-log'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Dependent items.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: I1-lvl2-dep-log'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl1-trap-num: I2-lvl2-dep-log'],
'message' => 'Cannot send request: wrong master item type.'
]
],
[
[
'expected' => TEST_BAD,
'items' => ['Last error message of scenario "Web scenario for execute now".: I3-web-dep'],
'message' => 'Cannot send request: wrong master item type.'
]
],
// Non-allowed master item type and its dependent item.
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl1-trap-num', 'I2-lvl1-trap-num: I2-lvl3-dep-txt'],
'message' => 'Cannot send request: wrong item type.'
]
],
// Non-allowed dependent item and non-allowed simple item.
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl1-trap-num: I2-lvl2-dep-log', 'I4-trap-log'],
'message' => 'Cannot send request: wrong item type.'
]
],
// Non-allowed dependent item and allowed dependent item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: I1-lvl3-dep-txt', 'I2-lvl1-trap-num: I2-lvl2-dep-log'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Allowed dependent items.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: I1-lvl3-dep-txt', 'I1-lvl1-agent-num: I1-lvl2-dep-log'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: I1-lvl3-dep-txt', 'I5-agent-txt'],
'message' => 'Request sent successfully'
]
],
// Allowed dependent item and non-allowed simple item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: I1-lvl3-dep-txt', 'I4-trap-log'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Dependent web scenario item and allowed item type.
[
[
'expected' => TEST_GOOD,
'items' => ['Last error message of scenario "Web scenario for execute now".: I3-web-dep', 'I5-agent-txt'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
]
];
}
/**
* Check "Execute now" button on Items list page.
*
* @dataProvider getIemsListData
*/
public function testExecuteNow_ItemsList($data) {
$hostid = CDataHelper::get('ExecuteNowAction.hostids.Host for execute now permissions');
$this->page->login()->open('items.php?filter_set=1&filter_hostids%5B0%5D='.$hostid.'&context=host')->waitUntilReady();
$table = $this->query('xpath://form[@name="items"]//table')->asTable()->one()->waitUntilPresent();
$this->selectItemsAndExecuteNow($data, $table);
}
public static function getIemPageData() {
return [
// Simple items.
[
[
'name' => 'I4-trap-log'
]
],
[
[
'name' => 'I2-lvl1-trap-num'
]
],
[
[
'expected' => TEST_GOOD,
'name' => 'I1-lvl1-agent-num',
'message' => 'Request sent successfully'
]
],
// Dependent items.
[
[
'expected' => TEST_GOOD,
'name' => 'I1-lvl2-dep-log',
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_BAD,
'name' => 'I2-lvl2-dep-log',
'message' => 'Cannot send request: wrong master item type.'
]
],
[
[
'expected' => TEST_BAD,
'name' => 'I3-web-dep',
'message' => 'Cannot send request: wrong master item type.'
]
]
];
}
/**
* Check "Execute now" button on Item page.
*
* @dataProvider getIemPageData
*/
public function testExecuteNow_ItemPage($data) {
$hostid = CDataHelper::get('ExecuteNowAction.hostids.Host for execute now permissions');
$this->page->login()->open('items.php?filter_set=1&filter_hostids%5B0%5D='.$hostid.'&context=host')->waitUntilReady();
$table = $this->query('xpath://form[@name="items"]//table')->asTable()->one()->waitUntilPresent();
$this->openItemAndExecuteNow($data, $table);
}
public static function getDiscoveryRulesListData() {
return [
// Simple items.
[
[
'items' => ['DR2-trap']
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['DR1-agent'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_GOOD,
'items' => ['DR1-agent', 'DR2-trap'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Dependent items.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: DR3-I1-dep-agent'],
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_BAD,
'items' => ['I2-lvl1-trap-num: DR4-I2-dep-trap'],
'message' => 'Cannot send request: wrong master item type.'
]
],
[
[
'expected' => TEST_BAD,
'items' => ['Last error message of scenario "Web scenario for execute now".: DR5-web-dep'],
'message' => 'Cannot send request: wrong master item type.'
]
],
// Non-allowed item type and non-allowed dependent item.
[
[
'expected' => TEST_BAD,
'items' => ['DR2-trap', 'I2-lvl1-trap-num: DR4-I2-dep-trap'],
'message' => 'Cannot send request: wrong discovery rule type.'
]
],
// Non-allowed dependent item and allowed dependent item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: DR3-I1-dep-agent', 'I2-lvl1-trap-num: DR4-I2-dep-trap'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Allowed dependent item and non-allowed simple item.
[
[
'expected' => TEST_GOOD,
'items' => ['I1-lvl1-agent-num: DR3-I1-dep-agent', 'DR2-trap'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
],
// Dependent web scenario item and allowed item type.
[
[
'expected' => TEST_GOOD,
'items' => ['Last error message of scenario "Web scenario for execute now".: DR5-web-dep', 'DR1-agent'],
'message' => 'Request sent successfully. Some items are filtered due to access permissions or type.'
]
]
];
}
/**
* Check "Execute now" button on Discovery rule list page.
*
* @dataProvider getDiscoveryRulesListData
*/
public function testExecuteNow_DiscoveryRulesList($data) {
$hostid = CDataHelper::get('ExecuteNowAction.hostids.Host for execute now permissions');
$this->page->login()->open('host_discovery.php?filter_set=1&filter_hostids%5B0%5D='.$hostid.'&context=host')->waitUntilReady();
$table = $this->query('xpath://form[@name="discovery"]//table')->asTable()->one()->waitUntilPresent();
$this->selectItemsAndExecuteNow($data, $table);
}
public static function getDiscoveryRuleData() {
return [
[
[
'name' => 'DR2-trap'
]
],
[
[
'expected' => TEST_GOOD,
'name' => 'DR1-agent',
'message' => 'Request sent successfully'
]
],
// Dependent items.
[
[
'expected' => TEST_GOOD,
'name' => 'DR3-I1-dep-agent',
'message' => 'Request sent successfully'
]
],
[
[
'expected' => TEST_BAD,
'name' => 'DR4-I2-dep-trap',
'message' => 'Cannot send request: wrong master item type.'
]
],
[
[
'expected' => TEST_BAD,
'name' => 'DR5-web-dep',
'message' => 'Cannot send request: wrong master item type.'
]
]
];
}
/**
* Check "Execute now" button on Discovery rule page.
*
* @dataProvider getDiscoveryRuleData
*/
public function testExecuteNow_DiscoveryRulePage($data) {
$hostid = CDataHelper::get('ExecuteNowAction.hostids.Host for execute now permissions');
$this->page->login()->open('host_discovery.php?filter_set=1&filter_hostids%5B0%5D='.$hostid.'&context=host')->waitUntilReady();
$table = $this->query('xpath://form[@name="discovery"]//table')->asTable()->one()->waitUntilPresent();
$this->openItemAndExecuteNow($data, $table);
}
/**
* Open item or discovery rule list page and check "Execute now" button functionality.
*
* @param array $data data provider
* @param CElement $table table element
*/
private function selectItemsAndExecuteNow($data, $table) {
$selected_count = $this->query('id:selected_count')->one();
$table->findRows('Name', $data['items'])->select();
$this->assertEquals(count($data['items']).' selected', $selected_count->getText());
// Disabled "Execute now" button.
if (!array_key_exists('expected', $data)) {
$this->assertTrue($this->query('button:Execute now')->one()->isEnabled(false));
return;
}
$this->query('button:Execute now')->one()->click();
if (CTestArrayHelper::get($data, 'expected') === TEST_GOOD) {
$this->assertMessage(TEST_GOOD, $data['message']);
// After a successful "Execute now" action, the item selection is reset.
$this->assertEquals('0 selected', $selected_count->getText());
}
else {
$this->assertMessage(TEST_BAD, 'Cannot execute operation', $data['message']);
$this->assertEquals(count($data['items']).' selected', $selected_count->getText());
}
}
/**
* Open item or discovery rule page and check "Execute now" button functionality.
*
* @param array $data data provider
* @param CElement $table table element
*/
private function openItemAndExecuteNow($data, $table) {
$table->query('link', $data['name'])->waitUntilClickable()->one()->click();
// Disabled "Execute now" button.
if (!array_key_exists('expected', $data)) {
$this->assertTrue($this->query('button:Execute now')->one()->isEnabled(false));
return;
}
$this->query('button:Execute now')->waitUntilClickable()->one()->click();
if (CTestArrayHelper::get($data, 'expected') === TEST_GOOD) {
$this->assertMessage(TEST_GOOD, $data['message']);
}
else {
$this->assertMessage(TEST_BAD, 'Cannot execute operation', $data['message']);
}
}
}