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.
511 lines
14 KiB
511 lines
14 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 triggers
|
|
*/
|
|
class testTriggerValidation extends CAPITest {
|
|
|
|
const TEMPLATE_TRIGGERID = 50178;
|
|
const UPDATE_TRIGGER_1 = 50176;
|
|
const UPDATE_TRIGGER_2 = 50177;
|
|
|
|
public static function triggers_to_update_data() {
|
|
return [
|
|
// Successful cases.
|
|
'disable trigger' => [
|
|
'triggers' => [
|
|
[
|
|
'status' => 1,
|
|
'triggerid' => self::UPDATE_TRIGGER_1
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'add dependent trigger' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'dependencies' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_2
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'delete dependent trigger' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'dependencies' => []
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'change recovery mode to "none"' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'recovery_mode' => 2
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
|
|
// Failed cases.
|
|
'swap names between 2 triggers' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'test-trigger-2',
|
|
'triggerid' => self::UPDATE_TRIGGER_1
|
|
],
|
|
[
|
|
'description' => 'test-trigger-1',
|
|
'triggerid' => self::UPDATE_TRIGGER_2
|
|
]
|
|
],
|
|
'expected_error' => 'Trigger "test-trigger-2" already exists on "Trigger validation test host".'
|
|
],
|
|
'check circular dependencies' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'dependencies' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_2
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_2,
|
|
'dependencies' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Trigger "test-trigger-1" cannot depend on the trigger "test-trigger-2", because a circular linkage ("test-trigger-2" -> "test-trigger-1" -> "test-trigger-2") would occur.'
|
|
],
|
|
'delete trigger name' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'description' => ''
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/description": cannot be empty.'
|
|
],
|
|
'make trigger dependent on itself' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'dependencies' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Trigger "test-trigger-1" cannot depend on the trigger "test-trigger-1", because a circular linkage ("test-trigger-1" -> "test-trigger-1") would occur.'
|
|
],
|
|
'update read-only properties' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'flags' => 4
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1": unexpected parameter "flags".'
|
|
],
|
|
'add unexisting dependent trigger' => [
|
|
'triggers' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1,
|
|
'dependencies' => [
|
|
[
|
|
'triggerid' => 0
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'No permissions to referred object or it does not exist!'
|
|
]
|
|
];
|
|
}
|
|
|
|
public static function triggers_to_create_data() {
|
|
return [
|
|
// Successful cases.
|
|
'2 triggers with different names' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with unique name 1',
|
|
'expression' => 'last(/Trigger validation test host/item)=0'
|
|
],
|
|
[
|
|
'description' => 'Trigger with unique name 2',
|
|
'expression' => 'last(/Trigger validation test host/item)=0'
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'trigger with empty array values for tags and dependencies' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with null values for array properties',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [],
|
|
'dependencies' => []
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'trigger with recovery expression' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with recovery expression',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_mode' => 1,
|
|
'recovery_expression' => 'last(/Trigger validation test host/item)=1'
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'trigger with correlation tag' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with correlation tag',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_mode' => 0,
|
|
'correlation_mode' => 1,
|
|
'correlation_tag' => 'tag'
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'trigger with tags' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with tags',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [
|
|
[
|
|
'tag' => 'tag1'
|
|
],
|
|
[
|
|
'tag' => 'tag2'
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
'trigger with dependencies' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with dependencies',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'dependencies' => [
|
|
[
|
|
'triggerid' => self::UPDATE_TRIGGER_1
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => null
|
|
],
|
|
|
|
// Failed cases.
|
|
'2 triggers with similar names' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Duplicate trigger name',
|
|
'expression' => 'last(/Trigger validation test host/item)=0'
|
|
],
|
|
[
|
|
'description' => 'Duplicate trigger name',
|
|
'expression' => 'last(/Trigger validation test host/item)=0'
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/2": value (description, expression)=(Duplicate trigger name, last(/Trigger validation test host/item)=0) already exists.'
|
|
],
|
|
'Trigger with invalid severity #1' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid severity',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'priority' => null
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/priority": an integer is expected.'
|
|
],
|
|
'Trigger with invalid severity #2' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid severity',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'priority' => 9
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/priority": value must be one of 0, 1, 2, 3, 4, 5.'
|
|
],
|
|
'Trigger with unexpected recovery exporession' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with unexpected recovery exporession',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_expression' => 'last(/Trigger validation test host/item)=1'
|
|
]
|
|
],
|
|
'expected_error' => 'Incorrect value for field "recovery_expression": should be empty.'
|
|
],
|
|
'Trigger with unspecified recovery exporession' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with unspecified recovery exporession',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_mode' => 1
|
|
]
|
|
],
|
|
'expected_error' => 'Incorrect value for field "recovery_expression": cannot be empty.'
|
|
],
|
|
'Trigger with invalid recovery expression #1' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with expected recovery exporession',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_mode' => 1,
|
|
'recovery_expression' => ['last(/Trigger validation test host/item)=1']
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/recovery_expression": a character string is expected.'
|
|
],
|
|
'Trigger with invalid recovery expression #2' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with expected recovery exporession',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_mode' => 1,
|
|
'recovery_expression' => '1+1'
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/recovery_expression": trigger expression must contain at least one /host/key reference.'
|
|
],
|
|
'Trigger with unexpected correlation tag #1' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with unexpected correlation tag',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'correlation_mode' => 0,
|
|
'correlation_tag' => 'tag'
|
|
]
|
|
],
|
|
'expected_error' => 'Incorrect value for field "correlation_tag": should be empty.'
|
|
],
|
|
'Trigger with expected correlation tag #2' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with unexpected correlation tag',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'recovery_mode' => 2,
|
|
'correlation_tag' => 'tag'
|
|
]
|
|
],
|
|
'expected_error' => 'Incorrect value for field "correlation_tag": should be empty.'
|
|
],
|
|
'Trigger with expected correlation tag' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with unexpected correlation tag',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'correlation_mode' => 1,
|
|
'correlation_tag' => ''
|
|
]
|
|
],
|
|
'expected_error' => 'Incorrect value for field "correlation_tag": cannot be empty.'
|
|
],
|
|
'Trigger with invalid tags #1' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid tags',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [[]]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/tags/1": the parameter "tag" is missing.'
|
|
],
|
|
'Trigger with invalid tags #2' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid tags',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [[
|
|
'tag' => '',
|
|
'value' => 'value'
|
|
]]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/tags/1/tag": cannot be empty.'
|
|
],
|
|
'Trigger with invalid dependencies #1' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid dependencies',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'dependencies' => [[
|
|
'triggerid' => ''
|
|
]]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/dependencies/1/triggerid": a number is expected.'
|
|
],
|
|
'Trigger with invalid dependencies #2' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid dependencies',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'dependencies' => [[
|
|
'triggerid' => self::TEMPLATE_TRIGGERID
|
|
]]
|
|
]
|
|
],
|
|
'expected_error' => 'Trigger "Trigger with invalid dependencies" cannot depend on the trigger "template-trigger", because dependencies of host triggers on template triggers are not allowed.'
|
|
],
|
|
'Trigger with invalid dependencies #3' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with invalid dependencies',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'dependencies' => [[
|
|
'triggerid' => 0
|
|
]]
|
|
]
|
|
],
|
|
'expected_error' => 'No permissions to referred object or it does not exist!'
|
|
],
|
|
'trigger with non-unique tags #1' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with non-unique tags',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [
|
|
[
|
|
'tag' => 'tag'
|
|
],
|
|
[
|
|
'tag' => 'tag'
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/tags/2": value (tag, value)=(tag, ) already exists.'
|
|
],
|
|
'trigger with non-unique tags #2' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with non-unique tags',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [
|
|
[
|
|
'tag' => 'tag',
|
|
'value' => 'value'
|
|
],
|
|
[
|
|
'tag' => 'tag',
|
|
'value' => 'value'
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/tags/2": value (tag, value)=(tag, value) already exists.'
|
|
],
|
|
'trigger with null in tags property' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with null values for array properties',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => null
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/tags": an array is expected.'
|
|
],
|
|
'trigger with null in dependencies property' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with null values for array properties',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'dependencies' => null
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/dependencies": an array is expected.'
|
|
],
|
|
'trigger with incorrectly formatted tags' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with tags',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'tags' => [
|
|
'tag' => 'tag1',
|
|
'tag' => 'tag2'
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/tags/1": an array is expected.'
|
|
],
|
|
'trigger with incorrectly formatted dependencies' => [
|
|
'triggers' => [
|
|
[
|
|
'description' => 'Trigger with dependencies',
|
|
'expression' => 'last(/Trigger validation test host/item)=0',
|
|
'dependencies' => [
|
|
'triggerid' => self::UPDATE_TRIGGER_1
|
|
]
|
|
]
|
|
],
|
|
'expected_error' => 'Invalid parameter "/1/dependencies/1": an array is expected.'
|
|
]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test trigger.create API.
|
|
*
|
|
* @dataProvider triggers_to_create_data
|
|
*/
|
|
public function testTriggerCreate($triggers, $expected_error) {
|
|
$this->call('trigger.create', $triggers, $expected_error);
|
|
}
|
|
|
|
/**
|
|
* Test trigger.update API.
|
|
*
|
|
* @dataProvider triggers_to_update_data
|
|
*/
|
|
public function testTriggerUpdate($triggers, $expected_error) {
|
|
$this->call('trigger.update', $triggers, $expected_error);
|
|
}
|
|
}
|