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.
482 lines
12 KiB
482 lines
12 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/CAPITest.php';
|
|
|
|
|
|
/**
|
|
* @backup history_bin
|
|
*/
|
|
class testHistory extends CAPITest {
|
|
|
|
public static function history_get_data() {
|
|
$binary_itemid = 58740;
|
|
|
|
return [
|
|
// Test item history of value_type == ITEM_VALUE_TYPE_STR ('history' => 1).
|
|
[
|
|
'api_request' => [
|
|
'output' => 'extend',
|
|
'history' => 1,
|
|
'itemids' => ['133760']
|
|
],
|
|
'expected_result' => [
|
|
[
|
|
'itemid' => '133760',
|
|
'clock' => '1549350960',
|
|
'value' => '1',
|
|
'ns' => '754460948'
|
|
],
|
|
[
|
|
'itemid' => '133760',
|
|
'clock' => '1549350962',
|
|
'value' => '1',
|
|
'ns' => '919404393'
|
|
],
|
|
[
|
|
'itemid' => '133760',
|
|
'clock' => '1549350965',
|
|
'value' => '1',
|
|
'ns' => '512878374'
|
|
]
|
|
],
|
|
'expected_error' => false
|
|
],
|
|
// Test item history of value_type == ITEM_VALUE_TYPE_LOG ('history' => 2).
|
|
[
|
|
'api_request' => [
|
|
'output' => ['value', 'severity'],
|
|
'history' => 2,
|
|
'itemids' => ['133761']
|
|
],
|
|
'expected_result' => [
|
|
[
|
|
'value' => '1',
|
|
'severity' => '0'
|
|
],
|
|
[
|
|
'value' => '2',
|
|
'severity' => '0'
|
|
],
|
|
[
|
|
'value' => '3',
|
|
'severity' => '0'
|
|
],
|
|
[
|
|
'value' => '4',
|
|
'severity' => '0'
|
|
],
|
|
[
|
|
'value' => '5',
|
|
'severity' => '0'
|
|
]
|
|
],
|
|
'expected_error' => false
|
|
],
|
|
// Get last 5 values of item of value_type == ITEM_VALUE_TYPE_FLOAT ('history' => 0).
|
|
[
|
|
'api_request' => [
|
|
'output' => ['value', 'clock'],
|
|
'history' => 0,
|
|
'itemids' => ['133759'],
|
|
'sortorder' => 'DESC',
|
|
'sortfield' => 'clock',
|
|
'limit' => 5
|
|
],
|
|
'expected_result' => [
|
|
[
|
|
'value' => '-1.5',
|
|
'clock' => '1549350962'
|
|
],
|
|
[
|
|
'value' => '-1',
|
|
'clock' => '1549350961'
|
|
],
|
|
[
|
|
'value' => '1.5',
|
|
'clock' => '1549350960'
|
|
],
|
|
[
|
|
'value' => '1.0001',
|
|
'clock' => '1549350959'
|
|
],
|
|
[
|
|
'value' => '1.5',
|
|
'clock' => '1549350958'
|
|
]
|
|
],
|
|
'expected_error' => false
|
|
],
|
|
// Get values of item of value_type == ITEM_VALUE_TYPE_UINT64 ('history' => 3) using time range selector.
|
|
[
|
|
'api_request' => [
|
|
'output' => ['value', 'clock'],
|
|
'history' => 3,
|
|
'itemids' => ['133758'],
|
|
'time_from' => 1549350908,
|
|
'time_till' => 1549350909
|
|
],
|
|
'expected_result' => [
|
|
[
|
|
'value' => '3',
|
|
'clock' => '1549350908'
|
|
],
|
|
[
|
|
'value' => '4',
|
|
'clock' => '1549350909'
|
|
]
|
|
],
|
|
'expected_error' => false
|
|
],
|
|
// Get count of values of item of value_type == ITEM_VALUE_TYPE_TEXT ('history' => 4).
|
|
[
|
|
'api_request' => [
|
|
'countOutput' => true,
|
|
'history' => 4,
|
|
'itemids' => ['133762']
|
|
],
|
|
'expected_result' => '3',
|
|
'expected_error' => false
|
|
],
|
|
// Get number of history records filtering records by itemid.
|
|
[
|
|
'api_request' => [
|
|
'countOutput' => true,
|
|
'filter' => [
|
|
'itemid' => ['133758']
|
|
]
|
|
],
|
|
'expected_result' => '14',
|
|
'expected_error' => false
|
|
],
|
|
// Get number of history records of filtering by particular value.
|
|
[
|
|
'api_request' => [
|
|
'countOutput' => true,
|
|
'history' => 3,
|
|
'filter' => [
|
|
'value' => '5'
|
|
]
|
|
],
|
|
'expected_result' => '5',
|
|
'expected_error' => false
|
|
],
|
|
// Get number of history records of searching by particular value.
|
|
[
|
|
'api_request' => [
|
|
'countOutput' => true,
|
|
'history' => 1,
|
|
'search' => [
|
|
'value' => '1'
|
|
]
|
|
],
|
|
'expected_result' => '3',
|
|
'expected_error' => false
|
|
],
|
|
// Get floating point number values using differently casted filter values.
|
|
[
|
|
'api_request' => [
|
|
'output' => ['value', 'clock'],
|
|
'history' => 0,
|
|
'filter' => [
|
|
'value' => ['1.5', 1.0001, -1, -1.5, 'abc']
|
|
]
|
|
],
|
|
'expected_result' => [
|
|
[
|
|
'value' => '1.5',
|
|
'clock' => '1549350958'
|
|
],
|
|
[
|
|
'value' => '1.0001',
|
|
'clock' => '1549350959'
|
|
],
|
|
[
|
|
'value' => '1.5',
|
|
'clock' => '1549350960'
|
|
],
|
|
[
|
|
'value' => '-1',
|
|
'clock' => '1549350961'
|
|
],
|
|
[
|
|
'value' => '-1.5',
|
|
'clock' => '1549350962'
|
|
]
|
|
],
|
|
'expected_error' => false
|
|
],
|
|
// Unsupported type of value in filter request.
|
|
[
|
|
'api_request' => [
|
|
'output' => [],
|
|
'history' => 0,
|
|
'filter' => [
|
|
'value' => [[]]
|
|
]
|
|
],
|
|
'expected_result' => null,
|
|
'expected_error' => 'Invalid parameter "/filter/value/1": a character string, integer or floating point value is expected.'
|
|
],
|
|
'Verify binary type NOT returned with wrong history/value type' => [
|
|
'api_request' => [
|
|
'output' => ['value'],
|
|
'history' => ITEM_VALUE_TYPE_FLOAT,
|
|
'itemids' => [$binary_itemid],
|
|
'limit' => 1
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => false
|
|
],
|
|
'Verify binary type returned as base64' => [
|
|
'api_request' => [
|
|
'output' => ['value'],
|
|
'history' => ITEM_VALUE_TYPE_BINARY,
|
|
'itemids' => [$binary_itemid],
|
|
'sortorder' => 'DESC',
|
|
'sortfield' => 'clock',
|
|
'limit' => 1
|
|
],
|
|
'expected_result' => [
|
|
[
|
|
'value' => base64_encode('This should be binary')
|
|
]
|
|
],
|
|
'expected_error' => false
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider history_get_data
|
|
*/
|
|
public function testHistory_Get($api_request, $expected_result, $expected_error) {
|
|
$result = $this->call('history.get', $api_request, $expected_error);
|
|
|
|
if ($expected_error === false) {
|
|
$this->assertSame($expected_result, $result['result']);
|
|
}
|
|
else {
|
|
$this->assertSame($expected_error, $result['error']['data']);
|
|
}
|
|
}
|
|
|
|
public static function history_clear_data() {
|
|
$binary_itemid = 58740;
|
|
|
|
return [
|
|
[
|
|
'api_request' => ['999999'], // Non-existing itemid.
|
|
'expected_result' => null,
|
|
'expected_error' => 'No permissions to referred object or it does not exist!'
|
|
],
|
|
[
|
|
'api_request' => [$binary_itemid],
|
|
'expected_result' => [
|
|
'itemids' => [$binary_itemid]
|
|
],
|
|
'expected_error' => false
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider history_clear_data
|
|
*/
|
|
public function testHistory_Clear($api_request, $expected_result, $expected_error) {
|
|
$result = $this->call('history.clear', $api_request, $expected_error);
|
|
|
|
if ($expected_error === false) {
|
|
$this->assertSame($expected_result, $result['result']);
|
|
}
|
|
else {
|
|
$this->assertSame($expected_error, $result['error']['data']);
|
|
|
|
$this->assertEquals(0, CDBHelper::getCount(
|
|
'SELECT 1 FROM history_bin WHERE '.dbConditionId('itemid', $api_request), 1
|
|
));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Data provider for history.push.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getHistoryPushData(): array {
|
|
return [
|
|
// Check an empty request.
|
|
'Test history.push: empty request' => [
|
|
'request' => [],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/": cannot be empty.'
|
|
],
|
|
|
|
// Check unexpected params.
|
|
'Test history.push: unexpected parameter' => [
|
|
'request' => [
|
|
'abc' => 'abc'
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1": unexpected parameter "abc".'
|
|
],
|
|
|
|
// Check "itemid" field.
|
|
'Test history.push: invalid "itemid" (boolean)' => [
|
|
'request' => [
|
|
'itemid' => true
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/itemid": a number is expected.'
|
|
],
|
|
'Test history.push: invalid "itemid" (string)' => [
|
|
'request' => [
|
|
'itemid' => 'abc'
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/itemid": a number is expected.'
|
|
],
|
|
|
|
// Check "host" field.
|
|
'Test history.push: invalid "host" (boolean)' => [
|
|
'request' => [
|
|
'host' => true
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/host": a character string is expected.'
|
|
],
|
|
|
|
// Check "key" field.
|
|
'Test history.push: invalid "key" (boolean)' => [
|
|
'request' => [
|
|
'key' => true
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/key": a character string is expected.'
|
|
],
|
|
|
|
// Check "value" field.
|
|
'Test history.push: missing "value"' => [
|
|
'request' => [
|
|
[]
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1": the parameter "value" is missing.'
|
|
],
|
|
'Test history.push: invalid "value" (boolean)' => [
|
|
'request' => [
|
|
'value' => true
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/value": a character string, integer or floating point value is expected.'
|
|
],
|
|
'Test history.push: invalid "value" (array)' => [
|
|
'request' => [
|
|
'value' => []
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/value": a character string, integer or floating point value is expected.'
|
|
],
|
|
|
|
// Check "clock" field.
|
|
'Test history.push: invalid "clock" (boolean)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'clock' => true
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/clock": an unsigned integer is expected.'
|
|
],
|
|
'Test history.push: invalid "clock" (string)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'clock' => 'abc'
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/clock": an unsigned integer is expected.'
|
|
],
|
|
'Test history.push: invalid "clock" (negative integer)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'clock' => -1
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/clock": an unsigned integer is expected.'
|
|
],
|
|
'Test history.push: invalid "clock" (too large)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'clock' => ZBX_MAX_DATE + 1
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/clock": a timestamp is too large.'
|
|
],
|
|
|
|
// Check "ns" field.
|
|
'Test history.push: invalid "ns" (boolean)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'ns' => true
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/ns": an integer is expected.'
|
|
],
|
|
'Test history.push: invalid "ns" (string)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'ns' => 'abc'
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/ns": an integer is expected.'
|
|
],
|
|
'Test history.push: invalid "ns" (too small)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'ns' => -1
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/ns": value must be one of 0-999999999.'
|
|
],
|
|
'Test history.push: invalid "ns" (too large)' => [
|
|
'request' => [
|
|
'value' => '25',
|
|
'ns' => 1000000000
|
|
],
|
|
'expected_result' => [],
|
|
'expected_error' => 'Invalid parameter "/1/ns": value must be one of 0-999999999.'
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test history.push.
|
|
*
|
|
* @dataProvider getHistoryPushData
|
|
*/
|
|
public function testHistory_Push(array $request, array $expected_result, ?string $expected_error): void {
|
|
$result = $this->call('history.push', $request, $expected_error);
|
|
|
|
if ($expected_error === null) {
|
|
$this->assertSame($expected_result, $result['result']);
|
|
}
|
|
}
|
|
}
|