diff options
author | Andris Zeila <andris.zeila@zabbix.com> | 2021-02-23 12:31:09 +0300 |
---|---|---|
committer | Andris Zeila <andris.zeila@zabbix.com> | 2021-02-23 12:31:09 +0300 |
commit | 06cb23e58a1ff75959c63ad46a94543e68e098fd (patch) | |
tree | 94e30093a5c2bb967d40523cb9b23529231cf556 | |
parent | 4d2912f5a68534767fbe5f9276c4acd59b328585 (diff) |
........S. [ZBXNEXT-6451] changed trigger function evaluation to return variant values
-rw-r--r-- | include/zbxhistory.h | 3 | ||||
-rw-r--r-- | include/zbxserver.h | 2 | ||||
-rw-r--r-- | src/libs/zbxhistory/history.c | 30 | ||||
-rw-r--r-- | src/libs/zbxserver/evalfunc2.c | 119 | ||||
-rw-r--r-- | src/libs/zbxserver/expression.c | 13 | ||||
-rw-r--r-- | tests/libs/zbxhistory/Makefile.am | 2 | ||||
-rwxr-xr-x | tests/libs/zbxserver/Makefile.am | 2 | ||||
-rw-r--r-- | tests/libs/zbxserver/evaluate_function.c | 38 | ||||
-rw-r--r-- | tests/libs/zbxserver/evaluate_function.yaml | 12 |
9 files changed, 131 insertions, 90 deletions
diff --git a/include/zbxhistory.h b/include/zbxhistory.h index 2fe5f779d70..788864aa1e5 100644 --- a/include/zbxhistory.h +++ b/include/zbxhistory.h @@ -20,6 +20,8 @@ #ifndef ZABBIX_ZBXHISTORY_H #define ZABBIX_ZBXHISTORY_H +#include "zbxvariant.h" + /* the item history value */ typedef struct { @@ -40,6 +42,7 @@ int zbx_history_record_compare_desc_func(const zbx_history_record_t *d1, const z void zbx_history_value2str(char *buffer, size_t size, const history_value_t *value, int value_type); char *zbx_history_value2str_dyn(const history_value_t *value, int value_type); void zbx_history_value_print(char *buffer, size_t size, const history_value_t *value, int value_type); +void zbx_history_value2variant(const history_value_t *value, unsigned char value_type, zbx_variant_t *var); /* In most cases zbx_history_record_vector_destroy() function should be used to free the */ /* value vector filled by zbx_vc_get_value* functions. This define simply better */ diff --git a/include/zbxserver.h b/include/zbxserver.h index 8076dddfa67..033a7a95cd8 100644 --- a/include/zbxserver.h +++ b/include/zbxserver.h @@ -62,7 +62,7 @@ void get_functionids(zbx_vector_uint64_t *functionids, const char *expression); int evaluate_function(char **value, DC_ITEM *item, const char *function, const char *parameter, const zbx_timespec_t *ts, char **error); -int evaluate_function2(char **value, DC_ITEM *item, const char *function, const char *parameter, +int evaluate_function2(zbx_variant_t *value, DC_ITEM *item, const char *function, const char *parameter, const zbx_timespec_t *ts, char **error); diff --git a/src/libs/zbxhistory/history.c b/src/libs/zbxhistory/history.c index 8215ea49e18..54bc95ba1a9 100644 --- a/src/libs/zbxhistory/history.c +++ b/src/libs/zbxhistory/history.c @@ -426,3 +426,33 @@ int zbx_history_record_compare_desc_func(const zbx_history_record_t *d1, const z return d2->timestamp.sec - d1->timestamp.sec; } +/****************************************************************************** + * * + * Function: zbx_history_value2variant * + * * + * Purpose: converts history value to variant value * + * * + * Parameters: value - [IN] the value to convert * + * value_type - [IN] the history value type * + * var - [IN] the output value * + * * + ******************************************************************************/ +void zbx_history_value2variant(const history_value_t *value, unsigned char value_type, zbx_variant_t *var) +{ + switch (value_type) + { + case ITEM_VALUE_TYPE_FLOAT: + zbx_variant_set_dbl(var, value->dbl); + break; + case ITEM_VALUE_TYPE_UINT64: + zbx_variant_set_ui64(var, value->ui64); + break; + case ITEM_VALUE_TYPE_STR: + case ITEM_VALUE_TYPE_TEXT: + zbx_variant_set_str(var, zbx_strdup(NULL, value->str)); + break; + case ITEM_VALUE_TYPE_LOG: + zbx_variant_set_str(var, zbx_strdup(NULL, value->log->value)); + } +} + diff --git a/src/libs/zbxserver/evalfunc2.c b/src/libs/zbxserver/evalfunc2.c index 9ed2cf03671..d8d7aced96a 100644 --- a/src/libs/zbxserver/evalfunc2.c +++ b/src/libs/zbxserver/evalfunc2.c @@ -307,7 +307,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_LOGEVENTID(char **value, DC_ITEM *item, const char *parameters, +static int evaluate_LOGEVENTID(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { char *arg1 = NULL; @@ -362,9 +362,9 @@ static int evaluate_LOGEVENTID(char **value, DC_ITEM *item, const char *paramete else { if (ZBX_REGEXP_MATCH == regexp_ret) - *value = zbx_strdup(*value, "1"); + zbx_variant_set_dbl(value, 1); else if (ZBX_REGEXP_NO_MATCH == regexp_ret) - *value = zbx_strdup(*value, "0"); + zbx_variant_set_dbl(value, 0); ret = SUCCEED; } @@ -400,7 +400,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_LOGSOURCE(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, +static int evaluate_LOGSOURCE(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { char *arg1 = NULL; @@ -446,11 +446,11 @@ static int evaluate_LOGSOURCE(char **value, DC_ITEM *item, const char *parameter switch (regexp_match_ex(®exps, vc_value.value.log->source, arg1, ZBX_CASE_SENSITIVE)) { case ZBX_REGEXP_MATCH: - *value = zbx_strdup(*value, "1"); + zbx_variant_set_dbl(value, 1); ret = SUCCEED; break; case ZBX_REGEXP_NO_MATCH: - *value = zbx_strdup(*value, "0"); + zbx_variant_set_dbl(value, 0); ret = SUCCEED; break; case FAIL: @@ -487,7 +487,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_LOGSEVERITY(char **value, DC_ITEM *item, const zbx_timespec_t *ts, char **error) +static int evaluate_LOGSEVERITY(zbx_variant_t *value, DC_ITEM *item, const zbx_timespec_t *ts, char **error) { int ret = FAIL; zbx_history_record_t vc_value; @@ -502,9 +502,7 @@ static int evaluate_LOGSEVERITY(char **value, DC_ITEM *item, const zbx_timespec_ if (SUCCEED == zbx_vc_get_value(item->itemid, item->value_type, ts, &vc_value)) { - size_t value_alloc = 0, value_offset = 0; - - zbx_snprintf_alloc(value, &value_alloc, &value_offset, "%d", vc_value.value.log->severity); + zbx_variant_set_dbl(value, vc_value.value.log->severity); zbx_history_record_clear(&vc_value, item->value_type); ret = SUCCEED; @@ -652,7 +650,7 @@ static void count_one_str(int *count, int op, const char *value, const char *pat * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_COUNT(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, int limit, +static int evaluate_COUNT(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, int limit, char **error) { int arg1, op = OP_UNKNOWN, numeric_search, nparams, count = 0, i, ret = FAIL; @@ -664,7 +662,6 @@ static int evaluate_COUNT(char **value, DC_ITEM *item, const char *parameters, c zbx_vector_ptr_t regexps; zbx_vector_history_record_t values; zbx_timespec_t ts_end = *ts; - size_t value_alloc = 0, value_offset = 0; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); @@ -679,8 +676,7 @@ static int evaluate_COUNT(char **value, DC_ITEM *item, const char *parameters, c goto out; } - if (SUCCEED != get_function_parameter_hist_range(ts->sec, parameters, 1, &arg1, &arg1_type, &time_shift) || - ZBX_VALUE_NONE == arg1_type) + if (SUCCEED != get_function_parameter_hist_range(ts->sec, parameters, 1, &arg1, &arg1_type, &time_shift)) { *error = zbx_strdup(*error, "invalid second parameter"); goto out; @@ -832,6 +828,9 @@ static int evaluate_COUNT(char **value, DC_ITEM *item, const char *parameters, c case ZBX_VALUE_NVALUES: nvalues = arg1; break; + case ZBX_VALUE_NONE: + nvalues = 1; + break; default: THIS_SHOULD_NEVER_HAPPEN; } @@ -904,7 +903,7 @@ static int evaluate_COUNT(char **value, DC_ITEM *item, const char *parameters, c count = limit; } - zbx_snprintf_alloc(value, &value_alloc, &value_offset, "%d", count); + zbx_variant_set_dbl(value, count); ret = SUCCEED; out: @@ -947,7 +946,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_SUM(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) +static int evaluate_SUM(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int nparams, arg1, i, ret = FAIL, seconds = 0, nvalues = 0, time_shift; zbx_value_type_t arg1_type; @@ -1013,7 +1012,7 @@ static int evaluate_SUM(char **value, DC_ITEM *item, const char *parameters, con result.ui64 += values.values[i].value.ui64; } - *value = zbx_history_value2str_dyn(&result, item->value_type); + zbx_history_value2variant(&result, item->value_type, value); ret = SUCCEED; out: zbx_history_record_vector_destroy(&values, item->value_type); @@ -1036,7 +1035,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_AVG(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) +static int evaluate_AVG(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int nparams, arg1, ret = FAIL, i, seconds = 0, nvalues = 0, time_shift; zbx_value_type_t arg1_type; @@ -1089,7 +1088,6 @@ static int evaluate_AVG(char **value, DC_ITEM *item, const char *parameters, con if (0 < values.values_num) { double avg = 0; - size_t value_alloc = 0, value_offset = 0; if (ITEM_VALUE_TYPE_FLOAT == item->value_type) { @@ -1103,7 +1101,7 @@ static int evaluate_AVG(char **value, DC_ITEM *item, const char *parameters, con avg = avg / values.values_num; } - zbx_snprintf_alloc(value, &value_alloc, &value_offset, ZBX_FS_DBL64, avg); + zbx_variant_set_dbl(value, avg); ret = SUCCEED; } @@ -1134,7 +1132,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_LAST(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, +static int evaluate_LAST(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int arg1 = 1, ret = FAIL, time_shift; @@ -1161,7 +1159,7 @@ static int evaluate_LAST(char **value, DC_ITEM *item, const char *parameters, co { if (arg1 <= values.values_num) { - *value = zbx_history_value2str_dyn(&values.values[arg1 - 1].value, item->value_type); + zbx_history_value2variant(&values.values[arg1 - 1].value, item->value_type, value); ret = SUCCEED; } else @@ -1195,7 +1193,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_MIN(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) +static int evaluate_MIN(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int nparams, arg1, i, ret = FAIL, seconds = 0, nvalues = 0, time_shift; zbx_value_type_t arg1_type; @@ -1266,7 +1264,7 @@ static int evaluate_MIN(char **value, DC_ITEM *item, const char *parameters, con } } - *value = zbx_history_value2str_dyn(&values.values[index].value, item->value_type); + zbx_history_value2variant(&values.values[index].value, item->value_type, value); ret = SUCCEED; } else @@ -1295,7 +1293,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_MAX(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) +static int evaluate_MAX(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int nparams, arg1, ret = FAIL, i, seconds = 0, nvalues = 0, time_shift; zbx_value_type_t arg1_type; @@ -1366,7 +1364,7 @@ static int evaluate_MAX(char **value, DC_ITEM *item, const char *parameters, con } } - *value = zbx_history_value2str_dyn(&values.values[index].value, item->value_type); + zbx_history_value2variant(&values.values[index].value, item->value_type, value); ret = SUCCEED; } @@ -1412,7 +1410,7 @@ static int __history_record_uint64_compare(const zbx_history_record_t *d1, const * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_PERCENTILE(char **value, DC_ITEM *item, const char *parameters, +static int evaluate_PERCENTILE(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int nparams, arg1, time_shift, ret = FAIL, seconds = 0, nvalues = 0; @@ -1486,7 +1484,7 @@ static int evaluate_PERCENTILE(char **value, DC_ITEM *item, const char *paramete else index = (int)ceil(values.values_num * (percentage / 100)); - *value = zbx_history_value2str_dyn(&values.values[index - 1].value, item->value_type); + zbx_history_value2variant(&values.values[index - 1].value, item->value_type, value); ret = SUCCEED; } @@ -1516,7 +1514,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_NODATA(char **value, DC_ITEM *item, const char *parameters, char **error) +static int evaluate_NODATA(zbx_variant_t *value, DC_ITEM *item, const char *parameters, char **error) { int arg1, num, period, lazy = 1, ret = FAIL; zbx_value_type_t arg1_type; @@ -1570,7 +1568,7 @@ static int evaluate_NODATA(char **value, DC_ITEM *item, const char *parameters, if (SUCCEED == zbx_vc_get_values(item->itemid, item->value_type, &values, period, 1, &ts) && 1 == values.values_num) { - *value = zbx_strdup(*value, "0"); + zbx_variant_set_dbl(value, 0); } else { @@ -1595,7 +1593,7 @@ static int evaluate_NODATA(char **value, DC_ITEM *item, const char *parameters, goto out; } - *value = zbx_strdup(*value, "1"); + zbx_variant_set_dbl(value, 1); if (0 != item->host.proxy_hostid && 0 != lazy) { @@ -1628,7 +1626,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_FUZZYTIME(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, +static int evaluate_FUZZYTIME(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { int arg1, ret = FAIL; @@ -1674,16 +1672,16 @@ static int evaluate_FUZZYTIME(char **value, DC_ITEM *item, const char *parameter if (ITEM_VALUE_TYPE_UINT64 == item->value_type) { if (vc_value.value.ui64 >= fuzlow && vc_value.value.ui64 <= fuzhig) - *value = zbx_strdup(*value, "1"); + zbx_variant_set_dbl(value, 1); else - *value = zbx_strdup(*value, "0"); + zbx_variant_set_dbl(value, 0); } else { if (vc_value.value.dbl >= fuzlow && vc_value.value.dbl <= fuzhig) - *value = zbx_strdup(*value, "1"); + zbx_variant_set_dbl(value, 1); else - *value = zbx_strdup(*value, "0"); + zbx_variant_set_dbl(value, 0); } zbx_history_record_clear(&vc_value, item->value_type); @@ -1716,12 +1714,12 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_BAND(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, +static int evaluate_BAND(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { char *last_parameters = NULL; int nparams, ret = FAIL; - zbx_uint64_t last_uint64, mask; + zbx_uint64_t mask; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); @@ -1748,10 +1746,13 @@ static int evaluate_BAND(char **value, DC_ITEM *item, const char *parameters, co if (SUCCEED == evaluate_LAST(value, item, last_parameters, ts, error)) { - ZBX_STR2UINT64(last_uint64, *value); - /* 'and' bit operation cannot be larger than the source value, */ - /* so the result can just be copied in value buffer */ - zbx_snprintf(*value, strlen(*value) + 1, ZBX_FS_UI64, last_uint64 & (zbx_uint64_t)mask); + /* the evaluate_LAST() should return uint64 value, but just to be sure try to convert it */ + if (SUCCEED != zbx_variant_convert(value, ZBX_VARIANT_UI64)) + { + *error = zbx_strdup(*error, "invalid value type"); + goto clean; + } + zbx_variant_set_dbl(value, value->data.ui64 & (zbx_uint64_t)mask); ret = SUCCEED; } @@ -1775,7 +1776,7 @@ clean: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_FORECAST(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, +static int evaluate_FORECAST(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { char *fit_str = NULL, *mode_str = NULL; @@ -1788,7 +1789,6 @@ static int evaluate_FORECAST(char **value, DC_ITEM *item, const char *parameters zbx_fit_t fit; zbx_mode_t mode; zbx_timespec_t ts_end = *ts; - size_t value_alloc = 0, value_offset = 0; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); @@ -1895,14 +1895,12 @@ static int evaluate_FORECAST(char **value, DC_ITEM *item, const char *parameters } } - zbx_snprintf_alloc(value, &value_alloc, &value_offset, ZBX_FS_DBL64, zbx_forecast(t, x, - values.values_num, ts->sec - zero_time.sec - 1.0e-9 * (zero_time.ns + 1), time, fit, k, - mode)); + zbx_variant_set_dbl(value, zbx_forecast(t, x, values.values_num, + ts->sec - zero_time.sec - 1.0e-9 * (zero_time.ns + 1), time, fit, k, mode)); } else { - zabbix_log(LOG_LEVEL_DEBUG, "no data available"); - zbx_snprintf_alloc(value, &value_alloc, &value_offset, ZBX_FS_DBL64, ZBX_MATH_ERROR); + zbx_variant_set_dbl(value, ZBX_MATH_ERROR); } ret = SUCCEED; @@ -1933,7 +1931,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_TIMELEFT(char **value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, +static int evaluate_TIMELEFT(zbx_variant_t *value, DC_ITEM *item, const char *parameters, const zbx_timespec_t *ts, char **error) { char *fit_str = NULL; @@ -1945,7 +1943,6 @@ static int evaluate_TIMELEFT(char **value, DC_ITEM *item, const char *parameters zbx_timespec_t zero_time; zbx_fit_t fit; zbx_timespec_t ts_end = *ts; - size_t value_alloc = 0, value_offset = 0; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); @@ -2043,14 +2040,12 @@ static int evaluate_TIMELEFT(char **value, DC_ITEM *item, const char *parameters } } - zbx_snprintf_alloc(value, &value_alloc, &value_offset, ZBX_FS_DBL64, zbx_timeleft(t, x, - values.values_num, ts->sec - zero_time.sec - 1.0e-9 * (zero_time.ns + 1), threshold, - fit, k)); + zbx_variant_set_dbl(value, zbx_timeleft(t, x, values.values_num, + ts->sec - zero_time.sec - 1.0e-9 * (zero_time.ns + 1), threshold, fit, k)); } else { - zabbix_log(LOG_LEVEL_DEBUG, "no data available"); - zbx_snprintf_alloc(value, &value_alloc, &value_offset, ZBX_FS_DBL64, ZBX_MATH_ERROR); + zbx_variant_set_dbl(value, ZBX_MATH_ERROR); } ret = SUCCEED; @@ -2085,7 +2080,7 @@ out: * FAIL - failed to evaluate function * * * ******************************************************************************/ -static int evaluate_TREND(char **value, DC_ITEM *item, const char *func, const char *parameters, +static int evaluate_TREND(zbx_variant_t *value, DC_ITEM *item, const char *func, const char *parameters, const zbx_timespec_t *ts, char **error) { int ret = FAIL, start, end; @@ -2148,7 +2143,7 @@ static int evaluate_TREND(char **value, DC_ITEM *item, const char *func, const c } if (SUCCEED == ret) - *value = zbx_dsprintf(*value, ZBX_FS_DBL64, value_dbl); + zbx_variant_set_dbl(value, value_dbl); out: zbx_free(period); zbx_free(period_shift); @@ -2172,7 +2167,7 @@ out: * FAIL - evaluation failed * * * ******************************************************************************/ -int evaluate_function2(char **value, DC_ITEM *item, const char *function, const char *parameter, +int evaluate_function2(zbx_variant_t *value, DC_ITEM *item, const char *function, const char *parameter, const zbx_timespec_t *ts, char **error) { int ret; @@ -2258,10 +2253,8 @@ int evaluate_function2(char **value, DC_ITEM *item, const char *function, const ret = FAIL; } - if (SUCCEED == ret) - del_zeros(*value); - - zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s value:'%s'", __func__, zbx_result_string(ret), ZBX_NULL2STR(*value)); + zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s value:'%s' of type:'%s'", __func__, zbx_result_string(ret), + zbx_variant_value_desc(value), zbx_variant_type_desc(value)); return ret; } diff --git a/src/libs/zbxserver/expression.c b/src/libs/zbxserver/expression.c index 378c0e6c0a3..f3c42a64093 100644 --- a/src/libs/zbxserver/expression.c +++ b/src/libs/zbxserver/expression.c @@ -5043,6 +5043,7 @@ static void zbx_populate_function_items(const zbx_vector_uint64_t *functionids, func = (zbx_func_t *)zbx_hashset_insert(funcs, &func_local, sizeof(func_local)); func->function = zbx_strdup(NULL, func_local.function); func->parameter = zbx_strdup(NULL, func_local.parameter); + zbx_variant_set_none(&func->value); } ifunc_local.functionid = functions[i].functionid; @@ -5088,8 +5089,6 @@ static void zbx_evaluate_item_functions(zbx_hashset_t *funcs) zbx_hashset_iter_reset(funcs, &iter); while (NULL != (func = (zbx_func_t *)zbx_hashset_iter_next(&iter))) { - char *value = NULL; - i = zbx_vector_uint64_bsearch(&itemids, func->itemid, ZBX_DEFAULT_UINT64_COMPARE_FUNC); if (SUCCEED != errcodes[i]) @@ -5114,7 +5113,7 @@ static void zbx_evaluate_item_functions(zbx_hashset_t *funcs) { zbx_free(func->error); func->error = zbx_eval_format_function_error(func->function, items[i].host.host, - items[i].key_orig, func->parameter, " item belongs to a disabled host."); + items[i].key_orig, func->parameter, " item belongs to a disabled host"); continue; } @@ -5124,12 +5123,12 @@ static void zbx_evaluate_item_functions(zbx_hashset_t *funcs) /* set 'unknown' error value */ zbx_variant_set_error(&func->value, zbx_eval_format_function_error(func->function, items[i].host.host, - items[i].key_orig, func->parameter, "item is not supported.")); + items[i].key_orig, func->parameter, "item is not supported")); continue; } - if (SUCCEED != evaluate_function2(&value, &items[i], func->function, func->parameter, &func->timespec, - &error)) + if (SUCCEED != evaluate_function2(&func->value, &items[i], func->function, func->parameter, + &func->timespec, &error)) { /* compose and store error message for future use */ zbx_variant_set_error(&func->value, @@ -5138,8 +5137,6 @@ static void zbx_evaluate_item_functions(zbx_hashset_t *funcs) zbx_free(error); continue; } - - zbx_variant_set_str(&func->value, value); } DCconfig_clean_items(items, errcodes, itemids.values_num); diff --git a/tests/libs/zbxhistory/Makefile.am b/tests/libs/zbxhistory/Makefile.am index 4b47a289c8f..6f8f5eacfee 100644 --- a/tests/libs/zbxhistory/Makefile.am +++ b/tests/libs/zbxhistory/Makefile.am @@ -8,7 +8,6 @@ HISTORY_LIBS = \ $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ $(top_srcdir)/src/libs/zbxcomms/libzbxcomms.a \ $(top_srcdir)/src/libs/zbxcompress/libzbxcompress.a \ - $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ $(top_srcdir)/src/libs/zbxnix/libzbxnix.a \ $(top_srcdir)/src/libs/zbxcrypto/libzbxcrypto.a \ $(top_srcdir)/src/libs/zbxsys/libzbxsys.a \ @@ -17,6 +16,7 @@ HISTORY_LIBS = \ $(top_srcdir)/src/libs/zbxconf/libzbxconf.a \ $(top_srcdir)/src/libs/zbxmemory/libzbxmemory.a \ $(top_srcdir)/src/libs/zbxhistory/libzbxhistory.a \ + $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ $(top_srcdir)/src/libs/zbxjson/libzbxjson.a \ $(top_srcdir)/src/libs/zbxregexp/libzbxregexp.a \ $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ diff --git a/tests/libs/zbxserver/Makefile.am b/tests/libs/zbxserver/Makefile.am index 7c93724c262..2f0697d83e2 100755 --- a/tests/libs/zbxserver/Makefile.am +++ b/tests/libs/zbxserver/Makefile.am @@ -55,7 +55,6 @@ COMMON_LIB_FILES = \ $(top_srcdir)/src/libs/zbxcrypto/libzbxcrypto.a \ $(top_srcdir)/src/libs/zbxcomms/libzbxcomms.a \ $(top_srcdir)/src/libs/zbxcompress/libzbxcompress.a \ - $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ $(top_srcdir)/src/libs/zbxsys/libzbxsys.a \ $(top_srcdir)/src/libs/zbxcrypto/libzbxcrypto.a \ $(top_srcdir)/src/libs/zbxcommshigh/libzbxcommshigh.a \ @@ -75,6 +74,7 @@ COMMON_LIB_FILES = \ $(top_srcdir)/src/libs/zbxconf/libzbxconf.a \ $(top_srcdir)/src/libs/zbxhistory/libzbxhistory.a \ $(top_srcdir)/src/zabbix_server/libzbxserver.a \ + $(top_srcdir)/src/libs/zbxcommon/libzbxcommon.a \ $(top_srcdir)/tests/libzbxmocktest.a \ $(top_srcdir)/tests/libzbxmockdata.a \ $(top_srcdir)/src/libs/zbxalgo/libzbxalgo.a \ diff --git a/tests/libs/zbxserver/evaluate_function.c b/tests/libs/zbxserver/evaluate_function.c index dc4e30870bf..dfe819809d0 100644 --- a/tests/libs/zbxserver/evaluate_function.c +++ b/tests/libs/zbxserver/evaluate_function.c @@ -70,12 +70,13 @@ int __wrap_DCget_data_expected_from(zbx_uint64_t itemid, int *seconds) void zbx_mock_test_entry(void **state) { int err, expected_ret, returned_ret; - char *error = NULL, *returned_value = NULL; + char *error = NULL; const char *function, *params; DC_ITEM item; zbx_vcmock_ds_item_t *ds_item; zbx_timespec_t ts; zbx_mock_handle_t handle; + zbx_variant_t returned_value; err = zbx_vc_init(&error); zbx_mock_assert_result_eq("Value cache initialization failed", SUCCEED, err); @@ -106,21 +107,38 @@ void zbx_mock_test_entry(void **state) if (SUCCEED == expected_ret) { const char *expected_value; - char *ptr; - double expected_dbl; + zbx_uint64_t expected_ui64; handle = zbx_mock_get_parameter_handle("out.value"); if (ZBX_MOCK_SUCCESS != (err = zbx_mock_string_ex(handle, &expected_value))) fail_msg("Cannot read output value: %s", zbx_mock_error_string(err)); - expected_dbl = strtod(expected_value, &ptr); - - if (ptr != expected_value && '\0' == *ptr) - zbx_mock_assert_double_eq("function result", expected_dbl, atof(returned_value)); - else - zbx_mock_assert_str_eq("function result", expected_value, returned_value); + switch (returned_value.type) + { + case ZBX_VARIANT_DBL: + zbx_mock_assert_double_eq("function result", atof(expected_value), + returned_value.data.dbl); + break; + case ZBX_VARIANT_UI64: + if (SUCCEED != is_uint64(expected_value, &expected_ui64)) + { + fail_msg("function result '" ZBX_FS_UI64 "' does not match expected result '%s'", + returned_value.data.ui64, expected_value); + + } + zbx_mock_assert_uint64_eq("function result", expected_ui64, returned_value.data.ui64); + break; + case ZBX_VARIANT_STR: + zbx_mock_assert_str_eq("function result", expected_value, returned_value.data.str); + break; + default: + fail_msg("function result '%s' has unexpected type '%s'", + zbx_variant_value_desc(&returned_value), + zbx_variant_type_desc(&returned_value)); + break; + } } - zbx_free(returned_value); + zbx_variant_clear(&returned_value); zbx_vcmock_ds_destroy(); diff --git a/tests/libs/zbxserver/evaluate_function.yaml b/tests/libs/zbxserver/evaluate_function.yaml index d47c458977c..b3d763df904 100644 --- a/tests/libs/zbxserver/evaluate_function.yaml +++ b/tests/libs/zbxserver/evaluate_function.yaml @@ -46,7 +46,7 @@ in: params: '' out: return: SUCCEED - value: '"xyz"' + value: 'xyz' --- test case: Evaluate last() <- '😓...' in: @@ -64,10 +64,10 @@ in: out: return: SUCCEED value: - header: '"' + header: '' page: 😓 pages: 20000 - footer: '"' + footer: '' --- test case: Evaluate last() <- '123' in: @@ -82,7 +82,7 @@ in: params: '' out: return: SUCCEED - value: '"123"' + value: '123' --- test case: Evaluate last() <- ' a b ' in: @@ -97,7 +97,7 @@ in: params: '' out: return: SUCCEED - value: '" a b "' + value: ' a b ' --- test case: Evaluate last() <- '\"c:\\\"' in: @@ -112,7 +112,7 @@ in: params: '' out: return: SUCCEED - value: '"\"c:\\\""' + value: '"c:\"' --- test case: Evaluate last(:now-10m) <- 0.1, 0.2 in: |