blob: b36d8d5e64ab13887de1ed9b32c2965db3dc3133 [file] [log] [blame]
Radek Krejci26a5dfb2019-07-26 14:51:06 +02001/*
2 * @file test_printer_xml.c
3 * @author: Radek Krejci <rkrejci@cesnet.cz>
4 * @brief unit tests for functions from printer_yang.c
5 *
6 * Copyright (c) 2019 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 */
14
15#include <stdarg.h>
16#include <stddef.h>
17#include <setjmp.h>
18#include <cmocka.h>
19
20#include <stdio.h>
21#include <string.h>
22
Michal Vasko6f4cbb62020-02-28 11:15:47 +010023#include "tests/config.h"
24
Radek Krejci26a5dfb2019-07-26 14:51:06 +020025#include "../../src/context.h"
Radek Krejci535ea9f2020-05-29 16:01:05 +020026#include "../../src/printer.h"
Radek Krejci26a5dfb2019-07-26 14:51:06 +020027#include "../../src/printer_data.h"
28
29#define BUFSIZE 1024
30char logbuf[BUFSIZE] = {0};
31int store = -1; /* negative for infinite logging, positive for limited logging */
32
33struct state_s {
34 void *func;
35 struct ly_ctx *ctx;
36};
37
38/* set to 0 to printing error messages to stderr instead of checking them in code */
39#define ENABLE_LOGGER_CHECKING 1
40
41#if ENABLE_LOGGER_CHECKING
42static void
43logger(LY_LOG_LEVEL level, const char *msg, const char *path)
44{
45 (void) level; /* unused */
46 if (store) {
47 if (path && path[0]) {
48 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
49 } else {
50 strncpy(logbuf, msg, BUFSIZE - 1);
51 }
52 if (store > 0) {
53 --store;
54 }
55 }
56}
57#endif
58
59static int
60setup(void **state)
61{
62 struct state_s *s;
63 const char *schema_a = "module defs {namespace urn:tests:defs;prefix d;yang-version 1.1;"
64 "identity crypto-alg; identity interface-type; identity ethernet {base interface-type;} identity fast-ethernet {base ethernet;}}";
65 const char *schema_b = "module types {namespace urn:tests:types;prefix t;yang-version 1.1; import defs {prefix defs;}"
66 "feature f; identity gigabit-ethernet { base defs:ethernet;}"
67 "container cont {leaf leaftarget {type empty;}"
68 "list listtarget {key id; max-elements 5;leaf id {type uint8;} leaf value {type string;}"
69 "action test {input {leaf a {type string;}} output {leaf b {type string;}}}}"
70 "leaf-list leaflisttarget {type uint8; max-elements 5;}}"
71 "list list {key id; leaf id {type string;} leaf value {type string;} leaf-list targets {type string;}}"
72 "list list2 {key \"id value\"; leaf id {type string;} leaf value {type string;}}"
73 "list list_inst {key id; leaf id {type instance-identifier {require-instance true;}} leaf value {type string;}}"
74 "list list_ident {key id; leaf id {type identityref {base defs:interface-type;}} leaf value {type string;}}"
75 "leaf-list leaflisttarget {type string;}"
76 "leaf binary {type binary {length 5 {error-message \"This base64 value must be of length 5.\";}}}"
77 "leaf binary-norestr {type binary;}"
78 "leaf int8 {type int8 {range 10..20;}}"
79 "leaf uint8 {type uint8 {range 150..200;}}"
80 "leaf int16 {type int16 {range -20..-10;}}"
81 "leaf uint16 {type uint16 {range 150..200;}}"
82 "leaf int32 {type int32;}"
83 "leaf uint32 {type uint32;}"
84 "leaf int64 {type int64;}"
85 "leaf uint64 {type uint64;}"
86 "leaf bits {type bits {bit zero; bit one {if-feature f;} bit two;}}"
87 "leaf enums {type enumeration {enum white; enum yellow {if-feature f;}}}"
88 "leaf dec64 {type decimal64 {fraction-digits 1; range 1.5..10;}}"
89 "leaf dec64-norestr {type decimal64 {fraction-digits 18;}}"
90 "leaf str {type string {length 8..10; pattern '[a-z ]*';}}"
91 "leaf str-norestr {type string;}"
92 "leaf bool {type boolean;}"
93 "leaf empty {type empty;}"
94 "leaf ident {type identityref {base defs:interface-type;}}"
95 "leaf inst {type instance-identifier {require-instance true;}}"
96 "leaf inst-noreq {type instance-identifier {require-instance false;}}"
97 "leaf lref {type leafref {path /leaflisttarget; require-instance true;}}"
98 "leaf lref2 {type leafref {path \"../list[id = current()/../str-norestr]/targets\"; require-instance true;}}"
99 "leaf un1 {type union {"
100 "type leafref {path /int8; require-instance true;}"
101 "type union { type identityref {base defs:interface-type;} type instance-identifier {require-instance true;} }"
102 "type string {length 1..20;}}}"
103 "anydata any;"
104 "rpc sum {input {leaf x {type uint8;} leaf y {type uint8;}} output {leaf result {type uint16;}}}}";
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100105 const char *schema_c =
106 "module defaults {"
107 "namespace \"urn:defaults\";"
108 "prefix d;"
109 "leaf a {"
110 "type union {"
111 "type instance-identifier;"
112 "type string;"
113 "}"
114 "default \"/d:b\";"
115 "}"
116 "leaf b {"
117 "type string;"
118 "}"
119 "leaf c {"
120 "type string;"
121 "}"
122 "}";
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200123
124 s = calloc(1, sizeof *s);
125 assert_non_null(s);
126
127#if ENABLE_LOGGER_CHECKING
128 ly_set_log_clb(logger, 1);
129#endif
130
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100131 assert_int_equal(LY_SUCCESS, ly_ctx_new(TESTS_DIR_MODULES_YANG, 0, &s->ctx));
132 assert_non_null(ly_ctx_load_module(s->ctx, "ietf-netconf-with-defaults", "2011-06-01"));
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200133 assert_non_null(lys_parse_mem(s->ctx, schema_a, LYS_IN_YANG));
134 assert_non_null(lys_parse_mem(s->ctx, schema_b, LYS_IN_YANG));
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100135 assert_non_null(lys_parse_mem(s->ctx, schema_c, LYS_IN_YANG));
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200136
137 *state = s;
138
139 return 0;
140}
141
142static int
143teardown(void **state)
144{
145 struct state_s *s = (struct state_s*)(*state);
146
147#if ENABLE_LOGGER_CHECKING
148 if (s->func) {
149 fprintf(stderr, "%s\n", logbuf);
150 }
151#endif
152
153 ly_ctx_destroy(s->ctx, NULL);
154 free(s);
155
156 return 0;
157}
158
159void
160logbuf_clean(void)
161{
162 logbuf[0] = '\0';
163}
164
165#if ENABLE_LOGGER_CHECKING
166# define logbuf_assert(str) assert_string_equal(logbuf, str)
167#else
168# define logbuf_assert(str)
169#endif
170
171static void
172test_leaf(void **state)
173{
174 struct state_s *s = (struct state_s*)(*state);
175 struct lyd_node *tree;
176 const char *data;
177 const char *result;
178 char *printed;
179 ssize_t len;
Radek Krejci241f6b52020-05-21 18:13:49 +0200180 struct ly_out *out;
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200181
182 s->func = test_leaf;
Radek Krejci241f6b52020-05-21 18:13:49 +0200183 assert_non_null(out = ly_out_new_memory(&printed, 0));
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200184
185 data = "<int8 xmlns=\"urn:tests:types\">\n 15 \t\n </int8>";
186 result = "<int8 xmlns=\"urn:tests:types\">15</int8>";
Michal Vasko9b368d32020-02-14 13:53:31 +0100187 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
Radek Krejcia5bba312020-01-09 15:41:20 +0100188 assert_true((len = lyd_print(out, tree, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200189 assert_int_equal(len, strlen(printed));
190 assert_string_equal(printed, result);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200191 lyd_free_all(tree);
192
Radek Krejci241f6b52020-05-21 18:13:49 +0200193 ly_out_free(out, NULL, 1);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200194 s->func = NULL;
195}
196
197static void
198test_anydata(void **state)
199{
200 struct state_s *s = (struct state_s*)(*state);
201 struct lyd_node *tree;
202 const char *data;
203 char *printed;
204 ssize_t len;
Radek Krejci241f6b52020-05-21 18:13:49 +0200205 struct ly_out *out;
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200206
207 s->func = test_anydata;
Radek Krejci241f6b52020-05-21 18:13:49 +0200208 assert_non_null(out = ly_out_new_memory(&printed, 0));
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200209
210 data = "<any xmlns=\"urn:tests:types\"><somexml xmlns:x=\"url:x\" xmlns=\"example.com\"><x:x/></somexml></any>";
Michal Vasko9b368d32020-02-14 13:53:31 +0100211 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
Radek Krejcia5bba312020-01-09 15:41:20 +0100212 assert_true((len = lyd_print(out, tree, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200213 assert_int_equal(len, strlen(printed));
Michal Vasko52927e22020-03-16 17:26:14 +0100214 /* canonized */
215 data = "<any xmlns=\"urn:tests:types\"><somexml xmlns=\"example.com\"><x xmlns=\"url:x\"/></somexml></any>";
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200216 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200217 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200218 lyd_free_all(tree);
219
220 data = "<any xmlns=\"urn:tests:types\"/>";
Michal Vasko9b368d32020-02-14 13:53:31 +0100221 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
Radek Krejcia5bba312020-01-09 15:41:20 +0100222 assert_true((len = lyd_print(out, tree, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200223 assert_int_equal(len, strlen(printed));
224 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200225 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200226 lyd_free_all(tree);
227
Michal Vasko52927e22020-03-16 17:26:14 +0100228 data =
229 "<any xmlns=\"urn:tests:types\">"
230 "<cont>"
231 "<defs:elem1 xmlns:defs=\"urn:tests:defs\">"
232 "<elem2 xmlns:defaults=\"urn:defaults\" defs:attr1=\"defaults:val\" attr2=\"/defaults:node/defs:node2\">"
233 "</elem2>"
234 "</defs:elem1>"
235 "</cont>"
236 "</any>";
237 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
238 /* cont should be normally parsed */
239 assert_string_equal(tree->schema->name, "any");
240 assert_int_equal(((struct lyd_node_any *)tree)->value_type, LYD_ANYDATA_DATATREE);
241 assert_string_equal(((struct lyd_node_any *)tree)->value.tree->schema->name, "cont");
242 /* but its children not */
243 assert_null(((struct lyd_node_inner *)(((struct lyd_node_any *)tree)->value.tree))->child->schema);
Radek Krejcia5bba312020-01-09 15:41:20 +0100244 assert_true((len = lyd_print(out, tree, LYD_XML, 0)) >= 0);
Michal Vasko52927e22020-03-16 17:26:14 +0100245 assert_int_equal(len, strlen(printed));
246 /* canonized */
247 data =
248 "<any xmlns=\"urn:tests:types\">"
249 "<cont>"
250 "<elem1 xmlns=\"urn:tests:defs\">"
251 "<elem2 xmlns=\"urn:tests:types\" xmlns:defs=\"urn:tests:defs\" xmlns:defaults=\"urn:defaults\""
252 " defs:attr1=\"defaults:val\" attr2=\"/defaults:node/defs:node2\"/>"
253 "</elem1>"
254 "</cont>"
255 "</any>";
256 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200257 ly_out_reset(out);
Radek Krejcia5bba312020-01-09 15:41:20 +0100258
Michal Vasko52927e22020-03-16 17:26:14 +0100259 lyd_free_all(tree);
260
Radek Krejci241f6b52020-05-21 18:13:49 +0200261 ly_out_free(out, NULL, 1);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200262 s->func = NULL;
263}
264
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100265static void
266test_defaults(void **state)
267{
268 struct state_s *s = (struct state_s*)(*state);
269 struct lyd_node *tree;
270 const char *data;
271 char *printed;
272 ssize_t len;
Radek Krejci241f6b52020-05-21 18:13:49 +0200273 struct ly_out *out;
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100274
275 s->func = test_defaults;
276
Radek Krejci241f6b52020-05-21 18:13:49 +0200277 assert_non_null(out = ly_out_new_memory(&printed, 0));
Radek Krejcia5bba312020-01-09 15:41:20 +0100278
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100279 /* standard default value */
280 data = "<c xmlns=\"urn:defaults\">aa</c>";
281 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
282
Radek Krejcia5bba312020-01-09 15:41:20 +0100283 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_TRIM)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100284 assert_int_equal(len, strlen(printed));
285 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200286 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100287
Radek Krejcia5bba312020-01-09 15:41:20 +0100288 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_ALL)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100289 assert_int_equal(len, strlen(printed));
290 data = "<c xmlns=\"urn:defaults\">aa</c><a xmlns=\"urn:defaults\" xmlns:d=\"urn:defaults\">/d:b</a>";
291 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200292 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100293
Radek Krejcia5bba312020-01-09 15:41:20 +0100294 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_ALL_TAG)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100295 assert_int_equal(len, strlen(printed));
296 data = "<c xmlns=\"urn:defaults\">aa</c>"
297 "<a xmlns=\"urn:defaults\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\""
298 " ncwd:default=\"true\" xmlns:d=\"urn:defaults\">/d:b</a>";
299 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200300 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100301
Radek Krejcia5bba312020-01-09 15:41:20 +0100302 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_IMPL_TAG)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100303 assert_int_equal(len, strlen(printed));
304 data = "<c xmlns=\"urn:defaults\">aa</c>"
305 "<a xmlns=\"urn:defaults\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\""
306 " ncwd:default=\"true\" xmlns:d=\"urn:defaults\">/d:b</a>";
307 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200308 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100309
310 lyd_free_all(tree);
311
312 /* string value equal to the default but default is an unresolved instance-identifier, so they are not considered equal */
313 data = "<c xmlns=\"urn:defaults\">aa</c><a xmlns=\"urn:defaults\">/d:b</a>";
314 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
315
Radek Krejcia5bba312020-01-09 15:41:20 +0100316 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_TRIM)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100317 assert_int_equal(len, strlen(printed));
318 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200319 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100320
Radek Krejcia5bba312020-01-09 15:41:20 +0100321 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_ALL)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100322 assert_int_equal(len, strlen(printed));
323 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200324 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100325
Radek Krejcia5bba312020-01-09 15:41:20 +0100326 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_ALL_TAG)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100327 assert_int_equal(len, strlen(printed));
328 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200329 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100330
Radek Krejcia5bba312020-01-09 15:41:20 +0100331 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_IMPL_TAG)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100332 assert_int_equal(len, strlen(printed));
333 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200334 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100335
336 lyd_free_all(tree);
337
338 /* instance-identifier value equal to the default, should be considered equal */
339 data = "<c xmlns=\"urn:defaults\">aa</c><a xmlns=\"urn:defaults\" xmlns:d=\"urn:defaults\">/d:b</a><b xmlns=\"urn:defaults\">val</b>";
340 assert_non_null(tree = lyd_parse_mem(s->ctx, data, LYD_XML, LYD_VALOPT_DATA_ONLY));
341
Radek Krejcia5bba312020-01-09 15:41:20 +0100342 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_TRIM)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100343 assert_int_equal(len, strlen(printed));
344 data = "<c xmlns=\"urn:defaults\">aa</c><b xmlns=\"urn:defaults\">val</b>";
345 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200346 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100347
Radek Krejcia5bba312020-01-09 15:41:20 +0100348 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_ALL)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100349 assert_int_equal(len, strlen(printed));
350 data = "<c xmlns=\"urn:defaults\">aa</c><a xmlns=\"urn:defaults\" xmlns:d=\"urn:defaults\">/d:b</a><b xmlns=\"urn:defaults\">val</b>";
351 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200352 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100353
Radek Krejcia5bba312020-01-09 15:41:20 +0100354 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_ALL_TAG)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100355 assert_int_equal(len, strlen(printed));
356 data = "<c xmlns=\"urn:defaults\">aa</c>"
357 "<a xmlns=\"urn:defaults\" xmlns:ncwd=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\""
358 " ncwd:default=\"true\" xmlns:d=\"urn:defaults\">/d:b</a>"
359 "<b xmlns=\"urn:defaults\">val</b>";
360 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200361 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100362
Radek Krejcia5bba312020-01-09 15:41:20 +0100363 assert_true((len = lyd_print(out, tree, LYD_XML, LYDP_WITHSIBLINGS | LYDP_WD_IMPL_TAG)) >= 0);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100364 assert_int_equal(len, strlen(printed));
365 data = "<c xmlns=\"urn:defaults\">aa</c><a xmlns=\"urn:defaults\" xmlns:d=\"urn:defaults\">/d:b</a><b xmlns=\"urn:defaults\">val</b>";
366 assert_string_equal(printed, data);
Radek Krejci241f6b52020-05-21 18:13:49 +0200367 ly_out_reset(out);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100368
369 lyd_free_all(tree);
Radek Krejci241f6b52020-05-21 18:13:49 +0200370 ly_out_free(out, NULL, 1);
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100371
372 s->func = NULL;
373}
374
Michal Vaskoa3881362020-01-21 15:57:35 +0100375#if 0
376
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200377static void
378test_rpc(void **state)
379{
380 struct state_s *s = (struct state_s*)(*state);
381 struct lyd_node *tree1;
382 struct lyd_node *tree2;
383 const struct lyd_node **trees;
384 const char *request;
385 const char *reply, *result;
386 char *printed;
387 ssize_t len;
Radek Krejci241f6b52020-05-21 18:13:49 +0200388 struct ly_out *out;
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200389
390 s->func = test_rpc;
Radek Krejci241f6b52020-05-21 18:13:49 +0200391 assert_non_null(out = ly_out_new_memory(&printed, 0));
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200392
393 request = "<sum xmlns=\"urn:tests:types\"><x>10</x><y>20</y></sum>";
394 reply = "<result xmlns=\"urn:tests:types\">30</result>";
395 result = "<sum xmlns=\"urn:tests:types\"><result>30</result></sum>";
396 assert_non_null(tree1 = lyd_parse_mem(s->ctx, request, LYD_XML, LYD_OPT_RPC, NULL));
Radek Krejcia5bba312020-01-09 15:41:20 +0100397 assert_true((len = lyd_print(out, tree1, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200398 assert_int_equal(len, strlen(printed));
399 assert_string_equal(printed, request);
Radek Krejci241f6b52020-05-21 18:13:49 +0200400 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200401 assert_non_null(trees = lyd_trees_new(1, tree1));
402 assert_non_null(tree2 = lyd_parse_mem(s->ctx, reply, LYD_XML, LYD_OPT_RPCREPLY, trees));
Radek Krejcia5bba312020-01-09 15:41:20 +0100403 assert_true((len = lyd_print(out, tree2, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200404 assert_int_equal(len, strlen(printed));
405 assert_string_equal(printed, result);
Radek Krejci241f6b52020-05-21 18:13:49 +0200406 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200407 lyd_trees_free(trees, 0);
408 lyd_free_all(tree1);
409 lyd_free_all(tree2);
410
411 /* no arguments */
412 request = "<sum xmlns=\"urn:tests:types\"/>";
413 reply = "";
414 result = "<sum xmlns=\"urn:tests:types\"/>";
415 assert_non_null(tree1 = lyd_parse_mem(s->ctx, request, LYD_XML, LYD_OPT_RPC, NULL));
Radek Krejcia5bba312020-01-09 15:41:20 +0100416 assert_true((len = lyd_print(out, tree1, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200417 assert_int_equal(len, strlen(printed));
418 assert_string_equal(printed, request);
Radek Krejci241f6b52020-05-21 18:13:49 +0200419 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200420 assert_non_null(trees = lyd_trees_new(1, tree1));
421 assert_non_null(tree2 = lyd_parse_mem(s->ctx, reply, LYD_XML, LYD_OPT_RPCREPLY, trees));
Radek Krejcia5bba312020-01-09 15:41:20 +0100422 assert_true((len = lyd_print(out, tree2, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200423 assert_int_equal(len, strlen(printed));
424 assert_string_equal(printed, result);
Radek Krejci241f6b52020-05-21 18:13:49 +0200425 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200426 lyd_trees_free(trees, 0);
427 lyd_free_all(tree1);
428 lyd_free_all(tree2);
429
430 /* action
431 * "container cont {leaf leaftarget {type empty;}"
432 "list listtarget {key id; max-elements 5;leaf id {type uint8;} leaf value {type string;}"
433 "action test {input {leaf a {type string;}} output {leaf b {type string;}}}}"
434 "leaf-list leaflisttarget {type uint8; max-elements 5;}}"
435 */
436 request = "<cont xmlns=\"urn:tests:types\"><listtarget><id>10</id><test><a>test</a></test></listtarget></cont>";
437 reply = "<b xmlns=\"urn:tests:types\">test-reply</b>";
438 result = "<cont xmlns=\"urn:tests:types\"><listtarget><id>10</id><test><b>test-reply</b></test></listtarget></cont>";;
439 assert_non_null(tree1 = lyd_parse_mem(s->ctx, request, LYD_XML, LYD_OPT_RPC, NULL));
Radek Krejcia5bba312020-01-09 15:41:20 +0100440 assert_true((len = lyd_print(out, tree1, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200441 assert_int_equal(len, strlen(printed));
442 assert_string_equal(printed, request);
Radek Krejci241f6b52020-05-21 18:13:49 +0200443 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200444 assert_non_null(trees = lyd_trees_new(1, tree1));
445 assert_non_null(tree2 = lyd_parse_mem(s->ctx, reply, LYD_XML, LYD_OPT_RPCREPLY, trees));
Radek Krejcia5bba312020-01-09 15:41:20 +0100446 assert_true((len = lyd_print(out, tree2, LYD_XML, 0)) >= 0);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200447 assert_int_equal(len, strlen(printed));
448 assert_string_equal(printed, result);
Radek Krejci241f6b52020-05-21 18:13:49 +0200449 ly_out_reset(out);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200450 lyd_trees_free(trees, 0);
451 lyd_free_all(tree1);
452 lyd_free_all(tree2);
453
Radek Krejci241f6b52020-05-21 18:13:49 +0200454 ly_out_free(out, NULL, 1);
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200455 s->func = NULL;
456}
457
Michal Vaskoa3881362020-01-21 15:57:35 +0100458#endif
459
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200460int main(void)
461{
462 const struct CMUnitTest tests[] = {
463 cmocka_unit_test_setup_teardown(test_leaf, setup, teardown),
464 cmocka_unit_test_setup_teardown(test_anydata, setup, teardown),
Michal Vasko6f4cbb62020-02-28 11:15:47 +0100465 cmocka_unit_test_setup_teardown(test_defaults, setup, teardown),
Radek Krejci26a5dfb2019-07-26 14:51:06 +0200466 };
467
468 return cmocka_run_group_tests(tests, NULL, NULL);
469}