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.

2863 lines
81 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/PreprocessingTrait.php';
require_once dirname(__FILE__).'/../behaviors/CMessageBehavior.php';
/**
* Base class for Preprocessing tests.
*/
abstract class testFormPreprocessing extends CWebTest {
use PreprocessingTrait;
public $link;
public $ready_link;
public $success_message;
public $button;
public $fail_message;
const CLONE_PREPROCESSING = [
[
'type' => '1',
'params' => '123',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '2',
'params' => 'abc',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '3',
'params' => 'def',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '4',
'params' => '1a2b3c',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '5',
'params' => "regular expression pattern \noutput template",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '6',
'params' => '',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '7',
'params' => '',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '8',
'params' => '',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '9',
'params' => '',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '11',
'params' => '/document/item/value/text()',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '12',
'params' => '$.document.item.value parameter.',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '13',
'params' => "-5\n3",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '14',
'params' => 'regular expression pattern for matching',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '15',
'params' => 'regular expression pattern for not matching',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '16',
'params' => '/json/path',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '17',
'params' => '/xml/path',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '18',
'params' => "regular expression pattern for error matching \ntest output",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '20',
'params' => '7',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '21',
'params' => 'test script',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '23',
'params' => 'metric',
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '24',
'params' => ".\n/\n1",
'error_handler' => 0,
'error_handler_params' => ''
],
[
'type' => '25',
'params' => "1\n2",
'error_handler' => 0,
'error_handler_params' => ''
]
];
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return ['class' => CMessageBehavior::class];
}
/*
* Preprocessing validation data for Item and Item prototype.
*/
public function getItemPreprocessingValidationData() {
return array_merge($this->getCommonPreprocessingValidationData(), [
// Text. Trim.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Right trim',
'Key' => 'empty-right-trim[{#KEY}]'
],
'preprocessing' => [
['type' => 'Right trim']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Left trim',
'Key' => 'empty-left-trim[{#KEY}]'
],
'preprocessing' => [
['type' => 'Left trim']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Trim',
'Key' => 'empty-trim[{#KEY}]'
],
'preprocessing' => [
['type' => 'Trim']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// Arithmetic. Custom multiplier.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Empty multiplier',
'Key' => 'empty-multiplier[{#KEY}]'
],
'preprocessing' => [
['type' => 'Custom multiplier']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'String multiplier',
'Key' => 'string-multiplier[{#KEY}]'
],
'preprocessing' => [
['type' => 'Custom multiplier', 'parameter_1' => 'abc']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Multiplier comma',
'Key' => 'comma-multiplier[{#KEY}]'
],
'preprocessing' => [
['type' => 'Custom multiplier', 'parameter_1' => '0,0']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Multiplier symbols',
'Key' => 'symbols-multiplier[{#KEY}]'
],
'preprocessing' => [
['type' => 'Custom multiplier', 'parameter_1' => '1a!@#$%^&*()-=']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
// Change. Simple change, Change per second
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Two delta',
'Key' => 'two-delta[{#KEY}]'
],
'preprocessing' => [
['type' => 'Simple change'],
['type' => 'Simple change']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((9, 10)).'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Two delta per second',
'Key' => 'two-delta-per-second[{#KEY}]'
],
'preprocessing' => [
['type' => 'Change per second'],
['type' => 'Change per second']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((9, 10)).'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Two different delta',
'Key' => 'two-different-delta[{#KEY}]'
],
'preprocessing' => [
['type' => 'Simple change'],
['type' => 'Change per second']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((9, 10)).'
]
],
// Validation. In range.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'In range empty',
'Key' => 'in-range-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'In range letters string',
'Key' => 'in-range-letters-string[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => 'abc', 'parameter_2' => 'def']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'In range symbols',
'Key' => 'in-range-symbols[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => '1a!@#$%^&*()-=', 'parameter_2' => '2b!@#$%^&*()-=']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'In range comma',
'Key' => 'in-range-comma[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => '1,5', 'parameter_2' => '-3,5']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a floating point value is expected.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'In range wrong interval',
'Key' => 'in-range-wrong-interval[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => '8', 'parameter_2' => '-8']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/2": cannot be less than or equal '.
'to the value of parameter "/1/preprocessing/1/params/1".'
]
],
// Validation. Matches regular expression.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Matches regular expression empty',
'Key' => 'matches-regular-expression-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Matches regular expression']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// Validation. Check for error in XML.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item error XML empty',
'Key' => 'item-error-xml-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for error in XML']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// Validation. Check for error using regular expression.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item error REGEXP both params empty',
'Key' => 'item-error-regexp-both-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for error using regular expression']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item error REGEXP first parameter empty',
'Key' => 'item-error-regexp-first-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for error using regular expression', 'parameter_2' => 'test']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item error REGEXP second parameter empty',
'Key' => 'item-error-regexp-second-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for error using regular expression', 'parameter_1' => 'test']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/2": cannot be empty.'
]
],
// Throttling. Discard unchanged.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item two discard unchanged',
'Key' => 'item-two-discard-unchanged[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged'],
['type' => 'Discard unchanged']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((19, 20)).'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item two different throttlings',
'Key' => 'item-two-different-throttlings[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '1']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((19, 20)).'
]
]
]);
}
/*
* Preprocessing validation data for item, item prototype and LLD.
*/
public static function getCommonPreprocessingValidationData() {
return [
// #0 Text. Regular expression.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Empty regular expression',
'Key' => 'Empty-both-parameters[{#KEY}]'
],
'preprocessing' => [
['type' => 'Regular expression']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #1
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Empty pattern of regular expression',
'Key' => 'empty-first-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Regular expression', 'parameter_2' => 'test output']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #2
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Empty output of regular expression',
'Key' => 'empty-second-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Regular expression', 'parameter_1' => 'expression']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/2": cannot be empty.'
]
],
// #3 Structured data. XML XPath.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'XML XPath',
'Key' => 'empty-xpath[{#KEY}]'
],
'preprocessing' => [
['type' => 'XML XPath']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #4 Structured data. JSONPath.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'JSONPath empty',
'Key' => 'empty-jsonpath[{#KEY}]'
],
'preprocessing' => [
['type' => 'JSONPath']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #5 Custom scripts. JavaScript.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Empty JavaScript',
'Key' => 'item-empty-javascript[{#KEY}]'
],
'preprocessing' => [
['type' => 'JavaScript']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #6 Validation. Does not match regular expression
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Does not match regular expression empty',
'Key' => 'does-not-match-regular-expression-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Does not match regular expression']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #7 Validation. Check for error in JSON.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Error JSON empty',
'Key' => 'error-json-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for error in JSON']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #8 Throttling. Discard unchanged with heartbeat
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Two equal discard unchanged with heartbeat',
'Key' => 'two-equal-discard-unchanged-with-heartbeat[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '1'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '1']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist '.
'within the combinations of (type)=((19, 20)).'
]
],
// #9
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Two different discard unchanged with heartbeat',
'Key' => 'two-different-discard-unchanged-with-heartbeat[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '1'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '2']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist '.
'within the combinations of (type)=((19, 20)).'
]
],
// #10
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat empty',
'Key' => 'discard-unchanged-with-heartbeat-empty[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
// #11
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat symbols',
'Key' => 'discard-unchanged-with-heartbeat-symbols[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '3g!@#$%^&*()-=']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a time unit is expected.'
]
],
// #12
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discardunchanged with heartbeat letters string',
'Key' => 'discard-unchanged-with-heartbeat-letters-string[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => 'abc']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a time unit is expected.'
]
],
// #13
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat comma',
'Key' => 'discard-unchanged-with-heartbeat-comma[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '1,5']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a time unit is expected.'
]
],
// #14
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat dot',
'Key' => 'discard-unchanged-with-heartbeat-dot[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '1.5']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": a time unit is expected.'
]
],
// #15
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat negative',
'Key' => 'discard-unchanged-with-heartbeat-negative[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '-3']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": value must be one of 1-788400000.'
]
],
// #16
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat zero',
'Key' => 'discard-unchanged-with-heartbeat-zero[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '0']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": value must be one of 1-788400000.'
]
],
// #17
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Discard unchanged with heartbeat maximum',
'Key' => 'unchanged-with-heartbeat-max[{#KEY}]'
],
'preprocessing' => [
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '788400001']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": value must be one of 1-788400000.'
]
]
];
}
/*
* Preprocessing data for item and item prototype successful creation.
*/
public static function getItemPreprocessingCreateData() {
return [
// Structured data. CSV to JSON.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'CSV to JSON empty parameters',
'Key' => 'csv-to-json-empty-parameters[{#KEY}]'
],
'preprocessing' => [
['type' => 'CSV to JSON']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'CSV to JSON with default parameters',
'Key' => 'csv-to-json-with-default-parameters[{#KEY}]'
],
'preprocessing' => [
['type' => 'CSV to JSON', 'parameter_1' => ',', 'parameter_2' => '"', 'parameter_3' => true]
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'CSV to JSON custom parameters',
'Key' => 'csv-to-json-custom-parameters[{#KEY}]'
],
'preprocessing' => [
['type' => 'CSV to JSON', 'parameter_1' => ' ', 'parameter_2' => "'", 'parameter_3' => false]
]
]
],
// In range.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'In range negative float',
'Key' => 'in-range-negative-float[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => '-3.5', 'parameter_2' => '-1.5']
]
]
],
// Validation
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Not supported step',
'Key' => 'check-for-not-supported[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for not supported value']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'In range zero',
'Key' => 'in-range-zero[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => '0', 'parameter_2' => '1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Add all preprocessing',
'Key' => 'item.all.preprocessing[{#KEY}]'
],
'preprocessing' => [
['type' => 'Check for not supported value'],
['type' => 'Replace', 'parameter_1' => 'text', 'parameter_2' => 'REPLACEMENT'],
['type' => 'Right trim', 'parameter_1' => 'abc'],
['type' => 'Left trim', 'parameter_1' => 'def'],
['type' => 'Trim', 'parameter_1' => '1a2b3c'],
['type' => 'CSV to JSON','parameter_1' => ' ', 'parameter_2' => '\\', 'parameter_3' => true],
['type' => 'XML to JSON'],
['type' => 'Custom multiplier', 'parameter_1' => '123'],
['type' => 'Regular expression', 'parameter_1' => 'expression', 'parameter_2' => 'test output'],
['type' => 'Boolean to decimal'],
['type' => 'Octal to decimal'],
['type' => 'Hexadecimal to decimal'],
['type' => 'JavaScript', 'parameter_1' => 'Test JavaScript'],
['type' => 'Simple change'],
['type' => 'In range', 'parameter_1' => '-5', 'parameter_2' => '9.5'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '5'],
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_usage_system', 'parameter_2' => 'label',
'parameter_3' => 'label_name']
],
'screenshot' => true
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Add symbols preprocessing',
'Key' => 'item.symbols.preprocessing[{#KEY}]'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => '1a!@#$%^&*()-=', 'parameter_2' => '1a!@#$%^&*()-='],
['type' => 'Right trim', 'parameter_1' => '1a!@#$%^&*()-='],
['type' => 'Left trim', 'parameter_1' => '2b!@#$%^&*()-='],
['type' => 'Trim', 'parameter_1' => '3c!@#$%^&*()-='],
['type' => 'XML XPath', 'parameter_1' => '3c!@#$%^&*()-='],
['type' => 'JSONPath', 'parameter_1' => '3c!@#$%^&*()-='],
['type' => 'Custom multiplier', 'parameter_1' => '4.0E+14'],
['type' => 'Regular expression', 'parameter_1' => '5d!@#$%^&*()-=', 'parameter_2' => '6e!@#$%^&*()-='],
['type' => 'JavaScript', 'parameter_1' => '5d!@#$%^&*()-='],
['type' => 'Matches regular expression', 'parameter_1' => '7f!@#$%^&*()-='],
['type' => 'Does not match regular expression', 'parameter_1' => '8g!@#$%^&*()-='],
['type' => 'Check for error in JSON', 'parameter_1' => '9h!@#$%^&*()-='],
['type' => 'Check for error in XML', 'parameter_1' => '0i!@#$%^&*()-='],
['type' => 'Check for error using regular expression', 'parameter_1' => '1j!@#$%^&*()-=', 'parameter_2' => '2k!@#$%^&*()-=']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Add the same preprocessing',
'Key' => 'item.theSamePpreprocessing[{#KEY}]'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => 'текст', 'parameter_2' => 'замена'],
['type' => 'Replace', 'parameter_1' => 'текст', 'parameter_2' => 'замена'],
['type' => 'Change per second'],
['type' => 'Right trim', 'parameter_1' => 'abc'],
['type' => 'Right trim', 'parameter_1' => 'abc'],
['type' => 'Left trim', 'parameter_1' => 'def'],
['type' => 'Left trim', 'parameter_1' => 'def'],
['type' => 'Trim', 'parameter_1' => '1a2b3c'],
['type' => 'Trim', 'parameter_1' => '1a2b3c'],
['type' => 'CSV to JSON', 'parameter_1' => '.', 'parameter_2' => "'" ,'parameter_3' => false],
['type' => 'CSV to JSON', 'parameter_1' => '.', 'parameter_2' => "'" ,'parameter_3' => false],
['type' => 'XML to JSON'],
['type' => 'XML to JSON'],
['type' => 'XML XPath', 'parameter_1' => '1a2b3c'],
['type' => 'XML XPath', 'parameter_1' => '1a2b3c'],
['type' => 'JSONPath', 'parameter_1' => '1a2b3c'],
['type' => 'JSONPath', 'parameter_1' => '1a2b3c'],
['type' => 'Custom multiplier', 'parameter_1' => '123'],
['type' => 'Custom multiplier', 'parameter_1' => '123'],
['type' => 'Regular expression', 'parameter_1' => 'expression', 'parameter_2' => 'test output'],
['type' => 'Regular expression', 'parameter_1' => 'expression', 'parameter_2' => 'test output'],
['type' => 'Boolean to decimal'],
['type' => 'Boolean to decimal'],
['type' => 'Octal to decimal'],
['type' => 'Octal to decimal'],
['type' => 'Hexadecimal to decimal'],
['type' => 'Hexadecimal to decimal'],
['type' => 'In range', 'parameter_1' => '-5.5', 'parameter_2' => '10'],
['type' => 'In range', 'parameter_1' => '-5.5', 'parameter_2' => '10'],
['type' => 'JavaScript', 'parameter_1' => 'Test JavaScript'],
['type' => 'JavaScript', 'parameter_1' => 'Test JavaScript'],
['type' => 'Matches regular expression', 'parameter_1' => 'test_expression'],
['type' => 'Matches regular expression', 'parameter_1' => 'test_expression'],
['type' => 'Does not match regular expression', 'parameter_1' => 'not_expression'],
['type' => 'Does not match regular expression', 'parameter_1' => 'not_expression'],
['type' => 'Check for error in JSON', 'parameter_1' => '/path'],
['type' => 'Check for error in JSON', 'parameter_1' => '/path'],
['type' => 'Check for error in XML', 'parameter_1' => '/path/xml'],
['type' => 'Check for error in XML', 'parameter_1' => '/path/xml'],
['type' => 'Check for error using regular expression', 'parameter_1' => 'regexp', 'parameter_2' => '\1'],
['type' => 'Check for error using regular expression', 'parameter_1' => 'regexp', 'parameter_2' => '\1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item with preprocessing rule with user macro',
'Key' => 'item-user-macro[{#KEY}]'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => '{$TEST1}', 'parameter_2' => '{$MACRO2}'],
['type' => 'Regular expression', 'parameter_1' => '{$DELIM}(.*)', 'parameter_2' => '\1'],
['type' => 'Trim', 'parameter_1' => '{$DELIM}'],
['type' => 'Right trim', 'parameter_1' => '{$MACRO}'],
['type' => 'Left trim', 'parameter_1' => '{$USER}'],
['type' => 'XML XPath', 'parameter_1' => 'number(/values/Item/value[../key=\'{$DELIM}\'])'],
['type' => 'JSONPath', 'parameter_1' => '$.data[\'{$KEY}\']'],
['type' => 'Custom multiplier', 'parameter_1' => '{$VALUE}'],
['type' => 'In range', 'parameter_1' => '{$FROM}', 'parameter_2' => '{$TO}'],
['type' => 'Matches regular expression', 'parameter_1' => '{$EXPRESSION}(.*)'],
['type' => 'Does not match regular expression', 'parameter_1' => '{$REGEXP}(.+)'],
['type' => 'JavaScript', 'parameter_1' => '{$JAVASCRIPT}'],
['type' => 'Check for error in JSON', 'parameter_1' => '{$USERMACRO}'],
['type' => 'Check for error in XML', 'parameter_1' => '/tmp/{$PATH}'],
['type' => 'Check for error using regular expression', 'parameter_1' => '^{$REGEXP}(.+)', 'parameter_2' => '\0'],
['type' => 'Discard unchanged with heartbeat', 'parameter_1' => '{$SECONDS}'],
['type' => 'Prometheus to JSON', 'parameter_1' => '{$PATTERN}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item with spaces in preprocessing',
'Key' => 'item-spaces-preprocessing[{#KEY}]'
],
'preprocessing' => [
['type' => 'Replace', 'parameter_1' => ' test text ', 'parameter_2' => ' replacement 1 '],
['type' => 'Regular expression', 'parameter_1' => ' pattern ', 'parameter_2' => ' \1 '],
['type' => 'Right trim', 'parameter_1' => ' 22 '],
['type' => 'Left trim', 'parameter_1' => ' 33 '],
['type' => 'Trim', 'parameter_1' => ' 0 '],
['type' => 'XML XPath', 'parameter_1' => ' number(/values/Item) '],
['type' => 'JSONPath', 'parameter_1' => ' $.data.key '],
['type' => 'Matches regular expression', 'parameter_1' => ' expression '],
['type' => 'Does not match regular expression', 'parameter_1' => ' not_expression '],
['type' => 'JavaScript', 'parameter_1' => " Test line 1 \n Test line 2 \n Test line 3 \n \n "],
['type' => 'Check for error in JSON', 'parameter_1' => ' $.error '],
['type' => 'Check for error in XML', 'parameter_1' => ' /tmp/path/ '],
['type' => 'Check for error using regular expression', 'parameter_1' => ' expression ', 'parameter_2' => ' 0 ']
]
]
]
];
}
/*
* "Prometheus to JSON" data for item, item prototype and LLD.
*/
public static function getPrometheustoJSONData() {
return [
// Prometheus to JSON validation.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter starts with digits',
'Key' => 'json-prometeus-digits-first-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '1name_of_metric']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON wrong equals operator',
'Key' => 'json-prometeus-wrong-equals-operator[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}=1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported operator >',
'Key' => 'json-prometeus-unsupported-operator-1[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}>1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported operator <',
'Key' => 'json-prometeus-unsupported-operator-2[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}<1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported operator !==',
'Key' => 'json-prometeus-unsupported-operator-3[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}!==1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported operator >=',
'Key' => 'json-prometeus-unsupported-operator-4[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}>=1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported operator =<',
'Key' => 'json-prometeus-unsupported-operator-5[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}=<1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON duplicate metric condition',
'Key' => 'json-duplicate-metric-condition[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu_system{__name__="metric_name"}']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON wrong parameter - space',
'Key' => 'json-wrong-parameter-space[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu usage_system']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus to JSON wrong parameter - slash',
'Key' => 'json-wrong-parameter-slash[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu\\']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometheus to JSON wrong parameter - digits',
'Key' => 'json-wrong-parameter-digits[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '123']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometheus to JSON wrong first parameter - pipe',
'Key' => 'json-wrong-parameter-pipe[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'metric==1e|5']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometheus to JSON wrong first parameter - slash',
'Key' => 'json-wrong-parameter-slash[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label="value\"}']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item duplicate Prometeus to JSON steps',
'Key' => 'duplicate-prometheus-to-json-steps[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu_usage_system_1'],
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu_usage_system_1']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((22, 23)).'
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON empty first parameter',
'Key' => 'json-prometeus-empty-first-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter +inf',
'Key' => 'json-prometeus-plus-inf[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu_usage_system==+inf']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter inf',
'Key' => 'json-prometeus-inf[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__="metric_name"}==inf']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter -inf',
'Key' => 'json-prometeus-negative-inf[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__=~"<regex>"}==-inf']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter nan',
'Key' => 'json-prometeus-nan[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__="metric_name"}==nan']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter exp',
'Key' => 'json-prometeus-exp[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => 'cpu_usage_system==3.5180e+11']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameter ==1',
'Key' => 'json-prometeus-neutral-digit[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__="metric_name"}==1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameters ==+1',
'Key' => 'json-prometeus-positive-digit[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__="metric_name"}==+1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON first parameters ==-1',
'Key' => 'json-prometeus-negative-digit[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__="metric_name"}==-1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON label operator =',
'Key' => 'json-prometeus-label-operator-equal-strong[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label_name="name"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON label operator =~',
'Key' => 'json-prometeus-label-operator-contains[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label_name=~"name"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON slashes in pattern',
'Key' => 'json-prometeus-slashes-pattern[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label="value\\\\"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON user macros in parameter',
'Key' => 'json-prometeus-macros-1[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{$METRIC_NAME}==1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON user macros in parameter',
'Key' => 'json-prometeus-macros-2[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{__name__="{$METRIC_NAME}"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON user macros in parameters',
'Key' => 'json-prometeus-macros-3[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{{$LABEL_NAME}="<label value>"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON user macros in parameters',
'Key' => 'json-prometeus-macros-4[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label_name="{$LABEL_VALUE}"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported label operator !=',
'Key' => 'json-prometeus-unsupported-label-operator-1[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label_name!="regex_pattern"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus to JSON unsupported label operator !~',
'Key' => 'json-prometeus-unsupported-label-operator-2[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => '{label_name!~"<regex>"}']
]
]
]
];
}
/*
* Prometheus data for item and item prototype (included preprocessing step "Prometheus pattern").
*/
public function getPrometheusData() {
return array_merge($this->getPrometheustoJSONData(), [
// Prometheus pattern validation.
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus empty first parameter',
'Key' => 'prometeus-empty-first-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Prometheus space in pattern',
'Key' => 'prometheus-space-in-pattern[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu usage_metric']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Prometheus only digits in pattern',
'Key' => 'prometheus-digits-in-pattern[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '1223']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus first parameter starts with digits',
'Key' => 'prometeus-digits-first-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '1name_of_metric']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong equals operator',
'Key' => 'rometeus-wrong-equals-operator[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}=1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus unsupported operator >',
'Key' => 'prometeus-unsupported-operator-1[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}>1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus unsupported operator <',
'Key' => 'prometeus-unsupported-operator-2[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}<1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus unsupported operator !==',
'Key' => 'prometeus-unsupported-operator-3[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}!==1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus unsupported operator >=',
'Key' => 'prometeus-unsupported-operator-4[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}>=1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus unsupported operator =<',
'Key' => 'prometeus-unsupported-operator-5[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}=<1']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus duplicate metric condition',
'Key' => 'duplicate-metric-condition[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_system{__name__="metric_name"}']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item duplicate Prometeus steps',
'Key' => 'duplicate-prometheus-steps[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_usage_system'],
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_usage_system']
],
'error' => 'Invalid parameter "/1/preprocessing/2": only one object can exist within '.
'the combinations of (type)=((22, 23)).'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong second parameter - space',
'Key' => 'wrong-second-parameter-space[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => 'label name'
]
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/3": invalid Prometheus label.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong second parameter - quotes',
'Key' => 'wrong-second-parameter-quotes[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => '"label_name"'
]
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/3": invalid Prometheus label.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong second parameter - triangle quotes',
'Key' => 'wrong-second-parameter-triangle-quotes[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => '<label_name>'
]
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/3": invalid Prometheus label.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong second parameter - slash',
'Key' => 'wrong-second-parameter-slash[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => '\0'
]
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/3": invalid Prometheus label.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong second parameter - digits',
'Key' => 'wrong-second-parameter-digits[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => '123'
]
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/3": invalid Prometheus label.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong first parameter - pipe',
'Key' => 'wrong-second-parameter-pipe[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'metric==1e|5']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong first parameter - slash',
'Key' => 'wrong-second-parameter-slash[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label="value\"}']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong first parameter =!',
'Key' => 'wrong-second-parameter-equals-exlamation[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name=!"name"}']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
[
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Item Prometeus wrong first parameter ~!',
'Key' => 'wrong-second-parameter-tilda-exclamation[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name~!"name"}']
],
'error' => 'Invalid parameter "/1/preprocessing/1/params/1": invalid Prometheus pattern.'
]
],
// Successful Prometheus pattern creation.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus empty second parameter',
'Key' => 'prometeus-empty-second-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_usage_system']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus both parameters present',
'Key' => 'prometeus-both-parameters-present[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => 'label_name'
]
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameter +inf',
'Key' => 'prometeus-plus-inf[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_usage_system==+inf']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameter inf',
'Key' => 'prometeus-inf[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__="metric_name"}==inf']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameter -inf',
'Key' => 'prometeus-negative-inf[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__=~"<regex>"}==-inf']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameter nan',
'Key' => 'prometeus-nan[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__="metric_name"}==nan']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameter exp',
'Key' => 'prometeus-exp[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => 'cpu_usage_system==3.5180e+11']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameter ==1',
'Key' => 'prometeus-neutral-digit[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__="metric_name"}==1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameters ==+1',
'Key' => 'prometeus-positive-digit[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__="metric_name"}==+1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus first parameters ==-1',
'Key' => 'prometeus-negative-digit[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__="metric_name"}==-1']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus label operator =',
'Key' => 'prometeus-label-operator-equal-strong[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name="name"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus label operator =~',
'Key' => 'prometeus-label-operator-contains[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name=~"name"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus label operator !=',
'Key' => 'prometeus-label-operator-exclamation-equals[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name!="name"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus label operator !~',
'Key' => 'prometeus-label-operator-exclamation-tilda[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name!~"name"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus slashes in pattern',
'Key' => 'prometeus-slashes-pattern[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label="value\\\\"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus user macros in parameters',
'Key' => 'prometeus-macros-1[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => '{$METRIC_NAME}==1',
'parameter_2' => 'label',
'parameter_3' => '{$LABEL_NAME}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus user macros in parameters',
'Key' => 'prometeus-macros-2[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{__name__="{$METRIC_NAME}"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus user macros in parameters',
'Key' => 'prometeus-macros-3[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{{$LABEL_NAME}="<label value>"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus user macros in parameters',
'Key' => 'prometeus-macros-4[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name="{$LABEL_VALUE}"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus unsupported label operator !=',
'Key' => 'prometeus-unsupported-label-operator-1[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name!="regex_pattern"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus unsupported label operator !~',
'Key' => 'prometeus-unsupported-label-operator-2[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus pattern', 'parameter_1' => '{label_name!~"<regex>"}']
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus function sum',
'Key' => 'prometeus-function-sum[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => '{$METRIC_NAME}==1',
'parameter_2' => 'sum'
]
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus function min',
'Key' => 'prometeus-function-min[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => '{label_name!~"<regex>"}',
'parameter_2' => 'min'
]
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus function max',
'Key' => 'prometeus-function-max[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => '{{$LABEL_NAME}="<label value>"}',
'parameter_2' => 'max'
]
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus function avg',
'Key' => 'prometeus-function-avg[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => '{label="value\\\\"}',
'parameter_2' => 'avg'
]
]
]
],
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Item Prometeus function count',
'Key' => 'prometeus-function-count[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => '{label_name!~"name"}',
'parameter_2' => 'count'
]
]
]
]
]);
}
/**
* Add item and preprocessing steps.
*
* @param array $data data provider
* @param boolean $lld true if item is lld, false if item or item prototype
*
* @return CFormElement|CGridFormElement
*
*/
protected function addItemWithPreprocessing($data, $lld = false) {
$this->page->login()->open($this->link);
$this->query('button:'.$this->button)->waitUntilPresent()->one()->click();
$form = $this->query('name:itemForm')->waitUntilPresent()->asForm()->one();
$form->fill($data['fields']);
$form->selectTab('Preprocessing');
// Check that 'Type of information' field is not visible before first step is added.
$this->assertFalse($form->query('xpath:.//div[@id="item_preproc_list"]/label[text()="Type of information"]')
->one(false)->isVisible()
);
$this->addPreprocessingSteps($data['preprocessing']);
// Check that 'Type of information' field is visible after steps are added, but not for LLD.
$this->assertTrue($form->query('xpath:.//div[@id="item_preproc_list"]/label[text()="Type of information"]')
->one(false)->isVisible(!$lld)
);
return $form;
}
/**
* Check creating items, item prototypes or LLD rules with preprocessing steps.
*/
protected function checkCreate($data, $lld = false) {
if ($data['expected'] === TEST_BAD) {
$sql_items = 'SELECT * FROM items ORDER BY itemid';
$old_hash = CDBHelper::getHash($sql_items);
}
$form = $this->addItemWithPreprocessing($data, $lld);
// Take a screenshot to test draggable object position of preprocessing steps.
if (array_key_exists('screenshot', $data)) {
$this->page->removeFocus();
$this->assertScreenshot($this->query('id:preprocessing')->one(), 'Preprocessing'.$this->link);
}
$form->submit();
$this->page->waitUntilReady();
if ($data['expected'] === TEST_GOOD) {
$this->assertMessage(TEST_GOOD, $this->success_message);
// Check result in frontend form.
$id = CDBHelper::getValue('SELECT itemid FROM items WHERE key_='.zbx_dbstr($data['fields']['Key']));
$this->page->open($this->ready_link.$id);
$form->selectTab('Preprocessing');
$this->assertPreprocessingSteps($data['preprocessing']);
}
else {
$this->assertMessage(TEST_BAD, $this->fail_message, $data['error']);
// Check that DB hash is not changed.
$this->assertEquals($old_hash, CDBHelper::getHash($sql_items));
}
}
/*
* Preprocessing steps with spaces in fields for item, item prototype and LLD.
*/
public static function getCommonPreprocessingTrailingSpacesData() {
return [
[
[
'fields' => [
'Name' => 'Prometheus to JSON trailing spaces',
'Key' => 'json-prometeus-space-in-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Prometheus to JSON', 'parameter_1' => ' metric ']
]
]
]
];
}
/*
* Additional preprocessing data with spaces in fields for item and item prototype.
*/
public function getItemPreprocessingTrailingSpacesData() {
return array_merge($this->getCommonPreprocessingTrailingSpacesData(), [
[
[
'fields' => [
'Name' => 'Prometheus pattern trailing spaces',
'Key' => 'prometeus-space-in-parameters[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Prometheus pattern',
'parameter_1' => ' metric ',
'parameter_2' => 'label',
'parameter_3' => ' output '
]
]
]
],
[
[
'fields' => [
'Name' => 'Custom multiplier trailing spaces',
'Key' => 'Custom-multiplier-spaces-in-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'Custom multiplier', 'parameter_1' => ' 2 ']
]
]
],
[
[
'fields' => [
'Name' => 'In range trailing spaces',
'Key' => 'in-range-spaces-in-parameter[{#KEY}]'
],
'preprocessing' => [
['type' => 'In range', 'parameter_1' => ' 5 ', 'parameter_2' => ' 10 ']
]
]
]
]);
}
/**
* Check spaces in preprocessing steps.
*/
protected function checkTrailingSpaces($data, $lld = false) {
$form = $this->addItemWithPreprocessing($data, $lld);
$form->submit();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, $this->success_message);
// Remove spaces.
foreach ($data['preprocessing'] as $i => &$options) {
$parameters = CTestArrayHelper::get($options, 'type') === 'Prometheus pattern'
? ['parameter_1', 'parameter_3']
: ['parameter_1', 'parameter_2'];
foreach ($parameters as $parameter) {
if (array_key_exists($parameter, $options)) {
$options[$parameter] = trim($options[$parameter]);
}
}
}
unset($options);
// Check result in frontend form.
$id = CDBHelper::getValue('SELECT itemid FROM items WHERE key_='.zbx_dbstr($data['fields']['Key']));
$this->page->open($this->ready_link.$id);
$form->selectTab('Preprocessing');
$this->assertPreprocessingSteps($data['preprocessing']);
}
/**
* Check that adding two 'Check for not supported value'
* preprocessing steps is impossible.
*/
public function checkRepeatedNotSupported() {
$this->page->login()->open($this->link);
$this->query('button:'.$this->button)->waitUntilPresent()->one()->click();
$form = $this->query('name:itemForm')->waitUntilPresent()->asForm()->one();
$form->fill(['Key' => 'test.key']);
$form->selectTab('Preprocessing');
$this->addPreprocessingSteps([['type' => 'Check for not supported value']]);
$this->query('id:param_add')->one()->click();
$this->assertTrue($this->query('xpath://z-select[@id="preprocessing_0_type"]'.
'//li[text()="Check for not supported value"]')->one()->isEnabled());
$this->assertFalse($this->query('xpath://z-select[@id="preprocessing_1_type"]'.
'//li[text()="Check for not supported value"]')->one()->isEnabled());
}
/*
* Preprocessing steps with Custom on fail checks for item, item prototype and LLD.
*/
public static function getCommonCustomOnFailData() {
$options = [
ZBX_PREPROC_FAIL_DISCARD_VALUE => 'Discard value',
ZBX_PREPROC_FAIL_SET_VALUE => 'Set value to',
ZBX_PREPROC_FAIL_SET_ERROR => 'Set error to'
];
$data = [];
foreach ($options as $value => $label) {
$case = [
'fields' => [
'Name' => 'Preprocessing '.$label,
'Key' => 'preprocessing-steps-discard-on-fail'.$value.'[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Regular expression',
'parameter_1' => 'expression',
'parameter_2' => '\1',
'on_fail' => true
],
[
'type' => 'XML XPath',
'parameter_1' => 'path',
'on_fail' => true
],
[
'type' => 'JSONPath',
'parameter_1' => '$.data.test',
'on_fail' => true
],
[
'type' => 'CSV to JSON',
'on_fail' => true
],
[
'type' => 'JavaScript',
'parameter_1' => 'Test Java Script'
],
[
'type' => 'Does not match regular expression',
'parameter_1' => 'Pattern',
'on_fail' => true
],
[
'type' => 'Check for error in JSON',
'parameter_1' => '$.new.path',
'on_fail' => true
],
[
'type' => 'Check for error in XML',
'parameter_1' => 'XML',
'on_fail' => true
],
[
'type' => 'Discard unchanged with heartbeat',
'parameter_1' => '30'
],
[
'type' => 'Prometheus to JSON',
'parameter_1' => 'metric',
'on_fail' => true
],
[
'type' => 'XML to JSON',
'on_fail' => true
]
],
'label' => $label,
'value' => $value
];
$data[] = [self::appendErrorHandler($case)];
}
return $data;
}
/*
* Preprocessing steps with Custom on fail checks for item and item prototype.
*/
public function getItemCustomOnFailData() {
$data = [];
foreach($this->getCommonCustomOnFailData() as $packed) {
$case = $packed[0];
$case['preprocessing'] = array_merge([
[
'type' => 'Check for not supported value',
'on_fail' => true
],
[
'type' => 'Trim',
'parameter_1' => '111'
],
[
'type' => 'Right trim',
'parameter_1' => '333'
],
[
'type' => 'Left trim',
'parameter_1' => '555'
],
[
'type' => 'Custom multiplier',
'parameter_1' => '2',
'on_fail' => true
],
[
'type' => 'Change per second',
'on_fail' => true
],
[
'type' => 'Boolean to decimal',
'on_fail' => true
],
[
'type' => 'Matches regular expression',
'parameter_1' => 'regular expression',
'on_fail' => true
],
[
'type' => 'Check for error using regular expression',
'parameter_1' => 'expression',
'parameter_2' => 'output',
'on_fail' => true
]
], $case['preprocessing']);
$data[] = [self::appendErrorHandler($case)];
}
return $data;
}
/**
* Function for adding handler parameter to case.
*/
public static function appendErrorHandler($case) {
foreach ($case['preprocessing'] as &$preprocessing) {
if (!array_key_exists('on_fail', $preprocessing)
|| !$preprocessing['on_fail']) {
continue;
}
$preprocessing['error_handler'] = $case['label'];
if ($case['value'] !== ZBX_PREPROC_FAIL_DISCARD_VALUE) {
$preprocessing['error_handler_params'] = 'handler parameter'.
microtime();
}
}
unset($preprocessing);
return $case;
}
/**
* Check "Custom on fail" fields and checkbox state.
*/
public function checkCustomOnFail($data, $lld = null) {
$form = $this->addItemWithPreprocessing($data, $lld);
$steps = $this->getPreprocessingSteps();
foreach ($data['preprocessing'] as $i => $options) {
$this->assertNotEquals(in_array($options['type'], [
'Trim',
'Right trim',
'Left trim',
'JavaScript',
'Discard unchanged with heartbeat',
'Check for not supported value'
]), $steps[$i]['on_fail']->isEnabled());
}
$form->submit();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, $this->success_message);
// Check saved preprocessing.
$itemid = CDBHelper::getValue('SELECT itemid FROM items WHERE key_='.zbx_dbstr($data['fields']['Key']));
$this->page->open($this->ready_link.$itemid);
$form->selectTab('Preprocessing');
$steps = $this->assertPreprocessingSteps($data['preprocessing']);
$rows = [];
foreach (CDBHelper::getAll('SELECT step, error_handler FROM item_preproc WHERE itemid='.$itemid) as $row) {
$rows[$row['step']] = $row['error_handler'];
}
foreach ($data['preprocessing'] as $i => $options) {
// Check "Custom on fail" value in DB.
$expected = CTestArrayHelper::get($options, 'on_fail', false) === false
? (($options['type'] === 'Check for not supported value') ? 1 : ZBX_PREPROC_FAIL_DEFAULT)
: $data['value'];
$this->assertEquals($expected, $lld ? $rows[$i+1] : $rows[$i]);
if (in_array($options['type'], [
'Trim',
'Right trim',
'Left trim',
'JavaScript',
'Discard unchanged with heartbeat'
])) {
$this->assertFalse($steps[$i]['on_fail']->isEnabled());
$this->assertFalse($steps[$i]['on_fail']->isSelected());
$this->assertTrue($steps[$i]['error_handler'] === null || !$steps[$i]['error_handler']->isVisible());
$this->assertTrue($steps[$i]['error_handler_params'] === null
|| !$steps[$i]['error_handler_params']->isVisible()
);
}
elseif (in_array($options['type'], ['Check for not supported value'])) {
$this->assertFalse($steps[$i]['on_fail']->isEnabled());
$this->assertTrue($steps[$i]['on_fail']->isSelected());
$this->assertTrue($steps[$i]['error_handler']->isVisible());
}
else {
$this->assertTrue($steps[$i]['on_fail']->isSelected());
$this->assertTrue($steps[$i]['on_fail']->isEnabled());
}
}
}
public static function getCustomOnFailValidationData() {
$cases = [
// #0 'Set value to' validation.
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set value empty',
'Key' => 'set-value-empty[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set value to',
'error_handler_params' => ''
]
],
// #1
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set value number',
'Key' => 'set-value-number[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set value to',
'error_handler_params' => '500'
]
],
// #2
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set value string',
'Key' => 'set-value-string[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set error to',
'error_handler_params' => 'String'
]
],
// #3
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set value special-symbols',
'Key' => 'set-value-special-symbols[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set value to',
'error_handler_params' => '!@#$%^&*()_+<>,.\/'
]
],
// #4 'Set error to' validation.
[
'expected' => TEST_BAD,
'fields' => [
'Name' => 'Set error empty',
'Key' => 'set-error-empty[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set error to',
'error_handler_params' => ''
],
'error' => 'Invalid parameter "/1/preprocessing/1/error_handler_params": cannot be empty.'
],
// #5
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set error string',
'Key' => 'set-error-string[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set error to',
'error_handler_params' => 'Test error'
]
],
// #6
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set error number',
'Key' => 'set-error-number[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set error to',
'error_handler_params' => '999'
]
],
// #7
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Set error special symbols',
'Key' => 'set-error-special-symbols[{#KEY}]'
],
'custom_on_fail' => [
'error_handler' => 'Set error to',
'error_handler_params' => '!@#$%^&*()_+<>,.\/'
]
]
];
$data = [];
$preprocessing = [
[
'type' => 'Regular expression',
'parameter_1' => 'expression',
'parameter_2' => '\1',
'on_fail' => true
],
[
'type' => 'JSONPath',
'parameter_1' => '$.data.test',
'on_fail' => true
],
[
'type' => 'Does not match regular expression',
'parameter_1' => 'Pattern',
'on_fail' => true
]
];
foreach ($cases as $case) {
$case['preprocessing'] = [];
foreach ($preprocessing as $step) {
$case['preprocessing'][] = array_merge($step, $case['custom_on_fail']);
}
$data[] = [$case];
}
return $data;
}
/*
* Inheritance of preprocessing steps for Item, Item prototype and LLD.
*/
public static function getCommonInheritancePreprocessing() {
return [
[
[
'fields' => [
'Name' => 'Templated Preprocessing steps',
'Key' => 'templated-preprocessing-steps[{#KEY}]'
],
'preprocessing' => [
[
'type' => 'Regular expression',
'parameter_1' => 'expression',
'parameter_2' => '\1',
'on_fail' => true,
'error_handler' => 'Discard value'
],
[
'type' => 'XML XPath',
'parameter_1' => 'path',
'on_fail' => true,
'error_handler' => 'Set value to',
'error_handler_params' => 'Custom_text'
],
[
'type' => 'XML to JSON',
'on_fail' => true,
'error_handler' => 'Set error to',
'error_handler_params' => 'Custom_text'
],
[
'type' => 'JSONPath',
'parameter_1' => '$.data.test',
'on_fail' => true,
'error_handler' => 'Set value to',
'error_handler_params' => 'Custom_text'
],
[
'type' => 'CSV to JSON',
'parameter_1' => '.',
'parameter_2' => '/',
'parameter_3' => false,
'on_fail' => true,
'error_handler' => 'Discard value'
],
[
'type' => 'Does not match regular expression',
'parameter_1' => 'Pattern',
'on_fail' => true,
'error_handler' => 'Set error to',
'error_handler_params' => 'Custom_text'
],
[
'type' => 'Check for error in JSON',
'parameter_1' => '$.new.path',
'on_fail' => false
],
[
'type' => 'Check for error in XML',
'parameter_1' => 'path',
'on_fail' => false
],
[
'type' => 'Discard unchanged with heartbeat',
'parameter_1' => '30'
],
[
'type' => 'JavaScript',
'parameter_1' => " Test line 1\n Test line 2\nTest line 3 "
]
]
]
]
];
}
/*
* Inheritance of preprocessing steps for item and item prototype.
*/
public function getItemInheritancePreprocessing() {
$data = $this->getCommonInheritancePreprocessing();
$data[0][0]['preprocessing'] = array_merge([
[
'type' => 'Check for not supported value'
],
[
'type' => 'Right trim',
'parameter_1' => '5'
],
[
'type' => 'Custom multiplier',
'parameter_1' => '10',
'on_fail' => false
],
[
'type' => 'Simple change',
'on_fail' => false
],
[
'type' => 'Octal to decimal',
'on_fail' => true,
'error_handler' => 'Set error to',
'error_handler_params' => 'Custom_text'
],
[
'type' => 'Check for error using regular expression',
'parameter_1' => 'expression',
'parameter_2' => '\0',
'on_fail' => true,
'error_handler' => 'Set error to',
'error_handler_params' => 'Custom_text'
],
[
'type' => 'Prometheus pattern',
'parameter_1' => 'cpu_usage_system',
'parameter_2' => 'label',
'parameter_3' => 'label_name',
'on_fail' => true,
'error_handler' => 'Set error to',
'error_handler_params' => 'Custom_text'
]
], $data[0][0]['preprocessing']);
return $data;
}
/**
* Check inheritance of preprocessing steps in items or LLD rules.
*
* @param array $data data provider
* @param string $host_link URL of host configuration
*/
protected function checkPreprocessingInheritance($data, $host_link, $lld = false) {
// Create item on template.
$form = $this->addItemWithPreprocessing($data, $lld);
$form->submit();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, $this->success_message);
// Check preprocessing steps on host.
$this->page->open($host_link);
$this->query('link', $data['fields']['Name'])->waitUntilPresent()->one()->click();
$form->selectTab('Preprocessing');
$steps = $this->assertPreprocessingSteps($data['preprocessing']);
foreach ($data['preprocessing'] as $i => $options) {
$step = $steps[$i];
$this->assertNotNull($step['type']->getAttribute('readonly'));
foreach (['parameter_1', 'parameter_2', 'parameter_3'] as $param) {
if (array_key_exists($param, $options)) {
$this->assertFalse($step[$param]->detect()->isEnabled());
}
}
$this->assertNotNull($step['on_fail']->getAttribute('disabled'));
switch ($options['type']) {
case 'Regular expression':
case 'CSV to JSON':
case 'XML XPath':
case 'JSONPath':
case 'Does not match regular expression':
case 'Octal to decimal':
case 'Prometheus pattern':
case 'Check for error using regular expression':
case 'Check for not supported value':
$this->assertTrue($step['on_fail']->isSelected());
$this->assertFalse($step['error_handler']->isEnabled());
break;
case 'Custom multiplier':
case 'Simple change':
case 'Right trim':
case 'JavaScript':
case 'Check for error in JSON':
case 'Check for error in XML':
case 'Discard unchanged with heartbeat':
$this->assertFalse($step['on_fail']->isSelected());
break;
}
}
}
/**
* Check cloning of inherited preprocessing steps in items, prototypes or LLD rules.
*
* @param string $link cloned item, prototype or LLD URL
* @param string $item what is being cloned: item, prototype or LLD rule
* @param string $templated is it templated item or not
*/
protected function checkCloneItem($link, $item, $templated = false) {
$cloned_values = [
'Name' => 'Cloned_testInheritancePreprocessingSteps'.time(),
'Key' => 'cloned-preprocessing'.time().'[{#KEY}]'
];
// Open original item on host and get its' preprocessing steps.
$this->page->login()->open($link);
$form = $this->query('name:itemForm')->waitUntilPresent()->asForm()->one();
if ($templated) {
// Check that right templated item is opened.
$label = ($item === 'Discovery rule') ? 'Parent discovery rules' : 'Parent items';
$this->assertEquals('Inheritance test template', $form->getField($label)->getText());
}
$form->selectTab('Preprocessing');
$original_steps = $this->listPreprocessingSteps();
$form->selectTab($item);
// Clone item.
$form->query('button:Clone')->waitUntilPresent()->one()->click();
$form->invalidate();
$form->fill($cloned_values);
$this->checkPreprocessingSteps($form, $original_steps);
$form->submit();
$message = ($item === 'Discovery rule') ? $item.' created' : $item.' added';
$this->assertMessage(TEST_GOOD, $message);
// Open cloned item and check preprocessing steps in saved form.
$id = CDBHelper::getValue('SELECT itemid FROM items WHERE key_='.zbx_dbstr($cloned_values['Key']));
$this->page->open($this->ready_link.$id);
$form->invalidate();
$this->assertEquals($cloned_values['Name'], $form->getField('Name')->getValue());
$this->checkPreprocessingSteps($form, $original_steps);
}
/**
* Select Preprocessing tab in cloned item, prototype or LLD form and assert
* that steps are the same as in original item.
*
* @param CFormElement $form item, prototype or LLD configuration form
* @param array $original_steps preprocessing steps of original item
*/
private function checkPreprocessingSteps($form, $original_steps) {
$form->selectTab('Preprocessing');
$this->assertEquals($original_steps, $this->listPreprocessingSteps());
// Check that preprocessing steps in cloned form are editable.
foreach (array_keys($this->listPreprocessingSteps()) as $i) {
$step = $this->query('id:preprocessing_'.$i.'_type')->one();
$this->assertNull($step->getAttribute('readonly'));
}
}
}