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.
428 lines
11 KiB
428 lines
11 KiB
<?php declare(strict_types = 0);
|
|
/*
|
|
** 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.
|
|
**/
|
|
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
class CQueryParserTest extends TestCase {
|
|
|
|
public function dataProvider() {
|
|
return [
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]', 0, [], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/h/i', 0, [], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/h/i',
|
|
'host' => 'h',
|
|
'item' => 'i',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /h/i text', 5, [], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/h/i',
|
|
'host' => 'h',
|
|
'item' => 'i',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /{HOST.HOST}/item[pam, "param"] text', 5, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /{HOST.HOST1}/item[pam, "param"] text', 5, ['host_macro' => true], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /{HOST.HOST}/item[pam, "param"] text', 5, ['host_macro' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/{HOST.HOST}/item[pam, "param"]',
|
|
'host' => '{HOST.HOST}',
|
|
'item' => 'item[pam, "param"]',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /{HOST.HOST}/item text', 5, ['host_macro_n' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/{HOST.HOST}/item',
|
|
'host' => '{HOST.HOST}',
|
|
'item' => 'item',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /{HOST.HOST1}/item text', 5, ['host_macro_n' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/{HOST.HOST1}/item',
|
|
'host' => '{HOST.HOST1}',
|
|
'item' => 'item',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['text /{HOST.HOST7}/item text', 5, ['host_macro_n' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/{HOST.HOST7}/item',
|
|
'host' => '{HOST.HOST7}',
|
|
'item' => 'item',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log,ERROR,,1000,,,120.0]', 0, [], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/Zabbix server/logrt',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server^/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/'.'/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/*', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/*', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/Zabbix server/*',
|
|
'host' => 'Zabbix server',
|
|
'item' => '*',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/*/key', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/'.'/key', 0, [], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/'.'/key', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/*/key', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/*/key',
|
|
'host' => '*',
|
|
'item' => 'key',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/*/*', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/*/*',
|
|
'host' => '*',
|
|
'item' => '*',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/'.'/key', 0, ['empty_host' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/'.'/key',
|
|
'host' => '',
|
|
'item' => 'key',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/'.'/*', 0, ['empty_host' => true], [
|
|
'rc' => CParser::PARSE_FAIL,
|
|
'match' => '',
|
|
'host' => '',
|
|
'item' => '',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/'.'/*', 0, ['calculated' => true, 'empty_host' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/'.'/*',
|
|
'host' => '',
|
|
'item' => '*',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[tag = "tag" and group = "group"]', 0, [], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[tag = {$MACRO} and group = "group"]', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[tag = {#MACRO} and group = "group"]', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS_CONT,
|
|
'match' => '/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'filter' => [
|
|
'match' => '',
|
|
'tokens' => []
|
|
]
|
|
]],
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[{$MACRO} = {{#MACRO}.func()} and group = "group"]', 0, ['usermacros' => true, 'lldmacros' => true, 'calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[{$MACRO} = {{#MACRO}.func()} and group = "group"]',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'filter' => [
|
|
'match' => '?[{$MACRO} = {{#MACRO}.func()} and group = "group"]',
|
|
'tokens' => [
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_USER_MACRO,
|
|
'pos' => 74,
|
|
'match' => '{$MACRO}',
|
|
'length' => 8
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_OPERATOR,
|
|
'pos' => 83,
|
|
'match' => '=',
|
|
'length' => 1
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_LLD_MACRO,
|
|
'pos' => 85,
|
|
'match' => '{{#MACRO}.func()}',
|
|
'length' => 17
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_OPERATOR,
|
|
'pos' => 103,
|
|
'match' => 'and',
|
|
'length' => 3
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_KEYWORD,
|
|
'pos' => 107,
|
|
'match' => 'group',
|
|
'length' => 5
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_OPERATOR,
|
|
'pos' => 113,
|
|
'match' => '=',
|
|
'length' => 1
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_STRING,
|
|
'pos' => 115,
|
|
'match' => '"group"',
|
|
'length' => 7
|
|
]
|
|
]
|
|
]
|
|
]],
|
|
['/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[tag = "tag" and group = "group"]', 0, ['calculated' => true], [
|
|
'rc' => CParser::PARSE_SUCCESS,
|
|
'match' => '/Zabbix server/logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]?[tag = "tag" and group = "group"]',
|
|
'host' => 'Zabbix server',
|
|
'item' => 'logrt["/home/zabbix32/test[0-9].log",ERROR,,1000,,,120.0]',
|
|
'filter' => [
|
|
'match' => '?[tag = "tag" and group = "group"]',
|
|
'tokens' => [
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_KEYWORD,
|
|
'pos' => 74,
|
|
'match' => 'tag',
|
|
'length' => 3
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_OPERATOR,
|
|
'pos' => 78,
|
|
'match' => '=',
|
|
'length' => 1
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_STRING,
|
|
'pos' => 80,
|
|
'match' => '"tag"',
|
|
'length' => 5
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_OPERATOR,
|
|
'pos' => 86,
|
|
'match' => 'and',
|
|
'length' => 3
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_KEYWORD,
|
|
'pos' => 90,
|
|
'match' => 'group',
|
|
'length' => 5
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_OPERATOR,
|
|
'pos' => 96,
|
|
'match' => '=',
|
|
'length' => 1
|
|
],
|
|
[
|
|
'type' => CFilterParser::TOKEN_TYPE_STRING,
|
|
'pos' => 98,
|
|
'match' => '"group"',
|
|
'length' => 7
|
|
]
|
|
]
|
|
]
|
|
]]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataProvider
|
|
*
|
|
* @param string $source
|
|
* @param int $source
|
|
* @param array $options
|
|
* @param array $expected
|
|
*/
|
|
public function testQueryParse(string $source, int $pos, array $options, array $expected) {
|
|
$query_parser = new CQueryParser($options);
|
|
|
|
$this->assertSame($expected, [
|
|
'rc' => $query_parser->parse($source, $pos),
|
|
'match' => $query_parser->getMatch(),
|
|
'host' => $query_parser->getHost(),
|
|
'item' => $query_parser->getItem(),
|
|
'filter' => $query_parser->getFilter()
|
|
]);
|
|
$this->assertSame(strlen($expected['match']), strlen($query_parser->getMatch()));
|
|
}
|
|
}
|