blob: 3e4d8a166fe1a0b5e73aeb83e9054b0dd9eb0b67 [file] [log] [blame]
David Sedlákb1ce3f82019-06-05 14:37:26 +02001/**
2 * @file test_parser_yin.c
3 * @author David Sedlák <xsedla1d@stud.fit.vutbr.cz>
4 * @brief unit tests for functions from parser_yin.c
5 *
6 * Copyright (c) 2015 - 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
David Sedlák3b4db242018-10-19 16:11:01 +020015#include <stdarg.h>
16#include <stddef.h>
17#include <setjmp.h>
18#include <cmocka.h>
19
20#include <stdio.h>
21#include <string.h>
David Sedlák79e50cb2019-06-05 16:33:09 +020022#include <stdbool.h>
David Sedlák3b4db242018-10-19 16:11:01 +020023
David Sedlákecf5eb82019-06-03 14:12:44 +020024#include "../../src/common.h"
25#include "../../src/tree_schema.h"
26#include "../../src/tree_schema_internal.h"
27#include "../../src/parser_yin.h"
David Sedlák8f5bce02019-06-03 16:41:08 +020028#include "../../src/xml.h"
David Sedlák3b4db242018-10-19 16:11:01 +020029
David Sedlák555c7202019-07-04 12:14:12 +020030/* prototypes of static functions */
31void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
David Sedlák986cb412019-07-04 13:10:11 +020032void lysp_ext_free(struct ly_ctx *ctx, struct lysp_ext *ext);
David Sedlák32eee7b2019-07-09 12:38:44 +020033void lysp_when_free(struct ly_ctx *ctx, struct lysp_when *when);
David Sedlák32488102019-07-15 17:44:10 +020034void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
David Sedlák8a83bbb2019-07-18 14:46:00 +020035void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
David Sedlák04e17b22019-07-19 15:29:48 +020036void lysp_tpdf_free(struct ly_ctx *ctx, struct lysp_tpdf *tpdf);
David Sedlákd2d676a2019-07-22 11:28:19 +020037void lysp_refine_free(struct ly_ctx *ctx, struct lysp_refine *ref);
David Sedlákaa854b02019-07-22 14:17:10 +020038void lysp_revision_free(struct ly_ctx *ctx, struct lysp_revision *rev);
David Sedlák0c2bab92019-07-22 15:33:19 +020039void lysp_include_free(struct ly_ctx *ctx, struct lysp_include *include);
David Sedlák5e13dea2019-07-22 16:06:45 +020040void lysp_feature_free(struct ly_ctx *ctx, struct lysp_feature *feat);
David Sedlák28794f22019-07-22 16:45:00 +020041void lysp_ident_free(struct ly_ctx *ctx, struct lysp_ident *ident);
David Sedlák031b9e72019-07-23 15:19:37 +020042void lysp_notif_free(struct ly_ctx *ctx, struct lysp_notif *notif);
David Sedláke3ce9ef2019-07-23 16:34:30 +020043void lysp_grp_free(struct ly_ctx *ctx, struct lysp_grp *grp);
David Sedlák05404f62019-07-24 14:11:53 +020044void lysp_action_inout_free(struct ly_ctx *ctx, struct lysp_action_inout *inout);
David Sedlák85d0eca2019-07-24 15:15:21 +020045void lysp_action_free(struct ly_ctx *ctx, struct lysp_action *action);
David Sedlák992fb7c2019-07-24 16:51:01 +020046void lysp_augment_free(struct ly_ctx *ctx, struct lysp_augment *augment);
David Sedlák4ffcec82019-07-25 15:10:21 +020047void lysp_deviate_free(struct ly_ctx *ctx, struct lysp_deviate *d);
David Sedlák8b754462019-07-25 16:22:13 +020048void lysp_deviation_free(struct ly_ctx *ctx, struct lysp_deviation *dev);
David Sedlák298ff6d2019-07-26 14:29:03 +020049void lysp_submodule_free(struct ly_ctx *ctx, struct lysp_submodule *submod);
50void lysp_import_free(struct ly_ctx *ctx, struct lysp_import *import);
David Sedlák555c7202019-07-04 12:14:12 +020051
David Sedláke6cd89e2019-08-07 12:46:02 +020052/* wrapping element used for mocking has nothing to do with real module structure */
53#define ELEMENT_WRAPPER_START "<status xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
54#define ELEMENT_WRAPPER_END "</status>"
55
David Sedlák68a1af12019-03-08 13:46:54 +010056struct state {
David Sedlák3b4db242018-10-19 16:11:01 +020057 struct ly_ctx *ctx;
David Sedlák3017da42019-02-15 09:48:04 +010058 struct lys_module *mod;
David Sedlák619db942019-07-03 14:47:30 +020059 struct lysp_module *lysp_mod;
David Sedlákda8ffa32019-07-08 14:17:10 +020060 struct yin_parser_ctx *yin_ctx;
David Sedlák79e50cb2019-06-05 16:33:09 +020061 bool finished_correctly;
David Sedlák68a1af12019-03-08 13:46:54 +010062};
David Sedlák872c7b42018-10-26 13:15:20 +020063
David Sedlák79e50cb2019-06-05 16:33:09 +020064#define BUFSIZE 1024
65char logbuf[BUFSIZE] = {0};
66int store = -1; /* negative for infinite logging, positive for limited logging */
67
68/* set to 0 to printing error messages to stderr instead of checking them in code */
David Sedlák298ff6d2019-07-26 14:29:03 +020069#define ENABLE_LOGGER_CHECKING 1
David Sedlák79e50cb2019-06-05 16:33:09 +020070
71#if ENABLE_LOGGER_CHECKING
72static void
73logger(LY_LOG_LEVEL level, const char *msg, const char *path)
74{
75 (void) level; /* unused */
76 if (store) {
77 if (path && path[0]) {
78 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
79 } else {
80 strncpy(logbuf, msg, BUFSIZE - 1);
81 }
82 if (store > 0) {
83 --store;
84 }
85 }
86}
87#endif
88
89#if ENABLE_LOGGER_CHECKING
90# define logbuf_assert(str) assert_string_equal(logbuf, str)
91#else
92# define logbuf_assert(str)
93#endif
94
95#define TEST_DUP_GENERIC(PREFIX, MEMBER, VALUE1, VALUE2, FUNC, RESULT, LINE, CLEANUP) \
96 str = PREFIX MEMBER" "VALUE1";"MEMBER" "VALUE2";} ..."; \
97 assert_int_equal(LY_EVALID, FUNC(&ctx, &str, RESULT)); \
98 logbuf_assert("Duplicate keyword \""MEMBER"\". Line number "LINE"."); \
99 CLEANUP
100
David Sedlák8e7bda82019-07-16 17:57:50 +0200101int
102setup_ly_ctx(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100103{
104 struct state *st = NULL;
David Sedlák3b4db242018-10-19 16:11:01 +0200105
David Sedlák68a1af12019-03-08 13:46:54 +0100106 /* allocate state variable */
107 (*state) = st = calloc(1, sizeof(*st));
108 if (!st) {
109 fprintf(stderr, "Memmory allocation failed");
110 return EXIT_FAILURE;
111 }
David Sedlák872c7b42018-10-26 13:15:20 +0200112
David Sedlák68a1af12019-03-08 13:46:54 +0100113 /* create new libyang context */
114 ly_ctx_new(NULL, 0, &st->ctx);
David Sedlák872c7b42018-10-26 13:15:20 +0200115
David Sedlák8e7bda82019-07-16 17:57:50 +0200116 return EXIT_SUCCESS;
117}
118
119int
120destroy_ly_ctx(void **state)
121{
122 struct state *st = *state;
123 ly_ctx_destroy(st->ctx, NULL);
124 free(st);
125
126 return EXIT_SUCCESS;
127}
128
129static int
130setup_f(void **state)
131{
132 struct state *st = *state;
133
134#if ENABLE_LOGGER_CHECKING
135 /* setup logger */
136 ly_set_log_clb(logger, 1);
137#endif
138
David Sedlák68a1af12019-03-08 13:46:54 +0100139 /* allocate new module */
140 st->mod = calloc(1, sizeof(*st->mod));
141 st->mod->ctx = st->ctx;
142
David Sedlák619db942019-07-03 14:47:30 +0200143 /* allocate new parsed module */
144 st->lysp_mod = calloc(1, sizeof(*st->lysp_mod));
145 st->lysp_mod->mod = calloc(1, sizeof(*st->lysp_mod->mod));
146 st->lysp_mod->mod->ctx = st->ctx;
147
148 /* allocate parser context */
David Sedlákda8ffa32019-07-08 14:17:10 +0200149 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
150 st->yin_ctx->xml_ctx.ctx = st->ctx;
151 st->yin_ctx->xml_ctx.line = 1;
David Sedlák8f5bce02019-06-03 16:41:08 +0200152
David Sedlák68a1af12019-03-08 13:46:54 +0100153 return EXIT_SUCCESS;
David Sedlák3b4db242018-10-19 16:11:01 +0200154}
155
156static int
David Sedlák68a1af12019-03-08 13:46:54 +0100157teardown_f(void **state)
158{
159 struct state *st = *(struct state **)state;
David Sedlák619db942019-07-03 14:47:30 +0200160 struct lys_module *temp;
David Sedlák68a1af12019-03-08 13:46:54 +0100161
David Sedlák79e50cb2019-06-05 16:33:09 +0200162#if ENABLE_LOGGER_CHECKING
163 /* teardown logger */
164 if (!st->finished_correctly && logbuf[0] != '\0') {
165 fprintf(stderr, "%s\n", logbuf);
166 }
167#endif
168
David Sedlák619db942019-07-03 14:47:30 +0200169 temp = st->lysp_mod->mod;
170
David Sedlákda8ffa32019-07-08 14:17:10 +0200171 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100172 lys_module_free(st->mod, NULL);
David Sedlák619db942019-07-03 14:47:30 +0200173 lysp_module_free(st->lysp_mod);
174 lys_module_free(temp, NULL);
David Sedlákda8ffa32019-07-08 14:17:10 +0200175 free(st->yin_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100176
177 return EXIT_SUCCESS;
178}
179
David Sedlák392af4f2019-06-04 16:02:42 +0200180static struct state*
181reset_state(void **state)
182{
David Sedlák79e50cb2019-06-05 16:33:09 +0200183 ((struct state *)*state)->finished_correctly = true;
David Sedlák555c7202019-07-04 12:14:12 +0200184 logbuf[0] = '\0';
David Sedlák392af4f2019-06-04 16:02:42 +0200185 teardown_f(state);
186 setup_f(state);
187
188 return *state;
189}
190
David Sedlák79e50cb2019-06-05 16:33:09 +0200191void
192logbuf_clean(void)
193{
194 logbuf[0] = '\0';
195}
196
David Sedlák8985a142019-07-31 16:43:06 +0200197static int
198setup_logger(void **state)
199{
200 (void)state; /* unused */
201#if ENABLE_LOGGER_CHECKING
202 /* setup logger */
203 ly_set_log_clb(logger, 1);
204#endif
205
206 logbuf[0] = '\0';
207
208 return EXIT_SUCCESS;
209}
210
211static int
212teardown_logger(void **state)
213{
214 struct state *st = *state;
215
216#if ENABLE_LOGGER_CHECKING
217 /* teardown logger */
218 if (!st->finished_correctly && logbuf[0] != '\0') {
219 fprintf(stderr, "%s\n", logbuf);
220 }
221#endif
222
223 return EXIT_SUCCESS;
224}
225
226static int
227setup_element_test(void **state)
228{
229 setup_logger(state);
230 struct state *st = *state;
231
232 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
233
234 /* allocate parser context */
235 st->yin_ctx->xml_ctx.ctx = st->ctx;
236 st->yin_ctx->xml_ctx.line = 1;
237
238 return EXIT_SUCCESS;
239}
240
241static int
242teardown_element_test(void **state)
243{
244 struct state *st = *(struct state **)state;
245
246 lyxml_context_clear(&st->yin_ctx->xml_ctx);
247 free(st->yin_ctx);
248
249 teardown_logger(state);
250
251 return EXIT_SUCCESS;
252}
253
David Sedlák68a1af12019-03-08 13:46:54 +0100254static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200255test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200256{
David Sedlák8f7a1172019-06-20 14:42:18 +0200257 struct state *st = *state;
David Sedlák3b4db242018-10-19 16:11:01 +0200258
David Sedlák8f7a1172019-06-20 14:42:18 +0200259 const char *prefix, *name;
260 struct yin_arg_record *args = NULL;
261 size_t prefix_len, name_len;
262 /* create mock yin namespace in xml context */
263 const char *data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200264 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
265 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák8f7a1172019-06-20 14:42:18 +0200266 LY_ARRAY_FREE(args);
267
David Sedlákc1771b12019-07-10 15:55:46 +0200268 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydatax", strlen("anydatax"), prefix, prefix_len, YANG_NONE), YANG_NONE);
269 assert_int_equal(yin_match_keyword(st->yin_ctx, "asdasd", strlen("asdasd"), prefix, prefix_len, YANG_NONE), YANG_NONE);
270 assert_int_equal(yin_match_keyword(st->yin_ctx, "", 0, prefix, prefix_len, YANG_NONE), YANG_NONE);
271 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydata", strlen("anydata"), prefix, prefix_len, YANG_NONE), YANG_ANYDATA);
272 assert_int_equal(yin_match_keyword(st->yin_ctx, "anyxml", strlen("anyxml"), prefix, prefix_len, YANG_NONE), YANG_ANYXML);
273 assert_int_equal(yin_match_keyword(st->yin_ctx, "argument", strlen("argument"), prefix, prefix_len, YANG_NONE), YANG_ARGUMENT);
274 assert_int_equal(yin_match_keyword(st->yin_ctx, "augment", strlen("augment"), prefix, prefix_len, YANG_NONE), YANG_AUGMENT);
275 assert_int_equal(yin_match_keyword(st->yin_ctx, "base", strlen("base"), prefix, prefix_len, YANG_NONE), YANG_BASE);
276 assert_int_equal(yin_match_keyword(st->yin_ctx, "belongs-to", strlen("belongs-to"), prefix, prefix_len, YANG_NONE), YANG_BELONGS_TO);
277 assert_int_equal(yin_match_keyword(st->yin_ctx, "bit", strlen("bit"), prefix, prefix_len, YANG_NONE), YANG_BIT);
278 assert_int_equal(yin_match_keyword(st->yin_ctx, "case", strlen("case"), prefix, prefix_len, YANG_NONE), YANG_CASE);
279 assert_int_equal(yin_match_keyword(st->yin_ctx, "choice", strlen("choice"), prefix, prefix_len, YANG_NONE), YANG_CHOICE);
280 assert_int_equal(yin_match_keyword(st->yin_ctx, "config", strlen("config"), prefix, prefix_len, YANG_NONE), YANG_CONFIG);
281 assert_int_equal(yin_match_keyword(st->yin_ctx, "contact", strlen("contact"), prefix, prefix_len, YANG_NONE), YANG_CONTACT);
282 assert_int_equal(yin_match_keyword(st->yin_ctx, "container", strlen("container"), prefix, prefix_len, YANG_NONE), YANG_CONTAINER);
283 assert_int_equal(yin_match_keyword(st->yin_ctx, "default", strlen("default"), prefix, prefix_len, YANG_NONE), YANG_DEFAULT);
284 assert_int_equal(yin_match_keyword(st->yin_ctx, "description", strlen("description"), prefix, prefix_len, YANG_NONE), YANG_DESCRIPTION);
285 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviate", strlen("deviate"), prefix, prefix_len, YANG_NONE), YANG_DEVIATE);
286 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviation", strlen("deviation"), prefix, prefix_len, YANG_NONE), YANG_DEVIATION);
287 assert_int_equal(yin_match_keyword(st->yin_ctx, "enum", strlen("enum"), prefix, prefix_len, YANG_NONE), YANG_ENUM);
288 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-app-tag", strlen("error-app-tag"), prefix, prefix_len, YANG_NONE), YANG_ERROR_APP_TAG);
289 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-message", strlen("error-message"), prefix, prefix_len, YANG_NONE), YANG_ERROR_MESSAGE);
290 assert_int_equal(yin_match_keyword(st->yin_ctx, "extension", strlen("extension"), prefix, prefix_len, YANG_NONE), YANG_EXTENSION);
291 assert_int_equal(yin_match_keyword(st->yin_ctx, "feature", strlen("feature"), prefix, prefix_len, YANG_NONE), YANG_FEATURE);
292 assert_int_equal(yin_match_keyword(st->yin_ctx, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, YANG_NONE), YANG_FRACTION_DIGITS);
293 assert_int_equal(yin_match_keyword(st->yin_ctx, "grouping", strlen("grouping"), prefix, prefix_len, YANG_NONE), YANG_GROUPING);
294 assert_int_equal(yin_match_keyword(st->yin_ctx, "identity", strlen("identity"), prefix, prefix_len, YANG_NONE), YANG_IDENTITY);
295 assert_int_equal(yin_match_keyword(st->yin_ctx, "if-feature", strlen("if-feature"), prefix, prefix_len, YANG_NONE), YANG_IF_FEATURE);
296 assert_int_equal(yin_match_keyword(st->yin_ctx, "import", strlen("import"), prefix, prefix_len, YANG_NONE), YANG_IMPORT);
297 assert_int_equal(yin_match_keyword(st->yin_ctx, "include", strlen("include"), prefix, prefix_len, YANG_NONE), YANG_INCLUDE);
298 assert_int_equal(yin_match_keyword(st->yin_ctx, "input", strlen("input"), prefix, prefix_len, YANG_NONE), YANG_INPUT);
299 assert_int_equal(yin_match_keyword(st->yin_ctx, "key", strlen("key"), prefix, prefix_len, YANG_NONE), YANG_KEY);
300 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf", strlen("leaf"), prefix, prefix_len, YANG_NONE), YANG_LEAF);
301 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf-list", strlen("leaf-list"), prefix, prefix_len, YANG_NONE), YANG_LEAF_LIST);
302 assert_int_equal(yin_match_keyword(st->yin_ctx, "length", strlen("length"), prefix, prefix_len, YANG_NONE), YANG_LENGTH);
303 assert_int_equal(yin_match_keyword(st->yin_ctx, "list", strlen("list"), prefix, prefix_len, YANG_NONE), YANG_LIST);
304 assert_int_equal(yin_match_keyword(st->yin_ctx, "mandatory", strlen("mandatory"), prefix, prefix_len, YANG_NONE), YANG_MANDATORY);
305 assert_int_equal(yin_match_keyword(st->yin_ctx, "max-elements", strlen("max-elements"), prefix, prefix_len, YANG_NONE), YANG_MAX_ELEMENTS);
306 assert_int_equal(yin_match_keyword(st->yin_ctx, "min-elements", strlen("min-elements"), prefix, prefix_len, YANG_NONE), YANG_MIN_ELEMENTS);
307 assert_int_equal(yin_match_keyword(st->yin_ctx, "modifier", strlen("modifier"), prefix, prefix_len, YANG_NONE), YANG_MODIFIER);
308 assert_int_equal(yin_match_keyword(st->yin_ctx, "module", strlen("module"), prefix, prefix_len, YANG_NONE), YANG_MODULE);
309 assert_int_equal(yin_match_keyword(st->yin_ctx, "must", strlen("must"), prefix, prefix_len, YANG_NONE), YANG_MUST);
310 assert_int_equal(yin_match_keyword(st->yin_ctx, "namespace", strlen("namespace"), prefix, prefix_len, YANG_NONE), YANG_NAMESPACE);
311 assert_int_equal(yin_match_keyword(st->yin_ctx, "notification", strlen("notification"), prefix, prefix_len, YANG_NONE), YANG_NOTIFICATION);
312 assert_int_equal(yin_match_keyword(st->yin_ctx, "ordered-by", strlen("ordered-by"), prefix, prefix_len, YANG_NONE), YANG_ORDERED_BY);
313 assert_int_equal(yin_match_keyword(st->yin_ctx, "organization", strlen("organization"), prefix, prefix_len, YANG_NONE), YANG_ORGANIZATION);
314 assert_int_equal(yin_match_keyword(st->yin_ctx, "output", strlen("output"), prefix, prefix_len, YANG_NONE), YANG_OUTPUT);
315 assert_int_equal(yin_match_keyword(st->yin_ctx, "path", strlen("path"), prefix, prefix_len, YANG_NONE), YANG_PATH);
316 assert_int_equal(yin_match_keyword(st->yin_ctx, "pattern", strlen("pattern"), prefix, prefix_len, YANG_NONE), YANG_PATTERN);
317 assert_int_equal(yin_match_keyword(st->yin_ctx, "position", strlen("position"), prefix, prefix_len, YANG_NONE), YANG_POSITION);
318 assert_int_equal(yin_match_keyword(st->yin_ctx, "prefix", strlen("prefix"), prefix, prefix_len, YANG_NONE), YANG_PREFIX);
319 assert_int_equal(yin_match_keyword(st->yin_ctx, "presence", strlen("presence"), prefix, prefix_len, YANG_NONE), YANG_PRESENCE);
320 assert_int_equal(yin_match_keyword(st->yin_ctx, "range", strlen("range"), prefix, prefix_len, YANG_NONE), YANG_RANGE);
321 assert_int_equal(yin_match_keyword(st->yin_ctx, "reference", strlen("reference"), prefix, prefix_len, YANG_NONE), YANG_REFERENCE);
322 assert_int_equal(yin_match_keyword(st->yin_ctx, "refine", strlen("refine"), prefix, prefix_len, YANG_NONE), YANG_REFINE);
323 assert_int_equal(yin_match_keyword(st->yin_ctx, "require-instance", strlen("require-instance"), prefix, prefix_len, YANG_NONE), YANG_REQUIRE_INSTANCE);
324 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision", strlen("revision"), prefix, prefix_len, YANG_NONE), YANG_REVISION);
325 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision-date", strlen("revision-date"), prefix, prefix_len, YANG_NONE), YANG_REVISION_DATE);
326 assert_int_equal(yin_match_keyword(st->yin_ctx, "rpc", strlen("rpc"), prefix, prefix_len, YANG_NONE), YANG_RPC);
327 assert_int_equal(yin_match_keyword(st->yin_ctx, "status", strlen("status"), prefix, prefix_len, YANG_NONE), YANG_STATUS);
328 assert_int_equal(yin_match_keyword(st->yin_ctx, "submodule", strlen("submodule"), prefix, prefix_len, YANG_NONE), YANG_SUBMODULE);
329 assert_int_equal(yin_match_keyword(st->yin_ctx, "type", strlen("type"), prefix, prefix_len, YANG_NONE), YANG_TYPE);
330 assert_int_equal(yin_match_keyword(st->yin_ctx, "typedef", strlen("typedef"), prefix, prefix_len, YANG_NONE), YANG_TYPEDEF);
331 assert_int_equal(yin_match_keyword(st->yin_ctx, "unique", strlen("unique"), prefix, prefix_len, YANG_NONE), YANG_UNIQUE);
332 assert_int_equal(yin_match_keyword(st->yin_ctx, "units", strlen("units"), prefix, prefix_len, YANG_NONE), YANG_UNITS);
333 assert_int_equal(yin_match_keyword(st->yin_ctx, "uses", strlen("uses"), prefix, prefix_len, YANG_NONE), YANG_USES);
334 assert_int_equal(yin_match_keyword(st->yin_ctx, "value", strlen("value"), prefix, prefix_len, YANG_NONE), YANG_VALUE);
335 assert_int_equal(yin_match_keyword(st->yin_ctx, "when", strlen("when"), prefix, prefix_len, YANG_NONE), YANG_WHEN);
336 assert_int_equal(yin_match_keyword(st->yin_ctx, "yang-version", strlen("yang-version"), prefix, prefix_len, YANG_NONE), YANG_YANG_VERSION);
337 assert_int_equal(yin_match_keyword(st->yin_ctx, "yin-element", strlen("yin-element"), prefix, prefix_len, YANG_NONE), YANG_YIN_ELEMENT);
David Sedlák8f7a1172019-06-20 14:42:18 +0200338
339 st->finished_correctly = true;
David Sedlák872c7b42018-10-26 13:15:20 +0200340}
David Sedlák3b4db242018-10-19 16:11:01 +0200341
David Sedlák872c7b42018-10-26 13:15:20 +0200342static void
David Sedlák060b00e2019-06-19 11:12:06 +0200343test_yin_match_argument_name(void **state)
David Sedlák872c7b42018-10-26 13:15:20 +0200344{
David Sedlák68a1af12019-03-08 13:46:54 +0100345 (void)state; /* unused */
David Sedlák872c7b42018-10-26 13:15:20 +0200346
David Sedlák060b00e2019-06-19 11:12:06 +0200347 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
348 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
349 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
350 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
351 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
352 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
353 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
354 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
355 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
356 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
357 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
358 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200359}
360
David Sedlák68a1af12019-03-08 13:46:54 +0100361static void
David Sedlákb1a78352019-06-28 16:16:29 +0200362test_yin_parse_element_generic(void **state)
363{
364 const char *prefix, *name;
365 struct state *st = *state;
366 struct lysp_ext_instance exts;
367 size_t prefix_len, name_len;
368 LY_ERR ret;
369
370 memset(&exts, 0, sizeof(exts));
371
372 const char *data = "<elem attr=\"value\">text_value</elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200373 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
David Sedlák4ffcec82019-07-25 15:10:21 +0200374 ret = yin_parse_element_generic(st->yin_ctx, name, name_len, &data, &exts.child);
David Sedlákb1a78352019-06-28 16:16:29 +0200375 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200376 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200377 assert_string_equal(exts.child->stmt, "elem");
378 assert_string_equal(exts.child->arg, "text_value");
David Sedlákb1a78352019-06-28 16:16:29 +0200379 assert_string_equal(exts.child->child->stmt, "attr");
380 assert_string_equal(exts.child->child->arg, "value");
381 assert_true(exts.child->child->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200382 lysp_ext_instance_free(st->ctx, &exts);
David Sedlák5392a212019-07-01 09:19:10 +0200383 st = reset_state(state);
384
385 data = "<elem></elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200386 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
David Sedlák4ffcec82019-07-25 15:10:21 +0200387 ret = yin_parse_element_generic(st->yin_ctx, name, name_len, &data, &exts.child);
David Sedlák5392a212019-07-01 09:19:10 +0200388 assert_int_equal(ret, LY_SUCCESS);
389 assert_string_equal(exts.child->stmt, "elem");
390 assert_null(exts.child->child);
391 assert_null(exts.child->arg);
David Sedlákda8ffa32019-07-08 14:17:10 +0200392 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák5392a212019-07-01 09:19:10 +0200393 lysp_ext_instance_free(st->ctx, &exts);
394
David Sedlákb1a78352019-06-28 16:16:29 +0200395 st->finished_correctly = true;
396}
397
398static void
399test_yin_parse_extension_instance(void **state)
400{
401 LY_ERR ret;
402 struct state *st = *state;
403 const char *prefix, *name;
404 size_t prefix_len, name_len;
405 struct yin_arg_record *args = NULL;
406 struct lysp_ext_instance *exts = NULL;
David Sedlákb1a78352019-06-28 16:16:29 +0200407 const char *data = "<ext value1=\"test\" value=\"test2\"><subelem>text</subelem></ext>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200408 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
409 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200410 ret = yin_parse_extension_instance(st->yin_ctx, args, &data, name2fullname(name, prefix_len),
David Sedlák619db942019-07-03 14:47:30 +0200411 namelen2fulllen(name_len, prefix_len), LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200412 assert_int_equal(ret, LY_SUCCESS);
413 assert_string_equal(exts->name, "ext");
414 assert_int_equal(exts->insubstmt_index, 0);
415 assert_true(exts->insubstmt == LYEXT_SUBSTMT_CONTACT);
416 assert_true(exts->yin & LYS_YIN);
417 assert_string_equal(exts->child->stmt, "value1");
418 assert_string_equal(exts->child->arg, "test");
419 assert_null(exts->child->child);
420 assert_true(exts->child->flags & LYS_YIN_ATTR);
421 assert_string_equal(exts->child->next->stmt, "value");
422 assert_string_equal(exts->child->next->arg, "test2");
423 assert_null(exts->child->next->child);
424 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
425
426 assert_string_equal(exts->child->next->next->stmt, "subelem");
427 assert_string_equal(exts->child->next->next->arg, "text");
428 assert_null(exts->child->next->next->child);
429 assert_null(exts->child->next->next->next);
430 assert_false(exts->child->next->next->flags & LYS_YIN_ATTR);
David Sedlákda8ffa32019-07-08 14:17:10 +0200431 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200432 LY_ARRAY_FREE(args);
433 lysp_ext_instance_free(st->ctx, exts);
434 LY_ARRAY_FREE(exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200435 exts = NULL;
436 args = NULL;
437 st = reset_state(state);
438
439 data = "<extension-elem />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200440 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
441 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200442 ret = yin_parse_extension_instance(st->yin_ctx, args, &data, name, name_len, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200443 assert_int_equal(ret, LY_SUCCESS);
444 assert_string_equal(exts->name, "extension-elem");
445 assert_null(exts->argument);
446 assert_null(exts->child);
447 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
448 assert_int_equal(exts->insubstmt_index, 0);
449 assert_true(exts->yin & LYS_YIN);
David Sedlákda8ffa32019-07-08 14:17:10 +0200450 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákf250ecf2019-07-01 11:02:05 +0200451 LY_ARRAY_FREE(args);
452 lysp_ext_instance_free(st->ctx, exts);
453 LY_ARRAY_FREE(exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200454 st->finished_correctly = true;
455}
456
David Sedlák555c7202019-07-04 12:14:12 +0200457static void
458test_yin_parse_content(void **state)
459{
460 struct state *st = *state;
461 LY_ERR ret = LY_SUCCESS;
462 struct sized_string name, prefix;
463 const char *data = "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
464 "<custom xmlns=\"my-ext\">"
465 "totally amazing extension"
466 "</custom>"
David Sedlák986cb412019-07-04 13:10:11 +0200467 "<extension name=\"ext\">"
468 "<argument name=\"argname\"></argument>"
469 "<description><text>desc</text></description>"
470 "<reference><text>ref</text></reference>"
471 "<status value=\"deprecated\"></status>"
472 "</extension>"
David Sedlák555c7202019-07-04 12:14:12 +0200473 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedlák32488102019-07-15 17:44:10 +0200474 "<if-feature name=\"foo\"></if-feature>"
David Sedlák32eee7b2019-07-09 12:38:44 +0200475 "<when condition=\"condition...\">"
476 "<reference><text>when_ref</text></reference>"
477 "<description><text>when_desc</text></description>"
478 "</when>"
David Sedláke1a30302019-07-10 13:49:38 +0200479 "<config value=\"true\"/>"
David Sedlákc1771b12019-07-10 15:55:46 +0200480 "<error-message>"
481 "<value>error-msg</value>"
482 "</error-message>"
David Sedlák2ce1be62019-07-10 16:15:09 +0200483 "<error-app-tag value=\"err-app-tag\"/>"
David Sedláka5b1d382019-07-10 16:31:09 +0200484 "<units name=\"radians\"></units>"
David Sedláke7084ce2019-07-10 16:44:15 +0200485 "<default value=\"default-value\"/>"
David Sedlák5545f5d2019-07-11 11:55:16 +0200486 "<position value=\"25\"></position>"
487 "<value value=\"-5\"/>"
David Sedlákcf5569a2019-07-11 13:31:34 +0200488 "<require-instance value=\"true\"></require-instance>"
David Sedlákb7296dd2019-07-11 14:58:38 +0200489 "<range value=\"5..10\" />"
David Sedlák438ae432019-07-11 15:36:54 +0200490 "<length value=\"baf\"/>"
David Sedlákd3983112019-07-12 11:20:56 +0200491 "<pattern value='pattern'>"
492 "<modifier value='invert-match'/>"
493 "</pattern>"
David Sedlákfd5b9c32019-07-12 15:33:13 +0200494 "<enum name=\"yay\">"
495 "</enum>"
David Sedlák555c7202019-07-04 12:14:12 +0200496 "</prefix>";
497 struct lysp_ext_instance *exts = NULL;
David Sedlák5f8191e2019-07-08 16:35:52 +0200498 const char **if_features = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200499 struct yin_arg_record *attrs = NULL;
David Sedláke7084ce2019-07-10 16:44:15 +0200500 const char *value, *err_msg, *app_tag, *units, *def;
David Sedlák986cb412019-07-04 13:10:11 +0200501 struct lysp_ext *ext_def = NULL;
David Sedlák32eee7b2019-07-09 12:38:44 +0200502 struct lysp_when *when_p = NULL;
David Sedlákcf5569a2019-07-11 13:31:34 +0200503 struct lysp_type_enum pos_enum = {}, val_enum = {};
David Sedlákfd5b9c32019-07-12 15:33:13 +0200504 struct lysp_type req_type = {}, range_type = {}, len_type = {}, patter_type = {}, enum_type = {};
David Sedláke1a30302019-07-10 13:49:38 +0200505 uint8_t config = 0;
David Sedlák555c7202019-07-04 12:14:12 +0200506
David Sedlákda8ffa32019-07-08 14:17:10 +0200507 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
508 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedlák555c7202019-07-04 12:14:12 +0200509
David Sedlákfd5b9c32019-07-12 15:33:13 +0200510 struct yin_subelement subelems[17] = {
David Sedlák438ae432019-07-11 15:36:54 +0200511 {YANG_CONFIG, &config, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200512 {YANG_DEFAULT, &def, YIN_SUBELEM_UNIQUE},
David Sedlákfd5b9c32019-07-12 15:33:13 +0200513 {YANG_ENUM, &enum_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200514 {YANG_ERROR_APP_TAG, &app_tag, 0},
515 {YANG_ERROR_MESSAGE, &err_msg, 0},
516 {YANG_EXTENSION, &ext_def, 0},
517 {YANG_IF_FEATURE, &if_features, 0},
518 {YANG_LENGTH, &len_type, 0},
David Sedlákd3983112019-07-12 11:20:56 +0200519 {YANG_PATTERN, &patter_type, 0},
David Sedlák43801c92019-08-05 15:58:54 +0200520 {YANG_POSITION, &pos_enum, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200521 {YANG_RANGE, &range_type, 0},
522 {YANG_REQUIRE_INSTANCE, &req_type, 0},
523 {YANG_UNITS, &units, 0},
524 {YANG_VALUE, &val_enum, 0},
525 {YANG_WHEN, &when_p, 0},
526 {YANG_CUSTOM, NULL, 0},
527 {YIN_TEXT, &value, 0}
David Sedlákd3983112019-07-12 11:20:56 +0200528 };
David Sedlákfd5b9c32019-07-12 15:33:13 +0200529 ret = yin_parse_content(st->yin_ctx, subelems, 17, &data, YANG_PREFIX, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200530 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200531 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák2ce1be62019-07-10 16:15:09 +0200532 /* check parsed values */
David Sedláke7084ce2019-07-10 16:44:15 +0200533 assert_string_equal(def, "default-value");
David Sedlák555c7202019-07-04 12:14:12 +0200534 assert_string_equal(exts->name, "custom");
535 assert_string_equal(exts->argument, "totally amazing extension");
536 assert_string_equal(value, "wsefsdf");
David Sedláka5b1d382019-07-10 16:31:09 +0200537 assert_string_equal(units, "radians");
David Sedlák32eee7b2019-07-09 12:38:44 +0200538 assert_string_equal(when_p->cond, "condition...");
539 assert_string_equal(when_p->dsc, "when_desc");
540 assert_string_equal(when_p->ref, "when_ref");
David Sedláke1a30302019-07-10 13:49:38 +0200541 assert_int_equal(config, LYS_CONFIG_W);
David Sedlák5545f5d2019-07-11 11:55:16 +0200542 assert_int_equal(pos_enum.value, 25);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200543 assert_true(pos_enum.flags & LYS_SET_VALUE);
David Sedlák5545f5d2019-07-11 11:55:16 +0200544 assert_int_equal(val_enum.value, -5);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200545 assert_true(val_enum.flags & LYS_SET_VALUE);
David Sedlákcf5569a2019-07-11 13:31:34 +0200546 assert_int_equal(req_type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200547 assert_true(req_type.flags &= LYS_SET_REQINST);
David Sedlákb7296dd2019-07-11 14:58:38 +0200548 assert_string_equal(range_type.range->arg, "5..10");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200549 assert_true(range_type.flags & LYS_SET_RANGE);
David Sedlákc1771b12019-07-10 15:55:46 +0200550 assert_string_equal(err_msg, "error-msg");
David Sedlák2ce1be62019-07-10 16:15:09 +0200551 assert_string_equal(app_tag, "err-app-tag");
David Sedlákfd5b9c32019-07-12 15:33:13 +0200552 assert_string_equal(enum_type.enums->name, "yay");
David Sedlák438ae432019-07-11 15:36:54 +0200553 assert_string_equal(len_type.length->arg, "baf");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200554 assert_true(len_type.flags & LYS_SET_LENGTH);
David Sedlákd3983112019-07-12 11:20:56 +0200555 assert_string_equal(patter_type.patterns->arg, "\x015pattern");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200556 assert_true(patter_type.flags & LYS_SET_PATTERN);
David Sedlák2ce1be62019-07-10 16:15:09 +0200557 /* cleanup */
David Sedlák555c7202019-07-04 12:14:12 +0200558 lysp_ext_instance_free(st->ctx, exts);
David Sedlák32eee7b2019-07-09 12:38:44 +0200559 lysp_when_free(st->ctx, when_p);
David Sedlák986cb412019-07-04 13:10:11 +0200560 lysp_ext_free(st->ctx, ext_def);
David Sedlák5f8191e2019-07-08 16:35:52 +0200561 FREE_STRING(st->ctx, *if_features);
David Sedlákc1771b12019-07-10 15:55:46 +0200562 FREE_STRING(st->ctx, err_msg);
David Sedlák2ce1be62019-07-10 16:15:09 +0200563 FREE_STRING(st->ctx, app_tag);
David Sedláka5b1d382019-07-10 16:31:09 +0200564 FREE_STRING(st->ctx, units);
David Sedlákd3983112019-07-12 11:20:56 +0200565 FREE_STRING(st->ctx, patter_type.patterns->arg);
David Sedláke7084ce2019-07-10 16:44:15 +0200566 FREE_STRING(st->ctx, def);
David Sedlákb7296dd2019-07-11 14:58:38 +0200567 FREE_STRING(st->ctx, range_type.range->arg);
David Sedlák438ae432019-07-11 15:36:54 +0200568 FREE_STRING(st->ctx, len_type.length->arg);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200569 FREE_STRING(st->ctx, enum_type.enums->name);
David Sedlákb7296dd2019-07-11 14:58:38 +0200570 FREE_STRING(st->ctx, value);
David Sedlák5f8191e2019-07-08 16:35:52 +0200571 LY_ARRAY_FREE(if_features);
David Sedlák555c7202019-07-04 12:14:12 +0200572 LY_ARRAY_FREE(exts);
David Sedlák986cb412019-07-04 13:10:11 +0200573 LY_ARRAY_FREE(ext_def);
David Sedlák555c7202019-07-04 12:14:12 +0200574 LY_ARRAY_FREE(attrs);
David Sedlákd3983112019-07-12 11:20:56 +0200575 LY_ARRAY_FREE(patter_type.patterns);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200576 LY_ARRAY_FREE(enum_type.enums);
David Sedlák32eee7b2019-07-09 12:38:44 +0200577 free(when_p);
David Sedlákb7296dd2019-07-11 14:58:38 +0200578 free(range_type.range);
David Sedlák438ae432019-07-11 15:36:54 +0200579 free(len_type.length);
David Sedlák555c7202019-07-04 12:14:12 +0200580 attrs = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200581 st = reset_state(state);
582
583 /* test unique subelem */
584 const char *prefix_value;
585 struct yin_subelement subelems2[2] = {{YANG_PREFIX, &prefix_value, 0},
586 {YIN_TEXT, &value, YIN_SUBELEM_UNIQUE}};
David Sedláke6cd89e2019-08-07 12:46:02 +0200587 data = ELEMENT_WRAPPER_START
David Sedlák555c7202019-07-04 12:14:12 +0200588 "<prefix value=\"inv_mod\" />"
589 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
590 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedláke6cd89e2019-08-07 12:46:02 +0200591 ELEMENT_WRAPPER_END;
David Sedlákda8ffa32019-07-08 14:17:10 +0200592 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
593 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedláke6cd89e2019-08-07 12:46:02 +0200594 ret = yin_parse_content(st->yin_ctx, subelems2, 2, &data, YANG_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200595 assert_int_equal(ret, LY_EVALID);
David Sedláke6cd89e2019-08-07 12:46:02 +0200596 logbuf_assert("Redefinition of text element in status element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200597 lydict_remove(st->ctx, prefix_value);
598 lydict_remove(st->ctx, value);
599 st = reset_state(state);
600 LY_ARRAY_FREE(attrs);
601 attrs = NULL;
602
603 /* test first subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200604 data = ELEMENT_WRAPPER_START
David Sedlák555c7202019-07-04 12:14:12 +0200605 "<prefix value=\"inv_mod\" />"
606 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
607 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedláke6cd89e2019-08-07 12:46:02 +0200608 ELEMENT_WRAPPER_END;
David Sedlák555c7202019-07-04 12:14:12 +0200609 struct yin_subelement subelems3[2] = {{YANG_PREFIX, &prefix_value, 0},
610 {YIN_TEXT, &value, YIN_SUBELEM_FIRST}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200611 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
612 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedláke6cd89e2019-08-07 12:46:02 +0200613 ret = yin_parse_content(st->yin_ctx, subelems3, 2, &data, YANG_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200614 assert_int_equal(ret, LY_EVALID);
David Sedláke6cd89e2019-08-07 12:46:02 +0200615 logbuf_assert("Subelement text of status element must be defined as first subelement. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200616 lydict_remove(st->ctx, prefix_value);
617 st = reset_state(state);
618 LY_ARRAY_FREE(attrs);
619 attrs = NULL;
620
621 /* test mandatory subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200622 data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
David Sedlák555c7202019-07-04 12:14:12 +0200623 struct yin_subelement subelems4[1] = {{YANG_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200624 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
625 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedláke6cd89e2019-08-07 12:46:02 +0200626 ret = yin_parse_content(st->yin_ctx, subelems4, 1, &data, YANG_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200627 assert_int_equal(ret, LY_EVALID);
David Sedláke6cd89e2019-08-07 12:46:02 +0200628 logbuf_assert("Missing mandatory subelement prefix of status element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200629 LY_ARRAY_FREE(attrs);
630
631 st->finished_correctly = true;
632}
633
David Sedlák92147b02019-07-09 14:01:01 +0200634static void
David Sedlák4a650532019-07-10 11:55:18 +0200635test_validate_value(void **state)
636{
637 struct state *st = *state;
638 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "#invalid", 8), LY_EVALID);
639 logbuf_assert("Invalid identifier character '#'. Line number 1.");
640 assert_int_equal(yin_validate_value(st->yin_ctx, Y_STR_ARG, "", 0), LY_SUCCESS);
641 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "pre:b", 5), LY_EVALID);
642 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:b", 5), LY_SUCCESS);
643 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:pre:b", 9), LY_EVALID);
644
645 st->finished_correctly = true;
646}
647
David Sedlák32488102019-07-15 17:44:10 +0200648/* helper function to simplify unit test of each element using parse_content function */
649LY_ERR
650test_element_helper(struct state *st, const char **data, void *dest, const char **text,
651 struct lysp_ext_instance **exts, bool valid)
652{
653 struct yin_arg_record *attrs = NULL;
654 struct sized_string name, prefix;
655 LY_ERR ret = LY_SUCCESS;
656 struct yin_subelement subelems[71] = {
657 {YANG_ACTION, dest, 0},
658 {YANG_ANYDATA, dest, 0},
659 {YANG_ANYXML, dest, 0},
660 {YANG_ARGUMENT,dest, 0},
661 {YANG_AUGMENT, dest, 0},
662 {YANG_BASE, dest, 0},
663 {YANG_BELONGS_TO, dest, 0},
664 {YANG_BIT, dest, 0},
665 {YANG_CASE, dest, 0},
666 {YANG_CHOICE, dest, 0},
667 {YANG_CONFIG, dest, 0},
668 {YANG_CONTACT, dest, 0},
669 {YANG_CONTAINER, dest, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200670 {YANG_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
David Sedlák32488102019-07-15 17:44:10 +0200671 {YANG_DESCRIPTION, dest, 0},
672 {YANG_DEVIATE, dest, 0},
673 {YANG_DEVIATION, dest, 0},
674 {YANG_ENUM, dest, 0},
675 {YANG_ERROR_APP_TAG, dest, 0},
676 {YANG_ERROR_MESSAGE, dest, 0},
677 {YANG_EXTENSION, dest, 0},
678 {YANG_FEATURE, dest, 0},
679 {YANG_FRACTION_DIGITS, dest, 0},
680 {YANG_GROUPING, dest, 0},
681 {YANG_IDENTITY, dest, 0},
682 {YANG_IF_FEATURE, dest, 0},
683 {YANG_IMPORT, dest, 0},
684 {YANG_INCLUDE, dest, 0},
685 {YANG_INPUT, dest, 0},
686 {YANG_KEY, dest, 0},
687 {YANG_LEAF, dest, 0},
688 {YANG_LEAF_LIST, dest, 0},
689 {YANG_LENGTH, dest, 0},
690 {YANG_LIST, dest, 0},
691 {YANG_MANDATORY, dest, 0},
692 {YANG_MAX_ELEMENTS, dest, 0},
693 {YANG_MIN_ELEMENTS, dest, 0},
694 {YANG_MODIFIER, dest, 0},
695 {YANG_MODULE, dest, 0},
696 {YANG_MUST, dest, 0},
697 {YANG_NAMESPACE, dest, 0},
698 {YANG_NOTIFICATION, dest, 0},
699 {YANG_ORDERED_BY, dest, 0},
700 {YANG_ORGANIZATION, dest, 0},
701 {YANG_OUTPUT, dest, 0},
702 {YANG_PATH, dest, 0},
703 {YANG_PATTERN, dest, 0},
David Sedlák43801c92019-08-05 15:58:54 +0200704 {YANG_POSITION, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200705 {YANG_PREFIX, dest, 0},
706 {YANG_PRESENCE, dest, 0},
707 {YANG_RANGE, dest, 0},
708 {YANG_REFERENCE, dest, 0},
709 {YANG_REFINE, dest, 0},
710 {YANG_REQUIRE_INSTANCE, dest, 0},
711 {YANG_REVISION, dest, 0},
712 {YANG_REVISION_DATE, dest, 0},
713 {YANG_RPC, dest, 0},
714 {YANG_STATUS, dest, 0},
715 {YANG_SUBMODULE, dest, 0},
716 {YANG_TYPE, dest, 0},
717 {YANG_TYPEDEF, dest, 0},
718 {YANG_UNIQUE, dest, 0},
719 {YANG_UNITS, dest, 0},
720 {YANG_USES, dest, 0},
721 {YANG_VALUE, dest, 0},
722 {YANG_WHEN, dest, 0},
723 {YANG_YANG_VERSION, dest, 0},
724 {YANG_YIN_ELEMENT, dest, 0},
725 {YANG_CUSTOM, dest, 0},
726 {YIN_TEXT, dest, 0},
727 {YIN_VALUE, dest, 0}
728 };
David Sedlák4f03b932019-07-26 13:01:47 +0200729 LY_CHECK_RET(lyxml_get_element(&st->yin_ctx->xml_ctx, data, &prefix.value, &prefix.len, &name.value, &name.len));
730 LY_CHECK_RET(yin_load_attributes(st->yin_ctx, data, &attrs));
David Sedlák8e7bda82019-07-16 17:57:50 +0200731 ret = yin_parse_content(st->yin_ctx, subelems, 71, data, yin_match_keyword(st->yin_ctx, name.value, name.len, prefix.value, prefix.len, YANG_NONE), text, exts);
David Sedlák32488102019-07-15 17:44:10 +0200732 LY_ARRAY_FREE(attrs);
733 if (valid) {
734 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
735 }
736 /* reset status */
737 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
738 return ret;
739}
740
David Sedlákd1144562019-08-06 12:36:14 +0200741#define EXT_SUBELEM "<myext:c-define name=\"MY_MTU\" xmlns:myext=\"urn:example:extensions\"/>"
742
David Sedlák32488102019-07-15 17:44:10 +0200743static void
David Sedlák43801c92019-08-05 15:58:54 +0200744test_enum_elem(void **state)
David Sedlák32488102019-07-15 17:44:10 +0200745{
David Sedlák32488102019-07-15 17:44:10 +0200746 struct state *st = *state;
747 struct lysp_type type = {};
748 const char *data;
749 data = ELEMENT_WRAPPER_START
750 "<enum name=\"enum-name\">"
751 "<if-feature name=\"feature\" />"
752 "<value value=\"55\" />"
753 "<status value=\"deprecated\" />"
754 "<description><text>desc...</text></description>"
755 "<reference><text>ref...</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +0200756 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +0200757 "</enum>"
758 ELEMENT_WRAPPER_END;
759 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200760 assert_string_equal(type.enums->name, "enum-name");
David Sedlák32488102019-07-15 17:44:10 +0200761 assert_string_equal(*type.enums->iffeatures, "feature");
762 assert_int_equal(type.enums->value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200763 assert_true((type.enums->flags & LYS_STATUS_DEPRC) && (type.enums->flags & LYS_SET_VALUE));
David Sedlák32488102019-07-15 17:44:10 +0200764 assert_string_equal(type.enums->dsc, "desc...");
765 assert_string_equal(type.enums->ref, "ref...");
David Sedlákd1144562019-08-06 12:36:14 +0200766 assert_string_equal(type.enums->exts->name, "myext:c-define");
767 assert_int_equal(type.enums->exts->insubstmt_index, 0);
768 assert_int_equal(type.enums->exts->insubstmt, LYEXT_SUBSTMT_SELF);
769 lysp_type_free(st->ctx, &type);
770 memset(&type, 0, sizeof type);
771
772 data = ELEMENT_WRAPPER_START
773 "<enum name=\"enum-name\"></enum>"
774 ELEMENT_WRAPPER_END;
775 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
776 assert_string_equal(type.enums->name, "enum-name");
David Sedlák32488102019-07-15 17:44:10 +0200777 lysp_type_free(st->ctx, &type);
778 memset(&type, 0, sizeof type);
779
David Sedlák43801c92019-08-05 15:58:54 +0200780 st->finished_correctly = true;
781}
782
783static void
784test_bit_elem(void **state)
785{
786 struct state *st = *state;
787 struct lysp_type type = {};
788 const char *data;
789 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200790 "<bit name=\"bit-name\">"
David Sedlák43801c92019-08-05 15:58:54 +0200791 "<if-feature name=\"feature\" />"
792 "<position value=\"55\" />"
793 "<status value=\"deprecated\" />"
794 "<description><text>desc...</text></description>"
795 "<reference><text>ref...</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +0200796 EXT_SUBELEM
David Sedlák43801c92019-08-05 15:58:54 +0200797 "</bit>"
798 ELEMENT_WRAPPER_END;
799 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200800 assert_string_equal(type.bits->name, "bit-name");
David Sedlák43801c92019-08-05 15:58:54 +0200801 assert_string_equal(*type.bits->iffeatures, "feature");
802 assert_int_equal(type.bits->value, 55);
803 assert_true((type.bits->flags & LYS_STATUS_DEPRC) && (type.bits->flags & LYS_SET_VALUE));
804 assert_string_equal(type.bits->dsc, "desc...");
805 assert_string_equal(type.bits->ref, "ref...");
David Sedlákd1144562019-08-06 12:36:14 +0200806 assert_string_equal(type.bits->exts->name, "myext:c-define");
807 assert_int_equal(type.bits->exts->insubstmt_index, 0);
808 assert_int_equal(type.bits->exts->insubstmt, LYEXT_SUBSTMT_SELF);
809 lysp_type_free(st->ctx, &type);
810 memset(&type, 0, sizeof type);
811
812 data = ELEMENT_WRAPPER_START
813 "<bit name=\"bit-name\"> </bit>"
814 ELEMENT_WRAPPER_END;
815 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
816 assert_string_equal(type.bits->name, "bit-name");
David Sedlák43801c92019-08-05 15:58:54 +0200817 lysp_type_free(st->ctx, &type);
818 memset(&type, 0, sizeof type);
819
David Sedlák32488102019-07-15 17:44:10 +0200820 st->finished_correctly = true;
821}
822
823static void
824test_meta_elem(void **state)
825{
826 struct state *st = *state;
827 char *value = NULL;
828 const char *data;
David Sedlákd1144562019-08-06 12:36:14 +0200829 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200830
831 /* organization element */
832 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200833 "<organization><text>organization...</text>" EXT_SUBELEM EXT_SUBELEM "</organization>"
David Sedlák32488102019-07-15 17:44:10 +0200834 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +0200835 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, true), LY_SUCCESS);
836 assert_string_equal(exts[0].name, "myext:c-define");
837 assert_int_equal(exts[0].insubstmt_index, 0);
838 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORGANIZATION);
839 assert_string_equal(exts[1].name, "myext:c-define");
840 assert_int_equal(exts[1].insubstmt_index, 0);
841 assert_int_equal(exts[1].insubstmt, LYEXT_SUBSTMT_ORGANIZATION);
David Sedlák32488102019-07-15 17:44:10 +0200842 assert_string_equal(value, "organization...");
843 FREE_STRING(st->ctx, value);
David Sedlákd1144562019-08-06 12:36:14 +0200844 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +0200845 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200846 exts = NULL;
847
David Sedlák32488102019-07-15 17:44:10 +0200848 /* contact element */
849 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200850 "<contact><text>contact...</text>" EXT_SUBELEM "</contact>"
David Sedlák32488102019-07-15 17:44:10 +0200851 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +0200852 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, true), LY_SUCCESS);
853 assert_string_equal(exts[0].name, "myext:c-define");
854 assert_int_equal(exts[0].insubstmt_index, 0);
855 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONTACT);
David Sedlák32488102019-07-15 17:44:10 +0200856 assert_string_equal(value, "contact...");
857 FREE_STRING(st->ctx, value);
David Sedlákd1144562019-08-06 12:36:14 +0200858 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
859 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200860 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200861
David Sedlák32488102019-07-15 17:44:10 +0200862 /* description element */
863 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200864 "<description><text>description...</text>" EXT_SUBELEM "</description>"
David Sedlák32488102019-07-15 17:44:10 +0200865 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +0200866 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, true), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +0200867 assert_string_equal(value, "description...");
David Sedlákd1144562019-08-06 12:36:14 +0200868 assert_string_equal(exts[0].name, "myext:c-define");
869 assert_int_equal(exts[0].insubstmt_index, 0);
870 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DESCRIPTION);
David Sedlák32488102019-07-15 17:44:10 +0200871 FREE_STRING(st->ctx, value);
872 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200873 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
874 exts = NULL;
875
David Sedlák32488102019-07-15 17:44:10 +0200876 /* reference element */
877 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200878 "<reference><text>reference...</text>" EXT_SUBELEM "</reference>"
David Sedlák32488102019-07-15 17:44:10 +0200879 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +0200880 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, true), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +0200881 assert_string_equal(value, "reference...");
David Sedlákd1144562019-08-06 12:36:14 +0200882 assert_string_equal(exts[0].name, "myext:c-define");
883 assert_int_equal(exts[0].insubstmt_index, 0);
884 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_REFERENCE);
David Sedlák32488102019-07-15 17:44:10 +0200885 FREE_STRING(st->ctx, value);
886 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200887 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
888 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200889
David Sedlákdf2a9732019-08-07 13:23:16 +0200890 /* reference element */
891 data = ELEMENT_WRAPPER_START
892 "<reference invalid=\"text\"><text>reference...</text>""</reference>"
893 ELEMENT_WRAPPER_END;
894 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, false), LY_EVALID);
895 logbuf_assert("Unexpected attribute \"invalid\" of reference element. Line number 1.");
896 FREE_STRING(st->ctx, value);
897 value = NULL;
898 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
899 exts = NULL;
900
David Sedlák32488102019-07-15 17:44:10 +0200901 /* missing text subelement */
902 data = ELEMENT_WRAPPER_START
903 "<reference>reference...</reference>"
904 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +0200905 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, false), LY_EVALID);
David Sedlák32488102019-07-15 17:44:10 +0200906 logbuf_assert("Missing mandatory subelement text of reference element. Line number 1.");
907
David Sedlákd1144562019-08-06 12:36:14 +0200908 /* reference element */
909 data = ELEMENT_WRAPPER_START
910 "<reference>" EXT_SUBELEM "<text>reference...</text></reference>"
911 ELEMENT_WRAPPER_END;
912 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, false), LY_EVALID);
913 logbuf_assert("Subelement text of reference element must be defined as first subelement. Line number 1.");
914 FREE_STRING(st->ctx, value);
915 value = NULL;
916 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
917 exts = NULL;
918
David Sedlák32488102019-07-15 17:44:10 +0200919 st->finished_correctly = true;
920}
921
922static void
923test_import_elem(void **state)
924{
925 struct state *st = *state;
926 const char *data;
David Sedlák298ff6d2019-07-26 14:29:03 +0200927 struct lysp_import *imports = NULL;
928 struct import_meta imp_meta = {"prefix", &imports};
David Sedlák32488102019-07-15 17:44:10 +0200929
930 /* max subelems */
931 data = ELEMENT_WRAPPER_START
932 "<import module=\"a\">"
David Sedlákd1144562019-08-06 12:36:14 +0200933 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +0200934 "<prefix value=\"a_mod\"/>"
935 "<revision-date date=\"2015-01-01\"></revision-date>"
936 "<description><text>import description</text></description>"
937 "<reference><text>import reference</text></reference>"
938 "</import>"
939 ELEMENT_WRAPPER_END;
David Sedlák298ff6d2019-07-26 14:29:03 +0200940 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, true), LY_SUCCESS);
941 assert_string_equal(imports->name, "a");
942 assert_string_equal(imports->prefix, "a_mod");
943 assert_string_equal(imports->rev, "2015-01-01");
944 assert_string_equal(imports->dsc, "import description");
945 assert_string_equal(imports->ref, "import reference");
David Sedlákd1144562019-08-06 12:36:14 +0200946 assert_string_equal(imports->exts->name, "myext:c-define");
947 assert_int_equal(imports->exts->insubstmt, LYEXT_SUBSTMT_SELF);
948 assert_int_equal(imports->exts->insubstmt_index, 0);
David Sedlák298ff6d2019-07-26 14:29:03 +0200949 FREE_ARRAY(st->ctx, imports, lysp_import_free);
950 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200951
952 /* min subelems */
David Sedlák32488102019-07-15 17:44:10 +0200953 data = ELEMENT_WRAPPER_START
954 "<import module=\"a\">"
955 "<prefix value=\"a_mod\"/>"
956 "</import>"
957 ELEMENT_WRAPPER_END;
David Sedlák298ff6d2019-07-26 14:29:03 +0200958 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, true), LY_SUCCESS);
959 assert_string_equal(imports->prefix, "a_mod");
960 FREE_ARRAY(st->ctx, imports, lysp_import_free);
961 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200962
963 /* invalid (missing prefix) */
David Sedlák298ff6d2019-07-26 14:29:03 +0200964 data = ELEMENT_WRAPPER_START "<import module=\"a\"></import>" ELEMENT_WRAPPER_END;
965 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, false), LY_EVALID);
David Sedlák32488102019-07-15 17:44:10 +0200966 logbuf_assert("Missing mandatory subelement prefix of import element. Line number 1.");
David Sedlák298ff6d2019-07-26 14:29:03 +0200967 FREE_ARRAY(st->ctx, imports, lysp_import_free);
968 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200969
970 /* invalid reused prefix */
David Sedlák32488102019-07-15 17:44:10 +0200971 data = ELEMENT_WRAPPER_START
972 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +0200973 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +0200974 "</import>"
975 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +0200976 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +0200977 "</import>"
978 ELEMENT_WRAPPER_END;
David Sedlák298ff6d2019-07-26 14:29:03 +0200979 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, false), LY_EVALID);
980 logbuf_assert("Prefix \"prefix\" already used as module prefix. Line number 1.");
981 FREE_ARRAY(st->ctx, imports, lysp_import_free);
982 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200983
984 st->finished_correctly = true;
985}
986
987static void
988test_status_elem(void **state)
989{
990 struct state *st = *state;
991 const char *data;
992 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +0200993 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200994
995 /* test valid values */
996 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
997 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200998 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200999
1000 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
1001 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001002 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +02001003
David Sedlákd1144562019-08-06 12:36:14 +02001004 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\">"EXT_SUBELEM"</status>" ELEMENT_WRAPPER_END;
1005 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001006 assert_true(flags & LYS_STATUS_OBSLT);
David Sedlákd1144562019-08-06 12:36:14 +02001007 assert_string_equal(exts[0].name, "myext:c-define");
1008 assert_int_equal(exts[0].insubstmt_index, 0);
1009 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_STATUS);
1010 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1011 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001012
1013 /* test invalid value */
1014 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
1015 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1016 logbuf_assert("Invalid value \"invalid\" of \"status\". Line number 1.");
1017 st->finished_correctly = true;
1018}
1019
1020static void
1021test_ext_elem(void **state)
1022{
1023 struct state *st = *state;
1024 const char *data;
1025 struct lysp_ext *ext = NULL;
1026
1027 /* max subelems */
1028 data = ELEMENT_WRAPPER_START
1029 "<extension name=\"ext_name\">"
1030 "<argument name=\"arg\"></argument>"
1031 "<status value=\"current\"/>"
1032 "<description><text>ext_desc</text></description>"
1033 "<reference><text>ext_ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001034 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +02001035 "</extension>"
1036 ELEMENT_WRAPPER_END;
1037 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
1038 assert_string_equal(ext->name, "ext_name");
1039 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001040 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +02001041 assert_string_equal(ext->dsc, "ext_desc");
1042 assert_string_equal(ext->ref, "ext_ref");
David Sedlákd1144562019-08-06 12:36:14 +02001043 assert_string_equal(ext->exts[0].name, "myext:c-define");
1044 assert_int_equal(ext->exts[0].insubstmt_index, 0);
1045 assert_int_equal(ext->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák32488102019-07-15 17:44:10 +02001046 lysp_ext_free(st->ctx, ext);
1047 LY_ARRAY_FREE(ext);
1048 ext = NULL;
1049
1050 /* min subelems */
1051 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
1052 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
1053 assert_string_equal(ext->name, "ext_name");
1054 lysp_ext_free(st->ctx, ext);
1055 LY_ARRAY_FREE(ext);
1056 ext = NULL;
1057
1058 st->finished_correctly = true;
1059}
1060
1061static void
1062test_yin_element_elem(void **state)
1063{
1064 struct state *st = *state;
1065 const char *data;
1066 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001067 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001068
1069 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
1070 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001071 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +02001072
David Sedlákd1144562019-08-06 12:36:14 +02001073 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\">" EXT_SUBELEM "</yin-element>" ELEMENT_WRAPPER_END;
1074 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001075 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlákd1144562019-08-06 12:36:14 +02001076 assert_string_equal(exts[0].name, "myext:c-define");
1077 assert_int_equal(exts[0].insubstmt_index, 0);
1078 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_YINELEM);
1079 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001080
1081 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
1082 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001083 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +02001084 logbuf_assert("Invalid value \"invalid\" of \"yin-element\". Line number 1.");
1085 st->finished_correctly = true;
1086}
1087
1088static void
1089test_yangversion_elem(void **state)
1090{
1091 struct state *st = *state;
1092 const char *data;
1093 uint8_t version = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001094 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001095
1096 /* valid values */
1097 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.0\" />" ELEMENT_WRAPPER_END;
1098 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001099 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001100 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_0);
1101
David Sedlákd1144562019-08-06 12:36:14 +02001102 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\">" EXT_SUBELEM "</yang-version>" ELEMENT_WRAPPER_END;
1103 assert_int_equal(test_element_helper(st, &data, &version, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001104 assert_true(version & LYS_VERSION_1_1);
David Sedlák32488102019-07-15 17:44:10 +02001105 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_1);
David Sedlákd1144562019-08-06 12:36:14 +02001106 assert_string_equal(exts[0].name, "myext:c-define");
1107 assert_int_equal(exts[0].insubstmt_index, 0);
1108 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_VERSION);
1109 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001110
1111 /* invalid value */
1112 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
1113 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, false), LY_EVALID);
1114 logbuf_assert("Invalid value \"version\" of \"yang-version\". Line number 1.");
1115
1116 st->finished_correctly = true;
1117}
1118
1119static void
1120test_mandatory_elem(void **state)
1121{
1122 struct state *st = *state;
1123 const char *data;
1124 uint16_t man = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001125 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001126
1127 /* valid values */
1128 data = ELEMENT_WRAPPER_START "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
1129 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1130 assert_int_equal(man, LYS_MAND_TRUE);
1131 man = 0;
1132
David Sedlákd1144562019-08-06 12:36:14 +02001133 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\">" EXT_SUBELEM "</mandatory>" ELEMENT_WRAPPER_END;
1134 assert_int_equal(test_element_helper(st, &data, &man, NULL, &exts, true), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001135 assert_int_equal(man, LYS_MAND_FALSE);
David Sedlákd1144562019-08-06 12:36:14 +02001136 assert_string_equal(exts[0].name, "myext:c-define");
1137 assert_int_equal(exts[0].insubstmt_index, 0);
1138 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MANDATORY);
1139 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001140
1141 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
1142 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, false), LY_EVALID);
1143 logbuf_assert("Invalid value \"invalid\" of \"mandatory\". Line number 1.");
1144
1145 st->finished_correctly = true;
1146}
1147
David Sedlák8e7bda82019-07-16 17:57:50 +02001148static void
1149test_argument_elem(void **state)
1150{
1151 struct state *st = *state;
1152 const char *data;
1153 uint16_t flags = 0;
1154 const char *arg;
1155 struct yin_argument_meta arg_meta = {&flags, &arg};
David Sedlákd1144562019-08-06 12:36:14 +02001156 struct lysp_ext_instance *exts = NULL;
1157
David Sedlák8e7bda82019-07-16 17:57:50 +02001158 /* max subelems */
1159 data = ELEMENT_WRAPPER_START
1160 "<argument name=\"arg-name\">"
1161 "<yin-element value=\"true\" />"
David Sedlákd1144562019-08-06 12:36:14 +02001162 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001163 "</argument>"
1164 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +02001165 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001166 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001167 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlákd1144562019-08-06 12:36:14 +02001168 assert_string_equal(exts[0].name, "myext:c-define");
1169 assert_int_equal(exts[0].insubstmt_index, 0);
1170 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ARGUMENT);
1171 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1172 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001173 flags = 0;
1174 FREE_STRING(st->ctx, arg);
1175 arg = NULL;
1176
1177 /* min subelems */
1178 data = ELEMENT_WRAPPER_START
1179 "<argument name=\"arg\">"
1180 "</argument>"
1181 ELEMENT_WRAPPER_END;
1182 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1183 assert_string_equal(arg, "arg");
1184 assert_true(flags == 0);
1185 FREE_STRING(st->ctx, arg);
1186
1187 st->finished_correctly = true;
1188}
1189
1190static void
1191test_base_elem(void **state)
1192{
1193 struct state *st = *state;
1194 const char *data;
1195 const char **bases = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001196 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001197 struct lysp_type type = {};
1198
1199 /* as identity subelement */
1200 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001201 "<base name=\"base-name\">"
1202 EXT_SUBELEM
1203 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001204 "</identity>";
David Sedlákd1144562019-08-06 12:36:14 +02001205 assert_int_equal(test_element_helper(st, &data, &bases, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001206 assert_string_equal(*bases, "base-name");
David Sedlákd1144562019-08-06 12:36:14 +02001207 assert_string_equal(exts[0].name, "myext:c-define");
1208 assert_int_equal(exts[0].insubstmt_index, 0);
1209 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1210 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1211 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001212 FREE_STRING(st->ctx, *bases);
1213 LY_ARRAY_FREE(bases);
1214
1215 /* as type subelement */
1216 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001217 "<base name=\"base-name\">"
1218 EXT_SUBELEM
1219 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001220 "</type>";
David Sedlákd1144562019-08-06 12:36:14 +02001221 assert_int_equal(test_element_helper(st, &data, &type, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001222 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001223 assert_true(type.flags & LYS_SET_BASE);
David Sedlákd1144562019-08-06 12:36:14 +02001224 assert_string_equal(exts[0].name, "myext:c-define");
1225 assert_int_equal(exts[0].insubstmt_index, 0);
1226 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1227 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1228 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001229 FREE_STRING(st->ctx, *type.bases);
1230 LY_ARRAY_FREE(type.bases);
1231
1232 st->finished_correctly = true;
1233}
1234
1235static void
1236test_belongsto_elem(void **state)
1237{
1238 struct state *st = *state;
1239 const char *data;
1240 struct lysp_submodule submod;
David Sedlákd1144562019-08-06 12:36:14 +02001241 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001242
1243 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +02001244 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/>"EXT_SUBELEM"</belongs-to>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001245 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +02001246 assert_int_equal(test_element_helper(st, &data, &submod, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001247 assert_string_equal(submod.belongsto, "module-name");
1248 assert_string_equal(submod.prefix, "pref");
David Sedlákd1144562019-08-06 12:36:14 +02001249 assert_string_equal(exts[0].name, "myext:c-define");
1250 assert_int_equal(exts[0].insubstmt_index, 0);
1251 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BELONGSTO);
1252 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1253 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001254 FREE_STRING(st->ctx, submod.belongsto);
1255 FREE_STRING(st->ctx, submod.prefix);
1256
1257 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
1258 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, false), LY_EVALID);
1259 logbuf_assert("Missing mandatory subelement prefix of belongs-to element. Line number 1.");
1260 FREE_STRING(st->ctx, submod.belongsto);
1261
1262 st->finished_correctly = true;
1263}
1264
1265static void
1266test_config_elem(void **state)
1267{
1268 struct state *st = *state;
1269 const char *data;
1270 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001271 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001272
David Sedlákd1144562019-08-06 12:36:14 +02001273 data = ELEMENT_WRAPPER_START "<config value=\"true\">" EXT_SUBELEM "</config>" ELEMENT_WRAPPER_END;
1274 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001275 assert_true(flags & LYS_CONFIG_W);
David Sedlákd1144562019-08-06 12:36:14 +02001276 assert_string_equal(exts[0].name, "myext:c-define");
1277 assert_int_equal(exts[0].insubstmt_index, 0);
1278 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONFIG);
1279 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1280 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001281 flags = 0;
1282
1283 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
1284 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001285 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001286 flags = 0;
1287
1288 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1289 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1290 logbuf_assert("Invalid value \"invalid\" of \"config\". Line number 1.");
1291
1292 st->finished_correctly = true;
1293}
1294
1295static void
1296test_default_elem(void **state)
1297{
1298 struct state *st = *state;
1299 const char *data;
1300 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001301 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001302
David Sedlákd1144562019-08-06 12:36:14 +02001303 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\">"EXT_SUBELEM"</default>" ELEMENT_WRAPPER_END;
1304 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001305 assert_string_equal(val, "defaul-value");
David Sedlákd1144562019-08-06 12:36:14 +02001306 assert_string_equal(exts[0].name, "myext:c-define");
1307 assert_int_equal(exts[0].insubstmt_index, 0);
1308 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DEFAULT);
1309 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1310 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001311 FREE_STRING(st->ctx, val);
1312 val = NULL;
1313
1314 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
1315 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1316 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1317
1318 st->finished_correctly = true;
1319}
1320
1321static void
1322test_err_app_tag_elem(void **state)
1323{
1324 struct state *st = *state;
1325 const char *data;
1326 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001327 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001328
David Sedlákd1144562019-08-06 12:36:14 +02001329 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\">"EXT_SUBELEM"</error-app-tag>" ELEMENT_WRAPPER_END;
1330 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001331 assert_string_equal(val, "val");
David Sedlákd1144562019-08-06 12:36:14 +02001332 assert_string_equal(exts[0].name, "myext:c-define");
1333 assert_int_equal(exts[0].insubstmt_index, 0);
1334 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRTAG);
1335 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1336 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001337 FREE_STRING(st->ctx, val);
1338 val = NULL;
1339
1340 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
1341 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1342 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1343
1344 st->finished_correctly = true;
1345}
1346
1347static void
1348test_err_msg_elem(void **state)
1349{
1350 struct state *st = *state;
1351 const char *data;
1352 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001353 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001354
David Sedlákd1144562019-08-06 12:36:14 +02001355 data = ELEMENT_WRAPPER_START "<error-message><value>val</value>"EXT_SUBELEM"</error-message>" ELEMENT_WRAPPER_END;
1356 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001357 assert_string_equal(val, "val");
David Sedlákd1144562019-08-06 12:36:14 +02001358 assert_string_equal(exts[0].name, "myext:c-define");
1359 assert_int_equal(exts[0].insubstmt_index, 0);
1360 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRMSG);
1361 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1362 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001363 FREE_STRING(st->ctx, val);
1364
1365 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
1366 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1367 logbuf_assert("Missing mandatory subelement value of error-message element. Line number 1.");
1368
David Sedlákdf2a9732019-08-07 13:23:16 +02001369 data = ELEMENT_WRAPPER_START "<error-message invalid=\"text\"/>" ELEMENT_WRAPPER_END;
1370 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1371 logbuf_assert("Unexpected attribute \"invalid\" of error-message element. Line number 1.");
1372
David Sedlák8e7bda82019-07-16 17:57:50 +02001373 st->finished_correctly = true;
1374}
1375
1376static void
1377test_fracdigits_elem(void **state)
1378{
1379 struct state *st = *state;
1380 const char *data;
1381 struct lysp_type type = {};
1382
1383 /* valid value */
David Sedlákd1144562019-08-06 12:36:14 +02001384 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\">"EXT_SUBELEM"</fraction-digits>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001385 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001386 assert_string_equal(type.exts[0].name, "myext:c-define");
1387 assert_int_equal(type.exts[0].insubstmt_index, 0);
1388 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_FRACDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001389 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001390 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlákd1144562019-08-06 12:36:14 +02001391 FREE_ARRAY(st->ctx, type.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001392
1393 /* invalid values */
1394 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
1395 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1396 logbuf_assert("Invalid value \"-1\" of \"fraction-digits\". Line number 1.");
1397
1398 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
1399 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1400 logbuf_assert("Invalid value \"02\" of \"fraction-digits\". Line number 1.");
1401
1402 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
1403 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1404 logbuf_assert("Invalid value \"1p\" of \"fraction-digits\". Line number 1.");
1405
1406 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
1407 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1408 logbuf_assert("Invalid value \"19\" of \"fraction-digits\". Line number 1.");
1409
1410 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
1411 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1412 logbuf_assert("Invalid value \"999999999999999999\" of \"fraction-digits\". Line number 1.");
1413
1414 st->finished_correctly = true;
1415}
1416
1417static void
1418test_iffeature_elem(void **state)
1419{
1420 struct state *st = *state;
1421 const char *data;
1422 const char **iffeatures = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001423 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001424
David Sedlákd1144562019-08-06 12:36:14 +02001425 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\">"EXT_SUBELEM"</if-feature>" ELEMENT_WRAPPER_END;
1426 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001427 assert_string_equal(*iffeatures, "local-storage");
David Sedlákd1144562019-08-06 12:36:14 +02001428 assert_string_equal(exts[0].name, "myext:c-define");
1429 assert_int_equal(exts[0].insubstmt_index, 0);
1430 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_IFFEATURE);
1431 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1432 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001433 FREE_STRING(st->ctx, *iffeatures);
1434 LY_ARRAY_FREE(iffeatures);
1435 iffeatures = NULL;
1436
1437 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
1438 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, false), LY_EVALID);
1439 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1440 LY_ARRAY_FREE(iffeatures);
1441 iffeatures = NULL;
1442
1443 st->finished_correctly = true;
1444}
1445
1446static void
1447test_length_elem(void **state)
1448{
1449 struct state *st = *state;
1450 const char *data;
1451 struct lysp_type type = {};
1452
1453 /* max subelems */
1454 data = ELEMENT_WRAPPER_START
1455 "<length value=\"length-str\">"
1456 "<error-message><value>err-msg</value></error-message>"
1457 "<error-app-tag value=\"err-app-tag\"/>"
1458 "<description><text>desc</text></description>"
1459 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001460 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001461 "</length>"
1462 ELEMENT_WRAPPER_END;
1463 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1464 assert_string_equal(type.length->arg, "length-str");
1465 assert_string_equal(type.length->emsg, "err-msg");
1466 assert_string_equal(type.length->eapptag, "err-app-tag");
1467 assert_string_equal(type.length->dsc, "desc");
1468 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001469 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlákd1144562019-08-06 12:36:14 +02001470 assert_string_equal(type.length->exts[0].name, "myext:c-define");
1471 assert_int_equal(type.length->exts[0].insubstmt_index, 0);
1472 assert_int_equal(type.length->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001473 lysp_type_free(st->ctx, &type);
1474 memset(&type, 0, sizeof(type));
1475
1476 /* min subelems */
1477 data = ELEMENT_WRAPPER_START
1478 "<length value=\"length-str\">"
1479 "</length>"
1480 ELEMENT_WRAPPER_END;
1481 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1482 assert_string_equal(type.length->arg, "length-str");
1483 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001484 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001485 memset(&type, 0, sizeof(type));
1486
1487 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
1488 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1489 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1490 lysp_type_free(st->ctx, &type);
1491 memset(&type, 0, sizeof(type));
1492
1493 st->finished_correctly = true;
1494}
1495
1496static void
1497test_modifier_elem(void **state)
1498{
1499 struct state *st = *state;
1500 const char *data;
1501 const char *pat = lydict_insert(st->ctx, "\006pattern", 8);
David Sedlákd1144562019-08-06 12:36:14 +02001502 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001503
David Sedlákd1144562019-08-06 12:36:14 +02001504 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\">" EXT_SUBELEM "</modifier>" ELEMENT_WRAPPER_END;
1505 assert_int_equal(test_element_helper(st, &data, &pat, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001506 assert_string_equal(pat, "\x015pattern");
David Sedlákd1144562019-08-06 12:36:14 +02001507 assert_string_equal(exts[0].name, "myext:c-define");
1508 assert_int_equal(exts[0].insubstmt_index, 0);
1509 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MODIFIER);
1510 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1511 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001512 FREE_STRING(st->ctx, pat);
1513
1514 pat = lydict_insert(st->ctx, "\006pattern", 8);
1515 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
1516 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, false), LY_EVALID);
1517 logbuf_assert("Invalid value \"invert\" of \"modifier\". Line number 1.");
1518 FREE_STRING(st->ctx, pat);
1519
1520 st->finished_correctly = true;
1521}
1522
1523static void
1524test_namespace_elem(void **state)
1525{
1526 struct state *st = *state;
1527 const char *data;
1528 const char *ns;
David Sedlákd1144562019-08-06 12:36:14 +02001529 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001530
David Sedlákd1144562019-08-06 12:36:14 +02001531 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\">" EXT_SUBELEM "</namespace>" ELEMENT_WRAPPER_END;
1532 assert_int_equal(test_element_helper(st, &data, &ns, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001533 assert_string_equal(ns, "ns");
David Sedlákd1144562019-08-06 12:36:14 +02001534 assert_string_equal(exts[0].name, "myext:c-define");
1535 assert_int_equal(exts[0].insubstmt_index, 0);
1536 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_NAMESPACE);
1537 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1538 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001539 FREE_STRING(st->ctx, ns);
1540
1541 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
1542 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, false), LY_EVALID);
1543 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1544
1545 st->finished_correctly = true;
1546}
1547
1548static void
1549test_path_elem(void **state)
1550{
1551 struct state *st = *state;
1552 const char *data;
1553 struct lysp_type type = {};
1554
David Sedlákd1144562019-08-06 12:36:14 +02001555 data = ELEMENT_WRAPPER_START "<path value=\"path-val\">" EXT_SUBELEM "</path>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001556 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1557 assert_string_equal("path-val", type.path);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001558 assert_true(type.flags & LYS_SET_PATH);
David Sedlákd1144562019-08-06 12:36:14 +02001559 assert_string_equal(type.exts[0].name, "myext:c-define");
1560 assert_int_equal(type.exts[0].insubstmt_index, 0);
1561 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_PATH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001562 lysp_type_free(st->ctx, &type);
1563
1564 st->finished_correctly = true;
1565}
1566
1567static void
1568test_pattern_elem(void **state)
1569{
1570 struct state *st = *state;
1571 const char *data;
1572 struct lysp_type type = {};
1573
1574 /* max subelems */
1575 data = ELEMENT_WRAPPER_START
1576 "<pattern value=\"super_pattern\">"
1577 "<modifier value=\"invert-match\"/>"
1578 "<error-message><value>err-msg-value</value></error-message>"
1579 "<error-app-tag value=\"err-app-tag-value\"/>"
1580 "<description><text>pattern-desc</text></description>"
1581 "<reference><text>pattern-ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001582 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001583 "</pattern>"
1584 ELEMENT_WRAPPER_END;
1585 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001586 assert_true(type.flags & LYS_SET_PATTERN);
David Sedlák8e7bda82019-07-16 17:57:50 +02001587 assert_string_equal(type.patterns->arg, "\x015super_pattern");
1588 assert_string_equal(type.patterns->dsc, "pattern-desc");
1589 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1590 assert_string_equal(type.patterns->emsg, "err-msg-value");
1591 assert_string_equal(type.patterns->dsc, "pattern-desc");
1592 assert_string_equal(type.patterns->ref, "pattern-ref");
David Sedlákd1144562019-08-06 12:36:14 +02001593 assert_string_equal(type.patterns->exts[0].name, "myext:c-define");
1594 assert_int_equal(type.patterns->exts[0].insubstmt_index, 0);
1595 assert_int_equal(type.patterns->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001596 lysp_type_free(st->ctx, &type);
1597 memset(&type, 0, sizeof(type));
1598
1599 /* min subelems */
1600 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
1601 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1602 assert_string_equal(type.patterns->arg, "\x006pattern");
1603 lysp_type_free(st->ctx, &type);
1604 memset(&type, 0, sizeof(type));
1605
1606 st->finished_correctly = true;
1607}
1608
1609static void
1610test_value_position_elem(void **state)
1611{
1612 struct state *st = *state;
1613 const char *data;
1614 struct lysp_type_enum en = {};
1615
1616 /* valid values */
David Sedlákd1144562019-08-06 12:36:14 +02001617 data = ELEMENT_WRAPPER_START "<value value=\"55\">" EXT_SUBELEM "</value>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001618 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1619 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001620 assert_true(en.flags & LYS_SET_VALUE);
David Sedlákd1144562019-08-06 12:36:14 +02001621 assert_string_equal(en.exts[0].name, "myext:c-define");
1622 assert_int_equal(en.exts[0].insubstmt_index, 0);
1623 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_VALUE);
1624 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001625 memset(&en, 0, sizeof(en));
1626
1627 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
1628 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1629 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001630 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001631 memset(&en, 0, sizeof(en));
1632
1633 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
1634 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1635 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001636 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001637 memset(&en, 0, sizeof(en));
1638
1639 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
1640 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1641 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001642 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001643 memset(&en, 0, sizeof(en));
1644
1645 /* valid positions */
David Sedlák8d552d62019-08-06 15:29:05 +02001646 data = ELEMENT_WRAPPER_START "<position value=\"55\">" EXT_SUBELEM "</position>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001647 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1648 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001649 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8d552d62019-08-06 15:29:05 +02001650 assert_string_equal(en.exts[0].name, "myext:c-define");
1651 assert_int_equal(en.exts[0].insubstmt_index, 0);
1652 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_POSITION);
1653 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001654 memset(&en, 0, sizeof(en));
1655
1656 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
1657 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1658 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001659 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001660 memset(&en, 0, sizeof(en));
1661
1662 /* invalid values */
1663 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
1664 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1665 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\". Line number 1.");
1666
1667 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
1668 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1669 logbuf_assert("Invalid value \"1k\" of \"value\". Line number 1.");
1670
David Sedlák69f01612019-07-17 11:41:08 +02001671 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
1672 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1673 logbuf_assert("Invalid value \"\" of \"value\". Line number 1.");
1674
David Sedlák8e7bda82019-07-16 17:57:50 +02001675 /*invalid positions */
1676 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
1677 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1678 logbuf_assert("Invalid value \"-5\" of \"position\". Line number 1.");
1679
1680 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
1681 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1682 logbuf_assert("Invalid value \"-0\" of \"position\". Line number 1.");
1683
1684 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
1685 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1686 logbuf_assert("Invalid value \"99999999999999999999\" of \"position\". Line number 1.");
1687
David Sedlák69f01612019-07-17 11:41:08 +02001688 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
1689 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1690 logbuf_assert("Invalid value \"\" of \"position\". Line number 1.");
1691
1692 st->finished_correctly = true;
1693}
1694
1695static void
1696test_prefix_elem(void **state)
1697{
1698 struct state *st = *state;
1699 const char *data;
1700 const char *value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001701 struct lysp_ext_instance *exts = NULL;
1702
1703 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\">" EXT_SUBELEM "</prefix>" ELEMENT_WRAPPER_END;
1704 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, true), LY_SUCCESS);
1705 assert_string_equal(value, "pref");
1706 assert_string_equal(exts[0].name, "myext:c-define");
1707 assert_int_equal(exts[0].insubstmt_index, 0);
1708 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PREFIX);
1709 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1710 exts = NULL;
1711 FREE_STRING(st->ctx, value);
David Sedlák69f01612019-07-17 11:41:08 +02001712
1713 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
1714 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
1715 assert_string_equal(value, "pref");
1716 FREE_STRING(st->ctx, value);
1717
1718 st->finished_correctly = true;
1719}
1720
1721static void
1722test_range_elem(void **state)
1723{
1724 struct state *st = *state;
1725 const char *data;
1726 struct lysp_type type = {};
1727
1728 /* max subelems */
1729 data = ELEMENT_WRAPPER_START
1730 "<range value=\"range-str\">"
1731 "<error-message><value>err-msg</value></error-message>"
1732 "<error-app-tag value=\"err-app-tag\" />"
1733 "<description><text>desc</text></description>"
1734 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001735 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001736 "</range>"
1737 ELEMENT_WRAPPER_END;
1738 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1739 assert_string_equal(type.range->arg, "range-str");
1740 assert_string_equal(type.range->dsc, "desc");
1741 assert_string_equal(type.range->eapptag, "err-app-tag");
1742 assert_string_equal(type.range->emsg, "err-msg");
1743 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001744 assert_true(type.flags & LYS_SET_RANGE);
David Sedlákd1144562019-08-06 12:36:14 +02001745 assert_string_equal(type.range->exts[0].name, "myext:c-define");
1746 assert_int_equal(type.range->exts[0].insubstmt_index, 0);
1747 assert_int_equal(type.range->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001748 lysp_type_free(st->ctx, &type);
1749 memset(&type, 0, sizeof(type));
1750
1751 /* min subelems */
1752 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
1753 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1754 assert_string_equal(type.range->arg, "range-str");
1755 lysp_type_free(st->ctx, &type);
1756 memset(&type, 0, sizeof(type));
1757
1758 st->finished_correctly = true;
1759}
1760
1761static void
1762test_reqinstance_elem(void **state)
1763{
1764 struct state *st = *state;
1765 const char *data;
1766 struct lysp_type type = {};
1767
David Sedlákd1144562019-08-06 12:36:14 +02001768 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\">" EXT_SUBELEM "</require-instance>" ELEMENT_WRAPPER_END;
David Sedlák69f01612019-07-17 11:41:08 +02001769 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1770 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001771 assert_true(type.flags & LYS_SET_REQINST);
David Sedlákd1144562019-08-06 12:36:14 +02001772 assert_string_equal(type.exts[0].name, "myext:c-define");
1773 assert_int_equal(type.exts[0].insubstmt_index, 0);
1774 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_REQINSTANCE);
1775 lysp_type_free(st->ctx, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001776 memset(&type, 0, sizeof(type));
1777
1778 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
1779 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1780 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001781 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001782 memset(&type, 0, sizeof(type));
1783
1784 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1785 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1786 memset(&type, 0, sizeof(type));
1787 logbuf_assert("Invalid value \"invalid\" of \"require-instance\". Line number 1.");
1788
1789 st->finished_correctly = true;
1790}
1791
1792static void
1793test_revision_date_elem(void **state)
1794{
1795 struct state *st = *state;
1796 const char *data;
1797 char rev[LY_REV_SIZE];
David Sedlákd1144562019-08-06 12:36:14 +02001798 struct lysp_ext_instance *exts = NULL;
1799
1800 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\">"EXT_SUBELEM"</revision-date>" ELEMENT_WRAPPER_END;
1801 assert_int_equal(test_element_helper(st, &data, rev, NULL, &exts, true), LY_SUCCESS);
1802 assert_string_equal(rev, "2000-01-01");
1803 assert_string_equal(exts[0].name, "myext:c-define");
1804 assert_int_equal(exts[0].insubstmt_index, 0);
1805 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_REVISIONDATE);
1806 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák69f01612019-07-17 11:41:08 +02001807
1808 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
1809 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, true), LY_SUCCESS);
1810 assert_string_equal(rev, "2000-01-01");
1811
1812 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
1813 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, false), LY_EVALID);
1814 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1815
1816 st->finished_correctly = true;
1817}
1818
1819static void
1820test_unique_elem(void **state)
1821{
1822 struct state *st = *state;
1823 const char *data;
1824 const char **values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001825 struct lysp_ext_instance *exts = NULL;
1826
1827 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\">"EXT_SUBELEM"</unique>" ELEMENT_WRAPPER_END;
1828 assert_int_equal(test_element_helper(st, &data, &values, NULL, &exts, true), LY_SUCCESS);
1829 assert_string_equal(*values, "tag");
1830 assert_string_equal(exts[0].name, "myext:c-define");
1831 assert_int_equal(exts[0].insubstmt_index, 0);
1832 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNIQUE);
1833 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1834 FREE_STRING(st->ctx, *values);
1835 LY_ARRAY_FREE(values);
1836 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001837
1838 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
1839 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1840 assert_string_equal(*values, "tag");
1841 FREE_STRING(st->ctx, *values);
1842 LY_ARRAY_FREE(values);
David Sedlákd1144562019-08-06 12:36:14 +02001843 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001844
1845 st->finished_correctly = true;
1846}
1847
1848static void
1849test_units_elem(void **state)
1850{
1851 struct state *st = *state;
1852 const char *data;
1853 const char *values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001854 struct lysp_ext_instance *exts = NULL;
1855
1856 data = ELEMENT_WRAPPER_START "<units name=\"name\">"EXT_SUBELEM"</units>" ELEMENT_WRAPPER_END;
1857 assert_int_equal(test_element_helper(st, &data, &values, NULL, &exts, true), LY_SUCCESS);
1858 assert_string_equal(values, "name");
1859 assert_string_equal(exts[0].name, "myext:c-define");
1860 assert_int_equal(exts[0].insubstmt_index, 0);
1861 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNITS);
1862 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1863 FREE_STRING(st->ctx, values);
1864 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001865
1866 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
1867 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1868 assert_string_equal(values, "name");
1869 FREE_STRING(st->ctx, values);
David Sedlákd1144562019-08-06 12:36:14 +02001870 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001871
1872 st->finished_correctly = true;
1873}
1874
1875static void
1876test_when_elem(void **state)
1877{
1878 struct state *st = *state;
1879 const char *data;
1880 struct lysp_when *when = NULL;
1881
1882 data = ELEMENT_WRAPPER_START
1883 "<when condition=\"cond\">"
1884 "<description><text>desc</text></description>"
1885 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001886 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001887 "</when>"
1888 ELEMENT_WRAPPER_END;
1889 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1890 assert_string_equal(when->cond, "cond");
1891 assert_string_equal(when->dsc, "desc");
1892 assert_string_equal(when->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02001893 assert_string_equal(when->exts[0].name, "myext:c-define");
1894 assert_int_equal(when->exts[0].insubstmt_index, 0);
1895 assert_int_equal(when->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001896 lysp_when_free(st->ctx, when);
1897 free(when);
1898 when = NULL;
1899
1900 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
1901 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1902 assert_string_equal(when->cond, "cond");
1903 lysp_when_free(st->ctx, when);
1904 free(when);
1905 when = NULL;
1906
1907 st->finished_correctly = true;
1908}
1909
1910static void
1911test_yin_text_value_elem(void **state)
1912{
1913 struct state *st = *state;
1914 const char *data;
1915 const char *val;
1916
1917 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
1918 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1919 assert_string_equal(val, "text");
1920 FREE_STRING(st->ctx, val);
1921
1922 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
1923 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1924 assert_string_equal(val, "text");
1925 FREE_STRING(st->ctx, val);
1926
1927 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
1928 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1929 assert_string_equal("", val);
1930 FREE_STRING(st->ctx, val);
1931
David Sedlák8e7bda82019-07-16 17:57:50 +02001932 st->finished_correctly = true;
1933}
David Sedlák32488102019-07-15 17:44:10 +02001934
David Sedlák374d2b32019-07-17 15:06:55 +02001935static void
1936test_type_elem(void **state)
1937{
1938 struct state *st = *state;
1939 const char *data;
1940 struct lysp_type type = {};
1941
1942 /* max subelems */
1943 data = ELEMENT_WRAPPER_START
1944 "<type name=\"type-name\">"
1945 "<base name=\"base-name\"/>"
1946 "<bit name=\"bit\"/>"
1947 "<enum name=\"enum\"/>"
1948 "<fraction-digits value=\"2\"/>"
1949 "<length value=\"length\"/>"
1950 "<path value=\"path\"/>"
1951 "<pattern value=\"pattern\"/>"
1952 "<range value=\"range\" />"
1953 "<require-instance value=\"true\"/>"
1954 "<type name=\"sub-type-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02001955 EXT_SUBELEM
David Sedlák374d2b32019-07-17 15:06:55 +02001956 "</type>"
1957 ELEMENT_WRAPPER_END;
1958 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1959 assert_string_equal(type.name, "type-name");
1960 assert_string_equal(*type.bases, "base-name");
1961 assert_string_equal(type.bits->name, "bit");
1962 assert_string_equal(type.enums->name, "enum");
1963 assert_int_equal(type.fraction_digits, 2);
1964 assert_string_equal(type.length->arg, "length");
1965 assert_string_equal(type.path, "path");
1966 assert_string_equal(type.patterns->arg, "\006pattern");
1967 assert_string_equal(type.range->arg, "range");
1968 assert_int_equal(type.require_instance, 1);
1969 assert_string_equal(type.types->name, "sub-type-name");
David Sedlákd1144562019-08-06 12:36:14 +02001970 assert_string_equal(type.exts[0].name, "myext:c-define");
1971 assert_int_equal(type.exts[0].insubstmt_index, 0);
1972 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001973 assert_true(type.flags & LYS_SET_BASE);
1974 assert_true(type.flags & LYS_SET_BIT);
1975 assert_true(type.flags & LYS_SET_ENUM);
1976 assert_true(type.flags & LYS_SET_FRDIGITS);
1977 assert_true(type.flags & LYS_SET_LENGTH);
1978 assert_true(type.flags & LYS_SET_PATH);
1979 assert_true(type.flags & LYS_SET_PATTERN);
1980 assert_true(type.flags & LYS_SET_RANGE);
1981 assert_true(type.flags & LYS_SET_REQINST);
1982 assert_true(type.flags & LYS_SET_TYPE);
David Sedlákd1144562019-08-06 12:36:14 +02001983 lysp_type_free(st->ctx, &type);
David Sedlák374d2b32019-07-17 15:06:55 +02001984 memset(&type, 0, sizeof(type));
1985
1986 /* min subelems */
1987 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
1988 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1989 lysp_type_free(st->ctx, &type);
1990 memset(&type, 0, sizeof(type));
1991
1992 st->finished_correctly = true;
1993}
1994
David Sedlák1af868e2019-07-17 17:03:14 +02001995static void
1996test_max_elems_elem(void **state)
1997{
1998 struct state *st = *state;
1999 const char *data;
2000 struct lysp_node_list list = {};
2001 struct lysp_node_leaflist llist = {};
2002 struct lysp_refine refine = {};
2003
David Sedlákd1144562019-08-06 12:36:14 +02002004 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"unbounded\">"EXT_SUBELEM"</max-elements> </refine>";
David Sedlák1af868e2019-07-17 17:03:14 +02002005 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
2006 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002007 assert_true(refine.flags & LYS_SET_MAX);
David Sedlákd1144562019-08-06 12:36:14 +02002008 assert_string_equal(refine.exts[0].name, "myext:c-define");
2009 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2010 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2011 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002012
David Sedlákd1144562019-08-06 12:36:14 +02002013 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"5\">"EXT_SUBELEM"</max-elements> </list>";
David Sedlák1af868e2019-07-17 17:03:14 +02002014 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
2015 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002016 assert_true(list.flags & LYS_SET_MAX);
David Sedlákd1144562019-08-06 12:36:14 +02002017 assert_string_equal(list.exts[0].name, "myext:c-define");
2018 assert_int_equal(list.exts[0].insubstmt_index, 0);
2019 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2020 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002021
David Sedlákd1144562019-08-06 12:36:14 +02002022 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"85\">"EXT_SUBELEM"</max-elements> </leaf-list>";
David Sedlák1af868e2019-07-17 17:03:14 +02002023 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
2024 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002025 assert_true(llist.flags & LYS_SET_MAX);
David Sedlákd1144562019-08-06 12:36:14 +02002026 assert_string_equal(llist.exts[0].name, "myext:c-define");
2027 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2028 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2029 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002030
2031 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
2032 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
2033 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002034 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02002035
2036 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
2037 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2038 logbuf_assert("Invalid value \"0\" of \"max-elements\". Line number 1.");
2039
2040 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
2041 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2042 logbuf_assert("Invalid value \"-10\" of \"max-elements\". Line number 1.");
2043
2044 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
2045 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2046 logbuf_assert("Invalid value \"k\" of \"max-elements\". Line number 1.");
2047
2048 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
2049 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2050 logbuf_assert("Invalid value \"u12\" of \"max-elements\". Line number 1.");
2051
2052 st->finished_correctly = true;
2053}
2054
David Sedlák09e18c92019-07-18 11:17:11 +02002055static void
2056test_min_elems_elem(void **state)
2057{
2058 struct state *st = *state;
2059 const char *data;
2060 struct lysp_node_list list = {};
2061 struct lysp_node_leaflist llist = {};
2062 struct lysp_refine refine = {};
2063
David Sedlákd1144562019-08-06 12:36:14 +02002064 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"0\">"EXT_SUBELEM"</min-elements> </refine>";
David Sedlák09e18c92019-07-18 11:17:11 +02002065 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
2066 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002067 assert_true(refine.flags & LYS_SET_MIN);
David Sedlákd1144562019-08-06 12:36:14 +02002068 assert_string_equal(refine.exts[0].name, "myext:c-define");
2069 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2070 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2071 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002072
David Sedlákd1144562019-08-06 12:36:14 +02002073 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"41\">"EXT_SUBELEM"</min-elements> </list>";
David Sedlák09e18c92019-07-18 11:17:11 +02002074 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
2075 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002076 assert_true(list.flags & LYS_SET_MIN);
David Sedlákd1144562019-08-06 12:36:14 +02002077 assert_string_equal(list.exts[0].name, "myext:c-define");
2078 assert_int_equal(list.exts[0].insubstmt_index, 0);
2079 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2080 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002081
David Sedlákd1144562019-08-06 12:36:14 +02002082 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"50\">"EXT_SUBELEM"</min-elements> </leaf-list>";
David Sedlák09e18c92019-07-18 11:17:11 +02002083 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
2084 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002085 assert_true(llist.flags & LYS_SET_MIN);
David Sedlákd1144562019-08-06 12:36:14 +02002086 assert_string_equal(llist.exts[0].name, "myext:c-define");
2087 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2088 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2089 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002090
2091 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
2092 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2093 logbuf_assert("Value \"-5\" is out of \"min-elements\" bounds. Line number 1.");
2094
2095 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
2096 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2097 logbuf_assert("Value \"99999999999999999\" is out of \"min-elements\" bounds. Line number 1.");
2098
2099 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
2100 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2101 logbuf_assert("Invalid value \"5k\" of \"min-elements\". Line number 1.");
2102
2103 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
2104 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2105 logbuf_assert("Invalid value \"05\" of \"min-elements\". Line number 1.");
2106
2107 st->finished_correctly = true;
2108}
2109
David Sedláka2dad212019-07-18 12:45:19 +02002110static void
2111test_ordby_elem(void **state)
2112{
2113 struct state *st = *state;
2114 const char *data;
2115 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02002116 struct lysp_ext_instance *exts = NULL;
David Sedláka2dad212019-07-18 12:45:19 +02002117
David Sedlákd1144562019-08-06 12:36:14 +02002118 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\">"EXT_SUBELEM"</ordered-by>" ELEMENT_WRAPPER_END;
2119 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002120 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedlákd1144562019-08-06 12:36:14 +02002121 assert_string_equal(exts[0].name, "myext:c-define");
2122 assert_int_equal(exts[0].insubstmt_index, 0);
2123 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORDEREDBY);
2124 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedláka2dad212019-07-18 12:45:19 +02002125
2126 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
2127 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002128 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02002129
2130 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
2131 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
2132 logbuf_assert("Invalid value \"inv\" of \"ordered-by\". Line number 1.");
2133
2134 st->finished_correctly = true;
2135}
2136
David Sedlák8a83bbb2019-07-18 14:46:00 +02002137static void
2138test_any_elem(void **state)
2139{
2140 struct state *st = *state;
2141 const char *data;
2142 struct lysp_node *siblings = NULL;
2143 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
2144 struct lysp_node_anydata *parsed = NULL;
2145
2146 /* anyxml max subelems */
2147 data = ELEMENT_WRAPPER_START
2148 "<anyxml name=\"any-name\">"
2149 "<config value=\"true\" />"
2150 "<description><text>desc</text></description>"
2151 "<if-feature name=\"feature\" />"
2152 "<mandatory value=\"true\" />"
2153 "<must condition=\"must-cond\" />"
2154 "<reference><text>ref</text></reference>"
2155 "<status value=\"deprecated\"/>"
2156 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002157 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002158 "</anyxml>"
2159 ELEMENT_WRAPPER_END;
2160 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2161 parsed = (struct lysp_node_anydata *)siblings;
2162 assert_null(parsed->parent);
2163 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002164 assert_true(parsed->flags & LYS_CONFIG_W);
2165 assert_true(parsed->flags & LYS_MAND_TRUE);
2166 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002167 assert_null(parsed->next);
2168 assert_string_equal(parsed->name, "any-name");
2169 assert_string_equal(parsed->dsc, "desc");
2170 assert_string_equal(parsed->ref, "ref");
2171 assert_string_equal(parsed->when->cond, "when-cond");
2172 assert_string_equal(*parsed->iffeatures, "feature");
David Sedlákd1144562019-08-06 12:36:14 +02002173 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2174 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2175 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002176 lysp_node_free(st->ctx, siblings);
2177 siblings = NULL;
2178
2179 /* anydata max subelems */
2180 data = ELEMENT_WRAPPER_START
2181 "<anydata name=\"any-name\">"
2182 "<config value=\"true\" />"
2183 "<description><text>desc</text></description>"
2184 "<if-feature name=\"feature\" />"
2185 "<mandatory value=\"true\" />"
2186 "<must condition=\"must-cond\" />"
2187 "<reference><text>ref</text></reference>"
2188 "<status value=\"deprecated\"/>"
2189 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002190 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002191 "</anydata>"
2192 ELEMENT_WRAPPER_END;
2193 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2194 parsed = (struct lysp_node_anydata *)siblings;
2195 assert_null(parsed->parent);
2196 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002197 assert_true(parsed->flags & LYS_CONFIG_W);
2198 assert_true(parsed->flags & LYS_MAND_TRUE);
2199 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002200 assert_null(parsed->next);
2201 assert_string_equal(parsed->name, "any-name");
2202 assert_string_equal(parsed->dsc, "desc");
2203 assert_string_equal(parsed->ref, "ref");
2204 assert_string_equal(parsed->when->cond, "when-cond");
2205 assert_string_equal(*parsed->iffeatures, "feature");
David Sedlákd1144562019-08-06 12:36:14 +02002206 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2207 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2208 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002209 lysp_node_free(st->ctx, siblings);
2210 siblings = NULL;
2211
2212 /* min subelems */
2213 node_meta.parent = (void *)0x10;
2214 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
2215 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2216 parsed = (struct lysp_node_anydata *)siblings;
2217 assert_ptr_equal(parsed->parent, node_meta.parent);
2218 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
2219 assert_null(parsed->next);
2220 assert_null(parsed->exts);
2221 lysp_node_free(st->ctx, siblings);
2222
2223 st->finished_correctly = true;
2224}
2225
David Sedlák203ca3a2019-07-18 15:26:25 +02002226static void
2227test_leaf_elem(void **state)
2228{
2229 struct state *st = *state;
2230 const char *data;
2231 struct lysp_node *siblings = NULL;
2232 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
2233 struct lysp_node_leaf *parsed = NULL;
2234
2235 /* max elements */
2236 data = ELEMENT_WRAPPER_START
2237 "<leaf name=\"leaf\">"
2238 "<config value=\"true\" />"
2239 "<default value=\"def-val\"/>"
2240 "<description><text>desc</text></description>"
2241 "<if-feature name=\"feature\" />"
2242 "<mandatory value=\"true\" />"
2243 "<must condition=\"must-cond\" />"
2244 "<reference><text>ref</text></reference>"
2245 "<status value=\"deprecated\"/>"
2246 "<type name=\"type\"/>"
2247 "<units name=\"uni\"/>"
2248 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002249 EXT_SUBELEM
David Sedlák203ca3a2019-07-18 15:26:25 +02002250 "</leaf>"
2251 ELEMENT_WRAPPER_END;
2252 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2253 parsed = (struct lysp_node_leaf *)siblings;
2254 assert_null(parsed->parent);
2255 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002256 assert_true(parsed->flags & LYS_CONFIG_W);
2257 assert_true(parsed->flags & LYS_MAND_TRUE);
2258 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02002259 assert_null(parsed->next);
2260 assert_string_equal(parsed->name, "leaf");
2261 assert_string_equal(parsed->dsc, "desc");
2262 assert_string_equal(parsed->ref, "ref");
2263 assert_string_equal(parsed->when->cond, "when-cond");
2264 assert_string_equal(*parsed->iffeatures, "feature");
David Sedlákd1144562019-08-06 12:36:14 +02002265 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2266 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2267 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák203ca3a2019-07-18 15:26:25 +02002268 assert_string_equal(parsed->musts->arg, "must-cond");
2269 assert_string_equal(parsed->type.name, "type");
2270 assert_string_equal(parsed->units, "uni");
2271 assert_string_equal(parsed->dflt, "def-val");
2272 lysp_node_free(st->ctx, siblings);
2273 siblings = NULL;
2274
2275 /* min elements */
2276 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
2277 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2278 parsed = (struct lysp_node_leaf *)siblings;
2279 assert_string_equal(parsed->name, "leaf");
2280 assert_string_equal(parsed->type.name, "type");
2281 lysp_node_free(st->ctx, siblings);
2282 siblings = NULL;
2283
2284 st->finished_correctly = true;
2285}
2286
David Sedlákc3da3ef2019-07-19 12:56:08 +02002287static void
2288test_leaf_list_elem(void **state)
2289{
2290 struct state *st = *state;
2291 const char *data;
2292 struct lysp_node *siblings = NULL;
2293 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
2294 struct lysp_node_leaflist *parsed = NULL;
2295
2296 data = ELEMENT_WRAPPER_START
2297 "<leaf-list name=\"llist\">"
2298 "<config value=\"true\" />"
2299 "<default value=\"def-val0\"/>"
2300 "<default value=\"def-val1\"/>"
2301 "<description><text>desc</text></description>"
2302 "<if-feature name=\"feature\"/>"
2303 "<max-elements value=\"5\"/>"
2304 "<must condition=\"must-cond\"/>"
2305 "<ordered-by value=\"user\" />"
2306 "<reference><text>ref</text></reference>"
2307 "<status value=\"current\"/>"
2308 "<type name=\"type\"/>"
2309 "<units name=\"uni\"/>"
2310 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002311 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002312 "</leaf-list>"
2313 ELEMENT_WRAPPER_END;
2314 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2315 parsed = (struct lysp_node_leaflist *)siblings;
2316 assert_string_equal(parsed->dflts[0], "def-val0");
2317 assert_string_equal(parsed->dflts[1], "def-val1");
2318 assert_string_equal(parsed->dsc, "desc");
2319 assert_string_equal(*parsed->iffeatures, "feature");
2320 assert_int_equal(parsed->max, 5);
2321 assert_string_equal(parsed->musts->arg, "must-cond");
2322 assert_string_equal(parsed->name, "llist");
2323 assert_null(parsed->next);
2324 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2325 assert_null(parsed->parent);
2326 assert_string_equal(parsed->ref, "ref");
2327 assert_string_equal(parsed->type.name, "type");
2328 assert_string_equal(parsed->units, "uni");
2329 assert_string_equal(parsed->when->cond, "when-cond");
2330 assert_true(parsed->flags & LYS_CONFIG_W);
2331 assert_true(parsed->flags & LYS_ORDBY_USER);
2332 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedlákd1144562019-08-06 12:36:14 +02002333 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2334 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2335 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002336 lysp_node_free(st->ctx, siblings);
2337 siblings = NULL;
2338
2339 data = ELEMENT_WRAPPER_START
2340 "<leaf-list name=\"llist\">"
2341 "<config value=\"true\" />"
2342 "<description><text>desc</text></description>"
2343 "<if-feature name=\"feature\"/>"
2344 "<min-elements value=\"5\"/>"
2345 "<must condition=\"must-cond\"/>"
2346 "<ordered-by value=\"user\" />"
2347 "<reference><text>ref</text></reference>"
2348 "<status value=\"current\"/>"
2349 "<type name=\"type\"/>"
2350 "<units name=\"uni\"/>"
2351 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002352 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002353 "</leaf-list>"
2354 ELEMENT_WRAPPER_END;
2355 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2356 parsed = (struct lysp_node_leaflist *)siblings;
2357 assert_string_equal(parsed->dsc, "desc");
2358 assert_string_equal(*parsed->iffeatures, "feature");
2359 assert_int_equal(parsed->min, 5);
2360 assert_string_equal(parsed->musts->arg, "must-cond");
2361 assert_string_equal(parsed->name, "llist");
2362 assert_null(parsed->next);
2363 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2364 assert_null(parsed->parent);
2365 assert_string_equal(parsed->ref, "ref");
2366 assert_string_equal(parsed->type.name, "type");
2367 assert_string_equal(parsed->units, "uni");
2368 assert_string_equal(parsed->when->cond, "when-cond");
2369 assert_true(parsed->flags & LYS_CONFIG_W);
2370 assert_true(parsed->flags & LYS_ORDBY_USER);
2371 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedlákd1144562019-08-06 12:36:14 +02002372 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2373 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2374 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002375 lysp_node_free(st->ctx, siblings);
2376 siblings = NULL;
2377
2378 data = ELEMENT_WRAPPER_START
2379 "<leaf-list name=\"llist\">"
2380 "<config value=\"true\" />"
2381 "<description><text>desc</text></description>"
2382 "<if-feature name=\"feature\"/>"
2383 "<max-elements value=\"15\"/>"
2384 "<min-elements value=\"5\"/>"
2385 "<must condition=\"must-cond\"/>"
2386 "<ordered-by value=\"user\" />"
2387 "<reference><text>ref</text></reference>"
2388 "<status value=\"current\"/>"
2389 "<type name=\"type\"/>"
2390 "<units name=\"uni\"/>"
2391 "<when condition=\"when-cond\"/>"
2392 "</leaf-list>"
2393 ELEMENT_WRAPPER_END;
2394 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2395 parsed = (struct lysp_node_leaflist *)siblings;
2396 assert_string_equal(parsed->dsc, "desc");
2397 assert_string_equal(*parsed->iffeatures, "feature");
2398 assert_int_equal(parsed->min, 5);
2399 assert_int_equal(parsed->max, 15);
2400 assert_string_equal(parsed->musts->arg, "must-cond");
2401 assert_string_equal(parsed->name, "llist");
2402 assert_null(parsed->next);
2403 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2404 assert_null(parsed->parent);
2405 assert_string_equal(parsed->ref, "ref");
2406 assert_string_equal(parsed->type.name, "type");
2407 assert_string_equal(parsed->units, "uni");
2408 assert_string_equal(parsed->when->cond, "when-cond");
2409 assert_true(parsed->flags & LYS_CONFIG_W);
2410 assert_true(parsed->flags & LYS_ORDBY_USER);
2411 assert_true(parsed->flags & LYS_STATUS_CURR);
2412 lysp_node_free(st->ctx, siblings);
2413 siblings = NULL;
2414
2415 data = ELEMENT_WRAPPER_START
2416 "<leaf-list name=\"llist\">"
2417 "<type name=\"type\"/>"
2418 "</leaf-list>"
2419 ELEMENT_WRAPPER_END;
2420 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2421 parsed = (struct lysp_node_leaflist *)siblings;
2422 assert_string_equal(parsed->name, "llist");
2423 assert_string_equal(parsed->type.name, "type");
2424 lysp_node_free(st->ctx, siblings);
2425 siblings = NULL;
2426
2427 /* invalid combinations */
2428 data = ELEMENT_WRAPPER_START
2429 "<leaf-list name=\"llist\">"
2430 "<max-elements value=\"5\"/>"
2431 "<min-elements value=\"15\"/>"
2432 "<type name=\"type\"/>"
2433 "</leaf-list>"
2434 ELEMENT_WRAPPER_END;
2435 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2436 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2437 lysp_node_free(st->ctx, siblings);
2438 siblings = NULL;
2439
2440 data = ELEMENT_WRAPPER_START
2441 "<leaf-list name=\"llist\">"
2442 "<default value=\"def-val1\"/>"
2443 "<min-elements value=\"15\"/>"
2444 "<type name=\"type\"/>"
2445 "</leaf-list>"
2446 ELEMENT_WRAPPER_END;
2447 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2448 logbuf_assert("Invalid combination of keywords \"min-elements\" and \"default\" as substatements of \"leaf-list\". Line number 1.");
2449 lysp_node_free(st->ctx, siblings);
2450 siblings = NULL;
2451
2452 data = ELEMENT_WRAPPER_START
2453 "<leaf-list name=\"llist\">"
2454 "</leaf-list>"
2455 ELEMENT_WRAPPER_END;
2456 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2457 logbuf_assert("Missing mandatory subelement type of leaf-list element. Line number 1.");
2458 lysp_node_free(st->ctx, siblings);
2459 siblings = NULL;
2460
2461 st->finished_correctly = true;
2462}
2463
David Sedlákcb39f642019-07-19 13:19:55 +02002464static void
2465test_presence_elem(void **state)
2466{
2467 struct state *st = *state;
2468 const char *data;
2469 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002470 struct lysp_ext_instance *exts = NULL;
2471
2472 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\">"EXT_SUBELEM"</presence>" ELEMENT_WRAPPER_END;
2473 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
2474 assert_string_equal(val, "presence-val");
2475 assert_string_equal(exts[0].name, "myext:c-define");
2476 assert_int_equal(exts[0].insubstmt_index, 0);
2477 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PRESENCE);
2478 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2479 FREE_STRING(st->ctx, val);
David Sedlákcb39f642019-07-19 13:19:55 +02002480
2481 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
2482 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2483 assert_string_equal(val, "presence-val");
2484 FREE_STRING(st->ctx, val);
2485
2486 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
2487 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2488 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2489
2490 st->finished_correctly = true;
2491}
2492
David Sedlák12470a82019-07-19 13:44:36 +02002493static void
2494test_key_elem(void **state)
2495{
2496 struct state *st = *state;
2497 const char *data;
2498 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002499 struct lysp_ext_instance *exts = NULL;
2500
2501 data = ELEMENT_WRAPPER_START "<key value=\"key-value\">"EXT_SUBELEM"</key>" ELEMENT_WRAPPER_END;
2502 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
2503 assert_string_equal(val, "key-value");
2504 assert_string_equal(exts[0].name, "myext:c-define");
2505 assert_int_equal(exts[0].insubstmt_index, 0);
2506 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_KEY);
2507 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2508 FREE_STRING(st->ctx, val);
David Sedlák12470a82019-07-19 13:44:36 +02002509
2510 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
2511 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2512 assert_string_equal(val, "key-value");
2513 FREE_STRING(st->ctx, val);
2514
2515 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
2516 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2517 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2518
2519 st->finished_correctly = true;
2520}
2521
David Sedlák04e17b22019-07-19 15:29:48 +02002522static void
2523test_typedef_elem(void **state)
2524{
2525 struct state *st = *state;
2526 const char *data;
2527 struct lysp_tpdf *tpdfs = NULL;
2528 struct typedef_meta typdef_meta = {NULL, &tpdfs};
2529
2530 data = ELEMENT_WRAPPER_START
2531 "<typedef name=\"tpdf-name\">"
2532 "<default value=\"def-val\"/>"
2533 "<description><text>desc-text</text></description>"
2534 "<reference><text>ref-text</text></reference>"
2535 "<status value=\"current\"/>"
2536 "<type name=\"type\"/>"
2537 "<units name=\"uni\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002538 EXT_SUBELEM
David Sedlák04e17b22019-07-19 15:29:48 +02002539 "</typedef>"
2540 ELEMENT_WRAPPER_END;
2541 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2542 assert_string_equal(tpdfs[0].dflt, "def-val");
2543 assert_string_equal(tpdfs[0].dsc, "desc-text");
David Sedlák04e17b22019-07-19 15:29:48 +02002544 assert_string_equal(tpdfs[0].name, "tpdf-name");
2545 assert_string_equal(tpdfs[0].ref, "ref-text");
2546 assert_string_equal(tpdfs[0].type.name, "type");
2547 assert_string_equal(tpdfs[0].units, "uni");
2548 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
David Sedlákd1144562019-08-06 12:36:14 +02002549 assert_string_equal(tpdfs[0].exts[0].name, "myext:c-define");
2550 assert_int_equal(tpdfs[0].exts[0].insubstmt_index, 0);
2551 assert_int_equal(tpdfs[0].exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák04e17b22019-07-19 15:29:48 +02002552 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2553 tpdfs = NULL;
2554
2555 data = ELEMENT_WRAPPER_START
2556 "<typedef name=\"tpdf-name\">"
2557 "<type name=\"type\"/>"
2558 "</typedef>"
2559 ELEMENT_WRAPPER_END;
2560 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2561 assert_string_equal(tpdfs[0].name, "tpdf-name");
2562 assert_string_equal(tpdfs[0].type.name, "type");
2563 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2564 tpdfs = NULL;
2565
2566 st->finished_correctly = true;
2567}
2568
David Sedlákd2d676a2019-07-22 11:28:19 +02002569static void
2570test_refine_elem(void **state)
2571{
2572 struct state *st = *state;
2573 const char *data;
2574 struct lysp_refine *refines = NULL;
2575
2576 /* max subelems */
2577 data = ELEMENT_WRAPPER_START
2578 "<refine target-node=\"target\">"
2579 "<if-feature name=\"feature\" />"
2580 "<must condition=\"cond\" />"
2581 "<presence value=\"presence\" />"
2582 "<default value=\"def\" />"
2583 "<config value=\"true\" />"
2584 "<mandatory value=\"true\" />"
2585 "<min-elements value=\"10\" />"
2586 "<max-elements value=\"20\" />"
2587 "<description><text>desc</text></description>"
2588 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002589 EXT_SUBELEM
David Sedlákd2d676a2019-07-22 11:28:19 +02002590 "</refine>"
2591 ELEMENT_WRAPPER_END;
2592 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2593 assert_string_equal(refines->nodeid, "target");
2594 assert_string_equal(*refines->dflts, "def");
2595 assert_string_equal(refines->dsc, "desc");
David Sedlákd2d676a2019-07-22 11:28:19 +02002596 assert_true(refines->flags & LYS_CONFIG_W);
2597 assert_true(refines->flags & LYS_MAND_TRUE);
2598 assert_string_equal(*refines->iffeatures, "feature");
2599 assert_int_equal(refines->max, 20);
2600 assert_int_equal(refines->min, 10);
2601 assert_string_equal(refines->musts->arg, "cond");
2602 assert_string_equal(refines->presence, "presence");
2603 assert_string_equal(refines->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02002604 assert_string_equal(refines->exts[0].name, "myext:c-define");
2605 assert_int_equal(refines->exts[0].insubstmt_index, 0);
2606 assert_int_equal(refines->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákd2d676a2019-07-22 11:28:19 +02002607 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2608 refines = NULL;
2609
2610 /* min subelems */
2611 data = ELEMENT_WRAPPER_START "<refine target-node=\"target\" />" ELEMENT_WRAPPER_END;
2612 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2613 assert_string_equal(refines->nodeid, "target");
2614 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2615 refines = NULL;
2616
2617 st->finished_correctly = true;
2618}
2619
David Sedlák0d6de5a2019-07-22 13:25:44 +02002620static void
2621test_uses_elem(void **state)
2622{
2623 struct state *st = *state;
2624 const char *data;
2625 struct lysp_node *siblings = NULL;
2626 struct tree_node_meta node_meta = {NULL, &siblings};
2627 struct lysp_node_uses *parsed = NULL;
2628
2629 /* max subelems */
2630 data = ELEMENT_WRAPPER_START
2631 "<uses name=\"uses-name\">"
2632 "<when condition=\"cond\" />"
2633 "<if-feature name=\"feature\" />"
2634 "<status value=\"obsolete\" />"
2635 "<description><text>desc</text></description>"
2636 "<reference><text>ref</text></reference>"
2637 "<refine target-node=\"target\"/>"
David Sedlák992fb7c2019-07-24 16:51:01 +02002638 "<augment target-node=\"target\" />"
David Sedlákd1144562019-08-06 12:36:14 +02002639 EXT_SUBELEM
David Sedlák0d6de5a2019-07-22 13:25:44 +02002640 "</uses>"
2641 ELEMENT_WRAPPER_END;
2642 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2643 parsed = (struct lysp_node_uses *)&siblings[0];
2644 assert_string_equal(parsed->name, "uses-name");
2645 assert_string_equal(parsed->dsc, "desc");
David Sedlák0d6de5a2019-07-22 13:25:44 +02002646 assert_true(parsed->flags & LYS_STATUS_OBSLT);
2647 assert_string_equal(*parsed->iffeatures, "feature");
2648 assert_null(parsed->next);
2649 assert_int_equal(parsed->nodetype, LYS_USES);
2650 assert_null(parsed->parent);
2651 assert_string_equal(parsed->ref, "ref");
2652 assert_string_equal(parsed->refines->nodeid, "target");
2653 assert_string_equal(parsed->when->cond, "cond");
David Sedlák992fb7c2019-07-24 16:51:01 +02002654 assert_string_equal(parsed->augments->nodeid, "target");
David Sedlákd1144562019-08-06 12:36:14 +02002655 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2656 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2657 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002658 lysp_node_free(st->ctx, siblings);
2659 siblings = NULL;
2660
2661 /* min subelems */
2662 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
2663 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2664 assert_string_equal(siblings[0].name, "uses-name");
2665 lysp_node_free(st->ctx, siblings);
2666 siblings = NULL;
2667
2668 st->finished_correctly = true;
2669}
2670
David Sedlákaa854b02019-07-22 14:17:10 +02002671static void
2672test_revision_elem(void **state)
2673{
2674 struct state *st = *state;
2675 const char *data;
2676 struct lysp_revision *revs = NULL;
2677
2678 /* max subelems */
2679 data = ELEMENT_WRAPPER_START
2680 "<revision date=\"2018-12-25\">"
2681 "<description><text>desc</text></description>"
2682 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002683 EXT_SUBELEM
David Sedlákaa854b02019-07-22 14:17:10 +02002684 "</revision>"
2685 ELEMENT_WRAPPER_END;
2686 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2687 assert_string_equal(revs->date, "2018-12-25");
2688 assert_string_equal(revs->dsc, "desc");
2689 assert_string_equal(revs->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02002690 assert_string_equal(revs->exts[0].name, "myext:c-define");
2691 assert_int_equal(revs->exts[0].insubstmt_index, 0);
2692 assert_int_equal(revs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaa854b02019-07-22 14:17:10 +02002693 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2694 revs = NULL;
2695
2696 /* min subelems */
2697 data = ELEMENT_WRAPPER_START "<revision date=\"2005-05-05\" />" ELEMENT_WRAPPER_END;
2698 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2699 assert_string_equal(revs->date, "2005-05-05");
2700 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2701 revs = NULL;
2702
2703 /* invalid value */
2704 data = ELEMENT_WRAPPER_START "<revision date=\"05-05-2005\" />" ELEMENT_WRAPPER_END;
2705 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, false), LY_EVALID);
2706 logbuf_assert("Invalid value \"05-05-2005\" of \"revision\". Line number 1.");
2707 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2708 revs = NULL;
2709
2710 st->finished_correctly = true;
2711}
2712
David Sedlák0c2bab92019-07-22 15:33:19 +02002713static void
2714test_include_elem(void **state)
2715{
2716 struct state *st = *state;
2717 const char *data;
2718 struct lysp_include *includes = NULL;
2719 struct include_meta inc_meta = {"module-name", &includes};
2720
2721 /* max subelems */
2722 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2723 data = ELEMENT_WRAPPER_START
2724 "<include module=\"mod\">"
2725 "<description><text>desc</text></description>"
2726 "<reference><text>ref</text></reference>"
2727 "<revision-date date=\"1999-09-09\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002728 EXT_SUBELEM
David Sedlák0c2bab92019-07-22 15:33:19 +02002729 "</include>"
2730 ELEMENT_WRAPPER_END;
2731 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, true), LY_SUCCESS);
2732 assert_string_equal(includes->name, "mod");
2733 assert_string_equal(includes->dsc, "desc");
2734 assert_string_equal(includes->ref, "ref");
David Sedlák0c2bab92019-07-22 15:33:19 +02002735 assert_string_equal(includes->rev, "1999-09-09");
David Sedlákd1144562019-08-06 12:36:14 +02002736 assert_string_equal(includes->exts[0].name, "myext:c-define");
2737 assert_int_equal(includes->exts[0].insubstmt_index, 0);
2738 assert_int_equal(includes->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0c2bab92019-07-22 15:33:19 +02002739 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2740 includes = NULL;
2741
2742 /* min subelems */
2743 data = ELEMENT_WRAPPER_START "<include module=\"mod\"/>" ELEMENT_WRAPPER_END;
2744 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, true), LY_SUCCESS);
2745 assert_string_equal(includes->name, "mod");
2746 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2747 includes = NULL;
2748
2749 /* invalid combinations */
2750 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2751 data = ELEMENT_WRAPPER_START
2752 "<include module=\"mod\">"
2753 "<description><text>desc</text></description>"
2754 "<revision-date date=\"1999-09-09\"/>"
2755 "</include>"
2756 ELEMENT_WRAPPER_END;
2757 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, false), LY_EVALID);
2758 logbuf_assert("Invalid sub-elemnt \"description\" of \"include\" element - this sub-element is allowed only in modules with version 1.1 or newer. Line number 1.");
2759 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2760 includes = NULL;
2761
2762 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2763 data = ELEMENT_WRAPPER_START
2764 "<include module=\"mod\">"
2765 "<reference><text>ref</text></reference>"
2766 "<revision-date date=\"1999-09-09\"/>"
2767 "</include>"
2768 ELEMENT_WRAPPER_END;
2769 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, false), LY_EVALID);
2770 logbuf_assert("Invalid sub-elemnt \"reference\" of \"include\" element - this sub-element is allowed only in modules with version 1.1 or newer. Line number 1.");
2771 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2772 includes = NULL;
2773
2774 st->finished_correctly = true;
2775}
2776
David Sedlák5e13dea2019-07-22 16:06:45 +02002777static void
2778test_feature_elem(void **state)
2779{
2780 struct state *st = *state;
2781 const char *data;
2782 struct lysp_feature *features = NULL;
2783
2784 /* max subelems */
2785 data = ELEMENT_WRAPPER_START
2786 "<feature name=\"feature-name\">"
2787 "<if-feature name=\"iff\"/>"
2788 "<status value=\"deprecated\"/>"
2789 "<description><text>desc</text></description>"
2790 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002791 EXT_SUBELEM
David Sedlák5e13dea2019-07-22 16:06:45 +02002792 "</feature>"
2793 ELEMENT_WRAPPER_END;
2794 assert_int_equal(test_element_helper(st, &data, &features, NULL, NULL, true), LY_SUCCESS);
2795 assert_string_equal(features->name, "feature-name");
2796 assert_string_equal(features->dsc, "desc");
David Sedlák5e13dea2019-07-22 16:06:45 +02002797 assert_true(features->flags & LYS_STATUS_DEPRC);
2798 assert_string_equal(*features->iffeatures, "iff");
2799 assert_string_equal(features->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02002800 assert_string_equal(features->exts[0].name, "myext:c-define");
2801 assert_int_equal(features->exts[0].insubstmt_index, 0);
2802 assert_int_equal(features->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák5e13dea2019-07-22 16:06:45 +02002803 FREE_ARRAY(st->ctx, features, lysp_feature_free);
2804 features = NULL;
2805
2806 /* min subelems */
2807 data = ELEMENT_WRAPPER_START "<feature name=\"feature-name\"/>" ELEMENT_WRAPPER_END;
2808 assert_int_equal(test_element_helper(st, &data, &features, NULL, NULL, true), LY_SUCCESS);
2809 assert_string_equal(features->name, "feature-name");
2810 FREE_ARRAY(st->ctx, features, lysp_feature_free);
2811 features = NULL;
2812
2813 st->finished_correctly = true;
2814}
2815
David Sedlák28794f22019-07-22 16:45:00 +02002816static void
2817test_identity_elem(void **state)
2818{
2819 struct state *st = *state;
2820 const char *data;
2821 struct lysp_ident *identities = NULL;
2822
2823 /* max subelems */
2824 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2825 data = ELEMENT_WRAPPER_START
2826 "<identity name=\"ident-name\">"
2827 "<if-feature name=\"iff\"/>"
2828 "<base name=\"base-name\"/>"
2829 "<status value=\"deprecated\"/>"
2830 "<description><text>desc</text></description>"
2831 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002832 EXT_SUBELEM
David Sedlák28794f22019-07-22 16:45:00 +02002833 "</identity>"
2834 ELEMENT_WRAPPER_END;
2835 assert_int_equal(test_element_helper(st, &data, &identities, NULL, NULL, true), LY_SUCCESS);
2836 assert_string_equal(identities->name, "ident-name");
2837 assert_string_equal(*identities->bases, "base-name");
2838 assert_string_equal(*identities->iffeatures, "iff");
2839 assert_string_equal(identities->dsc, "desc");
2840 assert_string_equal(identities->ref, "ref");
2841 assert_true(identities->flags & LYS_STATUS_DEPRC);
David Sedlákd1144562019-08-06 12:36:14 +02002842 assert_string_equal(identities->exts[0].name, "myext:c-define");
2843 assert_int_equal(identities->exts[0].insubstmt_index, 0);
2844 assert_int_equal(identities->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák28794f22019-07-22 16:45:00 +02002845 FREE_ARRAY(st->ctx, identities, lysp_ident_free);
2846 identities = NULL;
2847
2848 /* min subelems */
2849 data = ELEMENT_WRAPPER_START "<identity name=\"ident-name\" />" ELEMENT_WRAPPER_END;
2850 assert_int_equal(test_element_helper(st, &data, &identities, NULL, NULL, true), LY_SUCCESS);
2851 assert_string_equal(identities->name, "ident-name");
2852 FREE_ARRAY(st->ctx, identities, lysp_ident_free);
2853 identities = NULL;
2854
2855 /* invalid */
2856 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2857 data = ELEMENT_WRAPPER_START
2858 "<identity name=\"ident-name\">"
2859 "<if-feature name=\"iff\"/>"
2860 "</identity>"
2861 ELEMENT_WRAPPER_END;
2862 assert_int_equal(test_element_helper(st, &data, &identities, NULL, NULL, false), LY_EVALID);
2863 logbuf_assert("Invalid sub-elemnt \"if-feature\" of \"identity\" element - this sub-element is allowed only in modules with version 1.1 or newer. Line number 1.");
2864 FREE_ARRAY(st->ctx, identities, lysp_ident_free);
2865 identities = NULL;
2866
2867 st->finished_correctly = true;
2868}
2869
David Sedlákaf536aa2019-07-23 13:42:23 +02002870static void
2871test_list_elem(void **state)
2872{
2873 struct state *st = *state;
2874 const char *data;
2875 struct lysp_node *siblings = NULL;
2876 struct tree_node_meta node_meta = {NULL, &siblings};
2877 struct lysp_node_list *parsed = NULL;
2878
2879 /* max subelems */
2880 data = ELEMENT_WRAPPER_START
2881 "<list name=\"list-name\">"
2882 "<when condition=\"when\"/>"
2883 "<if-feature name=\"iff\"/>"
2884 "<must condition=\"must-cond\"/>"
2885 "<key value=\"key\"/>"
2886 "<unique tag=\"utag\"/>"
2887 "<config value=\"true\"/>"
2888 "<min-elements value=\"10\"/>"
2889 "<ordered-by value=\"user\"/>"
2890 "<status value=\"deprecated\"/>"
2891 "<description><text>desc</text></description>"
2892 "<reference><text>ref</text></reference>"
2893 "<anydata name=\"anyd\"/>"
2894 "<anyxml name=\"anyx\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002895 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002896 "<choice name=\"choice\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02002897 "<action name=\"action\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002898 "<grouping name=\"grp\"/>"
David Sedlák031b9e72019-07-23 15:19:37 +02002899 "<notification name=\"notf\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002900 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2901 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002902 "<list name=\"sub-list\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002903 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002904 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002905 EXT_SUBELEM
David Sedlákaf536aa2019-07-23 13:42:23 +02002906 "</list>"
2907 ELEMENT_WRAPPER_END;
2908 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2909 parsed = (struct lysp_node_list *)&siblings[0];
2910 assert_string_equal(parsed->dsc, "desc");
2911 assert_string_equal(parsed->child->name, "anyd");
2912 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2913 assert_string_equal(parsed->child->next->name, "anyx");
2914 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
David Sedlákf111bcb2019-07-23 17:15:51 +02002915 assert_string_equal(parsed->child->next->next->name, "cont");
2916 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002917 assert_string_equal(parsed->child->next->next->next->name, "choice");
2918 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
David Sedlák85d0eca2019-07-24 15:15:21 +02002919 assert_string_equal(parsed->child->next->next->next->next->name, "leaf");
2920 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAF);
2921 assert_string_equal(parsed->child->next->next->next->next->next->name, "llist");
2922 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2923 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "sub-list");
2924 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LIST);
2925 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "uses-name");
2926 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2927 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002928 assert_string_equal(parsed->groupings->name, "grp");
David Sedlák85d0eca2019-07-24 15:15:21 +02002929 assert_string_equal(parsed->actions->name, "action");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002930 assert_int_equal(parsed->groupings->nodetype, LYS_GROUPING);
David Sedlák031b9e72019-07-23 15:19:37 +02002931 assert_string_equal(parsed->notifs->name, "notf");
David Sedlákaf536aa2019-07-23 13:42:23 +02002932 assert_true(parsed->flags & LYS_ORDBY_USER);
2933 assert_true(parsed->flags & LYS_STATUS_DEPRC);
2934 assert_true(parsed->flags & LYS_CONFIG_W);
2935 assert_string_equal(*parsed->iffeatures, "iff");
2936 assert_string_equal(parsed->key, "key");
2937 assert_int_equal(parsed->min, 10);
2938 assert_string_equal(parsed->musts->arg, "must-cond");
2939 assert_string_equal(parsed->name, "list-name");
2940 assert_null(parsed->next);
2941 assert_int_equal(parsed->nodetype, LYS_LIST);
2942 assert_null(parsed->parent);
2943 assert_string_equal(parsed->ref, "ref");
2944 assert_string_equal(parsed->typedefs->name, "tpdf");
2945 assert_string_equal(*parsed->uniques, "utag");
2946 assert_string_equal(parsed->when->cond, "when");
David Sedlákd1144562019-08-06 12:36:14 +02002947 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2948 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2949 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaf536aa2019-07-23 13:42:23 +02002950 lysp_node_free(st->ctx, siblings);
2951 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
2952 siblings = NULL;
2953
2954 /* min subelems */
2955 data = ELEMENT_WRAPPER_START "<list name=\"list-name\" />" ELEMENT_WRAPPER_END;
2956 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2957 parsed = (struct lysp_node_list *)&siblings[0];
2958 assert_string_equal(parsed->name, "list-name");
2959 lysp_node_free(st->ctx, siblings);
2960 siblings = NULL;
2961
2962 st->finished_correctly = true;
2963}
2964
David Sedlák031b9e72019-07-23 15:19:37 +02002965static void
2966test_notification_elem(void **state)
2967{
2968 struct state *st = *state;
2969 const char *data;
2970 struct lysp_notif *notifs = NULL;
2971 struct notif_meta notif_meta = {NULL, &notifs};
2972
2973 /* max subelems */
2974 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2975 data = ELEMENT_WRAPPER_START
2976 "<notification name=\"notif-name\">"
2977 "<anydata name=\"anyd\"/>"
2978 "<anyxml name=\"anyx\"/>"
2979 "<description><text>desc</text></description>"
2980 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002981 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2982 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák031b9e72019-07-23 15:19:37 +02002983 "<list name=\"sub-list\"/>"
2984 "<must condition=\"cond\"/>"
2985 "<reference><text>ref</text></reference>"
2986 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002987 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák031b9e72019-07-23 15:19:37 +02002988 "<uses name=\"uses-name\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002989 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002990 "<choice name=\"choice\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002991 "<grouping name=\"grp\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002992 EXT_SUBELEM
David Sedlák031b9e72019-07-23 15:19:37 +02002993 "</notification>"
2994 ELEMENT_WRAPPER_END;
2995 assert_int_equal(test_element_helper(st, &data, &notif_meta, NULL, NULL, true), LY_SUCCESS);
2996 assert_string_equal(notifs->name, "notif-name");
2997 assert_string_equal(notifs->data->name, "anyd");
2998 assert_int_equal(notifs->data->nodetype, LYS_ANYDATA);
2999 assert_string_equal(notifs->data->next->name, "anyx");
3000 assert_int_equal(notifs->data->next->nodetype, LYS_ANYXML);
3001 assert_string_equal(notifs->data->next->next->name, "leaf");
3002 assert_int_equal(notifs->data->next->next->nodetype, LYS_LEAF);
3003 assert_string_equal(notifs->data->next->next->next->name, "llist");
3004 assert_int_equal(notifs->data->next->next->next->nodetype, LYS_LEAFLIST);
3005 assert_string_equal(notifs->data->next->next->next->next->name, "sub-list");
3006 assert_int_equal(notifs->data->next->next->next->next->nodetype, LYS_LIST);
David Sedlák031b9e72019-07-23 15:19:37 +02003007 assert_true(notifs->flags & LYS_STATUS_DEPRC);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003008 assert_string_equal(notifs->groupings->name, "grp");
3009 assert_int_equal(notifs->groupings->nodetype, LYS_GROUPING);
David Sedlákf111bcb2019-07-23 17:15:51 +02003010 assert_string_equal(notifs->data->next->next->next->next->next->name, "uses-name");
3011 assert_int_equal(notifs->data->next->next->next->next->next->nodetype, LYS_USES);
3012 assert_string_equal(notifs->data->next->next->next->next->next->next->name, "cont");
3013 assert_int_equal(notifs->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003014 assert_int_equal(notifs->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3015 assert_string_equal(notifs->data->next->next->next->next->next->next->next->name, "choice");
3016 assert_null(notifs->data->next->next->next->next->next->next->next->next);
David Sedlák031b9e72019-07-23 15:19:37 +02003017 assert_string_equal(*notifs->iffeatures, "iff");
3018 assert_string_equal(notifs->musts->arg, "cond");
3019 assert_int_equal(notifs->nodetype, LYS_NOTIF);
3020 assert_null(notifs->parent);
3021 assert_string_equal(notifs->ref, "ref");
3022 assert_string_equal(notifs->typedefs->name, "tpdf");
David Sedlákd1144562019-08-06 12:36:14 +02003023 assert_string_equal(notifs->exts[0].name, "myext:c-define");
3024 assert_int_equal(notifs->exts[0].insubstmt_index, 0);
3025 assert_int_equal(notifs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák031b9e72019-07-23 15:19:37 +02003026 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
3027 notifs = NULL;
3028
3029 /* min subelems */
3030 data = ELEMENT_WRAPPER_START "<notification name=\"notif-name\" />" ELEMENT_WRAPPER_END;
3031 assert_int_equal(test_element_helper(st, &data, &notif_meta, NULL, NULL, true), LY_SUCCESS);
3032 assert_string_equal(notifs->name, "notif-name");
3033 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003034 notifs = NULL;
3035
3036 st->finished_correctly = true;
3037}
3038
3039static void
3040test_grouping_elem(void **state)
3041{
3042 struct state *st = *state;
3043 const char *data;
3044 struct lysp_grp *grps = NULL;
3045 struct grouping_meta grp_meta = {NULL, &grps};
3046
3047 /* max subelems */
3048 data = ELEMENT_WRAPPER_START
3049 "<grouping name=\"grp-name\">"
3050 "<anydata name=\"anyd\"/>"
3051 "<anyxml name=\"anyx\"/>"
3052 "<description><text>desc</text></description>"
3053 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003054 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3055 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003056 "<list name=\"list\"/>"
3057 "<notification name=\"notf\"/>"
3058 "<reference><text>ref</text></reference>"
3059 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003060 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003061 "<uses name=\"uses-name\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003062 "<action name=\"act\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02003063 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003064 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003065 EXT_SUBELEM
David Sedláke3ce9ef2019-07-23 16:34:30 +02003066 "</grouping>"
3067 ELEMENT_WRAPPER_END;
3068 assert_int_equal(test_element_helper(st, &data, &grp_meta, NULL, NULL, true), LY_SUCCESS);
3069 assert_string_equal(grps->name, "grp-name");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003070 assert_string_equal(grps->data->name, "anyd");
3071 assert_string_equal(grps->data->next->name, "anyx");
3072 assert_string_equal(grps->data->next->next->name, "leaf");
3073 assert_string_equal(grps->data->next->next->next->name, "llist");
3074 assert_string_equal(grps->data->next->next->next->next->name, "list");
3075 assert_string_equal(grps->dsc, "desc");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003076 assert_true(grps->flags & LYS_STATUS_CURR);
3077 assert_string_equal(grps->groupings->name, "sub-grp");
3078 assert_int_equal(grps->nodetype, LYS_GROUPING);
3079 assert_string_equal(grps->notifs->name, "notf");
3080 assert_null(grps->parent);
3081 assert_string_equal(grps->ref, "ref");
3082 assert_string_equal(grps->typedefs->name, "tpdf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003083 assert_string_equal(grps->actions->name, "act");
David Sedlákf111bcb2019-07-23 17:15:51 +02003084 assert_string_equal(grps->data->next->next->next->next->next->name, "uses-name");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003085 assert_int_equal(grps->data->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákf111bcb2019-07-23 17:15:51 +02003086 assert_string_equal(grps->data->next->next->next->next->next->next->name, "cont");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003087 assert_int_equal(grps->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
3088 assert_string_equal(grps->data->next->next->next->next->next->next->next->name, "choice");
3089 assert_int_equal(grps->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
David Sedlákd1144562019-08-06 12:36:14 +02003090 assert_string_equal(grps->exts[0].name, "myext:c-define");
3091 assert_int_equal(grps->exts[0].insubstmt_index, 0);
3092 assert_int_equal(grps->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003093 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3094 grps = NULL;
3095
3096 /* min subelems */
3097 data = ELEMENT_WRAPPER_START "<grouping name=\"grp-name\" />" ELEMENT_WRAPPER_END;
3098 assert_int_equal(test_element_helper(st, &data, &grp_meta, NULL, NULL, true), LY_SUCCESS);
3099 assert_string_equal(grps->name, "grp-name");
3100 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3101 grps = NULL;
David Sedlák031b9e72019-07-23 15:19:37 +02003102
3103 st->finished_correctly = true;
3104}
3105
David Sedlákf111bcb2019-07-23 17:15:51 +02003106static void
3107test_container_elem(void **state)
3108{
3109 struct state *st = *state;
3110 const char *data;
3111 struct lysp_node *siblings = NULL;
3112 struct tree_node_meta node_meta = {NULL, &siblings};
3113 struct lysp_node_container *parsed = NULL;
3114
3115 /* max subelems */
David Sedláke2dc9e92019-07-24 09:59:21 +02003116 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3117 data = ELEMENT_WRAPPER_START
3118 "<container name=\"cont-name\">"
3119 "<anydata name=\"anyd\"/>"
3120 "<anyxml name=\"anyx\"/>"
3121 "<config value=\"true\"/>"
3122 "<container name=\"subcont\"/>"
3123 "<description><text>desc</text></description>"
3124 "<grouping name=\"sub-grp\"/>"
3125 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003126 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3127 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003128 "<list name=\"list\"/>"
3129 "<must condition=\"cond\"/>"
3130 "<notification name=\"notf\"/>"
3131 "<presence value=\"presence\"/>"
3132 "<reference><text>ref</text></reference>"
3133 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003134 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003135 "<uses name=\"uses-name\"/>"
3136 "<when condition=\"when-cond\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003137 "<action name=\"act\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003138 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003139 EXT_SUBELEM
David Sedláke2dc9e92019-07-24 09:59:21 +02003140 "</container>"
3141 ELEMENT_WRAPPER_END;
3142 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3143 parsed = (struct lysp_node_container *)siblings;
3144 assert_string_equal(parsed->name, "cont-name");
3145 assert_null(parsed->parent);
3146 assert_int_equal(parsed->nodetype, LYS_CONTAINER);
3147 assert_true(parsed->flags & LYS_CONFIG_W);
3148 assert_true(parsed->flags & LYS_STATUS_CURR);
3149 assert_null(parsed->next);
3150 assert_string_equal(parsed->dsc, "desc");
3151 assert_string_equal(parsed->ref, "ref");
3152 assert_string_equal(parsed->when->cond, "when-cond");
3153 assert_string_equal(*parsed->iffeatures, "iff");
David Sedláke2dc9e92019-07-24 09:59:21 +02003154 assert_string_equal(parsed->musts->arg, "cond");
3155 assert_string_equal(parsed->presence, "presence");
3156 assert_string_equal(parsed->typedefs->name, "tpdf");
3157 assert_string_equal(parsed->groupings->name, "sub-grp");
3158 assert_string_equal(parsed->child->name, "anyd");
3159 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3160 assert_string_equal(parsed->child->next->name, "anyx");
3161 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3162 assert_string_equal(parsed->child->next->next->name, "subcont");
3163 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3164 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3165 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3166 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3167 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3168 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3169 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3170 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3171 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003172 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3173 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3174 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke2dc9e92019-07-24 09:59:21 +02003175 assert_string_equal(parsed->notifs->name, "notf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003176 assert_string_equal(parsed->actions->name, "act");
David Sedlákd1144562019-08-06 12:36:14 +02003177 assert_string_equal(parsed->exts[0].name, "myext:c-define");
3178 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3179 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke2dc9e92019-07-24 09:59:21 +02003180 lysp_node_free(st->ctx, siblings);
3181 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
3182 siblings = NULL;
David Sedlákf111bcb2019-07-23 17:15:51 +02003183
3184 /* min subelems */
3185 data = ELEMENT_WRAPPER_START "<container name=\"cont-name\" />" ELEMENT_WRAPPER_END;
3186 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3187 parsed = (struct lysp_node_container *)siblings;
3188 assert_string_equal(parsed->name, "cont-name");
3189 lysp_node_free(st->ctx, siblings);
3190 siblings = NULL;
3191
3192 st->finished_correctly = true;
3193}
3194
David Sedlák5379d392019-07-24 10:42:03 +02003195static void
3196test_case_elem(void **state)
3197{
3198 struct state *st = *state;
3199 const char *data;
3200 struct lysp_node *siblings = NULL;
3201 struct tree_node_meta node_meta = {NULL, &siblings};
3202 struct lysp_node_case *parsed = NULL;
3203
3204 /* max subelems */
3205 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3206 data = ELEMENT_WRAPPER_START
3207 "<case name=\"case-name\">"
3208 "<anydata name=\"anyd\"/>"
3209 "<anyxml name=\"anyx\"/>"
3210 "<container name=\"subcont\"/>"
3211 "<description><text>desc</text></description>"
3212 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003213 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3214 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák5379d392019-07-24 10:42:03 +02003215 "<list name=\"list\"/>"
3216 "<reference><text>ref</text></reference>"
3217 "<status value=\"current\"/>"
3218 "<uses name=\"uses-name\"/>"
3219 "<when condition=\"when-cond\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003220 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003221 EXT_SUBELEM
David Sedlák5379d392019-07-24 10:42:03 +02003222 "</case>"
3223 ELEMENT_WRAPPER_END;
3224 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3225 parsed = (struct lysp_node_case *)siblings;
3226 assert_string_equal(parsed->name, "case-name");
3227 assert_null(parsed->parent);
3228 assert_int_equal(parsed->nodetype, LYS_CASE);
3229 assert_true(parsed->flags & LYS_STATUS_CURR);
3230 assert_null(parsed->next);
3231 assert_string_equal(parsed->dsc, "desc");
3232 assert_string_equal(parsed->ref, "ref");
3233 assert_string_equal(parsed->when->cond, "when-cond");
3234 assert_string_equal(*parsed->iffeatures, "iff");
David Sedlák5379d392019-07-24 10:42:03 +02003235 assert_string_equal(parsed->child->name, "anyd");
3236 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3237 assert_string_equal(parsed->child->next->name, "anyx");
3238 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3239 assert_string_equal(parsed->child->next->next->name, "subcont");
3240 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3241 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3242 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3243 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3244 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3245 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3246 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3247 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3248 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003249 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3250 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3251 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003252 assert_string_equal(parsed->exts[0].name, "myext:c-define");
3253 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3254 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák5379d392019-07-24 10:42:03 +02003255 lysp_node_free(st->ctx, siblings);
3256 siblings = NULL;
3257
3258 /* min subelems */
3259 data = ELEMENT_WRAPPER_START "<case name=\"case-name\" />" ELEMENT_WRAPPER_END;
3260 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3261 parsed = (struct lysp_node_case *)siblings;
3262 assert_string_equal(parsed->name, "case-name");
3263 lysp_node_free(st->ctx, siblings);
3264 siblings = NULL;
3265
3266 st->finished_correctly = true;
3267}
3268
David Sedlákb7abcfa2019-07-24 12:33:35 +02003269static void
3270test_choice_elem(void **state)
3271{
3272 struct state *st = *state;
3273 const char *data;
3274 struct lysp_node *siblings = NULL;
3275 struct tree_node_meta node_meta = {NULL, &siblings};
3276 struct lysp_node_choice *parsed = NULL;
3277
3278 /* max subelems */
3279 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3280 data = ELEMENT_WRAPPER_START
3281 "<choice name=\"choice-name\">"
3282 "<anydata name=\"anyd\"/>"
3283 "<anyxml name=\"anyx\"/>"
3284 "<case name=\"sub-case\"/>"
3285 "<choice name=\"choice\"/>"
3286 "<config value=\"true\"/>"
3287 "<container name=\"subcont\"/>"
3288 "<default value=\"def\"/>"
3289 "<description><text>desc</text></description>"
3290 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003291 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3292 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003293 "<list name=\"list\"/>"
3294 "<mandatory value=\"true\" />"
3295 "<reference><text>ref</text></reference>"
3296 "<status value=\"current\"/>"
3297 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003298 EXT_SUBELEM
David Sedlákb7abcfa2019-07-24 12:33:35 +02003299 "</choice>"
3300 ELEMENT_WRAPPER_END;
3301 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3302 parsed = (struct lysp_node_choice *)siblings;
3303 assert_string_equal(parsed->name, "choice-name");
3304 assert_null(parsed->parent);
3305 assert_int_equal(parsed->nodetype, LYS_CHOICE);
3306 assert_true(parsed->flags & LYS_CONFIG_W && parsed->flags & LYS_MAND_TRUE && parsed->flags & LYS_STATUS_CURR);
3307 assert_null(parsed->next);
3308 assert_string_equal(parsed->dsc, "desc");
3309 assert_string_equal(parsed->ref, "ref");
3310 assert_string_equal(parsed->when->cond, "when-cond");
3311 assert_string_equal(*parsed->iffeatures, "iff");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003312 assert_string_equal(parsed->child->name, "anyd");
3313 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3314 assert_string_equal(parsed->child->next->name, "anyx");
3315 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3316 assert_string_equal(parsed->child->next->next->name, "sub-case");
3317 assert_int_equal(parsed->child->next->next->nodetype, LYS_CASE);
3318 assert_string_equal(parsed->child->next->next->next->name, "choice");
3319 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
3320 assert_string_equal(parsed->child->next->next->next->next->name, "subcont");
3321 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_CONTAINER);
3322 assert_string_equal(parsed->child->next->next->next->next->next->name, "leaf");
3323 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAF);
3324 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "llist");
3325 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3326 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "list");
3327 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3328 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003329 assert_string_equal(parsed->exts[0].name, "myext:c-define");
3330 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3331 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003332 lysp_node_free(st->ctx, siblings);
3333 siblings = NULL;
3334
3335 /* min subelems */
3336 data = ELEMENT_WRAPPER_START "<choice name=\"choice-name\" />" ELEMENT_WRAPPER_END;
3337 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3338 parsed = (struct lysp_node_choice *)siblings;
3339 assert_string_equal(parsed->name, "choice-name");
3340 lysp_node_free(st->ctx, siblings);
3341 siblings = NULL;
3342
3343 st->finished_correctly = true;
3344}
3345
David Sedlák05404f62019-07-24 14:11:53 +02003346static void
3347test_inout_elem(void **state)
3348{
3349 struct state *st = *state;
3350 const char *data;
3351 struct lysp_action_inout inout = {};
3352 struct inout_meta inout_meta = {NULL, &inout};
3353
3354 /* max subelements */
3355 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3356 data = ELEMENT_WRAPPER_START
3357 "<input>"
3358 "<anydata name=\"anyd\"/>"
3359 "<anyxml name=\"anyx\"/>"
3360 "<choice name=\"choice\"/>"
3361 "<container name=\"subcont\"/>"
3362 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003363 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3364 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003365 "<list name=\"list\"/>"
3366 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003367 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003368 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003369 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003370 "</input>"
3371 ELEMENT_WRAPPER_END;
3372 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3373 assert_null(inout.parent);
3374 assert_int_equal(inout.nodetype, LYS_INPUT);
3375 assert_string_equal(inout.musts->arg, "cond");
3376 assert_string_equal(inout.typedefs->name, "tpdf");
3377 assert_string_equal(inout.groupings->name, "sub-grp");
3378 assert_string_equal(inout.data->name, "anyd");
3379 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3380 assert_string_equal(inout.data->next->name, "anyx");
3381 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3382 assert_string_equal(inout.data->next->next->name, "choice");
3383 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3384 assert_string_equal(inout.data->next->next->next->name, "subcont");
3385 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3386 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3387 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3388 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3389 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3390 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3391 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3392 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3393 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3394 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003395 assert_string_equal(inout.exts[0].name, "myext:c-define");
3396 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3397 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003398 lysp_action_inout_free(st->ctx, &inout);
3399 memset(&inout, 0, sizeof inout);
3400
3401 /* max subelements */
3402 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3403 data = ELEMENT_WRAPPER_START
3404 "<output>"
3405 "<anydata name=\"anyd\"/>"
3406 "<anyxml name=\"anyx\"/>"
3407 "<choice name=\"choice\"/>"
3408 "<container name=\"subcont\"/>"
3409 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003410 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3411 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003412 "<list name=\"list\"/>"
3413 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003414 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003415 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003416 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003417 "</output>"
3418 ELEMENT_WRAPPER_END;
3419 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3420 assert_null(inout.parent);
3421 assert_int_equal(inout.nodetype, LYS_OUTPUT);
3422 assert_string_equal(inout.musts->arg, "cond");
3423 assert_string_equal(inout.typedefs->name, "tpdf");
3424 assert_string_equal(inout.groupings->name, "sub-grp");
3425 assert_string_equal(inout.data->name, "anyd");
3426 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3427 assert_string_equal(inout.data->next->name, "anyx");
3428 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3429 assert_string_equal(inout.data->next->next->name, "choice");
3430 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3431 assert_string_equal(inout.data->next->next->next->name, "subcont");
3432 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3433 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3434 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3435 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3436 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3437 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3438 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3439 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3440 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3441 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003442 assert_string_equal(inout.exts[0].name, "myext:c-define");
3443 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3444 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003445 lysp_action_inout_free(st->ctx, &inout);
3446 memset(&inout, 0, sizeof inout);
3447
3448 /* min subelems */
3449 data = ELEMENT_WRAPPER_START "<input />" ELEMENT_WRAPPER_END;
3450 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3451 memset(&inout, 0, sizeof inout);
3452
3453 data = ELEMENT_WRAPPER_START "<output />" ELEMENT_WRAPPER_END;
3454 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3455 memset(&inout, 0, sizeof inout);
3456
3457 /* invalid combinations */
3458 data = ELEMENT_WRAPPER_START "<input name=\"test\"/>" ELEMENT_WRAPPER_END;
3459 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, false), LY_EVALID);
3460 logbuf_assert("Unexpected attribute \"name\" of input element. Line number 1.");
3461 memset(&inout, 0, sizeof inout);
3462
3463 st->finished_correctly = true;
3464}
3465
David Sedlák85d0eca2019-07-24 15:15:21 +02003466static void
3467test_action_elem(void **state)
3468{
3469 struct state *st = *state;
3470 const char *data;
3471 struct lysp_action *actions = NULL;
3472 struct action_meta act_meta = {NULL, &actions};
3473
3474 /* max subelems */
3475 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3476 data = ELEMENT_WRAPPER_START
3477 "<action name=\"act\">"
3478 "<description><text>desc</text></description>"
3479 "<grouping name=\"grouping\"/>"
3480 "<if-feature name=\"iff\"/>"
3481 "<input><uses name=\"uses-name\"/></input>"
3482 "<output><must condition=\"cond\"/></output>"
3483 "<reference><text>ref</text></reference>"
3484 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003485 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003486 EXT_SUBELEM
David Sedlák85d0eca2019-07-24 15:15:21 +02003487 "</action>"
3488 ELEMENT_WRAPPER_END;
3489 assert_int_equal(test_element_helper(st, &data, &act_meta, NULL, NULL, true), LY_SUCCESS);
3490 assert_null(actions->parent);
3491 assert_int_equal(actions->nodetype, LYS_ACTION);
3492 assert_true(actions->flags & LYS_STATUS_DEPRC);
3493 assert_string_equal(actions->name, "act");
3494 assert_string_equal(actions->dsc, "desc");
3495 assert_string_equal(actions->ref, "ref");
3496 assert_string_equal(*actions->iffeatures, "iff");
3497 assert_string_equal(actions->typedefs->name, "tpdf");
3498 assert_string_equal(actions->groupings->name, "grouping");
3499 assert_string_equal(actions->input.data->name, "uses-name");
3500 assert_string_equal(actions->output.musts->arg, "cond");
David Sedlákd1144562019-08-06 12:36:14 +02003501 assert_string_equal(actions->exts[0].name, "myext:c-define");
3502 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3503 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák85d0eca2019-07-24 15:15:21 +02003504 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3505 actions = NULL;
3506
David Sedlákeaa45792019-07-24 15:25:01 +02003507 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3508 data = ELEMENT_WRAPPER_START
3509 "<rpc name=\"act\">"
3510 "<description><text>desc</text></description>"
3511 "<grouping name=\"grouping\"/>"
3512 "<if-feature name=\"iff\"/>"
3513 "<input><uses name=\"uses-name\"/></input>"
3514 "<output><must condition=\"cond\"/></output>"
3515 "<reference><text>ref</text></reference>"
3516 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003517 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003518 EXT_SUBELEM
David Sedlákeaa45792019-07-24 15:25:01 +02003519 "</rpc>"
3520 ELEMENT_WRAPPER_END;
3521 assert_int_equal(test_element_helper(st, &data, &act_meta, NULL, NULL, true), LY_SUCCESS);
3522 assert_null(actions->parent);
3523 assert_int_equal(actions->nodetype, LYS_ACTION);
3524 assert_true(actions->flags & LYS_STATUS_DEPRC);
3525 assert_string_equal(actions->name, "act");
3526 assert_string_equal(actions->dsc, "desc");
3527 assert_string_equal(actions->ref, "ref");
3528 assert_string_equal(*actions->iffeatures, "iff");
3529 assert_string_equal(actions->typedefs->name, "tpdf");
3530 assert_string_equal(actions->groupings->name, "grouping");
3531 assert_string_equal(actions->input.data->name, "uses-name");
3532 assert_string_equal(actions->output.musts->arg, "cond");
David Sedlákd1144562019-08-06 12:36:14 +02003533 assert_string_equal(actions->exts[0].name, "myext:c-define");
3534 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3535 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákeaa45792019-07-24 15:25:01 +02003536 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3537 actions = NULL;
3538
David Sedlák85d0eca2019-07-24 15:15:21 +02003539 /* min subelems */
3540 data = ELEMENT_WRAPPER_START "<action name=\"act\" />" ELEMENT_WRAPPER_END;
3541 assert_int_equal(test_element_helper(st, &data, &act_meta, NULL, NULL, true), LY_SUCCESS);
3542 assert_string_equal(actions->name, "act");
3543 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3544 actions = NULL;
3545
3546 st->finished_correctly = true;
3547}
3548
David Sedlák992fb7c2019-07-24 16:51:01 +02003549static void
3550test_augment_elem(void **state)
3551{
3552 struct state *st = *state;
3553 const char *data;
3554 struct lysp_augment *augments = NULL;
3555 struct augment_meta aug_meta = {NULL, &augments};
3556
3557 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3558 data = ELEMENT_WRAPPER_START
3559 "<augment target-node=\"target\">"
3560 "<action name=\"action\"/>"
3561 "<anydata name=\"anyd\"/>"
3562 "<anyxml name=\"anyx\"/>"
3563 "<case name=\"case\"/>"
3564 "<choice name=\"choice\"/>"
3565 "<container name=\"subcont\"/>"
3566 "<description><text>desc</text></description>"
3567 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003568 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3569 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák992fb7c2019-07-24 16:51:01 +02003570 "<list name=\"list\"/>"
3571 "<notification name=\"notif\"/>"
3572 "<reference><text>ref</text></reference>"
3573 "<status value=\"current\"/>"
3574 "<uses name=\"uses\"/>"
3575 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003576 EXT_SUBELEM
David Sedlák992fb7c2019-07-24 16:51:01 +02003577 "</augment>"
3578 ELEMENT_WRAPPER_END;
3579 assert_int_equal(test_element_helper(st, &data, &aug_meta, NULL, NULL, true), LY_SUCCESS);
3580 assert_string_equal(augments->nodeid, "target");
3581 assert_null(augments->parent);
3582 assert_int_equal(augments->nodetype, LYS_AUGMENT);
3583 assert_true(augments->flags & LYS_STATUS_CURR);
3584 assert_string_equal(augments->dsc, "desc");
3585 assert_string_equal(augments->ref, "ref");
3586 assert_string_equal(augments->when->cond, "when-cond");
3587 assert_string_equal(*augments->iffeatures, "iff");
3588 assert_string_equal(augments->child->name, "anyd");
3589 assert_int_equal(augments->child->nodetype, LYS_ANYDATA);
3590 assert_string_equal(augments->child->next->name, "anyx");
3591 assert_int_equal(augments->child->next->nodetype, LYS_ANYXML);
3592 assert_string_equal(augments->child->next->next->name, "case");
3593 assert_int_equal(augments->child->next->next->nodetype, LYS_CASE);
3594 assert_string_equal(augments->child->next->next->next->name, "choice");
3595 assert_int_equal(augments->child->next->next->next->nodetype, LYS_CHOICE);
3596 assert_string_equal(augments->child->next->next->next->next->name, "subcont");
3597 assert_int_equal(augments->child->next->next->next->next->nodetype, LYS_CONTAINER);
3598 assert_string_equal(augments->child->next->next->next->next->next->name, "leaf");
3599 assert_int_equal(augments->child->next->next->next->next->next->nodetype, LYS_LEAF);
3600 assert_string_equal(augments->child->next->next->next->next->next->next->name, "llist");
3601 assert_int_equal(augments->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3602 assert_string_equal(augments->child->next->next->next->next->next->next->next->name, "list");
3603 assert_int_equal(augments->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3604 assert_string_equal(augments->child->next->next->next->next->next->next->next->next->name, "uses");
3605 assert_int_equal(augments->child->next->next->next->next->next->next->next->next->nodetype, LYS_USES);
3606 assert_null(augments->child->next->next->next->next->next->next->next->next->next);
3607 assert_string_equal(augments->actions->name, "action");
3608 assert_string_equal(augments->notifs->name, "notif");
David Sedlákd1144562019-08-06 12:36:14 +02003609 assert_string_equal(augments->exts[0].name, "myext:c-define");
3610 assert_int_equal(augments->exts[0].insubstmt_index, 0);
3611 assert_int_equal(augments->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák992fb7c2019-07-24 16:51:01 +02003612 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3613 augments = NULL;
3614
3615 data = ELEMENT_WRAPPER_START "<augment target-node=\"target\" />" ELEMENT_WRAPPER_END;
3616 assert_int_equal(test_element_helper(st, &data, &aug_meta, NULL, NULL, true), LY_SUCCESS);
3617 assert_string_equal(augments->nodeid, "target");
3618 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3619 augments = NULL;
3620
3621 st->finished_correctly = true;
3622}
3623
David Sedlák4ffcec82019-07-25 15:10:21 +02003624static void
3625test_deviate_elem(void **state)
3626{
3627 struct state *st = *state;
3628 const char *data;
3629 struct lysp_deviate *deviates = NULL;
3630 struct lysp_deviate_add *d_add;
3631 struct lysp_deviate_rpl *d_rpl;
3632 struct lysp_deviate_del *d_del;
3633
3634 /* all valid arguments with min subelems */
3635 data = ELEMENT_WRAPPER_START "<deviate value=\"not-supported\" />" ELEMENT_WRAPPER_END;
3636 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3637 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
3638 lysp_deviate_free(st->ctx, deviates);
3639 free(deviates);
3640 deviates = NULL;
3641
3642 data = ELEMENT_WRAPPER_START "<deviate value=\"add\" />" ELEMENT_WRAPPER_END;
3643 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3644 assert_int_equal(deviates->mod, LYS_DEV_ADD);
3645 lysp_deviate_free(st->ctx, deviates);
3646 free(deviates);
3647 deviates = NULL;
3648
3649 data = ELEMENT_WRAPPER_START "<deviate value=\"replace\" />" ELEMENT_WRAPPER_END;
3650 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3651 assert_int_equal(deviates->mod, LYS_DEV_REPLACE);
3652 lysp_deviate_free(st->ctx, deviates);
3653 free(deviates);
3654 deviates = NULL;
3655
3656 data = ELEMENT_WRAPPER_START "<deviate value=\"delete\" />" ELEMENT_WRAPPER_END;
3657 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3658 assert_int_equal(deviates->mod, LYS_DEV_DELETE);
3659 lysp_deviate_free(st->ctx, deviates);
3660 free(deviates);
3661 deviates = NULL;
3662
3663 /* max subelems and valid arguments */
3664 data = ELEMENT_WRAPPER_START
3665 "<deviate value=\"not-supported\">"
David Sedlákd1144562019-08-06 12:36:14 +02003666 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003667 "</deviate>"
3668 ELEMENT_WRAPPER_END;
3669 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3670 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
David Sedlákd1144562019-08-06 12:36:14 +02003671 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3672 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3673 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003674 lysp_deviate_free(st->ctx, deviates);
3675 free(deviates);
3676 deviates = NULL;
3677
3678 data = ELEMENT_WRAPPER_START
3679 "<deviate value=\"add\">"
3680 "<units name=\"units\"/>"
3681 "<must condition=\"cond\"/>"
3682 "<unique tag=\"utag\"/>"
3683 "<default value=\"def\"/>"
3684 "<config value=\"true\"/>"
3685 "<mandatory value=\"true\"/>"
3686 "<min-elements value=\"5\"/>"
3687 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003688 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003689 "</deviate>"
3690 ELEMENT_WRAPPER_END;
3691 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3692 d_add = (struct lysp_deviate_add *)deviates;
3693 assert_int_equal(d_add->mod, LYS_DEV_ADD);
3694 assert_null(d_add->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003695 assert_string_equal(d_add->units, "units");
3696 assert_string_equal(d_add->musts->arg, "cond");
3697 assert_string_equal(*d_add->uniques, "utag");
3698 assert_string_equal(*d_add->dflts, "def");
3699 assert_true(d_add->flags & LYS_MAND_TRUE && d_add->flags & LYS_CONFIG_W);
3700 assert_int_equal(d_add->min, 5);
3701 assert_int_equal(d_add->max, 15);
David Sedlákd1144562019-08-06 12:36:14 +02003702 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3703 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3704 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003705 lysp_deviate_free(st->ctx, deviates);
3706 free(deviates);
3707 deviates = NULL;
3708
3709 data = ELEMENT_WRAPPER_START
3710 "<deviate value=\"replace\">"
3711 "<type name=\"newtype\"/>"
3712 "<units name=\"uni\"/>"
3713 "<default value=\"def\"/>"
3714 "<config value=\"true\"/>"
3715 "<mandatory value=\"true\"/>"
3716 "<min-elements value=\"5\"/>"
3717 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003718 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003719 "</deviate>"
3720 ELEMENT_WRAPPER_END;
3721 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3722 d_rpl = (struct lysp_deviate_rpl *)deviates;
3723 assert_int_equal(d_rpl->mod, LYS_DEV_REPLACE);
3724 assert_null(d_rpl->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003725 assert_string_equal(d_rpl->type->name, "newtype");
3726 assert_string_equal(d_rpl->units, "uni");
3727 assert_string_equal(d_rpl->dflt, "def");
3728 assert_true(d_rpl->flags & LYS_MAND_TRUE && d_rpl->flags & LYS_CONFIG_W);
3729 assert_int_equal(d_rpl->min, 5);
3730 assert_int_equal(d_rpl->max, 15);
David Sedlákd1144562019-08-06 12:36:14 +02003731 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3732 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3733 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003734 lysp_deviate_free(st->ctx, deviates);
3735 free(deviates);
3736 deviates = NULL;
3737
3738 data = ELEMENT_WRAPPER_START
3739 "<deviate value=\"delete\">"
3740 "<units name=\"u\"/>"
3741 "<must condition=\"c\"/>"
3742 "<unique tag=\"tag\"/>"
3743 "<default value=\"default\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003744 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003745 "</deviate>"
3746 ELEMENT_WRAPPER_END;
3747 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3748 d_del = (struct lysp_deviate_del *)deviates;
3749 assert_int_equal(d_del->mod, LYS_DEV_DELETE);
3750 assert_null(d_del->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003751 assert_string_equal(d_del->units, "u");
3752 assert_string_equal(d_del->musts->arg, "c");
3753 assert_string_equal(*d_del->uniques, "tag");
3754 assert_string_equal(*d_del->dflts, "default");
David Sedlákd1144562019-08-06 12:36:14 +02003755 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3756 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3757 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003758 lysp_deviate_free(st->ctx, deviates);
3759 free(deviates);
3760 deviates = NULL;
3761
3762 /* invalid arguments */
3763 data = ELEMENT_WRAPPER_START "<deviate value=\"\" />" ELEMENT_WRAPPER_END;
3764 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3765 logbuf_assert("Invalid value \"\" of \"deviate\". Line number 1.");
3766 deviates = NULL;
3767
3768 data = ELEMENT_WRAPPER_START "<deviate value=\"invalid\" />" ELEMENT_WRAPPER_END;
3769 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3770 logbuf_assert("Invalid value \"invalid\" of \"deviate\". Line number 1.");
3771 deviates = NULL;
3772
3773 data = ELEMENT_WRAPPER_START "<deviate value=\"ad\" />" ELEMENT_WRAPPER_END;
3774 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3775 logbuf_assert("Invalid value \"ad\" of \"deviate\". Line number 1.");
3776 deviates = NULL;
3777
3778 data = ELEMENT_WRAPPER_START "<deviate value=\"adds\" />" ELEMENT_WRAPPER_END;
3779 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3780 logbuf_assert("Invalid value \"adds\" of \"deviate\". Line number 1.");
3781 deviates = NULL;
3782
3783 data = ELEMENT_WRAPPER_START
3784 "<deviate value=\"not-supported\">"
3785 "<must condition=\"c\"/>"
3786 "</deviate>"
3787 ELEMENT_WRAPPER_END;
3788 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3789 logbuf_assert("Deviate of this type doesn't allow \"must\" as it's sub-element. Line number 1.");
3790
3791 st->finished_correctly = true;
3792}
3793
David Sedlák8b754462019-07-25 16:22:13 +02003794static void
3795test_deviation_elem(void **state)
3796{
3797 struct state *st = *state;
3798 const char *data;
3799 struct lysp_deviation *deviations = NULL;
3800
3801 /* min subelems */
3802 data = ELEMENT_WRAPPER_START
3803 "<deviation target-node=\"target\">"
3804 "<deviate value=\"not-supported\"/>"
3805 "</deviation>"
3806 ELEMENT_WRAPPER_END;
3807 assert_int_equal(test_element_helper(st, &data, &deviations, NULL, NULL, true), LY_SUCCESS);
3808 assert_string_equal(deviations->nodeid, "target");
3809 assert_int_equal(deviations->deviates->mod, LYS_DEV_NOT_SUPPORTED);
3810 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3811 deviations = NULL;
3812
3813 /* max subelems */
3814 data = ELEMENT_WRAPPER_START
3815 "<deviation target-node=\"target\">"
3816 "<reference><text>ref</text></reference>"
3817 "<description><text>desc</text></description>"
3818 "<deviate value=\"add\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003819 EXT_SUBELEM
David Sedlák8b754462019-07-25 16:22:13 +02003820 "</deviation>"
3821 ELEMENT_WRAPPER_END;
3822 assert_int_equal(test_element_helper(st, &data, &deviations, NULL, NULL, true), LY_SUCCESS);
3823 assert_string_equal(deviations->nodeid, "target");
3824 assert_int_equal(deviations->deviates->mod, LYS_DEV_ADD);
3825 assert_string_equal(deviations->ref, "ref");
3826 assert_string_equal(deviations->dsc, "desc");
David Sedlákd1144562019-08-06 12:36:14 +02003827 assert_string_equal(deviations->exts[0].name, "myext:c-define");
3828 assert_int_equal(deviations->exts[0].insubstmt_index, 0);
3829 assert_int_equal(deviations->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8b754462019-07-25 16:22:13 +02003830 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3831 deviations = NULL;
3832
3833 /* invalid */
3834 data = ELEMENT_WRAPPER_START "<deviation target-node=\"target\"/>" ELEMENT_WRAPPER_END;
3835 assert_int_equal(test_element_helper(st, &data, &deviations, NULL, NULL, false), LY_EVALID);
3836 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3837 deviations = NULL;
3838 logbuf_assert("Missing mandatory subelement deviate of deviate element. Line number 1.");
3839
3840 st->finished_correctly = true;
3841}
3842
David Sedlák4f03b932019-07-26 13:01:47 +02003843static void
3844test_module_elem(void **state)
3845{
3846 struct state *st = *state;
3847 const char *data;
3848 struct yin_arg_record *attrs = NULL;
3849 struct sized_string name, prefix;
3850 struct lys_module *lys_mod = NULL;
3851 struct lysp_module *lysp_mod = NULL;
3852
3853 /* max subelems */
3854 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3855 lys_mod = calloc(1, sizeof *lys_mod);
3856 lysp_mod = calloc(1, sizeof *lysp_mod);
3857 lys_mod->ctx = st->ctx;
3858 lysp_mod->mod = lys_mod;
3859 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3860 "<yang-version value=\"1.1\"/>\n"
3861 "<namespace uri=\"ns\"/>\n"
3862 "<prefix value=\"pref\"/>\n"
3863 "<include module=\"b-mod\"/>\n"
3864 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3865 "<organization><text>org</text></organization>\n"
3866 "<contact><text>contact</text></contact>\n"
3867 "<description><text>desc</text></description>"
3868 "<reference><text>ref</text></reference>\n"
3869 "<revision date=\"2019-02-02\"/>\n"
3870 "<anydata name=\"anyd\"/>\n"
3871 "<anyxml name=\"anyx\"/>\n"
3872 "<choice name=\"choice\"/>\n"
3873 "<container name=\"cont\"/>\n"
3874 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3875 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3876 "<list name=\"sub-list\"/>\n"
3877 "<uses name=\"uses-name\"/>\n"
3878 "<augment target-node=\"target\"/>\n"
3879 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
3880 "<extension name=\"ext\"/>\n"
3881 "<feature name=\"feature\"/>\n"
3882 "<grouping name=\"grp\"/>\n"
3883 "<identity name=\"ident-name\"/>\n"
3884 "<notification name=\"notf\"/>\n"
3885 "<rpc name=\"rpc-name\"/>\n"
3886 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02003887 EXT_SUBELEM"\n"
David Sedlák4f03b932019-07-26 13:01:47 +02003888 "</module>\n";
3889 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
3890 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
3891 assert_int_equal(yin_parse_mod(st->yin_ctx, attrs, &data, lysp_mod), LY_SUCCESS);
3892 assert_string_equal(lysp_mod->mod->name, "mod");
3893 assert_string_equal(lysp_mod->revs, "2019-02-02");
3894 assert_string_equal(lysp_mod->mod->ns, "ns");
3895 assert_string_equal(lysp_mod->mod->prefix, "pref");
3896 assert_null(lysp_mod->mod->filepath);
3897 assert_string_equal(lysp_mod->mod->org, "org");
3898 assert_string_equal(lysp_mod->mod->contact, "contact");
3899 assert_string_equal(lysp_mod->mod->dsc, "desc");
3900 assert_string_equal(lysp_mod->mod->ref, "ref");
3901 assert_int_equal(lysp_mod->mod->version, LYS_VERSION_1_1);
3902 assert_string_equal(lysp_mod->imports->name, "a-mod");
3903 assert_string_equal(lysp_mod->includes->name, "b-mod");
3904 assert_string_equal(lysp_mod->extensions->name, "ext");
3905 assert_string_equal(lysp_mod->features->name, "feature");
3906 assert_string_equal(lysp_mod->identities->name, "ident-name");
3907 assert_string_equal(lysp_mod->typedefs->name, "tpdf");
3908 assert_string_equal(lysp_mod->groupings->name, "grp");
3909 assert_string_equal(lysp_mod->data->name, "anyd");
3910 assert_int_equal(lysp_mod->data->nodetype, LYS_ANYDATA);
3911 assert_string_equal(lysp_mod->data->next->name, "anyx");
3912 assert_int_equal(lysp_mod->data->next->nodetype, LYS_ANYXML);
3913 assert_string_equal(lysp_mod->data->next->next->name, "choice");
3914 assert_int_equal(lysp_mod->data->next->next->nodetype, LYS_CHOICE);
3915 assert_string_equal(lysp_mod->data->next->next->next->name, "cont");
3916 assert_int_equal(lysp_mod->data->next->next->next->nodetype, LYS_CONTAINER);
3917 assert_string_equal(lysp_mod->data->next->next->next->next->name, "leaf");
3918 assert_int_equal(lysp_mod->data->next->next->next->next->nodetype, LYS_LEAF);
3919 assert_string_equal(lysp_mod->data->next->next->next->next->next->name, "llist");
3920 assert_int_equal(lysp_mod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3921 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->name, "sub-list");
3922 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
3923 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->next->name, "uses-name");
3924 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3925 assert_null(lysp_mod->data->next->next->next->next->next->next->next->next);
3926 assert_string_equal(lysp_mod->augments->nodeid, "target");
3927 assert_string_equal(lysp_mod->rpcs->name, "rpc-name");
3928 assert_string_equal(lysp_mod->notifs->name, "notf");
3929 assert_string_equal(lysp_mod->deviations->nodeid, "target");
David Sedlákd1144562019-08-06 12:36:14 +02003930 assert_string_equal(lysp_mod->exts[0].name, "myext:c-define");
3931 assert_int_equal(lysp_mod->exts[0].insubstmt_index, 0);
3932 assert_int_equal(lysp_mod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4f03b932019-07-26 13:01:47 +02003933 lysp_module_free(lysp_mod);
3934 lys_module_free(lys_mod, NULL);
3935 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
3936 attrs = NULL;
3937
3938 /* min subelems */
3939 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3940 lys_mod = calloc(1, sizeof *lys_mod);
3941 lysp_mod = calloc(1, sizeof *lysp_mod);
3942 lys_mod->ctx = st->ctx;
3943 lysp_mod->mod = lys_mod;
3944 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3945 "<namespace uri=\"ns\"/>"
3946 "<prefix value=\"pref\"/>"
3947 "<yang-version value=\"1.1\"/>"
3948 "</module>";
3949 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
3950 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
3951 assert_int_equal(yin_parse_mod(st->yin_ctx, attrs, &data, lysp_mod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003952 assert_string_equal(lysp_mod->mod->name, "mod");
David Sedlák4f03b932019-07-26 13:01:47 +02003953 lysp_module_free(lysp_mod);
3954 lys_module_free(lys_mod, NULL);
3955 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
3956 attrs = NULL;
David Sedlák298ff6d2019-07-26 14:29:03 +02003957
David Sedláke6cd89e2019-08-07 12:46:02 +02003958 /* incorrect subelem order */
3959 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3960 lys_mod = calloc(1, sizeof *lys_mod);
3961 lysp_mod = calloc(1, sizeof *lysp_mod);
3962 lys_mod->ctx = st->ctx;
3963 lysp_mod->mod = lys_mod;
3964 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3965 "<feature name=\"feature\"/>\n"
3966 "<namespace uri=\"ns\"/>"
3967 "<prefix value=\"pref\"/>"
3968 "<yang-version value=\"1.1\"/>"
3969 "</module>";
3970 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
3971 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
3972 assert_int_equal(yin_parse_mod(st->yin_ctx, attrs, &data, lysp_mod), LY_EVALID);
3973 logbuf_assert("Invalid order of module\'s subelements \"namespace\" can\'t appear after \"feature\". Line number 30.");
3974 lysp_module_free(lysp_mod);
3975 lys_module_free(lys_mod, NULL);
3976 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
3977 attrs = NULL;
3978
David Sedlák298ff6d2019-07-26 14:29:03 +02003979 st->finished_correctly = true;
3980}
3981
3982static void
3983test_submodule_elem(void **state)
3984{
3985 struct state *st = *state;
3986 const char *data;
3987 struct yin_arg_record *attrs = NULL;
3988 struct sized_string name, prefix;
3989 struct lysp_submodule *lysp_submod = NULL;
3990
3991 /* max subelements */
3992 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3993 lysp_submod = calloc(1, sizeof *lysp_submod);
3994 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3995 "<yang-version value=\"1.1\"/>\n"
3996 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
3997 "<include module=\"b-mod\"/>\n"
3998 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3999 "<organization><text>org</text></organization>\n"
4000 "<contact><text>contact</text></contact>\n"
4001 "<description><text>desc</text></description>"
4002 "<reference><text>ref</text></reference>\n"
4003 "<revision date=\"2019-02-02\"/>\n"
4004 "<anydata name=\"anyd\"/>\n"
4005 "<anyxml name=\"anyx\"/>\n"
4006 "<choice name=\"choice\"/>\n"
4007 "<container name=\"cont\"/>\n"
4008 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
4009 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
4010 "<list name=\"sub-list\"/>\n"
4011 "<uses name=\"uses-name\"/>\n"
4012 "<augment target-node=\"target\"/>\n"
4013 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
4014 "<extension name=\"ext\"/>\n"
4015 "<feature name=\"feature\"/>\n"
4016 "<grouping name=\"grp\"/>\n"
4017 "<identity name=\"ident-name\"/>\n"
4018 "<notification name=\"notf\"/>\n"
4019 "<rpc name=\"rpc-name\"/>\n"
4020 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02004021 EXT_SUBELEM"\n"
David Sedlák298ff6d2019-07-26 14:29:03 +02004022 "</submodule>\n";
4023 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
4024 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
4025 assert_int_equal(yin_parse_submod(st->yin_ctx, attrs, &data, lysp_submod), LY_SUCCESS);
4026
4027 assert_string_equal(lysp_submod->name, "mod");
4028 assert_string_equal(lysp_submod->revs, "2019-02-02");
David Sedlák298ff6d2019-07-26 14:29:03 +02004029 assert_string_equal(lysp_submod->prefix, "pref");
4030 assert_null(lysp_submod->filepath);
4031 assert_string_equal(lysp_submod->org, "org");
4032 assert_string_equal(lysp_submod->contact, "contact");
4033 assert_string_equal(lysp_submod->dsc, "desc");
4034 assert_string_equal(lysp_submod->ref, "ref");
4035 assert_int_equal(lysp_submod->version, LYS_VERSION_1_1);
4036 assert_string_equal(lysp_submod->imports->name, "a-mod");
4037 assert_string_equal(lysp_submod->includes->name, "b-mod");
4038 assert_string_equal(lysp_submod->extensions->name, "ext");
4039 assert_string_equal(lysp_submod->features->name, "feature");
4040 assert_string_equal(lysp_submod->identities->name, "ident-name");
4041 assert_string_equal(lysp_submod->typedefs->name, "tpdf");
4042 assert_string_equal(lysp_submod->groupings->name, "grp");
4043 assert_string_equal(lysp_submod->data->name, "anyd");
4044 assert_int_equal(lysp_submod->data->nodetype, LYS_ANYDATA);
4045 assert_string_equal(lysp_submod->data->next->name, "anyx");
4046 assert_int_equal(lysp_submod->data->next->nodetype, LYS_ANYXML);
4047 assert_string_equal(lysp_submod->data->next->next->name, "choice");
4048 assert_int_equal(lysp_submod->data->next->next->nodetype, LYS_CHOICE);
4049 assert_string_equal(lysp_submod->data->next->next->next->name, "cont");
4050 assert_int_equal(lysp_submod->data->next->next->next->nodetype, LYS_CONTAINER);
4051 assert_string_equal(lysp_submod->data->next->next->next->next->name, "leaf");
4052 assert_int_equal(lysp_submod->data->next->next->next->next->nodetype, LYS_LEAF);
4053 assert_string_equal(lysp_submod->data->next->next->next->next->next->name, "llist");
4054 assert_int_equal(lysp_submod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
4055 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->name, "sub-list");
4056 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
4057 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->next->name, "uses-name");
4058 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
4059 assert_null(lysp_submod->data->next->next->next->next->next->next->next->next);
4060 assert_string_equal(lysp_submod->augments->nodeid, "target");
4061 assert_string_equal(lysp_submod->rpcs->name, "rpc-name");
4062 assert_string_equal(lysp_submod->notifs->name, "notf");
4063 assert_string_equal(lysp_submod->deviations->nodeid, "target");
David Sedlákd1144562019-08-06 12:36:14 +02004064 assert_string_equal(lysp_submod->exts[0].name, "myext:c-define");
4065 assert_int_equal(lysp_submod->exts[0].insubstmt_index, 0);
4066 assert_int_equal(lysp_submod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák298ff6d2019-07-26 14:29:03 +02004067
4068 lysp_submodule_free(st->ctx, lysp_submod);
4069 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
4070 attrs = NULL;
4071
4072 /* min subelemnts */
4073 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
4074 lysp_submod = calloc(1, sizeof *lysp_submod);
4075 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
4076 "<yang-version value=\"1.0\"/>"
4077 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
4078 "</submodule>";
4079 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
4080 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
4081 assert_int_equal(yin_parse_submod(st->yin_ctx, attrs, &data, lysp_submod), LY_SUCCESS);
4082 assert_string_equal(lysp_submod->prefix, "pref");
4083 assert_string_equal(lysp_submod->belongsto, "mod-name");
4084 assert_int_equal(lysp_submod->version, LYS_VERSION_1_0);
4085 lysp_submodule_free(st->ctx, lysp_submod);
4086 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
4087 attrs = NULL;
4088
David Sedláke6cd89e2019-08-07 12:46:02 +02004089 /* incorrect subelem order */
4090 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
4091 lysp_submod = calloc(1, sizeof *lysp_submod);
4092 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
4093 "<yang-version value=\"1.0\"/>"
4094 "<reference><text>ref</text></reference>\n"
4095 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
4096 "</submodule>";
4097 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
4098 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
4099 assert_int_equal(yin_parse_submod(st->yin_ctx, attrs, &data, lysp_submod), LY_EVALID);
4100 logbuf_assert("Invalid order of submodule's subelements \"belongs-to\" can't appear after \"reference\". Line number 28.");
4101 lysp_submodule_free(st->ctx, lysp_submod);
4102 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
4103 attrs = NULL;
4104
David Sedlák298ff6d2019-07-26 14:29:03 +02004105 st->finished_correctly = true;
David Sedlák4f03b932019-07-26 13:01:47 +02004106}
4107
David Sedlák8985a142019-07-31 16:43:06 +02004108static void
4109test_yin_parse_module(void **state)
4110{
4111 struct state *st = *state;
4112 const char *data;
4113 struct lys_module *mod;
4114 struct yin_parser_ctx *yin_ctx = NULL;
4115
4116 mod = calloc(1, sizeof *mod);
4117 mod->ctx = st->ctx;
4118 data = "<module name=\"example-foo\""
4119 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4120 "xmlns:foo=\"urn:example:foo\""
4121 "xmlns:myext=\"urn:example:extensions\">\n"
4122
4123 "<yang-version value=\"1.0\"/>\n"
4124
4125 "<namespace uri=\"urn:example:foo\"/>\n"
4126 "<prefix value=\"foo\"/>\n"
4127
4128 "<import module=\"example-extensions\">\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004129 "<prefix value=\"myext\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02004130 "</import>\n"
4131
4132 "<list name=\"interface\">\n"
4133 "<key value=\"name\"/>\n"
4134 "<leaf name=\"name\">\n"
4135 "<type name=\"string\"/>\n"
4136 "</leaf>\n"
4137 "<leaf name=\"mtu\">\n"
4138 "<type name=\"uint32\"/>\n"
4139 "<description>\n"
4140 "<text>The MTU of the interface.</text>\n"
4141 "</description>\n"
4142 "<myext:c-define name=\"MY_MTU\"/>\n"
4143 "</leaf>\n"
4144 "</list>\n"
4145 "</module>\n";
4146 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4147 lys_module_free(mod, NULL);
4148 yin_parser_ctx_free(yin_ctx);
4149 mod = NULL;
4150 yin_ctx = NULL;
4151
4152 mod = calloc(1, sizeof *mod);
4153 mod->ctx = st->ctx;
David Sedlák6d781b62019-08-02 15:22:52 +02004154 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
4155 "<yang-version value=\"1.0\"/>\n"
4156 "<namespace uri=\"urn:example:foo\"/>\n"
4157 "<prefix value=\"foo\"/>\n"
4158 "</module>\n";
4159 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4160 lys_module_free(mod, NULL);
4161 yin_parser_ctx_free(yin_ctx);
4162 mod = NULL;
4163 yin_ctx = NULL;
4164
4165
4166 mod = calloc(1, sizeof *mod);
4167 mod->ctx = st->ctx;
David Sedlák8985a142019-07-31 16:43:06 +02004168 data = "<submodule name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4169 "</submodule>\n";
4170 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_EINVAL);
4171 logbuf_assert("Input data contains submodule which cannot be parsed directly without its main module.");
4172 lys_module_free(mod, NULL);
4173 yin_parser_ctx_free(yin_ctx);
4174
David Sedlák6d781b62019-08-02 15:22:52 +02004175 mod = calloc(1, sizeof *mod);
4176 mod->ctx = st->ctx;
4177 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
4178 "<yang-version value=\"1.0\"/>\n"
4179 "<namespace uri=\"urn:example:foo\"/>\n"
4180 "<prefix value=\"foo\"/>\n"
4181 "</module>"
4182 "<module>";
4183 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_EVALID);
4184 logbuf_assert("Trailing garbage \"<module>\" after module, expected end-of-input. Line number 5.");
4185 lys_module_free(mod, NULL);
4186 yin_parser_ctx_free(yin_ctx);
4187 mod = NULL;
4188 yin_ctx = NULL;
4189
David Sedlák8985a142019-07-31 16:43:06 +02004190 st->finished_correctly = true;
4191}
4192
4193static void
4194test_yin_parse_submodule(void **state)
4195{
4196 struct state *st = *state;
4197 const char *data;
4198 struct yin_parser_ctx *yin_ctx = NULL;
4199 struct lysp_submodule *submod = NULL;
David Sedlák1b623122019-08-05 15:27:49 +02004200 struct lys_parser_ctx main_ctx = {};
David Sedlák8985a142019-07-31 16:43:06 +02004201
4202 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4203 "<submodule name=\"asub\""
4204 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4205 "xmlns:a=\"urn:a\">"
4206 "<yang-version value=\"1.0\"/>\n"
4207 "<belongs-to module=\"a\">"
4208 "<prefix value=\"a_pref\"/>"
4209 "</belongs-to>"
4210 "<include module=\"atop\"/>"
4211 "<feature name=\"fox\"/>"
4212 "<notification name=\"bar-notif\">"
4213 "<if-feature name=\"bar\"/>"
4214 "</notification>"
4215 "<notification name=\"fox-notif\">"
4216 "<if-feature name=\"fox\"/>"
4217 "</notification>"
4218 "<augment target-node=\"/a_pref:top\">"
4219 "<if-feature name=\"bar\"/>"
4220 "<container name=\"bar-sub\"/>"
4221 "</augment>"
4222 "<augment target-node=\"/top\">"
4223 "<container name=\"bar-sub2\"/>"
4224 "</augment>"
4225 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004226 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_SUCCESS);
David Sedlák8985a142019-07-31 16:43:06 +02004227 lysp_submodule_free(st->ctx, submod);
4228 yin_parser_ctx_free(yin_ctx);
4229 yin_ctx = NULL;
4230 submod = NULL;
4231
4232 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák6d781b62019-08-02 15:22:52 +02004233 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4234 "<yang-version value=\"1.0\"/>\n"
4235 "<belongs-to module=\"a\">"
4236 "<prefix value=\"a_pref\"/>"
4237 "</belongs-to>"
4238 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004239 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_SUCCESS);
David Sedlák6d781b62019-08-02 15:22:52 +02004240 lysp_submodule_free(st->ctx, submod);
4241 yin_parser_ctx_free(yin_ctx);
4242 yin_ctx = NULL;
4243 submod = NULL;
4244
4245 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák8985a142019-07-31 16:43:06 +02004246 "<module name=\"inval\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4247 "</module>";
David Sedlák1b623122019-08-05 15:27:49 +02004248 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_EINVAL);
David Sedlák8985a142019-07-31 16:43:06 +02004249 logbuf_assert("Input data contains module in situation when a submodule is expected.");
4250 lysp_submodule_free(st->ctx, submod);
4251 yin_parser_ctx_free(yin_ctx);
4252 yin_ctx = NULL;
4253 submod = NULL;
4254
David Sedlák6d781b62019-08-02 15:22:52 +02004255 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4256 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4257 "<yang-version value=\"1.0\"/>\n"
4258 "<belongs-to module=\"a\">"
4259 "<prefix value=\"a_pref\"/>"
4260 "</belongs-to>"
4261 "</submodule>"
4262 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4263 "<yang-version value=\"1.0\"/>\n"
4264 "<belongs-to module=\"a\">"
4265 "<prefix value=\"a_pref\"/>"
4266 "</belongs-to>"
4267 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004268 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_EVALID);
David Sedlák6d781b62019-08-02 15:22:52 +02004269 logbuf_assert("Trailing garbage \"<submodule name...\" after submodule, expected end-of-input. Line number 2.");
4270 lysp_submodule_free(st->ctx, submod);
4271 yin_parser_ctx_free(yin_ctx);
4272 yin_ctx = NULL;
4273 submod = NULL;
4274
David Sedlák8985a142019-07-31 16:43:06 +02004275 st->finished_correctly = true;
4276}
4277
David Sedlák3b4db242018-10-19 16:11:01 +02004278int
4279main(void)
4280{
4281
4282 const struct CMUnitTest tests[] = {
David Sedlák8f7a1172019-06-20 14:42:18 +02004283 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02004284 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
4285 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák555c7202019-07-04 12:14:12 +02004286 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02004287 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02004288
David Sedlák8e7bda82019-07-16 17:57:50 +02004289 cmocka_unit_test(test_yin_match_argument_name),
David Sedlák43801c92019-08-05 15:58:54 +02004290 cmocka_unit_test_setup_teardown(test_enum_elem, setup_element_test, teardown_element_test),
4291 cmocka_unit_test_setup_teardown(test_bit_elem, setup_element_test, teardown_element_test),
David Sedlák32488102019-07-15 17:44:10 +02004292 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_element_test),
4293 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_element_test),
4294 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_element_test),
4295 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_element_test),
4296 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_element_test),
4297 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_element_test),
4298 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02004299 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_element_test),
4300 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_element_test),
4301 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_element_test),
4302 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_element_test),
4303 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_element_test),
4304 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_element_test),
4305 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_element_test),
4306 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_element_test),
4307 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_element_test),
4308 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_element_test),
4309 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_element_test),
4310 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_element_test),
4311 cmocka_unit_test_setup_teardown(test_path_elem, setup_element_test, teardown_element_test),
4312 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_element_test),
4313 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_element_test),
David Sedlák69f01612019-07-17 11:41:08 +02004314 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_element_test),
4315 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_element_test),
4316 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_element_test),
4317 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_element_test),
4318 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_element_test),
4319 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_element_test),
4320 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_element_test),
4321 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_element_test),
David Sedlák374d2b32019-07-17 15:06:55 +02004322 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_element_test),
David Sedlák1af868e2019-07-17 17:03:14 +02004323 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_element_test),
David Sedlák09e18c92019-07-18 11:17:11 +02004324 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_element_test),
David Sedláka2dad212019-07-18 12:45:19 +02004325 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_element_test),
David Sedlák8a83bbb2019-07-18 14:46:00 +02004326 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02004327 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_element_test),
David Sedlákc3da3ef2019-07-19 12:56:08 +02004328 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_element_test),
David Sedlákcb39f642019-07-19 13:19:55 +02004329 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_element_test),
David Sedlák12470a82019-07-19 13:44:36 +02004330 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_element_test),
David Sedlák04e17b22019-07-19 15:29:48 +02004331 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_element_test),
David Sedlákd2d676a2019-07-22 11:28:19 +02004332 cmocka_unit_test_setup_teardown(test_refine_elem, setup_element_test, teardown_element_test),
David Sedlák0d6de5a2019-07-22 13:25:44 +02004333 cmocka_unit_test_setup_teardown(test_uses_elem, setup_element_test, teardown_element_test),
David Sedlákaa854b02019-07-22 14:17:10 +02004334 cmocka_unit_test_setup_teardown(test_revision_elem, setup_element_test, teardown_element_test),
David Sedlák0c2bab92019-07-22 15:33:19 +02004335 cmocka_unit_test_setup_teardown(test_include_elem, setup_element_test, teardown_element_test),
David Sedlák5e13dea2019-07-22 16:06:45 +02004336 cmocka_unit_test_setup_teardown(test_feature_elem, setup_element_test, teardown_element_test),
David Sedlák28794f22019-07-22 16:45:00 +02004337 cmocka_unit_test_setup_teardown(test_identity_elem, setup_element_test, teardown_element_test),
David Sedlákaf536aa2019-07-23 13:42:23 +02004338 cmocka_unit_test_setup_teardown(test_list_elem, setup_element_test, teardown_element_test),
David Sedlák031b9e72019-07-23 15:19:37 +02004339 cmocka_unit_test_setup_teardown(test_notification_elem, setup_element_test, teardown_element_test),
David Sedláke3ce9ef2019-07-23 16:34:30 +02004340 cmocka_unit_test_setup_teardown(test_grouping_elem, setup_element_test, teardown_element_test),
David Sedlákf111bcb2019-07-23 17:15:51 +02004341 cmocka_unit_test_setup_teardown(test_container_elem, setup_element_test, teardown_element_test),
David Sedlák5379d392019-07-24 10:42:03 +02004342 cmocka_unit_test_setup_teardown(test_case_elem, setup_element_test, teardown_element_test),
David Sedlákb7abcfa2019-07-24 12:33:35 +02004343 cmocka_unit_test_setup_teardown(test_choice_elem, setup_element_test, teardown_element_test),
David Sedlák05404f62019-07-24 14:11:53 +02004344 cmocka_unit_test_setup_teardown(test_inout_elem, setup_element_test, teardown_element_test),
David Sedlák85d0eca2019-07-24 15:15:21 +02004345 cmocka_unit_test_setup_teardown(test_action_elem, setup_element_test, teardown_element_test),
David Sedlák992fb7c2019-07-24 16:51:01 +02004346 cmocka_unit_test_setup_teardown(test_augment_elem, setup_element_test, teardown_element_test),
David Sedlák4ffcec82019-07-25 15:10:21 +02004347 cmocka_unit_test_setup_teardown(test_deviate_elem, setup_element_test, teardown_element_test),
David Sedlák8b754462019-07-25 16:22:13 +02004348 cmocka_unit_test_setup_teardown(test_deviation_elem, setup_element_test, teardown_element_test),
David Sedlák4f03b932019-07-26 13:01:47 +02004349 cmocka_unit_test_setup_teardown(test_module_elem, setup_element_test, teardown_element_test),
David Sedlák298ff6d2019-07-26 14:29:03 +02004350 cmocka_unit_test_setup_teardown(test_submodule_elem, setup_element_test, teardown_element_test),
David Sedlák8985a142019-07-31 16:43:06 +02004351
4352 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_logger, teardown_logger),
4353 cmocka_unit_test_setup_teardown(test_yin_parse_submodule, setup_logger, teardown_logger),
David Sedlák3b4db242018-10-19 16:11:01 +02004354 };
4355
David Sedlák8e7bda82019-07-16 17:57:50 +02004356 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02004357}