blob: 5b6953d19b2744e1f200b94c52e173085d2b6038 [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
15#include <stdarg.h>
16#include <stddef.h>
17#include <setjmp.h>
18#include <cmocka.h>
19
20#include <stdio.h>
21#include <string.h>
22
Radek Krejci70593c12020-06-13 20:48:09 +020023#include "context.h"
Michal Vasko63f3d842020-07-08 10:10:14 +020024#include "parser.h"
Radek Krejci7931b192020-06-25 17:05:03 +020025#include "parser_data.h"
Radek Krejci70593c12020-06-13 20:48:09 +020026#include "printer.h"
27#include "printer_data.h"
28#include "tests/config.h"
29#include "tree_schema.h"
30#include "tree_data_internal.h"
Michal Vaskocde73ac2019-11-14 16:10:27 +010031
32#define BUFSIZE 1024
33char logbuf[BUFSIZE] = {0};
34int store = -1; /* negative for infinite logging, positive for limited logging */
35
36struct ly_ctx *ctx; /* context for tests */
37
38/* set to 0 to printing error messages to stderr instead of checking them in code */
39#define ENABLE_LOGGER_CHECKING 1
40
41#if ENABLE_LOGGER_CHECKING
42static void
43logger(LY_LOG_LEVEL level, const char *msg, const char *path)
44{
45 (void) level; /* unused */
46 if (store) {
47 if (path && path[0]) {
48 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
49 } else {
50 strncpy(logbuf, msg, BUFSIZE - 1);
51 }
52 if (store > 0) {
53 --store;
54 }
55 }
56}
57#endif
58
59static int
60setup(void **state)
61{
62 (void) state; /* unused */
63
64 const char *schema_a =
65 "module a {"
66 "namespace urn:tests:a;"
67 "prefix a;"
68 "yang-version 1.1;"
69
70 "container cont {"
71 "leaf a {"
72 "when \"../../c = 'val_c'\";"
73 "type string;"
74 "}"
75 "leaf b {"
76 "type string;"
77 "}"
78 "}"
79 "leaf c {"
80 "when \"/cont/b = 'val_b'\";"
81 "type string;"
82 "}"
83 "}";
Michal Vaskoa3881362020-01-21 15:57:35 +010084 const char *schema_b =
85 "module b {"
86 "namespace urn:tests:b;"
87 "prefix b;"
88 "yang-version 1.1;"
89
90 "choice choic {"
91 "mandatory true;"
92 "leaf a {"
93 "type string;"
94 "}"
95 "case b {"
96 "leaf l {"
97 "type string;"
98 "}"
99 "}"
100 "}"
101 "leaf c {"
102 "mandatory true;"
103 "type string;"
104 "}"
105 "leaf d {"
106 "type empty;"
107 "}"
108 "}";
Michal Vaskoacd83e72020-02-04 14:12:01 +0100109 const char *schema_c =
110 "module c {"
111 "namespace urn:tests:c;"
112 "prefix c;"
113 "yang-version 1.1;"
114
115 "choice choic {"
116 "leaf a {"
117 "type string;"
118 "}"
119 "case b {"
120 "leaf-list l {"
121 "min-elements 3;"
122 "type string;"
123 "}"
124 "}"
125 "}"
126 "list lt {"
127 "max-elements 4;"
128 "key \"k\";"
129 "leaf k {"
130 "type string;"
131 "}"
132 "}"
133 "leaf d {"
134 "type empty;"
135 "}"
136 "}";
Michal Vasko14654712020-02-06 08:35:21 +0100137 const char *schema_d =
138 "module d {"
139 "namespace urn:tests:d;"
140 "prefix d;"
141 "yang-version 1.1;"
142
143 "list lt {"
144 "key \"k\";"
145 "unique \"l1\";"
146 "leaf k {"
147 "type string;"
148 "}"
149 "leaf l1 {"
150 "type string;"
151 "}"
152 "}"
153 "list lt2 {"
154 "key \"k\";"
155 "unique \"cont/l2 l4\";"
156 "unique \"l5 l6\";"
157 "leaf k {"
158 "type string;"
159 "}"
160 "container cont {"
161 "leaf l2 {"
162 "type string;"
163 "}"
164 "}"
165 "leaf l4 {"
166 "type string;"
167 "}"
168 "leaf l5 {"
169 "type string;"
170 "}"
171 "leaf l6 {"
172 "type string;"
173 "}"
174 "list lt3 {"
175 "key \"kk\";"
176 "unique \"l3\";"
177 "leaf kk {"
178 "type string;"
179 "}"
180 "leaf l3 {"
181 "type string;"
182 "}"
183 "}"
184 "}"
185 "}";
Michal Vaskof03ed032020-03-04 13:31:44 +0100186 const char *schema_e =
187 "module e {"
188 "namespace urn:tests:e;"
189 "prefix e;"
190 "yang-version 1.1;"
191
192 "choice choic {"
193 "leaf a {"
194 "type string;"
195 "}"
196 "case b {"
197 "leaf-list l {"
198 "type string;"
199 "}"
200 "}"
201 "}"
202 "list lt {"
203 "key \"k\";"
204 "leaf k {"
205 "type string;"
206 "}"
207 "}"
208 "leaf d {"
209 "type uint32;"
210 "}"
211 "leaf-list ll {"
212 "type string;"
213 "}"
214 "container cont {"
215 "list lt {"
216 "key \"k\";"
217 "leaf k {"
218 "type string;"
219 "}"
220 "}"
221 "leaf d {"
222 "type uint32;"
223 "}"
224 "leaf-list ll {"
225 "type string;"
226 "}"
Michal Vasko9f96a052020-03-10 09:41:45 +0100227 "leaf-list ll2 {"
228 "type enumeration {"
229 "enum one;"
230 "enum two;"
231 "}"
232 "}"
Michal Vaskof03ed032020-03-04 13:31:44 +0100233 "}"
234 "}";
235 const char *schema_f =
236 "module f {"
237 "namespace urn:tests:f;"
238 "prefix f;"
239 "yang-version 1.1;"
240
241 "choice choic {"
242 "default \"c\";"
243 "leaf a {"
244 "type string;"
245 "}"
246 "case b {"
247 "leaf l {"
248 "type string;"
249 "}"
250 "}"
251 "case c {"
252 "leaf-list ll1 {"
253 "type string;"
254 "default \"def1\";"
255 "default \"def2\";"
256 "default \"def3\";"
257 "}"
258 "}"
259 "}"
260 "leaf d {"
261 "type uint32;"
262 "default 15;"
263 "}"
264 "leaf-list ll2 {"
265 "type string;"
266 "default \"dflt1\";"
267 "default \"dflt2\";"
268 "}"
269 "container cont {"
270 "choice choic {"
271 "default \"c\";"
272 "leaf a {"
273 "type string;"
274 "}"
275 "case b {"
276 "leaf l {"
277 "type string;"
278 "}"
279 "}"
280 "case c {"
281 "leaf-list ll1 {"
282 "type string;"
283 "default \"def1\";"
284 "default \"def2\";"
285 "default \"def3\";"
286 "}"
287 "}"
288 "}"
289 "leaf d {"
290 "type uint32;"
291 "default 15;"
292 "}"
293 "leaf-list ll2 {"
294 "type string;"
295 "default \"dflt1\";"
296 "default \"dflt2\";"
297 "}"
298 "}"
299 "}";
Michal Vaskoc193ce92020-03-06 11:04:48 +0100300 const char *schema_g =
301 "module g {"
302 "namespace urn:tests:g;"
303 "prefix g;"
304 "yang-version 1.1;"
305
306 "feature f1;"
307 "feature f2;"
308 "feature f3;"
309
310 "container cont {"
311 "if-feature \"f1\";"
312 "choice choic {"
313 "if-feature \"f2 or f3\";"
314 "leaf a {"
315 "type string;"
316 "}"
317 "case b {"
318 "if-feature \"f2 and f1\";"
319 "leaf l {"
320 "type string;"
321 "}"
322 "}"
323 "}"
324 "leaf d {"
325 "type uint32;"
326 "}"
327 "container cont2 {"
328 "if-feature \"f2\";"
329 "leaf e {"
330 "type string;"
331 "}"
332 "}"
333 "}"
334 "}";
Michal Vasko5b37a352020-03-06 13:38:33 +0100335 const char *schema_h =
336 "module h {"
337 "namespace urn:tests:h;"
338 "prefix h;"
339 "yang-version 1.1;"
340
341 "container cont {"
342 "container cont2 {"
343 "config false;"
344 "leaf l {"
345 "type string;"
346 "}"
347 "}"
348 "}"
349 "}";
Michal Vaskocc048b22020-03-27 15:52:38 +0100350 const char *schema_i =
351 "module i {"
352 "namespace urn:tests:i;"
353 "prefix i;"
354 "yang-version 1.1;"
355
356 "container cont {"
357 "leaf l {"
358 "type string;"
359 "}"
360 "leaf l2 {"
361 "must \"../l = 'right'\";"
362 "type string;"
363 "}"
364 "}"
365 "}";
Michal Vaskofea12c62020-03-30 11:00:15 +0200366 const char *schema_j =
367 "module j {"
368 "namespace urn:tests:j;"
369 "prefix j;"
370 "yang-version 1.1;"
371
372 "feature feat1;"
373
374 "container cont {"
375 "must \"false()\";"
376 "list l1 {"
377 "key \"k\";"
378 "leaf k {"
379 "type string;"
380 "}"
381 "action act {"
382 "if-feature feat1;"
383 "input {"
384 "must \"../../lf1 = 'true'\";"
385 "leaf lf2 {"
386 "type leafref {"
387 "path /lf3;"
388 "}"
389 "}"
390 "}"
Michal Vaskocb7526d2020-03-30 15:08:26 +0200391 "output {"
392 "must \"../../lf1 = 'true2'\";"
393 "leaf lf2 {"
394 "type leafref {"
395 "path /lf4;"
396 "}"
397 "}"
398 "}"
Michal Vaskofea12c62020-03-30 11:00:15 +0200399 "}"
400 "}"
401
402 "leaf lf1 {"
403 "type string;"
404 "}"
405 "}"
406
407 "leaf lf3 {"
408 "type string;"
409 "}"
Michal Vaskocb7526d2020-03-30 15:08:26 +0200410
411 "leaf lf4 {"
412 "type string;"
413 "}"
Michal Vaskofea12c62020-03-30 11:00:15 +0200414 "}";
Michal Vaskocde73ac2019-11-14 16:10:27 +0100415
416#if ENABLE_LOGGER_CHECKING
417 ly_set_log_clb(logger, 1);
418#endif
419
Michal Vaskof03ed032020-03-04 13:31:44 +0100420 assert_int_equal(LY_SUCCESS, ly_ctx_new(TESTS_DIR_MODULES_YANG, 0, &ctx));
421 assert_non_null(ly_ctx_load_module(ctx, "ietf-netconf-with-defaults", "2011-06-01"));
Michal Vasko3a41dff2020-07-15 14:30:28 +0200422 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_a, LYS_IN_YANG, NULL));
423 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_b, LYS_IN_YANG, NULL));
424 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_c, LYS_IN_YANG, NULL));
425 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_d, LYS_IN_YANG, NULL));
426 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_e, LYS_IN_YANG, NULL));
427 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_f, LYS_IN_YANG, NULL));
428 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_g, LYS_IN_YANG, NULL));
429 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_h, LYS_IN_YANG, NULL));
430 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_i, LYS_IN_YANG, NULL));
431 assert_int_equal(LY_SUCCESS, lys_parse_mem(ctx, schema_j, LYS_IN_YANG, NULL));
Michal Vaskocde73ac2019-11-14 16:10:27 +0100432
433 return 0;
434}
435
436static int
437teardown(void **state)
438{
Michal Vaskoacd83e72020-02-04 14:12:01 +0100439 (void)state;
440 ly_ctx_destroy(ctx, NULL);
441 ctx = NULL;
442
443 return 0;
444}
445
446static int
447teardown_s(void **state)
448{
Michal Vaskocde73ac2019-11-14 16:10:27 +0100449#if ENABLE_LOGGER_CHECKING
450 if (*state) {
451 fprintf(stderr, "%s\n", logbuf);
452 }
453#else
454 (void) state; /* unused */
455#endif
456
Michal Vaskocde73ac2019-11-14 16:10:27 +0100457 return 0;
458}
459
460void
461logbuf_clean(void)
462{
463 logbuf[0] = '\0';
464}
465
466#if ENABLE_LOGGER_CHECKING
467# define logbuf_assert(str) assert_string_equal(logbuf, str)
468#else
469# define logbuf_assert(str)
470#endif
471
472static void
473test_when(void **state)
474{
475 *state = test_when;
476
477 const char *data;
478 struct lyd_node *tree;
479
480 data = "<c xmlns=\"urn:tests:a\">hey</c>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200481 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 +0100482 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100483 logbuf_assert("When condition \"/cont/b = 'val_b'\" not satisfied. /a:c");
Michal Vaskocde73ac2019-11-14 16:10:27 +0100484
485 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 +0200486 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 +0100487 assert_non_null(tree);
488 assert_string_equal("c", tree->next->schema->name);
489 assert_int_equal(LYD_WHEN_TRUE, tree->next->flags);
490 lyd_free_all(tree);
491
492 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 +0200493 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 +0100494 assert_non_null(tree);
Radek Krejcia1c1e542020-09-29 16:06:52 +0200495 assert_string_equal("a", lyd_child(tree)->schema->name);
496 assert_int_equal(LYD_WHEN_TRUE, lyd_child(tree)->flags);
Michal Vaskocde73ac2019-11-14 16:10:27 +0100497 assert_string_equal("c", tree->next->schema->name);
498 assert_int_equal(LYD_WHEN_TRUE, tree->next->flags);
499 lyd_free_all(tree);
500
501 *state = NULL;
502}
503
Michal Vaskoa3881362020-01-21 15:57:35 +0100504static void
505test_mandatory(void **state)
506{
507 *state = test_mandatory;
508
509 const char *data;
510 struct lyd_node *tree;
511
512 data = "<d xmlns=\"urn:tests:b\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200513 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 +0100514 assert_null(tree);
515 logbuf_assert("Mandatory node \"choic\" instance does not exist. /b:choic");
516
517 data = "<l xmlns=\"urn:tests:b\">string</l><d xmlns=\"urn:tests:b\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200518 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 +0100519 assert_null(tree);
520 logbuf_assert("Mandatory node \"c\" instance does not exist. /b:c");
521
522 data = "<a xmlns=\"urn:tests:b\">string</a>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200523 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 +0100524 assert_null(tree);
525 logbuf_assert("Mandatory node \"c\" instance does not exist. /b:c");
526
527 data = "<a xmlns=\"urn:tests:b\">string</a><c xmlns=\"urn:tests:b\">string2</c>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200528 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 +0100529 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100530 lyd_free_siblings(tree);
Michal Vaskoa3881362020-01-21 15:57:35 +0100531
532 *state = NULL;
533}
534
Michal Vaskoacd83e72020-02-04 14:12:01 +0100535static void
536test_minmax(void **state)
537{
538 *state = test_minmax;
539
540 const char *data;
541 struct lyd_node *tree;
542
543 data = "<d xmlns=\"urn:tests:c\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200544 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 +0100545 assert_null(tree);
546 logbuf_assert("Too few \"l\" instances. /c:choic/b/l");
547
548 data =
549 "<l xmlns=\"urn:tests:c\">val1</l>"
550 "<l xmlns=\"urn:tests:c\">val2</l>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200551 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 +0100552 assert_null(tree);
553 logbuf_assert("Too few \"l\" instances. /c:choic/b/l");
554
555 data =
556 "<l xmlns=\"urn:tests:c\">val1</l>"
557 "<l xmlns=\"urn:tests:c\">val2</l>"
558 "<l xmlns=\"urn:tests:c\">val3</l>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200559 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 +0100560 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100561 lyd_free_siblings(tree);
Michal Vaskoacd83e72020-02-04 14:12:01 +0100562
563 data =
564 "<l xmlns=\"urn:tests:c\">val1</l>"
565 "<l xmlns=\"urn:tests:c\">val2</l>"
566 "<l xmlns=\"urn:tests:c\">val3</l>"
567 "<lt xmlns=\"urn:tests:c\"><k>val1</k></lt>"
568 "<lt xmlns=\"urn:tests:c\"><k>val2</k></lt>"
569 "<lt xmlns=\"urn:tests:c\"><k>val3</k></lt>"
570 "<lt xmlns=\"urn:tests:c\"><k>val4</k></lt>"
571 "<lt xmlns=\"urn:tests:c\"><k>val5</k></lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200572 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 +0100573 assert_null(tree);
574 logbuf_assert("Too many \"lt\" instances. /c:lt");
575
576 *state = NULL;
577}
578
Michal Vasko14654712020-02-06 08:35:21 +0100579static void
580test_unique(void **state)
581{
582 *state = test_unique;
583
584 const char *data;
585 struct lyd_node *tree;
586
587 data =
588 "<lt xmlns=\"urn:tests:d\">"
589 "<k>val1</k>"
590 "<l1>same</l1>"
591 "</lt>"
592 "<lt xmlns=\"urn:tests:d\">"
593 "<k>val2</k>"
594 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200595 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 +0100596 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100597 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100598
599 data =
600 "<lt xmlns=\"urn:tests:d\">"
601 "<k>val1</k>"
602 "<l1>same</l1>"
603 "</lt>"
604 "<lt xmlns=\"urn:tests:d\">"
605 "<k>val2</k>"
606 "<l1>not-same</l1>"
607 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200608 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 +0100609 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100610 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100611
612 data =
613 "<lt xmlns=\"urn:tests:d\">"
614 "<k>val1</k>"
615 "<l1>same</l1>"
616 "</lt>"
617 "<lt xmlns=\"urn:tests:d\">"
618 "<k>val2</k>"
619 "<l1>same</l1>"
620 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200621 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 +0100622 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100623 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 +0100624
625 /* now try with more instances */
626 data =
627 "<lt xmlns=\"urn:tests:d\">"
628 "<k>val1</k>"
629 "<l1>1</l1>"
630 "</lt>"
631 "<lt xmlns=\"urn:tests:d\">"
632 "<k>val2</k>"
633 "<l1>2</l1>"
634 "</lt>"
635 "<lt xmlns=\"urn:tests:d\">"
636 "<k>val3</k>"
637 "<l1>3</l1>"
638 "</lt>"
639 "<lt xmlns=\"urn:tests:d\">"
640 "<k>val4</k>"
641 "<l1>4</l1>"
642 "</lt>"
643 "<lt xmlns=\"urn:tests:d\">"
644 "<k>val5</k>"
645 "<l1>5</l1>"
646 "</lt>"
647 "<lt xmlns=\"urn:tests:d\">"
648 "<k>val6</k>"
649 "<l1>6</l1>"
650 "</lt>"
651 "<lt xmlns=\"urn:tests:d\">"
652 "<k>val7</k>"
653 "<l1>7</l1>"
654 "</lt>"
655 "<lt xmlns=\"urn:tests:d\">"
656 "<k>val8</k>"
657 "<l1>8</l1>"
658 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200659 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 +0100660 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100661 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100662
663 data =
664 "<lt xmlns=\"urn:tests:d\">"
665 "<k>val1</k>"
666 "<l1>1</l1>"
667 "</lt>"
668 "<lt xmlns=\"urn:tests:d\">"
669 "<k>val2</k>"
670 "<l1>2</l1>"
671 "</lt>"
672 "<lt xmlns=\"urn:tests:d\">"
673 "<k>val3</k>"
674 "<l1>3</l1>"
675 "</lt>"
676 "<lt xmlns=\"urn:tests:d\">"
677 "<k>val4</k>"
678 "</lt>"
679 "<lt xmlns=\"urn:tests:d\">"
680 "<k>val5</k>"
681 "<l1>5</l1>"
682 "</lt>"
683 "<lt xmlns=\"urn:tests:d\">"
684 "<k>val6</k>"
685 "<l1>6</l1>"
686 "</lt>"
687 "<lt xmlns=\"urn:tests:d\">"
688 "<k>val7</k>"
689 "</lt>"
690 "<lt xmlns=\"urn:tests:d\">"
691 "<k>val8</k>"
692 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200693 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 +0100694 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100695 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100696
697 data =
698 "<lt xmlns=\"urn:tests:d\">"
699 "<k>val1</k>"
700 "<l1>1</l1>"
701 "</lt>"
702 "<lt xmlns=\"urn:tests:d\">"
703 "<k>val2</k>"
704 "<l1>2</l1>"
705 "</lt>"
706 "<lt xmlns=\"urn:tests:d\">"
707 "<k>val3</k>"
708 "</lt>"
709 "<lt xmlns=\"urn:tests:d\">"
710 "<k>val4</k>"
711 "<l1>4</l1>"
712 "</lt>"
713 "<lt xmlns=\"urn:tests:d\">"
714 "<k>val5</k>"
715 "</lt>"
716 "<lt xmlns=\"urn:tests:d\">"
717 "<k>val6</k>"
718 "</lt>"
719 "<lt xmlns=\"urn:tests:d\">"
720 "<k>val7</k>"
721 "<l1>2</l1>"
722 "</lt>"
723 "<lt xmlns=\"urn:tests:d\">"
724 "<k>val8</k>"
725 "<l1>8</l1>"
726 "</lt>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200727 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 +0100728 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100729 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 +0100730
731 *state = NULL;
732}
733
734static void
735test_unique_nested(void **state)
736{
737 *state = test_unique_nested;
738
739 const char *data;
740 struct lyd_node *tree;
741
742 /* nested list uniquest are compared only with instances in the same parent list instance */
743 data =
744 "<lt2 xmlns=\"urn:tests:d\">"
745 "<k>val1</k>"
746 "<cont>"
747 "<l2>1</l2>"
748 "</cont>"
749 "<l4>1</l4>"
750 "</lt2>"
751 "<lt2 xmlns=\"urn:tests:d\">"
752 "<k>val2</k>"
753 "<cont>"
754 "<l2>2</l2>"
755 "</cont>"
756 "<l4>2</l4>"
757 "<lt3>"
758 "<kk>val1</kk>"
759 "<l3>1</l3>"
760 "</lt3>"
761 "<lt3>"
762 "<kk>val2</kk>"
763 "<l3>2</l3>"
764 "</lt3>"
765 "</lt2>"
766 "<lt2 xmlns=\"urn:tests:d\">"
767 "<k>val3</k>"
768 "<cont>"
769 "<l2>3</l2>"
770 "</cont>"
771 "<l4>3</l4>"
772 "<lt3>"
773 "<kk>val1</kk>"
774 "<l3>2</l3>"
775 "</lt3>"
776 "</lt2>"
777 "<lt2 xmlns=\"urn:tests:d\">"
778 "<k>val4</k>"
779 "<cont>"
780 "<l2>4</l2>"
781 "</cont>"
782 "<l4>4</l4>"
783 "<lt3>"
784 "<kk>val1</kk>"
785 "<l3>3</l3>"
786 "</lt3>"
787 "</lt2>"
788 "<lt2 xmlns=\"urn:tests:d\">"
789 "<k>val5</k>"
790 "<cont>"
791 "<l2>5</l2>"
792 "</cont>"
793 "<l4>5</l4>"
794 "<lt3>"
795 "<kk>val1</kk>"
796 "<l3>3</l3>"
797 "</lt3>"
798 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200799 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 +0100800 assert_non_null(tree);
Michal Vaskof03ed032020-03-04 13:31:44 +0100801 lyd_free_siblings(tree);
Michal Vasko14654712020-02-06 08:35:21 +0100802
803 data =
804 "<lt2 xmlns=\"urn:tests:d\">"
805 "<k>val1</k>"
806 "<cont>"
807 "<l2>1</l2>"
808 "</cont>"
809 "<l4>1</l4>"
810 "</lt2>"
811 "<lt2 xmlns=\"urn:tests:d\">"
812 "<k>val2</k>"
813 "<cont>"
814 "<l2>2</l2>"
815 "</cont>"
816 "<lt3>"
817 "<kk>val1</kk>"
818 "<l3>1</l3>"
819 "</lt3>"
820 "<lt3>"
821 "<kk>val2</kk>"
822 "<l3>2</l3>"
823 "</lt3>"
824 "<lt3>"
825 "<kk>val3</kk>"
826 "<l3>1</l3>"
827 "</lt3>"
828 "</lt2>"
829 "<lt2 xmlns=\"urn:tests:d\">"
830 "<k>val3</k>"
831 "<cont>"
832 "<l2>3</l2>"
833 "</cont>"
834 "<l4>1</l4>"
835 "<lt3>"
836 "<kk>val1</kk>"
837 "<l3>2</l3>"
838 "</lt3>"
839 "</lt2>"
840 "<lt2 xmlns=\"urn:tests:d\">"
841 "<k>val4</k>"
842 "<cont>"
843 "<l2>4</l2>"
844 "</cont>"
845 "<lt3>"
846 "<kk>val1</kk>"
847 "<l3>3</l3>"
848 "</lt3>"
849 "</lt2>"
850 "<lt2 xmlns=\"urn:tests:d\">"
851 "<k>val5</k>"
852 "<cont>"
853 "<l2>5</l2>"
854 "</cont>"
855 "<lt3>"
856 "<kk>val1</kk>"
857 "<l3>3</l3>"
858 "</lt3>"
859 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200860 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 +0100861 assert_null(tree);
862 logbuf_assert("Unique data leaf(s) \"l3\" not satisfied in \"/d:lt2[k='val2']/lt3[kk='val3']\" and"
Michal Vasko9b368d32020-02-14 13:53:31 +0100863 " \"/d:lt2[k='val2']/lt3[kk='val1']\". /d:lt2[k='val2']/lt3[kk='val1']");
Michal Vasko14654712020-02-06 08:35:21 +0100864
865 data =
866 "<lt2 xmlns=\"urn:tests:d\">"
867 "<k>val1</k>"
868 "<cont>"
869 "<l2>1</l2>"
870 "</cont>"
871 "<l4>1</l4>"
872 "</lt2>"
873 "<lt2 xmlns=\"urn:tests:d\">"
874 "<k>val2</k>"
875 "<cont>"
876 "<l2>2</l2>"
877 "</cont>"
878 "<l4>2</l4>"
879 "</lt2>"
880 "<lt2 xmlns=\"urn:tests:d\">"
881 "<k>val3</k>"
882 "<cont>"
883 "<l2>3</l2>"
884 "</cont>"
885 "<l4>3</l4>"
886 "</lt2>"
887 "<lt2 xmlns=\"urn:tests:d\">"
888 "<k>val4</k>"
889 "<cont>"
890 "<l2>2</l2>"
891 "</cont>"
892 "<l4>2</l4>"
893 "</lt2>"
894 "<lt2 xmlns=\"urn:tests:d\">"
895 "<k>val5</k>"
896 "<cont>"
897 "<l2>5</l2>"
898 "</cont>"
899 "<l4>5</l4>"
900 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200901 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 +0100902 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100903 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 +0100904
905 data =
906 "<lt2 xmlns=\"urn:tests:d\">"
907 "<k>val1</k>"
908 "<cont>"
909 "<l2>1</l2>"
910 "</cont>"
911 "<l4>1</l4>"
912 "<l5>1</l5>"
913 "<l6>1</l6>"
914 "</lt2>"
915 "<lt2 xmlns=\"urn:tests:d\">"
916 "<k>val2</k>"
917 "<cont>"
918 "<l2>2</l2>"
919 "</cont>"
920 "<l4>1</l4>"
921 "<l5>1</l5>"
922 "</lt2>"
923 "<lt2 xmlns=\"urn:tests:d\">"
924 "<k>val3</k>"
925 "<cont>"
926 "<l2>3</l2>"
927 "</cont>"
928 "<l4>1</l4>"
929 "<l5>3</l5>"
930 "<l6>3</l6>"
931 "</lt2>"
932 "<lt2 xmlns=\"urn:tests:d\">"
933 "<k>val4</k>"
934 "<cont>"
935 "<l2>4</l2>"
936 "</cont>"
937 "<l4>1</l4>"
938 "<l6>1</l6>"
939 "</lt2>"
940 "<lt2 xmlns=\"urn:tests:d\">"
941 "<k>val5</k>"
942 "<cont>"
943 "<l2>5</l2>"
944 "</cont>"
945 "<l4>1</l4>"
946 "<l5>3</l5>"
947 "<l6>3</l6>"
948 "</lt2>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200949 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 +0100950 assert_null(tree);
Michal Vasko9b368d32020-02-14 13:53:31 +0100951 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 +0100952
953 *state = NULL;
954}
955
Michal Vaskof03ed032020-03-04 13:31:44 +0100956static void
957test_dup(void **state)
958{
959 *state = test_dup;
960
961 const char *data;
962 struct lyd_node *tree;
963
964 data = "<d xmlns=\"urn:tests:e\">25</d><d xmlns=\"urn:tests:e\">50</d>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200965 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 +0100966 assert_null(tree);
967 logbuf_assert("Duplicate instance of \"d\". /e:d");
968
969 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 +0200970 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 +0100971 assert_null(tree);
972 logbuf_assert("Duplicate instance of \"lt\". /e:lt[k='A']");
973
974 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 +0200975 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 +0100976 assert_null(tree);
977 logbuf_assert("Duplicate instance of \"ll\". /e:ll[.='B']");
978
979 data = "<cont xmlns=\"urn:tests:e\"></cont><cont xmlns=\"urn:tests:e\"/>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200980 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 +0100981 assert_null(tree);
982 logbuf_assert("Duplicate instance of \"cont\". /e:cont");
983
984 /* same tests again but using hashes */
985 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 +0200986 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 +0100987 assert_null(tree);
988 logbuf_assert("Duplicate instance of \"d\". /e:cont/d");
989
990 data = "<cont xmlns=\"urn:tests:e\"><ll>1</ll><ll>2</ll><ll>3</ll><ll>4</ll>"
991 "<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 +0200992 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 +0100993 assert_null(tree);
994 logbuf_assert("Duplicate instance of \"lt\". /e:cont/lt[k='c']");
995
996 data = "<cont xmlns=\"urn:tests:e\"><ll>1</ll><ll>2</ll><ll>3</ll><ll>4</ll>"
997 "<ll>a</ll><ll>b</ll><ll>c</ll><ll>d</ll><ll>d</ll></cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200998 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 +0100999 assert_null(tree);
1000 logbuf_assert("Duplicate instance of \"ll\". /e:cont/ll[.='d']");
1001
1002 /* cases */
1003 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 +02001004 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 +01001005 assert_null(tree);
1006 logbuf_assert("Duplicate instance of \"l\". /e:l[.='b']");
1007
1008 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 +02001009 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 +01001010 assert_null(tree);
1011 logbuf_assert("Data for both cases \"a\" and \"b\" exist. /e:choic");
1012
1013 *state = NULL;
1014}
1015
1016static void
1017test_defaults(void **state)
1018{
1019 *state = test_defaults;
1020
Michal Vaskof03ed032020-03-04 13:31:44 +01001021 char *str;
Michal Vasko8104fd42020-07-13 11:09:51 +02001022 struct lyd_node *tree, *node, *diff;
Michal Vaskof03ed032020-03-04 13:31:44 +01001023 const struct lys_module *mod = ly_ctx_get_module_latest(ctx, "f");
1024
Radek Krejci241f6b52020-05-21 18:13:49 +02001025 struct ly_out *out;
Radek Krejci84ce7b12020-06-11 17:28:25 +02001026 assert_int_equal(LY_SUCCESS, ly_out_new_memory(&str, 0, &out));
Radek Krejcia5bba312020-01-09 15:41:20 +01001027
Michal Vaskob1b5c262020-03-05 14:29:47 +01001028 /* get defaults */
1029 tree = NULL;
Michal Vasko8104fd42020-07-13 11:09:51 +02001030 assert_int_equal(lyd_validate_module(&tree, mod, 0, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001031 assert_non_null(tree);
Michal Vasko8104fd42020-07-13 11:09:51 +02001032 assert_non_null(diff);
Michal Vaskof03ed032020-03-04 13:31:44 +01001033
1034 /* check all defaults exist */
Radek Krejci52f65552020-09-01 17:03:35 +02001035 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG | LYD_PRINT_SHRINK);
Michal Vaskof03ed032020-03-04 13:31:44 +01001036 assert_string_equal(str,
Michal Vaskof03ed032020-03-04 13:31:44 +01001037 "<ll1 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>"
1038 "<ll1 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>"
1039 "<ll1 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>"
1040 "<d xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1041 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
Michal Vaskob1b5c262020-03-05 14:29:47 +01001042 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vasko52927e22020-03-16 17:26:14 +01001043 "<cont xmlns=\"urn:tests:f\">"
1044 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>"
1045 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>"
1046 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>"
1047 "<d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1048 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
1049 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vaskob1b5c262020-03-05 14:29:47 +01001050 "</cont>");
Radek Krejci241f6b52020-05-21 18:13:49 +02001051 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001052
Michal Vasko8104fd42020-07-13 11:09:51 +02001053 /* check diff */
Radek Krejci52f65552020-09-01 17:03:35 +02001054 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL | LYD_PRINT_SHRINK);
Michal Vasko8104fd42020-07-13 11:09:51 +02001055 assert_string_equal(str,
1056 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">def1</ll1>"
1057 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">def2</ll1>"
1058 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">def3</ll1>"
1059 "<d xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">15</d>"
1060 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">dflt1</ll2>"
1061 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">dflt2</ll2>"
1062 "<cont xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">"
1063 "<ll1 yang:operation=\"create\">def1</ll1>"
1064 "<ll1 yang:operation=\"create\">def2</ll1>"
1065 "<ll1 yang:operation=\"create\">def3</ll1>"
1066 "<d yang:operation=\"create\">15</d>"
1067 "<ll2 yang:operation=\"create\">dflt1</ll2>"
1068 "<ll2 yang:operation=\"create\">dflt2</ll2>"
1069 "</cont>"
1070 );
1071 ly_out_reset(out);
1072 lyd_free_siblings(diff);
1073
Michal Vaskof03ed032020-03-04 13:31:44 +01001074 /* create another explicit case and validate */
Michal Vasko3a41dff2020-07-15 14:30:28 +02001075 assert_int_equal(lyd_new_term(NULL, mod, "l", "value", &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001076 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001077 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001078
1079 /* check data tree */
Radek Krejci52f65552020-09-01 17:03:35 +02001080 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG | LYD_PRINT_SHRINK);
Michal Vaskof03ed032020-03-04 13:31:44 +01001081 assert_string_equal(str,
Michal Vaskob104f112020-07-17 09:54:54 +02001082 "<l xmlns=\"urn:tests:f\">value</l>"
Michal Vaskob1b5c262020-03-05 14:29:47 +01001083 "<d xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1084 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
1085 "<ll2 xmlns=\"urn:tests:f\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vasko52927e22020-03-16 17:26:14 +01001086 "<cont xmlns=\"urn:tests:f\">"
1087 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>"
1088 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>"
1089 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>"
1090 "<d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1091 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
1092 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vaskob104f112020-07-17 09:54:54 +02001093 "</cont>");
Radek Krejci241f6b52020-05-21 18:13:49 +02001094 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001095
Michal Vasko8104fd42020-07-13 11:09:51 +02001096 /* check diff */
Radek Krejci52f65552020-09-01 17:03:35 +02001097 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL | LYD_PRINT_SHRINK);
Michal Vasko8104fd42020-07-13 11:09:51 +02001098 assert_string_equal(str,
1099 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">def1</ll1>"
1100 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">def2</ll1>"
1101 "<ll1 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">def3</ll1>"
1102 );
1103 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 */
Michal Vasko3a41dff2020-07-15 14:30:28 +02001107 assert_int_equal(lyd_new_term(NULL, mod, "d", "15", &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001108 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001109 assert_int_equal(lyd_new_term(NULL, mod, "ll2", "dflt2", &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 Krejci52f65552020-09-01 17:03:35 +02001114 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG | LYD_PRINT_SHRINK);
Michal Vaskof03ed032020-03-04 13:31:44 +01001115 assert_string_equal(str,
Michal Vaskob104f112020-07-17 09:54:54 +02001116 "<l xmlns=\"urn:tests:f\">value</l>"
1117 "<d xmlns=\"urn:tests:f\">15</d>"
1118 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>"
Michal Vasko52927e22020-03-16 17:26:14 +01001119 "<cont xmlns=\"urn:tests:f\">"
1120 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>"
1121 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>"
1122 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>"
1123 "<d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1124 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
1125 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vaskob104f112020-07-17 09:54:54 +02001126 "</cont>");
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 Krejci52f65552020-09-01 17:03:35 +02001130 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL | LYD_PRINT_SHRINK);
Michal Vasko8104fd42020-07-13 11:09:51 +02001131 assert_string_equal(str,
1132 "<d xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">15</d>"
1133 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">dflt1</ll2>"
1134 "<ll2 xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">dflt2</ll2>"
1135 );
1136 ly_out_reset(out);
1137 lyd_free_siblings(diff);
1138
Michal Vaskob1b5c262020-03-05 14:29:47 +01001139 /* create first explicit container, which should become implicit */
Michal Vasko3a41dff2020-07-15 14:30:28 +02001140 assert_int_equal(lyd_new_inner(NULL, mod, "cont", &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001141 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001142 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001143
1144 /* check data tree */
Radek Krejci52f65552020-09-01 17:03:35 +02001145 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG | LYD_PRINT_SHRINK);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001146 assert_string_equal(str,
Michal Vaskob104f112020-07-17 09:54:54 +02001147 "<l xmlns=\"urn:tests:f\">value</l>"
1148 "<d xmlns=\"urn:tests:f\">15</d>"
1149 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>"
Michal Vasko52927e22020-03-16 17:26:14 +01001150 "<cont xmlns=\"urn:tests:f\">"
1151 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>"
1152 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>"
1153 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>"
1154 "<d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1155 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
1156 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vaskob104f112020-07-17 09:54:54 +02001157 "</cont>");
Radek Krejci241f6b52020-05-21 18:13:49 +02001158 ly_out_reset(out);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001159
Michal Vasko8104fd42020-07-13 11:09:51 +02001160 /* check diff */
1161 assert_null(diff);
1162
Michal Vaskob1b5c262020-03-05 14:29:47 +01001163 /* create second explicit container, which should become implicit, so the first tree node should be removed */
Michal Vasko3a41dff2020-07-15 14:30:28 +02001164 assert_int_equal(lyd_new_inner(NULL, mod, "cont", &node), LY_SUCCESS);
Michal Vaskob104f112020-07-17 09:54:54 +02001165 assert_int_equal(lyd_insert_sibling(tree, node, &tree), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001166 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001167
1168 /* check data tree */
Radek Krejci52f65552020-09-01 17:03:35 +02001169 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG | LYD_PRINT_SHRINK);
Michal Vaskob1b5c262020-03-05 14:29:47 +01001170 assert_string_equal(str,
Michal Vaskob104f112020-07-17 09:54:54 +02001171 "<l xmlns=\"urn:tests:f\">value</l>"
1172 "<d xmlns=\"urn:tests:f\">15</d>"
1173 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>"
Michal Vasko52927e22020-03-16 17:26:14 +01001174 "<cont xmlns=\"urn:tests:f\">"
1175 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def1</ll1>"
1176 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def2</ll1>"
1177 "<ll1 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">def3</ll1>"
1178 "<d xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">15</d>"
1179 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt1</ll2>"
1180 "<ll2 xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\" ncwd:default=\"true\">dflt2</ll2>"
Michal Vaskob104f112020-07-17 09:54:54 +02001181 "</cont>");
Radek Krejci241f6b52020-05-21 18:13:49 +02001182 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001183
Michal Vasko8104fd42020-07-13 11:09:51 +02001184 /* check diff */
1185 assert_null(diff);
1186
Michal Vaskof03ed032020-03-04 13:31:44 +01001187 /* similar changes for nested defaults */
Michal Vaskob104f112020-07-17 09:54:54 +02001188 assert_int_equal(lyd_new_term(tree->prev, NULL, "ll1", "def3", NULL), LY_SUCCESS);
1189 assert_int_equal(lyd_new_term(tree->prev, NULL, "d", "5", NULL), LY_SUCCESS);
1190 assert_int_equal(lyd_new_term(tree->prev, NULL, "ll2", "non-dflt", NULL), LY_SUCCESS);
Michal Vasko3a41dff2020-07-15 14:30:28 +02001191 assert_int_equal(lyd_validate_all(&tree, ctx, LYD_VALIDATE_PRESENT, &diff), LY_SUCCESS);
Michal Vaskof03ed032020-03-04 13:31:44 +01001192
1193 /* check data tree */
Radek Krejci52f65552020-09-01 17:03:35 +02001194 lyd_print_all(out, tree, LYD_XML, LYD_PRINT_WD_IMPL_TAG | LYD_PRINT_SHRINK);
Michal Vaskof03ed032020-03-04 13:31:44 +01001195 assert_string_equal(str,
Michal Vaskob104f112020-07-17 09:54:54 +02001196 "<l xmlns=\"urn:tests:f\">value</l>"
1197 "<d xmlns=\"urn:tests:f\">15</d>"
1198 "<ll2 xmlns=\"urn:tests:f\">dflt2</ll2>"
Michal Vasko52927e22020-03-16 17:26:14 +01001199 "<cont xmlns=\"urn:tests:f\">"
Michal Vaskof03ed032020-03-04 13:31:44 +01001200 "<ll1>def3</ll1>"
1201 "<d>5</d>"
1202 "<ll2>non-dflt</ll2>"
Michal Vaskob104f112020-07-17 09:54:54 +02001203 "</cont>");
Radek Krejci241f6b52020-05-21 18:13:49 +02001204 ly_out_reset(out);
Michal Vaskof03ed032020-03-04 13:31:44 +01001205
Michal Vasko8104fd42020-07-13 11:09:51 +02001206 /* check diff */
Radek Krejci52f65552020-09-01 17:03:35 +02001207 lyd_print_all(out, diff, LYD_XML, LYD_PRINT_WD_ALL | LYD_PRINT_SHRINK);
Michal Vasko8104fd42020-07-13 11:09:51 +02001208 assert_string_equal(str,
1209 "<cont xmlns=\"urn:tests:f\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">"
1210 "<ll1 yang:operation=\"delete\">def1</ll1>"
1211 "<ll1 yang:operation=\"delete\">def2</ll1>"
1212 "<ll1 yang:operation=\"delete\">def3</ll1>"
1213 "<d yang:operation=\"delete\">15</d>"
1214 "<ll2 yang:operation=\"delete\">dflt1</ll2>"
1215 "<ll2 yang:operation=\"delete\">dflt2</ll2>"
1216 "</cont>"
1217 );
1218 ly_out_reset(out);
1219 lyd_free_siblings(diff);
1220
Michal Vaskof03ed032020-03-04 13:31:44 +01001221 lyd_free_siblings(tree);
Radek Krejci241f6b52020-05-21 18:13:49 +02001222 ly_out_free(out, NULL, 1);
Michal Vaskof03ed032020-03-04 13:31:44 +01001223
1224 *state = NULL;
1225}
1226
Michal Vaskoc193ce92020-03-06 11:04:48 +01001227static void
1228test_iffeature(void **state)
1229{
1230 *state = test_iffeature;
1231
1232 const char *data;
1233 struct lyd_node *tree;
1234 const struct lys_module *mod = ly_ctx_get_module_latest(ctx, "g");
1235
1236 /* get empty data */
1237 tree = NULL;
Michal Vasko8104fd42020-07-13 11:09:51 +02001238 assert_int_equal(lyd_validate_module(&tree, mod, 0, NULL), LY_SUCCESS);
Michal Vaskoc193ce92020-03-06 11:04:48 +01001239 assert_null(tree);
1240
1241 /* disabled by f1 */
1242 data =
1243 "<cont xmlns=\"urn:tests:g\">"
1244 "<d>51</d>"
1245 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001246 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001247 assert_null(tree);
1248 logbuf_assert("Data are disabled by \"cont\" schema node if-feature. /g:cont");
1249
1250 /* enable f1 */
1251 assert_int_equal(lys_feature_enable(mod, "f1"), LY_SUCCESS);
1252
1253 /* get data with default container */
Michal Vasko8104fd42020-07-13 11:09:51 +02001254 assert_int_equal(lyd_validate_module(&tree, mod, 0, NULL), LY_SUCCESS);
Michal Vaskoc193ce92020-03-06 11:04:48 +01001255 assert_non_null(tree);
1256 lyd_free_siblings(tree);
1257
1258 /* disabled by f2 */
1259 data =
1260 "<cont xmlns=\"urn:tests:g\">"
1261 "<cont2>"
1262 "<e>val</e>"
1263 "</cont2>"
1264 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001265 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001266 assert_null(tree);
1267 logbuf_assert("Data are disabled by \"cont2\" schema node if-feature. /g:cont/cont2");
1268
1269 data =
1270 "<cont xmlns=\"urn:tests:g\">"
1271 "<a>val</a>"
1272 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001273 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001274 assert_null(tree);
1275 logbuf_assert("Data are disabled by \"choic\" schema node if-feature. /g:cont/a");
1276
1277 /* enable f3 */
1278 assert_int_equal(lys_feature_enable(mod, "f3"), LY_SUCCESS);
1279
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 Vaskoc193ce92020-03-06 11:04:48 +01001281 assert_non_null(tree);
1282 lyd_free_siblings(tree);
1283
1284 /* disabled by f2 */
1285 data =
1286 "<cont xmlns=\"urn:tests:g\">"
1287 "<l>val</l>"
1288 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001289 assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001290 assert_null(tree);
1291 logbuf_assert("Data are disabled by \"b\" schema node if-feature. /g:cont/l");
1292
1293 /* enable f2 */
1294 assert_int_equal(lys_feature_enable(mod, "f2"), LY_SUCCESS);
1295
Michal Vasko63f3d842020-07-08 10:10:14 +02001296 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001297 assert_non_null(tree);
1298 lyd_free_siblings(tree);
1299
1300 /* try separate validation */
1301 assert_int_equal(lys_feature_disable(mod, "f1"), LY_SUCCESS);
1302 assert_int_equal(lys_feature_disable(mod, "f2"), LY_SUCCESS);
1303 assert_int_equal(lys_feature_disable(mod, "f3"), LY_SUCCESS);
1304
1305 data =
1306 "<cont xmlns=\"urn:tests:g\">"
1307 "<l>val</l>"
1308 "<d>51</d>"
1309 "<cont2>"
1310 "<e>val</e>"
1311 "</cont2>"
1312 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001313 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY, 0, &tree));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001314 assert_non_null(tree);
1315
Michal Vasko3a41dff2020-07-15 14:30:28 +02001316 assert_int_equal(LY_EVALID, lyd_validate_all(&tree, NULL, LYD_VALIDATE_PRESENT, NULL));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001317 logbuf_assert("Data are disabled by \"cont\" schema node if-feature. /g:cont");
1318
1319 assert_int_equal(lys_feature_enable(mod, "f1"), LY_SUCCESS);
1320
Michal Vasko3a41dff2020-07-15 14:30:28 +02001321 assert_int_equal(LY_EVALID, lyd_validate_all(&tree, NULL, LYD_VALIDATE_PRESENT, NULL));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001322 logbuf_assert("Data are disabled by \"b\" schema node if-feature. /g:cont/l");
1323
1324 assert_int_equal(lys_feature_enable(mod, "f2"), LY_SUCCESS);
1325
Michal Vasko3a41dff2020-07-15 14:30:28 +02001326 assert_int_equal(LY_SUCCESS, lyd_validate_all(&tree, NULL, LYD_VALIDATE_PRESENT, NULL));
Michal Vaskoc193ce92020-03-06 11:04:48 +01001327
1328 lyd_free_siblings(tree);
1329
1330 *state = NULL;
1331}
1332
Michal Vasko5b37a352020-03-06 13:38:33 +01001333static void
1334test_state(void **state)
1335{
Michal Vaskocc048b22020-03-27 15:52:38 +01001336 *state = test_state;
Michal Vasko5b37a352020-03-06 13:38:33 +01001337
1338 const char *data;
1339 struct lyd_node *tree;
1340
1341 data =
1342 "<cont xmlns=\"urn:tests:h\">"
1343 "<cont2>"
1344 "<l>val</l>"
1345 "</cont2>"
1346 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001347 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 +01001348 assert_null(tree);
Radek Krejci1798aae2020-07-14 13:26:06 +02001349 logbuf_assert("Invalid state data node \"cont2\" found. /h:cont/cont2");
Michal Vasko5b37a352020-03-06 13:38:33 +01001350
Michal Vasko63f3d842020-07-08 10:10:14 +02001351 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 +01001352 assert_null(tree);
1353 logbuf_assert("Invalid state data node \"cont2\" found. /h:cont/cont2");
1354
Michal Vasko63f3d842020-07-08 10:10:14 +02001355 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 +01001356 assert_non_null(tree);
1357
Michal Vasko3a41dff2020-07-15 14:30:28 +02001358 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 +01001359 logbuf_assert("Invalid state data node \"cont2\" found. /h:cont/cont2");
1360
1361 lyd_free_siblings(tree);
1362
1363 *state = NULL;
1364}
1365
Michal Vaskocc048b22020-03-27 15:52:38 +01001366static void
1367test_must(void **state)
1368{
1369 *state = test_must;
1370
1371 const char *data;
1372 struct lyd_node *tree;
1373
1374 data =
1375 "<cont xmlns=\"urn:tests:i\">"
1376 "<l>wrong</l>"
1377 "<l2>val</l2>"
1378 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001379 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 +01001380 assert_null(tree);
1381 logbuf_assert("Must condition \"../l = 'right'\" not satisfied. /i:cont/l2");
1382
1383 data =
1384 "<cont xmlns=\"urn:tests:i\">"
1385 "<l>right</l>"
1386 "<l2>val</l2>"
1387 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001388 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 +01001389 assert_non_null(tree);
1390 lyd_free_tree(tree);
1391
1392 *state = NULL;
1393}
1394
Michal Vaskofea12c62020-03-30 11:00:15 +02001395static void
1396test_action(void **state)
1397{
1398 *state = test_action;
1399
1400 const char *data;
Michal Vasko63f3d842020-07-08 10:10:14 +02001401 struct ly_in *in;
Michal Vaskofea12c62020-03-30 11:00:15 +02001402 struct lyd_node *tree, *op_tree;
1403 const struct lys_module *mod;
1404
1405 data =
1406 "<cont xmlns=\"urn:tests:j\">"
1407 "<l1>"
1408 "<k>val1</k>"
1409 "<act>"
1410 "<lf2>target</lf2>"
1411 "</act>"
1412 "</l1>"
1413 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001414 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
1415 assert_int_equal(LY_SUCCESS, lyd_parse_rpc(ctx, in, LYD_XML, &op_tree, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001416 assert_non_null(op_tree);
1417
1418 /* missing leafref */
Michal Vasko8104fd42020-07-13 11:09:51 +02001419 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, NULL, LYD_VALIDATE_OP_RPC, NULL));
Michal Vasko004d3152020-06-11 19:59:22 +02001420 logbuf_assert("Invalid leafref value \"target\" - no target instance \"/lf3\" with the same value."
1421 " /j:cont/l1[k='val1']/act/lf2");
Michal Vasko63f3d842020-07-08 10:10:14 +02001422 ly_in_free(in, 0);
Michal Vaskofea12c62020-03-30 11:00:15 +02001423
1424 data =
1425 "<cont xmlns=\"urn:tests:j\">"
1426 "<lf1>not true</lf1>"
1427 "</cont>"
1428 "<lf3 xmlns=\"urn:tests:j\">target</lf3>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001429 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY | LYD_PARSE_TRUSTED, 0, &tree));
Michal Vaskofea12c62020-03-30 11:00:15 +02001430 assert_non_null(tree);
1431
1432 /* disabled if-feature */
Michal Vasko8104fd42020-07-13 11:09:51 +02001433 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_RPC, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001434 logbuf_assert("Data are disabled by \"act\" schema node if-feature. /j:cont/l1[k='val1']/act");
1435
1436 mod = ly_ctx_get_module_latest(ctx, "j");
1437 assert_non_null(mod);
1438 assert_int_equal(LY_SUCCESS, lys_feature_enable(mod, "feat1"));
1439
1440 /* input must false */
Michal Vasko8104fd42020-07-13 11:09:51 +02001441 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_RPC, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001442 logbuf_assert("Must condition \"../../lf1 = 'true'\" not satisfied. /j:cont/l1[k='val1']/act");
1443
1444 lyd_free_siblings(tree);
1445 data =
1446 "<cont xmlns=\"urn:tests:j\">"
1447 "<lf1>true</lf1>"
1448 "</cont>"
1449 "<lf3 xmlns=\"urn:tests:j\">target</lf3>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001450 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY | LYD_PARSE_TRUSTED, 0, &tree));
Michal Vaskofea12c62020-03-30 11:00:15 +02001451 assert_non_null(tree);
1452
1453 /* success */
Michal Vasko8104fd42020-07-13 11:09:51 +02001454 assert_int_equal(LY_SUCCESS, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_RPC, NULL));
Michal Vaskofea12c62020-03-30 11:00:15 +02001455
Michal Vaskocb7526d2020-03-30 15:08:26 +02001456 lys_feature_disable(mod, "feat1");
1457 lyd_free_tree(op_tree);
1458 lyd_free_siblings(tree);
1459
1460 *state = NULL;
1461}
1462
1463static void
1464test_reply(void **state)
1465{
1466 *state = test_reply;
1467
1468 const char *data;
Michal Vasko63f3d842020-07-08 10:10:14 +02001469 struct ly_in *in;
Michal Vaskocb7526d2020-03-30 15:08:26 +02001470 struct lyd_node *tree, *op_tree, *request;
1471 const struct lys_module *mod;
1472
1473 data =
1474 "<cont xmlns=\"urn:tests:j\">"
1475 "<l1>"
1476 "<k>val1</k>"
1477 "<act>"
1478 "<lf2>target</lf2>"
1479 "</act>"
1480 "</l1>"
1481 "</cont>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001482 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
1483 assert_int_equal(LY_SUCCESS, lyd_parse_rpc(ctx, in, LYD_XML, &request, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001484 assert_non_null(request);
Michal Vasko63f3d842020-07-08 10:10:14 +02001485 ly_in_free(in, 0);
1486
Michal Vaskocb7526d2020-03-30 15:08:26 +02001487 data = "<lf2 xmlns=\"urn:tests:j\">target</lf2>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001488 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
1489 assert_int_equal(LY_SUCCESS, lyd_parse_reply(request, in, LYD_XML, &op_tree, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001490 lyd_free_all(request);
1491 assert_non_null(op_tree);
Michal Vasko63f3d842020-07-08 10:10:14 +02001492 ly_in_free(in, 0);
Michal Vaskocb7526d2020-03-30 15:08:26 +02001493
1494 /* missing leafref */
Michal Vasko8104fd42020-07-13 11:09:51 +02001495 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, NULL, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vasko004d3152020-06-11 19:59:22 +02001496 logbuf_assert("Invalid leafref value \"target\" - no target instance \"/lf4\" with the same value."
1497 " /j:cont/l1[k='val1']/act/lf2");
Michal Vaskocb7526d2020-03-30 15:08:26 +02001498
1499 data =
1500 "<cont xmlns=\"urn:tests:j\">"
1501 "<lf1>not true</lf1>"
1502 "</cont>"
1503 "<lf4 xmlns=\"urn:tests:j\">target</lf4>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001504 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY | LYD_PARSE_TRUSTED, 0, &tree));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001505 assert_non_null(tree);
1506
1507 /* disabled if-feature */
Michal Vasko8104fd42020-07-13 11:09:51 +02001508 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001509 logbuf_assert("Data are disabled by \"act\" schema node if-feature. /j:cont/l1[k='val1']/act");
1510
1511 mod = ly_ctx_get_module_latest(ctx, "j");
1512 assert_non_null(mod);
1513 assert_int_equal(LY_SUCCESS, lys_feature_enable(mod, "feat1"));
1514
1515 /* input must false */
Michal Vasko8104fd42020-07-13 11:09:51 +02001516 assert_int_equal(LY_EVALID, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001517 logbuf_assert("Must condition \"../../lf1 = 'true2'\" not satisfied. /j:cont/l1[k='val1']/act");
1518
1519 lyd_free_siblings(tree);
1520 data =
1521 "<cont xmlns=\"urn:tests:j\">"
1522 "<lf1>true2</lf1>"
1523 "</cont>"
1524 "<lf4 xmlns=\"urn:tests:j\">target</lf4>";
Michal Vasko63f3d842020-07-08 10:10:14 +02001525 assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, data, LYD_XML, LYD_PARSE_ONLY | LYD_PARSE_TRUSTED, 0, &tree));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001526 assert_non_null(tree);
1527
1528 /* success */
Michal Vasko8104fd42020-07-13 11:09:51 +02001529 assert_int_equal(LY_SUCCESS, lyd_validate_op(op_tree, tree, LYD_VALIDATE_OP_REPLY, NULL));
Michal Vaskocb7526d2020-03-30 15:08:26 +02001530
1531 lys_feature_disable(mod, "feat1");
Michal Vaskofea12c62020-03-30 11:00:15 +02001532 lyd_free_tree(op_tree);
1533 lyd_free_siblings(tree);
1534
1535 *state = NULL;
1536}
1537
Michal Vaskocde73ac2019-11-14 16:10:27 +01001538int main(void)
1539{
1540 const struct CMUnitTest tests[] = {
Michal Vaskoacd83e72020-02-04 14:12:01 +01001541 cmocka_unit_test_teardown(test_when, teardown_s),
1542 cmocka_unit_test_teardown(test_mandatory, teardown_s),
1543 cmocka_unit_test_teardown(test_minmax, teardown_s),
Michal Vasko14654712020-02-06 08:35:21 +01001544 cmocka_unit_test_teardown(test_unique, teardown_s),
1545 cmocka_unit_test_teardown(test_unique_nested, teardown_s),
Michal Vaskof03ed032020-03-04 13:31:44 +01001546 cmocka_unit_test_teardown(test_dup, teardown_s),
1547 cmocka_unit_test_teardown(test_defaults, teardown_s),
Michal Vaskoc193ce92020-03-06 11:04:48 +01001548 cmocka_unit_test_teardown(test_iffeature, teardown_s),
Michal Vasko5b37a352020-03-06 13:38:33 +01001549 cmocka_unit_test_teardown(test_state, teardown_s),
Michal Vaskocc048b22020-03-27 15:52:38 +01001550 cmocka_unit_test_teardown(test_must, teardown_s),
Michal Vaskofea12c62020-03-30 11:00:15 +02001551 cmocka_unit_test_teardown(test_action, teardown_s),
Michal Vaskocb7526d2020-03-30 15:08:26 +02001552 cmocka_unit_test_teardown(test_reply, teardown_s),
Michal Vaskocde73ac2019-11-14 16:10:27 +01001553 };
1554
Michal Vaskoacd83e72020-02-04 14:12:01 +01001555 return cmocka_run_group_tests(tests, setup, teardown);
Michal Vaskocde73ac2019-11-14 16:10:27 +01001556}