blob: e1507f45a49cc7b4068ef36263419b4b532cd955 [file] [log] [blame]
Michal Vasko004d3152020-06-11 19:59:22 +02001/**
Radek Krejci1f05b6a2019-07-18 16:15:06 +02002 * @file test_tree_schema.c
3 * @author: Radek Krejci <rkrejci@cesnet.cz>
4 * @brief unit tests for functions from tress_data.c
5 *
6 * Copyright (c) 2018-2019 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
Michal Vasko38c2ba72020-07-27 14:46:59 +020015#include "common.h"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010016#include "libyang.h"
Michal Vasko38c2ba72020-07-27 14:46:59 +020017#include "path.h"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010018#include "utests.h"
Michal Vasko38c2ba72020-07-27 14:46:59 +020019#include "xpath.h"
Radek Krejci1f05b6a2019-07-18 16:15:06 +020020
21#define BUFSIZE 1024
22char logbuf[BUFSIZE] = {0};
23int store = -1; /* negative for infinite logging, positive for limited logging */
24
25struct ly_ctx *ctx; /* context for tests */
26
27/* set to 0 to printing error messages to stderr instead of checking them in code */
28#define ENABLE_LOGGER_CHECKING 1
29
30#if ENABLE_LOGGER_CHECKING
31static void
32logger(LY_LOG_LEVEL level, const char *msg, const char *path)
33{
34 (void) level; /* unused */
35 if (store) {
36 if (path && path[0]) {
37 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
38 } else {
39 strncpy(logbuf, msg, BUFSIZE - 1);
40 }
41 if (store > 0) {
42 --store;
43 }
44 }
45}
Radek Krejcib4ac5a92020-11-23 17:54:33 +010046
Radek Krejci1f05b6a2019-07-18 16:15:06 +020047#endif
48
49static int
50setup(void **state)
51{
52 (void) state; /* unused */
53
54 const char *schema_a = "module a {namespace urn:tests:a;prefix a;yang-version 1.1;"
Radek Krejcica989142020-11-05 11:32:22 +010055 "leaf bar {type string;}"
Radek Krejci1f05b6a2019-07-18 16:15:06 +020056 "list l1 { key \"a b\"; leaf a {type string;} leaf b {type string;} leaf c {type string;}}"
57 "leaf foo { type string;}"
58 "leaf-list ll { type string;}"
59 "container c {leaf-list x {type string;}}"
60 "anydata any {config false;}"
Michal Vasko38c2ba72020-07-27 14:46:59 +020061 "list l2 {config false;"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010062 " container c{leaf x {type string;} leaf-list d {type string;}}"
Michal Vasko38c2ba72020-07-27 14:46:59 +020063 "}}";
Radek Krejci1f05b6a2019-07-18 16:15:06 +020064
65#if ENABLE_LOGGER_CHECKING
66 ly_set_log_clb(logger, 1);
67#endif
68
69 assert_int_equal(LY_SUCCESS, ly_ctx_new(NULL, 0, &ctx));
Michal Vasko3a41dff2020-07-15 14:30:28 +020070 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_a, LYS_IN_YANG, NULL));
Radek Krejci1f05b6a2019-07-18 16:15:06 +020071
72 return 0;
73}
74
75static int
76teardown(void **state)
77{
78#if ENABLE_LOGGER_CHECKING
79 if (*state) {
80 fprintf(stderr, "%s\n", logbuf);
81 }
82#else
83 (void) state; /* unused */
84#endif
85
86 ly_ctx_destroy(ctx, NULL);
87 ctx = NULL;
88
89 return 0;
90}
91
92void
93logbuf_clean(void)
94{
95 logbuf[0] = '\0';
96}
97
98#if ENABLE_LOGGER_CHECKING
99# define logbuf_assert(str) assert_string_equal(logbuf, str)
100#else
101# define logbuf_assert(str)
102#endif
103
104static void
105test_compare(void **state)
106{
107 *state = test_compare;
108
109 struct lyd_node *tree1, *tree2;
110
111 const char *data1 = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b><c>x</c></l1>";
112 const char *data2 = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b><c>y</c></l1>";
113
Michal Vasko8f359bf2020-07-28 10:41:15 +0200114 assert_int_equal(LY_SUCCESS, lyd_compare_single(NULL, NULL, 0));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200115
Radek Krejci7931b192020-06-25 17:05:03 +0200116 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
117 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data2, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree2));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200118 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, 0));
119 assert_int_equal(LY_ENOT, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100120 assert_int_equal(LY_ENOT, lyd_compare_single(((struct lyd_node_inner *)tree1)->child, tree2, 0));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200121 lyd_free_all(tree1);
122 lyd_free_all(tree2);
123
124 data1 = "<l2 xmlns=\"urn:tests:a\"><c><x>a</x></c></l2><l2 xmlns=\"urn:tests:a\"><c><x>b</x></c></l2>";
125 data2 = "<l2 xmlns=\"urn:tests:a\"><c><x>b</x></c></l2>";
Radek Krejci7931b192020-06-25 17:05:03 +0200126 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
127 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data2, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree2));
Michal Vasko26123192020-11-09 21:02:34 +0100128 assert_int_equal(LY_ENOT, lyd_compare_single(tree1->next, tree2->next, 0));
129 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1->next->next, tree2->next, 0));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200130 lyd_free_all(tree1);
131 lyd_free_all(tree2);
132
133 data1 = "<ll xmlns=\"urn:tests:a\">a</ll><ll xmlns=\"urn:tests:a\">b</ll>";
134 data2 = "<ll xmlns=\"urn:tests:a\">b</ll>";
Radek Krejci7931b192020-06-25 17:05:03 +0200135 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
136 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data2, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree2));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200137 assert_int_equal(LY_ENOT, lyd_compare_single(tree1, tree2, 0));
138 assert_int_equal(LY_ENOT, lyd_compare_single(NULL, tree2, 0));
139 assert_int_equal(LY_ENOT, lyd_compare_single(tree1, NULL, 0));
140 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1->next, tree2, 0));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200141 lyd_free_all(tree1);
142 lyd_free_all(tree2);
143
144 data1 = "<c xmlns=\"urn:tests:a\"><x>x</x></c>";
145 data2 = "<c xmlns=\"urn:tests:a\"><x>y</x></c>";
Radek Krejci7931b192020-06-25 17:05:03 +0200146 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
147 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data2, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree2));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200148 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, 0));
149 assert_int_equal(LY_ENOT, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200150 lyd_free_all(tree1);
151 lyd_free_all(tree2);
152
153 data1 = "<c xmlns=\"urn:tests:a\"><x>x</x></c>";
154 data2 = "<c xmlns=\"urn:tests:a\"><x>x</x><x>y</x></c>";
Radek Krejci7931b192020-06-25 17:05:03 +0200155 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
156 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data2, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree2));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200157 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, 0));
158 assert_int_equal(LY_ENOT, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200159 lyd_free_all(tree1);
160 lyd_free_all(tree2);
161
162 data1 = "<any xmlns=\"urn:tests:a\"><x>x</x></any>";
163 data2 = "<any xmlns=\"urn:tests:a\"><x>x</x><x>y</x></any>";
Radek Krejci7931b192020-06-25 17:05:03 +0200164 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
165 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data2, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree2));
Michal Vasko26123192020-11-09 21:02:34 +0100166 assert_int_equal(LY_ENOT, lyd_compare_single(tree1->next, tree2->next, 0));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200167 lyd_free_all(tree1);
168 data1 = "<any xmlns=\"urn:tests:a\"><x>x</x><x>y</x></any>";
Radek Krejci7931b192020-06-25 17:05:03 +0200169 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data1, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200170 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, 0));
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200171 lyd_free_all(tree1);
172 lyd_free_all(tree2);
173
174 *state = NULL;
175}
176
Radek Krejci22ebdba2019-07-25 13:59:43 +0200177static void
178test_dup(void **state)
179{
180 *state = test_dup;
181
182 struct lyd_node *tree1, *tree2;
183 const char *result;
184 const char *data = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b><c>x</c></l1>";
185
Radek Krejci7931b192020-06-25 17:05:03 +0200186 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200187 assert_int_equal(LY_SUCCESS, lyd_dup_single(tree1, NULL, LYD_DUP_RECURSIVE, &tree2));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200188 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200189 lyd_free_all(tree1);
190 lyd_free_all(tree2);
191
192 data = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b><c>x</c></l1>";
193 result = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b></l1>";
Radek Krejci7931b192020-06-25 17:05:03 +0200194 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200195 assert_int_equal(LY_SUCCESS, lyd_dup_single(tree1, NULL, 0, &tree2));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200196 lyd_free_all(tree1);
Radek Krejci7931b192020-06-25 17:05:03 +0200197 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, result, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200198 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200199 lyd_free_all(tree1);
200 lyd_free_all(tree2);
201
202 data = "<l2 xmlns=\"urn:tests:a\"><c><x>a</x></c></l2><l2 xmlns=\"urn:tests:a\"><c><x>b</x></c></l2>";
203 result = "<l2 xmlns=\"urn:tests:a\"><c><x>a</x></c></l2>";
Radek Krejci7931b192020-06-25 17:05:03 +0200204 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200205 assert_int_equal(LY_SUCCESS, lyd_dup_siblings(tree1, NULL, LYD_DUP_RECURSIVE, &tree2));
Michal Vasko26123192020-11-09 21:02:34 +0100206 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1->next, tree2->next, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200207 lyd_free_all(tree2);
Michal Vasko26123192020-11-09 21:02:34 +0100208 assert_int_equal(LY_SUCCESS, lyd_dup_single(tree1->next, NULL, LYD_DUP_RECURSIVE, &tree2));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200209 lyd_free_all(tree1);
Radek Krejci7931b192020-06-25 17:05:03 +0200210 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, result, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko26123192020-11-09 21:02:34 +0100211 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1->next, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200212 lyd_free_all(tree2);
213
Michal Vasko26123192020-11-09 21:02:34 +0100214 assert_int_equal(LY_SUCCESS, lyd_dup_single(tree1->next, NULL, 0, &tree2));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200215 lyd_free_all(tree1);
216 result = "<l2 xmlns=\"urn:tests:a\"/>";
Radek Krejci7931b192020-06-25 17:05:03 +0200217 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, result, LYD_XML, LYD_PARSE_ONLY, 0, &tree1));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200218 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200219 lyd_free_all(tree1);
220 lyd_free_all(tree2);
221
222 data = "<any xmlns=\"urn:tests:a\"><c><a>a</a></c></any>";
Radek Krejci7931b192020-06-25 17:05:03 +0200223 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200224 assert_int_equal(LY_SUCCESS, lyd_dup_single(tree1, NULL, 0, &tree2));
Michal Vasko8f359bf2020-07-28 10:41:15 +0200225 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200226 lyd_free_all(tree1);
227 lyd_free_all(tree2);
228
229 data = "<l2 xmlns=\"urn:tests:a\"><c><x>b</x></c></l2>";
Radek Krejci7931b192020-06-25 17:05:03 +0200230 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100231 assert_int_equal(LY_SUCCESS, lyd_dup_single(((struct lyd_node_inner *)((struct lyd_node_inner *)tree1->next)->child)->child, NULL,
232 LYD_DUP_WITH_PARENTS, &tree2));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200233 assert_string_equal("x", tree2->schema->name);
234 assert_non_null(tree2->parent);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100235 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1->next, (struct lyd_node *)tree2->parent->parent,
Michal Vasko26123192020-11-09 21:02:34 +0100236 LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200237 lyd_free_all(tree1);
238 lyd_free_all(tree2);
239
240 data = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b><c>c</c></l1>";
Radek Krejci7931b192020-06-25 17:05:03 +0200241 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100242 assert_int_equal(LY_SUCCESS, lyd_dup_single(((struct lyd_node_inner *)tree1)->child->prev, NULL,
243 LYD_DUP_WITH_PARENTS, &tree2));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200244 assert_string_equal("c", tree2->schema->name);
245 assert_non_null(tree2->parent);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100246 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1, (struct lyd_node *)tree2->parent, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200247 lyd_free_all(tree1);
248 lyd_free_all(tree2);
249
250 data = "<l2 xmlns=\"urn:tests:a\"><c><x>b</x></c></l2>";
Radek Krejci7931b192020-06-25 17:05:03 +0200251 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Michal Vasko26123192020-11-09 21:02:34 +0100252 assert_int_equal(LY_SUCCESS, lyd_dup_single(tree1->next, NULL, 0, &tree2));
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100253 assert_int_equal(LY_SUCCESS, lyd_dup_single(((struct lyd_node_inner *)((struct lyd_node_inner *)tree1->next)->child)->child,
254 (struct lyd_node_inner *)tree2, LYD_DUP_WITH_PARENTS, NULL));
Michal Vasko26123192020-11-09 21:02:34 +0100255 assert_int_equal(LY_SUCCESS, lyd_compare_single(tree1->next, tree2, LYD_COMPARE_FULL_RECURSION));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200256 lyd_free_all(tree1);
257 lyd_free_all(tree2);
258
259 /* invalid */
260 data = "<l1 xmlns=\"urn:tests:a\"><a>a</a><b>b</b><c>c</c></l1><l2 xmlns=\"urn:tests:a\"><c><x>b</x></c></l2>";
Radek Krejci7931b192020-06-25 17:05:03 +0200261 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree1));
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100262 assert_int_equal(LY_EINVAL, lyd_dup_single(((struct lyd_node_inner *)tree1)->child->prev,
263 (struct lyd_node_inner *)tree1->next, LYD_DUP_WITH_PARENTS, NULL));
Radek Krejci22ebdba2019-07-25 13:59:43 +0200264 lyd_free_all(tree1);
265
266 *state = NULL;
267}
268
Michal Vasko38c2ba72020-07-27 14:46:59 +0200269static void
270test_target(void **state)
271{
272 *state = test_target;
273
274 const struct lyd_node_term *term;
275 struct lyd_node *tree;
276 struct lyxp_expr *exp;
277 struct ly_path *path;
Michal Vaskoba99a3e2020-08-18 15:50:05 +0200278 const char *path_str = "/a:l2[2]/c/d[3]";
Michal Vasko38c2ba72020-07-27 14:46:59 +0200279 const char *data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100280 "<l2 xmlns=\"urn:tests:a\"><c>"
281 " <d>a</d>"
282 " </c></l2>"
283 "<l2 xmlns=\"urn:tests:a\"><c>"
284 " <d>a</d>"
285 " <d>b</d>"
286 " <d>b</d>"
287 " <d>c</d>"
288 "</c></l2>"
289 "<l2 xmlns=\"urn:tests:a\"><c>"
290 "</c></l2>";
Michal Vasko38c2ba72020-07-27 14:46:59 +0200291
292 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
293 assert_int_equal(LY_SUCCESS, ly_path_parse(ctx, NULL, path_str, strlen(path_str), LY_PATH_BEGIN_EITHER, LY_PATH_LREF_FALSE,
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100294 LY_PATH_PREFIX_OPTIONAL, LY_PATH_PRED_SIMPLE, &exp));
Michal Vasko38c2ba72020-07-27 14:46:59 +0200295 assert_int_equal(LY_SUCCESS, ly_path_compile(ctx, NULL, NULL, exp, LY_PATH_LREF_FALSE, LY_PATH_OPER_INPUT,
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100296 LY_PATH_TARGET_SINGLE, LY_PREF_JSON, NULL, NULL, &path));
Michal Vasko38c2ba72020-07-27 14:46:59 +0200297 term = lyd_target(path, tree);
298
299 assert_string_equal(term->schema->name, "d");
Michal Vaskob7be7a82020-08-20 09:09:04 +0200300 assert_string_equal(LYD_CANON_VALUE(term), "b");
301 assert_string_equal(LYD_CANON_VALUE(term->prev), "b");
Michal Vasko38c2ba72020-07-27 14:46:59 +0200302
303 lyd_free_all(tree);
304 ly_path_free(ctx, path);
305 lyxp_expr_free(ctx, exp);
306
307 *state = NULL;
308}
309
Radek Krejcica989142020-11-05 11:32:22 +0100310static void
311test_list_pos(void **state)
312{
313 *state = test_list_pos;
314
315 const char *data;
316 struct lyd_node *tree;
317
318 data = "<bar xmlns=\"urn:tests:a\">test</bar>"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100319 "<l1 xmlns=\"urn:tests:a\"><a>one</a><b>one</b></l1>"
320 "<l1 xmlns=\"urn:tests:a\"><a>two</a><b>two</b></l1>"
321 "<foo xmlns=\"urn:tests:a\">test</foo>";
Radek Krejcica989142020-11-05 11:32:22 +0100322 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
323 assert_int_equal(0, lyd_list_pos(tree));
324 assert_int_equal(1, lyd_list_pos(tree->next));
325 assert_int_equal(2, lyd_list_pos(tree->next->next));
326 assert_int_equal(0, lyd_list_pos(tree->next->next->next));
327 lyd_free_all(tree);
328
329 data = "<ll xmlns=\"urn:tests:a\">one</ll>"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100330 "<ll xmlns=\"urn:tests:a\">two</ll>"
331 "<ll xmlns=\"urn:tests:a\">three</ll>";
Radek Krejcica989142020-11-05 11:32:22 +0100332 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
333 assert_int_equal(1, lyd_list_pos(tree));
334 assert_int_equal(2, lyd_list_pos(tree->next));
335 assert_int_equal(3, lyd_list_pos(tree->next->next));
336 lyd_free_all(tree);
337
338 data = "<ll xmlns=\"urn:tests:a\">one</ll>"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100339 "<l1 xmlns=\"urn:tests:a\"><a>one</a><b>one</b></l1>"
340 "<ll xmlns=\"urn:tests:a\">two</ll>"
341 "<l1 xmlns=\"urn:tests:a\"><a>two</a><b>two</b></l1>"
342 "<ll xmlns=\"urn:tests:a\">three</ll>"
343 "<l1 xmlns=\"urn:tests:a\"><a>three</a><b>three</b></l1>";
Radek Krejcica989142020-11-05 11:32:22 +0100344 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
345 assert_string_equal("l1", tree->schema->name);
346 assert_int_equal(1, lyd_list_pos(tree));
347 assert_int_equal(2, lyd_list_pos(tree->next));
348 assert_int_equal(3, lyd_list_pos(tree->next->next));
349 assert_string_equal("ll", tree->next->next->next->schema->name);
350 assert_int_equal(1, lyd_list_pos(tree->next->next->next));
351 assert_int_equal(2, lyd_list_pos(tree->next->next->next->next));
352 assert_int_equal(3, lyd_list_pos(tree->next->next->next->next->next));
353 lyd_free_all(tree);
354
355 *state = NULL;
356}
357
Radek Krejci4233f9b2020-11-05 12:38:35 +0100358static void
359test_first_sibling(void **state)
360{
361 *state = test_first_sibling;
362
363 const char *data;
364 struct lyd_node *tree;
365 struct lyd_node_inner *parent;
366
367 data = "<bar xmlns=\"urn:tests:a\">test</bar>"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100368 "<l1 xmlns=\"urn:tests:a\"><a>one</a><b>one</b><c>one</c></l1>"
369 "<foo xmlns=\"urn:tests:a\">test</foo>";
Radek Krejci4233f9b2020-11-05 12:38:35 +0100370 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
371 assert_ptr_equal(tree, lyd_first_sibling(tree->next));
372 assert_ptr_equal(tree, lyd_first_sibling(tree));
373 assert_ptr_equal(tree, lyd_first_sibling(tree->prev));
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100374 parent = (struct lyd_node_inner *)tree->next;
Radek Krejci4233f9b2020-11-05 12:38:35 +0100375 assert_int_equal(LYS_LIST, parent->schema->nodetype);
376 assert_ptr_equal(parent->child, lyd_first_sibling(parent->child->next));
377 assert_ptr_equal(parent->child, lyd_first_sibling(parent->child));
378 assert_ptr_equal(parent->child, lyd_first_sibling(parent->child->prev));
379 lyd_free_all(tree);
380
381 *state = NULL;
382}
383
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100384int
385main(void)
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200386{
387 const struct CMUnitTest tests[] = {
388 cmocka_unit_test_setup_teardown(test_compare, setup, teardown),
Radek Krejci22ebdba2019-07-25 13:59:43 +0200389 cmocka_unit_test_setup_teardown(test_dup, setup, teardown),
Michal Vasko38c2ba72020-07-27 14:46:59 +0200390 cmocka_unit_test_setup_teardown(test_target, setup, teardown),
Radek Krejcica989142020-11-05 11:32:22 +0100391 cmocka_unit_test_setup_teardown(test_list_pos, setup, teardown),
Radek Krejci4233f9b2020-11-05 12:38:35 +0100392 cmocka_unit_test_setup_teardown(test_first_sibling, setup, teardown),
Radek Krejci1f05b6a2019-07-18 16:15:06 +0200393 };
394
395 return cmocka_run_group_tests(tests, NULL, NULL);
396}