blob: ea7945acdf94090481b9a8634a2aa61075792828 [file] [log] [blame]
Michal Vasko004d3152020-06-11 19:59:22 +02001/**
2 * @file test_new.c
3 * @author: Michal Vasko <mvasko@cesnet.cz>
4 * @brief unit tests for functions for creating data
5 *
6 * Copyright (c) 2020 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
Radek Iša56ca9e42020-09-08 18:42:00 +020014#define _UTEST_MAIN_
Radek Krejcib4ac5a92020-11-23 17:54:33 +010015#include "utests.h"
Michal Vasko004d3152020-06-11 19:59:22 +020016
Radek Iša56ca9e42020-09-08 18:42:00 +020017#include "libyang.h"
Michal Vasko004d3152020-06-11 19:59:22 +020018
Radek Iša56ca9e42020-09-08 18:42:00 +020019/* common module for the tests */
20const char *schema_a = "module a {\n"
21 " namespace urn:tests:a;\n"
22 " prefix a;yang-version 1.1;\n"
23 " list l1 {\n"
24 " key \"a b\";\n"
25 " leaf a {\n"
26 " type string;\n"
27 " }\n"
28 " leaf b {\n"
29 " type string;\n"
30 " }\n"
31 " leaf c {\n"
Radek Iša56ca9e42020-09-08 18:42:00 +020032 " type string;\n"
33 " }\n"
Radek Krejci95ccd1b2021-03-12 14:57:22 +010034 " }\n"
Michal Vasko106f0862021-11-02 11:49:27 +010035 " list l11 {\n"
36 " key \"a\";\n"
37 " leaf a {\n"
38 " type uint32;\n"
39 " }\n"
40 " leaf b {\n"
41 " type uint32;\n"
42 " }\n"
43 " }\n"
Radek Krejci95ccd1b2021-03-12 14:57:22 +010044 " leaf foo {\n"
45 " type uint16;\n"
46 " }\n"
47 " leaf-list ll {\n"
48 " type string;\n"
49 " }\n"
50 " container c {\n"
51 " leaf-list x {\n"
Michal Vaskoe78faec2021-04-08 17:24:43 +020052 " type string;\n"
Radek Iša56ca9e42020-09-08 18:42:00 +020053 " }\n"
Radek Krejci95ccd1b2021-03-12 14:57:22 +010054 " }\n"
Radek Iša56ca9e42020-09-08 18:42:00 +020055 " anydata any {\n"
56 " config false;\n"
Radek Krejci95ccd1b2021-03-12 14:57:22 +010057 " }\n"
Michal Vasko54bf9e22023-04-27 08:20:30 +020058 " anyxml anyx;\n"
Michal Vaskoe78faec2021-04-08 17:24:43 +020059 " leaf-list ll2 {\n"
60 " config false;\n"
61 " type string;\n"
62 " }\n"
Radek Iša56ca9e42020-09-08 18:42:00 +020063 " list l2 {\n"
64 " config false;\n"
65 " container c {\n"
66 " leaf x {\n"
67 " type string;\n"
68 " }\n"
69 " }\n"
70 " }\n"
Michal Vaskoe78faec2021-04-08 17:24:43 +020071 " container c2 {\n"
72 " config false;\n"
73 " list l3 {\n"
74 " leaf x {\n"
75 " type string;\n"
76 " }\n"
77 " leaf y {\n"
78 " type string;\n"
79 " }\n"
80 " }\n"
81 " }\n"
Radek Iša56ca9e42020-09-08 18:42:00 +020082 " rpc oper {\n"
83 " input {\n"
84 " leaf param {\n"
85 " type string;\n"
86 " }\n"
87 " }\n"
88 " output {\n"
89 " leaf param {\n"
90 " type int8;\n"
91 " }\n"
92 " }\n"
93 " }\n"
94 "}\n";
Michal Vasko004d3152020-06-11 19:59:22 +020095
96static void
97test_top_level(void **state)
98{
Michal Vasko4de7d072021-07-09 09:13:18 +020099 struct lys_module *mod;
Radek Krejci41ac9942020-11-02 14:47:56 +0100100 struct lyd_node *node, *rpc;
Michal Vasko004d3152020-06-11 19:59:22 +0200101
Radek Iša56ca9e42020-09-08 18:42:00 +0200102 UTEST_ADD_MODULE(schema_a, LYS_IN_YANG, NULL, &mod);
Michal Vasko004d3152020-06-11 19:59:22 +0200103
104 /* list */
Radek Krejci41ac9942020-11-02 14:47:56 +0100105 assert_int_equal(lyd_new_list(NULL, mod, "l1", 0, &node, "val_a", "val_b"), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200106 lyd_free_tree(node);
107
Radek Krejci41ac9942020-11-02 14:47:56 +0100108 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[]", 0, &node), LY_EVALID);
Michal Vasko7a266772024-01-23 11:02:38 +0100109 CHECK_LOG_CTX("Unexpected XPath token \"]\" (\"]\").", "/a:l1", 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200110
Radek Krejci41ac9942020-11-02 14:47:56 +0100111 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[key1='a'][key2='b']", 0, &node), LY_ENOTFOUND);
Michal Vasko7a266772024-01-23 11:02:38 +0100112 CHECK_LOG_CTX("Not found node \"key1\" in path.", "/a:l1", 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200113
Radek Krejci41ac9942020-11-02 14:47:56 +0100114 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[a='a'][b='b'][c='c']", 0, &node), LY_EVALID);
Michal Vasko7a266772024-01-23 11:02:38 +0100115 CHECK_LOG_CTX("Key expected instead of leaf \"c\" in path.", "/a:l1", 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200116
Radek Krejci41ac9942020-11-02 14:47:56 +0100117 assert_int_equal(lyd_new_list2(NULL, mod, "c", "[a='a'][b='b']", 0, &node), LY_ENOTFOUND);
Michal Vasko7a266772024-01-23 11:02:38 +0100118 CHECK_LOG_CTX("List node \"c\" not found.", NULL, 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200119
Radek Krejci41ac9942020-11-02 14:47:56 +0100120 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[a='a'][b='b']", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200121 lyd_free_tree(node);
122
Radek Krejci41ac9942020-11-02 14:47:56 +0100123 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[a=''][b='']", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200124 lyd_free_tree(node);
125
Radek Krejci41ac9942020-11-02 14:47:56 +0100126 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[a:a='a'][a:b='b']", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200127 lyd_free_tree(node);
128
Radek Krejci41ac9942020-11-02 14:47:56 +0100129 assert_int_equal(lyd_new_list2(NULL, mod, "l1", "[a= 'a']\n[b =\t'b']", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200130 lyd_free_tree(node);
131
Michal Vasko2c1e3272023-10-17 14:08:35 +0200132 const char *key_vals[] = {"a", "b"};
Michal Vaskof7931562023-10-17 14:18:03 +0200133
Michal Vasko2c1e3272023-10-17 14:08:35 +0200134 assert_int_equal(lyd_new_list3(NULL, mod, "l1", key_vals, NULL, 0, &node), LY_SUCCESS);
135 lyd_free_tree(node);
136
137 uint32_t val_lens[] = {1, 1};
Michal Vaskof7931562023-10-17 14:18:03 +0200138
stewegd4cde642024-02-21 08:34:16 +0100139 assert_int_equal(lyd_new_list3(NULL, mod, "l1", key_vals, val_lens, LYD_NEW_VAL_BIN_VALUE, &node), LY_EINVAL);
140 CHECK_LOG_CTX("Invalid argument !(options & 0x04) (lyd_new_list3()).", NULL, 0);
Michal Vasko2c1e3272023-10-17 14:08:35 +0200141 assert_int_equal(lyd_new_list3_bin(NULL, mod, "l1", (const void **)key_vals, val_lens, 0, &node), LY_SUCCESS);
142 lyd_free_tree(node);
stewegd4cde642024-02-21 08:34:16 +0100143 assert_int_equal(lyd_new_list3_bin(NULL, mod, "l1", (const void **)key_vals, val_lens, LYD_NEW_VAL_STORE_ONLY, &node), LY_EINVAL);
144 CHECK_LOG_CTX("Invalid argument !(store_only && (format == LY_VALUE_CANON || format == LY_VALUE_LYB)) (_lyd_new_list3()).", NULL, 0);
145
Michal Vasko6a027db2024-02-21 09:55:34 +0100146 assert_int_equal(lyd_new_list3(NULL, mod, "l1", key_vals, val_lens, LYD_NEW_VAL_CANON, &node), LY_SUCCESS);
stewegd4cde642024-02-21 08:34:16 +0100147 lyd_free_tree(node);
Michal Vasko6a027db2024-02-21 09:55:34 +0100148 assert_int_equal(lyd_new_list3(NULL, mod, "l1", key_vals, val_lens, LYD_NEW_VAL_CANON | LYD_NEW_VAL_STORE_ONLY, &node), LY_EINVAL);
stewegd4cde642024-02-21 08:34:16 +0100149 CHECK_LOG_CTX("Invalid argument !(store_only && (format == LY_VALUE_CANON || format == LY_VALUE_LYB)) (_lyd_new_list3()).", NULL, 0);
150
Michal Vasko6a027db2024-02-21 09:55:34 +0100151 assert_int_equal(lyd_new_list(NULL, mod, "l1", LYD_NEW_VAL_BIN, &node, "val_a", 5, "val_b", 5), LY_SUCCESS);
stewegd4cde642024-02-21 08:34:16 +0100152 lyd_free_tree(node);
Michal Vasko6a027db2024-02-21 09:55:34 +0100153 assert_int_equal(lyd_new_list(NULL, mod, "l1", LYD_NEW_VAL_BIN | LYD_NEW_VAL_STORE_ONLY, &node, "val_a", 5, "val_b", 5), LY_EINVAL);
stewegd4cde642024-02-21 08:34:16 +0100154 CHECK_LOG_CTX("Invalid argument !(store_only && (format == LY_VALUE_CANON || format == LY_VALUE_LYB)) (lyd_new_list()).", NULL, 0);
155
Michal Vasko6a027db2024-02-21 09:55:34 +0100156 assert_int_equal(lyd_new_list(NULL, mod, "l1", LYD_NEW_VAL_CANON, &node, "val_a", "val_b"), LY_SUCCESS);
stewegd4cde642024-02-21 08:34:16 +0100157 lyd_free_tree(node);
Michal Vasko6a027db2024-02-21 09:55:34 +0100158 assert_int_equal(lyd_new_list(NULL, mod, "l1", LYD_NEW_VAL_CANON | LYD_NEW_VAL_STORE_ONLY, &node, "val_a", "val_b"), LY_EINVAL);
stewegd4cde642024-02-21 08:34:16 +0100159 CHECK_LOG_CTX("Invalid argument !(store_only && (format == LY_VALUE_CANON || format == LY_VALUE_LYB)) (lyd_new_list()).", NULL, 0);
Michal Vasko2c1e3272023-10-17 14:08:35 +0200160
Michal Vasko004d3152020-06-11 19:59:22 +0200161 /* leaf */
Radek Krejci41ac9942020-11-02 14:47:56 +0100162 assert_int_equal(lyd_new_term(NULL, mod, "foo", "[a='a'][b='b'][c='c']", 0, &node), LY_EVALID);
Michal Vasko7a266772024-01-23 11:02:38 +0100163 CHECK_LOG_CTX("Invalid type uint16 value \"[a='a'][b='b'][c='c']\".", "/a:foo", 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200164
Radek Krejci41ac9942020-11-02 14:47:56 +0100165 assert_int_equal(lyd_new_term(NULL, mod, "c", "value", 0, &node), LY_ENOTFOUND);
Michal Vasko7a266772024-01-23 11:02:38 +0100166 CHECK_LOG_CTX("Term node \"c\" not found.", NULL, 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200167
Radek Krejci41ac9942020-11-02 14:47:56 +0100168 assert_int_equal(lyd_new_term(NULL, mod, "foo", "256", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200169 lyd_free_tree(node);
170
Michal Vasko6a027db2024-02-21 09:55:34 +0100171 assert_int_equal(lyd_new_term(NULL, mod, "foo", "25", LYD_NEW_VAL_BIN, &node), LY_EINVAL);
stewegd4cde642024-02-21 08:34:16 +0100172 CHECK_LOG_CTX("Invalid argument !(options & 0x04) (lyd_new_term()).", NULL, 0);
Michal Vasko6a027db2024-02-21 09:55:34 +0100173 assert_int_equal(lyd_new_term_bin(NULL, mod, "foo", "25", 2, LYD_NEW_VAL_BIN, &node), LY_SUCCESS);
stewegd4cde642024-02-21 08:34:16 +0100174 lyd_free_tree(node);
175 assert_int_equal(lyd_new_term_bin(NULL, mod, "foo", "25", 2, LYD_NEW_VAL_STORE_ONLY, &node), LY_EINVAL);
176 CHECK_LOG_CTX("Invalid argument !(store_only && (format == LY_VALUE_CANON || format == LY_VALUE_LYB)) (_lyd_new_term()).", NULL, 0);
177
Michal Vasko6a027db2024-02-21 09:55:34 +0100178 assert_int_equal(lyd_new_term(NULL, mod, "foo", "25", LYD_NEW_VAL_CANON, &node), LY_SUCCESS);
stewegd4cde642024-02-21 08:34:16 +0100179 lyd_free_tree(node);
Michal Vasko6a027db2024-02-21 09:55:34 +0100180 assert_int_equal(lyd_new_term(NULL, mod, "foo", "25", LYD_NEW_VAL_CANON | LYD_NEW_VAL_STORE_ONLY, &node), LY_EINVAL);
stewegd4cde642024-02-21 08:34:16 +0100181 CHECK_LOG_CTX("Invalid argument !(store_only && (format == LY_VALUE_CANON || format == LY_VALUE_LYB)) (_lyd_new_term()).", NULL, 0);
182
Michal Vasko004d3152020-06-11 19:59:22 +0200183 /* leaf-list */
Radek Krejci41ac9942020-11-02 14:47:56 +0100184 assert_int_equal(lyd_new_term(NULL, mod, "ll", "ahoy", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200185 lyd_free_tree(node);
186
187 /* container */
Radek Krejci41ac9942020-11-02 14:47:56 +0100188 assert_int_equal(lyd_new_inner(NULL, mod, "c", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200189 lyd_free_tree(node);
190
Radek Krejci41ac9942020-11-02 14:47:56 +0100191 assert_int_equal(lyd_new_inner(NULL, mod, "l1", 0, &node), LY_ENOTFOUND);
Michal Vasko7a266772024-01-23 11:02:38 +0100192 CHECK_LOG_CTX("Inner node (container, notif, RPC, or action) \"l1\" not found.", NULL, 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200193
Radek Krejci41ac9942020-11-02 14:47:56 +0100194 assert_int_equal(lyd_new_inner(NULL, mod, "l2", 0, &node), LY_ENOTFOUND);
Michal Vasko7a266772024-01-23 11:02:38 +0100195 CHECK_LOG_CTX("Inner node (container, notif, RPC, or action) \"l2\" not found.", NULL, 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200196
197 /* anydata */
Michal Vasko6a027db2024-02-21 09:55:34 +0100198 assert_int_equal(lyd_new_any(NULL, mod, "any", "{\"node\":\"val\"}", LYD_ANYDATA_STRING, 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200199 lyd_free_tree(node);
Michal Vasko6a027db2024-02-21 09:55:34 +0100200 assert_int_equal(lyd_new_any(NULL, mod, "any", "<node>val</node>", LYD_ANYDATA_STRING, 0, &node), LY_SUCCESS);
Michal Vaskoce2e07c2022-12-01 11:08:52 +0100201 lyd_free_tree(node);
Michal Vasko004d3152020-06-11 19:59:22 +0200202
203 /* key-less list */
Radek Krejci41ac9942020-11-02 14:47:56 +0100204 assert_int_equal(lyd_new_list2(NULL, mod, "l2", "[a='a'][b='b']", 0, &node), LY_EVALID);
Michal Vasko7a266772024-01-23 11:02:38 +0100205 CHECK_LOG_CTX("List predicate defined for keyless list \"l2\" in path.", "/a:l2", 0);
Michal Vasko004d3152020-06-11 19:59:22 +0200206
Radek Krejci41ac9942020-11-02 14:47:56 +0100207 assert_int_equal(lyd_new_list2(NULL, mod, "l2", "", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200208 lyd_free_tree(node);
209
Radek Krejci41ac9942020-11-02 14:47:56 +0100210 assert_int_equal(lyd_new_list2(NULL, mod, "l2", NULL, 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200211 lyd_free_tree(node);
212
Radek Krejci41ac9942020-11-02 14:47:56 +0100213 assert_int_equal(lyd_new_list(NULL, mod, "l2", 0, &node), LY_SUCCESS);
Michal Vasko004d3152020-06-11 19:59:22 +0200214 lyd_free_tree(node);
215
Radek Krejci41ac9942020-11-02 14:47:56 +0100216 /* RPC */
217 assert_int_equal(lyd_new_inner(NULL, mod, "oper", 0, &rpc), LY_SUCCESS);
218 assert_int_equal(lyd_new_term(rpc, mod, "param", "22", 0, &node), LY_SUCCESS);
219 assert_int_equal(LY_TYPE_STRING, ((struct lysc_node_leaf *)node->schema)->type->basetype);
stewegd4cde642024-02-21 08:34:16 +0100220 assert_int_equal(lyd_new_term(rpc, mod, "param", "22", LYD_NEW_VAL_OUTPUT, &node), LY_SUCCESS);
Radek Krejci41ac9942020-11-02 14:47:56 +0100221 assert_int_equal(LY_TYPE_INT8, ((struct lysc_node_leaf *)node->schema)->type->basetype);
222 lyd_free_tree(rpc);
Michal Vasko004d3152020-06-11 19:59:22 +0200223}
224
Michal Vasko00cbf532020-06-15 13:58:47 +0200225static void
226test_opaq(void **state)
227{
Michal Vasko00cbf532020-06-15 13:58:47 +0200228 struct lyd_node *root, *node;
229 struct lyd_node_opaq *opq;
230
Radek Iša56ca9e42020-09-08 18:42:00 +0200231 UTEST_ADD_MODULE(schema_a, LYS_IN_YANG, NULL, NULL);
232
Michal Vasko0ab974d2021-02-24 13:18:26 +0100233 assert_int_equal(lyd_new_opaq(NULL, UTEST_LYCTX, "node1", NULL, NULL, "my-module", &root), LY_SUCCESS);
Michal Vasko00cbf532020-06-15 13:58:47 +0200234 assert_null(root->schema);
235 opq = (struct lyd_node_opaq *)root;
Michal Vaskoad92b672020-11-12 13:11:31 +0100236 assert_string_equal(opq->name.name, "node1");
237 assert_string_equal(opq->name.module_name, "my-module");
Michal Vasko501af032020-11-11 20:27:44 +0100238 assert_string_equal(opq->value, "");
Michal Vasko00cbf532020-06-15 13:58:47 +0200239
Michal Vasko0ab974d2021-02-24 13:18:26 +0100240 assert_int_equal(lyd_new_opaq(root, NULL, "node2", "value", NULL, "my-module2", &node), LY_SUCCESS);
Michal Vasko00cbf532020-06-15 13:58:47 +0200241 assert_null(node->schema);
242 opq = (struct lyd_node_opaq *)node;
Michal Vaskoad92b672020-11-12 13:11:31 +0100243 assert_string_equal(opq->name.name, "node2");
244 assert_string_equal(opq->name.module_name, "my-module2");
Michal Vasko501af032020-11-11 20:27:44 +0100245 assert_string_equal(opq->value, "value");
Michal Vasko00cbf532020-06-15 13:58:47 +0200246 assert_ptr_equal(opq->parent, root);
247
248 lyd_free_tree(root);
Michal Vasko00cbf532020-06-15 13:58:47 +0200249}
250
251static void
252test_path(void **state)
253{
Michal Vasko00cbf532020-06-15 13:58:47 +0200254 LY_ERR ret;
255 struct lyd_node *root, *node, *parent;
Michal Vasko4de7d072021-07-09 09:13:18 +0200256 struct lys_module *mod;
Michal Vaskoe78faec2021-04-08 17:24:43 +0200257 char *str;
Michal Vasko00cbf532020-06-15 13:58:47 +0200258
Michal Vaskoe78faec2021-04-08 17:24:43 +0200259 UTEST_ADD_MODULE(schema_a, LYS_IN_YANG, NULL, &mod);
Radek Iša56ca9e42020-09-08 18:42:00 +0200260
Michal Vasko00cbf532020-06-15 13:58:47 +0200261 /* create 2 nodes */
Radek Krejci09c77442021-04-26 11:10:34 +0200262 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:c/x[.='val']", "vvv", 0, 0, 0, &root, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200263 assert_int_equal(ret, LY_SUCCESS);
264 assert_non_null(root);
265 assert_string_equal(root->schema->name, "c");
266 assert_non_null(node);
267 assert_string_equal(node->schema->name, "x");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200268 assert_string_equal("val", lyd_get_value(node));
Michal Vasko00cbf532020-06-15 13:58:47 +0200269
270 /* append another */
Radek Krejci09c77442021-04-26 11:10:34 +0200271 ret = lyd_new_path2(root, NULL, "/a:c/x", "val2", 0, 0, 0, &parent, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200272 assert_int_equal(ret, LY_SUCCESS);
273 assert_ptr_equal(parent, node);
274 assert_string_equal(node->schema->name, "x");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200275 assert_string_equal("val2", lyd_get_value(node));
Michal Vasko00cbf532020-06-15 13:58:47 +0200276
277 /* and a last one */
Radek Krejci09c77442021-04-26 11:10:34 +0200278 ret = lyd_new_path2(root, NULL, "x", "val3", 0, 0, 0, &parent, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200279 assert_int_equal(ret, LY_SUCCESS);
280 assert_ptr_equal(parent, node);
281 assert_string_equal(node->schema->name, "x");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200282 assert_string_equal("val3", lyd_get_value(node));
Michal Vasko00cbf532020-06-15 13:58:47 +0200283
284 lyd_free_tree(root);
285
286 /* try LYD_NEWOPT_OPAQ */
Radek Krejci09c77442021-04-26 11:10:34 +0200287 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:l1", NULL, 0, 0, 0, NULL, NULL);
Michal Vasko00cbf532020-06-15 13:58:47 +0200288 assert_int_equal(ret, LY_EINVAL);
Michal Vasko7a266772024-01-23 11:02:38 +0100289 CHECK_LOG_CTX("Predicate missing for list \"l1\" in path \"/a:l1\".", "/a:l1", 0);
Michal Vasko00cbf532020-06-15 13:58:47 +0200290
Radek Krejci09c77442021-04-26 11:10:34 +0200291 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:l1", NULL, 0, 0, LYD_NEW_PATH_OPAQ, NULL, &root);
Michal Vasko00cbf532020-06-15 13:58:47 +0200292 assert_int_equal(ret, LY_SUCCESS);
293 assert_non_null(root);
294 assert_null(root->schema);
295
296 lyd_free_tree(root);
297
Radek Krejci09c77442021-04-26 11:10:34 +0200298 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:foo", NULL, 0, 0, 0, NULL, NULL);
Michal Vasko00cbf532020-06-15 13:58:47 +0200299 assert_int_equal(ret, LY_EVALID);
Michal Vasko7a266772024-01-23 11:02:38 +0100300 CHECK_LOG_CTX("Invalid type uint16 empty value.", "/a:foo", 0);
Michal Vasko00cbf532020-06-15 13:58:47 +0200301
Radek Krejci09c77442021-04-26 11:10:34 +0200302 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:foo", NULL, 0, 0, LYD_NEW_PATH_OPAQ, NULL, &root);
Michal Vasko00cbf532020-06-15 13:58:47 +0200303 assert_int_equal(ret, LY_SUCCESS);
304 assert_non_null(root);
305 assert_null(root->schema);
306
307 lyd_free_tree(root);
308
Michal Vasko106f0862021-11-02 11:49:27 +0100309 ret = lyd_new_path(NULL, UTEST_LYCTX, "/a:l11", NULL, LYD_NEW_PATH_OPAQ, &root);
310 assert_int_equal(ret, LY_SUCCESS);
311 assert_non_null(root);
312 assert_null(root->schema);
313
314 ret = lyd_new_path(root, NULL, "a", NULL, LYD_NEW_PATH_OPAQ, NULL);
315 assert_int_equal(ret, LY_SUCCESS);
316 assert_non_null(lyd_child(root));
317 assert_null(lyd_child(root)->schema);
318
319 ret = lyd_new_path(root, NULL, "b", NULL, LYD_NEW_PATH_OPAQ, NULL);
320 assert_int_equal(ret, LY_SUCCESS);
321 assert_non_null(lyd_child(root)->next);
322 assert_null(lyd_child(root)->next->schema);
323
324 lyd_free_tree(root);
325
Michal Vaskoe78faec2021-04-08 17:24:43 +0200326 /* key-less list */
Radek Krejci09c77442021-04-26 11:10:34 +0200327 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:c2/l3/x", "val1", 0, 0, 0, &root, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200328 assert_int_equal(ret, LY_SUCCESS);
329 assert_non_null(root);
330 assert_string_equal(node->schema->name, "x");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200331 assert_string_equal("val1", lyd_get_value(node));
Michal Vasko00cbf532020-06-15 13:58:47 +0200332
Radek Krejci09c77442021-04-26 11:10:34 +0200333 ret = lyd_new_path2(root, NULL, "/a:c2/l3[1]", NULL, 0, 0, 0, NULL, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200334 assert_int_equal(ret, LY_EEXIST);
Michal Vasko7a266772024-01-23 11:02:38 +0100335 CHECK_LOG_CTX("Path \"/a:c2/l3[1]\" already exists.", "/a:c2/l3[1]", 0);
Michal Vasko00cbf532020-06-15 13:58:47 +0200336
Radek Krejci09c77442021-04-26 11:10:34 +0200337 ret = lyd_new_path2(root, NULL, "/a:c2/l3[2]/x", "val2", 0, 0, 0, NULL, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200338 assert_int_equal(ret, LY_SUCCESS);
Michal Vasko00cbf532020-06-15 13:58:47 +0200339
Radek Krejci09c77442021-04-26 11:10:34 +0200340 ret = lyd_new_path2(root, NULL, "/a:c2/l3/x", "val3", 0, 0, 0, NULL, &node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200341 assert_int_equal(ret, LY_SUCCESS);
342 assert_non_null(node);
Michal Vasko00cbf532020-06-15 13:58:47 +0200343
Radek Krejci09c77442021-04-26 11:10:34 +0200344 ret = lyd_new_path2(root, NULL, "/a:c2/l3[4]/x", "empty", 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200345 assert_int_equal(ret, LY_SUCCESS);
346 assert_non_null(node);
347
Radek Krejci09c77442021-04-26 11:10:34 +0200348 ret = lyd_new_path2(root, NULL, "/a:c2/l3[4]/x", "val4", 0, 0, LYD_NEW_PATH_UPDATE, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200349 assert_int_equal(ret, LY_SUCCESS);
350 assert_non_null(node);
351
Radek Krejci09c77442021-04-26 11:10:34 +0200352 ret = lyd_new_path2(root, NULL, "/a:c2/l3[5]/x", "val5", 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200353 assert_int_equal(ret, LY_SUCCESS);
354 assert_non_null(node);
355
Radek Krejci09c77442021-04-26 11:10:34 +0200356 ret = lyd_new_path2(root, NULL, "/a:c2/l3[6]/x", "val6", 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200357 assert_int_equal(ret, LY_SUCCESS);
358 assert_non_null(node);
359
360 lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
361 assert_string_equal(str,
362 "<c2 xmlns=\"urn:tests:a\">\n"
363 " <l3>\n"
364 " <x>val1</x>\n"
365 " </l3>\n"
366 " <l3>\n"
367 " <x>val2</x>\n"
368 " </l3>\n"
369 " <l3>\n"
370 " <x>val3</x>\n"
371 " </l3>\n"
372 " <l3>\n"
373 " <x>val4</x>\n"
374 " </l3>\n"
375 " <l3>\n"
376 " <x>val5</x>\n"
377 " </l3>\n"
378 " <l3>\n"
379 " <x>val6</x>\n"
380 " </l3>\n"
381 "</c2>\n");
382 free(str);
383 lyd_free_siblings(root);
384
385 /* state leaf-list */
Radek Krejci09c77442021-04-26 11:10:34 +0200386 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:ll2", "val_first", 0, 0, 0, &root, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200387 assert_int_equal(ret, LY_SUCCESS);
388 assert_non_null(root);
389 assert_string_equal(node->schema->name, "ll2");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200390 assert_string_equal("val_first", lyd_get_value(node));
Michal Vaskoe78faec2021-04-08 17:24:43 +0200391
Radek Krejci09c77442021-04-26 11:10:34 +0200392 ret = lyd_new_path2(root, NULL, "/a:ll2[1]", "", 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200393 assert_int_equal(ret, LY_EEXIST);
Michal Vasko7a266772024-01-23 11:02:38 +0100394 CHECK_LOG_CTX("Path \"/a:ll2[1]\" already exists.", "/a:ll2[1]", 0);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200395
Radek Krejci09c77442021-04-26 11:10:34 +0200396 ret = lyd_new_path2(root, NULL, "/a:ll2[2]", "val2", 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200397 assert_int_equal(ret, LY_SUCCESS);
398
Radek Krejci09c77442021-04-26 11:10:34 +0200399 ret = lyd_new_path2(root, NULL, "/a:ll2[1]", "val", 0, 0, LYD_NEW_PATH_UPDATE, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200400 assert_int_equal(ret, LY_SUCCESS);
401 assert_non_null(node);
402
Radek Krejci09c77442021-04-26 11:10:34 +0200403 ret = lyd_new_path2(root, UTEST_LYCTX, "/a:ll2", "val3", 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200404 assert_int_equal(ret, LY_SUCCESS);
405 assert_non_null(node);
406
Radek Krejci09c77442021-04-26 11:10:34 +0200407 ret = lyd_new_path2(root, NULL, "/a:ll2[3][.='val3']", NULL, 0, 0, 0, NULL, &node);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200408 assert_int_equal(ret, LY_EVALID);
Michal Vasko7a266772024-01-23 11:02:38 +0100409 CHECK_LOG_CTX("Unparsed characters \"[.='val3']\" left at the end of path.", NULL, 0);
Michal Vaskoe78faec2021-04-08 17:24:43 +0200410
411 lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
412 assert_string_equal(str,
413 "<ll2 xmlns=\"urn:tests:a\">val</ll2>\n"
414 "<ll2 xmlns=\"urn:tests:a\">val2</ll2>\n"
415 "<ll2 xmlns=\"urn:tests:a\">val3</ll2>\n");
416 free(str);
417 lyd_free_siblings(root);
Michal Vaskoea0f96c2022-12-20 08:34:39 +0100418
419 /* anydata */
420 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:any", "<elem>val</elem>", 0, LYD_ANYDATA_XML, 0, &root, NULL);
421 assert_int_equal(ret, LY_SUCCESS);
422 assert_non_null(root);
423
424 lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
425 assert_string_equal(str,
426 "<any xmlns=\"urn:tests:a\">\n"
427 " <elem>val</elem>\n"
428 "</any>\n");
429 free(str);
430 lyd_print_mem(&str, root, LYD_JSON, LYD_PRINT_WITHSIBLINGS);
431 assert_string_equal(str,
432 "{\n"
433 " \"a:any\": {\n"
434 " \"elem\": \"val\"\n"
435 " }\n"
436 "}\n");
437 free(str);
438 lyd_free_siblings(root);
Michal Vasko54bf9e22023-04-27 08:20:30 +0200439
440 /* anyxml */
441 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:anyx", "<a/><b/><c/>", 0, LYD_ANYDATA_XML, 0, &root, NULL);
442 assert_int_equal(ret, LY_SUCCESS);
443 assert_non_null(root);
444
445 lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
446 assert_string_equal(str,
447 "<anyx xmlns=\"urn:tests:a\">\n"
448 " <a/>\n"
449 " <b/>\n"
450 " <c/>\n"
451 "</anyx>\n");
452 free(str);
453 lyd_print_mem(&str, root, LYD_JSON, LYD_PRINT_WITHSIBLINGS);
454 assert_string_equal(str,
455 "{\n"
456 " \"a:anyx\": {\n"
457 " \"a\": [null],\n"
458 " \"b\": [null],\n"
459 " \"c\": [null]\n"
460 " }\n"
461 "}\n");
462 free(str);
463 lyd_free_siblings(root);
464
465 ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:anyx", "{\"a\":[null],\"b\":[null],\"c\":[null]}", 0, LYD_ANYDATA_JSON, 0, &root, NULL);
466 assert_int_equal(ret, LY_SUCCESS);
467 assert_non_null(root);
468
469 lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
470 assert_string_equal(str,
471 "<anyx xmlns=\"urn:tests:a\">\n"
472 " <a/>\n"
473 " <b/>\n"
474 " <c/>\n"
475 "</anyx>\n");
476 free(str);
477 lyd_print_mem(&str, root, LYD_JSON, LYD_PRINT_WITHSIBLINGS);
478 assert_string_equal(str,
479 "{\n"
480 " \"a:anyx\": {\n"
481 " \"a\": [null],\n"
482 " \"b\": [null],\n"
483 " \"c\": [null]\n"
484 " }\n"
485 "}\n");
486 free(str);
487 lyd_free_siblings(root);
Michal Vasko00cbf532020-06-15 13:58:47 +0200488}
489
Radek Krejci95ccd1b2021-03-12 14:57:22 +0100490static void
491test_path_ext(void **state)
492{
493 LY_ERR ret;
494 struct lyd_node *root, *node;
Michal Vasko4de7d072021-07-09 09:13:18 +0200495 struct lys_module *mod;
Radek Krejci95ccd1b2021-03-12 14:57:22 +0100496 const char *mod_str = "module ext {yang-version 1.1; namespace urn:tests:extensions:ext; prefix e;"
497 "import ietf-restconf {revision-date 2017-01-26; prefix rc;}"
498 "rc:yang-data template {container c {leaf x {type string;} leaf y {type string;} leaf z {type string;}}}}";
499
500 assert_int_equal(LY_SUCCESS, ly_ctx_set_searchdir(UTEST_LYCTX, TESTS_DIR_MODULES_YANG));
501 assert_non_null(ly_ctx_load_module(UTEST_LYCTX, "ietf-restconf", "2017-01-26", NULL));
502
503 UTEST_ADD_MODULE(mod_str, LYS_IN_YANG, NULL, &mod);
504
505 /* create x */
506 ret = lyd_new_ext_path(NULL, &mod->compiled->exts[0], "/ext:c/x", "xxx", 0, &root);
507 assert_int_equal(ret, LY_SUCCESS);
508 assert_non_null(root);
509 assert_string_equal(root->schema->name, "c");
510 assert_non_null(node = lyd_child(root));
511 assert_string_equal(node->schema->name, "x");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200512 assert_string_equal("xxx", lyd_get_value(node));
Radek Krejci95ccd1b2021-03-12 14:57:22 +0100513
514 /* append y */
515 ret = lyd_new_ext_path(root, &mod->compiled->exts[0], "/ext:c/y", "yyy", 0, &node);
516 assert_int_equal(ret, LY_SUCCESS);
517 assert_string_equal(node->schema->name, "y");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200518 assert_string_equal("yyy", lyd_get_value(node));
Radek Krejci95ccd1b2021-03-12 14:57:22 +0100519
520 /* append z */
521 ret = lyd_new_path(root, NULL, "ext:z", "zzz", 0, &node);
522 assert_int_equal(ret, LY_SUCCESS);
523 assert_string_equal(node->schema->name, "z");
Radek Krejci6d5ba0c2021-04-26 07:49:59 +0200524 assert_string_equal("zzz", lyd_get_value(node));
Radek Krejci95ccd1b2021-03-12 14:57:22 +0100525
526 lyd_free_tree(root);
527}
528
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100529int
530main(void)
Michal Vasko004d3152020-06-11 19:59:22 +0200531{
532 const struct CMUnitTest tests[] = {
Radek Iša56ca9e42020-09-08 18:42:00 +0200533 UTEST(test_top_level),
534 UTEST(test_opaq),
535 UTEST(test_path),
Radek Krejci95ccd1b2021-03-12 14:57:22 +0100536 UTEST(test_path_ext),
Michal Vasko004d3152020-06-11 19:59:22 +0200537 };
538
539 return cmocka_run_group_tests(tests, NULL, NULL);
540}