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.
127 lines
4.2 KiB
127 lines
4.2 KiB
1 year ago
|
/*
|
||
|
** 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.
|
||
|
**/
|
||
|
|
||
|
#include "zbxcommon.h"
|
||
|
|
||
|
#include "zbxjson.h"
|
||
|
#include "zbxexpression.h"
|
||
|
|
||
|
#include "zbxmocktest.h"
|
||
|
#include "zbxmockdata.h"
|
||
|
#include "zbxmockassert.h"
|
||
|
#include "zbxmockutil.h"
|
||
|
|
||
|
|
||
|
static void get_macros(const char *path, zbx_vector_lld_macro_path_t *macros)
|
||
|
{
|
||
|
zbx_lld_macro_path_t *macro;
|
||
|
zbx_mock_handle_t hmacros, hmacro;
|
||
|
int macros_num = 1;
|
||
|
zbx_mock_error_t err;
|
||
|
|
||
|
hmacros = zbx_mock_get_parameter_handle(path);
|
||
|
while (ZBX_MOCK_END_OF_VECTOR != (err = (zbx_mock_vector_element(hmacros, &hmacro))))
|
||
|
{
|
||
|
if (ZBX_MOCK_SUCCESS != err)
|
||
|
fail_msg("Cannot read macro #%d: %s", macros_num, zbx_mock_error_string(err));
|
||
|
|
||
|
macro = (zbx_lld_macro_path_t *)zbx_malloc(NULL, sizeof(zbx_lld_macro_path_t));
|
||
|
macro->lld_macro = zbx_strdup(NULL, zbx_mock_get_object_member_string(hmacro, "macro"));
|
||
|
macro->path = zbx_strdup(NULL, zbx_mock_get_object_member_string(hmacro, "path"));
|
||
|
zbx_vector_lld_macro_path_append(macros, macro);
|
||
|
|
||
|
macros_num++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static int get_flags(const char *path)
|
||
|
{
|
||
|
zbx_mock_handle_t hflags, hflag;
|
||
|
int flags_num = 1, flags = 0;
|
||
|
zbx_mock_error_t err;
|
||
|
|
||
|
hflags = zbx_mock_get_parameter_handle(path);
|
||
|
while (ZBX_MOCK_END_OF_VECTOR != (err = (zbx_mock_vector_element(hflags, &hflag))))
|
||
|
{
|
||
|
const char *flag;
|
||
|
|
||
|
if (ZBX_MOCK_SUCCESS != err || ZBX_MOCK_SUCCESS != (err = zbx_mock_string(hflag, &flag)))
|
||
|
fail_msg("Cannot read flag #%d: %s", flags_num, zbx_mock_error_string(err));
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_JSON"))
|
||
|
flags |= ZBX_TOKEN_JSON;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_REGEXP"))
|
||
|
flags |= ZBX_TOKEN_REGEXP;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_XPATH"))
|
||
|
flags |= ZBX_TOKEN_XPATH;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_REGEXP_OUTPUT"))
|
||
|
flags |= ZBX_TOKEN_REGEXP_OUTPUT;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_PROMETHEUS"))
|
||
|
flags |= ZBX_TOKEN_PROMETHEUS;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_JSONPATH"))
|
||
|
flags |= ZBX_TOKEN_JSONPATH;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_STR_REPLACE"))
|
||
|
flags |= ZBX_TOKEN_STR_REPLACE;
|
||
|
else if (0 == strcmp(flag, "ZBX_MACRO_ANY"))
|
||
|
flags |= ZBX_MACRO_ANY;
|
||
|
else if (0 == strcmp(flag, "ZBX_MACRO_JSON"))
|
||
|
flags |= ZBX_MACRO_JSON;
|
||
|
else if (0 == strcmp(flag, "ZBX_MACRO_FUNC"))
|
||
|
flags |= ZBX_MACRO_FUNC;
|
||
|
else if (0 == strcmp(flag, "ZBX_TOKEN_EXPRESSION_MACRO"))
|
||
|
flags |= ZBX_TOKEN_EXPRESSION_MACRO;
|
||
|
|
||
|
flags_num++;
|
||
|
}
|
||
|
|
||
|
return flags;
|
||
|
}
|
||
|
|
||
|
void zbx_mock_test_entry(void **state)
|
||
|
{
|
||
|
int expected_ret, returned_ret, flags;
|
||
|
char *expression;
|
||
|
const char *expected_expression, *lld_row;
|
||
|
zbx_vector_lld_macro_path_t macros;
|
||
|
struct zbx_json_parse jp;
|
||
|
|
||
|
ZBX_UNUSED(state);
|
||
|
|
||
|
zbx_vector_lld_macro_path_create(¯os);
|
||
|
get_macros("in.macros", ¯os);
|
||
|
flags = get_flags("in.flags");
|
||
|
|
||
|
expression = zbx_strdup(NULL, zbx_mock_get_parameter_string("in.expression"));
|
||
|
expected_expression = zbx_mock_get_parameter_string("out.expression");
|
||
|
|
||
|
lld_row = zbx_mock_get_parameter_string("in.lld");
|
||
|
if (SUCCEED != zbx_json_open(lld_row, &jp))
|
||
|
fail_msg("invalid lld row parameter: %s", zbx_json_strerror());
|
||
|
|
||
|
expected_ret = zbx_mock_str_to_return_code(zbx_mock_get_parameter_string("out.return"));
|
||
|
|
||
|
returned_ret = zbx_substitute_lld_macros(&expression, &jp, ¯os, flags, NULL, 0);
|
||
|
|
||
|
zbx_mock_assert_result_eq("return value", expected_ret, returned_ret);
|
||
|
zbx_mock_assert_str_eq("resulting expression", expected_expression, expression);
|
||
|
|
||
|
zbx_free(expression);
|
||
|
zbx_vector_lld_macro_path_clear_ext(¯os, zbx_lld_macro_path_free);
|
||
|
zbx_vector_lld_macro_path_destroy(¯os);
|
||
|
}
|