blob: 7c142f72bffff88b75b8b5c9fc054c8e73588a48 [file] [log] [blame]
Michal Vasko5b414dd2023-04-13 10:29:58 +02001/**
aPiecek023f83a2021-05-11 07:37:03 +02002 * @file test_parser_json.c
Michal Vasko5b414dd2023-04-13 10:29:58 +02003 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @author Michal Vasko <mvasko@cesnet.cz>
5 * @brief unit tests for JSON parser
Radek Krejci1798aae2020-07-14 13:26:06 +02006 *
Michal Vasko5b414dd2023-04-13 10:29:58 +02007 * Copyright (c) 2019 - 2023 CESNET, z.s.p.o.
Radek Krejci1798aae2020-07-14 13:26:06 +02008 *
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 */
Radek Iša56ca9e42020-09-08 18:42:00 +020015#define _UTEST_MAIN_
16#include "utests.h"
Radek Krejci1798aae2020-07-14 13:26:06 +020017
Radek Krejci1798aae2020-07-14 13:26:06 +020018#include "context.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020019#include "in.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020020#include "out.h"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010021#include "parser_data.h"
Radek Krejci1798aae2020-07-14 13:26:06 +020022#include "printer_data.h"
Radek Krejcief5f7672021-04-01 17:04:12 +020023#include "tests_config.h"
Radek Krejci1798aae2020-07-14 13:26:06 +020024#include "tree_data_internal.h"
25#include "tree_schema.h"
Radek Krejci1798aae2020-07-14 13:26:06 +020026
27static int
28setup(void **state)
29{
Radek Iša56ca9e42020-09-08 18:42:00 +020030 const char *schema = "module a {namespace urn:tests:a;prefix a;yang-version 1.1; import ietf-yang-metadata {prefix md;}"
Radek Krejci1798aae2020-07-14 13:26:06 +020031 "md:annotation hint { type int8;}"
Michal Vaskodbf3e652022-10-21 08:46:25 +020032 "list l1 { key \"a b c\"; leaf a {type string;} leaf b {type string;} leaf c {type int16;}"
33 " leaf d {type string;}"
34 " container cont {leaf e {type boolean;}}"
35 "}"
Radek Krejci1798aae2020-07-14 13:26:06 +020036 "leaf foo { type string;}"
37 "container c {"
Radek Krejcib4ac5a92020-11-23 17:54:33 +010038 " leaf x {type string;}"
39 " action act { input { leaf al {type string;} } output { leaf al {type uint8;} } }"
40 " notification n1 { leaf nl {type string;} }"
Radek Krejci1798aae2020-07-14 13:26:06 +020041 "}"
42 "container cp {presence \"container switch\"; leaf y {type string;} leaf z {type int8;}}"
43 "anydata any {config false;}"
Michal Vasko76096ec2022-02-24 16:06:16 +010044 "anyxml axml;"
Radek Krejci1798aae2020-07-14 13:26:06 +020045 "leaf-list ll1 { type uint8; }"
46 "leaf foo2 { type string; default \"default-val\"; }"
47 "leaf foo3 { type uint32; }"
48 "notification n2;}";
Radek Krejci1798aae2020-07-14 13:26:06 +020049
Radek Iša56ca9e42020-09-08 18:42:00 +020050 UTEST_SETUP;
Radek Krejci1798aae2020-07-14 13:26:06 +020051
Radek Iša56ca9e42020-09-08 18:42:00 +020052 UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
53 assert_int_equal(LY_SUCCESS, ly_ctx_set_searchdir(UTEST_LYCTX, TESTS_DIR_MODULES_YANG));
Radek Krejci1798aae2020-07-14 13:26:06 +020054
55 return 0;
56}
57
Radek Iša56ca9e42020-09-08 18:42:00 +020058#define CHECK_PARSE_LYD(INPUT, PARSE_OPTION, VALIDATE_OPTION, TREE) \
59 CHECK_PARSE_LYD_PARAM(INPUT, LYD_JSON, PARSE_OPTION, VALIDATE_OPTION, LY_SUCCESS, TREE)
Radek Krejci1798aae2020-07-14 13:26:06 +020060
Radek Iša56ca9e42020-09-08 18:42:00 +020061#define PARSER_CHECK_ERROR(INPUT, PARSE_OPTION, VALIDATE_OPTION, MODEL, RET_VAL, ERR_MESSAGE, ERR_PATH) \
62 assert_int_equal(RET_VAL, lyd_parse_data_mem(UTEST_LYCTX, INPUT, LYD_JSON, PARSE_OPTION, VALIDATE_OPTION, &MODEL));\
63 CHECK_LOG_CTX(ERR_MESSAGE, ERR_PATH);\
64 assert_null(MODEL)
Radek Krejci1798aae2020-07-14 13:26:06 +020065
Radek Iša56ca9e42020-09-08 18:42:00 +020066#define CHECK_LYD_STRING(IN_MODEL, PRINT_OPTION, TEXT) \
67 CHECK_LYD_STRING_PARAM(IN_MODEL, TEXT, LYD_JSON, PRINT_OPTION)
Radek Krejci1798aae2020-07-14 13:26:06 +020068
69static void
70test_leaf(void **state)
71{
Radek Krejci1798aae2020-07-14 13:26:06 +020072 struct lyd_node *tree;
73 struct lyd_node_term *leaf;
Radek Iša56ca9e42020-09-08 18:42:00 +020074 const char *data;
Radek Krejci1798aae2020-07-14 13:26:06 +020075
Radek Iša56ca9e42020-09-08 18:42:00 +020076 assert_non_null(ly_ctx_load_module(UTEST_LYCTX, "ietf-netconf-with-defaults", "2011-06-01", NULL));
Radek Krejcib4ac5a92020-11-23 17:54:33 +010077
Radek Iša56ca9e42020-09-08 18:42:00 +020078 data = "{\"a:foo\":\"foo value\"}";
79 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
80 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR, 1, "foo", 1, LYS_LEAF, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +010081 leaf = (struct lyd_node_term *)tree;
Radek Iša56ca9e42020-09-08 18:42:00 +020082 CHECK_LYD_VALUE(leaf->value, STRING, "foo value");
Radek Krejci1798aae2020-07-14 13:26:06 +020083
Radek Iša56ca9e42020-09-08 18:42:00 +020084 CHECK_LYSC_NODE(tree->next->next->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_SET_DFLT, 1, "foo2",
85 1, LYS_LEAF, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +010086 leaf = (struct lyd_node_term *)tree->next->next;
Radek Iša56ca9e42020-09-08 18:42:00 +020087
88 CHECK_LYD_VALUE(leaf->value, STRING, "default-val");
Radek Krejci1798aae2020-07-14 13:26:06 +020089 assert_true(leaf->flags & LYD_DEFAULT);
90
Radek Iša56ca9e42020-09-08 18:42:00 +020091 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +020092 lyd_free_all(tree);
93
94 /* make foo2 explicit */
95 data = "{\"a:foo2\":\"default-val\"}";
Radek Iša56ca9e42020-09-08 18:42:00 +020096 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +020097 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +010098 tree = tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +020099 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_SET_DFLT, 1, "foo2",
100 1, LYS_LEAF, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100101 leaf = (struct lyd_node_term *)tree;
Radek Iša56ca9e42020-09-08 18:42:00 +0200102 CHECK_LYD_VALUE(leaf->value, STRING, "default-val");
Radek Krejci1798aae2020-07-14 13:26:06 +0200103 assert_false(leaf->flags & LYD_DEFAULT);
104
Radek Iša56ca9e42020-09-08 18:42:00 +0200105 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200106 lyd_free_all(tree);
107
108 /* parse foo2 but make it implicit */
Radek Krejci5536d282020-08-04 23:27:44 +0200109 data = "{\"a:foo2\":\"default-val\",\"@a:foo2\":{\"ietf-netconf-with-defaults:default\":true}}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200110 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200111 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100112 tree = tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200113 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_SET_DFLT, 1, "foo2",
114 1, LYS_LEAF, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100115 leaf = (struct lyd_node_term *)tree;
Radek Iša56ca9e42020-09-08 18:42:00 +0200116 CHECK_LYD_VALUE(leaf->value, STRING, "default-val");
Radek Krejci1798aae2020-07-14 13:26:06 +0200117 assert_true(leaf->flags & LYD_DEFAULT);
118
Michal Vaskob68c3b42022-05-20 10:36:40 +0200119 /* print default values */
120 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS | LYD_PRINT_WD_ALL_TAG, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200121 lyd_free_all(tree);
122
Michal Vaskoa4af6252022-05-20 10:38:54 +0200123 /* skip leaf */
124 data = "{\"a:cp\":{\"x\":\"val\",\"y\":\"valy\",\"z\":5}}";
125 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
126 assert_non_null(tree);
127
128 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, "{\"a:cp\":{\"y\":\"valy\",\"z\":5}}");
129 lyd_free_all(tree);
130
Radek Krejci1798aae2020-07-14 13:26:06 +0200131 /* multiple meatadata hint and unknown metadata xxx supposed to be skipped since it is from missing schema */
Radek Krejci5536d282020-08-04 23:27:44 +0200132 data = "{\"@a:foo\":{\"a:hint\":1,\"a:hint\":2,\"x:xxx\":{\"value\":\"/x:no/x:yes\"}},\"a:foo\":\"xxx\"}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200133 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
134 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR, 1, "foo", 1, LYS_LEAF, 0, 0, NULL, 0);
135 CHECK_LYD_META(tree->meta, 1, "hint", 1, 1, INT8, "1", 1);
136 CHECK_LYD_META(tree->meta->next, 1, "hint", 0, 1, INT8, "2", 2);
Radek Krejci1798aae2020-07-14 13:26:06 +0200137 assert_null(tree->meta->next->next);
138
Radek Iša56ca9e42020-09-08 18:42:00 +0200139 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS,
140 "{\"a:foo\":\"xxx\",\"@a:foo\":{\"a:hint\":1,\"a:hint\":2}}");
Radek Krejci1798aae2020-07-14 13:26:06 +0200141 lyd_free_all(tree);
142
Radek Iša56ca9e42020-09-08 18:42:00 +0200143 PARSER_CHECK_ERROR(data, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200144 "Unknown (or not implemented) YANG module \"x\" of metadata \"x:xxx\".", "Data location \"/@a:foo\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200145
146 /* missing referenced metadata node */
Radek Iša56ca9e42020-09-08 18:42:00 +0200147 PARSER_CHECK_ERROR("{\"@a:foo\" : { \"a:hint\" : 1 }}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200148 "Missing JSON data instance to be coupled with @a:foo metadata.", "Data location \"/@a:foo\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200149
150 /* missing namespace for meatadata*/
Radek Iša56ca9e42020-09-08 18:42:00 +0200151 PARSER_CHECK_ERROR("{\"a:foo\" : \"value\", \"@a:foo\" : { \"hint\" : 1 }}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200152 "Metadata in JSON must be namespace-qualified, missing prefix for \"hint\".",
153 "Schema location \"/a:foo\", line number 1.");
aPiecek49e2a3a2021-05-13 10:36:46 +0200154
Michal Vaskodbf3e652022-10-21 08:46:25 +0200155 /* invalid JSON type */
156 data = "{\"a:l1\" : [{ \"a\" : \"val-a\", \"b\" : \"val-b\", \"c\" : 1, \"cont\" : { \"e\" : \"0\" } }]}";
157 PARSER_CHECK_ERROR(data, 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
158 "Invalid non-boolean-encoded boolean value \"0\".",
159 "Data location \"/a:l1[a='val-a'][b='val-b'][c='1']/cont/e\", line number 1.");
160
aPiecek49e2a3a2021-05-13 10:36:46 +0200161 /* reverse solidus in JSON object member name */
162 data = "{\"@a:foo\":{\"a:hi\\nt\":1},\"a:foo\":\"xxx\"}";
163 assert_int_equal(LY_EINVAL, lyd_parse_data_mem(UTEST_LYCTX, data, LYD_JSON, 0, LYD_VALIDATE_PRESENT, &tree));
Michal Vasko62af3692023-02-09 14:00:09 +0100164 CHECK_LOG_CTX("Annotation definition for attribute \"a:hi\nt\" not found.", "Data location \"/@a:foo\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200165}
166
167static void
168test_leaflist(void **state)
169{
Radek Iša56ca9e42020-09-08 18:42:00 +0200170 const char *data;
Radek Krejci1798aae2020-07-14 13:26:06 +0200171 struct lyd_node *tree;
172 struct lyd_node_term *ll;
173
Radek Iša56ca9e42020-09-08 18:42:00 +0200174 data = "{\"a:ll1\":[10,11]}";
175 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200176 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100177 tree = tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200178 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
179 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100180 ll = (struct lyd_node_term *)tree;
Radek Iša56ca9e42020-09-08 18:42:00 +0200181 CHECK_LYD_VALUE(ll->value, UINT8, "10", 10);
Radek Krejci1798aae2020-07-14 13:26:06 +0200182
183 assert_non_null(tree->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200184 CHECK_LYSC_NODE(tree->next->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
185 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100186 ll = (struct lyd_node_term *)tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200187 CHECK_LYD_VALUE(ll->value, UINT8, "11", 11);
Radek Krejci1798aae2020-07-14 13:26:06 +0200188
Radek Iša56ca9e42020-09-08 18:42:00 +0200189 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200190 lyd_free_all(tree);
191
Michal Vasko4e26adc2022-03-30 11:01:16 +0200192 /* accept empty */
193 data = "{\"a:ll1\":[]}";
194 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
195 assert_null(tree);
196
Radek Krejci1798aae2020-07-14 13:26:06 +0200197 /* simple metadata */
Radek Krejci5536d282020-08-04 23:27:44 +0200198 data = "{\"a:ll1\":[10,11],\"@a:ll1\":[null,{\"a:hint\":2}]}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200199 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200200 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100201 tree = tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200202 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
203 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100204 ll = (struct lyd_node_term *)tree;
Radek Iša56ca9e42020-09-08 18:42:00 +0200205 CHECK_LYD_VALUE(ll->value, UINT8, "10", 10);
Radek Krejci1798aae2020-07-14 13:26:06 +0200206 assert_null(ll->meta);
207
208 assert_non_null(tree->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200209 CHECK_LYSC_NODE(tree->next->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
210 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100211 ll = (struct lyd_node_term *)tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200212 CHECK_LYD_VALUE(ll->value, UINT8, "11", 11);
213 CHECK_LYD_META(ll->meta, 1, "hint", 0, 1, INT8, "2", 2);
Radek Krejci1798aae2020-07-14 13:26:06 +0200214 assert_null(ll->meta->next);
215
Radek Iša56ca9e42020-09-08 18:42:00 +0200216 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200217 lyd_free_all(tree);
218
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100219 /* multiple meatadata hint and unknown metadata xxx supposed to be skipped since it is from missing schema */
Radek Iša56ca9e42020-09-08 18:42:00 +0200220 data = "{\"@a:ll1\" : [{\"a:hint\" : 1, \"x:xxx\" : { \"value\" : \"/x:no/x:yes\" }, "
221 "\"a:hint\" : 10},null,{\"a:hint\" : 3}], \"a:ll1\" : [1,2,3]}";
222 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200223 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100224 tree = tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200225 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
226 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100227 ll = (struct lyd_node_term *)tree;
Radek Iša56ca9e42020-09-08 18:42:00 +0200228 CHECK_LYD_VALUE(ll->value, UINT8, "1", 1);
229 CHECK_LYD_META(ll->meta, 1, "hint", 1, 1, INT8, "1", 1);
230 CHECK_LYD_META(ll->meta->next, 1, "hint", 0, 1, INT8, "10", 10);
Radek Krejci1798aae2020-07-14 13:26:06 +0200231
232 assert_non_null(tree->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200233 CHECK_LYSC_NODE(tree->next->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
234 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100235 ll = (struct lyd_node_term *)tree->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200236 CHECK_LYD_VALUE(ll->value, UINT8, "2", 2);
Radek Krejci1798aae2020-07-14 13:26:06 +0200237 assert_null(ll->meta);
238
239 assert_non_null(tree->next->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200240 CHECK_LYSC_NODE(tree->next->next->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "ll1",
241 1, LYS_LEAFLIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100242 ll = (struct lyd_node_term *)tree->next->next;
Radek Iša56ca9e42020-09-08 18:42:00 +0200243 CHECK_LYD_VALUE(ll->value, UINT8, "3", 3);
244 CHECK_LYD_META(ll->meta, 1, "hint", 0, 1, INT8, "3", 3);
Radek Krejci1798aae2020-07-14 13:26:06 +0200245 assert_null(ll->meta->next);
246
Radek Iša56ca9e42020-09-08 18:42:00 +0200247 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS,
248 "{\"a:ll1\":[1,2,3],\"@a:ll1\":[{\"a:hint\":1,\"a:hint\":10},null,{\"a:hint\":3}]}");
Radek Krejci1798aae2020-07-14 13:26:06 +0200249 lyd_free_all(tree);
250
251 /* missing referenced metadata node */
Radek Iša56ca9e42020-09-08 18:42:00 +0200252 PARSER_CHECK_ERROR("{\"@a:ll1\":[{\"a:hint\":1}]}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200253 "Missing JSON data instance to be coupled with @a:ll1 metadata.", "Data location \"/@a:ll1\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200254
Radek Iša56ca9e42020-09-08 18:42:00 +0200255 PARSER_CHECK_ERROR("{\"a:ll1\":[1],\"@a:ll1\":[{\"a:hint\":1},{\"a:hint\":2}]}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200256 "Missing JSON data instance #2 of a:ll1 to be coupled with metadata.", "Schema location \"/a:ll1\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200257
Radek Iša56ca9e42020-09-08 18:42:00 +0200258 PARSER_CHECK_ERROR("{\"@a:ll1\":[{\"a:hint\":1},{\"a:hint\":2},{\"a:hint\":3}],\"a:ll1\" : [1, 2]}", 0, LYD_VALIDATE_PRESENT,
Michal Vasko959f8d82022-06-16 07:51:50 +0200259 tree, LY_EVALID, "Missing JSON data instance #3 to be coupled with @a:ll1 metadata.",
260 "Data location \"/@a:ll1\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200261}
262
263static void
264test_anydata(void **state)
265{
Radek Krejci1798aae2020-07-14 13:26:06 +0200266 const char *data;
Radek Krejci1798aae2020-07-14 13:26:06 +0200267 struct lyd_node *tree;
268
Radek Krejci1798aae2020-07-14 13:26:06 +0200269 data = "{\"a:any\":{\"x:element1\":{\"element2\":\"/a:some/a:path\",\"list\":[{},{\"key\":\"a\"}]}}}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200270 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200271 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100272 tree = tree->next;
Michal Vasko76096ec2022-02-24 16:06:16 +0100273 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_R | LYS_SET_CONFIG, 1, "any",
Radek Iša56ca9e42020-09-08 18:42:00 +0200274 1, LYS_ANYDATA, 0, 0, NULL, 0);
275 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200276 lyd_free_all(tree);
Michal Vaskofbc4a252022-02-03 13:15:58 +0100277
278 data = "{\"a:any\":{}}";
279 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
280 assert_non_null(tree);
281 tree = tree->next;
Michal Vasko76096ec2022-02-24 16:06:16 +0100282 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_R | LYS_SET_CONFIG, 1, "any",
Michal Vaskofbc4a252022-02-03 13:15:58 +0100283 1, LYS_ANYDATA, 0, 0, NULL, 0);
284 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
285 lyd_free_all(tree);
Michal Vasko76096ec2022-02-24 16:06:16 +0100286
Michal Vaskoe3ed7dc2022-11-30 11:39:44 +0100287 data = "{\"a:any\":{\"node\":20}}";
Michal Vasko76096ec2022-02-24 16:06:16 +0100288 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
289 assert_non_null(tree);
290 tree = tree->next;
291 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_R | LYS_SET_CONFIG, 1, "any",
292 1, LYS_ANYDATA, 0, 0, NULL, 0);
293 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
294 lyd_free_all(tree);
295}
296
297static void
298test_anyxml(void **state)
299{
300 const char *data;
301 struct lyd_node *tree;
302
303 data = "{\"a:axml\":\"some-value in string\"}";
304 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
305 assert_non_null(tree);
306 tree = tree->next;
307 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
308 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
309 lyd_free_all(tree);
310
311 data = "{\"a:axml\":\"\"}";
312 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
313 assert_non_null(tree);
314 tree = tree->next;
315 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
316 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
317 lyd_free_all(tree);
318
319 data = "{\"a:axml\":55}";
320 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
321 assert_non_null(tree);
322 tree = tree->next;
323 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
324 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
325 lyd_free_all(tree);
326
327 data = "{\"a:axml\":false}";
328 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
329 assert_non_null(tree);
330 tree = tree->next;
331 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
332 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
333 lyd_free_all(tree);
334
335 data = "{\"a:axml\":null}";
336 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
337 assert_non_null(tree);
338 tree = tree->next;
339 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
340 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
341 lyd_free_all(tree);
342
343 data = "{\"a:axml\":[null,true,false]}";
344 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
345 assert_non_null(tree);
346 tree = tree->next;
347 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
348 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
349 lyd_free_all(tree);
350
351 data = "{\"a:axml\":[null,true,{\"name\":[25,40, false]}]}";
352 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
353 assert_non_null(tree);
354 tree = tree->next;
355 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
356 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
357 lyd_free_all(tree);
358
359 /* same as anydata tests */
360 data = "{\"a:axml\":{\"x:element1\":{\"element2\":\"/a:some/a:path\",\"list\":[{},{\"key\":\"a\"}]}}}";
361 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
362 assert_non_null(tree);
363 tree = tree->next;
364 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
365 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
366 lyd_free_all(tree);
367
368 data = "{\"a:axml\":{}}";
369 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
370 assert_non_null(tree);
371 tree = tree->next;
372 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_STATUS_CURR | LYS_CONFIG_W, 1, "axml", 1, LYS_ANYXML, 0, 0, NULL, 0);
373 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
374 lyd_free_all(tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200375}
376
377static void
378test_list(void **state)
379{
Radek Iša56ca9e42020-09-08 18:42:00 +0200380 const char *data;
Radek Krejci1798aae2020-07-14 13:26:06 +0200381 struct lyd_node *tree, *iter;
382 struct lyd_node_inner *list;
383 struct lyd_node_term *leaf;
384
385 /* check hashes */
Radek Iša56ca9e42020-09-08 18:42:00 +0200386 data = "{\"a:l1\":[{\"a\":\"one\",\"b\":\"one\",\"c\":1}]}";
387 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
388 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "l1",
389 1, LYS_LIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100390 list = (struct lyd_node_inner *)tree;
Radek Krejci1798aae2020-07-14 13:26:06 +0200391 LY_LIST_FOR(list->child, iter) {
392 assert_int_not_equal(0, iter->hash);
393 }
Radek Iša56ca9e42020-09-08 18:42:00 +0200394 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200395 lyd_free_all(tree);
396
Michal Vasko4e26adc2022-03-30 11:01:16 +0200397 /* accept empty */
398 data = "{\"a:l1\":[]}";
399 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
400 assert_null(tree);
401
Radek Krejci1798aae2020-07-14 13:26:06 +0200402 /* missing keys */
Radek Iša56ca9e42020-09-08 18:42:00 +0200403 PARSER_CHECK_ERROR("{ \"a:l1\": [ {\"c\" : 1, \"b\" : \"b\"}]}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200404 "List instance is missing its key \"a\".",
Michal Vaskodbf3e652022-10-21 08:46:25 +0200405 "Data location \"/a:l1[b='b'][c='1']\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200406
Radek Iša56ca9e42020-09-08 18:42:00 +0200407 PARSER_CHECK_ERROR("{ \"a:l1\": [ {\"a\" : \"a\"}]}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vaskodbf3e652022-10-21 08:46:25 +0200408 "List instance is missing its key \"b\".", "Data location \"/a:l1[a='a']\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200409
Radek Iša56ca9e42020-09-08 18:42:00 +0200410 PARSER_CHECK_ERROR("{ \"a:l1\": [ {\"b\" : \"b\", \"a\" : \"a\"}]}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vaskodbf3e652022-10-21 08:46:25 +0200411 "List instance is missing its key \"c\".", "Data location \"/a:l1[a='a'][b='b']\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200412
413 /* key duplicate */
Radek Iša56ca9e42020-09-08 18:42:00 +0200414 PARSER_CHECK_ERROR("{ \"a:l1\": [ {\"c\" : 1, \"b\" : \"b\", \"a\" : \"a\", \"c\" : 1}]}", 0, LYD_VALIDATE_PRESENT,
Michal Vasko959f8d82022-06-16 07:51:50 +0200415 tree, LY_EVALID, "Duplicate instance of \"c\".",
Michal Vaskodbf3e652022-10-21 08:46:25 +0200416 "Data location \"/a:l1[a='a'][b='b'][c='1'][c='1']/c\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200417
418 /* keys order, in contrast to XML, JSON accepts keys in any order even in strict mode */
Radek Iša56ca9e42020-09-08 18:42:00 +0200419 CHECK_PARSE_LYD("{ \"a:l1\": [ {\"d\" : \"d\", \"a\" : \"a\", \"c\" : 1, \"b\" : \"b\"}]}", 0, LYD_VALIDATE_PRESENT, tree);
420 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "l1",
421 1, LYS_LIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100422 list = (struct lyd_node_inner *)tree;
423 assert_non_null(leaf = (struct lyd_node_term *)list->child);
Radek Iša56ca9e42020-09-08 18:42:00 +0200424 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_KEY, 1, "a", 1, LYS_LEAF, 1, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100425 assert_non_null(leaf = (struct lyd_node_term *)leaf->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200426 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_KEY, 1, "b", 1, LYS_LEAF, 1, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100427 assert_non_null(leaf = (struct lyd_node_term *)leaf->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200428 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_KEY, 1, "c", 1, LYS_LEAF, 1, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100429 assert_non_null(leaf = (struct lyd_node_term *)leaf->next);
Michal Vaskodbf3e652022-10-21 08:46:25 +0200430 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR, 1, "d", 1, LYS_LEAF, 1, 0, NULL, 0);
Radek Iša56ca9e42020-09-08 18:42:00 +0200431 CHECK_LOG_CTX(NULL, NULL);
Radek Iša56ca9e42020-09-08 18:42:00 +0200432 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS,
433 "{\"a:l1\":[{\"a\":\"a\",\"b\":\"b\",\"c\":1,\"d\":\"d\"}]}");
Radek Krejci1798aae2020-07-14 13:26:06 +0200434 lyd_free_all(tree);
435
Radek Iša56ca9e42020-09-08 18:42:00 +0200436 CHECK_PARSE_LYD("{\"a:l1\":[{\"c\":1,\"b\":\"b\",\"a\":\"a\"}]}", LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, tree);
437 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_ORDBY_SYSTEM, 1, "l1",
438 1, LYS_LIST, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100439 list = (struct lyd_node_inner *)tree;
440 assert_non_null(leaf = (struct lyd_node_term *)list->child);
Radek Iša56ca9e42020-09-08 18:42:00 +0200441 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_KEY, 1, "a",
442 1, LYS_LEAF, 1, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100443 assert_non_null(leaf = (struct lyd_node_term *)leaf->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200444 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_KEY, 1, "b",
445 1, LYS_LEAF, 1, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100446 assert_non_null(leaf = (struct lyd_node_term *)leaf->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200447 CHECK_LYSC_NODE(leaf->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_KEY, 1, "c",
448 1, LYS_LEAF, 1, 0, NULL, 0);
449 CHECK_LOG_CTX(NULL, NULL);
Radek Iša56ca9e42020-09-08 18:42:00 +0200450 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS,
451 "{\"a:l1\":[{\"a\":\"a\",\"b\":\"b\",\"c\":1}]}");
Radek Krejci1798aae2020-07-14 13:26:06 +0200452 lyd_free_all(tree);
453
Michal Vasko87c5d6b2023-02-14 15:27:41 +0100454 /* skip unknown nested nodes */
455 data = "{\"a:l1\":[{\"a\":\"val_a\",\"b\":\"val_b\",\"c\":3,\"counters\":{\"count1\":\"c1\",\"count2\":\"c2\"}}]}";
456 CHECK_PARSE_LYD(data, LYD_PARSE_ONLY, 0, tree);
457 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, "{\"a:l1\":[{\"a\":\"val_a\",\"b\":\"val_b\",\"c\":3}]}");
458 lyd_free_all(tree);
459
Radek Krejci5536d282020-08-04 23:27:44 +0200460 data = "{\"a:cp\":{\"@\":{\"a:hint\":1}}}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200461 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200462 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100463 tree = tree->next;
Michal Vaskoe16c7b72021-02-26 10:39:06 +0100464 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_PRESENCE, 1, "cp",
Radek Iša56ca9e42020-09-08 18:42:00 +0200465 1, LYS_CONTAINER, 0, 0, NULL, 0);
466 CHECK_LYD_META(tree->meta, 1, "hint", 0, 1, INT8, "1", 1);
Radek Krejci1798aae2020-07-14 13:26:06 +0200467 assert_null(tree->meta->next);
Radek Iša56ca9e42020-09-08 18:42:00 +0200468 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200469 lyd_free_all(tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200470}
471
472static void
473test_container(void **state)
474{
Radek Iša56ca9e42020-09-08 18:42:00 +0200475 const char *data;
Radek Krejci1798aae2020-07-14 13:26:06 +0200476 struct lyd_node *tree;
477 struct lyd_node_inner *cont;
478
Radek Iša56ca9e42020-09-08 18:42:00 +0200479 CHECK_PARSE_LYD("{\"a:c\":{}}", 0, LYD_VALIDATE_PRESENT, tree);
480 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR, 1, "c",
481 1, LYS_CONTAINER, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100482 cont = (struct lyd_node_inner *)tree;
Radek Krejci1798aae2020-07-14 13:26:06 +0200483 assert_true(cont->flags & LYD_DEFAULT);
Radek Krejci5536d282020-08-04 23:27:44 +0200484
Radek Iša56ca9e42020-09-08 18:42:00 +0200485 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, "{}");
Radek Krejci1798aae2020-07-14 13:26:06 +0200486 lyd_free_all(tree);
487
Radek Krejci5536d282020-08-04 23:27:44 +0200488 data = "{\"a:cp\":{}}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200489 CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200490 assert_non_null(tree);
Michal Vasko26123192020-11-09 21:02:34 +0100491 tree = tree->next;
Michal Vaskoe16c7b72021-02-26 10:39:06 +0100492 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_PRESENCE, 1, "cp",
Radek Iša56ca9e42020-09-08 18:42:00 +0200493 1, LYS_CONTAINER, 0, 0, NULL, 0);
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100494 cont = (struct lyd_node_inner *)tree;
Radek Krejci1798aae2020-07-14 13:26:06 +0200495 assert_false(cont->flags & LYD_DEFAULT);
Radek Krejci5536d282020-08-04 23:27:44 +0200496
Radek Iša56ca9e42020-09-08 18:42:00 +0200497 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200498 lyd_free_all(tree);
Michal Vaskoa4af6252022-05-20 10:38:54 +0200499
500 /* skip container */
501 CHECK_PARSE_LYD("{\"a:unknown\":{\"a\":\"val\",\"b\":5}}", 0, LYD_VALIDATE_PRESENT, tree);
502 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, "{}");
503 lyd_free_all(tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200504}
505
506static void
507test_opaq(void **state)
508{
Radek Krejci1798aae2020-07-14 13:26:06 +0200509 const char *data;
Radek Krejci1798aae2020-07-14 13:26:06 +0200510 struct lyd_node *tree;
511
Radek Krejci1798aae2020-07-14 13:26:06 +0200512 /* invalid value, no flags */
513 data = "{\"a:foo3\":[null]}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200514 PARSER_CHECK_ERROR(data, 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200515 "Invalid non-number-encoded uint32 value \"\".", "Schema location \"/a:foo3\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200516
517 /* opaq flag */
Michal Vasko1a85d332021-08-27 10:35:28 +0200518 CHECK_PARSE_LYD(data, LYD_PARSE_OPAQ | LYD_PARSE_ONLY, 0, tree);
Radek Krejci8df109d2021-04-23 12:19:08 +0200519 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)tree, 0, 0, LY_VALUE_JSON, "foo3", 0, 0, NULL, 0, "");
Radek Iša56ca9e42020-09-08 18:42:00 +0200520 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200521 lyd_free_all(tree);
522
523 /* missing key, no flags */
524 data = "{\"a:l1\":[{\"a\":\"val_a\",\"b\":\"val_b\",\"d\":\"val_d\"}]}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200525 PARSER_CHECK_ERROR(data, 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200526 "List instance is missing its key \"c\".",
Michal Vaskodbf3e652022-10-21 08:46:25 +0200527 "Data location \"/a:l1[a='val_a'][b='val_b']\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200528
529 /* opaq flag */
Michal Vasko1a85d332021-08-27 10:35:28 +0200530 CHECK_PARSE_LYD(data, LYD_PARSE_OPAQ | LYD_PARSE_ONLY, 0, tree);
Radek Krejci8df109d2021-04-23 12:19:08 +0200531 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)tree, 0, 0x1, LY_VALUE_JSON, "l1", 0, 0, NULL, 0, "");
Radek Iša56ca9e42020-09-08 18:42:00 +0200532 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200533 lyd_free_all(tree);
534
535 /* invalid key, no flags */
536 data = "{\"a:l1\":[{\"a\":\"val_a\",\"b\":\"val_b\",\"c\":\"val_c\"}]}";
Radek Iša56ca9e42020-09-08 18:42:00 +0200537 PARSER_CHECK_ERROR(data, 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko959f8d82022-06-16 07:51:50 +0200538 "Invalid non-number-encoded int16 value \"val_c\".",
Michal Vaskoa4dfb3c2022-10-25 14:59:31 +0200539 "Data location \"/a:l1[a='val_a'][b='val_b']/c\", line number 1.");
Radek Krejci1798aae2020-07-14 13:26:06 +0200540
541 /* opaq flag */
Michal Vasko1a85d332021-08-27 10:35:28 +0200542 CHECK_PARSE_LYD(data, LYD_PARSE_OPAQ | LYD_PARSE_ONLY, 0, tree);
Radek Krejci8df109d2021-04-23 12:19:08 +0200543 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)tree, 0, 0x1, LY_VALUE_JSON, "l1", 0, 0, NULL, 0, "");
Radek Iša56ca9e42020-09-08 18:42:00 +0200544 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200545 lyd_free_all(tree);
546
547 data = "{\"a:l1\":[{\"a\":\"val_a\",\"b\":\"val_b\",\"c\":{\"val\":\"val_c\"}}]}";
Michal Vasko1a85d332021-08-27 10:35:28 +0200548 CHECK_PARSE_LYD(data, LYD_PARSE_OPAQ | LYD_PARSE_ONLY, 0, tree);
Radek Krejci8df109d2021-04-23 12:19:08 +0200549 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)tree, 0, 0x1, LY_VALUE_JSON, "l1", 0, 0, NULL, 0, "");
Radek Iša56ca9e42020-09-08 18:42:00 +0200550 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200551 lyd_free_all(tree);
552
553 data = "{\"a:l1\":[{\"a\":\"val_a\",\"b\":\"val_b\"}]}";
Michal Vasko1a85d332021-08-27 10:35:28 +0200554 CHECK_PARSE_LYD(data, LYD_PARSE_OPAQ | LYD_PARSE_ONLY, 0, tree);
Radek Krejci8df109d2021-04-23 12:19:08 +0200555 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)tree, 0, 0x1, LY_VALUE_JSON, "l1", 0, 0, NULL, 0, "");
Radek Iša56ca9e42020-09-08 18:42:00 +0200556 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200557 lyd_free_all(tree);
aPiecekb7b29e62021-05-11 10:02:43 +0200558
Michal Vasko6a6e3082022-05-10 10:32:38 +0200559 /* invalid metadata */
aPiecekc5f36a72021-05-18 14:12:31 +0200560 data = "{\"@a:foo\":\"str\",\"@a:foo3\":1,\"a:foo3\":2}";
Michal Vasko6a6e3082022-05-10 10:32:38 +0200561 PARSER_CHECK_ERROR(data, 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vasko6727c682023-02-17 10:40:26 +0100562 "Unknown module of node \"@a:foo\".", "Path \"/\".");
Michal Vasko62af3692023-02-09 14:00:09 +0100563 CHECK_LOG_CTX("Missing JSON data instance to be coupled with @a:foo metadata.", "Data location \"/@a:foo\", line number 1.");
aPiecekc5f36a72021-05-18 14:12:31 +0200564
aPiecekb7b29e62021-05-11 10:02:43 +0200565 /* empty name */
566 PARSER_CHECK_ERROR("{\"@a:foo\":{\"\":0}}", 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
Michal Vaskobfebf662023-02-17 09:07:22 +0100567 "JSON object member name cannot be a zero-length string.", "Line number 1.");
Michal Vasko1a85d332021-08-27 10:35:28 +0200568
569 /* opaque data tree format print */
570 data =
571 "{\n"
572 " \"ietf-netconf-nmda:get-data\": {\n"
573 " \"data\": {\n"
574 " \"ietf-keystore:keystore\": {\n"
575 " \"asymmetric-keys\": {\n"
576 " \"asymmetric-key\": [\n"
577 " {\n"
578 " \"name\": \"genkey\",\n"
579 " \"algorithm\": \"rsa2048\"\n"
580 " }\n"
581 " ]\n"
582 " }\n"
583 " },\n"
584 " \"ietf-netconf-server:netconf-server\": {\n"
585 " \"listen\": {\n"
586 " \"idle-timeout\": 3600,\n"
587 " \"endpoint\": [\n"
588 " {\n"
589 " \"name\": \"default-ssh\",\n"
590 " \"ssh\": {\n"
591 " \"tcp-server-parameters\": {\n"
592 " \"local-address\": \"0.0.0.0\",\n"
593 " \"local-port\": 830\n"
594 " },\n"
595 " \"ssh-server-parameters\": {\n"
596 " \"server-identity\": {\n"
597 " \"host-key\": [\n"
598 " {\n"
599 " \"name\": \"default-key\",\n"
600 " \"public-key\": {\n"
601 " \"keystore-reference\": \"genkey\"\n"
602 " }\n"
603 " }\n"
604 " ]\n"
605 " },\n"
606 " \"client-authentication\": {\n"
607 " \"supported-authentication-methods\": {\n"
608 " \"publickey\": [null],\n"
609 " \"passsword\": [null],\n"
610 " \"other\": [\n"
611 " \"interactive\",\n"
612 " \"gssapi\"\n"
613 " ]\n"
614 " }\n"
615 " }\n"
616 " }\n"
617 " }\n"
618 " }\n"
619 " ]\n"
620 " }\n"
621 " }\n"
622 " }\n"
623 " }\n"
624 "}\n";
625 CHECK_PARSE_LYD(data, LYD_PARSE_OPAQ | LYD_PARSE_ONLY, 0, tree);
626 CHECK_LYD_STRING(tree, LYD_PRINT_WITHSIBLINGS, data);
627 lyd_free_all(tree);
Radek Krejci1798aae2020-07-14 13:26:06 +0200628}
629
630static void
631test_rpc(void **state)
632{
Radek Krejci1798aae2020-07-14 13:26:06 +0200633 const char *data;
634 struct ly_in *in;
Radek Krejci1798aae2020-07-14 13:26:06 +0200635 struct lyd_node *tree, *op;
636 const struct lyd_node *node;
Michal Vaskobbdadda2022-01-06 11:40:10 +0100637 const char *dsc = "Edit data in an NMDA datastore.\n"
638 "\n"
639 "If an error condition occurs such that an error severity\n"
640 "<rpc-error> element is generated, the server will stop\n"
641 "processing the <edit-data> operation and restore the\n"
642 "specified configuration to its complete state at\n"
643 "the start of this <edit-data> operation.";
Radek Krejci1798aae2020-07-14 13:26:06 +0200644
Michal Vaskobbdadda2022-01-06 11:40:10 +0100645 assert_non_null((ly_ctx_load_module(UTEST_LYCTX, "ietf-netconf-nmda", "2019-01-07", NULL)));
Radek Krejci1798aae2020-07-14 13:26:06 +0200646
Michal Vaskobbdadda2022-01-06 11:40:10 +0100647 data = "{\"ietf-netconf-nmda:edit-data\":{"
648 "\"datastore\":\"ietf-datastores:running\","
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100649 "\"config\":{\"a:cp\":{\"z\":[null],\"@z\":{\"ietf-netconf:operation\":\"replace\"}},"
650 "\"a:l1\":[{\"@\":{\"ietf-netconf:operation\":\"replace\"},\"a\":\"val_a\",\"b\":\"val_b\",\"c\":\"val_c\"}]}"
Michal Vasko2552ea32020-12-08 15:32:34 +0100651 "}}";
Radek Krejci1798aae2020-07-14 13:26:06 +0200652 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
Michal Vasko1e4c68e2021-02-18 15:03:01 +0100653 assert_int_equal(LY_SUCCESS, lyd_parse_op(UTEST_LYCTX, NULL, in, LYD_JSON, LYD_TYPE_RPC_YANG, &tree, &op));
Radek Krejci1798aae2020-07-14 13:26:06 +0200654 ly_in_free(in, 0);
655
656 assert_non_null(op);
Radek Krejci1798aae2020-07-14 13:26:06 +0200657
Radek Krejci2a9fc652021-01-22 17:44:34 +0100658 CHECK_LYSC_ACTION((struct lysc_node_action *)op->schema, dsc, 0, LYS_STATUS_CURR,
Michal Vaskobbdadda2022-01-06 11:40:10 +0100659 1, 0, 0, 1, "edit-data", LYS_RPC,
660 0, 0, 0, 0, 0, NULL, 0);
Radek Iša56ca9e42020-09-08 18:42:00 +0200661
Michal Vasko2552ea32020-12-08 15:32:34 +0100662 node = tree;
Radek Krejci2a9fc652021-01-22 17:44:34 +0100663 CHECK_LYSC_ACTION((struct lysc_node_action *)node->schema, dsc, 0, LYS_STATUS_CURR,
Michal Vaskobbdadda2022-01-06 11:40:10 +0100664 1, 0, 0, 1, "edit-data", LYS_RPC,
665 0, 0, 0, 0, 0, NULL, 0);
Radek Krejcia1c1e542020-09-29 16:06:52 +0200666 node = lyd_child(node)->next;
Michal Vaskobbdadda2022-01-06 11:40:10 +0100667 CHECK_LYSC_NODE(node->schema, "Inline config content.", 0, LYS_STATUS_CURR | LYS_IS_INPUT, 1, "config",
668 0, LYS_ANYDATA, 1, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200669
670 node = ((struct lyd_node_any *)node)->value.tree;
Michal Vaskoe16c7b72021-02-26 10:39:06 +0100671 CHECK_LYSC_NODE(node->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_PRESENCE, 1, "cp",
Radek Iša56ca9e42020-09-08 18:42:00 +0200672 1, LYS_CONTAINER, 0, 0, NULL, 0);
Radek Krejcia1c1e542020-09-29 16:06:52 +0200673 node = lyd_child(node);
Radek Krejci1798aae2020-07-14 13:26:06 +0200674 /* z has no value */
Radek Krejci8df109d2021-04-23 12:19:08 +0200675 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)node, 0x1, 0, LY_VALUE_JSON, "z", 0, 0, NULL, 0, "");
Radek Krejci1798aae2020-07-14 13:26:06 +0200676 node = node->parent->next;
677 /* l1 key c has invalid value so it is at the end */
Radek Krejci8df109d2021-04-23 12:19:08 +0200678 CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)node, 0x1, 0x1, LY_VALUE_JSON, "l1", 0, 0, NULL, 0, "");
Radek Krejci1798aae2020-07-14 13:26:06 +0200679
Radek Iša56ca9e42020-09-08 18:42:00 +0200680 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200681 lyd_free_all(tree);
682
683 /* wrong namespace, element name, whatever... */
684 /* TODO */
Radek Krejci1798aae2020-07-14 13:26:06 +0200685}
686
687static void
688test_action(void **state)
689{
Radek Krejci1798aae2020-07-14 13:26:06 +0200690 const char *data;
691 struct ly_in *in;
Radek Krejci1798aae2020-07-14 13:26:06 +0200692 struct lyd_node *tree, *op;
Radek Krejci1798aae2020-07-14 13:26:06 +0200693
Michal Vasko2552ea32020-12-08 15:32:34 +0100694 data = "{\"a:c\":{\"act\":{\"al\":\"value\"}}}";
Radek Krejci1798aae2020-07-14 13:26:06 +0200695 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
Michal Vasko1e4c68e2021-02-18 15:03:01 +0100696 assert_int_equal(LY_SUCCESS, lyd_parse_op(UTEST_LYCTX, NULL, in, LYD_JSON, LYD_TYPE_RPC_YANG, &tree, &op));
Radek Krejci1798aae2020-07-14 13:26:06 +0200697 ly_in_free(in, 0);
698
699 assert_non_null(op);
Radek Krejci2a9fc652021-01-22 17:44:34 +0100700 CHECK_LYSC_ACTION((struct lysc_node_action *)op->schema, NULL, 0, LYS_STATUS_CURR,
Radek Iša56ca9e42020-09-08 18:42:00 +0200701 1, 0, 0, 1, "act", LYS_ACTION,
702 1, 0, 0, 1, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200703
Radek Iša56ca9e42020-09-08 18:42:00 +0200704 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200705 lyd_free_all(tree);
706
707 /* wrong namespace, element name, whatever... */
708 /* TODO */
Radek Krejci1798aae2020-07-14 13:26:06 +0200709}
710
711static void
712test_notification(void **state)
713{
Radek Krejci1798aae2020-07-14 13:26:06 +0200714 const char *data;
715 struct ly_in *in;
Radek Krejci1798aae2020-07-14 13:26:06 +0200716 struct lyd_node *tree, *ntf;
Radek Krejci1798aae2020-07-14 13:26:06 +0200717
Michal Vasko2552ea32020-12-08 15:32:34 +0100718 data = "{\"a:c\":{\"n1\":{\"nl\":\"value\"}}}";
Radek Krejci1798aae2020-07-14 13:26:06 +0200719 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
Michal Vasko1e4c68e2021-02-18 15:03:01 +0100720 assert_int_equal(LY_SUCCESS, lyd_parse_op(UTEST_LYCTX, NULL, in, LYD_JSON, LYD_TYPE_NOTIF_YANG, &tree, &ntf));
Radek Krejci1798aae2020-07-14 13:26:06 +0200721 ly_in_free(in, 0);
722
723 assert_non_null(ntf);
Radek Krejci2a9fc652021-01-22 17:44:34 +0100724 CHECK_LYSC_NOTIF((struct lysc_node_notif *)ntf->schema, 1, NULL, 0, 0x4, 1, 0, "n1", 1, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200725
Michal Vasko2552ea32020-12-08 15:32:34 +0100726 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR, 1, "c", 1, LYS_CONTAINER, 0, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200727
Radek Iša56ca9e42020-09-08 18:42:00 +0200728 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200729 lyd_free_all(tree);
730
Radek Krejci1798aae2020-07-14 13:26:06 +0200731 data = "{\"a:n2\":{}}";
732 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
Michal Vasko1e4c68e2021-02-18 15:03:01 +0100733 assert_int_equal(LY_SUCCESS, lyd_parse_op(UTEST_LYCTX, NULL, in, LYD_JSON, LYD_TYPE_NOTIF_YANG, &tree, &ntf));
Radek Krejci1798aae2020-07-14 13:26:06 +0200734 ly_in_free(in, 0);
735
736 assert_non_null(ntf);
Radek Krejci2a9fc652021-01-22 17:44:34 +0100737 CHECK_LYSC_NOTIF((struct lysc_node_notif *)ntf->schema, 0, NULL, 0, 0x4, 1, 0, "n2", 0, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200738
739 assert_non_null(tree);
740 assert_ptr_equal(ntf, tree);
741
Radek Iša56ca9e42020-09-08 18:42:00 +0200742 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, data);
Radek Krejci1798aae2020-07-14 13:26:06 +0200743 lyd_free_all(tree);
744
745 /* wrong namespace, element name, whatever... */
746 /* TODO */
Radek Krejci1798aae2020-07-14 13:26:06 +0200747}
748
749static void
750test_reply(void **state)
751{
Radek Krejci1798aae2020-07-14 13:26:06 +0200752 const char *data;
753 struct ly_in *in;
Michal Vasko2552ea32020-12-08 15:32:34 +0100754 struct lyd_node *tree, *op;
Radek Krejci1798aae2020-07-14 13:26:06 +0200755 const struct lyd_node *node;
756
Michal Vasko2552ea32020-12-08 15:32:34 +0100757 data = "{\"a:c\":{\"act\":{\"al\":25}}}";
Radek Krejci1798aae2020-07-14 13:26:06 +0200758 assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
Michal Vasko1e4c68e2021-02-18 15:03:01 +0100759 assert_int_equal(LY_SUCCESS, lyd_parse_op(UTEST_LYCTX, NULL, in, LYD_JSON, LYD_TYPE_REPLY_YANG, &tree, &op));
Radek Krejci1798aae2020-07-14 13:26:06 +0200760 ly_in_free(in, 0);
761
Radek Krejci1798aae2020-07-14 13:26:06 +0200762 assert_non_null(op);
Radek Krejci2a9fc652021-01-22 17:44:34 +0100763 CHECK_LYSC_ACTION((struct lysc_node_action *)op->schema, NULL, 0, LYS_STATUS_CURR,
Radek Iša56ca9e42020-09-08 18:42:00 +0200764 1, 0, 0, 1, "act", LYS_ACTION,
765 1, 0, 0, 1, 0, NULL, 0);
Radek Krejcia1c1e542020-09-29 16:06:52 +0200766 node = lyd_child(op);
Michal Vaskod1e53b92021-01-28 13:11:06 +0100767 CHECK_LYSC_NODE(node->schema, NULL, 0, LYS_STATUS_CURR | LYS_IS_OUTPUT, 1, "al", 0, LYS_LEAF, 1, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200768
Michal Vasko2552ea32020-12-08 15:32:34 +0100769 CHECK_LYSC_NODE(tree->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR, 1, "c", 1, LYS_CONTAINER, 0, 0, NULL, 0);
Radek Krejci1798aae2020-07-14 13:26:06 +0200770
771 /* TODO print only rpc-reply node and then output subtree */
Radek Iša56ca9e42020-09-08 18:42:00 +0200772 CHECK_LYD_STRING(lyd_child(op), LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, "{\"a:al\":25}");
Michal Vasko2552ea32020-12-08 15:32:34 +0100773 CHECK_LYD_STRING(tree, LYD_PRINT_SHRINK | LYD_PRINT_WITHSIBLINGS, "{\"a:c\":{\"act\":{\"al\":25}}}");
Radek Krejci1798aae2020-07-14 13:26:06 +0200774 lyd_free_all(tree);
775
776 /* wrong namespace, element name, whatever... */
777 /* TODO */
Radek Krejci1798aae2020-07-14 13:26:06 +0200778}
779
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100780int
781main(void)
Radek Krejci1798aae2020-07-14 13:26:06 +0200782{
783 const struct CMUnitTest tests[] = {
Radek Iša56ca9e42020-09-08 18:42:00 +0200784 UTEST(test_leaf, setup),
785 UTEST(test_leaflist, setup),
786 UTEST(test_anydata, setup),
Michal Vasko76096ec2022-02-24 16:06:16 +0100787 UTEST(test_anyxml, setup),
Radek Iša56ca9e42020-09-08 18:42:00 +0200788 UTEST(test_list, setup),
789 UTEST(test_container, setup),
790 UTEST(test_opaq, setup),
791 UTEST(test_rpc, setup),
792 UTEST(test_action, setup),
793 UTEST(test_notification, setup),
794 UTEST(test_reply, setup),
Radek Krejci1798aae2020-07-14 13:26:06 +0200795 };
796
797 return cmocka_run_group_tests(tests, NULL, NULL);
798}