blob: 2e8bf5f7b40906e7315ee5f7acce2f128b52f81b [file] [log] [blame]
Michal Vaskob1b5c262020-03-05 14:29:47 +01001/**
2 * @file test_validation.c
Michal Vaskocde73ac2019-11-14 16:10:27 +01003 * @author: Radek Krejci <rkrejci@cesnet.cz>
Michal Vaskob1b5c262020-03-05 14:29:47 +01004 * @brief unit tests for functions from validation.c
Michal Vaskocde73ac2019-11-14 16:10:27 +01005 *
Michal Vaskob1b5c262020-03-05 14:29:47 +01006 * Copyright (c) 2020 CESNET, z.s.p.o.
Michal Vaskocde73ac2019-11-14 16:10:27 +01007 *
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 Vaskocde73ac2019-11-14 16:10:27 +010015#include <stdio.h>
16#include <string.h>
17
Radek Krejci70593c12020-06-13 20:48:09 +020018#include "context.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020019#include "in.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020020#include "out.h"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010021#include "parser_data.h"
Radek Krejci70593c12020-06-13 20:48:09 +020022#include "printer_data.h"
23#include "tests/config.h"
Radek Krejci70593c12020-06-13 20:48:09 +020024#include "tree_data_internal.h"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010025#include "tree_schema.h"
26#include "utests.h"
Michal Vaskocde73ac2019-11-14 16:10:27 +010027
28#define BUFSIZE 1024
29char logbuf[BUFSIZE] = {0};
30int store = -1; /* negative for infinite logging, positive for limited logging */
31
32struct ly_ctx *ctx; /* context for tests */
33
34/* set to 0 to printing error messages to stderr instead of checking them in code */
35#define ENABLE_LOGGER_CHECKING 1
36
37#if ENABLE_LOGGER_CHECKING
38static void
39logger(LY_LOG_LEVEL level, const char *msg, const char *path)
40{
41 (void) level; /* unused */
42 if (store) {
43 if (path && path[0]) {
44 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
45 } else {
46 strncpy(logbuf, msg, BUFSIZE - 1);
47 }
48 if (store > 0) {
49 --store;
50 }
51 }
52}
Radek Krejcib4ac5a92020-11-23 17:54:33 +010053
Michal Vaskocde73ac2019-11-14 16:10:27 +010054#endif
55
56static int
57setup(void **state)
58{
59 (void) state; /* unused */
60
61 const char *schema_a =
Radek Krejcib4ac5a92020-11-23 17:54:33 +010062 "module a {\n"
63 " namespace urn:tests:a;\n"
64 " prefix a;\n"
65 " yang-version 1.1;\n"
66 "\n"
67 " container cont {\n"
68 " leaf a {\n"
69 " when \"../../c = 'val_c'\";\n"
70 " type string;\n"
71 " }\n"
72 " leaf b {\n"
73 " type string;\n"
74 " }\n"
75 " }\n"
76 " leaf c {\n"
77 " when \"/cont/b = 'val_b'\";\n"
78 " type string;\n"
79 " }\n"
80 "}";
Michal Vaskoa3881362020-01-21 15:57:35 +010081 const char *schema_b =
Radek Krejcib4ac5a92020-11-23 17:54:33 +010082 "module b {\n"
83 " namespace urn:tests:b;\n"
84 " prefix b;\n"
85 " yang-version 1.1;\n"
86 "\n"
87 " choice choic {\n"
88 " mandatory true;\n"
89 " leaf a {\n"
90 " type string;\n"
91 " }\n"
92 " case b {\n"
93 " leaf l {\n"
94 " type string;\n"
95 " }\n"
96 " }\n"
97 " }\n"
98 " leaf c {\n"
99 " mandatory true;\n"
100 " type string;\n"
101 " }\n"
102 " leaf d {\n"
103 " type empty;\n"
104 " }\n"
105 "}";
Michal Vaskoacd83e72020-02-04 14:12:01 +0100106 const char *schema_c =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100107 "module c {\n"
108 " namespace urn:tests:c;\n"
109 " prefix c;\n"
110 " yang-version 1.1;\n"
111 "\n"
112 " choice choic {\n"
113 " leaf a {\n"
114 " type string;\n"
115 " }\n"
116 " case b {\n"
117 " leaf-list l {\n"
118 " min-elements 3;\n"
119 " type string;\n"
120 " }\n"
121 " }\n"
122 " }\n"
123 " list lt {\n"
124 " max-elements 4;\n"
125 " key \"k\";\n"
126 " leaf k {\n"
127 " type string;\n"
128 " }\n"
129 " }\n"
130 " leaf d {\n"
131 " type empty;\n"
132 " }\n"
133 "}";
Michal Vasko14654712020-02-06 08:35:21 +0100134 const char *schema_d =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100135 "module d {\n"
136 " namespace urn:tests:d;\n"
137 " prefix d;\n"
138 " yang-version 1.1;\n"
139 "\n"
140 " list lt {\n"
141 " key \"k\";\n"
142 " unique \"l1\";\n"
143 " leaf k {\n"
144 " type string;\n"
145 " }\n"
146 " leaf l1 {\n"
147 " type string;\n"
148 " }\n"
149 " }\n"
150 " list lt2 {\n"
151 " key \"k\";\n"
152 " unique \"cont/l2 l4\";\n"
153 " unique \"l5 l6\";\n"
154 " leaf k {\n"
155 " type string;\n"
156 " }\n"
157 " container cont {\n"
158 " leaf l2 {\n"
159 " type string;\n"
160 " }\n"
161 " }\n"
162 " leaf l4 {\n"
163 " type string;\n"
164 " }\n"
165 " leaf l5 {\n"
166 " type string;\n"
167 " }\n"
168 " leaf l6 {\n"
169 " type string;\n"
170 " }\n"
171 " list lt3 {\n"
172 " key \"kk\";\n"
173 " unique \"l3\";\n"
174 " leaf kk {\n"
175 " type string;\n"
176 " }\n"
177 " leaf l3 {\n"
178 " type string;\n"
179 " }\n"
180 " }\n"
181 " }\n"
182 "}";
Michal Vaskof03ed032020-03-04 13:31:44 +0100183 const char *schema_e =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100184 "module e {\n"
185 " namespace urn:tests:e;\n"
186 " prefix e;\n"
187 " yang-version 1.1;\n"
188 "\n"
189 " choice choic {\n"
190 " leaf a {\n"
191 " type string;\n"
192 " }\n"
193 " case b {\n"
194 " leaf-list l {\n"
195 " type string;\n"
196 " }\n"
197 " }\n"
198 " }\n"
199 " list lt {\n"
200 " key \"k\";\n"
201 " leaf k {\n"
202 " type string;\n"
203 " }\n"
204 " }\n"
205 " leaf d {\n"
206 " type uint32;\n"
207 " }\n"
208 " leaf-list ll {\n"
209 " type string;\n"
210 " }\n"
211 " container cont {\n"
212 " list lt {\n"
213 " key \"k\";\n"
214 " leaf k {\n"
215 " type string;\n"
216 " }\n"
217 " }\n"
218 " leaf d {\n"
219 " type uint32;\n"
220 " }\n"
221 " leaf-list ll {\n"
222 " type string;\n"
223 " }\n"
224 " leaf-list ll2 {\n"
225 " type enumeration {\n"
226 " enum one;\n"
227 " enum two;\n"
228 " }\n"
229 " }\n"
230 " }\n"
231 "}";
Michal Vaskof03ed032020-03-04 13:31:44 +0100232 const char *schema_f =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100233 "module f {\n"
234 " namespace urn:tests:f;\n"
235 " prefix f;\n"
236 " yang-version 1.1;\n"
237 "\n"
238 " choice choic {\n"
239 " default \"c\";\n"
240 " leaf a {\n"
241 " type string;\n"
242 " }\n"
243 " case b {\n"
244 " leaf l {\n"
245 " type string;\n"
246 " }\n"
247 " }\n"
248 " case c {\n"
249 " leaf-list ll1 {\n"
250 " type string;\n"
251 " default \"def1\";\n"
252 " default \"def2\";\n"
253 " default \"def3\";\n"
254 " }\n"
255 " }\n"
256 " }\n"
257 " leaf d {\n"
258 " type uint32;\n"
259 " default 15;\n"
260 " }\n"
261 " leaf-list ll2 {\n"
262 " type string;\n"
263 " default \"dflt1\";\n"
264 " default \"dflt2\";\n"
265 " }\n"
266 " container cont {\n"
267 " choice choic {\n"
268 " default \"c\";\n"
269 " leaf a {\n"
270 " type string;\n"
271 " }\n"
272 " case b {\n"
273 " leaf l {\n"
274 " type string;\n"
275 " }\n"
276 " }\n"
277 " case c {\n"
278 " leaf-list ll1 {\n"
279 " type string;\n"
280 " default \"def1\";\n"
281 " default \"def2\";\n"
282 " default \"def3\";\n"
283 " }\n"
284 " }\n"
285 " }\n"
286 " leaf d {\n"
287 " type uint32;\n"
288 " default 15;\n"
289 " }\n"
290 " leaf-list ll2 {\n"
291 " type string;\n"
292 " default \"dflt1\";\n"
293 " default \"dflt2\";\n"
294 " }\n"
295 " }\n"
296 "}";
Michal Vaskoc193ce92020-03-06 11:04:48 +0100297 const char *schema_g =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100298 "module g {\n"
299 " namespace urn:tests:g;\n"
300 " prefix g;\n"
301 " yang-version 1.1;\n"
302 "\n"
303 " feature f1;\n"
304 " feature f2;\n"
305 " feature f3;\n"
306 "\n"
307 " container cont {\n"
308 " if-feature \"f1\";\n"
309 " choice choic {\n"
310 " if-feature \"f2 or f3\";\n"
311 " leaf a {\n"
312 " type string;\n"
313 " }\n"
314 " case b {\n"
315 " if-feature \"f2 and f1\";\n"
316 " leaf l {\n"
317 " type string;\n"
318 " }\n"
319 " }\n"
320 " }\n"
321 " leaf d {\n"
322 " type uint32;\n"
323 " }\n"
324 " container cont2 {\n"
325 " if-feature \"f2\";\n"
326 " leaf e {\n"
327 " type string;\n"
328 " }\n"
329 " }\n"
330 " }\n"
331 "}";
Michal Vasko5b37a352020-03-06 13:38:33 +0100332 const char *schema_h =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100333 "module h {\n"
334 " namespace urn:tests:h;\n"
335 " prefix h;\n"
336 " yang-version 1.1;\n"
337 "\n"
338 " container cont {\n"
339 " container cont2 {\n"
340 " config false;\n"
341 " leaf l {\n"
342 " type string;\n"
343 " }\n"
344 " }\n"
345 " }\n"
346 "}";
Michal Vaskocc048b22020-03-27 15:52:38 +0100347 const char *schema_i =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100348 "module i {\n"
349 " namespace urn:tests:i;\n"
350 " prefix i;\n"
351 " yang-version 1.1;\n"
352 "\n"
353 " container cont {\n"
354 " leaf l {\n"
355 " type string;\n"
356 " }\n"
357 " leaf l2 {\n"
358 " must \"../l = 'right'\";\n"
359 " type string;\n"
360 " }\n"
361 " }\n"
362 "}";
Michal Vaskofea12c62020-03-30 11:00:15 +0200363 const char *schema_j =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100364 "module j {\n"
365 " namespace urn:tests:j;\n"
366 " prefix j;\n"
367 " yang-version 1.1;\n"
368 "\n"
369 " feature feat1;\n"
370 "\n"
371 " container cont {\n"
372 " must \"false()\";\n"
373 " list l1 {\n"
374 " key \"k\";\n"
375 " leaf k {\n"
376 " type string;\n"
377 " }\n"
378 " action act {\n"
379 " if-feature feat1;\n"
380 " input {\n"
381 " must \"../../lf1 = 'true'\";\n"
382 " leaf lf2 {\n"
383 " type leafref {\n"
384 " path /lf3;\n"
385 " }\n"
386 " }\n"
387 " }\n"
388 " output {\n"
389 " must \"../../lf1 = 'true2'\";\n"
390 " leaf lf2 {\n"
391 " type leafref {\n"
392 " path /lf4;\n"
393 " }\n"
394 " }\n"
395 " }\n"
396 " }\n"
397 " }\n"
398 "\n"
399 " leaf lf1 {\n"
400 " type string;\n"
401 " }\n"
402 " }\n"
403 "\n"
404 " leaf lf3 {\n"
405 " type string;\n"
406 " }\n"
407 "\n"
408 " leaf lf4 {\n"
409 " type string;\n"
410 " }\n"
411 "}";
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100412 struct ly_in *in;
413 const char *feats[] = {"feat1", NULL};
Michal Vaskocde73ac2019-11-14 16:10:27 +0100414
415#if ENABLE_LOGGER_CHECKING
416 ly_set_log_clb(logger, 1);
417#endif
418
Michal Vaskof03ed032020-03-04 13:31:44 +0100419 assert_int_equal(LY_SUCCESS, ly_ctx_new(TESTS_DIR_MODULES_YANG, 0, &ctx));
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100420 assert_non_null(ly_ctx_load_module(ctx, "ietf-netconf-with-defaults", "2011-06-01", NULL));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200421 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_a, LYS_IN_YANG, NULL));
422 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_b, LYS_IN_YANG, NULL));
423 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_c, LYS_IN_YANG, NULL));
424 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_d, LYS_IN_YANG, NULL));
425 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_e, LYS_IN_YANG, NULL));
426 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_f, LYS_IN_YANG, NULL));
427 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_g, LYS_IN_YANG, NULL));
428 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_h, LYS_IN_YANG, NULL));
429 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_i, LYS_IN_YANG, NULL));
Michal Vasko7b1ad1a2020-11-02 15:41:27 +0100430 assert_int_equal(LY_SUCCESS, ly_in_new_memory(schema_j, &in));
431 assert_int_equal(LY_SUCCESS, lys_parse(ctx, in, LYS_IN_YANG, feats, NULL));
432 ly_in_free(in, 0);
Michal Vaskocde73ac2019-11-14 16:10:27 +0100433
434 return 0;
435}
436
437static int
438teardown(void **state)
439{
Michal Vaskoacd83e72020-02-04 14:12:01 +0100440 (void)state;
441 ly_ctx_destroy(ctx, NULL);
442 ctx = NULL;
443
444 return 0;
445}
446
447static int
448teardown_s(void **state)
449{
Michal Vaskocde73ac2019-11-14 16:10:27 +0100450#if ENABLE_LOGGER_CHECKING
451 if (*state) {
452 fprintf(stderr, "%s\n", logbuf);
453 }
454#else
455 (void) state; /* unused */
456#endif
457
Michal Vaskocde73ac2019-11-14 16:10:27 +0100458 return 0;
459}
460
461void
462logbuf_clean(void)
463{
464 logbuf[0] = '\0';
465}
466
467#if ENABLE_LOGGER_CHECKING
468# define logbuf_assert(str) assert_string_equal(logbuf, str)
469#else
470# define logbuf_assert(str)
471#endif
472
473static void
474test_when(void **state)
475{
476 *state = test_when;
477
478 const char *data;
479 struct lyd_node *tree;
480
481 data = "<c xmlns=\"urn:tests:a\">hey</c>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200482 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskocde73ac2019-11-14 16:10:27 +0100483 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100484 logbuf_assert("When condition \"/cont/b = 'val_b'\" not satisfied. /a:c");
Michal Vaskocde73ac2019-11-14 16:10:27 +0100485
486 data = "<cont xmlns=\"urn:tests:a\"><b>val_b</b></cont><c xmlns=\"urn:tests:a\">hey</c>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200487 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskocde73ac2019-11-14 16:10:27 +0100488 assert_non_null(tree);
489 assert_string_equal("c", tree->next->schema->name);
490 assert_int_equal(LYD_WHEN_TRUE, tree->next->flags);
491 lyd_free_all(tree);
492
493 data = "<cont xmlns=\"urn:tests:a\"><a>val</a><b>val_b</b></cont><c xmlns=\"urn:tests:a\">val_c</c>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200494 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskocde73ac2019-11-14 16:10:27 +0100495 assert_non_null(tree);
Radek Krejcia1c1e542020-09-29 16:06:52 +0200496 assert_string_equal("a", lyd_child(tree)->schema->name);
497 assert_int_equal(LYD_WHEN_TRUE, lyd_child(tree)->flags);
Michal Vaskocde73ac2019-11-14 16:10:27 +0100498 assert_string_equal("c", tree->next->schema->name);
499 assert_int_equal(LYD_WHEN_TRUE, tree->next->flags);
500 lyd_free_all(tree);
501
502 *state = NULL;
503}
504
Michal Vaskoa3881362020-01-21 15:57:35 +0100505static void
506test_mandatory(void **state)
507{
508 *state = test_mandatory;
509
510 const char *data;
511 struct lyd_node *tree;
512
513 data = "<d xmlns=\"urn:tests:b\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200514 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoa3881362020-01-21 15:57:35 +0100515 assert_null(tree);
516 logbuf_assert("Mandatory node \"choic\" instance does not exist. /b:choic");
517
518 data = "<l xmlns=\"urn:tests:b\">string</l><d xmlns=\"urn:tests:b\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200519 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoa3881362020-01-21 15:57:35 +0100520 assert_null(tree);
521 logbuf_assert("Mandatory node \"c\" instance does not exist. /b:c");
522
523 data = "<a xmlns=\"urn:tests:b\">string</a>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200524 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoa3881362020-01-21 15:57:35 +0100525 assert_null(tree);
526 logbuf_assert("Mandatory node \"c\" instance does not exist. /b:c");
527
528 data = "<a xmlns=\"urn:tests:b\">string</a><c xmlns=\"urn:tests:b\">string2</c>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200529 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoa3881362020-01-21 15:57:35 +0100530 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100531 lyd_free_siblings(tree);
Michal Vaskoa3881362020-01-21 15:57:35 +0100532
533 *state = NULL;
534}
535
Michal Vaskoacd83e72020-02-04 14:12:01 +0100536static void
537test_minmax(void **state)
538{
539 *state = test_minmax;
540
541 const char *data;
542 struct lyd_node *tree;
543
544 data = "<d xmlns=\"urn:tests:c\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200545 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoacd83e72020-02-04 14:12:01 +0100546 assert_null(tree);
547 logbuf_assert("Too few \"l\" instances. /c:choic/b/l");
548
549 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100550 "<l xmlns=\"urn:tests:c\">val1</l>"
551 "<l xmlns=\"urn:tests:c\">val2</l>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200552 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoacd83e72020-02-04 14:12:01 +0100553 assert_null(tree);
554 logbuf_assert("Too few \"l\" instances. /c:choic/b/l");
555
556 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100557 "<l xmlns=\"urn:tests:c\">val1</l>"
558 "<l xmlns=\"urn:tests:c\">val2</l>"
559 "<l xmlns=\"urn:tests:c\">val3</l>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200560 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoacd83e72020-02-04 14:12:01 +0100561 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100562 lyd_free_siblings(tree);
Michal Vaskoacd83e72020-02-04 14:12:01 +0100563
564 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100565 "<l xmlns=\"urn:tests:c\">val1</l>"
566 "<l xmlns=\"urn:tests:c\">val2</l>"
567 "<l xmlns=\"urn:tests:c\">val3</l>"
568 "<lt xmlns=\"urn:tests:c\"><k>val1</k></lt>"
569 "<lt xmlns=\"urn:tests:c\"><k>val2</k></lt>"
570 "<lt xmlns=\"urn:tests:c\"><k>val3</k></lt>"
571 "<lt xmlns=\"urn:tests:c\"><k>val4</k></lt>"
572 "<lt xmlns=\"urn:tests:c\"><k>val5</k></lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200573 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoacd83e72020-02-04 14:12:01 +0100574 assert_null(tree);
575 logbuf_assert("Too many \"lt\" instances. /c:lt");
576
577 *state = NULL;
578}
579
Michal Vasko14654712020-02-06 08:35:21 +0100580static void
581test_unique(void **state)
582{
583 *state = test_unique;
584
585 const char *data;
586 struct lyd_node *tree;
587
588 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100589 "<lt xmlns=\"urn:tests:d\">\n"
590 " <k>val1</k>\n"
591 " <l1>same</l1>\n"
592 "</lt>\n"
593 "<lt xmlns=\"urn:tests:d\">\n"
594 " <k>val2</k>\n"
595 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200596 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100597 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100598 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100599
600 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100601 "<lt xmlns=\"urn:tests:d\">\n"
602 " <k>val1</k>\n"
603 " <l1>same</l1>\n"
604 "</lt>\n"
605 "<lt xmlns=\"urn:tests:d\">\n"
606 " <k>val2</k>\n"
607 " <l1>not-same</l1>\n"
608 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200609 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100610 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100611 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100612
613 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100614 "<lt xmlns=\"urn:tests:d\">\n"
615 " <k>val1</k>\n"
616 " <l1>same</l1>\n"
617 "</lt>\n"
618 "<lt xmlns=\"urn:tests:d\">\n"
619 " <k>val2</k>\n"
620 " <l1>same</l1>\n"
621 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200622 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100623 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100624 logbuf_assert("Unique data leaf(s) \"l1\" not satisfied in \"/d:lt[k='val1']\" and \"/d:lt[k='val2']\". /d:lt[k='val2']");
Michal Vasko14654712020-02-06 08:35:21 +0100625
626 /* now try with more instances */
627 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100628 "<lt xmlns=\"urn:tests:d\">\n"
629 " <k>val1</k>\n"
630 " <l1>1</l1>\n"
631 "</lt>\n"
632 "<lt xmlns=\"urn:tests:d\">\n"
633 " <k>val2</k>\n"
634 " <l1>2</l1>\n"
635 "</lt>\n"
636 "<lt xmlns=\"urn:tests:d\">\n"
637 " <k>val3</k>\n"
638 " <l1>3</l1>\n"
639 "</lt>\n"
640 "<lt xmlns=\"urn:tests:d\">\n"
641 " <k>val4</k>\n"
642 " <l1>4</l1>\n"
643 "</lt>\n"
644 "<lt xmlns=\"urn:tests:d\">\n"
645 " <k>val5</k>\n"
646 " <l1>5</l1>\n"
647 "</lt>\n"
648 "<lt xmlns=\"urn:tests:d\">\n"
649 " <k>val6</k>\n"
650 " <l1>6</l1>\n"
651 "</lt>\n"
652 "<lt xmlns=\"urn:tests:d\">\n"
653 " <k>val7</k>\n"
654 " <l1>7</l1>\n"
655 "</lt>\n"
656 "<lt xmlns=\"urn:tests:d\">\n"
657 " <k>val8</k>\n"
658 " <l1>8</l1>\n"
659 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200660 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100661 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100662 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100663
664 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100665 "<lt xmlns=\"urn:tests:d\">\n"
666 " <k>val1</k>\n"
667 " <l1>1</l1>\n"
668 "</lt>\n"
669 "<lt xmlns=\"urn:tests:d\">\n"
670 " <k>val2</k>\n"
671 " <l1>2</l1>\n"
672 "</lt>\n"
673 "<lt xmlns=\"urn:tests:d\">\n"
674 " <k>val3</k>\n"
675 " <l1>3</l1>\n"
676 "</lt>\n"
677 "<lt xmlns=\"urn:tests:d\">\n"
678 " <k>val4</k>\n"
679 "</lt>\n"
680 "<lt xmlns=\"urn:tests:d\">\n"
681 " <k>val5</k>\n"
682 " <l1>5</l1>\n"
683 "</lt>\n"
684 "<lt xmlns=\"urn:tests:d\">\n"
685 " <k>val6</k>\n"
686 " <l1>6</l1>\n"
687 "</lt>\n"
688 "<lt xmlns=\"urn:tests:d\">\n"
689 " <k>val7</k>\n"
690 "</lt>\n"
691 "<lt xmlns=\"urn:tests:d\">\n"
692 " <k>val8</k>\n"
693 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200694 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100695 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100696 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100697
698 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100699 "<lt xmlns=\"urn:tests:d\">\n"
700 " <k>val1</k>\n"
701 " <l1>1</l1>\n"
702 "</lt>\n"
703 "<lt xmlns=\"urn:tests:d\">\n"
704 " <k>val2</k>\n"
705 " <l1>2</l1>\n"
706 "</lt>\n"
707 "<lt xmlns=\"urn:tests:d\">\n"
708 " <k>val3</k>\n"
709 "</lt>\n"
710 "<lt xmlns=\"urn:tests:d\">\n"
711 " <k>val4</k>\n"
712 " <l1>4</l1>\n"
713 "</lt>\n"
714 "<lt xmlns=\"urn:tests:d\">\n"
715 " <k>val5</k>\n"
716 "</lt>\n"
717 "<lt xmlns=\"urn:tests:d\">\n"
718 " <k>val6</k>\n"
719 "</lt>\n"
720 "<lt xmlns=\"urn:tests:d\">\n"
721 " <k>val7</k>\n"
722 " <l1>2</l1>\n"
723 "</lt>\n"
724 "<lt xmlns=\"urn:tests:d\">\n"
725 " <k>val8</k>\n"
726 " <l1>8</l1>\n"
727 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200728 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100729 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100730 logbuf_assert("Unique data leaf(s) \"l1\" not satisfied in \"/d:lt[k='val7']\" and \"/d:lt[k='val2']\". /d:lt[k='val2']");
Michal Vasko14654712020-02-06 08:35:21 +0100731
732 *state = NULL;
733}
734
735static void
736test_unique_nested(void **state)
737{
738 *state = test_unique_nested;
739
740 const char *data;
741 struct lyd_node *tree;
742
743 /* nested list uniquest are compared only with instances in the same parent list instance */
744 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100745 "<lt2 xmlns=\"urn:tests:d\">\n"
746 " <k>val1</k>\n"
747 " <cont>\n"
748 " <l2>1</l2>\n"
749 " </cont>\n"
750 " <l4>1</l4>\n"
751 "</lt2>\n"
752 "<lt2 xmlns=\"urn:tests:d\">\n"
753 " <k>val2</k>\n"
754 " <cont>\n"
755 " <l2>2</l2>\n"
756 " </cont>\n"
757 " <l4>2</l4>\n"
758 " <lt3>\n"
759 " <kk>val1</kk>\n"
760 " <l3>1</l3>\n"
761 " </lt3>\n"
762 " <lt3>\n"
763 " <kk>val2</kk>\n"
764 " <l3>2</l3>\n"
765 " </lt3>\n"
766 "</lt2>\n"
767 "<lt2 xmlns=\"urn:tests:d\">\n"
768 " <k>val3</k>\n"
769 " <cont>\n"
770 " <l2>3</l2>\n"
771 " </cont>\n"
772 " <l4>3</l4>\n"
773 " <lt3>\n"
774 " <kk>val1</kk>\n"
775 " <l3>2</l3>\n"
776 " </lt3>\n"
777 "</lt2>\n"
778 "<lt2 xmlns=\"urn:tests:d\">\n"
779 " <k>val4</k>\n"
780 " <cont>\n"
781 " <l2>4</l2>\n"
782 " </cont>\n"
783 " <l4>4</l4>\n"
784 " <lt3>\n"
785 " <kk>val1</kk>\n"
786 " <l3>3</l3>\n"
787 " </lt3>\n"
788 "</lt2>\n"
789 "<lt2 xmlns=\"urn:tests:d\">\n"
790 " <k>val5</k>\n"
791 " <cont>\n"
792 " <l2>5</l2>\n"
793 " </cont>\n"
794 " <l4>5</l4>\n"
795 " <lt3>\n"
796 " <kk>val1</kk>\n"
797 " <l3>3</l3>\n"
798 " </lt3>\n"
799 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200800 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100801 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100802 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100803
804 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100805 "<lt2 xmlns=\"urn:tests:d\">\n"
806 " <k>val1</k>\n"
807 " <cont>\n"
808 " <l2>1</l2>\n"
809 " </cont>\n"
810 " <l4>1</l4>\n"
811 "</lt2>\n"
812 "<lt2 xmlns=\"urn:tests:d\">\n"
813 " <k>val2</k>\n"
814 " <cont>\n"
815 " <l2>2</l2>\n"
816 " </cont>\n"
817 " <lt3>\n"
818 " <kk>val1</kk>\n"
819 " <l3>1</l3>\n"
820 " </lt3>\n"
821 " <lt3>\n"
822 " <kk>val2</kk>\n"
823 " <l3>2</l3>\n"
824 " </lt3>\n"
825 " <lt3>\n"
826 " <kk>val3</kk>\n"
827 " <l3>1</l3>\n"
828 " </lt3>\n"
829 "</lt2>\n"
830 "<lt2 xmlns=\"urn:tests:d\">\n"
831 " <k>val3</k>\n"
832 " <cont>\n"
833 " <l2>3</l2>\n"
834 " </cont>\n"
835 " <l4>1</l4>\n"
836 " <lt3>\n"
837 " <kk>val1</kk>\n"
838 " <l3>2</l3>\n"
839 " </lt3>\n"
840 "</lt2>\n"
841 "<lt2 xmlns=\"urn:tests:d\">\n"
842 " <k>val4</k>\n"
843 " <cont>\n"
844 " <l2>4</l2>\n"
845 " </cont>\n"
846 " <lt3>\n"
847 " <kk>val1</kk>\n"
848 " <l3>3</l3>\n"
849 " </lt3>\n"
850 "</lt2>\n"
851 "<lt2 xmlns=\"urn:tests:d\">\n"
852 " <k>val5</k>\n"
853 " <cont>\n"
854 " <l2>5</l2>\n"
855 " </cont>\n"
856 " <lt3>\n"
857 " <kk>val1</kk>\n"
858 " <l3>3</l3>\n"
859 " </lt3>\n"
860 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200861 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100862 assert_null(tree);
863 logbuf_assert("Unique data leaf(s) \"l3\" not satisfied in \"/d:lt2[k='val2']/lt3[kk='val3']\" and"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100864 " \"/d:lt2[k='val2']/lt3[kk='val1']\". /d:lt2[k='val2']/lt3[kk='val1']");
Michal Vasko14654712020-02-06 08:35:21 +0100865
866 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100867 "<lt2 xmlns=\"urn:tests:d\">\n"
868 " <k>val1</k>\n"
869 " <cont>\n"
870 " <l2>1</l2>\n"
871 " </cont>\n"
872 " <l4>1</l4>\n"
873 "</lt2>\n"
874 "<lt2 xmlns=\"urn:tests:d\">\n"
875 " <k>val2</k>\n"
876 " <cont>\n"
877 " <l2>2</l2>\n"
878 " </cont>\n"
879 " <l4>2</l4>\n"
880 "</lt2>\n"
881 "<lt2 xmlns=\"urn:tests:d\">\n"
882 " <k>val3</k>\n"
883 " <cont>\n"
884 " <l2>3</l2>\n"
885 " </cont>\n"
886 " <l4>3</l4>\n"
887 "</lt2>\n"
888 "<lt2 xmlns=\"urn:tests:d\">\n"
889 " <k>val4</k>\n"
890 " <cont>\n"
891 " <l2>2</l2>\n"
892 " </cont>\n"
893 " <l4>2</l4>\n"
894 "</lt2>\n"
895 "<lt2 xmlns=\"urn:tests:d\">\n"
896 " <k>val5</k>\n"
897 " <cont>\n"
898 " <l2>5</l2>\n"
899 " </cont>\n"
900 " <l4>5</l4>\n"
901 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200902 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100903 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100904 logbuf_assert("Unique data leaf(s) \"cont/l2 l4\" not satisfied in \"/d:lt2[k='val4']\" and \"/d:lt2[k='val2']\". /d:lt2[k='val2']");
Michal Vasko14654712020-02-06 08:35:21 +0100905
906 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100907 "<lt2 xmlns=\"urn:tests:d\">\n"
908 " <k>val1</k>\n"
909 " <cont>\n"
910 " <l2>1</l2>\n"
911 " </cont>\n"
912 " <l4>1</l4>\n"
913 " <l5>1</l5>\n"
914 " <l6>1</l6>\n"
915 "</lt2>\n"
916 "<lt2 xmlns=\"urn:tests:d\">\n"
917 " <k>val2</k>\n"
918 " <cont>\n"
919 " <l2>2</l2>\n"
920 " </cont>\n"
921 " <l4>1</l4>\n"
922 " <l5>1</l5>\n"
923 "</lt2>\n"
924 "<lt2 xmlns=\"urn:tests:d\">\n"
925 " <k>val3</k>\n"
926 " <cont>\n"
927 " <l2>3</l2>\n"
928 " </cont>\n"
929 " <l4>1</l4>\n"
930 " <l5>3</l5>\n"
931 " <l6>3</l6>\n"
932 "</lt2>\n"
933 "<lt2 xmlns=\"urn:tests:d\">\n"
934 " <k>val4</k>\n"
935 " <cont>\n"
936 " <l2>4</l2>\n"
937 " </cont>\n"
938 " <l4>1</l4>\n"
939 " <l6>1</l6>\n"
940 "</lt2>\n"
941 "<lt2 xmlns=\"urn:tests:d\">\n"
942 " <k>val5</k>\n"
943 " <cont>\n"
944 " <l2>5</l2>\n"
945 " </cont>\n"
946 " <l4>1</l4>\n"
947 " <l5>3</l5>\n"
948 " <l6>3</l6>\n"
949 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200950 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko14654712020-02-06 08:35:21 +0100951 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100952 logbuf_assert("Unique data leaf(s) \"l5 l6\" not satisfied in \"/d:lt2[k='val5']\" and \"/d:lt2[k='val3']\". /d:lt2[k='val3']");
Michal Vasko14654712020-02-06 08:35:21 +0100953
954 *state = NULL;
955}
956
Michal Vaskof03ed032020-03-04 13:31:44 +0100957static void
958test_dup(void **state)
959{
960 *state = test_dup;
961
962 const char *data;
963 struct lyd_node *tree;
964
965 data = "<d xmlns=\"urn:tests:e\">25</d><d xmlns=\"urn:tests:e\">50</d>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200966 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +0100967 assert_null(tree);
968 logbuf_assert("Duplicate instance of \"d\". /e:d");
969
970 data = "<lt xmlns=\"urn:tests:e\"><k>A</k></lt><lt xmlns=\"urn:tests:e\"><k>B</k></lt><lt xmlns=\"urn:tests:e\"><k>A</k></lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200971 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +0100972 assert_null(tree);
973 logbuf_assert("Duplicate instance of \"lt\". /e:lt[k='A']");
974
975 data = "<ll xmlns=\"urn:tests:e\">A</ll><ll xmlns=\"urn:tests:e\">B</ll><ll xmlns=\"urn:tests:e\">B</ll>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200976 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +0100977 assert_null(tree);
978 logbuf_assert("Duplicate instance of \"ll\". /e:ll[.='B']");
979
980 data = "<cont xmlns=\"urn:tests:e\"></cont><cont xmlns=\"urn:tests:e\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200981 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +0100982 assert_null(tree);
983 logbuf_assert("Duplicate instance of \"cont\". /e:cont");
984
985 /* same tests again but using hashes */
986 data = "<cont xmlns=\"urn:tests:e\"><d>25</d><d>50</d><ll>1</ll><ll>2</ll><ll>3</ll><ll>4</ll></cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200987 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +0100988 assert_null(tree);
989 logbuf_assert("Duplicate instance of \"d\". /e:cont/d");
990
991 data = "<cont xmlns=\"urn:tests:e\"><ll>1</ll><ll>2</ll><ll>3</ll><ll>4</ll>"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100992 "<lt><k>a</k></lt><lt><k>b</k></lt><lt><k>c</k></lt><lt><k>d</k></lt><lt><k>c</k></lt></cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200993 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +0100994 assert_null(tree);
995 logbuf_assert("Duplicate instance of \"lt\". /e:cont/lt[k='c']");
996
997 data = "<cont xmlns=\"urn:tests:e\"><ll>1</ll><ll>2</ll><ll>3</ll><ll>4</ll>"
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100998 "<ll>a</ll><ll>b</ll><ll>c</ll><ll>d</ll><ll>d</ll></cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200999 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +01001000 assert_null(tree);
1001 logbuf_assert("Duplicate instance of \"ll\". /e:cont/ll[.='d']");
1002
1003 /* cases */
1004 data = "<l xmlns=\"urn:tests:e\">a</l><l xmlns=\"urn:tests:e\">b</l><l xmlns=\"urn:tests:e\">c</l><l xmlns=\"urn:tests:e\">b</l>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001005 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +01001006 assert_null(tree);
1007 logbuf_assert("Duplicate instance of \"l\". /e:l[.='b']");
1008
1009 data = "<l xmlns=\"urn:tests:e\">a</l><l xmlns=\"urn:tests:e\">b</l><l xmlns=\"urn:tests:e\">c</l><a xmlns=\"urn:tests:e\">aa</a>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001010 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskof03ed032020-03-04 13:31:44 +01001011 assert_null(tree);
1012 logbuf_assert("Data for both cases \"a\" and \"b\" exist. /e:choic");
1013
1014 *state = NULL;
1015}
1016
1017static void
1018test_defaults(void **state)
1019{
1020 *state = test_defaults;
1021
Michal Vaskof03ed032020-03-04 13:31:44 +01001022 char *str;
Michal Vasko8104fd42020-07-13 11:09:51 +02001023 struct lyd_node *tree, *node, *diff;
Michal Vaskof03ed032020-03-04 13:31:44 +01001024 const struct lys_module *mod = ly_ctx_get_module_latest(ctx, "f");
1025
Radek Krejci241f6b52020-05-21 18:13:49 +02001026 struct ly_out *out;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001027
Radek Krejci84ce7b12020-06-11 17:28:25 +02001028 assert_int_equal(LY_SUCCESS, ly_out_new_memory(&str, 0, &out));
Radek Krejcia5bba312020-01-09 15:41:20 +01001029
Michal Vaskob1b5c262020-03-05 14:29:47 +01001030 /* get defaults */
1031 tree = NULL;
Michal Vasko8104fd42020-07-13 11:09:51 +02001032 assert_int_equal(lyd_validate_module(&tree, mod, 0, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001033 assert_non_null(tree);
Michal Vasko8104fd42020-07-13 11:09:51 +02001034 assert_non_null(diff);
Michal Vaskof03ed032020-03-04 13:31:44 +01001035
1036 /* check all defaults exist */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001037 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG);
Michal Vaskof03ed032020-03-04 13:31:44 +01001038 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001039 "<ll1 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>\n"
1040 "<ll1 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>\n"
1041 "<ll1 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>\n"
1042 "<d xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1043 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1044 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1045 "<cont xmlns=\"urn:tests:f\">\n"
1046 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>\n"
1047 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>\n"
1048 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>\n"
1049 " <d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1050 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1051 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1052 "</cont>\n");
Radek Krejci241f6b52020-05-21 18:13:49 +02001053 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001054
Michal Vasko8104fd42020-07-13 11:09:51 +02001055 /* check diff */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001056 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL);
Michal Vasko8104fd42020-07-13 11:09:51 +02001057 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001058 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">def1</ll1>\n"
1059 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">def2</ll1>\n"
1060 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">def3</ll1>\n"
1061 "<d xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">15</d>\n"
1062 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">dflt1</ll2>\n"
1063 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">dflt2</ll2>\n"
1064 "<cont xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">\n"
1065 " <ll1 yang:operation=\"create\">def1</ll1>\n"
1066 " <ll1 yang:operation=\"create\">def2</ll1>\n"
1067 " <ll1 yang:operation=\"create\">def3</ll1>\n"
1068 " <d yang:operation=\"create\">15</d>\n"
1069 " <ll2 yang:operation=\"create\">dflt1</ll2>\n"
1070 " <ll2 yang:operation=\"create\">dflt2</ll2>\n"
1071 "</cont>\n");
Michal Vasko8104fd42020-07-13 11:09:51 +02001072 ly_out_reset(out);
1073 lyd_free_siblings(diff);
1074
Michal Vaskof03ed032020-03-04 13:31:44 +01001075 /* create another explicit case and validate */
Radek Krejci41ac9942020-11-02 14:47:56 +01001076 assert_int_equal(lyd_new_term(NULL, mod, "l", "value", 0, &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001077 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001078 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001079
1080 /* check data tree */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001081 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG);
Michal Vaskof03ed032020-03-04 13:31:44 +01001082 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001083 "<l xmlns=\"urn:tests:f\">value</l>\n"
1084 "<d xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1085 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1086 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1087 "<cont xmlns=\"urn:tests:f\">\n"
1088 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>\n"
1089 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>\n"
1090 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>\n"
1091 " <d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1092 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1093 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1094 "</cont>\n");
Radek Krejci241f6b52020-05-21 18:13:49 +02001095 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001096
Michal Vasko8104fd42020-07-13 11:09:51 +02001097 /* check diff */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001098 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL);
Michal Vasko8104fd42020-07-13 11:09:51 +02001099 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001100 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">def1</ll1>\n"
1101 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">def2</ll1>\n"
1102 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">def3</ll1>\n");
Michal Vasko8104fd42020-07-13 11:09:51 +02001103 ly_out_reset(out);
1104 lyd_free_siblings(diff);
1105
Michal Vaskof03ed032020-03-04 13:31:44 +01001106 /* create explicit leaf-list and leaf and validate */
Radek Krejci41ac9942020-11-02 14:47:56 +01001107 assert_int_equal(lyd_new_term(NULL, mod, "d", "15", 0, &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001108 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Radek Krejci41ac9942020-11-02 14:47:56 +01001109 assert_int_equal(lyd_new_term(NULL, mod, "ll2", "dflt2", 0, &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001110 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001111 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001112
1113 /* check data tree */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001114 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG);
Michal Vaskof03ed032020-03-04 13:31:44 +01001115 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001116 "<l xmlns=\"urn:tests:f\">value</l>\n"
1117 "<d xmlns=\"urn:tests:f\">15</d>\n"
1118 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>\n"
1119 "<cont xmlns=\"urn:tests:f\">\n"
1120 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>\n"
1121 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>\n"
1122 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>\n"
1123 " <d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1124 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1125 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1126 "</cont>\n");
Radek Krejci241f6b52020-05-21 18:13:49 +02001127 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001128
Michal Vasko8104fd42020-07-13 11:09:51 +02001129 /* check diff */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001130 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL);
Michal Vasko8104fd42020-07-13 11:09:51 +02001131 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001132 "<d xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">15</d>\n"
1133 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">dflt1</ll2>\n"
1134 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">dflt2</ll2>\n");
Michal Vasko8104fd42020-07-13 11:09:51 +02001135 ly_out_reset(out);
1136 lyd_free_siblings(diff);
1137
Michal Vaskob1b5c262020-03-05 14:29:47 +01001138 /* create first explicit container, which should become implicit */
Radek Krejci41ac9942020-11-02 14:47:56 +01001139 assert_int_equal(lyd_new_inner(NULL, mod, "cont", 0, &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001140 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001141 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001142
1143 /* check data tree */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001144 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001145 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001146 "<l xmlns=\"urn:tests:f\">value</l>\n"
1147 "<d xmlns=\"urn:tests:f\">15</d>\n"
1148 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>\n"
1149 "<cont xmlns=\"urn:tests:f\">\n"
1150 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>\n"
1151 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>\n"
1152 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>\n"
1153 " <d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1154 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1155 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1156 "</cont>\n");
Radek Krejci241f6b52020-05-21 18:13:49 +02001157 ly_out_reset(out);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001158
Michal Vasko8104fd42020-07-13 11:09:51 +02001159 /* check diff */
1160 assert_null(diff);
1161
Michal Vaskob1b5c262020-03-05 14:29:47 +01001162 /* create second explicit container, which should become implicit, so the first tree node should be removed */
Radek Krejci41ac9942020-11-02 14:47:56 +01001163 assert_int_equal(lyd_new_inner(NULL, mod, "cont", 0, &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001164 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001165 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001166
1167 /* check data tree */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001168 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001169 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001170 "<l xmlns=\"urn:tests:f\">value</l>\n"
1171 "<d xmlns=\"urn:tests:f\">15</d>\n"
1172 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>\n"
1173 "<cont xmlns=\"urn:tests:f\">\n"
1174 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>\n"
1175 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>\n"
1176 " <ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>\n"
1177 " <d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>\n"
1178 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>\n"
1179 " <ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>\n"
1180 "</cont>\n");
Radek Krejci241f6b52020-05-21 18:13:49 +02001181 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001182
Michal Vasko8104fd42020-07-13 11:09:51 +02001183 /* check diff */
1184 assert_null(diff);
1185
Michal Vaskof03ed032020-03-04 13:31:44 +01001186 /* similar changes for nested defaults */
Radek Krejci41ac9942020-11-02 14:47:56 +01001187 assert_int_equal(lyd_new_term(tree->prev, NULL, "ll1", "def3", 0, NULL), LY_SUCCESS);
1188 assert_int_equal(lyd_new_term(tree->prev, NULL, "d", "5", 0, NULL), LY_SUCCESS);
1189 assert_int_equal(lyd_new_term(tree->prev, NULL, "ll2", "non-dflt", 0, NULL), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001190 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001191
1192 /* check data tree */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001193 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG);
Michal Vaskof03ed032020-03-04 13:31:44 +01001194 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001195 "<l xmlns=\"urn:tests:f\">value</l>\n"
1196 "<d xmlns=\"urn:tests:f\">15</d>\n"
1197 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>\n"
1198 "<cont xmlns=\"urn:tests:f\">\n"
1199 " <ll1>def3</ll1>\n"
1200 " <d>5</d>\n"
1201 " <ll2>non-dflt</ll2>\n"
1202 "</cont>\n");
Radek Krejci241f6b52020-05-21 18:13:49 +02001203 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001204
Michal Vasko8104fd42020-07-13 11:09:51 +02001205 /* check diff */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001206 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL);
Michal Vasko8104fd42020-07-13 11:09:51 +02001207 assert_string_equal(str,
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001208 "<cont xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"
1209 " <ll1 yang:operation=\"delete\">def1</ll1>\n"
1210 " <ll1 yang:operation=\"delete\">def2</ll1>\n"
1211 " <ll1 yang:operation=\"delete\">def3</ll1>\n"
1212 " <d yang:operation=\"delete\">15</d>\n"
1213 " <ll2 yang:operation=\"delete\">dflt1</ll2>\n"
1214 " <ll2 yang:operation=\"delete\">dflt2</ll2>\n"
1215 "</cont>\n");
Michal Vasko8104fd42020-07-13 11:09:51 +02001216 ly_out_reset(out);
1217 lyd_free_siblings(diff);
1218
Michal Vaskof03ed032020-03-04 13:31:44 +01001219 lyd_free_siblings(tree);
Radek Krejci241f6b52020-05-21 18:13:49 +02001220 ly_out_free(out, NULL, 1);
Michal Vaskof03ed032020-03-04 13:31:44 +01001221
1222 *state = NULL;
1223}
1224
Michal Vaskoc193ce92020-03-06 11:04:48 +01001225static void
Michal Vasko5b37a352020-03-06 13:38:33 +01001226test_state(void **state)
1227{
Michal Vaskocc048b22020-03-27 15:52:38 +01001228 *state = test_state;
Michal Vasko5b37a352020-03-06 13:38:33 +01001229
1230 const char *data;
1231 struct lyd_node *tree;
1232
1233 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001234 "<cont xmlns=\"urn:tests:h\">\n"
1235 " <cont2>\n"
1236 " <l>val</l>\n"
1237 " </cont2>\n"
1238 "</cont>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02001239 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY | LYD_PARSE_NO_STATE, 0, &tree));
Michal Vasko5b37a352020-03-06 13:38:33 +01001240 assert_null(tree);
Radek Krejci1798aae2020-07-14 13:26:06 +02001241 logbuf_assert("Invalid state data node \"cont2\" found. /h:cont/cont2");
Michal Vasko5b37a352020-03-06 13:38:33 +01001242
Michal Vasko63f3d842020-07-08 10:10:14 +02001243 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT | LYD_VALIDATE_NO_STATE, &tree));
Michal Vasko5b37a352020-03-06 13:38:33 +01001244 assert_null(tree);
1245 logbuf_assert("Invalid state data node \"cont2\" found. /h:cont/cont2");
1246
Michal Vasko63f3d842020-07-08 10:10:14 +02001247 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY, 0, &tree));
Michal Vasko5b37a352020-03-06 13:38:33 +01001248 assert_non_null(tree);
1249
Michal Vasko3a41dff2020-07-15 14:30:28 +02001250 assert_int_equal(LY_EVALID, lyd_validate_all(&tree, NULL, LYD_VALIDATE_PRESENT | LYD_VALIDATE_NO_STATE, NULL));
Michal Vasko5b37a352020-03-06 13:38:33 +01001251 logbuf_assert("Invalid state data node \"cont2\" found. /h:cont/cont2");
1252
1253 lyd_free_siblings(tree);
1254
1255 *state = NULL;
1256}
1257
Michal Vaskocc048b22020-03-27 15:52:38 +01001258static void
1259test_must(void **state)
1260{
1261 *state = test_must;
1262
1263 const char *data;
1264 struct lyd_node *tree;
1265
1266 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001267 "<cont xmlns=\"urn:tests:i\">\n"
1268 " <l>wrong</l>\n"
1269 " <l2>val</l2>\n"
1270 "</cont>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02001271 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskocc048b22020-03-27 15:52:38 +01001272 assert_null(tree);
1273 logbuf_assert("Must condition \"../l = 'right'\" not satisfied. /i:cont/l2");
1274
1275 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001276 "<cont xmlns=\"urn:tests:i\">\n"
1277 " <l>right</l>\n"
1278 " <l2>val</l2>\n"
1279 "</cont>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02001280 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskocc048b22020-03-27 15:52:38 +01001281 assert_non_null(tree);
1282 lyd_free_tree(tree);
1283
1284 *state = NULL;
1285}
1286
Michal Vaskofea12c62020-03-30 11:00:15 +02001287static void
1288test_action(void **state)
1289{
1290 *state = test_action;
1291
1292 const char *data;
Michal Vasko63f3d842020-07-08 10:10:14 +02001293 struct ly_in *in;
Michal Vaskofea12c62020-03-30 11:00:15 +02001294 struct lyd_node *tree, *op_tree;
Michal Vaskofea12c62020-03-30 11:00:15 +02001295
1296 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001297 "<cont xmlns=\"urn:tests:j\">\n"
1298 " <l1>\n"
1299 " <k>val1</k>\n"
1300 " <act>\n"
1301 " <lf2>target</lf2>\n"
1302 " </act>\n"
1303 " </l1>\n"
1304 "</cont>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02001305 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
1306 assert_int_equal(LY_SUCCESS, lyd_parse_rpc(ctx, in, LYD_XML, &op_tree, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001307 assert_non_null(op_tree);
1308
1309 /* missing leafref */
Michal Vasko8104fd42020-07-13 11:09:51 +02001310 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, NULL, LYD_VALIDATE_OP_RPC, NULL));
Michal Vasko004d3152020-06-11 19:59:22 +02001311 logbuf_assert("Invalid leafref value \"target\" - no target instance \"/lf3\" with the same value."
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001312 " /j:cont/l1[k='val1']/act/lf2");
Michal Vasko63f3d842020-07-08 10:10:14 +02001313 ly_in_free(in, 0);
Michal Vaskofea12c62020-03-30 11:00:15 +02001314
1315 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001316 "<cont xmlns=\"urn:tests:j\">\n"
1317 " <lf1>not true</lf1>\n"
1318 "</cont>\n"
1319 "<lf3 xmlns=\"urn:tests:j\">target</lf3>\n";
Michal Vasko0f3377d2020-11-09 20:56:11 +01001320 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY, 0, &tree));
Michal Vaskofea12c62020-03-30 11:00:15 +02001321 assert_non_null(tree);
1322
Michal Vaskofea12c62020-03-30 11:00:15 +02001323 /* input must false */
Michal Vasko8104fd42020-07-13 11:09:51 +02001324 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_RPC, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001325 logbuf_assert("Must condition \"../../lf1 = 'true'\" not satisfied. /j:cont/l1[k='val1']/act");
1326
1327 lyd_free_siblings(tree);
1328 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001329 "<cont xmlns=\"urn:tests:j\">\n"
1330 " <lf1>true</lf1>\n"
1331 "</cont>\n"
1332 "<lf3 xmlns=\"urn:tests:j\">target</lf3>\n";
Michal Vasko0f3377d2020-11-09 20:56:11 +01001333 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY, 0, &tree));
Michal Vaskofea12c62020-03-30 11:00:15 +02001334 assert_non_null(tree);
1335
1336 /* success */
Michal Vasko8104fd42020-07-13 11:09:51 +02001337 assert_int_equal(LY_SUCCESS, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_RPC, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001338
Michal Vaskocb7526d2020-03-30 15:08:26 +02001339 lyd_free_tree(op_tree);
1340 lyd_free_siblings(tree);
1341
1342 *state = NULL;
1343}
1344
1345static void
1346test_reply(void **state)
1347{
1348 *state = test_reply;
1349
1350 const char *data;
Michal Vasko63f3d842020-07-08 10:10:14 +02001351 struct ly_in *in;
Michal Vaskocb7526d2020-03-30 15:08:26 +02001352 struct lyd_node *tree, *op_tree, *request;
Michal Vaskocb7526d2020-03-30 15:08:26 +02001353
1354 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001355 "<cont xmlns=\"urn:tests:j\">\n"
1356 " <l1>\n"
1357 " <k>val1</k>\n"
1358 " <act>\n"
1359 " <lf2>target</lf2>\n"
1360 " </act>\n"
1361 " </l1>\n"
1362 "</cont>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02001363 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
1364 assert_int_equal(LY_SUCCESS, lyd_parse_rpc(ctx, in, LYD_XML, &request, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001365 assert_non_null(request);
Michal Vasko63f3d842020-07-08 10:10:14 +02001366 ly_in_free(in, 0);
1367
Michal Vaskocb7526d2020-03-30 15:08:26 +02001368 data = "<lf2 xmlns=\"urn:tests:j\">target</lf2>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001369 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
1370 assert_int_equal(LY_SUCCESS, lyd_parse_reply(request, in, LYD_XML, &op_tree, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001371 lyd_free_all(request);
1372 assert_non_null(op_tree);
Michal Vasko63f3d842020-07-08 10:10:14 +02001373 ly_in_free(in, 0);
Michal Vaskocb7526d2020-03-30 15:08:26 +02001374
1375 /* missing leafref */
Michal Vasko8104fd42020-07-13 11:09:51 +02001376 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, NULL, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vasko004d3152020-06-11 19:59:22 +02001377 logbuf_assert("Invalid leafref value \"target\" - no target instance \"/lf4\" with the same value."
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001378 " /j:cont/l1[k='val1']/act/lf2");
Michal Vaskocb7526d2020-03-30 15:08:26 +02001379
1380 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001381 "<cont xmlns=\"urn:tests:j\">\n"
1382 " <lf1>not true</lf1>\n"
1383 "</cont>\n"
1384 "<lf4 xmlns=\"urn:tests:j\">target</lf4>\n";
Michal Vasko0f3377d2020-11-09 20:56:11 +01001385 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY, 0, &tree));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001386 assert_non_null(tree);
1387
Michal Vaskocb7526d2020-03-30 15:08:26 +02001388 /* input must false */
Michal Vasko8104fd42020-07-13 11:09:51 +02001389 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001390 logbuf_assert("Must condition \"../../lf1 = 'true2'\" not satisfied. /j:cont/l1[k='val1']/act");
1391
1392 lyd_free_siblings(tree);
1393 data =
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001394 "<cont xmlns=\"urn:tests:j\">\n"
1395 " <lf1>true2</lf1>\n"
1396 "</cont>\n"
1397 "<lf4 xmlns=\"urn:tests:j\">target</lf4>\n";
Michal Vasko0f3377d2020-11-09 20:56:11 +01001398 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY, 0, &tree));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001399 assert_non_null(tree);
1400
1401 /* success */
Michal Vasko8104fd42020-07-13 11:09:51 +02001402 assert_int_equal(LY_SUCCESS, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001403
Michal Vaskofea12c62020-03-30 11:00:15 +02001404 lyd_free_tree(op_tree);
1405 lyd_free_siblings(tree);
1406
1407 *state = NULL;
1408}
1409
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001410int
1411main(void)
Michal Vaskocde73ac2019-11-14 16:10:27 +01001412{
1413 const struct CMUnitTest tests[] = {
Michal Vaskoacd83e72020-02-04 14:12:01 +01001414 cmocka_unit_test_teardown(test_when, teardown_s),
1415 cmocka_unit_test_teardown(test_mandatory, teardown_s),
1416 cmocka_unit_test_teardown(test_minmax, teardown_s),
Michal Vasko14654712020-02-06 08:35:21 +01001417 cmocka_unit_test_teardown(test_unique, teardown_s),
1418 cmocka_unit_test_teardown(test_unique_nested, teardown_s),
Michal Vaskof03ed032020-03-04 13:31:44 +01001419 cmocka_unit_test_teardown(test_dup, teardown_s),
1420 cmocka_unit_test_teardown(test_defaults, teardown_s),
Michal Vasko5b37a352020-03-06 13:38:33 +01001421 cmocka_unit_test_teardown(test_state, teardown_s),
Michal Vaskocc048b22020-03-27 15:52:38 +01001422 cmocka_unit_test_teardown(test_must, teardown_s),
Michal Vaskofea12c62020-03-30 11:00:15 +02001423 cmocka_unit_test_teardown(test_action, teardown_s),
Michal Vaskocb7526d2020-03-30 15:08:26 +02001424 cmocka_unit_test_teardown(test_reply, teardown_s),
Michal Vaskocde73ac2019-11-14 16:10:27 +01001425 };
1426
Michal Vaskoacd83e72020-02-04 14:12:01 +01001427 return cmocka_run_group_tests(tests, setup, teardown);
Michal Vaskocde73ac2019-11-14 16:10:27 +01001428}