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.
383 lines
11 KiB
383 lines
11 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/CIntegrationTest.php';
|
|
|
|
/**
|
|
* Test suite for changecount() function evaluation.
|
|
*
|
|
* @required-components server
|
|
* @hosts test_host
|
|
* @backup history
|
|
*/
|
|
class testFunctionChangeCount extends CIntegrationTest {
|
|
|
|
const HOST_NAME = 'test_host';
|
|
const WAIT_TIME = 1;
|
|
const FUNC_NAME = 'changecount';
|
|
|
|
private static $hostid;
|
|
private static $interfaceid;
|
|
|
|
private static $items = [
|
|
'item_ui64' => [
|
|
'key' => 'item_ui64',
|
|
'value_type' => ITEM_VALUE_TYPE_UINT64,
|
|
'triggers' => [
|
|
// All values different, this case is also used to check
|
|
// "not enough data" scenario
|
|
'all_different' => [
|
|
'params' => '#5',
|
|
'expected_result' => 4
|
|
],
|
|
// Some values are equal
|
|
'some_equal' => [
|
|
'params' => '#5',
|
|
'expected_result' => 2
|
|
],
|
|
// "inc" mode
|
|
'inc' => [
|
|
'params' => '#5,"inc"',
|
|
'expected_result' => 2
|
|
],
|
|
// "dec" mode
|
|
'dec' => [
|
|
'params' => '#5,"dec"',
|
|
'expected_result' => 2
|
|
],
|
|
// Explicit "all" mode
|
|
'all' => [
|
|
'params' => '#5,"all"',
|
|
'expected_result' => 3
|
|
],
|
|
// Below scenarios have wrong parameters, trigger creation must fail
|
|
[
|
|
'params' => '#5,"inc","strict"',
|
|
'expected_result' => 0,
|
|
'expected_error' => true
|
|
],
|
|
[
|
|
'params' => '',
|
|
'expected_result' => 0,
|
|
'expected_error' => true
|
|
],
|
|
[
|
|
'params' => '"inc"',
|
|
'expected_result' => 0,
|
|
'expected_error' => true
|
|
],
|
|
[
|
|
'params' => '#20,"strict"',
|
|
'expected_result' => 0,
|
|
'expected_error' => true
|
|
]
|
|
]
|
|
],
|
|
'item_dbl' => [
|
|
'key' => 'item_dbl',
|
|
'value_type' => ITEM_VALUE_TYPE_FLOAT,
|
|
'triggers' => [
|
|
// All values different
|
|
'all_different' => [
|
|
'params' => '#5',
|
|
'expected_result' => 4
|
|
],
|
|
// Some values are equal, explicit "all" mode
|
|
'some_equal' => [
|
|
'params' => '#5,"all"',
|
|
'expected_result' => 3
|
|
],
|
|
// "inc" mode
|
|
'inc' => [
|
|
'params' => '#5,"inc"',
|
|
'expected_result' => 3
|
|
],
|
|
// "dec" mode
|
|
'dec' => [
|
|
'params' => '#5,"dec"',
|
|
'expected_result' => 1
|
|
]
|
|
]
|
|
],
|
|
'item_str' => [
|
|
'key' => 'item_str',
|
|
'value_type' => ITEM_VALUE_TYPE_STR,
|
|
'triggers' => [
|
|
// All values different
|
|
'all_different' => [
|
|
'params' => '#5',
|
|
'expected_result' => 4
|
|
],
|
|
// Some values are equal
|
|
'some_equal' => [
|
|
'params' => '#5',
|
|
'expected_result' => 2
|
|
]
|
|
]
|
|
]
|
|
];
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function prepareData() {
|
|
// Create host "test_host"
|
|
$response = $this->call('host.create', [
|
|
[
|
|
'host' => self::HOST_NAME,
|
|
'interfaces' => [
|
|
'type' => 1,
|
|
'main' => 1,
|
|
'useip' => 1,
|
|
'ip' => '127.0.0.1',
|
|
'dns' => '',
|
|
'port' => $this->getConfigurationValue(self::COMPONENT_AGENT, 'ListenPort')
|
|
],
|
|
'groups' => [['groupid' => 4]],
|
|
'status' => HOST_STATUS_NOT_MONITORED
|
|
]
|
|
]);
|
|
|
|
$this->assertArrayHasKey('hostids', $response['result']);
|
|
$this->assertArrayHasKey(0, $response['result']['hostids']);
|
|
self::$hostid = $response['result']['hostids'][0];
|
|
|
|
// Get host interface ids
|
|
$response = $this->call('host.get', [
|
|
'output' => ['host'],
|
|
'hostids' => [self::$hostid],
|
|
'selectInterfaces' => ['interfaceid']
|
|
]);
|
|
|
|
$this->assertArrayHasKey(0, $response['result']);
|
|
$this->assertArrayHasKey('interfaces', $response['result'][0]);
|
|
$this->assertArrayHasKey(0, $response['result'][0]['interfaces']);
|
|
self::$interfaceid = $response['result'][0]['interfaces'][0]['interfaceid'];
|
|
|
|
// Create trapper items
|
|
foreach (self::$items as &$item) {
|
|
$items[] = [
|
|
'name' => $item['key'],
|
|
'key_' => $item['key'],
|
|
'value_type' => $item['value_type'],
|
|
'type' => ITEM_TYPE_TRAPPER,
|
|
'hostid' => self::$hostid
|
|
];
|
|
}
|
|
|
|
$response = $this->call('item.create', $items);
|
|
$this->assertArrayHasKey('itemids', $response['result']);
|
|
$this->assertEquals(count($items), count($response['result']['itemids']));
|
|
$itemids = $response['result']['itemids'];
|
|
$id = 0;
|
|
|
|
foreach (self::$items as &$item) {
|
|
$item['itemid'] = $itemids[$id++];
|
|
}
|
|
|
|
// Create triggers
|
|
foreach (self::$items as &$item) {
|
|
foreach ($item['triggers'] as &$trigger) {
|
|
$response = $this->call('trigger.create', [
|
|
[
|
|
'description' => self::FUNC_NAME.'('.$trigger['params'].')',
|
|
'expression' => self::FUNC_NAME.'(/'.self::HOST_NAME.'/'.$item['key'].','.$trigger['params'].')='.$trigger['expected_result']
|
|
]
|
|
], $error = (array_key_exists('expected_error', $trigger)));
|
|
// Check for scenarios when trigger creation must fail
|
|
if (array_key_exists('expected_error', $trigger)) {
|
|
$this->assertArrayHasKey('error', $response);
|
|
continue;
|
|
}
|
|
|
|
$this->assertArrayHasKey('triggerids', $response['result']);
|
|
$this->assertEquals(1, count($response['result']['triggerids']));
|
|
$trigger['triggerid'] = $response['result']['triggerids'][0];
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Send values
|
|
*/
|
|
private function sendValues($item, $values) {
|
|
foreach ($values as &$value) {
|
|
$this->sendSenderValue(self::HOST_NAME, $item, $value);
|
|
}
|
|
sleep(self::WAIT_TIME);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Check trigger value
|
|
*/
|
|
private function checkTriggerValue($trigger) {
|
|
$response = $this->call('trigger.get', ['triggerids' => [$trigger['triggerid']]]);
|
|
$this->assertEquals(1, $response['result'][0]['value']);
|
|
|
|
return true;
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_NotEnoughData() {
|
|
return $this->sendValues('item_ui64', [64]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_NotEnoughData
|
|
*/
|
|
public function testFunctionChangeCount_Get_NotEnoughData() {
|
|
$response = $this->call('trigger.get',
|
|
['triggerids' => [self::$items['item_ui64']['triggers']['all_different']['triggerid']]]);
|
|
|
|
$this->assertArrayHasKey('error', $response['result'][0]);
|
|
$this->assertContains('not enough data', $response['result'][0]['error']);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Get_NotEnoughData
|
|
*/
|
|
public function testFunctionChangeCount_Send_Ui64ImplicitAll_AllDifferent() {
|
|
return $this->sendValues('item_ui64', [64, 24, 69, 32, 96]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_Ui64ImplicitAll_AllDifferent
|
|
*/
|
|
public function testFunctionChangeCount_Get_Ui64ImplicitAll_AllDifferent() {
|
|
return $this->checkTriggerValue(self::$items['item_ui64']['triggers']['all_different']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_Ui64ImplicitAll_SomeEqual() {
|
|
return $this->sendValues('item_ui64', [97, 35, 35, 29, 29]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_Ui64ImplicitAll_SomeEqual
|
|
*/
|
|
public function testFunctionChangeCount_Get_Ui64ImplicitAll_SomeEqual() {
|
|
return $this->checkTriggerValue(self::$items['item_ui64']['triggers']['some_equal']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_Ui64Inc() {
|
|
return $this->sendValues('item_ui64', [21, 34, 73, 55, 46]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_Ui64Inc
|
|
*/
|
|
public function testFunctionChangeCount_Get_Ui64Inc() {
|
|
return $this->checkTriggerValue(self::$items['item_ui64']['triggers']['inc']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_Ui64Dec() {
|
|
return $this->sendValues('item_ui64', [7, 92, 67, 96, 44]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_Ui64Dec
|
|
*/
|
|
public function testFunctionChangeCount_Get_Ui64Dec() {
|
|
return $this->checkTriggerValue(self::$items['item_ui64']['triggers']['dec']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_Ui64ExplicitAll() {
|
|
return $this->sendValues('item_ui64', [55, 93, 76, 76, 33]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_Ui64ExplicitAll
|
|
*/
|
|
public function testFunctionChangeCount_Get_Ui64_ExplicitAll() {
|
|
return $this->checkTriggerValue(self::$items['item_ui64']['triggers']['all']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_DblImplicitAll() {
|
|
return $this->sendValues('item_dbl', [0.000005, 0.000001, 0.000007, 0.000004, 0.000002]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_DblImplicitAll
|
|
*/
|
|
public function testFunctionChangeCount_Get_DblImplicitAll() {
|
|
return $this->checkTriggerValue(self::$items['item_dbl']['triggers']['all_different']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_DblExplicitAll() {
|
|
return $this->sendValues('item_dbl', [0.0001, 0.0011, 0.0011, 0.0002, 0.0005]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_DblExplicitAll
|
|
*/
|
|
public function testFunctionChangeCount_Get_DblExplicitAll() {
|
|
return $this->checkTriggerValue(self::$items['item_dbl']['triggers']['some_equal']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_DblInc() {
|
|
return $this->sendValues('item_dbl', [0.0001, 0.0002, 0.0003, 0.0004, 0.0004]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_DblInc
|
|
*/
|
|
public function testFunctionChangeCount_Get_DblInc() {
|
|
return $this->checkTriggerValue(self::$items['item_dbl']['triggers']['inc']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_DblDec() {
|
|
return $this->sendValues('item_dbl', [0.00001, 0.00002, 0.00003, 0.00004, 0.00003]);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_DblDec
|
|
*/
|
|
public function testFunctionChangeCount_Get_DblDec() {
|
|
return $this->checkTriggerValue(self::$items['item_dbl']['triggers']['dec']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_StrAllDifferent() {
|
|
return $this->sendValues('item_str', ['abc', 'def', 'ghi', 'jkl', 'mno']);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_StrAllDifferent
|
|
*/
|
|
public function testFunctionChangeCount_Get_StrAllDifferent() {
|
|
return $this->checkTriggerValue(self::$items['item_str']['triggers']['all_different']);
|
|
}
|
|
|
|
public function testFunctionChangeCount_Send_StrSomeEqual() {
|
|
return $this->sendValues('item_str', ['abc', 'abc', 'ghi', 'ghi', 'mno']);
|
|
}
|
|
|
|
/**
|
|
* @depends testFunctionChangeCount_Send_StrSomeEqual
|
|
*/
|
|
public function testFunctionChangeCount_Get_StrSomeEqual() {
|
|
return $this->checkTriggerValue(self::$items['item_str']['triggers']['some_equal']);
|
|
}
|
|
}
|
|
|