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.
zabbix/ui/tests/selenium/testExpandExpressionMacros.php

339 lines
9.7 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';
/**
* @onBefore prepareItemsData, prepareMapsData, writeValuesToItems
*
* @onAfter clearData
*/
class testExpandExpressionMacros extends CWebTest {
protected static $data = [
'hostgroupid',
'hostids' => [
'last' => null,
'avg' => null,
'min' => null,
'max' => null
],
'itemids' => [
'last' => null,
'avg' => null,
'min' => null,
'max' => null
],
'mapid'
];
public function prepareItemsData() {
// Create hostgroup for hosts with items and graphs.
$hostgroups = CDataHelper::call('hostgroup.create', [
[
'name' => 'Group for macro expand testing'
]
]);
$this->assertArrayHasKey('groupids', $hostgroups);
self::$data['hostgroupid'] = $hostgroups['groupids'][0];
// Create hosts for items and graphs.
$hosts_data = [];
foreach (['Last', 'Avg', 'Min', 'Max'] as $type) {
$hosts_data[] = [
'host' => 'Host for expression macro '.$type,
'groups' => [
['groupid' => self::$data['hostgroupid']]
]
];
}
$hosts = CDataHelper::call('host.create', $hosts_data);
$this->assertArrayHasKey('hostids', $hosts);
$hostids = CDataHelper::getIds('host');
self::$data['hostids']['last'] = $hostids['Host for expression macro Last'];
self::$data['hostids']['avg'] = $hostids['Host for expression macro Avg'];
self::$data['hostids']['min'] = $hostids['Host for expression macro Min'];
self::$data['hostids']['max'] = $hostids['Host for expression macro Max'];
// Create items on previously created hosts.
$items_data = [];
foreach ($hostids as $hostid) {
$items_data[] = [
'hostid' => $hostid,
'name' => 'trapper',
'key_' => 'trapper',
'type' => 2,
'value_type' => 0
];
}
$items = CDataHelper::call('item.create', $items_data);
self::$data['itemids']['last'] = $items['itemids'][0];
self::$data['itemids']['avg'] = $items['itemids'][1];
self::$data['itemids']['min'] = $items['itemids'][2];
self::$data['itemids']['max'] = $items['itemids'][3];
// Create graphs with expression macros in names.
$prepared_graphs = [
[
'name' => 'Last trapper value: {?last(/Host for expression macro Last/trapper)}',
'itemid' => self::$data['itemids']['last']
],
[
'name' => 'Avg trapper value: {?avg(/{HOST.HOST}/trapper,1h)}',
'itemid' => self::$data['itemids']['avg']
],
[
'name' => 'Max trapper value: {?max(/Host for expression macro Min/trapper,1w)}',
'itemid' => self::$data['itemids']['min']
],
[
'name' => 'Min trapper value: {?min(/{HOST.HOST}/trapper,1d)}',
'itemid' => self::$data['itemids']['max']
]
];
$graphs_data = [];
foreach ($prepared_graphs as $graph) {
$graphs_data[] = [
'name' => $graph['name'],
'width' => 900,
'height' => 200,
'gitems' => [
[
'itemid' => $graph['itemid'],
'color'=> '00AA00'
]
]
];
}
CDataHelper::call('graph.create', $graphs_data);
}
public function getGraphData() {
return [
[
[
'host_name' => 'Host for expression macro Last'
]
],
[
[
'host_name' => 'Host for expression macro Avg'
]
],
[
[
'host_name' => 'Host for expression macro Min'
]
],
[
[
'host_name' => 'Host for expression macro Max'
]
]
];
}
public function writeValuesToItems() {
// Add values for items.
$time = time() - 100;
$last_time = time();
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['last']).
", ".zbx_dbstr($time).", 2, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['last']).
", ".$last_time.", 4, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['avg']).
", ".zbx_dbstr($time).", 3, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['avg']).
", ".zbx_dbstr($last_time).", 5, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['min']).
", ".zbx_dbstr($time).", 1, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['min']).
", ".zbx_dbstr($last_time).", 3, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['max']).
", ".zbx_dbstr($time).", 7, 0)");
DBexecute("INSERT INTO history (itemid, clock, value, ns) VALUES (".zbx_dbstr(self::$data['itemids']['max']).
", ".zbx_dbstr($last_time).", 2, 0)");
}
/**
* Test for checking expression macro expand in graph names.
*
* @dataProvider getGraphData
*/
public function testExpandExpressionMacros_Graph($data) {
$this->page->login()->open('zabbix.php?action=host.view&groupids%5B%5D='.self::$data['hostgroupid'])
->waitUntilReady();
$table = $this->query('xpath://form[@name="host_view"]/table[@class="list-table"]')->asTable()
->waitUntilReady()->one();
$table->findRow('Name', $data['host_name'])->getColumn('Graphs')->query('tag:a')->one()->click();
$this->page->waitUntilReady();
$this->waitUntilGraphIsLoaded();
// TODO: This sleep is added here because of DEV-1908.
sleep(1);
$covered_region = [
'x' => 78,
'y' => 33,
'width' => 1144,
'height' => 305
];
$this->assertScreenshotExcept($this->waitUntilGraphIsLoaded(), $covered_region, $data['host_name']);
}
/**
* Function for waiting loader ring.
*/
private function waitUntilGraphIsLoaded() {
try {
$this->query('xpath://div[contains(@class,"is-loading")]/img')->waitUntilPresent();
}
catch (\Exception $ex) {
// Code is not missing here.
}
return $this->query('xpath://div[not(contains(@class,"is-loading"))]/img')->waitUntilPresent()->one();
}
public function prepareMapsData() {
// Create map with macros in elements names.
$maps = CDataHelper::call('map.create', [
[
'name' => 'Map with expression macros',
'width' => 500,
'height' => 500,
'label_type'=> 0,
'selements' => [
// Host 'Host for expression macro Avg'.
[
'selementid' => 20,
'elements' => [
['hostid' => self::$data['hostids']['avg']]
],
'elementtype' => 0,
'iconid_off' => 151,
'label' => '{?avg(/{HOST.HOST}/trapper,1h)}',
'x' => 139,
'y' => 27
],
// Image.
[
'selementid' => 21,
'elementtype' => 4,
'iconid_off' => 6,
'label' => '{?last(/Host for expression macro Last/trapper)}',
'x' => 250,
'y' => 350
],
// Host 'Host for expression macro Min'.
[
'selementid' => 22,
'elements' => [
['hostid' => self::$data['hostids']['min']]
],
'elementtype' => 0,
'iconid_off' => 151,
'label' => '{?min(/{HOST.HOST}/trapper,1d)}',
'x' => 89,
'y' => 377,
'iconid_off' => 141
]
],
'links' => [
// Link between 'Host for expression macro Avg' and 'Host for expression macro Min'.
[
'selementid1' => 20,
'selementid2' => 22,
'label' => '{?max(/Host for expression macro Max/trapper,1w)}'
]
]
]
]);
$this->assertArrayHasKey('sysmapids', $maps);
self::$data['mapid'] = $maps['sysmapids'][0];
}
/**
* Test for checking expression macro expand in map's elements.
*/
public function testExpandExpressionMacros_Map() {
// Open map in view mode.
$this->page->login()->open('zabbix.php?action=map.view&sysmapid='.self::$data['mapid'])->waitUntilReady();
$map_image = $this->query('xpath://div[@id="flickerfreescreen_mapimg"]/div/*[name()="svg"]')
->waitUntilPresent()->one();
$covered_region = [
'x' => 365,
'y' => 484,
'width' => 145,
'height' => 13
];
$this->assertScreenshotExcept($map_image, $covered_region, 'Map with expression macros');
// Open map in edit mode.
$this->query('button:Edit map')->waitUntilClickable()->one()->click();
$this->page->waitUntilReady();
// Expand macros is off by default.
$this->assertTrue($this->query('xpath://button[@id="expand_macros" and text() = "Off"]')
->waitUntilVisible()->exists()
);
$map_edited = $this->query('id:map-area')->waitUntilPresent()->one();
$this->assertScreenshot($map_edited, 'Edited map macros OFF');
// Turn expanding macros on.
$this->query('id:expand_macros')->waitUntilClickable()->one()->click();
$this->assertTrue($this->query('xpath://button[@id="expand_macros" and text() = "On"]')
->waitUntilVisible()->exists()
);
$this->assertScreenshot($map_edited, 'Edited map macros ON');
}
/**
* Delete all created data after test.
*/
public static function clearData() {
// Delete Hosts.
CDataHelper::call('host.delete', [
self::$data['hostids']['last'],
self::$data['hostids']['avg'],
self::$data['hostids']['min'],
self::$data['hostids']['max']
]);
// Delete Host group.
CDataHelper::call('hostgroup.delete', [
self::$data['hostgroupid']
]);
// Delete Maps.
CDataHelper::call('map.delete', [
self::$data['mapid']
]);
}
}