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
653 lines
18 KiB
<?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']);
|
|
}
|
|
}
|
|
}
|