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.

159 lines
4.6 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 "dbhigh_test.h"
#include "zbxmocktest.h"
#include "zbxmockutil.h"
#include "zbxmockassert.h"
#include "zbxcommon.h"
#include "zbxdbhigh.h"
static zbx_uint64_t flags_get(zbx_mock_handle_t htag)
{
zbx_mock_handle_t hflags, hflag;
int flags_num = 1;
zbx_uint64_t flags = ZBX_FLAG_DB_TAG_UNSET;
zbx_mock_error_t err;
err = zbx_mock_object_member(htag, "flags", &hflags);
if (ZBX_MOCK_NO_SUCH_MEMBER == err)
goto out;
if (ZBX_MOCK_SUCCESS != err)
fail_msg("Cannot read flags '%s'", zbx_mock_error_string(err));
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_FLAG_DB_TAG_UNSET"))
flags |= ZBX_FLAG_DB_TAG_UNSET;
else if (0 == strcmp(flag, "ZBX_FLAG_DB_TAG_UPDATE_AUTOMATIC"))
flags |= ZBX_FLAG_DB_TAG_UPDATE_AUTOMATIC;
else if (0 == strcmp(flag, "ZBX_FLAG_DB_TAG_UPDATE_VALUE"))
flags |= ZBX_FLAG_DB_TAG_UPDATE_VALUE;
else if (0 == strcmp(flag, "ZBX_FLAG_DB_TAG_UPDATE_TAG"))
flags |= ZBX_FLAG_DB_TAG_UPDATE_TAG;
else if (0 == strcmp(flag, "ZBX_FLAG_DB_TAG_REMOVE"))
flags |= ZBX_FLAG_DB_TAG_REMOVE;
else if (0 == strcmp(flag, "ZBX_FLAG_DB_TAG_UPDATE"))
flags |= ZBX_FLAG_DB_TAG_UPDATE;
else
fail_msg("Unknown flag #%d: %s", flags_num, zbx_mock_error_string(err));
flags_num++;
}
out:
return flags;
}
static int automatic_str_to_int(const char *str)
{
int out = -1;
if (0 == strcmp(str, "ZBX_DB_TAG_NORMAL"))
out = ZBX_DB_TAG_NORMAL;
else if (0 == strcmp(str, "ZBX_DB_TAG_AUTOMATIC"))
out = ZBX_DB_TAG_AUTOMATIC;
else
fail_msg("Unknown value of 'automatic' \"%s\"", str);
return out;
}
int db_tags_and_values_compare(const void *d1, const void *d2)
{
int ret;
const zbx_db_tag_t *tag1 = *(const zbx_db_tag_t * const *)d1;
const zbx_db_tag_t *tag2 = *(const zbx_db_tag_t * const *)d2;
if (0 == (ret = strcmp(tag1->tag, tag2->tag)))
ret = strcmp(tag1->value, tag2->value);
return ret;
}
void tags_read(const char *path, zbx_vector_db_tag_ptr_t *tags)
{
int i = 0;
zbx_mock_handle_t htag_vector, htag;
zbx_mock_error_t mock_err;
htag_vector = zbx_mock_get_parameter_handle(path);
while (ZBX_MOCK_END_OF_VECTOR != (mock_err = (zbx_mock_vector_element(htag_vector, &htag))))
{
zbx_mock_handle_t hid, hauto;
zbx_db_tag_t *db_tag;
const char *tag_str, *value_str, *auto_str;
if (ZBX_MOCK_SUCCESS != mock_err)
fail_msg("Cannot read '%s' %s", path, zbx_mock_error_string(mock_err));
/* tag */
tag_str = zbx_mock_get_object_member_string(htag, "tag");
/* value */
value_str = zbx_mock_get_object_member_string(htag, "value");
db_tag = zbx_db_tag_create(tag_str, value_str);
/* tagid */
mock_err = zbx_mock_object_member(htag, "tagid", &hid);
if (ZBX_MOCK_SUCCESS == mock_err)
{
if (ZBX_MOCK_SUCCESS != (mock_err = zbx_mock_uint64(hid, &db_tag->tagid)))
fail_msg("Cannot read '%s[%d].tagid': %s", path, i, zbx_mock_error_string(mock_err));
}
else if (ZBX_MOCK_NO_SUCH_MEMBER != mock_err)
{
fail_msg("Cannot read '%s[%d].tagid': %s", path, i, zbx_mock_error_string(mock_err));
}
/* automatic */
mock_err = zbx_mock_object_member(htag, "automatic", &hauto);
if (ZBX_MOCK_SUCCESS == mock_err)
{
if (ZBX_MOCK_SUCCESS != (mock_err = zbx_mock_string(hauto, &auto_str)))
{
fail_msg("Cannot read '%s[%d].automatic': %s", path, i,
zbx_mock_error_string(mock_err));
}
else
db_tag->automatic = automatic_str_to_int(auto_str);
}
else if (ZBX_MOCK_NO_SUCH_MEMBER != mock_err)
fail_msg("Cannot read '%s[%d].automatic': %s", path, i, zbx_mock_error_string(mock_err));
/* flags */
db_tag->flags = flags_get(htag);
zbx_vector_db_tag_ptr_append(tags, db_tag);
i++;
}
}