blob: 4e3b6502ba9d2d45dee951276b572df7f5929483 [file] [log] [blame]
Michal Vaskoaac267d2022-01-17 13:34:48 +01001/**
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +01002 * @file test_schema_mount.c
Michal Vaskoaac267d2022-01-17 13:34:48 +01003 * @author Tadeas Vintrlik <xvintr04@stud.fit.vutbr.cz>
4 * @author Michal Vasko <mvasko@cesnet.cz>
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +01005 * @brief unit tests for Schema Mount extension support
6 *
Michal Vaskoaac267d2022-01-17 13:34:48 +01007 * Copyright (c) 2021 - 2022 CESNET, z.s.p.o.
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +01008 *
9 * This source code is licensed under BSD 3-Clause License (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * https://opensource.org/licenses/BSD-3-Clause
14 */
Michal Vaskoaac267d2022-01-17 13:34:48 +010015
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010016#define _UTEST_MAIN_
17#include "utests.h"
18
19#include "libyang.h"
20
Michal Vaskoaac267d2022-01-17 13:34:48 +010021void **glob_state;
22
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010023static int
24setup(void **state)
25{
Michal Vaskoaac267d2022-01-17 13:34:48 +010026 const char *schema =
27 "module sm {yang-version 1.1;namespace \"urn:sm\";prefix \"sm\";"
28 "import ietf-yang-schema-mount {prefix yangmnt;}"
29 "import ietf-interfaces {prefix if;}"
30 "container root {yangmnt:mount-point \"root\";}"
31 "container root2 {yangmnt:mount-point \"root\";}"
32 "container root3 {"
33 " list ls { key name; leaf name {type string;}"
34 " container mnt-root {yangmnt:mount-point \"mnt-root\";}"
35 " }"
36 "}"
37 "leaf target{type string;}"
38 "augment /if:interfaces/if:interface {"
39 " leaf sm-name {type leafref {path \"/sm:target\";}}"
40 "}"
41 "}";
42
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010043 UTEST_SETUP;
Michal Vaskoaac267d2022-01-17 13:34:48 +010044 glob_state = state;
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010045
46 assert_int_equal(LY_SUCCESS, ly_ctx_set_searchdir(UTEST_LYCTX, TESTS_DIR_MODULES_YANG));
Michal Vaskoaac267d2022-01-17 13:34:48 +010047 assert_int_equal(LY_SUCCESS, lys_parse_mem(UTEST_LYCTX, schema, LYS_IN_YANG, NULL));
48 assert_non_null(ly_ctx_load_module(UTEST_LYCTX, "iana-if-type", NULL, NULL));
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010049
50 return 0;
51}
52
53static void
Michal Vaskoaac267d2022-01-17 13:34:48 +010054test_schema(void **state)
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010055{
56 struct lys_module *mod;
Michal Vaskoaac267d2022-01-17 13:34:48 +010057 const char *schema;
58 char *str;
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +010059
Michal Vaskoaac267d2022-01-17 13:34:48 +010060 /* invalid */
61 schema =
62 "module sm {\n"
63 " namespace \"urn:sm\";\n"
64 " prefix sm;\n"
65 "\n"
66 " import ietf-yang-schema-mount {\n"
67 " prefix yangmnt;\n"
68 " }\n"
69 "\n"
70 " container root {\n"
71 " yangmnt:mount-point \"root\";\n"
72 " }\n"
73 "}\n";
74 assert_int_equal(LY_EINVAL, lys_parse_mem(UTEST_LYCTX, schema, LYS_IN_YANG, NULL));
75 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
76 "Extension \"yangmnt:mount-point\" instance not allowed in YANG version 1 module.",
77 "/sm:root/{extension='yangmnt:mount-point'}/root");
78
79 schema =
80 "module sm {\n"
81 " yang-version 1.1;\n"
82 " namespace \"urn:sm\";\n"
83 " prefix sm;\n"
84 "\n"
85 " import ietf-yang-schema-mount {\n"
86 " prefix yangmnt;\n"
87 " }\n"
88 "\n"
89 " yangmnt:mount-point \"root\";\n"
90 "}\n";
91 assert_int_equal(LY_EINVAL, lys_parse_mem(UTEST_LYCTX, schema, LYS_IN_YANG, NULL));
92 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
93 "Extension \"yangmnt:mount-point\" instance allowed only in container or list statement.",
94 "/sm:{extension='yangmnt:mount-point'}/root");
95
96 schema =
97 "module sm {\n"
98 " yang-version 1.1;\n"
99 " namespace \"urn:sm\";\n"
100 " prefix sm;\n"
101 "\n"
102 " import ietf-yang-schema-mount {\n"
103 " prefix yangmnt;\n"
104 " }\n"
105 "\n"
106 " container root {\n"
107 " leaf l {\n"
108 " type empty;\n"
109 " yangmnt:mount-point \"root\";\n"
110 " }\n"
111 " }\n"
112 "}\n";
113 assert_int_equal(LY_EINVAL, lys_parse_mem(UTEST_LYCTX, schema, LYS_IN_YANG, NULL));
114 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
115 "Extension \"yangmnt:mount-point\" instance allowed only in container or list statement.",
116 "/sm:root/l/{extension='yangmnt:mount-point'}/root");
117
118 schema =
119 "module sm {\n"
120 " yang-version 1.1;\n"
121 " namespace \"urn:sm\";\n"
122 " prefix sm;\n"
123 "\n"
124 " import ietf-yang-schema-mount {\n"
125 " prefix yangmnt;\n"
126 " }\n"
127 "\n"
128 " list l {\n"
129 " key \"k\";\n"
130 " leaf k {\n"
131 " type string;\n"
132 " }\n"
133 " yangmnt:mount-point \"root\";\n"
134 " yangmnt:mount-point \"root2\";\n"
135 " }\n"
136 "}\n";
137 assert_int_equal(LY_EINVAL, lys_parse_mem(UTEST_LYCTX, schema, LYS_IN_YANG, NULL));
138 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
139 "Multiple extension \"yangmnt:mount-point\" instances.",
140 "/sm:l/{extension='yangmnt:mount-point'}/root2");
141
142 /* valid */
143 schema =
144 "module sm {\n"
145 " yang-version 1.1;\n"
146 " namespace \"urn:sm\";\n"
147 " prefix sm;\n"
148 "\n"
149 " import ietf-yang-schema-mount {\n"
150 " prefix yangmnt;\n"
151 " }\n"
152 "\n"
153 " container root {\n"
154 " yangmnt:mount-point \"root\";\n"
155 " }\n"
156 "}\n";
157 assert_int_equal(LY_SUCCESS, lys_parse_mem(UTEST_LYCTX, schema, LYS_IN_YANG, &mod));
158 lys_print_mem(&str, mod, LYS_YIN, 0);
159 assert_string_equal(str, schema);
160 free(str);
161}
162
163static LY_ERR
164test_ext_data_clb(const struct lysc_ext_instance *ext, void *user_data, void **ext_data, ly_bool *ext_data_free)
165{
166 void **state = glob_state;
167 struct lyd_node *data = NULL;
168
169 (void)ext;
170
171 if (user_data) {
172 CHECK_PARSE_LYD_PARAM(user_data, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
173 }
174
175 *ext_data = data;
176 *ext_data_free = 1;
177 return LY_SUCCESS;
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +0100178}
179
180static void
Michal Vaskoaac267d2022-01-17 13:34:48 +0100181test_parse_xml_invalid(void **state)
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +0100182{
Michal Vaskoaac267d2022-01-17 13:34:48 +0100183 const char *xml;
184 struct lyd_node *data;
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +0100185
Michal Vaskoaac267d2022-01-17 13:34:48 +0100186 /* no callback set */
187 xml =
188 "<root xmlns=\"urn:sm\">"
189 " <unknown xmlns=\"unknown\">"
190 " <interface>"
191 " <name>bu</name>"
192 " <type xmlns:ii=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ii:ethernetCsmacd</type>"
193 " </interface>"
194 " </unknown>"
195 "</root>";
196 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, 0, LYD_VALIDATE_PRESENT, LY_EINVAL, data);
197 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": Failed to get extension data, no callback set.",
198 NULL);
199
200 /* unknown data */
201 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb, NULL);
202 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, 0, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
203 assert_string_equal(LYD_NAME(data), "root");
204 assert_null(lyd_child(data));
205 assert_non_null(data->next);
206 assert_true(data->next->flags & LYD_DEFAULT);
207 lyd_free_siblings(data);
208
209 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
210 CHECK_LOG_CTX("No module with namespace \"unknown\" in the context.",
211 "Schema location /sm:root, data location /sm:root, line number 1.");
212
213 /* missing required callback data */
214 xml =
215 "<root xmlns=\"urn:sm\">"
216 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">"
217 " <interface>"
218 " <name>bu</name>"
219 " </interface>"
220 " </interfaces>"
221 "</root>";
222 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
223 CHECK_LOG_CTX("Node \"interfaces\" not found as a child of \"root\" node.",
224 "Schema location /sm:root, data location /sm:root, line number 1.");
225
226 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
227 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
228 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
229 " <module-set>"
230 " <name>test-set</name>"
231 " <module>"
232 " <name>ietf-yang-library</name>"
233 " <revision>2019-01-04</revision>"
234 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
235 " </module>"
236 " </module-set>"
237 " <schema>"
238 " <name>test-schema</name>"
239 " <module-set>test-set</module-set>"
240 " </schema>"
241 " <datastore>"
242 " <name>ds:running</name>"
243 " <schema>test-schema</schema>"
244 " </datastore>"
245 " <datastore>"
246 " <name>ds:operational</name>"
247 " <schema>test-schema</schema>"
248 " </datastore>"
249 " <content-id>1</content-id>"
250 "</yang-library>"
251 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
252 " <module-set-id>1</module-set-id>"
253 "</modules-state>");
254 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
255 CHECK_LOG_CTX("Node \"interfaces\" not found as a child of \"root\" node.", NULL);
256
257 /* missing module in yang-library data */
258 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
259 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
260 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
261 " <module-set>"
262 " <name>test-set</name>"
263 " <module>"
264 " <name>ietf-yang-library</name>"
265 " <revision>2019-01-04</revision>"
266 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
267 " </module>"
268 " </module-set>"
269 " <schema>"
270 " <name>test-schema</name>"
271 " <module-set>test-set</module-set>"
272 " </schema>"
273 " <datastore>"
274 " <name>ds:running</name>"
275 " <schema>test-schema</schema>"
276 " </datastore>"
277 " <datastore>"
278 " <name>ds:operational</name>"
279 " <schema>test-schema</schema>"
280 " </datastore>"
281 " <content-id>1</content-id>"
282 "</yang-library>"
283 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
284 " <module-set-id>1</module-set-id>"
285 "</modules-state>"
286 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
287 " <mount-point>"
288 " <module>sm</module>"
289 " <label>root</label>"
290 " <inline/>"
291 " </mount-point>"
292 "</schema-mounts>");
293 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
294 CHECK_LOG_CTX("Node \"interfaces\" not found as a child of \"root\" node.", NULL);
295
296 /* callback data correct, invalid YANG data */
297 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
298 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
299 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
300 " <module-set>"
301 " <name>test-set</name>"
302 " <module>"
303 " <name>ietf-datastores</name>"
304 " <revision>2018-02-14</revision>"
305 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
306 " </module>"
307 " <module>"
308 " <name>ietf-yang-library</name>"
309 " <revision>2019-01-04</revision>"
310 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
311 " </module>"
312 " <module>"
313 " <name>ietf-yang-schema-mount</name>"
314 " <revision>2019-01-14</revision>"
315 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
316 " </module>"
317 " <module>"
318 " <name>ietf-interfaces</name>"
319 " <revision>2014-05-08</revision>"
320 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
321 " </module>"
322 " <module>"
323 " <name>iana-if-type</name>"
324 " <revision>2014-05-08</revision>"
325 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
326 " </module>"
327 " <import-only-module>"
328 " <name>ietf-yang-types</name>"
329 " <revision>2013-07-15</revision>"
330 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
331 " </import-only-module>"
332 " </module-set>"
333 " <schema>"
334 " <name>test-schema</name>"
335 " <module-set>test-set</module-set>"
336 " </schema>"
337 " <datastore>"
338 " <name>ds:running</name>"
339 " <schema>test-schema</schema>"
340 " </datastore>"
341 " <datastore>"
342 " <name>ds:operational</name>"
343 " <schema>test-schema</schema>"
344 " </datastore>"
345 " <content-id>1</content-id>"
346 "</yang-library>"
347 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
348 " <module-set-id>1</module-set-id>"
349 "</modules-state>"
350 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
351 " <mount-point>"
352 " <module>sm</module>"
353 " <label>root</label>"
354 " <inline/>"
355 " </mount-point>"
356 "</schema-mounts>");
357 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
358 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
359 "Mandatory node \"type\" instance does not exist.",
360 "Schema location /ietf-interfaces:interfaces/interface/type.");
361
362 /* validation fail */
363 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT | LYD_PARSE_ONLY, 0, LY_SUCCESS, data);
364 assert_int_equal(LY_EVALID, lyd_validate_all(&data, NULL, LYD_VALIDATE_PRESENT, NULL));
365 lyd_free_siblings(data);
366
367 /* success */
368 xml =
369 "<root xmlns=\"urn:sm\">\n"
370 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
371 " <interface>\n"
372 " <name>bu</name>\n"
373 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
374 " </interface>\n"
375 " </interfaces>\n"
376 "</root>\n";
377 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
378 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
379 lyd_free_siblings(data);
380}
381
382static void
383test_parse_xml_inline(void **state)
384{
385 const char *xml;
386 struct lyd_node *data;
387
388 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
389 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
390 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
391 " <module-set>"
392 " <name>test-set</name>"
393 " <module>"
394 " <name>ietf-datastores</name>"
395 " <revision>2018-02-14</revision>"
396 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
397 " </module>"
398 " <module>"
399 " <name>ietf-yang-library</name>"
400 " <revision>2019-01-04</revision>"
401 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
402 " </module>"
403 " <module>"
404 " <name>ietf-yang-schema-mount</name>"
405 " <revision>2019-01-14</revision>"
406 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
407 " </module>"
408 " <module>"
409 " <name>ietf-interfaces</name>"
410 " <revision>2014-05-08</revision>"
411 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
412 " </module>"
413 " <module>"
414 " <name>iana-if-type</name>"
415 " <revision>2014-05-08</revision>"
416 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
417 " </module>"
418 " <import-only-module>"
419 " <name>ietf-yang-types</name>"
420 " <revision>2013-07-15</revision>"
421 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
422 " </import-only-module>"
423 " </module-set>"
424 " <schema>"
425 " <name>test-schema</name>"
426 " <module-set>test-set</module-set>"
427 " </schema>"
428 " <datastore>"
429 " <name>ds:running</name>"
430 " <schema>test-schema</schema>"
431 " </datastore>"
432 " <datastore>"
433 " <name>ds:operational</name>"
434 " <schema>test-schema</schema>"
435 " </datastore>"
436 " <content-id>1</content-id>"
437 "</yang-library>"
438 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
439 " <module-set-id>1</module-set-id>"
440 "</modules-state>"
441 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
442 " <mount-point>"
443 " <module>sm</module>"
444 " <label>root</label>"
445 " <inline/>"
446 " </mount-point>"
447 "</schema-mounts>");
448 xml =
449 "<root xmlns=\"urn:sm\">\n"
450 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
451 " <interface>\n"
452 " <name>bu</name>\n"
453 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
454 " </interface>\n"
455 " </interfaces>\n"
456 " <interfaces-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
457 " <interface>\n"
458 " <name>bu</name>\n"
459 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
460 " <oper-status>not-present</oper-status>\n"
461 " <statistics>\n"
462 " <discontinuity-time>2022-01-01T10:00:00-00:00</discontinuity-time>\n"
463 " </statistics>\n"
464 " </interface>\n"
465 " </interfaces-state>\n"
466 "</root>\n";
467 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
468 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
469 lyd_free_siblings(data);
470
471 /* different yang-lib data */
472 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
473 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
474 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
475 " <module-set>"
476 " <name>test-set</name>"
477 " <module>"
478 " <name>ietf-datastores</name>"
479 " <revision>2018-02-14</revision>"
480 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
481 " </module>"
482 " <module>"
483 " <name>ietf-yang-library</name>"
484 " <revision>2019-01-04</revision>"
485 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
486 " </module>"
487 " <module>"
488 " <name>ietf-yang-schema-mount</name>"
489 " <revision>2019-01-14</revision>"
490 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
491 " </module>"
492 " <module>"
493 " <name>ietf-interfaces</name>"
494 " <revision>2014-05-08</revision>"
495 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
496 " </module>"
497 " <module>"
498 " <name>ietf-ip</name>"
499 " <revision>2014-06-16</revision>"
500 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
501 " </module>"
502 " <module>"
503 " <name>iana-if-type</name>"
504 " <revision>2014-05-08</revision>"
505 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
506 " </module>"
507 " <import-only-module>"
508 " <name>ietf-yang-types</name>"
509 " <revision>2013-07-15</revision>"
510 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
511 " </import-only-module>"
512 " </module-set>"
513 " <schema>"
514 " <name>test-schema</name>"
515 " <module-set>test-set</module-set>"
516 " </schema>"
517 " <datastore>"
518 " <name>ds:running</name>"
519 " <schema>test-schema</schema>"
520 " </datastore>"
521 " <datastore>"
522 " <name>ds:operational</name>"
523 " <schema>test-schema</schema>"
524 " </datastore>"
525 " <content-id>1</content-id>"
526 "</yang-library>"
527 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
528 " <module-set-id>1</module-set-id>"
529 "</modules-state>"
530 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
531 " <mount-point>"
532 " <module>sm</module>"
533 " <label>root</label>"
534 " <inline/>"
535 " </mount-point>"
536 "</schema-mounts>");
537 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
538 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
539 lyd_free_siblings(data);
540}
541
542static void
543test_parse_xml_shared(void **state)
544{
545 const char *xml;
546 struct lyd_node *data;
547
548 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
549 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
550 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
551 " <module-set>"
552 " <name>test-set</name>"
553 " <module>"
554 " <name>ietf-datastores</name>"
555 " <revision>2018-02-14</revision>"
556 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
557 " </module>"
558 " <module>"
559 " <name>ietf-yang-library</name>"
560 " <revision>2019-01-04</revision>"
561 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
562 " </module>"
563 " <module>"
564 " <name>ietf-yang-schema-mount</name>"
565 " <revision>2019-01-14</revision>"
566 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
567 " </module>"
568 " <module>"
569 " <name>ietf-interfaces</name>"
570 " <revision>2014-05-08</revision>"
571 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
572 " </module>"
573 " <module>"
574 " <name>iana-if-type</name>"
575 " <revision>2014-05-08</revision>"
576 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
577 " </module>"
578 " <import-only-module>"
579 " <name>ietf-yang-types</name>"
580 " <revision>2013-07-15</revision>"
581 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
582 " </import-only-module>"
583 " </module-set>"
584 " <schema>"
585 " <name>test-schema</name>"
586 " <module-set>test-set</module-set>"
587 " </schema>"
588 " <datastore>"
589 " <name>ds:running</name>"
590 " <schema>test-schema</schema>"
591 " </datastore>"
592 " <datastore>"
593 " <name>ds:operational</name>"
594 " <schema>test-schema</schema>"
595 " </datastore>"
596 " <content-id>1</content-id>"
597 "</yang-library>"
598 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
599 " <module-set-id>1</module-set-id>"
600 "</modules-state>"
601 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
602 " <mount-point>"
603 " <module>sm</module>"
604 " <label>root</label>"
605 " <shared-schema/>"
606 " </mount-point>"
607 "</schema-mounts>");
608 xml =
609 "<root xmlns=\"urn:sm\">\n"
610 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
611 " <interface>\n"
612 " <name>bu</name>\n"
613 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
614 " </interface>\n"
615 " </interfaces>\n"
616 " <interfaces-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
617 " <interface>\n"
618 " <name>bu</name>\n"
619 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
620 " <oper-status>not-present</oper-status>\n"
621 " <statistics>\n"
622 " <discontinuity-time>2022-01-01T10:00:00-00:00</discontinuity-time>\n"
623 " </statistics>\n"
624 " </interface>\n"
625 " </interfaces-state>\n"
626 "</root>\n";
627 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
628 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
629 lyd_free_siblings(data);
630
631 /* different yang-lib data */
632 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
633 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
634 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
635 " <module-set>"
636 " <name>test-set</name>"
637 " <module>"
638 " <name>ietf-datastores</name>"
639 " <revision>2018-02-14</revision>"
640 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
641 " </module>"
642 " <module>"
643 " <name>ietf-yang-library</name>"
644 " <revision>2019-01-04</revision>"
645 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
646 " </module>"
647 " <module>"
648 " <name>ietf-yang-schema-mount</name>"
649 " <revision>2019-01-14</revision>"
650 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
651 " </module>"
652 " <module>"
653 " <name>ietf-interfaces</name>"
654 " <revision>2014-05-08</revision>"
655 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
656 " </module>"
657 " <module>"
658 " <name>ietf-ip</name>"
659 " <revision>2014-06-16</revision>"
660 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
661 " </module>"
662 " <module>"
663 " <name>iana-if-type</name>"
664 " <revision>2014-05-08</revision>"
665 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
666 " </module>"
667 " <import-only-module>"
668 " <name>ietf-yang-types</name>"
669 " <revision>2013-07-15</revision>"
670 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
671 " </import-only-module>"
672 " </module-set>"
673 " <schema>"
674 " <name>test-schema</name>"
675 " <module-set>test-set</module-set>"
676 " </schema>"
677 " <datastore>"
678 " <name>ds:running</name>"
679 " <schema>test-schema</schema>"
680 " </datastore>"
681 " <datastore>"
682 " <name>ds:operational</name>"
683 " <schema>test-schema</schema>"
684 " </datastore>"
685 " <content-id>2</content-id>"
686 "</yang-library>"
687 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
688 " <module-set-id>1</module-set-id>"
689 "</modules-state>"
690 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
691 " <mount-point>"
692 " <module>sm</module>"
693 " <label>root</label>"
694 " <shared-schema/>"
695 " </mount-point>"
696 "</schema-mounts>");
697 xml =
698 "<root2 xmlns=\"urn:sm\">\n"
699 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
700 " <interface>\n"
701 " <name>bu</name>\n"
702 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
703 " </interface>\n"
704 " </interfaces>\n"
705 " <interfaces-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
706 " <interface>\n"
707 " <name>bu</name>\n"
708 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
709 " <oper-status>not-present</oper-status>\n"
710 " <statistics>\n"
711 " <discontinuity-time>2022-01-01T10:00:00-00:00</discontinuity-time>\n"
712 " </statistics>\n"
713 " </interface>\n"
714 " </interfaces-state>\n"
715 "</root2>\n";
716 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
717 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
718 "Shared-schema yang-library content-id \"2\" differs from \"1\" used previously.",
719 "/ietf-yang-library:yang-library/content-id");
720
721 /* data for 2 mount points */
722 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
723 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
724 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
725 " <module-set>"
726 " <name>test-set</name>"
727 " <module>"
728 " <name>ietf-datastores</name>"
729 " <revision>2018-02-14</revision>"
730 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
731 " </module>"
732 " <module>"
733 " <name>ietf-yang-library</name>"
734 " <revision>2019-01-04</revision>"
735 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
736 " </module>"
737 " <module>"
738 " <name>ietf-yang-schema-mount</name>"
739 " <revision>2019-01-14</revision>"
740 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
741 " </module>"
742 " <module>"
743 " <name>ietf-interfaces</name>"
744 " <revision>2014-05-08</revision>"
745 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
746 " </module>"
747 " <module>"
748 " <name>iana-if-type</name>"
749 " <revision>2014-05-08</revision>"
750 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
751 " </module>"
752 " <import-only-module>"
753 " <name>ietf-yang-types</name>"
754 " <revision>2013-07-15</revision>"
755 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
756 " </import-only-module>"
757 " </module-set>"
758 " <schema>"
759 " <name>test-schema</name>"
760 " <module-set>test-set</module-set>"
761 " </schema>"
762 " <datastore>"
763 " <name>ds:running</name>"
764 " <schema>test-schema</schema>"
765 " </datastore>"
766 " <datastore>"
767 " <name>ds:operational</name>"
768 " <schema>test-schema</schema>"
769 " </datastore>"
770 " <content-id>1</content-id>"
771 "</yang-library>"
772 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
773 " <module-set-id>1</module-set-id>"
774 "</modules-state>"
775 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
776 " <mount-point>"
777 " <module>sm</module>"
778 " <label>root</label>"
779 " <shared-schema/>"
780 " </mount-point>"
781 "</schema-mounts>");
782 xml =
783 "<root xmlns=\"urn:sm\">\n"
784 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
785 " <interface>\n"
786 " <name>bu</name>\n"
787 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
788 " </interface>\n"
789 " </interfaces>\n"
790 " <interfaces-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
791 " <interface>\n"
792 " <name>bu</name>\n"
793 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
794 " <oper-status>not-present</oper-status>\n"
795 " <statistics>\n"
796 " <discontinuity-time>2022-01-01T10:00:00-00:00</discontinuity-time>\n"
797 " </statistics>\n"
798 " </interface>\n"
799 " </interfaces-state>\n"
800 "</root>\n"
801 "<root2 xmlns=\"urn:sm\">\n"
802 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
803 " <interface>\n"
804 " <name>fu</name>\n"
805 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:fddi</type>\n"
806 " </interface>\n"
807 " </interfaces>\n"
808 " <interfaces-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
809 " <interface>\n"
810 " <name>fu</name>\n"
811 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:fddi</type>\n"
812 " <oper-status>down</oper-status>\n"
813 " <statistics>\n"
814 " <discontinuity-time>2020-01-01T10:00:00-00:00</discontinuity-time>\n"
815 " </statistics>\n"
816 " </interface>\n"
817 " </interfaces-state>\n"
818 "</root2>\n";
819 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
820 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
821 lyd_free_siblings(data);
822}
823
824static void
825test_parse_xml_shared_parent_ref(void **state)
826{
827 const char *xml;
828 struct lyd_node *data;
829
830 /* wrong leafref value */
831 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
832 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
833 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
834 " <module-set>"
835 " <name>test-set</name>"
836 " <module>"
837 " <name>ietf-datastores</name>"
838 " <revision>2018-02-14</revision>"
839 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
840 " </module>"
841 " <module>"
842 " <name>ietf-yang-library</name>"
843 " <revision>2019-01-04</revision>"
844 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
845 " </module>"
846 " <module>"
847 " <name>ietf-yang-schema-mount</name>"
848 " <revision>2019-01-14</revision>"
849 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
850 " </module>"
851 " <module>"
852 " <name>sm</name>"
853 " <namespace>urn:sm</namespace>"
854 " </module>"
855 " <module>"
856 " <name>ietf-interfaces</name>"
857 " <revision>2014-05-08</revision>"
858 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
859 " </module>"
860 " <module>"
861 " <name>iana-if-type</name>"
862 " <revision>2014-05-08</revision>"
863 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
864 " </module>"
865 " <import-only-module>"
866 " <name>ietf-yang-types</name>"
867 " <revision>2013-07-15</revision>"
868 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
869 " </import-only-module>"
870 " </module-set>"
871 " <schema>"
872 " <name>test-schema</name>"
873 " <module-set>test-set</module-set>"
874 " </schema>"
875 " <datastore>"
876 " <name>ds:running</name>"
877 " <schema>test-schema</schema>"
878 " </datastore>"
879 " <datastore>"
880 " <name>ds:operational</name>"
881 " <schema>test-schema</schema>"
882 " </datastore>"
883 " <content-id>1</content-id>"
884 "</yang-library>"
885 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
886 " <module-set-id>1</module-set-id>"
887 "</modules-state>"
888 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
889 " <namespace>"
890 " <prefix>smp</prefix>"
891 " <uri>urn:sm</uri>"
892 " </namespace>"
893 " <mount-point>"
894 " <module>sm</module>"
895 " <label>mnt-root</label>"
896 " <shared-schema>"
897 " <parent-reference>/smp:target[. = current()/../smp:name]</parent-reference>"
898 " </shared-schema>"
899 " </mount-point>"
900 "</schema-mounts>");
901 xml =
902 "<root3 xmlns=\"urn:sm\">\n"
903 " <ls>\n"
904 " <name>target-value</name>\n"
905 " <mnt-root>\n"
906 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
907 " <interface>\n"
908 " <name>bu</name>\n"
909 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
910 " <sm-name xmlns=\"urn:sm\">target-value</sm-name>\n"
911 " </interface>\n"
912 " </interfaces>\n"
913 " </mnt-root>\n"
914 " </ls>\n"
915 "</root3>\n"
916 "<target xmlns=\"urn:sm\">wrong-target-value</target>\n";
917 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_EVALID, data);
918 CHECK_LOG_CTX("Extension plugin \"libyang 2 - Schema Mount, version 1\": "
919 "Invalid leafref value \"target-value\" - no existing target instance \"/sm:target\".",
920 "Schema location /ietf-interfaces:interfaces/interface/sm:sm-name, "
921 "data location /ietf-interfaces:interfaces/interface[name='bu']/sm:sm-name.");
922
923 /* success */
924 xml =
925 "<root3 xmlns=\"urn:sm\">\n"
926 " <ls>\n"
927 " <name>target-value</name>\n"
928 " <mnt-root>\n"
929 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
930 " <interface>\n"
931 " <name>bu</name>\n"
932 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
933 " <sm-name xmlns=\"urn:sm\">target-value</sm-name>\n"
934 " </interface>\n"
935 " </interfaces>\n"
936 " </mnt-root>\n"
937 " </ls>\n"
938 "</root3>\n"
939 "<target xmlns=\"urn:sm\">target-value</target>\n";
940 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
941 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
942 lyd_free_siblings(data);
943}
944
945static void
946test_parse_xml_config(void **state)
947{
948 const char *xml;
949 struct lyd_node *data;
950 const struct lyd_node *node;
951
952 ly_ctx_set_ext_data_clb(UTEST_LYCTX, test_ext_data_clb,
953 "<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\" "
954 " xmlns:ds=\"urn:ietf:params:xml:ns:yang:ietf-datastores\">"
955 " <module-set>"
956 " <name>test-set</name>"
957 " <module>"
958 " <name>ietf-datastores</name>"
959 " <revision>2018-02-14</revision>"
960 " <namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>"
961 " </module>"
962 " <module>"
963 " <name>ietf-yang-library</name>"
964 " <revision>2019-01-04</revision>"
965 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>"
966 " </module>"
967 " <module>"
968 " <name>ietf-yang-schema-mount</name>"
969 " <revision>2019-01-14</revision>"
970 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount</namespace>"
971 " </module>"
972 " <module>"
973 " <name>ietf-interfaces</name>"
974 " <revision>2014-05-08</revision>"
975 " <namespace>urn:ietf:params:xml:ns:yang:ietf-interfaces</namespace>"
976 " </module>"
977 " <module>"
978 " <name>iana-if-type</name>"
979 " <revision>2014-05-08</revision>"
980 " <namespace>urn:ietf:params:xml:ns:yang:iana-if-type</namespace>"
981 " </module>"
982 " <import-only-module>"
983 " <name>ietf-yang-types</name>"
984 " <revision>2013-07-15</revision>"
985 " <namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>"
986 " </import-only-module>"
987 " </module-set>"
988 " <schema>"
989 " <name>test-schema</name>"
990 " <module-set>test-set</module-set>"
991 " </schema>"
992 " <datastore>"
993 " <name>ds:running</name>"
994 " <schema>test-schema</schema>"
995 " </datastore>"
996 " <datastore>"
997 " <name>ds:operational</name>"
998 " <schema>test-schema</schema>"
999 " </datastore>"
1000 " <content-id>1</content-id>"
1001 "</yang-library>"
1002 "<modules-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\">"
1003 " <module-set-id>1</module-set-id>"
1004 "</modules-state>"
1005 "<schema-mounts xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount\">"
1006 " <mount-point>"
1007 " <module>sm</module>"
1008 " <label>root</label>"
1009 " <config>false</config>"
1010 " <inline/>"
1011 " </mount-point>"
1012 "</schema-mounts>");
1013 xml =
1014 "<root xmlns=\"urn:sm\">\n"
1015 " <interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">\n"
1016 " <interface>\n"
1017 " <name>bu</name>\n"
1018 " <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n"
1019 " <enabled>true</enabled>\n"
1020 " </interface>\n"
1021 " </interfaces>\n"
1022 "</root>\n";
1023 CHECK_PARSE_LYD_PARAM(xml, LYD_XML, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, LY_SUCCESS, data);
1024 CHECK_LYD_STRING_PARAM(data, xml, LYD_XML, LYD_PRINT_WITHSIBLINGS);
1025
1026 node = lyd_child(data);
1027 assert_string_equal(LYD_NAME(node), "interfaces");
1028 assert_true(node->schema->flags & LYS_CONFIG_R);
1029 node = lyd_child(node);
1030 assert_string_equal(LYD_NAME(node), "interface");
1031 assert_true(node->schema->flags & LYS_CONFIG_R);
1032 node = lyd_child(node);
1033 assert_string_equal(LYD_NAME(node), "name");
1034 assert_true(node->schema->flags & LYS_CONFIG_R);
1035 node = node->next;
1036 assert_string_equal(LYD_NAME(node), "type");
1037 assert_true(node->schema->flags & LYS_CONFIG_R);
1038
1039 lyd_free_siblings(data);
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +01001040}
1041
1042int
1043main(void)
1044{
1045 const struct CMUnitTest tests[] = {
Michal Vaskoaac267d2022-01-17 13:34:48 +01001046 UTEST(test_schema),
1047 UTEST(test_parse_xml_invalid, setup),
1048 UTEST(test_parse_xml_inline, setup),
1049 UTEST(test_parse_xml_shared, setup),
1050 UTEST(test_parse_xml_shared_parent_ref, setup),
1051 UTEST(test_parse_xml_config, setup),
tadeas-vintrlikbf8aa6e2021-11-03 13:07:34 +01001052 };
1053
1054 return cmocka_run_group_tests(tests, NULL, NULL);
1055}