#ifndef _UTESTS_H_
#define _UTESTS_H_
#define _POSIX_C_SOURCE 200809L
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <cmocka.h>
#include <string.h>
#include "libyang.h"
#include "plugins_exts/metadata.h"
#include "plugins_internal.h"
#include "plugins_types.h"
#include "tests_config.h"
#include "tree_schema_internal.h"
struct utest_context {
struct ly_ctx *ctx;
struct ly_in *in;
struct ly_out *out;
char *orig_tz;
};
#define _UC ((struct utest_context *)*state)
#define UTEST_LYCTX (_UC->ctx)
#define UTEST_IN (_UC->in)
#define UTEST_OUT (_UC->out)
#define CHECK_PARSE_LYD_PARAM(INPUT, INPUT_FORMAT, PARSE_OPTIONS, VALIDATE_OPTIONS, RET, OUT_NODE) \
{ \
LY_ERR _r = lyd_parse_data_mem(_UC->ctx, INPUT, INPUT_FORMAT, PARSE_OPTIONS, VALIDATE_OPTIONS, &OUT_NODE); \
if (_r != RET) { \
if (_r) { \
fail_msg("%s != 0x%d; MSG: %s", #RET, _r, ly_err_last(_UC->ctx)->msg); \
} else { \
fail_msg("%s != 0x%d", #RET, _r); \
} \
} \
}
#define CHECK_LYD_STRING_PARAM(NODE, TEXT, FORMAT, PARAM) \
{ \
char *str; \
LY_ERR _r = lyd_print_mem(&str, NODE, FORMAT, PARAM); \
if (_r) { \
fail_msg("Print err 0x%d; MSG: %s", _r, ly_err_last(_UC->ctx)->msg); \
} \
assert_string_equal(str, TEXT); \
free(str); \
}
#define CHECK_LYD(NODE_1, NODE_2) \
{ \
char *str1; \
char *str2; \
assert_int_equal(LY_SUCCESS, lyd_print_mem(&str1, NODE_1, LYD_XML, LYD_PRINT_WITHSIBLINGS | LYD_PRINT_SHRINK)); \
assert_int_equal(LY_SUCCESS, lyd_print_mem(&str2, NODE_2, LYD_XML, LYD_PRINT_WITHSIBLINGS | LYD_PRINT_SHRINK)); \
assert_non_null(str1); \
assert_non_null(str2); \
assert_string_equal(str1, str2); \
free(str1); \
free(str2); \
}
#define CHECK_STRING(STRING, TEXT)\
if (TEXT == NULL) { \
assert_null(STRING); \
} else { \
assert_non_null(STRING); \
assert_string_equal(STRING, TEXT); \
}
#define CHECK_POINTER(POINTER, FLAG) \
assert_true(FLAG == 0 ? POINTER == NULL : POINTER != NULL)
#define CHECK_ARRAY(ARRAY, SIZE) \
assert_true((SIZE == 0) ? \
(ARRAY == NULL) : \
(ARRAY != NULL && SIZE == LY_ARRAY_COUNT(ARRAY)));
#define CHECK_LYSC_TYPE(NODE, TYPE, EXTS) \
assert_non_null(NODE); \
assert_int_equal((NODE)->basetype, TYPE); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_ptr_equal((NODE)->plugin, lyplg_type_plugin_find(NULL, "", NULL, ly_data_type2str[TYPE]))
#define CHECK_LYSC_TYPE_NUM(NODE, TYPE, EXTS, RANGE) \
CHECK_LYSC_TYPE(NODE, TYPE, EXTS);\
CHECK_POINTER((NODE)->range, RANGE)
#define CHECK_LYSC_TYPE_STR(NODE, EXTS, LENGTH, PATTERNS) \
CHECK_LYSC_TYPE(NODE, LY_TYPE_STRING, EXTS); \
CHECK_POINTER((NODE)->length, LENGTH); \
CHECK_ARRAY((NODE)->patterns, PATTERNS)
#define CHECK_LYSC_TYPE_BITS(NODE, EXTS, BITS) \
CHECK_LYSC_TYPE(NODE, LY_TYPE_BITS, EXTS); \
CHECK_ARRAY((NODE)->bits, BITS)
#define CHECK_LYSC_TYPE_BITENUM_ITEM(NODE, POSITION, DSC, EXTS, FLAGS, NAME, REF)\
assert_non_null(NODE); \
assert_int_equal((NODE)->position, POSITION); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_STRING((NODE)->name, NAME); \
CHECK_STRING((NODE)->ref, REF) \
#define CHECK_LYSC_RANGE(NODE, DSC, EAPPTAG, EMSG, EXTS, PARTS, REF) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_STRING((NODE)->eapptag, EAPPTAG); \
CHECK_STRING((NODE)->emsg, EMSG); \
CHECK_ARRAY((NODE)->exts, EXTS); \
CHECK_ARRAY((NODE)->parts, PARTS); \
CHECK_STRING((NODE)->ref, REF)
#define CHECK_LYSC_PATTERN(NODE, DSC, EAPPTAG, EMSG, EXPR, EXTS, INVERTED, REF) \
assert_non_null(NODE); \
assert_non_null((NODE)->code); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_STRING((NODE)->eapptag, EAPPTAG); \
CHECK_STRING((NODE)->emsg, EMSG); \
CHECK_STRING((NODE)->expr, EXPR); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->inverted, INVERTED); \
CHECK_STRING((NODE)->ref, REF)
#define CHECK_LYSP_ACTION_INOUT(NODE, DATA, EXTS, GROUPINGS, MUSTS, NODETYPE, PARENT, TYPEDEFS) \
assert_non_null(NODE); \
CHECK_POINTER((NODE)->child, DATA); \
CHECK_ARRAY((NODE)->exts, EXTS); \
CHECK_POINTER((NODE)->groupings, GROUPINGS); \
CHECK_ARRAY((NODE)->musts, MUSTS); \
assert_int_equal((NODE)->nodetype, NODETYPE); \
CHECK_POINTER((NODE)->parent, PARENT); \
CHECK_ARRAY((NODE)->typedefs, TYPEDEFS);
#define CHECK_LYSP_ACTION(NODE, DSC, EXTS, FLAGS, GROUPINGS, IFFEATURES, \
INPUT_DATA, INPUT_EXTS, INPUT_GROUPINGS, INPUT_MUSTS, \
INPUT_PARENT, INPUT_TYPEDEFS, \
NAME, NODETYPE, \
OUTPUT_DATA, OUTPUT_EXTS, OUTPUT_GROUPINGS, OUTPUT_MUSTS, \
OUTPUT_PARENT, OUTPUT_TYPEDEFS, \
PARENT, REF, TYPEDEFS) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_POINTER((NODE)->groupings, GROUPINGS); \
CHECK_ARRAY((NODE)->iffeatures, IFFEATURES); \
CHECK_LYSP_ACTION_INOUT(&((NODE)->input), INPUT_DATA, INPUT_EXTS, INPUT_GROUPINGS, \
INPUT_MUSTS, LYS_INPUT, INPUT_PARENT, INPUT_TYPEDEFS); \
assert_string_equal((NODE)->name, NAME); \
assert_int_equal((NODE)->nodetype, NODETYPE); \
CHECK_LYSP_ACTION_INOUT(&((NODE)->output), OUTPUT_DATA, OUTPUT_EXTS, OUTPUT_GROUPINGS, \
OUTPUT_MUSTS, LYS_OUTPUT, OUTPUT_PARENT, OUTPUT_TYPEDEFS); \
CHECK_POINTER((NODE)->parent, PARENT); \
CHECK_STRING((NODE)->ref, REF); \
CHECK_ARRAY((NODE)->typedefs, TYPEDEFS) \
#define CHECK_LYSP_WHEN(NODE, COND, DSC, EXTS, REF) \
assert_non_null(NODE); \
assert_string_equal((NODE)->cond, COND); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
if (REF == NULL) { \
assert_null((NODE)->ref); \
} else { \
assert_non_null((NODE)->ref); \
assert_string_equal((NODE)->ref, REF); \
}
#define CHECK_LYSP_RESTR(NODE, ARG_STR, DSC, EAPPTAG, EMSG, EXTS, REF) \
assert_non_null(NODE); \
assert_non_null((NODE)->arg.mod); \
assert_string_equal((NODE)->arg.str, ARG_STR); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_STRING((NODE)->eapptag, EAPPTAG); \
CHECK_STRING((NODE)->emsg, EMSG); \
CHECK_ARRAY((NODE)->exts, EXTS); \
CHECK_STRING((NODE)->ref, REF);
#define CHECK_LYSP_IMPORT(NODE, DSC, EXTS, NAME, PREFIX, REF, REV) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_string_equal((NODE)->name, NAME); \
assert_string_equal((NODE)->prefix, PREFIX); \
CHECK_STRING((NODE)->ref, REF); \
CHECK_STRING((NODE)->rev, REV); \
#define CHECK_LYSP_EXT(NODE, ARGNAME, COMPILED, DSC, EXTS, FLAGS, NAME, REF) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->argname, ARGNAME); \
CHECK_POINTER((NODE)->compiled, COMPILED); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
assert_string_equal((NODE)->name, NAME); \
CHECK_STRING((NODE)->ref, REF);
#define CHECK_LYSP_EXT_INSTANCE(NODE, ARGUMENT, CHILD, PARENT_STMT, PARENT_STMT_INDEX, NAME, FORMAT) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->argument, ARGUMENT); \
CHECK_POINTER((NODE)->child, CHILD); \
assert_int_equal((NODE)->parent_stmt, PARENT_STMT); \
assert_int_equal((NODE)->parent_stmt_index, PARENT_STMT_INDEX); \
assert_string_equal((NODE)->name, NAME); \
assert_int_equal((NODE)->format, FORMAT);
#define CHECK_LYSP_STMT(NODE, ARG, CHILD, FLAGS, KW, NEXT, STMT) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->arg, ARG); \
CHECK_POINTER((NODE)->child, CHILD); \
assert_int_equal((NODE)->flags, FLAGS); \
assert_int_equal((NODE)->kw, KW); \
CHECK_POINTER((NODE)->next, NEXT); \
assert_string_equal((NODE)->stmt, STMT); \
#define CHECK_LYSP_TYPE_ENUM(NODE, DSC, EXTS, FLAGS, IFFEATURES, NAME, REF, VALUE) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_ARRAY((NODE)->iffeatures, IFFEATURES); \
CHECK_STRING((NODE)->name, NAME); \
CHECK_STRING((NODE)->ref, REF); \
assert_int_equal(VALUE, (NODE)->value);
#define CHECK_LYSP_TYPE(NODE, BASES, BITS, COMPILED, ENUMS, EXTS, FLAGS, FRACTIONS_DIGITS, \
LENGTH, NAME, PATH, PATTERNS, PMOD, RANGE, REQUIRE_INSTANCE, TYPES) \
assert_non_null(NODE);\
CHECK_ARRAY((NODE)->bases, BASES); \
CHECK_ARRAY((NODE)->bits, BITS); \
CHECK_POINTER((NODE)->compiled, COMPILED); \
CHECK_ARRAY((NODE)->enums, ENUMS); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
assert_int_equal((NODE)->fraction_digits, FRACTIONS_DIGITS); \
CHECK_POINTER((NODE)->length, LENGTH); \
CHECK_STRING((NODE)->name, NAME); \
CHECK_POINTER((NODE)->path, PATH); \
CHECK_ARRAY((NODE)->patterns, PATTERNS); \
CHECK_POINTER((NODE)->pmod, PMOD); \
CHECK_POINTER((NODE)->range, RANGE); \
assert_int_equal((NODE)->require_instance, REQUIRE_INSTANCE); \
CHECK_ARRAY((NODE)->types , TYPES)
#define CHECK_LYSP_NODE(NODE, DSC, EXTS, FLAGS, IFFEATURES, NAME, NEXT, NODETYPE, PARENT, REF, WHEN) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_ARRAY((NODE)->iffeatures, IFFEATURES); \
CHECK_STRING((NODE)->name, NAME); \
CHECK_POINTER((NODE)->next, NEXT); \
assert_int_equal((NODE)->nodetype, NODETYPE); \
CHECK_POINTER((NODE)->parent, PARENT); \
CHECK_STRING((NODE)->ref, REF); \
CHECK_POINTER(lysp_node_when((struct lysp_node *)NODE), WHEN);
#define CHECK_LYSP_NODE_LEAF(NODE, DSC, EXTS, FLAGS, IFFEATURES, NAME, NEXT, \
PARENT, REF, WHEN, MUSTS, UNITS, DFLT) \
CHECK_LYSP_NODE(NODE, DSC, EXTS, FLAGS, IFFEATURES, NAME, NEXT, LYS_LEAF, PARENT, REF, WHEN); \
CHECK_ARRAY((NODE)->musts, MUSTS); \
CHECK_STRING((NODE)->units, UNITS); \
CHECK_STRING((NODE)->dflt.str, DFLT);
#define CHECK_LYSC_NOTIF(NODE, DATA, DSC, EXTS, FLAGS, MODULE, MUSTS, NAME, PARENT, PRIV, REF, WHEN) \
assert_non_null(NODE); \
CHECK_POINTER((NODE)->child, DATA); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_POINTER((NODE)->module, MODULE); \
CHECK_ARRAY((NODE)->musts, MUSTS); \
assert_string_equal((NODE)->name, NAME); \
assert_int_equal((NODE)->nodetype, LYS_NOTIF); \
CHECK_POINTER((NODE)->parent, PARENT); \
CHECK_POINTER((NODE)->priv, PRIV); \
CHECK_STRING((NODE)->ref, REF); \
CHECK_ARRAY(lysc_node_when((const struct lysc_node *)NODE), WHEN);
#define CHECK_LYSC_ACTION_INOUT(NODE, DATA, MUST, NODETYPE) \
assert_non_null(NODE); \
CHECK_POINTER((NODE)->child, DATA); \
CHECK_ARRAY((NODE)->musts, MUST); \
assert_int_equal((NODE)->nodetype, NODETYPE);
#define CHECK_LYSC_ACTION(NODE, DSC, EXTS, FLAGS, INPUT_DATA, INPUT_MUST, INPUT_EXTS, MODULE, NAME, NODETYPE, \
OUTPUT_DATA, OUTPUT_MUST, OUTPUT_EXTS, PARENT, PRIV, REF, WHEN) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_LYSC_ACTION_INOUT(&(NODE)->input, INPUT_DATA, INPUT_MUST, LYS_INPUT); \
CHECK_ARRAY((NODE)->input.exts, INPUT_EXTS); \
CHECK_POINTER((NODE)->module, MODULE); \
assert_string_equal((NODE)->name, NAME); \
assert_int_equal((NODE)->nodetype, NODETYPE); \
CHECK_LYSC_ACTION_INOUT(&(NODE)->output, OUTPUT_DATA, OUTPUT_MUST, LYS_OUTPUT); \
CHECK_ARRAY((NODE)->output.exts, OUTPUT_EXTS); \
CHECK_POINTER((NODE)->parent, PARENT); \
CHECK_POINTER((NODE)->priv, PRIV); \
CHECK_STRING((NODE)->ref, REF); \
CHECK_ARRAY(lysc_node_when((const struct lysc_node *)NODE), WHEN);
#define CHECK_LYSC_NODE(NODE, DSC, EXTS, FLAGS, MODULE, NAME, NEXT, NODETYPE, PARENT, PRIV, REF, WHEN) \
assert_non_null(NODE); \
CHECK_STRING((NODE)->dsc, DSC); \
CHECK_ARRAY((NODE)->exts, EXTS); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_POINTER((NODE)->module, MODULE); \
assert_string_equal((NODE)->name, NAME); \
CHECK_POINTER((NODE)->next, NEXT); \
assert_int_equal((NODE)->nodetype, NODETYPE); \
CHECK_POINTER((NODE)->parent, PARENT); \
assert_non_null((NODE)->prev); \
CHECK_POINTER((NODE)->priv, PRIV); \
CHECK_STRING((NODE)->ref, REF); \
CHECK_ARRAY(lysc_node_when((const struct lysc_node *)NODE), WHEN);
#define CHECK_LYSC_NODE_LIST(NODE, DSC, EXTS, FLAGS, MODULE, NAME, NEXT, \
PARENT, PRIV, REF, ACTIONS, CHILD, MAX, MIN, MUSTS, NOTIFS, UNIQUES, WHEN) \
CHECK_LYSC_NODE(NODE, DSC, EXTS, FLAGS, MODULE, NAME, NEXT, LYS_LIST, PARENT, PRIV, REF, WHEN); \
CHECK_POINTER((NODE)->actions, ACTIONS); \
CHECK_POINTER((NODE)->child, CHILD); \
assert_int_equal((NODE)->max, MAX); \
assert_int_equal((NODE)->min, MIN); \
CHECK_ARRAY((NODE)->musts, MUSTS); \
CHECK_POINTER((NODE)->notifs, NOTIFS); \
CHECK_ARRAY((NODE)->uniques, UNIQUES); \
CHECK_ARRAY(lysc_node_when((const struct lysc_node *)NODE), WHEN)
#define CHECK_LYSC_NODE_LEAF(NODE, DSC, EXTS, FLAGS, MODULE, NAME, NEXT, \
PARENT, PRIV, REF, WHEN, MUSTS, UNITS, DFLT) \
CHECK_LYSC_NODE(NODE, DSC, EXTS, FLAGS, MODULE, NAME, NEXT, LYS_LEAF, PARENT, PRIV, REF, WHEN); \
CHECK_ARRAY((NODE)->musts, MUSTS); \
assert_non_null((NODE)->type); \
CHECK_STRING((NODE)->units, UNITS); \
CHECK_POINTER((NODE)->dflt, DFLT);
#define CHECK_LYD_META(NODE, ANNOTATION, NAME, NEXT, PARENT, TYPE_VAL, ...) \
assert_non_null(NODE); \
CHECK_POINTER((NODE)->annotation, ANNOTATION); \
assert_string_equal((NODE)->name, NAME); \
CHECK_POINTER((NODE)->next, NEXT); \
CHECK_POINTER((NODE)->parent, PARENT); \
CHECK_LYD_VALUE((NODE)->value, TYPE_VAL, __VA_ARGS__);
#define CHECK_LYD_NODE_TERM(NODE, FLAGS, META, NEXT, PARENT, SCHEMA, VALUE_TYPE, ...) \
assert_non_null(NODE); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_POINTER((NODE)->meta, META); \
CHECK_POINTER((NODE)->next, NEXT); \
CHECK_POINTER((NODE)->parent, PARENT); \
assert_non_null((NODE)->prev); \
CHECK_POINTER((NODE)->schema, SCHEMA); \
CHECK_LYD_VALUE((NODE)->value, VALUE_TYPE, __VA_ARGS__);
#define CHECK_LYD_NODE_ANY(NODE, FLAGS, META, PARENT, VALUE_TYPE) \
assert_non_null(NODE); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_POINTER((NODE)->meta, META); \
CHECK_POINTER((NODE)->meta, PARENT); \
assert_non_null((NODE)->prev); \
assert_non_null((NODE)->schema); \
assert_int_equal((NODE)->value_type, VALUE_TYPE);
#define CHECK_LYD_NODE_OPAQ(NODE, ATTR, CHILD, FORMAT, NAME, NEXT, PARENT, PREFIX, VAL_PREFS, VALUE) \
assert_non_null(NODE); \
CHECK_POINTER((NODE)->attr, ATTR); \
CHECK_POINTER((NODE)->child, CHILD); \
assert_ptr_equal((NODE)->ctx, UTEST_LYCTX); \
assert_int_equal((NODE)->flags, 0); \
assert_true((NODE)->format == FORMAT); \
assert_int_equal((NODE)->hash, 0); \
assert_string_equal((NODE)->name.name, NAME); \
assert_non_null((NODE)->prev); \
assert_null((NODE)->schema); \
CHECK_POINTER((NODE)->val_prefix_data, VAL_PREFS); \
assert_string_equal((NODE)->value, VALUE);
#define CHECK_LYD_NODE_INNER(NODE, CHILD, CHILD_HT, META, FLAGS, NEXT, PARENT, PRIV, SCHEMA) \
assert_non_null(NODE); \
CHECK_POINTER((NODE)->child, CHILD); \
CHECK_POINTER((NODE)->children_ht, CHILD_HT); \
CHECK_POINTER((NODE)->meta, META); \
assert_int_equal((NODE)->flags, FLAGS); \
CHECK_POINTER((NODE)->parent, PARENT); \
assert_non_null((NODE)->prev); \
CHECK_POINTER((NODE)->next, NEXT); \
CHECK_POINTER((NODE)->priv, PRIV); \
CHECK_POINTER((NODE)->schema, SCHEMA)
#define CHECK_LYD_VALUE(NODE, TYPE_VAL, ...) \
CHECK_LYD_VALUE_ ## TYPE_VAL (NODE, __VA_ARGS__);
#define CHECK_LYD_VALUE_EMPTY(NODE, CANNONICAL_VAL) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal((NODE).realtype->basetype, LY_TYPE_EMPTY);
#define CHECK_LYD_VALUE_UNION(NODE, CANNONICAL_VAL, TYPE_VAL, ...) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_UNION, (NODE).realtype->basetype); \
assert_non_null((NODE).subvalue); \
assert_non_null((NODE).subvalue->prefix_data); \
CHECK_LYD_VALUE_ ## TYPE_VAL ((NODE).subvalue->value, __VA_ARGS__)
#define _GETARG1(ARG1, ...) ARG1
#define CHECK_LYD_VALUE_BITS(NODE, ...) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, _GETARG1(__VA_ARGS__, DUMMY)); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_BITS, (NODE).realtype->basetype); \
{ \
const char *arr[] = { __VA_ARGS__ }; \
LY_ARRAY_COUNT_TYPE arr_size = (sizeof(arr) / sizeof(arr[0])) - 1; \
struct lyd_value_bits *_val; \
LYD_VALUE_GET(&(NODE), _val); \
assert_int_equal(arr_size, LY_ARRAY_COUNT(_val->items)); \
for (LY_ARRAY_COUNT_TYPE it = 0; it < arr_size; it++) { \
assert_string_equal(arr[it + 1], _val->items[it]->name); \
} \
}
#define CHECK_LYD_VALUE_INST(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_INST, (NODE).realtype->basetype); \
{ \
LY_ARRAY_COUNT_TYPE arr_size = sizeof(VALUE) / sizeof(VALUE[0]); \
assert_int_equal(arr_size, LY_ARRAY_COUNT((NODE).target)); \
for (LY_ARRAY_COUNT_TYPE it = 0; it < arr_size; it++) { \
if ((NODE).target[it].predicates) { \
assert_int_equal(VALUE[it], (NODE).target[it].predicates[0].type); \
} \
} \
}
#define CHECK_LYD_VALUE_ENUM(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_ENUM, (NODE).realtype->basetype); \
assert_string_equal(VALUE, (NODE).enum_item->name);
#define CHECK_LYD_VALUE_INT8(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_INT8, (NODE).realtype->basetype); \
assert_int_equal(VALUE, (NODE).int8);
#define CHECK_LYD_VALUE_INT16(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_INT16, (NODE).realtype->basetype); \
assert_int_equal(VALUE, (NODE).int16);
#define CHECK_LYD_VALUE_UINT8(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_UINT8, (NODE).realtype->basetype); \
assert_int_equal(VALUE, (NODE).uint8);
#define CHECK_LYD_VALUE_UINT32(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_UINT32, (NODE).realtype->basetype); \
assert_int_equal(VALUE, (NODE).uint32);
#define CHECK_LYD_VALUE_STRING(NODE, CANNONICAL_VAL) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_STRING, (NODE).realtype->basetype);
#define CHECK_LYD_VALUE_LEAFREF(NODE, CANNONICAL_VAL) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_LEAFREF, (NODE).realtype->basetype); \
assert_non_null((NODE).ptr)
#define CHECK_LYD_VALUE_DEC64(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_DEC64, (NODE).realtype->basetype); \
assert_int_equal(VALUE, (NODE).dec64);
#define CHECK_LYD_VALUE_BINARY(NODE, CANNONICAL_VAL, VALUE, SIZE) \
{ \
struct lyd_value_binary *_val; \
LYD_VALUE_GET(&(NODE), _val); \
assert_int_equal(_val->size, SIZE); \
assert_int_equal(0, memcmp(_val->data, VALUE, SIZE)); \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_BINARY, (NODE).realtype->basetype); \
}
#define CHECK_LYD_VALUE_BOOL(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_BOOL, (NODE).realtype->basetype); \
assert_int_equal(VALUE, (NODE).boolean);
#define CHECK_LYD_VALUE_IDENT(NODE, CANNONICAL_VAL, VALUE) \
assert_non_null((NODE).realtype->plugin->print(UTEST_LYCTX, &(NODE), LY_VALUE_CANON, NULL, NULL, NULL)); \
assert_string_equal((NODE)._canonical, CANNONICAL_VAL); \
assert_non_null((NODE).realtype); \
assert_int_equal(LY_TYPE_IDENT, (NODE).realtype->basetype); \
assert_string_equal(VALUE, (NODE).ident->name);
#define UTEST_INVALID_MODULE(DATA, FORMAT, FEATURES, RET_VAL) \
{ \
struct lys_module *mod; \
assert_int_equal(LY_SUCCESS, ly_in_new_memory(DATA, &_UC->in)); \
assert_int_equal(RET_VAL, lys_parse(_UC->ctx, _UC->in, FORMAT, FEATURES, &mod)); \
assert_null(mod); \
} \
ly_in_free(_UC->in, 0); \
_UC->in = NULL; \
#define UTEST_ADD_MODULE(DATA, FORMAT, FEATURES, MOD) \
assert_int_equal(LY_SUCCESS, ly_in_new_memory(DATA, &_UC->in)); \
{ \
LY_ERR __r = lys_parse(_UC->ctx, _UC->in, FORMAT, FEATURES, MOD); \
if (__r != LY_SUCCESS) { \
print_message("[ MSG ] Module parsing failed:\n"); \
for (const struct ly_err_item *e = ly_err_first(_UC->ctx); e; e = e->next) { \
print_message("[ MSG ] \t%s Schema path %s\n", e->msg, e->schema_path); \
} \
fail(); \
} \
} \
ly_in_free(_UC->in, 0); \
_UC->in = NULL
#define CHECK_LOG_LASTMSG(MSG) \
CHECK_STRING(ly_last_logmsg(), MSG)
#define CHECK_LOG_CTX(MSG, PATH, LINE) \
{ \
struct ly_err_item *_e = (struct ly_err_item *)ly_err_last(_UC->ctx); \
if (!MSG) { \
assert_null(_e); \
} else { \
assert_non_null(_e); \
CHECK_STRING(_e->msg, MSG); \
if (_e->data_path) { \
CHECK_STRING(_e->data_path, PATH); \
} else { \
CHECK_STRING(_e->schema_path, PATH); \
} \
assert_int_equal(_e->line, LINE); \
} \
ly_err_clean(_UC->ctx, _e); \
}
#define CHECK_LOG_CTX_APPTAG(MSG, PATH, LINE, APPTAG) \
{ \
struct ly_err_item *_e = (struct ly_err_item *)ly_err_last(_UC->ctx); \
if (!MSG) { \
assert_null(_e); \
} else { \
assert_non_null(_e); \
CHECK_STRING(_e->msg, MSG); \
if (_e->data_path) { \
CHECK_STRING(_e->data_path, PATH); \
} else { \
CHECK_STRING(_e->schema_path, PATH); \
} \
assert_int_equal(_e->line, LINE); \
CHECK_STRING(_e->apptag, APPTAG); \
} \
ly_err_clean(_UC->ctx, _e); \
}
#define UTEST_LOG_CTX_CLEAN \
ly_err_clean(_UC->ctx, NULL)
#ifdef _UTEST_MAIN_
struct utest_context *current_utest_context;
static int
utest_setup(void **state)
{
char *cur_tz;
ly_log_options( LY_LOSTORE);
current_utest_context = calloc(1, sizeof *current_utest_context);
assert_non_null(current_utest_context);
*state = current_utest_context;
assert_int_equal(LY_SUCCESS, ly_ctx_new(NULL, 0, ¤t_utest_context->ctx));
cur_tz = getenv("TZ");
if (cur_tz) {
current_utest_context->orig_tz = strdup(cur_tz);
}
setenv("TZ", "CET+02:00", 1);
return 0;
}
#define UTEST_SETUP \
assert_int_equal(0, utest_setup(state))
static int
utest_teardown(void **state)
{
*state = NULL;
assert_null(ly_err_last(current_utest_context->ctx));
ly_ctx_destroy(current_utest_context->ctx);
if (current_utest_context->orig_tz) {
setenv("TZ", current_utest_context->orig_tz, 1);
}
ly_in_free(current_utest_context->in, 0);
free(current_utest_context->orig_tz);
free(current_utest_context);
current_utest_context = NULL;
return 0;
}
#define UTEST_TEARDOWN \
assert_int_equal(0, utest_teardown(state))
#define _UTEST_SETUP_TEARDOWN(FUNC, SETUP, TEARDOWN) \
cmocka_unit_test_setup_teardown(FUNC, SETUP, TEARDOWN)
#define _UTEST_SETUP(FUNC, SETUP) \
cmocka_unit_test_setup_teardown(FUNC, SETUP, utest_teardown)
#define _UTEST(FUNC) \
cmocka_unit_test_setup_teardown(FUNC, utest_setup, utest_teardown)
#define _GET_UTEST_MACRO(_1, _2, _3, NAME, ...) NAME
#define UTEST(...) \
_GET_UTEST_MACRO(__VA_ARGS__, _UTEST_SETUP_TEARDOWN, _UTEST_SETUP, _UTEST, DUMMY)(__VA_ARGS__)
#else
extern struct utest_context *current_utest_context;
#endif
#endif