|
Packit |
8fb591 |
/**
|
|
Packit |
8fb591 |
* @file test_lyb.c
|
|
Packit |
8fb591 |
* @author Michal Vasko <mvasko@cesnet.cz>
|
|
Packit |
8fb591 |
* @brief Cmocka tests for LYB binary data format.
|
|
Packit |
8fb591 |
*
|
|
Packit |
8fb591 |
* Copyright (c) 2018 CESNET, z.s.p.o.
|
|
Packit |
8fb591 |
*
|
|
Packit |
8fb591 |
* This source code is licensed under BSD 3-Clause License (the "License").
|
|
Packit |
8fb591 |
* You may not use this file except in compliance with the License.
|
|
Packit |
8fb591 |
* You may obtain a copy of the License at
|
|
Packit |
8fb591 |
*
|
|
Packit |
8fb591 |
* https://opensource.org/licenses/BSD-3-Clause
|
|
Packit |
8fb591 |
*/
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
#include <stdio.h>
|
|
Packit |
8fb591 |
#include <stdlib.h>
|
|
Packit |
8fb591 |
#include <string.h>
|
|
Packit |
8fb591 |
#include <setjmp.h>
|
|
Packit |
8fb591 |
#include <stdarg.h>
|
|
Packit |
8fb591 |
#include <cmocka.h>
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
#include "tests/config.h"
|
|
Packit |
8fb591 |
#include "libyang.h"
|
|
Packit |
8fb591 |
#include "tree_internal.h"
|
|
Packit |
8fb591 |
#include "hash_table.h"
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
struct state {
|
|
Packit |
8fb591 |
struct ly_ctx *ctx;
|
|
Packit |
8fb591 |
struct lyd_node *dt1, *dt2;
|
|
Packit |
8fb591 |
char *mem;
|
|
Packit |
8fb591 |
};
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
check_data_tree_next(struct lyd_node **start, struct lyd_node **next, struct lyd_node **elem)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
if (*elem) {
|
|
Packit |
8fb591 |
goto loop_next;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
loop_begin:
|
|
Packit |
8fb591 |
LY_TREE_DFS_BEGIN(*start, *next, *elem) {
|
|
Packit |
8fb591 |
return;
|
|
Packit |
8fb591 |
loop_next:
|
|
Packit |
8fb591 |
LY_TREE_DFS_END(*start, *next, *elem);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
if (!*next) {
|
|
Packit |
8fb591 |
/* top-level siblings */
|
|
Packit |
8fb591 |
*start = (*start)->next;
|
|
Packit |
8fb591 |
if (!(*start)) {
|
|
Packit |
8fb591 |
*elem = NULL;
|
|
Packit |
8fb591 |
return;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
goto loop_begin;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
return;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
check_data_tree(struct lyd_node *root1, struct lyd_node *root2)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct lyd_node *next1, *next2, *elem1 = NULL, *elem2 = NULL, *iter;
|
|
Packit |
8fb591 |
struct lyd_attr *attr1, *attr2;
|
|
Packit |
8fb591 |
struct lyd_node_leaf_list *leaf1, *leaf2;
|
|
Packit |
8fb591 |
struct lyd_node_anydata *any1, *any2;
|
|
Packit |
8fb591 |
#ifdef LY_ENABLED_CACHE
|
|
Packit |
8fb591 |
uint32_t i1, i2;
|
|
Packit |
8fb591 |
#endif
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
for (check_data_tree_next(&root1, &next1, &elem1), check_data_tree_next(&root2, &next2, &elem2);
|
|
Packit |
8fb591 |
elem1 && elem2;
|
|
Packit |
8fb591 |
check_data_tree_next(&root1, &next1, &elem1), check_data_tree_next(&root2, &next2, &elem2)) {
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
if (elem1->schema != elem2->schema) {
|
|
Packit |
8fb591 |
fprintf(stderr, "Schema mismatch (\"%s\" and \"%s\").\n", elem1->schema->name, elem2->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* check common data node attributes */
|
|
Packit |
8fb591 |
if (elem1->validity != elem2->validity) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": validity flags mismatch (\"%u\" and \"%u\").\n", elem1->schema->name, elem1->validity, elem2->validity);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
} else if (elem1->dflt != elem2->dflt) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": dflt flag mismatch (\"%u\" and \"%u\").\n", elem1->schema->name, elem1->dflt, elem2->dflt);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
} else if (elem1->when_status != elem2->when_status) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": when flags mismatch (\"%u\" and \"%u\").\n", elem1->schema->name, elem1->when_status, elem2->when_status);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* check data node attributes */
|
|
Packit |
8fb591 |
for (attr1 = elem1->attr, attr2 = elem2->attr; attr1 && attr2; attr1 = attr1->next, attr2 = attr2->next) {
|
|
Packit |
8fb591 |
if (attr1->annotation != attr2->annotation) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr annotation mismatch.\n", elem1->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (strcmp(attr1->name, attr2->name)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr name mismatch (\"%s\" and \"%s\").\n", elem1->schema->name, attr1->name, attr2->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (strcmp(attr1->value_str, attr2->value_str)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr value_str mismatch (\"%s\" and \"%s\").\n", elem1->schema->name, attr1->value_str, attr2->value_str);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
switch (attr1->value_type) {
|
|
Packit |
8fb591 |
case LY_TYPE_BITS:
|
|
Packit |
8fb591 |
case LY_TYPE_INST:
|
|
Packit |
8fb591 |
case LY_TYPE_LEAFREF:
|
|
Packit |
8fb591 |
/* do not compare pointers */
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
default:
|
|
Packit |
8fb591 |
if ((attr1->value.uint64 != attr2->value.uint64) && !(attr1->value_flags & LY_VALUE_USER)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr value mismatch (\"%lu\" and \"%lu\").\n", elem1->schema->name, attr1->value.uint64, attr2->value.uint64);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (attr1->value_type != attr2->value_type) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr value_type mismatch (\"%d\" and \"%d\").\n", elem1->schema->name, attr1->value_type, attr2->value_type);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (attr1->value_flags != attr2->value_flags) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr value_flags mismatch (\"%d\" and \"%d\").\n", elem1->schema->name, attr1->value_flags, attr2->value_flags);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (attr1) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr mismatch (\"%s\" and \"NULL\").\n", elem1->schema->name, attr1->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (attr2) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr mismatch (\"NULL\" and \"%s\").\n", elem1->schema->name, attr2->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* check specific data node attributes */
|
|
Packit |
8fb591 |
switch (elem1->schema->nodetype) {
|
|
Packit |
8fb591 |
case LYS_CONTAINER:
|
|
Packit |
8fb591 |
case LYS_LIST:
|
|
Packit |
8fb591 |
case LYS_RPC:
|
|
Packit |
8fb591 |
case LYS_ACTION:
|
|
Packit |
8fb591 |
case LYS_NOTIF:
|
|
Packit |
8fb591 |
#ifdef LY_ENABLED_CACHE
|
|
Packit |
8fb591 |
i1 = 0;
|
|
Packit |
8fb591 |
LY_TREE_FOR(elem1->child, iter) {
|
|
Packit |
8fb591 |
++i1;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
i2 = 0;
|
|
Packit |
8fb591 |
LY_TREE_FOR(elem2->child, iter) {
|
|
Packit |
8fb591 |
++i2;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
if (i1 != i2) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": child count mismatch (%u and %u).\n", elem1->schema->name, i1, i2);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
if (i1 >= LY_CACHE_HT_MIN_CHILDREN) {
|
|
Packit |
8fb591 |
if (!elem1->ht || !elem2->ht) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": missing hash table (%p and %p).\n", elem1->schema->name, elem1->ht, elem2->ht);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
LY_TREE_FOR(elem1->child, iter) {
|
|
Packit |
8fb591 |
if (lyht_find(elem1->ht, &iter, iter->hash, NULL)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": missing child \"%s\" in the hash table 1.\n", elem1->schema->name, iter->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
LY_TREE_FOR(elem2->child, iter) {
|
|
Packit |
8fb591 |
if (lyht_find(elem2->ht, &iter, iter->hash, NULL)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": missing child \"%s\" in the hash table 2.\n", elem1->schema->name, iter->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
#endif
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
case LYS_LEAF:
|
|
Packit |
8fb591 |
case LYS_LEAFLIST:
|
|
Packit |
8fb591 |
leaf1 = (struct lyd_node_leaf_list *)elem1;
|
|
Packit |
8fb591 |
leaf2 = (struct lyd_node_leaf_list *)elem2;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* both should be in the same dictionary */
|
|
Packit |
8fb591 |
if (leaf1->value_str != leaf2->value_str) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": value_str mismatch (\"%s\" and \"%s\").\n", elem1->schema->name, leaf1->value_str, leaf2->value_str);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
switch (leaf1->value_type) {
|
|
Packit |
8fb591 |
case LY_TYPE_BITS:
|
|
Packit |
8fb591 |
case LY_TYPE_INST:
|
|
Packit |
8fb591 |
case LY_TYPE_LEAFREF:
|
|
Packit |
8fb591 |
/* do not compare pointers */
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
default:
|
|
Packit |
8fb591 |
if ((leaf1->value.uint64 != leaf2->value.uint64) && !(leaf1->value_flags & LY_VALUE_USER)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": value mismatch (\"%lu\" and \"%lu\").\n", elem1->schema->name, leaf1->value.uint64, leaf2->value.uint64);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (leaf1->value_type != leaf2->value_type) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": value_type mismatch (\"%d\" and \"%d\").\n", elem1->schema->name, leaf1->value_type, leaf2->value_type);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (leaf1->value_flags != leaf2->value_flags) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": attr value_flags mismatch (\"%d\" and \"%d\").\n", elem1->schema->name, leaf1->value_flags, leaf2->value_flags);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
case LYS_ANYDATA:
|
|
Packit |
8fb591 |
case LYS_ANYXML:
|
|
Packit |
8fb591 |
any1 = (struct lyd_node_anydata *)elem1;
|
|
Packit |
8fb591 |
any2 = (struct lyd_node_anydata *)elem2;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* if we had to do conversion from XML, skip it, assume it was done correctly */
|
|
Packit |
8fb591 |
if ((any1->value_type != LYD_ANYDATA_XML) && (any2->value_type != LYD_ANYDATA_XML)) {
|
|
Packit |
8fb591 |
if (any1->value_type != any2->value_type) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": value_type mismatch (\"%d\" and \"%d\").\n", elem1->schema->name, any1->value_type, any2->value_type);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (any1->value_type == LYD_ANYDATA_DATATREE) {
|
|
Packit |
8fb591 |
check_data_tree(any1->value.tree, any2->value.tree);
|
|
Packit |
8fb591 |
} else if (strcmp(any1->value.str, any2->value.str)) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": value mismatch\n\"\"%s\"\"\nand\n\"\"%s\"\"\n", elem1->schema->name, any1->value.str, any2->value.str);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
break;
|
|
Packit |
8fb591 |
default:
|
|
Packit |
8fb591 |
fprintf(stderr, "Unexpected data node type.\n");
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
#ifdef LY_ENABLED_CACHE
|
|
Packit |
8fb591 |
if (!elem1->hash) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": hash not calculated.\n", elem1->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (elem1->hash != elem2->hash) {
|
|
Packit |
8fb591 |
fprintf(stderr, "\"%s\": hashes do not match (%u and %u).\n", elem1->schema->name, elem1->hash, elem2->hash);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
#endif
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
if (elem1) {
|
|
Packit |
8fb591 |
fprintf(stderr, "Schema mismatch (\"%s\" and \"NULL\").\n", elem1->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
if (elem2) {
|
|
Packit |
8fb591 |
fprintf(stderr, "Schema mismatch (\"NULL\" and \"%s\").\n", elem2->schema->name);
|
|
Packit |
8fb591 |
fail();
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static int
|
|
Packit |
8fb591 |
setup_f(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
(*state) = st = calloc(1, sizeof *st);
|
|
Packit |
8fb591 |
if (!st) {
|
|
Packit |
8fb591 |
fprintf(stderr, "Memory allocation error");
|
|
Packit |
8fb591 |
return -1;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* libyang context */
|
|
Packit |
8fb591 |
st->ctx = ly_ctx_new(TESTS_DIR"/schema/yang/ietf/", 0);
|
|
Packit |
8fb591 |
if (!st->ctx) {
|
|
Packit |
8fb591 |
fprintf(stderr, "Failed to create context.\n");
|
|
Packit |
8fb591 |
return -1;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
return 0;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static int
|
|
Packit |
8fb591 |
teardown_f(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
lyd_free_withsiblings(st->dt1);
|
|
Packit |
8fb591 |
lyd_free_withsiblings(st->dt2);
|
|
Packit |
8fb591 |
ly_ctx_destroy(st->ctx, NULL);
|
|
Packit |
8fb591 |
free(st->mem);
|
|
Packit |
8fb591 |
free(st);
|
|
Packit |
8fb591 |
(*state) = NULL;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
return 0;
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_ietf_interfaces(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "ietf-ip", NULL));
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "iana-if-type", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/ietf-interfaces.json", LYD_JSON, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_origin(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
const char *test_origin =
|
|
Packit |
8fb591 |
"module test-origin {"
|
|
Packit |
8fb591 |
" namespace \"urn:test-origin\";"
|
|
Packit |
8fb591 |
" prefix to;"
|
|
Packit |
8fb591 |
" import ietf-origin {"
|
|
Packit |
8fb591 |
" prefix or;"
|
|
Packit |
8fb591 |
" }"
|
|
Packit |
8fb591 |
""
|
|
Packit |
8fb591 |
" container cont {"
|
|
Packit |
8fb591 |
" leaf leaf1 {"
|
|
Packit |
8fb591 |
" type string;"
|
|
Packit |
8fb591 |
" }"
|
|
Packit |
8fb591 |
" leaf leaf2 {"
|
|
Packit |
8fb591 |
" type string;"
|
|
Packit |
8fb591 |
" }"
|
|
Packit |
8fb591 |
" leaf leaf3 {"
|
|
Packit |
8fb591 |
" type uint8;"
|
|
Packit |
8fb591 |
" }"
|
|
Packit |
8fb591 |
" }"
|
|
Packit |
8fb591 |
"}";
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
assert_non_null(lys_parse_mem(st->ctx, test_origin, LYS_YANG));
|
|
Packit |
8fb591 |
lys_set_implemented(ly_ctx_get_module(st->ctx, "ietf-origin", NULL, 0));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/test-origin.json", LYD_JSON, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_statements(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "statements", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/statements.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_types(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "types", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/types.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_annotations(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "annotations", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/annotations.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_similar_annot_names(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "annotations", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/similar-annot-names.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_many_child_annot(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "annotations", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/many-childs-annot.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_union(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "union", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/union.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_union2(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "statements", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/union2.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_collisions(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "annotations", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/collisions.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_anydata(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
const struct lys_module *mod;
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
const char *test_anydata =
|
|
Packit |
8fb591 |
"module test-anydata {"
|
|
Packit |
8fb591 |
" namespace \"urn:test-anydata\";"
|
|
Packit |
8fb591 |
" prefix ya;"
|
|
Packit |
8fb591 |
""
|
|
Packit |
8fb591 |
" container cont {"
|
|
Packit |
8fb591 |
" anydata ntf;"
|
|
Packit |
8fb591 |
" }"
|
|
Packit |
8fb591 |
"}";
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "ietf-netconf-notifications", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/ietf-netconf-notifications.json", LYD_JSON, LYD_OPT_NOTIF | LYD_OPT_TRUSTED, NULL);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* get notification in LYB format to set as anydata content */
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
lyd_free_withsiblings(st->dt1);
|
|
Packit |
8fb591 |
st->dt1 = NULL;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* now comes the real test, test anydata */
|
|
Packit |
8fb591 |
mod = lys_parse_mem(st->ctx, test_anydata, LYS_YANG);
|
|
Packit |
8fb591 |
assert_non_null(mod);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_new(NULL, mod, "cont");
|
|
Packit |
8fb591 |
assert_non_null(st->dt1);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
assert_non_null(lyd_new_anydata(st->dt1, NULL, "ntf", st->mem, LYD_ANYDATA_LYBD));
|
|
Packit |
8fb591 |
st->mem = NULL;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_validate(&st->dt1, LYD_OPT_CONFIG, NULL);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* and also test the embedded notification itself */
|
|
Packit |
8fb591 |
free(st->mem);
|
|
Packit |
8fb591 |
ret = lyd_lyb_data_length(((struct lyd_node_anydata *)st->dt1->child)->value.mem);
|
|
Packit |
8fb591 |
st->mem = malloc(ret);
|
|
Packit |
8fb591 |
memcpy(st->mem, ((struct lyd_node_anydata *)st->dt1->child)->value.mem, ret);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
lyd_free_withsiblings(st->dt2);
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_NOTIF | LYD_OPT_STRICT | LYD_OPT_NOEXTDEPS, NULL);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
/* parse the JSON again for this comparison */
|
|
Packit |
8fb591 |
lyd_free_withsiblings(st->dt1);
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/ietf-netconf-notifications.json", LYD_JSON, LYD_OPT_NOTIF | LYD_OPT_TRUSTED, NULL);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_submodule_feature(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
const struct lys_module *mod;
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
mod = ly_ctx_load_module(st->ctx, "feature-submodule-main", NULL);
|
|
Packit |
8fb591 |
assert_non_null(mod);
|
|
Packit |
8fb591 |
assert_int_equal(lys_features_enable(mod, "test-submodule-feature"), 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/test-submodule-feature.json", LYD_JSON, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_coliding_augments(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "augment-target", NULL));
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "augment0", NULL));
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "augment1", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/augment.xml", LYD_XML, LYD_OPT_CONFIG);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
static void
|
|
Packit |
8fb591 |
test_leafrefs(void **state)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
struct state *st = (*state);
|
|
Packit |
8fb591 |
int ret;
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ly_ctx_set_searchdir(st->ctx, TESTS_DIR"/data/files");
|
|
Packit |
8fb591 |
assert_non_null(ly_ctx_load_module(st->ctx, "leafrefs2", NULL));
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt1 = lyd_parse_path(st->ctx, TESTS_DIR"/data/files/leafrefs2.json", LYD_JSON, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt1, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
ret = lyd_print_mem(&st->mem, st->dt1, LYD_LYB, LYP_WITHSIBLINGS);
|
|
Packit |
8fb591 |
assert_int_equal(ret, 0);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
st->dt2 = lyd_parse_mem(st->ctx, st->mem, LYD_LYB, LYD_OPT_CONFIG | LYD_OPT_STRICT);
|
|
Packit |
8fb591 |
assert_ptr_not_equal(st->dt2, NULL);
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
check_data_tree(st->dt1, st->dt2);
|
|
Packit |
8fb591 |
}
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
int
|
|
Packit |
8fb591 |
main(void)
|
|
Packit |
8fb591 |
{
|
|
Packit |
8fb591 |
const struct CMUnitTest tests[] = {
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_ietf_interfaces, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_origin, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_statements, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_types, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_annotations, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_similar_annot_names, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_many_child_annot, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_union, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_union2, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_collisions, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_anydata, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_submodule_feature, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_coliding_augments, setup_f, teardown_f),
|
|
Packit |
8fb591 |
cmocka_unit_test_setup_teardown(test_leafrefs, setup_f, teardown_f),
|
|
Packit |
8fb591 |
};
|
|
Packit |
8fb591 |
|
|
Packit |
8fb591 |
return cmocka_run_group_tests(tests, NULL, NULL);
|
|
Packit |
8fb591 |
}
|