blob: 355022a3802517742a9fa8a7609c21c0a2fb5f68 [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
890 /* missing text subelement */
891 data = ELEMENT_WRAPPER_START
892 "<reference>reference...</reference>"
893 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +0200894 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, false), LY_EVALID);
David Sedlák32488102019-07-15 17:44:10 +0200895 logbuf_assert("Missing mandatory subelement text of reference element. Line number 1.");
896
David Sedlákd1144562019-08-06 12:36:14 +0200897 /* reference element */
898 data = ELEMENT_WRAPPER_START
899 "<reference>" EXT_SUBELEM "<text>reference...</text></reference>"
900 ELEMENT_WRAPPER_END;
901 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, false), LY_EVALID);
902 logbuf_assert("Subelement text of reference element must be defined as first subelement. Line number 1.");
903 FREE_STRING(st->ctx, value);
904 value = NULL;
905 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
906 exts = NULL;
907
David Sedlák32488102019-07-15 17:44:10 +0200908 st->finished_correctly = true;
909}
910
911static void
912test_import_elem(void **state)
913{
914 struct state *st = *state;
915 const char *data;
David Sedlák298ff6d2019-07-26 14:29:03 +0200916 struct lysp_import *imports = NULL;
917 struct import_meta imp_meta = {"prefix", &imports};
David Sedlák32488102019-07-15 17:44:10 +0200918
919 /* max subelems */
920 data = ELEMENT_WRAPPER_START
921 "<import module=\"a\">"
David Sedlákd1144562019-08-06 12:36:14 +0200922 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +0200923 "<prefix value=\"a_mod\"/>"
924 "<revision-date date=\"2015-01-01\"></revision-date>"
925 "<description><text>import description</text></description>"
926 "<reference><text>import reference</text></reference>"
927 "</import>"
928 ELEMENT_WRAPPER_END;
David Sedlák298ff6d2019-07-26 14:29:03 +0200929 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, true), LY_SUCCESS);
930 assert_string_equal(imports->name, "a");
931 assert_string_equal(imports->prefix, "a_mod");
932 assert_string_equal(imports->rev, "2015-01-01");
933 assert_string_equal(imports->dsc, "import description");
934 assert_string_equal(imports->ref, "import reference");
David Sedlákd1144562019-08-06 12:36:14 +0200935 assert_string_equal(imports->exts->name, "myext:c-define");
936 assert_int_equal(imports->exts->insubstmt, LYEXT_SUBSTMT_SELF);
937 assert_int_equal(imports->exts->insubstmt_index, 0);
David Sedlák298ff6d2019-07-26 14:29:03 +0200938 FREE_ARRAY(st->ctx, imports, lysp_import_free);
939 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200940
941 /* min subelems */
David Sedlák32488102019-07-15 17:44:10 +0200942 data = ELEMENT_WRAPPER_START
943 "<import module=\"a\">"
944 "<prefix value=\"a_mod\"/>"
945 "</import>"
946 ELEMENT_WRAPPER_END;
David Sedlák298ff6d2019-07-26 14:29:03 +0200947 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, true), LY_SUCCESS);
948 assert_string_equal(imports->prefix, "a_mod");
949 FREE_ARRAY(st->ctx, imports, lysp_import_free);
950 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200951
952 /* invalid (missing prefix) */
David Sedlák298ff6d2019-07-26 14:29:03 +0200953 data = ELEMENT_WRAPPER_START "<import module=\"a\"></import>" ELEMENT_WRAPPER_END;
954 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, false), LY_EVALID);
David Sedlák32488102019-07-15 17:44:10 +0200955 logbuf_assert("Missing mandatory subelement prefix of import element. Line number 1.");
David Sedlák298ff6d2019-07-26 14:29:03 +0200956 FREE_ARRAY(st->ctx, imports, lysp_import_free);
957 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200958
959 /* invalid reused prefix */
David Sedlák32488102019-07-15 17:44:10 +0200960 data = ELEMENT_WRAPPER_START
961 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +0200962 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +0200963 "</import>"
964 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +0200965 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +0200966 "</import>"
967 ELEMENT_WRAPPER_END;
David Sedlák298ff6d2019-07-26 14:29:03 +0200968 assert_int_equal(test_element_helper(st, &data, &imp_meta, NULL, NULL, false), LY_EVALID);
969 logbuf_assert("Prefix \"prefix\" already used as module prefix. Line number 1.");
970 FREE_ARRAY(st->ctx, imports, lysp_import_free);
971 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200972
973 st->finished_correctly = true;
974}
975
976static void
977test_status_elem(void **state)
978{
979 struct state *st = *state;
980 const char *data;
981 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +0200982 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200983
984 /* test valid values */
985 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
986 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200987 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200988
989 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
990 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200991 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +0200992
David Sedlákd1144562019-08-06 12:36:14 +0200993 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\">"EXT_SUBELEM"</status>" ELEMENT_WRAPPER_END;
994 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200995 assert_true(flags & LYS_STATUS_OBSLT);
David Sedlákd1144562019-08-06 12:36:14 +0200996 assert_string_equal(exts[0].name, "myext:c-define");
997 assert_int_equal(exts[0].insubstmt_index, 0);
998 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_STATUS);
999 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1000 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001001
1002 /* test invalid value */
1003 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
1004 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1005 logbuf_assert("Invalid value \"invalid\" of \"status\". Line number 1.");
1006 st->finished_correctly = true;
1007}
1008
1009static void
1010test_ext_elem(void **state)
1011{
1012 struct state *st = *state;
1013 const char *data;
1014 struct lysp_ext *ext = NULL;
1015
1016 /* max subelems */
1017 data = ELEMENT_WRAPPER_START
1018 "<extension name=\"ext_name\">"
1019 "<argument name=\"arg\"></argument>"
1020 "<status value=\"current\"/>"
1021 "<description><text>ext_desc</text></description>"
1022 "<reference><text>ext_ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001023 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +02001024 "</extension>"
1025 ELEMENT_WRAPPER_END;
1026 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
1027 assert_string_equal(ext->name, "ext_name");
1028 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001029 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +02001030 assert_string_equal(ext->dsc, "ext_desc");
1031 assert_string_equal(ext->ref, "ext_ref");
David Sedlákd1144562019-08-06 12:36:14 +02001032 assert_string_equal(ext->exts[0].name, "myext:c-define");
1033 assert_int_equal(ext->exts[0].insubstmt_index, 0);
1034 assert_int_equal(ext->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák32488102019-07-15 17:44:10 +02001035 lysp_ext_free(st->ctx, ext);
1036 LY_ARRAY_FREE(ext);
1037 ext = NULL;
1038
1039 /* min subelems */
1040 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
1041 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
1042 assert_string_equal(ext->name, "ext_name");
1043 lysp_ext_free(st->ctx, ext);
1044 LY_ARRAY_FREE(ext);
1045 ext = NULL;
1046
1047 st->finished_correctly = true;
1048}
1049
1050static void
1051test_yin_element_elem(void **state)
1052{
1053 struct state *st = *state;
1054 const char *data;
1055 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001056 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001057
1058 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
1059 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001060 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +02001061
David Sedlákd1144562019-08-06 12:36:14 +02001062 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\">" EXT_SUBELEM "</yin-element>" ELEMENT_WRAPPER_END;
1063 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001064 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlákd1144562019-08-06 12:36:14 +02001065 assert_string_equal(exts[0].name, "myext:c-define");
1066 assert_int_equal(exts[0].insubstmt_index, 0);
1067 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_YINELEM);
1068 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001069
1070 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
1071 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001072 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +02001073 logbuf_assert("Invalid value \"invalid\" of \"yin-element\". Line number 1.");
1074 st->finished_correctly = true;
1075}
1076
1077static void
1078test_yangversion_elem(void **state)
1079{
1080 struct state *st = *state;
1081 const char *data;
1082 uint8_t version = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001083 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001084
1085 /* valid values */
1086 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.0\" />" ELEMENT_WRAPPER_END;
1087 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001088 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001089 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_0);
1090
David Sedlákd1144562019-08-06 12:36:14 +02001091 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\">" EXT_SUBELEM "</yang-version>" ELEMENT_WRAPPER_END;
1092 assert_int_equal(test_element_helper(st, &data, &version, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001093 assert_true(version & LYS_VERSION_1_1);
David Sedlák32488102019-07-15 17:44:10 +02001094 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_1);
David Sedlákd1144562019-08-06 12:36:14 +02001095 assert_string_equal(exts[0].name, "myext:c-define");
1096 assert_int_equal(exts[0].insubstmt_index, 0);
1097 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_VERSION);
1098 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001099
1100 /* invalid value */
1101 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
1102 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, false), LY_EVALID);
1103 logbuf_assert("Invalid value \"version\" of \"yang-version\". Line number 1.");
1104
1105 st->finished_correctly = true;
1106}
1107
1108static void
1109test_mandatory_elem(void **state)
1110{
1111 struct state *st = *state;
1112 const char *data;
1113 uint16_t man = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001114 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001115
1116 /* valid values */
1117 data = ELEMENT_WRAPPER_START "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
1118 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1119 assert_int_equal(man, LYS_MAND_TRUE);
1120 man = 0;
1121
David Sedlákd1144562019-08-06 12:36:14 +02001122 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\">" EXT_SUBELEM "</mandatory>" ELEMENT_WRAPPER_END;
1123 assert_int_equal(test_element_helper(st, &data, &man, NULL, &exts, true), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001124 assert_int_equal(man, LYS_MAND_FALSE);
David Sedlákd1144562019-08-06 12:36:14 +02001125 assert_string_equal(exts[0].name, "myext:c-define");
1126 assert_int_equal(exts[0].insubstmt_index, 0);
1127 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MANDATORY);
1128 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001129
1130 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
1131 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, false), LY_EVALID);
1132 logbuf_assert("Invalid value \"invalid\" of \"mandatory\". Line number 1.");
1133
1134 st->finished_correctly = true;
1135}
1136
David Sedlák8e7bda82019-07-16 17:57:50 +02001137static void
1138test_argument_elem(void **state)
1139{
1140 struct state *st = *state;
1141 const char *data;
1142 uint16_t flags = 0;
1143 const char *arg;
1144 struct yin_argument_meta arg_meta = {&flags, &arg};
David Sedlákd1144562019-08-06 12:36:14 +02001145 struct lysp_ext_instance *exts = NULL;
1146
David Sedlák8e7bda82019-07-16 17:57:50 +02001147 /* max subelems */
1148 data = ELEMENT_WRAPPER_START
1149 "<argument name=\"arg-name\">"
1150 "<yin-element value=\"true\" />"
David Sedlákd1144562019-08-06 12:36:14 +02001151 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001152 "</argument>"
1153 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +02001154 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001155 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001156 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlákd1144562019-08-06 12:36:14 +02001157 assert_string_equal(exts[0].name, "myext:c-define");
1158 assert_int_equal(exts[0].insubstmt_index, 0);
1159 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ARGUMENT);
1160 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1161 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001162 flags = 0;
1163 FREE_STRING(st->ctx, arg);
1164 arg = NULL;
1165
1166 /* min subelems */
1167 data = ELEMENT_WRAPPER_START
1168 "<argument name=\"arg\">"
1169 "</argument>"
1170 ELEMENT_WRAPPER_END;
1171 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1172 assert_string_equal(arg, "arg");
1173 assert_true(flags == 0);
1174 FREE_STRING(st->ctx, arg);
1175
1176 st->finished_correctly = true;
1177}
1178
1179static void
1180test_base_elem(void **state)
1181{
1182 struct state *st = *state;
1183 const char *data;
1184 const char **bases = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001185 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001186 struct lysp_type type = {};
1187
1188 /* as identity subelement */
1189 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001190 "<base name=\"base-name\">"
1191 EXT_SUBELEM
1192 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001193 "</identity>";
David Sedlákd1144562019-08-06 12:36:14 +02001194 assert_int_equal(test_element_helper(st, &data, &bases, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001195 assert_string_equal(*bases, "base-name");
David Sedlákd1144562019-08-06 12:36:14 +02001196 assert_string_equal(exts[0].name, "myext:c-define");
1197 assert_int_equal(exts[0].insubstmt_index, 0);
1198 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1199 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1200 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001201 FREE_STRING(st->ctx, *bases);
1202 LY_ARRAY_FREE(bases);
1203
1204 /* as type subelement */
1205 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001206 "<base name=\"base-name\">"
1207 EXT_SUBELEM
1208 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001209 "</type>";
David Sedlákd1144562019-08-06 12:36:14 +02001210 assert_int_equal(test_element_helper(st, &data, &type, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001211 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001212 assert_true(type.flags & LYS_SET_BASE);
David Sedlákd1144562019-08-06 12:36:14 +02001213 assert_string_equal(exts[0].name, "myext:c-define");
1214 assert_int_equal(exts[0].insubstmt_index, 0);
1215 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1216 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1217 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001218 FREE_STRING(st->ctx, *type.bases);
1219 LY_ARRAY_FREE(type.bases);
1220
1221 st->finished_correctly = true;
1222}
1223
1224static void
1225test_belongsto_elem(void **state)
1226{
1227 struct state *st = *state;
1228 const char *data;
1229 struct lysp_submodule submod;
David Sedlákd1144562019-08-06 12:36:14 +02001230 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001231
1232 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +02001233 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/>"EXT_SUBELEM"</belongs-to>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001234 ELEMENT_WRAPPER_END;
David Sedlákd1144562019-08-06 12:36:14 +02001235 assert_int_equal(test_element_helper(st, &data, &submod, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001236 assert_string_equal(submod.belongsto, "module-name");
1237 assert_string_equal(submod.prefix, "pref");
David Sedlákd1144562019-08-06 12:36:14 +02001238 assert_string_equal(exts[0].name, "myext:c-define");
1239 assert_int_equal(exts[0].insubstmt_index, 0);
1240 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BELONGSTO);
1241 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1242 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001243 FREE_STRING(st->ctx, submod.belongsto);
1244 FREE_STRING(st->ctx, submod.prefix);
1245
1246 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
1247 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, false), LY_EVALID);
1248 logbuf_assert("Missing mandatory subelement prefix of belongs-to element. Line number 1.");
1249 FREE_STRING(st->ctx, submod.belongsto);
1250
1251 st->finished_correctly = true;
1252}
1253
1254static void
1255test_config_elem(void **state)
1256{
1257 struct state *st = *state;
1258 const char *data;
1259 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001260 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001261
David Sedlákd1144562019-08-06 12:36:14 +02001262 data = ELEMENT_WRAPPER_START "<config value=\"true\">" EXT_SUBELEM "</config>" ELEMENT_WRAPPER_END;
1263 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001264 assert_true(flags & LYS_CONFIG_W);
David Sedlákd1144562019-08-06 12:36:14 +02001265 assert_string_equal(exts[0].name, "myext:c-define");
1266 assert_int_equal(exts[0].insubstmt_index, 0);
1267 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONFIG);
1268 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1269 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001270 flags = 0;
1271
1272 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
1273 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001274 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001275 flags = 0;
1276
1277 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1278 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1279 logbuf_assert("Invalid value \"invalid\" of \"config\". Line number 1.");
1280
1281 st->finished_correctly = true;
1282}
1283
1284static void
1285test_default_elem(void **state)
1286{
1287 struct state *st = *state;
1288 const char *data;
1289 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001290 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001291
David Sedlákd1144562019-08-06 12:36:14 +02001292 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\">"EXT_SUBELEM"</default>" ELEMENT_WRAPPER_END;
1293 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001294 assert_string_equal(val, "defaul-value");
David Sedlákd1144562019-08-06 12:36:14 +02001295 assert_string_equal(exts[0].name, "myext:c-define");
1296 assert_int_equal(exts[0].insubstmt_index, 0);
1297 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DEFAULT);
1298 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1299 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001300 FREE_STRING(st->ctx, val);
1301 val = NULL;
1302
1303 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
1304 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1305 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1306
1307 st->finished_correctly = true;
1308}
1309
1310static void
1311test_err_app_tag_elem(void **state)
1312{
1313 struct state *st = *state;
1314 const char *data;
1315 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001316 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001317
David Sedlákd1144562019-08-06 12:36:14 +02001318 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\">"EXT_SUBELEM"</error-app-tag>" ELEMENT_WRAPPER_END;
1319 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001320 assert_string_equal(val, "val");
David Sedlákd1144562019-08-06 12:36:14 +02001321 assert_string_equal(exts[0].name, "myext:c-define");
1322 assert_int_equal(exts[0].insubstmt_index, 0);
1323 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRTAG);
1324 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1325 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001326 FREE_STRING(st->ctx, val);
1327 val = NULL;
1328
1329 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
1330 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1331 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1332
1333 st->finished_correctly = true;
1334}
1335
1336static void
1337test_err_msg_elem(void **state)
1338{
1339 struct state *st = *state;
1340 const char *data;
1341 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001342 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001343
David Sedlákd1144562019-08-06 12:36:14 +02001344 data = ELEMENT_WRAPPER_START "<error-message><value>val</value>"EXT_SUBELEM"</error-message>" ELEMENT_WRAPPER_END;
1345 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001346 assert_string_equal(val, "val");
David Sedlákd1144562019-08-06 12:36:14 +02001347 assert_string_equal(exts[0].name, "myext:c-define");
1348 assert_int_equal(exts[0].insubstmt_index, 0);
1349 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRMSG);
1350 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1351 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001352 FREE_STRING(st->ctx, val);
1353
1354 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
1355 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1356 logbuf_assert("Missing mandatory subelement value of error-message element. Line number 1.");
1357
1358 st->finished_correctly = true;
1359}
1360
1361static void
1362test_fracdigits_elem(void **state)
1363{
1364 struct state *st = *state;
1365 const char *data;
1366 struct lysp_type type = {};
1367
1368 /* valid value */
David Sedlákd1144562019-08-06 12:36:14 +02001369 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\">"EXT_SUBELEM"</fraction-digits>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001370 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001371 assert_string_equal(type.exts[0].name, "myext:c-define");
1372 assert_int_equal(type.exts[0].insubstmt_index, 0);
1373 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_FRACDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001374 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001375 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlákd1144562019-08-06 12:36:14 +02001376 FREE_ARRAY(st->ctx, type.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001377
1378 /* invalid values */
1379 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
1380 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1381 logbuf_assert("Invalid value \"-1\" of \"fraction-digits\". Line number 1.");
1382
1383 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
1384 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1385 logbuf_assert("Invalid value \"02\" of \"fraction-digits\". Line number 1.");
1386
1387 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
1388 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1389 logbuf_assert("Invalid value \"1p\" of \"fraction-digits\". Line number 1.");
1390
1391 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
1392 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1393 logbuf_assert("Invalid value \"19\" of \"fraction-digits\". Line number 1.");
1394
1395 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
1396 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1397 logbuf_assert("Invalid value \"999999999999999999\" of \"fraction-digits\". Line number 1.");
1398
1399 st->finished_correctly = true;
1400}
1401
1402static void
1403test_iffeature_elem(void **state)
1404{
1405 struct state *st = *state;
1406 const char *data;
1407 const char **iffeatures = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001408 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001409
David Sedlákd1144562019-08-06 12:36:14 +02001410 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\">"EXT_SUBELEM"</if-feature>" ELEMENT_WRAPPER_END;
1411 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001412 assert_string_equal(*iffeatures, "local-storage");
David Sedlákd1144562019-08-06 12:36:14 +02001413 assert_string_equal(exts[0].name, "myext:c-define");
1414 assert_int_equal(exts[0].insubstmt_index, 0);
1415 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_IFFEATURE);
1416 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1417 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001418 FREE_STRING(st->ctx, *iffeatures);
1419 LY_ARRAY_FREE(iffeatures);
1420 iffeatures = NULL;
1421
1422 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
1423 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, false), LY_EVALID);
1424 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1425 LY_ARRAY_FREE(iffeatures);
1426 iffeatures = NULL;
1427
1428 st->finished_correctly = true;
1429}
1430
1431static void
1432test_length_elem(void **state)
1433{
1434 struct state *st = *state;
1435 const char *data;
1436 struct lysp_type type = {};
1437
1438 /* max subelems */
1439 data = ELEMENT_WRAPPER_START
1440 "<length value=\"length-str\">"
1441 "<error-message><value>err-msg</value></error-message>"
1442 "<error-app-tag value=\"err-app-tag\"/>"
1443 "<description><text>desc</text></description>"
1444 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001445 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001446 "</length>"
1447 ELEMENT_WRAPPER_END;
1448 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1449 assert_string_equal(type.length->arg, "length-str");
1450 assert_string_equal(type.length->emsg, "err-msg");
1451 assert_string_equal(type.length->eapptag, "err-app-tag");
1452 assert_string_equal(type.length->dsc, "desc");
1453 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001454 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlákd1144562019-08-06 12:36:14 +02001455 assert_string_equal(type.length->exts[0].name, "myext:c-define");
1456 assert_int_equal(type.length->exts[0].insubstmt_index, 0);
1457 assert_int_equal(type.length->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001458 lysp_type_free(st->ctx, &type);
1459 memset(&type, 0, sizeof(type));
1460
1461 /* min subelems */
1462 data = ELEMENT_WRAPPER_START
1463 "<length value=\"length-str\">"
1464 "</length>"
1465 ELEMENT_WRAPPER_END;
1466 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1467 assert_string_equal(type.length->arg, "length-str");
1468 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001469 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001470 memset(&type, 0, sizeof(type));
1471
1472 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
1473 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1474 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1475 lysp_type_free(st->ctx, &type);
1476 memset(&type, 0, sizeof(type));
1477
1478 st->finished_correctly = true;
1479}
1480
1481static void
1482test_modifier_elem(void **state)
1483{
1484 struct state *st = *state;
1485 const char *data;
1486 const char *pat = lydict_insert(st->ctx, "\006pattern", 8);
David Sedlákd1144562019-08-06 12:36:14 +02001487 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001488
David Sedlákd1144562019-08-06 12:36:14 +02001489 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\">" EXT_SUBELEM "</modifier>" ELEMENT_WRAPPER_END;
1490 assert_int_equal(test_element_helper(st, &data, &pat, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001491 assert_string_equal(pat, "\x015pattern");
David Sedlákd1144562019-08-06 12:36:14 +02001492 assert_string_equal(exts[0].name, "myext:c-define");
1493 assert_int_equal(exts[0].insubstmt_index, 0);
1494 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MODIFIER);
1495 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1496 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001497 FREE_STRING(st->ctx, pat);
1498
1499 pat = lydict_insert(st->ctx, "\006pattern", 8);
1500 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
1501 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, false), LY_EVALID);
1502 logbuf_assert("Invalid value \"invert\" of \"modifier\". Line number 1.");
1503 FREE_STRING(st->ctx, pat);
1504
1505 st->finished_correctly = true;
1506}
1507
1508static void
1509test_namespace_elem(void **state)
1510{
1511 struct state *st = *state;
1512 const char *data;
1513 const char *ns;
David Sedlákd1144562019-08-06 12:36:14 +02001514 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001515
David Sedlákd1144562019-08-06 12:36:14 +02001516 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\">" EXT_SUBELEM "</namespace>" ELEMENT_WRAPPER_END;
1517 assert_int_equal(test_element_helper(st, &data, &ns, NULL, &exts, true), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001518 assert_string_equal(ns, "ns");
David Sedlákd1144562019-08-06 12:36:14 +02001519 assert_string_equal(exts[0].name, "myext:c-define");
1520 assert_int_equal(exts[0].insubstmt_index, 0);
1521 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_NAMESPACE);
1522 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1523 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001524 FREE_STRING(st->ctx, ns);
1525
1526 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
1527 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, false), LY_EVALID);
1528 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1529
1530 st->finished_correctly = true;
1531}
1532
1533static void
1534test_path_elem(void **state)
1535{
1536 struct state *st = *state;
1537 const char *data;
1538 struct lysp_type type = {};
1539
David Sedlákd1144562019-08-06 12:36:14 +02001540 data = ELEMENT_WRAPPER_START "<path value=\"path-val\">" EXT_SUBELEM "</path>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001541 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1542 assert_string_equal("path-val", type.path);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001543 assert_true(type.flags & LYS_SET_PATH);
David Sedlákd1144562019-08-06 12:36:14 +02001544 assert_string_equal(type.exts[0].name, "myext:c-define");
1545 assert_int_equal(type.exts[0].insubstmt_index, 0);
1546 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_PATH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001547 lysp_type_free(st->ctx, &type);
1548
1549 st->finished_correctly = true;
1550}
1551
1552static void
1553test_pattern_elem(void **state)
1554{
1555 struct state *st = *state;
1556 const char *data;
1557 struct lysp_type type = {};
1558
1559 /* max subelems */
1560 data = ELEMENT_WRAPPER_START
1561 "<pattern value=\"super_pattern\">"
1562 "<modifier value=\"invert-match\"/>"
1563 "<error-message><value>err-msg-value</value></error-message>"
1564 "<error-app-tag value=\"err-app-tag-value\"/>"
1565 "<description><text>pattern-desc</text></description>"
1566 "<reference><text>pattern-ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001567 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001568 "</pattern>"
1569 ELEMENT_WRAPPER_END;
1570 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001571 assert_true(type.flags & LYS_SET_PATTERN);
David Sedlák8e7bda82019-07-16 17:57:50 +02001572 assert_string_equal(type.patterns->arg, "\x015super_pattern");
1573 assert_string_equal(type.patterns->dsc, "pattern-desc");
1574 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1575 assert_string_equal(type.patterns->emsg, "err-msg-value");
1576 assert_string_equal(type.patterns->dsc, "pattern-desc");
1577 assert_string_equal(type.patterns->ref, "pattern-ref");
David Sedlákd1144562019-08-06 12:36:14 +02001578 assert_string_equal(type.patterns->exts[0].name, "myext:c-define");
1579 assert_int_equal(type.patterns->exts[0].insubstmt_index, 0);
1580 assert_int_equal(type.patterns->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001581 lysp_type_free(st->ctx, &type);
1582 memset(&type, 0, sizeof(type));
1583
1584 /* min subelems */
1585 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
1586 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1587 assert_string_equal(type.patterns->arg, "\x006pattern");
1588 lysp_type_free(st->ctx, &type);
1589 memset(&type, 0, sizeof(type));
1590
1591 st->finished_correctly = true;
1592}
1593
1594static void
1595test_value_position_elem(void **state)
1596{
1597 struct state *st = *state;
1598 const char *data;
1599 struct lysp_type_enum en = {};
1600
1601 /* valid values */
David Sedlákd1144562019-08-06 12:36:14 +02001602 data = ELEMENT_WRAPPER_START "<value value=\"55\">" EXT_SUBELEM "</value>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001603 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1604 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001605 assert_true(en.flags & LYS_SET_VALUE);
David Sedlákd1144562019-08-06 12:36:14 +02001606 assert_string_equal(en.exts[0].name, "myext:c-define");
1607 assert_int_equal(en.exts[0].insubstmt_index, 0);
1608 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_VALUE);
1609 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001610 memset(&en, 0, sizeof(en));
1611
1612 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
1613 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1614 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001615 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001616 memset(&en, 0, sizeof(en));
1617
1618 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
1619 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1620 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001621 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001622 memset(&en, 0, sizeof(en));
1623
1624 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
1625 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1626 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001627 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001628 memset(&en, 0, sizeof(en));
1629
1630 /* valid positions */
David Sedlák8d552d62019-08-06 15:29:05 +02001631 data = ELEMENT_WRAPPER_START "<position value=\"55\">" EXT_SUBELEM "</position>" ELEMENT_WRAPPER_END;
David Sedlák8e7bda82019-07-16 17:57:50 +02001632 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1633 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001634 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8d552d62019-08-06 15:29:05 +02001635 assert_string_equal(en.exts[0].name, "myext:c-define");
1636 assert_int_equal(en.exts[0].insubstmt_index, 0);
1637 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_POSITION);
1638 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001639 memset(&en, 0, sizeof(en));
1640
1641 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
1642 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1643 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001644 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001645 memset(&en, 0, sizeof(en));
1646
1647 /* invalid values */
1648 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
1649 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1650 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\". Line number 1.");
1651
1652 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
1653 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1654 logbuf_assert("Invalid value \"1k\" of \"value\". Line number 1.");
1655
David Sedlák69f01612019-07-17 11:41:08 +02001656 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
1657 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1658 logbuf_assert("Invalid value \"\" of \"value\". Line number 1.");
1659
David Sedlák8e7bda82019-07-16 17:57:50 +02001660 /*invalid positions */
1661 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
1662 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1663 logbuf_assert("Invalid value \"-5\" of \"position\". Line number 1.");
1664
1665 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
1666 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1667 logbuf_assert("Invalid value \"-0\" of \"position\". Line number 1.");
1668
1669 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
1670 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1671 logbuf_assert("Invalid value \"99999999999999999999\" of \"position\". Line number 1.");
1672
David Sedlák69f01612019-07-17 11:41:08 +02001673 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
1674 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1675 logbuf_assert("Invalid value \"\" of \"position\". Line number 1.");
1676
1677 st->finished_correctly = true;
1678}
1679
1680static void
1681test_prefix_elem(void **state)
1682{
1683 struct state *st = *state;
1684 const char *data;
1685 const char *value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001686 struct lysp_ext_instance *exts = NULL;
1687
1688 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\">" EXT_SUBELEM "</prefix>" ELEMENT_WRAPPER_END;
1689 assert_int_equal(test_element_helper(st, &data, &value, NULL, &exts, true), LY_SUCCESS);
1690 assert_string_equal(value, "pref");
1691 assert_string_equal(exts[0].name, "myext:c-define");
1692 assert_int_equal(exts[0].insubstmt_index, 0);
1693 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PREFIX);
1694 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1695 exts = NULL;
1696 FREE_STRING(st->ctx, value);
David Sedlák69f01612019-07-17 11:41:08 +02001697
1698 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
1699 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
1700 assert_string_equal(value, "pref");
1701 FREE_STRING(st->ctx, value);
1702
1703 st->finished_correctly = true;
1704}
1705
1706static void
1707test_range_elem(void **state)
1708{
1709 struct state *st = *state;
1710 const char *data;
1711 struct lysp_type type = {};
1712
1713 /* max subelems */
1714 data = ELEMENT_WRAPPER_START
1715 "<range value=\"range-str\">"
1716 "<error-message><value>err-msg</value></error-message>"
1717 "<error-app-tag value=\"err-app-tag\" />"
1718 "<description><text>desc</text></description>"
1719 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001720 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001721 "</range>"
1722 ELEMENT_WRAPPER_END;
1723 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1724 assert_string_equal(type.range->arg, "range-str");
1725 assert_string_equal(type.range->dsc, "desc");
1726 assert_string_equal(type.range->eapptag, "err-app-tag");
1727 assert_string_equal(type.range->emsg, "err-msg");
1728 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001729 assert_true(type.flags & LYS_SET_RANGE);
David Sedlákd1144562019-08-06 12:36:14 +02001730 assert_string_equal(type.range->exts[0].name, "myext:c-define");
1731 assert_int_equal(type.range->exts[0].insubstmt_index, 0);
1732 assert_int_equal(type.range->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001733 lysp_type_free(st->ctx, &type);
1734 memset(&type, 0, sizeof(type));
1735
1736 /* min subelems */
1737 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" 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 lysp_type_free(st->ctx, &type);
1741 memset(&type, 0, sizeof(type));
1742
1743 st->finished_correctly = true;
1744}
1745
1746static void
1747test_reqinstance_elem(void **state)
1748{
1749 struct state *st = *state;
1750 const char *data;
1751 struct lysp_type type = {};
1752
David Sedlákd1144562019-08-06 12:36:14 +02001753 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\">" EXT_SUBELEM "</require-instance>" ELEMENT_WRAPPER_END;
David Sedlák69f01612019-07-17 11:41:08 +02001754 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1755 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001756 assert_true(type.flags & LYS_SET_REQINST);
David Sedlákd1144562019-08-06 12:36:14 +02001757 assert_string_equal(type.exts[0].name, "myext:c-define");
1758 assert_int_equal(type.exts[0].insubstmt_index, 0);
1759 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_REQINSTANCE);
1760 lysp_type_free(st->ctx, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001761 memset(&type, 0, sizeof(type));
1762
1763 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
1764 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1765 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001766 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001767 memset(&type, 0, sizeof(type));
1768
1769 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1770 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1771 memset(&type, 0, sizeof(type));
1772 logbuf_assert("Invalid value \"invalid\" of \"require-instance\". Line number 1.");
1773
1774 st->finished_correctly = true;
1775}
1776
1777static void
1778test_revision_date_elem(void **state)
1779{
1780 struct state *st = *state;
1781 const char *data;
1782 char rev[LY_REV_SIZE];
David Sedlákd1144562019-08-06 12:36:14 +02001783 struct lysp_ext_instance *exts = NULL;
1784
1785 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\">"EXT_SUBELEM"</revision-date>" ELEMENT_WRAPPER_END;
1786 assert_int_equal(test_element_helper(st, &data, rev, NULL, &exts, true), LY_SUCCESS);
1787 assert_string_equal(rev, "2000-01-01");
1788 assert_string_equal(exts[0].name, "myext:c-define");
1789 assert_int_equal(exts[0].insubstmt_index, 0);
1790 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_REVISIONDATE);
1791 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák69f01612019-07-17 11:41:08 +02001792
1793 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
1794 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, true), LY_SUCCESS);
1795 assert_string_equal(rev, "2000-01-01");
1796
1797 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
1798 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, false), LY_EVALID);
1799 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1800
1801 st->finished_correctly = true;
1802}
1803
1804static void
1805test_unique_elem(void **state)
1806{
1807 struct state *st = *state;
1808 const char *data;
1809 const char **values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001810 struct lysp_ext_instance *exts = NULL;
1811
1812 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\">"EXT_SUBELEM"</unique>" ELEMENT_WRAPPER_END;
1813 assert_int_equal(test_element_helper(st, &data, &values, NULL, &exts, true), LY_SUCCESS);
1814 assert_string_equal(*values, "tag");
1815 assert_string_equal(exts[0].name, "myext:c-define");
1816 assert_int_equal(exts[0].insubstmt_index, 0);
1817 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNIQUE);
1818 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1819 FREE_STRING(st->ctx, *values);
1820 LY_ARRAY_FREE(values);
1821 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001822
1823 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
1824 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1825 assert_string_equal(*values, "tag");
1826 FREE_STRING(st->ctx, *values);
1827 LY_ARRAY_FREE(values);
David Sedlákd1144562019-08-06 12:36:14 +02001828 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001829
1830 st->finished_correctly = true;
1831}
1832
1833static void
1834test_units_elem(void **state)
1835{
1836 struct state *st = *state;
1837 const char *data;
1838 const char *values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001839 struct lysp_ext_instance *exts = NULL;
1840
1841 data = ELEMENT_WRAPPER_START "<units name=\"name\">"EXT_SUBELEM"</units>" ELEMENT_WRAPPER_END;
1842 assert_int_equal(test_element_helper(st, &data, &values, NULL, &exts, true), LY_SUCCESS);
1843 assert_string_equal(values, "name");
1844 assert_string_equal(exts[0].name, "myext:c-define");
1845 assert_int_equal(exts[0].insubstmt_index, 0);
1846 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNITS);
1847 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1848 FREE_STRING(st->ctx, values);
1849 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001850
1851 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
1852 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1853 assert_string_equal(values, "name");
1854 FREE_STRING(st->ctx, values);
David Sedlákd1144562019-08-06 12:36:14 +02001855 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001856
1857 st->finished_correctly = true;
1858}
1859
1860static void
1861test_when_elem(void **state)
1862{
1863 struct state *st = *state;
1864 const char *data;
1865 struct lysp_when *when = NULL;
1866
1867 data = ELEMENT_WRAPPER_START
1868 "<when condition=\"cond\">"
1869 "<description><text>desc</text></description>"
1870 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001871 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001872 "</when>"
1873 ELEMENT_WRAPPER_END;
1874 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1875 assert_string_equal(when->cond, "cond");
1876 assert_string_equal(when->dsc, "desc");
1877 assert_string_equal(when->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02001878 assert_string_equal(when->exts[0].name, "myext:c-define");
1879 assert_int_equal(when->exts[0].insubstmt_index, 0);
1880 assert_int_equal(when->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001881 lysp_when_free(st->ctx, when);
1882 free(when);
1883 when = NULL;
1884
1885 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
1886 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1887 assert_string_equal(when->cond, "cond");
1888 lysp_when_free(st->ctx, when);
1889 free(when);
1890 when = NULL;
1891
1892 st->finished_correctly = true;
1893}
1894
1895static void
1896test_yin_text_value_elem(void **state)
1897{
1898 struct state *st = *state;
1899 const char *data;
1900 const char *val;
1901
1902 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
1903 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1904 assert_string_equal(val, "text");
1905 FREE_STRING(st->ctx, val);
1906
1907 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
1908 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1909 assert_string_equal(val, "text");
1910 FREE_STRING(st->ctx, val);
1911
1912 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
1913 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1914 assert_string_equal("", val);
1915 FREE_STRING(st->ctx, val);
1916
David Sedlák8e7bda82019-07-16 17:57:50 +02001917 st->finished_correctly = true;
1918}
David Sedlák32488102019-07-15 17:44:10 +02001919
David Sedlák374d2b32019-07-17 15:06:55 +02001920static void
1921test_type_elem(void **state)
1922{
1923 struct state *st = *state;
1924 const char *data;
1925 struct lysp_type type = {};
1926
1927 /* max subelems */
1928 data = ELEMENT_WRAPPER_START
1929 "<type name=\"type-name\">"
1930 "<base name=\"base-name\"/>"
1931 "<bit name=\"bit\"/>"
1932 "<enum name=\"enum\"/>"
1933 "<fraction-digits value=\"2\"/>"
1934 "<length value=\"length\"/>"
1935 "<path value=\"path\"/>"
1936 "<pattern value=\"pattern\"/>"
1937 "<range value=\"range\" />"
1938 "<require-instance value=\"true\"/>"
1939 "<type name=\"sub-type-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02001940 EXT_SUBELEM
David Sedlák374d2b32019-07-17 15:06:55 +02001941 "</type>"
1942 ELEMENT_WRAPPER_END;
1943 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1944 assert_string_equal(type.name, "type-name");
1945 assert_string_equal(*type.bases, "base-name");
1946 assert_string_equal(type.bits->name, "bit");
1947 assert_string_equal(type.enums->name, "enum");
1948 assert_int_equal(type.fraction_digits, 2);
1949 assert_string_equal(type.length->arg, "length");
1950 assert_string_equal(type.path, "path");
1951 assert_string_equal(type.patterns->arg, "\006pattern");
1952 assert_string_equal(type.range->arg, "range");
1953 assert_int_equal(type.require_instance, 1);
1954 assert_string_equal(type.types->name, "sub-type-name");
David Sedlákd1144562019-08-06 12:36:14 +02001955 assert_string_equal(type.exts[0].name, "myext:c-define");
1956 assert_int_equal(type.exts[0].insubstmt_index, 0);
1957 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001958 assert_true(type.flags & LYS_SET_BASE);
1959 assert_true(type.flags & LYS_SET_BIT);
1960 assert_true(type.flags & LYS_SET_ENUM);
1961 assert_true(type.flags & LYS_SET_FRDIGITS);
1962 assert_true(type.flags & LYS_SET_LENGTH);
1963 assert_true(type.flags & LYS_SET_PATH);
1964 assert_true(type.flags & LYS_SET_PATTERN);
1965 assert_true(type.flags & LYS_SET_RANGE);
1966 assert_true(type.flags & LYS_SET_REQINST);
1967 assert_true(type.flags & LYS_SET_TYPE);
David Sedlákd1144562019-08-06 12:36:14 +02001968 lysp_type_free(st->ctx, &type);
David Sedlák374d2b32019-07-17 15:06:55 +02001969 memset(&type, 0, sizeof(type));
1970
1971 /* min subelems */
1972 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
1973 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1974 lysp_type_free(st->ctx, &type);
1975 memset(&type, 0, sizeof(type));
1976
1977 st->finished_correctly = true;
1978}
1979
David Sedlák1af868e2019-07-17 17:03:14 +02001980static void
1981test_max_elems_elem(void **state)
1982{
1983 struct state *st = *state;
1984 const char *data;
1985 struct lysp_node_list list = {};
1986 struct lysp_node_leaflist llist = {};
1987 struct lysp_refine refine = {};
1988
David Sedlákd1144562019-08-06 12:36:14 +02001989 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 +02001990 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1991 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001992 assert_true(refine.flags & LYS_SET_MAX);
David Sedlákd1144562019-08-06 12:36:14 +02001993 assert_string_equal(refine.exts[0].name, "myext:c-define");
1994 assert_int_equal(refine.exts[0].insubstmt_index, 0);
1995 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
1996 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02001997
David Sedlákd1144562019-08-06 12:36:14 +02001998 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 +02001999 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
2000 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002001 assert_true(list.flags & LYS_SET_MAX);
David Sedlákd1144562019-08-06 12:36:14 +02002002 assert_string_equal(list.exts[0].name, "myext:c-define");
2003 assert_int_equal(list.exts[0].insubstmt_index, 0);
2004 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2005 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002006
David Sedlákd1144562019-08-06 12:36:14 +02002007 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 +02002008 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
2009 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002010 assert_true(llist.flags & LYS_SET_MAX);
David Sedlákd1144562019-08-06 12:36:14 +02002011 assert_string_equal(llist.exts[0].name, "myext:c-define");
2012 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2013 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2014 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002015
2016 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
2017 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
2018 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002019 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02002020
2021 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
2022 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2023 logbuf_assert("Invalid value \"0\" of \"max-elements\". Line number 1.");
2024
2025 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
2026 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2027 logbuf_assert("Invalid value \"-10\" of \"max-elements\". Line number 1.");
2028
2029 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
2030 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2031 logbuf_assert("Invalid value \"k\" of \"max-elements\". Line number 1.");
2032
2033 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
2034 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
2035 logbuf_assert("Invalid value \"u12\" of \"max-elements\". Line number 1.");
2036
2037 st->finished_correctly = true;
2038}
2039
David Sedlák09e18c92019-07-18 11:17:11 +02002040static void
2041test_min_elems_elem(void **state)
2042{
2043 struct state *st = *state;
2044 const char *data;
2045 struct lysp_node_list list = {};
2046 struct lysp_node_leaflist llist = {};
2047 struct lysp_refine refine = {};
2048
David Sedlákd1144562019-08-06 12:36:14 +02002049 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 +02002050 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
2051 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002052 assert_true(refine.flags & LYS_SET_MIN);
David Sedlákd1144562019-08-06 12:36:14 +02002053 assert_string_equal(refine.exts[0].name, "myext:c-define");
2054 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2055 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2056 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002057
David Sedlákd1144562019-08-06 12:36:14 +02002058 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 +02002059 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
2060 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002061 assert_true(list.flags & LYS_SET_MIN);
David Sedlákd1144562019-08-06 12:36:14 +02002062 assert_string_equal(list.exts[0].name, "myext:c-define");
2063 assert_int_equal(list.exts[0].insubstmt_index, 0);
2064 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2065 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002066
David Sedlákd1144562019-08-06 12:36:14 +02002067 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 +02002068 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
2069 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002070 assert_true(llist.flags & LYS_SET_MIN);
David Sedlákd1144562019-08-06 12:36:14 +02002071 assert_string_equal(llist.exts[0].name, "myext:c-define");
2072 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2073 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2074 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002075
2076 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
2077 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2078 logbuf_assert("Value \"-5\" is out of \"min-elements\" bounds. Line number 1.");
2079
2080 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
2081 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2082 logbuf_assert("Value \"99999999999999999\" is out of \"min-elements\" bounds. Line number 1.");
2083
2084 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
2085 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2086 logbuf_assert("Invalid value \"5k\" of \"min-elements\". Line number 1.");
2087
2088 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
2089 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
2090 logbuf_assert("Invalid value \"05\" of \"min-elements\". Line number 1.");
2091
2092 st->finished_correctly = true;
2093}
2094
David Sedláka2dad212019-07-18 12:45:19 +02002095static void
2096test_ordby_elem(void **state)
2097{
2098 struct state *st = *state;
2099 const char *data;
2100 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02002101 struct lysp_ext_instance *exts = NULL;
David Sedláka2dad212019-07-18 12:45:19 +02002102
David Sedlákd1144562019-08-06 12:36:14 +02002103 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\">"EXT_SUBELEM"</ordered-by>" ELEMENT_WRAPPER_END;
2104 assert_int_equal(test_element_helper(st, &data, &flags, NULL, &exts, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002105 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedlákd1144562019-08-06 12:36:14 +02002106 assert_string_equal(exts[0].name, "myext:c-define");
2107 assert_int_equal(exts[0].insubstmt_index, 0);
2108 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORDEREDBY);
2109 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedláka2dad212019-07-18 12:45:19 +02002110
2111 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
2112 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002113 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02002114
2115 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
2116 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
2117 logbuf_assert("Invalid value \"inv\" of \"ordered-by\". Line number 1.");
2118
2119 st->finished_correctly = true;
2120}
2121
David Sedlák8a83bbb2019-07-18 14:46:00 +02002122static void
2123test_any_elem(void **state)
2124{
2125 struct state *st = *state;
2126 const char *data;
2127 struct lysp_node *siblings = NULL;
2128 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
2129 struct lysp_node_anydata *parsed = NULL;
2130
2131 /* anyxml max subelems */
2132 data = ELEMENT_WRAPPER_START
2133 "<anyxml name=\"any-name\">"
2134 "<config value=\"true\" />"
2135 "<description><text>desc</text></description>"
2136 "<if-feature name=\"feature\" />"
2137 "<mandatory value=\"true\" />"
2138 "<must condition=\"must-cond\" />"
2139 "<reference><text>ref</text></reference>"
2140 "<status value=\"deprecated\"/>"
2141 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002142 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002143 "</anyxml>"
2144 ELEMENT_WRAPPER_END;
2145 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2146 parsed = (struct lysp_node_anydata *)siblings;
2147 assert_null(parsed->parent);
2148 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002149 assert_true(parsed->flags & LYS_CONFIG_W);
2150 assert_true(parsed->flags & LYS_MAND_TRUE);
2151 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002152 assert_null(parsed->next);
2153 assert_string_equal(parsed->name, "any-name");
2154 assert_string_equal(parsed->dsc, "desc");
2155 assert_string_equal(parsed->ref, "ref");
2156 assert_string_equal(parsed->when->cond, "when-cond");
2157 assert_string_equal(*parsed->iffeatures, "feature");
David Sedlákd1144562019-08-06 12:36:14 +02002158 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2159 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2160 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002161 lysp_node_free(st->ctx, siblings);
2162 siblings = NULL;
2163
2164 /* anydata max subelems */
2165 data = ELEMENT_WRAPPER_START
2166 "<anydata name=\"any-name\">"
2167 "<config value=\"true\" />"
2168 "<description><text>desc</text></description>"
2169 "<if-feature name=\"feature\" />"
2170 "<mandatory value=\"true\" />"
2171 "<must condition=\"must-cond\" />"
2172 "<reference><text>ref</text></reference>"
2173 "<status value=\"deprecated\"/>"
2174 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002175 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002176 "</anydata>"
2177 ELEMENT_WRAPPER_END;
2178 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2179 parsed = (struct lysp_node_anydata *)siblings;
2180 assert_null(parsed->parent);
2181 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002182 assert_true(parsed->flags & LYS_CONFIG_W);
2183 assert_true(parsed->flags & LYS_MAND_TRUE);
2184 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002185 assert_null(parsed->next);
2186 assert_string_equal(parsed->name, "any-name");
2187 assert_string_equal(parsed->dsc, "desc");
2188 assert_string_equal(parsed->ref, "ref");
2189 assert_string_equal(parsed->when->cond, "when-cond");
2190 assert_string_equal(*parsed->iffeatures, "feature");
David Sedlákd1144562019-08-06 12:36:14 +02002191 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2192 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2193 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002194 lysp_node_free(st->ctx, siblings);
2195 siblings = NULL;
2196
2197 /* min subelems */
2198 node_meta.parent = (void *)0x10;
2199 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
2200 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2201 parsed = (struct lysp_node_anydata *)siblings;
2202 assert_ptr_equal(parsed->parent, node_meta.parent);
2203 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
2204 assert_null(parsed->next);
2205 assert_null(parsed->exts);
2206 lysp_node_free(st->ctx, siblings);
2207
2208 st->finished_correctly = true;
2209}
2210
David Sedlák203ca3a2019-07-18 15:26:25 +02002211static void
2212test_leaf_elem(void **state)
2213{
2214 struct state *st = *state;
2215 const char *data;
2216 struct lysp_node *siblings = NULL;
2217 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
2218 struct lysp_node_leaf *parsed = NULL;
2219
2220 /* max elements */
2221 data = ELEMENT_WRAPPER_START
2222 "<leaf name=\"leaf\">"
2223 "<config value=\"true\" />"
2224 "<default value=\"def-val\"/>"
2225 "<description><text>desc</text></description>"
2226 "<if-feature name=\"feature\" />"
2227 "<mandatory value=\"true\" />"
2228 "<must condition=\"must-cond\" />"
2229 "<reference><text>ref</text></reference>"
2230 "<status value=\"deprecated\"/>"
2231 "<type name=\"type\"/>"
2232 "<units name=\"uni\"/>"
2233 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002234 EXT_SUBELEM
David Sedlák203ca3a2019-07-18 15:26:25 +02002235 "</leaf>"
2236 ELEMENT_WRAPPER_END;
2237 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2238 parsed = (struct lysp_node_leaf *)siblings;
2239 assert_null(parsed->parent);
2240 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002241 assert_true(parsed->flags & LYS_CONFIG_W);
2242 assert_true(parsed->flags & LYS_MAND_TRUE);
2243 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02002244 assert_null(parsed->next);
2245 assert_string_equal(parsed->name, "leaf");
2246 assert_string_equal(parsed->dsc, "desc");
2247 assert_string_equal(parsed->ref, "ref");
2248 assert_string_equal(parsed->when->cond, "when-cond");
2249 assert_string_equal(*parsed->iffeatures, "feature");
David Sedlákd1144562019-08-06 12:36:14 +02002250 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2251 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2252 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák203ca3a2019-07-18 15:26:25 +02002253 assert_string_equal(parsed->musts->arg, "must-cond");
2254 assert_string_equal(parsed->type.name, "type");
2255 assert_string_equal(parsed->units, "uni");
2256 assert_string_equal(parsed->dflt, "def-val");
2257 lysp_node_free(st->ctx, siblings);
2258 siblings = NULL;
2259
2260 /* min elements */
2261 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
2262 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2263 parsed = (struct lysp_node_leaf *)siblings;
2264 assert_string_equal(parsed->name, "leaf");
2265 assert_string_equal(parsed->type.name, "type");
2266 lysp_node_free(st->ctx, siblings);
2267 siblings = NULL;
2268
2269 st->finished_correctly = true;
2270}
2271
David Sedlákc3da3ef2019-07-19 12:56:08 +02002272static void
2273test_leaf_list_elem(void **state)
2274{
2275 struct state *st = *state;
2276 const char *data;
2277 struct lysp_node *siblings = NULL;
2278 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
2279 struct lysp_node_leaflist *parsed = NULL;
2280
2281 data = ELEMENT_WRAPPER_START
2282 "<leaf-list name=\"llist\">"
2283 "<config value=\"true\" />"
2284 "<default value=\"def-val0\"/>"
2285 "<default value=\"def-val1\"/>"
2286 "<description><text>desc</text></description>"
2287 "<if-feature name=\"feature\"/>"
2288 "<max-elements value=\"5\"/>"
2289 "<must condition=\"must-cond\"/>"
2290 "<ordered-by value=\"user\" />"
2291 "<reference><text>ref</text></reference>"
2292 "<status value=\"current\"/>"
2293 "<type name=\"type\"/>"
2294 "<units name=\"uni\"/>"
2295 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002296 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002297 "</leaf-list>"
2298 ELEMENT_WRAPPER_END;
2299 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2300 parsed = (struct lysp_node_leaflist *)siblings;
2301 assert_string_equal(parsed->dflts[0], "def-val0");
2302 assert_string_equal(parsed->dflts[1], "def-val1");
2303 assert_string_equal(parsed->dsc, "desc");
2304 assert_string_equal(*parsed->iffeatures, "feature");
2305 assert_int_equal(parsed->max, 5);
2306 assert_string_equal(parsed->musts->arg, "must-cond");
2307 assert_string_equal(parsed->name, "llist");
2308 assert_null(parsed->next);
2309 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2310 assert_null(parsed->parent);
2311 assert_string_equal(parsed->ref, "ref");
2312 assert_string_equal(parsed->type.name, "type");
2313 assert_string_equal(parsed->units, "uni");
2314 assert_string_equal(parsed->when->cond, "when-cond");
2315 assert_true(parsed->flags & LYS_CONFIG_W);
2316 assert_true(parsed->flags & LYS_ORDBY_USER);
2317 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedlákd1144562019-08-06 12:36:14 +02002318 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2319 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2320 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002321 lysp_node_free(st->ctx, siblings);
2322 siblings = NULL;
2323
2324 data = ELEMENT_WRAPPER_START
2325 "<leaf-list name=\"llist\">"
2326 "<config value=\"true\" />"
2327 "<description><text>desc</text></description>"
2328 "<if-feature name=\"feature\"/>"
2329 "<min-elements value=\"5\"/>"
2330 "<must condition=\"must-cond\"/>"
2331 "<ordered-by value=\"user\" />"
2332 "<reference><text>ref</text></reference>"
2333 "<status value=\"current\"/>"
2334 "<type name=\"type\"/>"
2335 "<units name=\"uni\"/>"
2336 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002337 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002338 "</leaf-list>"
2339 ELEMENT_WRAPPER_END;
2340 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2341 parsed = (struct lysp_node_leaflist *)siblings;
2342 assert_string_equal(parsed->dsc, "desc");
2343 assert_string_equal(*parsed->iffeatures, "feature");
2344 assert_int_equal(parsed->min, 5);
2345 assert_string_equal(parsed->musts->arg, "must-cond");
2346 assert_string_equal(parsed->name, "llist");
2347 assert_null(parsed->next);
2348 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2349 assert_null(parsed->parent);
2350 assert_string_equal(parsed->ref, "ref");
2351 assert_string_equal(parsed->type.name, "type");
2352 assert_string_equal(parsed->units, "uni");
2353 assert_string_equal(parsed->when->cond, "when-cond");
2354 assert_true(parsed->flags & LYS_CONFIG_W);
2355 assert_true(parsed->flags & LYS_ORDBY_USER);
2356 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedlákd1144562019-08-06 12:36:14 +02002357 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2358 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2359 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002360 lysp_node_free(st->ctx, siblings);
2361 siblings = NULL;
2362
2363 data = ELEMENT_WRAPPER_START
2364 "<leaf-list name=\"llist\">"
2365 "<config value=\"true\" />"
2366 "<description><text>desc</text></description>"
2367 "<if-feature name=\"feature\"/>"
2368 "<max-elements value=\"15\"/>"
2369 "<min-elements value=\"5\"/>"
2370 "<must condition=\"must-cond\"/>"
2371 "<ordered-by value=\"user\" />"
2372 "<reference><text>ref</text></reference>"
2373 "<status value=\"current\"/>"
2374 "<type name=\"type\"/>"
2375 "<units name=\"uni\"/>"
2376 "<when condition=\"when-cond\"/>"
2377 "</leaf-list>"
2378 ELEMENT_WRAPPER_END;
2379 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2380 parsed = (struct lysp_node_leaflist *)siblings;
2381 assert_string_equal(parsed->dsc, "desc");
2382 assert_string_equal(*parsed->iffeatures, "feature");
2383 assert_int_equal(parsed->min, 5);
2384 assert_int_equal(parsed->max, 15);
2385 assert_string_equal(parsed->musts->arg, "must-cond");
2386 assert_string_equal(parsed->name, "llist");
2387 assert_null(parsed->next);
2388 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2389 assert_null(parsed->parent);
2390 assert_string_equal(parsed->ref, "ref");
2391 assert_string_equal(parsed->type.name, "type");
2392 assert_string_equal(parsed->units, "uni");
2393 assert_string_equal(parsed->when->cond, "when-cond");
2394 assert_true(parsed->flags & LYS_CONFIG_W);
2395 assert_true(parsed->flags & LYS_ORDBY_USER);
2396 assert_true(parsed->flags & LYS_STATUS_CURR);
2397 lysp_node_free(st->ctx, siblings);
2398 siblings = NULL;
2399
2400 data = ELEMENT_WRAPPER_START
2401 "<leaf-list name=\"llist\">"
2402 "<type name=\"type\"/>"
2403 "</leaf-list>"
2404 ELEMENT_WRAPPER_END;
2405 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2406 parsed = (struct lysp_node_leaflist *)siblings;
2407 assert_string_equal(parsed->name, "llist");
2408 assert_string_equal(parsed->type.name, "type");
2409 lysp_node_free(st->ctx, siblings);
2410 siblings = NULL;
2411
2412 /* invalid combinations */
2413 data = ELEMENT_WRAPPER_START
2414 "<leaf-list name=\"llist\">"
2415 "<max-elements value=\"5\"/>"
2416 "<min-elements value=\"15\"/>"
2417 "<type name=\"type\"/>"
2418 "</leaf-list>"
2419 ELEMENT_WRAPPER_END;
2420 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2421 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2422 lysp_node_free(st->ctx, siblings);
2423 siblings = NULL;
2424
2425 data = ELEMENT_WRAPPER_START
2426 "<leaf-list name=\"llist\">"
2427 "<default value=\"def-val1\"/>"
2428 "<min-elements value=\"15\"/>"
2429 "<type name=\"type\"/>"
2430 "</leaf-list>"
2431 ELEMENT_WRAPPER_END;
2432 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2433 logbuf_assert("Invalid combination of keywords \"min-elements\" and \"default\" as substatements of \"leaf-list\". Line number 1.");
2434 lysp_node_free(st->ctx, siblings);
2435 siblings = NULL;
2436
2437 data = ELEMENT_WRAPPER_START
2438 "<leaf-list name=\"llist\">"
2439 "</leaf-list>"
2440 ELEMENT_WRAPPER_END;
2441 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2442 logbuf_assert("Missing mandatory subelement type of leaf-list element. Line number 1.");
2443 lysp_node_free(st->ctx, siblings);
2444 siblings = NULL;
2445
2446 st->finished_correctly = true;
2447}
2448
David Sedlákcb39f642019-07-19 13:19:55 +02002449static void
2450test_presence_elem(void **state)
2451{
2452 struct state *st = *state;
2453 const char *data;
2454 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002455 struct lysp_ext_instance *exts = NULL;
2456
2457 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\">"EXT_SUBELEM"</presence>" ELEMENT_WRAPPER_END;
2458 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
2459 assert_string_equal(val, "presence-val");
2460 assert_string_equal(exts[0].name, "myext:c-define");
2461 assert_int_equal(exts[0].insubstmt_index, 0);
2462 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PRESENCE);
2463 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2464 FREE_STRING(st->ctx, val);
David Sedlákcb39f642019-07-19 13:19:55 +02002465
2466 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
2467 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2468 assert_string_equal(val, "presence-val");
2469 FREE_STRING(st->ctx, val);
2470
2471 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
2472 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2473 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2474
2475 st->finished_correctly = true;
2476}
2477
David Sedlák12470a82019-07-19 13:44:36 +02002478static void
2479test_key_elem(void **state)
2480{
2481 struct state *st = *state;
2482 const char *data;
2483 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002484 struct lysp_ext_instance *exts = NULL;
2485
2486 data = ELEMENT_WRAPPER_START "<key value=\"key-value\">"EXT_SUBELEM"</key>" ELEMENT_WRAPPER_END;
2487 assert_int_equal(test_element_helper(st, &data, &val, NULL, &exts, true), LY_SUCCESS);
2488 assert_string_equal(val, "key-value");
2489 assert_string_equal(exts[0].name, "myext:c-define");
2490 assert_int_equal(exts[0].insubstmt_index, 0);
2491 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_KEY);
2492 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2493 FREE_STRING(st->ctx, val);
David Sedlák12470a82019-07-19 13:44:36 +02002494
2495 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
2496 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2497 assert_string_equal(val, "key-value");
2498 FREE_STRING(st->ctx, val);
2499
2500 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
2501 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2502 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2503
2504 st->finished_correctly = true;
2505}
2506
David Sedlák04e17b22019-07-19 15:29:48 +02002507static void
2508test_typedef_elem(void **state)
2509{
2510 struct state *st = *state;
2511 const char *data;
2512 struct lysp_tpdf *tpdfs = NULL;
2513 struct typedef_meta typdef_meta = {NULL, &tpdfs};
2514
2515 data = ELEMENT_WRAPPER_START
2516 "<typedef name=\"tpdf-name\">"
2517 "<default value=\"def-val\"/>"
2518 "<description><text>desc-text</text></description>"
2519 "<reference><text>ref-text</text></reference>"
2520 "<status value=\"current\"/>"
2521 "<type name=\"type\"/>"
2522 "<units name=\"uni\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002523 EXT_SUBELEM
David Sedlák04e17b22019-07-19 15:29:48 +02002524 "</typedef>"
2525 ELEMENT_WRAPPER_END;
2526 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2527 assert_string_equal(tpdfs[0].dflt, "def-val");
2528 assert_string_equal(tpdfs[0].dsc, "desc-text");
David Sedlák04e17b22019-07-19 15:29:48 +02002529 assert_string_equal(tpdfs[0].name, "tpdf-name");
2530 assert_string_equal(tpdfs[0].ref, "ref-text");
2531 assert_string_equal(tpdfs[0].type.name, "type");
2532 assert_string_equal(tpdfs[0].units, "uni");
2533 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
David Sedlákd1144562019-08-06 12:36:14 +02002534 assert_string_equal(tpdfs[0].exts[0].name, "myext:c-define");
2535 assert_int_equal(tpdfs[0].exts[0].insubstmt_index, 0);
2536 assert_int_equal(tpdfs[0].exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák04e17b22019-07-19 15:29:48 +02002537 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2538 tpdfs = NULL;
2539
2540 data = ELEMENT_WRAPPER_START
2541 "<typedef name=\"tpdf-name\">"
2542 "<type name=\"type\"/>"
2543 "</typedef>"
2544 ELEMENT_WRAPPER_END;
2545 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2546 assert_string_equal(tpdfs[0].name, "tpdf-name");
2547 assert_string_equal(tpdfs[0].type.name, "type");
2548 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2549 tpdfs = NULL;
2550
2551 st->finished_correctly = true;
2552}
2553
David Sedlákd2d676a2019-07-22 11:28:19 +02002554static void
2555test_refine_elem(void **state)
2556{
2557 struct state *st = *state;
2558 const char *data;
2559 struct lysp_refine *refines = NULL;
2560
2561 /* max subelems */
2562 data = ELEMENT_WRAPPER_START
2563 "<refine target-node=\"target\">"
2564 "<if-feature name=\"feature\" />"
2565 "<must condition=\"cond\" />"
2566 "<presence value=\"presence\" />"
2567 "<default value=\"def\" />"
2568 "<config value=\"true\" />"
2569 "<mandatory value=\"true\" />"
2570 "<min-elements value=\"10\" />"
2571 "<max-elements value=\"20\" />"
2572 "<description><text>desc</text></description>"
2573 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002574 EXT_SUBELEM
David Sedlákd2d676a2019-07-22 11:28:19 +02002575 "</refine>"
2576 ELEMENT_WRAPPER_END;
2577 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2578 assert_string_equal(refines->nodeid, "target");
2579 assert_string_equal(*refines->dflts, "def");
2580 assert_string_equal(refines->dsc, "desc");
David Sedlákd2d676a2019-07-22 11:28:19 +02002581 assert_true(refines->flags & LYS_CONFIG_W);
2582 assert_true(refines->flags & LYS_MAND_TRUE);
2583 assert_string_equal(*refines->iffeatures, "feature");
2584 assert_int_equal(refines->max, 20);
2585 assert_int_equal(refines->min, 10);
2586 assert_string_equal(refines->musts->arg, "cond");
2587 assert_string_equal(refines->presence, "presence");
2588 assert_string_equal(refines->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02002589 assert_string_equal(refines->exts[0].name, "myext:c-define");
2590 assert_int_equal(refines->exts[0].insubstmt_index, 0);
2591 assert_int_equal(refines->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákd2d676a2019-07-22 11:28:19 +02002592 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2593 refines = NULL;
2594
2595 /* min subelems */
2596 data = ELEMENT_WRAPPER_START "<refine target-node=\"target\" />" ELEMENT_WRAPPER_END;
2597 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2598 assert_string_equal(refines->nodeid, "target");
2599 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2600 refines = NULL;
2601
2602 st->finished_correctly = true;
2603}
2604
David Sedlák0d6de5a2019-07-22 13:25:44 +02002605static void
2606test_uses_elem(void **state)
2607{
2608 struct state *st = *state;
2609 const char *data;
2610 struct lysp_node *siblings = NULL;
2611 struct tree_node_meta node_meta = {NULL, &siblings};
2612 struct lysp_node_uses *parsed = NULL;
2613
2614 /* max subelems */
2615 data = ELEMENT_WRAPPER_START
2616 "<uses name=\"uses-name\">"
2617 "<when condition=\"cond\" />"
2618 "<if-feature name=\"feature\" />"
2619 "<status value=\"obsolete\" />"
2620 "<description><text>desc</text></description>"
2621 "<reference><text>ref</text></reference>"
2622 "<refine target-node=\"target\"/>"
David Sedlák992fb7c2019-07-24 16:51:01 +02002623 "<augment target-node=\"target\" />"
David Sedlákd1144562019-08-06 12:36:14 +02002624 EXT_SUBELEM
David Sedlák0d6de5a2019-07-22 13:25:44 +02002625 "</uses>"
2626 ELEMENT_WRAPPER_END;
2627 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2628 parsed = (struct lysp_node_uses *)&siblings[0];
2629 assert_string_equal(parsed->name, "uses-name");
2630 assert_string_equal(parsed->dsc, "desc");
David Sedlák0d6de5a2019-07-22 13:25:44 +02002631 assert_true(parsed->flags & LYS_STATUS_OBSLT);
2632 assert_string_equal(*parsed->iffeatures, "feature");
2633 assert_null(parsed->next);
2634 assert_int_equal(parsed->nodetype, LYS_USES);
2635 assert_null(parsed->parent);
2636 assert_string_equal(parsed->ref, "ref");
2637 assert_string_equal(parsed->refines->nodeid, "target");
2638 assert_string_equal(parsed->when->cond, "cond");
David Sedlák992fb7c2019-07-24 16:51:01 +02002639 assert_string_equal(parsed->augments->nodeid, "target");
David Sedlákd1144562019-08-06 12:36:14 +02002640 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2641 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2642 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002643 lysp_node_free(st->ctx, siblings);
2644 siblings = NULL;
2645
2646 /* min subelems */
2647 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
2648 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2649 assert_string_equal(siblings[0].name, "uses-name");
2650 lysp_node_free(st->ctx, siblings);
2651 siblings = NULL;
2652
2653 st->finished_correctly = true;
2654}
2655
David Sedlákaa854b02019-07-22 14:17:10 +02002656static void
2657test_revision_elem(void **state)
2658{
2659 struct state *st = *state;
2660 const char *data;
2661 struct lysp_revision *revs = NULL;
2662
2663 /* max subelems */
2664 data = ELEMENT_WRAPPER_START
2665 "<revision date=\"2018-12-25\">"
2666 "<description><text>desc</text></description>"
2667 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002668 EXT_SUBELEM
David Sedlákaa854b02019-07-22 14:17:10 +02002669 "</revision>"
2670 ELEMENT_WRAPPER_END;
2671 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2672 assert_string_equal(revs->date, "2018-12-25");
2673 assert_string_equal(revs->dsc, "desc");
2674 assert_string_equal(revs->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02002675 assert_string_equal(revs->exts[0].name, "myext:c-define");
2676 assert_int_equal(revs->exts[0].insubstmt_index, 0);
2677 assert_int_equal(revs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaa854b02019-07-22 14:17:10 +02002678 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2679 revs = NULL;
2680
2681 /* min subelems */
2682 data = ELEMENT_WRAPPER_START "<revision date=\"2005-05-05\" />" ELEMENT_WRAPPER_END;
2683 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2684 assert_string_equal(revs->date, "2005-05-05");
2685 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2686 revs = NULL;
2687
2688 /* invalid value */
2689 data = ELEMENT_WRAPPER_START "<revision date=\"05-05-2005\" />" ELEMENT_WRAPPER_END;
2690 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, false), LY_EVALID);
2691 logbuf_assert("Invalid value \"05-05-2005\" of \"revision\". Line number 1.");
2692 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2693 revs = NULL;
2694
2695 st->finished_correctly = true;
2696}
2697
David Sedlák0c2bab92019-07-22 15:33:19 +02002698static void
2699test_include_elem(void **state)
2700{
2701 struct state *st = *state;
2702 const char *data;
2703 struct lysp_include *includes = NULL;
2704 struct include_meta inc_meta = {"module-name", &includes};
2705
2706 /* max subelems */
2707 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2708 data = ELEMENT_WRAPPER_START
2709 "<include module=\"mod\">"
2710 "<description><text>desc</text></description>"
2711 "<reference><text>ref</text></reference>"
2712 "<revision-date date=\"1999-09-09\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002713 EXT_SUBELEM
David Sedlák0c2bab92019-07-22 15:33:19 +02002714 "</include>"
2715 ELEMENT_WRAPPER_END;
2716 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, true), LY_SUCCESS);
2717 assert_string_equal(includes->name, "mod");
2718 assert_string_equal(includes->dsc, "desc");
2719 assert_string_equal(includes->ref, "ref");
David Sedlák0c2bab92019-07-22 15:33:19 +02002720 assert_string_equal(includes->rev, "1999-09-09");
David Sedlákd1144562019-08-06 12:36:14 +02002721 assert_string_equal(includes->exts[0].name, "myext:c-define");
2722 assert_int_equal(includes->exts[0].insubstmt_index, 0);
2723 assert_int_equal(includes->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0c2bab92019-07-22 15:33:19 +02002724 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2725 includes = NULL;
2726
2727 /* min subelems */
2728 data = ELEMENT_WRAPPER_START "<include module=\"mod\"/>" ELEMENT_WRAPPER_END;
2729 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, true), LY_SUCCESS);
2730 assert_string_equal(includes->name, "mod");
2731 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2732 includes = NULL;
2733
2734 /* invalid combinations */
2735 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2736 data = ELEMENT_WRAPPER_START
2737 "<include module=\"mod\">"
2738 "<description><text>desc</text></description>"
2739 "<revision-date date=\"1999-09-09\"/>"
2740 "</include>"
2741 ELEMENT_WRAPPER_END;
2742 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, false), LY_EVALID);
2743 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.");
2744 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2745 includes = NULL;
2746
2747 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2748 data = ELEMENT_WRAPPER_START
2749 "<include module=\"mod\">"
2750 "<reference><text>ref</text></reference>"
2751 "<revision-date date=\"1999-09-09\"/>"
2752 "</include>"
2753 ELEMENT_WRAPPER_END;
2754 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, false), LY_EVALID);
2755 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.");
2756 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2757 includes = NULL;
2758
2759 st->finished_correctly = true;
2760}
2761
David Sedlák5e13dea2019-07-22 16:06:45 +02002762static void
2763test_feature_elem(void **state)
2764{
2765 struct state *st = *state;
2766 const char *data;
2767 struct lysp_feature *features = NULL;
2768
2769 /* max subelems */
2770 data = ELEMENT_WRAPPER_START
2771 "<feature name=\"feature-name\">"
2772 "<if-feature name=\"iff\"/>"
2773 "<status value=\"deprecated\"/>"
2774 "<description><text>desc</text></description>"
2775 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002776 EXT_SUBELEM
David Sedlák5e13dea2019-07-22 16:06:45 +02002777 "</feature>"
2778 ELEMENT_WRAPPER_END;
2779 assert_int_equal(test_element_helper(st, &data, &features, NULL, NULL, true), LY_SUCCESS);
2780 assert_string_equal(features->name, "feature-name");
2781 assert_string_equal(features->dsc, "desc");
David Sedlák5e13dea2019-07-22 16:06:45 +02002782 assert_true(features->flags & LYS_STATUS_DEPRC);
2783 assert_string_equal(*features->iffeatures, "iff");
2784 assert_string_equal(features->ref, "ref");
David Sedlákd1144562019-08-06 12:36:14 +02002785 assert_string_equal(features->exts[0].name, "myext:c-define");
2786 assert_int_equal(features->exts[0].insubstmt_index, 0);
2787 assert_int_equal(features->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák5e13dea2019-07-22 16:06:45 +02002788 FREE_ARRAY(st->ctx, features, lysp_feature_free);
2789 features = NULL;
2790
2791 /* min subelems */
2792 data = ELEMENT_WRAPPER_START "<feature name=\"feature-name\"/>" ELEMENT_WRAPPER_END;
2793 assert_int_equal(test_element_helper(st, &data, &features, NULL, NULL, true), LY_SUCCESS);
2794 assert_string_equal(features->name, "feature-name");
2795 FREE_ARRAY(st->ctx, features, lysp_feature_free);
2796 features = NULL;
2797
2798 st->finished_correctly = true;
2799}
2800
David Sedlák28794f22019-07-22 16:45:00 +02002801static void
2802test_identity_elem(void **state)
2803{
2804 struct state *st = *state;
2805 const char *data;
2806 struct lysp_ident *identities = NULL;
2807
2808 /* max subelems */
2809 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2810 data = ELEMENT_WRAPPER_START
2811 "<identity name=\"ident-name\">"
2812 "<if-feature name=\"iff\"/>"
2813 "<base name=\"base-name\"/>"
2814 "<status value=\"deprecated\"/>"
2815 "<description><text>desc</text></description>"
2816 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002817 EXT_SUBELEM
David Sedlák28794f22019-07-22 16:45:00 +02002818 "</identity>"
2819 ELEMENT_WRAPPER_END;
2820 assert_int_equal(test_element_helper(st, &data, &identities, NULL, NULL, true), LY_SUCCESS);
2821 assert_string_equal(identities->name, "ident-name");
2822 assert_string_equal(*identities->bases, "base-name");
2823 assert_string_equal(*identities->iffeatures, "iff");
2824 assert_string_equal(identities->dsc, "desc");
2825 assert_string_equal(identities->ref, "ref");
2826 assert_true(identities->flags & LYS_STATUS_DEPRC);
David Sedlákd1144562019-08-06 12:36:14 +02002827 assert_string_equal(identities->exts[0].name, "myext:c-define");
2828 assert_int_equal(identities->exts[0].insubstmt_index, 0);
2829 assert_int_equal(identities->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák28794f22019-07-22 16:45:00 +02002830 FREE_ARRAY(st->ctx, identities, lysp_ident_free);
2831 identities = NULL;
2832
2833 /* min subelems */
2834 data = ELEMENT_WRAPPER_START "<identity name=\"ident-name\" />" 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 FREE_ARRAY(st->ctx, identities, lysp_ident_free);
2838 identities = NULL;
2839
2840 /* invalid */
2841 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2842 data = ELEMENT_WRAPPER_START
2843 "<identity name=\"ident-name\">"
2844 "<if-feature name=\"iff\"/>"
2845 "</identity>"
2846 ELEMENT_WRAPPER_END;
2847 assert_int_equal(test_element_helper(st, &data, &identities, NULL, NULL, false), LY_EVALID);
2848 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.");
2849 FREE_ARRAY(st->ctx, identities, lysp_ident_free);
2850 identities = NULL;
2851
2852 st->finished_correctly = true;
2853}
2854
David Sedlákaf536aa2019-07-23 13:42:23 +02002855static void
2856test_list_elem(void **state)
2857{
2858 struct state *st = *state;
2859 const char *data;
2860 struct lysp_node *siblings = NULL;
2861 struct tree_node_meta node_meta = {NULL, &siblings};
2862 struct lysp_node_list *parsed = NULL;
2863
2864 /* max subelems */
2865 data = ELEMENT_WRAPPER_START
2866 "<list name=\"list-name\">"
2867 "<when condition=\"when\"/>"
2868 "<if-feature name=\"iff\"/>"
2869 "<must condition=\"must-cond\"/>"
2870 "<key value=\"key\"/>"
2871 "<unique tag=\"utag\"/>"
2872 "<config value=\"true\"/>"
2873 "<min-elements value=\"10\"/>"
2874 "<ordered-by value=\"user\"/>"
2875 "<status value=\"deprecated\"/>"
2876 "<description><text>desc</text></description>"
2877 "<reference><text>ref</text></reference>"
2878 "<anydata name=\"anyd\"/>"
2879 "<anyxml name=\"anyx\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002880 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002881 "<choice name=\"choice\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02002882 "<action name=\"action\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002883 "<grouping name=\"grp\"/>"
David Sedlák031b9e72019-07-23 15:19:37 +02002884 "<notification name=\"notf\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002885 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2886 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002887 "<list name=\"sub-list\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002888 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002889 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002890 EXT_SUBELEM
David Sedlákaf536aa2019-07-23 13:42:23 +02002891 "</list>"
2892 ELEMENT_WRAPPER_END;
2893 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2894 parsed = (struct lysp_node_list *)&siblings[0];
2895 assert_string_equal(parsed->dsc, "desc");
2896 assert_string_equal(parsed->child->name, "anyd");
2897 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2898 assert_string_equal(parsed->child->next->name, "anyx");
2899 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
David Sedlákf111bcb2019-07-23 17:15:51 +02002900 assert_string_equal(parsed->child->next->next->name, "cont");
2901 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002902 assert_string_equal(parsed->child->next->next->next->name, "choice");
2903 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
David Sedlák85d0eca2019-07-24 15:15:21 +02002904 assert_string_equal(parsed->child->next->next->next->next->name, "leaf");
2905 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAF);
2906 assert_string_equal(parsed->child->next->next->next->next->next->name, "llist");
2907 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2908 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "sub-list");
2909 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LIST);
2910 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "uses-name");
2911 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2912 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002913 assert_string_equal(parsed->groupings->name, "grp");
David Sedlák85d0eca2019-07-24 15:15:21 +02002914 assert_string_equal(parsed->actions->name, "action");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002915 assert_int_equal(parsed->groupings->nodetype, LYS_GROUPING);
David Sedlák031b9e72019-07-23 15:19:37 +02002916 assert_string_equal(parsed->notifs->name, "notf");
David Sedlákaf536aa2019-07-23 13:42:23 +02002917 assert_true(parsed->flags & LYS_ORDBY_USER);
2918 assert_true(parsed->flags & LYS_STATUS_DEPRC);
2919 assert_true(parsed->flags & LYS_CONFIG_W);
2920 assert_string_equal(*parsed->iffeatures, "iff");
2921 assert_string_equal(parsed->key, "key");
2922 assert_int_equal(parsed->min, 10);
2923 assert_string_equal(parsed->musts->arg, "must-cond");
2924 assert_string_equal(parsed->name, "list-name");
2925 assert_null(parsed->next);
2926 assert_int_equal(parsed->nodetype, LYS_LIST);
2927 assert_null(parsed->parent);
2928 assert_string_equal(parsed->ref, "ref");
2929 assert_string_equal(parsed->typedefs->name, "tpdf");
2930 assert_string_equal(*parsed->uniques, "utag");
2931 assert_string_equal(parsed->when->cond, "when");
David Sedlákd1144562019-08-06 12:36:14 +02002932 assert_string_equal(parsed->exts[0].name, "myext:c-define");
2933 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2934 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaf536aa2019-07-23 13:42:23 +02002935 lysp_node_free(st->ctx, siblings);
2936 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
2937 siblings = NULL;
2938
2939 /* min subelems */
2940 data = ELEMENT_WRAPPER_START "<list name=\"list-name\" />" ELEMENT_WRAPPER_END;
2941 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2942 parsed = (struct lysp_node_list *)&siblings[0];
2943 assert_string_equal(parsed->name, "list-name");
2944 lysp_node_free(st->ctx, siblings);
2945 siblings = NULL;
2946
2947 st->finished_correctly = true;
2948}
2949
David Sedlák031b9e72019-07-23 15:19:37 +02002950static void
2951test_notification_elem(void **state)
2952{
2953 struct state *st = *state;
2954 const char *data;
2955 struct lysp_notif *notifs = NULL;
2956 struct notif_meta notif_meta = {NULL, &notifs};
2957
2958 /* max subelems */
2959 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2960 data = ELEMENT_WRAPPER_START
2961 "<notification name=\"notif-name\">"
2962 "<anydata name=\"anyd\"/>"
2963 "<anyxml name=\"anyx\"/>"
2964 "<description><text>desc</text></description>"
2965 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002966 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2967 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák031b9e72019-07-23 15:19:37 +02002968 "<list name=\"sub-list\"/>"
2969 "<must condition=\"cond\"/>"
2970 "<reference><text>ref</text></reference>"
2971 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002972 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák031b9e72019-07-23 15:19:37 +02002973 "<uses name=\"uses-name\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002974 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002975 "<choice name=\"choice\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002976 "<grouping name=\"grp\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002977 EXT_SUBELEM
David Sedlák031b9e72019-07-23 15:19:37 +02002978 "</notification>"
2979 ELEMENT_WRAPPER_END;
2980 assert_int_equal(test_element_helper(st, &data, &notif_meta, NULL, NULL, true), LY_SUCCESS);
2981 assert_string_equal(notifs->name, "notif-name");
2982 assert_string_equal(notifs->data->name, "anyd");
2983 assert_int_equal(notifs->data->nodetype, LYS_ANYDATA);
2984 assert_string_equal(notifs->data->next->name, "anyx");
2985 assert_int_equal(notifs->data->next->nodetype, LYS_ANYXML);
2986 assert_string_equal(notifs->data->next->next->name, "leaf");
2987 assert_int_equal(notifs->data->next->next->nodetype, LYS_LEAF);
2988 assert_string_equal(notifs->data->next->next->next->name, "llist");
2989 assert_int_equal(notifs->data->next->next->next->nodetype, LYS_LEAFLIST);
2990 assert_string_equal(notifs->data->next->next->next->next->name, "sub-list");
2991 assert_int_equal(notifs->data->next->next->next->next->nodetype, LYS_LIST);
David Sedlák031b9e72019-07-23 15:19:37 +02002992 assert_true(notifs->flags & LYS_STATUS_DEPRC);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002993 assert_string_equal(notifs->groupings->name, "grp");
2994 assert_int_equal(notifs->groupings->nodetype, LYS_GROUPING);
David Sedlákf111bcb2019-07-23 17:15:51 +02002995 assert_string_equal(notifs->data->next->next->next->next->next->name, "uses-name");
2996 assert_int_equal(notifs->data->next->next->next->next->next->nodetype, LYS_USES);
2997 assert_string_equal(notifs->data->next->next->next->next->next->next->name, "cont");
2998 assert_int_equal(notifs->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002999 assert_int_equal(notifs->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3000 assert_string_equal(notifs->data->next->next->next->next->next->next->next->name, "choice");
3001 assert_null(notifs->data->next->next->next->next->next->next->next->next);
David Sedlák031b9e72019-07-23 15:19:37 +02003002 assert_string_equal(*notifs->iffeatures, "iff");
3003 assert_string_equal(notifs->musts->arg, "cond");
3004 assert_int_equal(notifs->nodetype, LYS_NOTIF);
3005 assert_null(notifs->parent);
3006 assert_string_equal(notifs->ref, "ref");
3007 assert_string_equal(notifs->typedefs->name, "tpdf");
David Sedlákd1144562019-08-06 12:36:14 +02003008 assert_string_equal(notifs->exts[0].name, "myext:c-define");
3009 assert_int_equal(notifs->exts[0].insubstmt_index, 0);
3010 assert_int_equal(notifs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák031b9e72019-07-23 15:19:37 +02003011 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
3012 notifs = NULL;
3013
3014 /* min subelems */
3015 data = ELEMENT_WRAPPER_START "<notification name=\"notif-name\" />" ELEMENT_WRAPPER_END;
3016 assert_int_equal(test_element_helper(st, &data, &notif_meta, NULL, NULL, true), LY_SUCCESS);
3017 assert_string_equal(notifs->name, "notif-name");
3018 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003019 notifs = NULL;
3020
3021 st->finished_correctly = true;
3022}
3023
3024static void
3025test_grouping_elem(void **state)
3026{
3027 struct state *st = *state;
3028 const char *data;
3029 struct lysp_grp *grps = NULL;
3030 struct grouping_meta grp_meta = {NULL, &grps};
3031
3032 /* max subelems */
3033 data = ELEMENT_WRAPPER_START
3034 "<grouping name=\"grp-name\">"
3035 "<anydata name=\"anyd\"/>"
3036 "<anyxml name=\"anyx\"/>"
3037 "<description><text>desc</text></description>"
3038 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003039 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3040 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003041 "<list name=\"list\"/>"
3042 "<notification name=\"notf\"/>"
3043 "<reference><text>ref</text></reference>"
3044 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003045 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003046 "<uses name=\"uses-name\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003047 "<action name=\"act\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02003048 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003049 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003050 EXT_SUBELEM
David Sedláke3ce9ef2019-07-23 16:34:30 +02003051 "</grouping>"
3052 ELEMENT_WRAPPER_END;
3053 assert_int_equal(test_element_helper(st, &data, &grp_meta, NULL, NULL, true), LY_SUCCESS);
3054 assert_string_equal(grps->name, "grp-name");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003055 assert_string_equal(grps->data->name, "anyd");
3056 assert_string_equal(grps->data->next->name, "anyx");
3057 assert_string_equal(grps->data->next->next->name, "leaf");
3058 assert_string_equal(grps->data->next->next->next->name, "llist");
3059 assert_string_equal(grps->data->next->next->next->next->name, "list");
3060 assert_string_equal(grps->dsc, "desc");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003061 assert_true(grps->flags & LYS_STATUS_CURR);
3062 assert_string_equal(grps->groupings->name, "sub-grp");
3063 assert_int_equal(grps->nodetype, LYS_GROUPING);
3064 assert_string_equal(grps->notifs->name, "notf");
3065 assert_null(grps->parent);
3066 assert_string_equal(grps->ref, "ref");
3067 assert_string_equal(grps->typedefs->name, "tpdf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003068 assert_string_equal(grps->actions->name, "act");
David Sedlákf111bcb2019-07-23 17:15:51 +02003069 assert_string_equal(grps->data->next->next->next->next->next->name, "uses-name");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003070 assert_int_equal(grps->data->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákf111bcb2019-07-23 17:15:51 +02003071 assert_string_equal(grps->data->next->next->next->next->next->next->name, "cont");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003072 assert_int_equal(grps->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
3073 assert_string_equal(grps->data->next->next->next->next->next->next->next->name, "choice");
3074 assert_int_equal(grps->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
David Sedlákd1144562019-08-06 12:36:14 +02003075 assert_string_equal(grps->exts[0].name, "myext:c-define");
3076 assert_int_equal(grps->exts[0].insubstmt_index, 0);
3077 assert_int_equal(grps->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003078 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3079 grps = NULL;
3080
3081 /* min subelems */
3082 data = ELEMENT_WRAPPER_START "<grouping name=\"grp-name\" />" ELEMENT_WRAPPER_END;
3083 assert_int_equal(test_element_helper(st, &data, &grp_meta, NULL, NULL, true), LY_SUCCESS);
3084 assert_string_equal(grps->name, "grp-name");
3085 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3086 grps = NULL;
David Sedlák031b9e72019-07-23 15:19:37 +02003087
3088 st->finished_correctly = true;
3089}
3090
David Sedlákf111bcb2019-07-23 17:15:51 +02003091static void
3092test_container_elem(void **state)
3093{
3094 struct state *st = *state;
3095 const char *data;
3096 struct lysp_node *siblings = NULL;
3097 struct tree_node_meta node_meta = {NULL, &siblings};
3098 struct lysp_node_container *parsed = NULL;
3099
3100 /* max subelems */
David Sedláke2dc9e92019-07-24 09:59:21 +02003101 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3102 data = ELEMENT_WRAPPER_START
3103 "<container name=\"cont-name\">"
3104 "<anydata name=\"anyd\"/>"
3105 "<anyxml name=\"anyx\"/>"
3106 "<config value=\"true\"/>"
3107 "<container name=\"subcont\"/>"
3108 "<description><text>desc</text></description>"
3109 "<grouping name=\"sub-grp\"/>"
3110 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003111 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3112 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003113 "<list name=\"list\"/>"
3114 "<must condition=\"cond\"/>"
3115 "<notification name=\"notf\"/>"
3116 "<presence value=\"presence\"/>"
3117 "<reference><text>ref</text></reference>"
3118 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003119 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003120 "<uses name=\"uses-name\"/>"
3121 "<when condition=\"when-cond\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003122 "<action name=\"act\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003123 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003124 EXT_SUBELEM
David Sedláke2dc9e92019-07-24 09:59:21 +02003125 "</container>"
3126 ELEMENT_WRAPPER_END;
3127 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3128 parsed = (struct lysp_node_container *)siblings;
3129 assert_string_equal(parsed->name, "cont-name");
3130 assert_null(parsed->parent);
3131 assert_int_equal(parsed->nodetype, LYS_CONTAINER);
3132 assert_true(parsed->flags & LYS_CONFIG_W);
3133 assert_true(parsed->flags & LYS_STATUS_CURR);
3134 assert_null(parsed->next);
3135 assert_string_equal(parsed->dsc, "desc");
3136 assert_string_equal(parsed->ref, "ref");
3137 assert_string_equal(parsed->when->cond, "when-cond");
3138 assert_string_equal(*parsed->iffeatures, "iff");
David Sedláke2dc9e92019-07-24 09:59:21 +02003139 assert_string_equal(parsed->musts->arg, "cond");
3140 assert_string_equal(parsed->presence, "presence");
3141 assert_string_equal(parsed->typedefs->name, "tpdf");
3142 assert_string_equal(parsed->groupings->name, "sub-grp");
3143 assert_string_equal(parsed->child->name, "anyd");
3144 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3145 assert_string_equal(parsed->child->next->name, "anyx");
3146 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3147 assert_string_equal(parsed->child->next->next->name, "subcont");
3148 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3149 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3150 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3151 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3152 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3153 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3154 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3155 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3156 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003157 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3158 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3159 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke2dc9e92019-07-24 09:59:21 +02003160 assert_string_equal(parsed->notifs->name, "notf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003161 assert_string_equal(parsed->actions->name, "act");
David Sedlákd1144562019-08-06 12:36:14 +02003162 assert_string_equal(parsed->exts[0].name, "myext:c-define");
3163 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3164 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke2dc9e92019-07-24 09:59:21 +02003165 lysp_node_free(st->ctx, siblings);
3166 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
3167 siblings = NULL;
David Sedlákf111bcb2019-07-23 17:15:51 +02003168
3169 /* min subelems */
3170 data = ELEMENT_WRAPPER_START "<container name=\"cont-name\" />" ELEMENT_WRAPPER_END;
3171 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3172 parsed = (struct lysp_node_container *)siblings;
3173 assert_string_equal(parsed->name, "cont-name");
3174 lysp_node_free(st->ctx, siblings);
3175 siblings = NULL;
3176
3177 st->finished_correctly = true;
3178}
3179
David Sedlák5379d392019-07-24 10:42:03 +02003180static void
3181test_case_elem(void **state)
3182{
3183 struct state *st = *state;
3184 const char *data;
3185 struct lysp_node *siblings = NULL;
3186 struct tree_node_meta node_meta = {NULL, &siblings};
3187 struct lysp_node_case *parsed = NULL;
3188
3189 /* max subelems */
3190 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3191 data = ELEMENT_WRAPPER_START
3192 "<case name=\"case-name\">"
3193 "<anydata name=\"anyd\"/>"
3194 "<anyxml name=\"anyx\"/>"
3195 "<container name=\"subcont\"/>"
3196 "<description><text>desc</text></description>"
3197 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003198 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3199 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák5379d392019-07-24 10:42:03 +02003200 "<list name=\"list\"/>"
3201 "<reference><text>ref</text></reference>"
3202 "<status value=\"current\"/>"
3203 "<uses name=\"uses-name\"/>"
3204 "<when condition=\"when-cond\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003205 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003206 EXT_SUBELEM
David Sedlák5379d392019-07-24 10:42:03 +02003207 "</case>"
3208 ELEMENT_WRAPPER_END;
3209 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3210 parsed = (struct lysp_node_case *)siblings;
3211 assert_string_equal(parsed->name, "case-name");
3212 assert_null(parsed->parent);
3213 assert_int_equal(parsed->nodetype, LYS_CASE);
3214 assert_true(parsed->flags & LYS_STATUS_CURR);
3215 assert_null(parsed->next);
3216 assert_string_equal(parsed->dsc, "desc");
3217 assert_string_equal(parsed->ref, "ref");
3218 assert_string_equal(parsed->when->cond, "when-cond");
3219 assert_string_equal(*parsed->iffeatures, "iff");
David Sedlák5379d392019-07-24 10:42:03 +02003220 assert_string_equal(parsed->child->name, "anyd");
3221 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3222 assert_string_equal(parsed->child->next->name, "anyx");
3223 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3224 assert_string_equal(parsed->child->next->next->name, "subcont");
3225 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3226 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3227 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3228 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3229 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3230 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3231 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3232 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3233 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003234 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3235 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3236 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003237 assert_string_equal(parsed->exts[0].name, "myext:c-define");
3238 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3239 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák5379d392019-07-24 10:42:03 +02003240 lysp_node_free(st->ctx, siblings);
3241 siblings = NULL;
3242
3243 /* min subelems */
3244 data = ELEMENT_WRAPPER_START "<case name=\"case-name\" />" ELEMENT_WRAPPER_END;
3245 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3246 parsed = (struct lysp_node_case *)siblings;
3247 assert_string_equal(parsed->name, "case-name");
3248 lysp_node_free(st->ctx, siblings);
3249 siblings = NULL;
3250
3251 st->finished_correctly = true;
3252}
3253
David Sedlákb7abcfa2019-07-24 12:33:35 +02003254static void
3255test_choice_elem(void **state)
3256{
3257 struct state *st = *state;
3258 const char *data;
3259 struct lysp_node *siblings = NULL;
3260 struct tree_node_meta node_meta = {NULL, &siblings};
3261 struct lysp_node_choice *parsed = NULL;
3262
3263 /* max subelems */
3264 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3265 data = ELEMENT_WRAPPER_START
3266 "<choice name=\"choice-name\">"
3267 "<anydata name=\"anyd\"/>"
3268 "<anyxml name=\"anyx\"/>"
3269 "<case name=\"sub-case\"/>"
3270 "<choice name=\"choice\"/>"
3271 "<config value=\"true\"/>"
3272 "<container name=\"subcont\"/>"
3273 "<default value=\"def\"/>"
3274 "<description><text>desc</text></description>"
3275 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003276 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3277 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003278 "<list name=\"list\"/>"
3279 "<mandatory value=\"true\" />"
3280 "<reference><text>ref</text></reference>"
3281 "<status value=\"current\"/>"
3282 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003283 EXT_SUBELEM
David Sedlákb7abcfa2019-07-24 12:33:35 +02003284 "</choice>"
3285 ELEMENT_WRAPPER_END;
3286 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3287 parsed = (struct lysp_node_choice *)siblings;
3288 assert_string_equal(parsed->name, "choice-name");
3289 assert_null(parsed->parent);
3290 assert_int_equal(parsed->nodetype, LYS_CHOICE);
3291 assert_true(parsed->flags & LYS_CONFIG_W && parsed->flags & LYS_MAND_TRUE && parsed->flags & LYS_STATUS_CURR);
3292 assert_null(parsed->next);
3293 assert_string_equal(parsed->dsc, "desc");
3294 assert_string_equal(parsed->ref, "ref");
3295 assert_string_equal(parsed->when->cond, "when-cond");
3296 assert_string_equal(*parsed->iffeatures, "iff");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003297 assert_string_equal(parsed->child->name, "anyd");
3298 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3299 assert_string_equal(parsed->child->next->name, "anyx");
3300 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3301 assert_string_equal(parsed->child->next->next->name, "sub-case");
3302 assert_int_equal(parsed->child->next->next->nodetype, LYS_CASE);
3303 assert_string_equal(parsed->child->next->next->next->name, "choice");
3304 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
3305 assert_string_equal(parsed->child->next->next->next->next->name, "subcont");
3306 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_CONTAINER);
3307 assert_string_equal(parsed->child->next->next->next->next->next->name, "leaf");
3308 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAF);
3309 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "llist");
3310 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3311 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "list");
3312 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3313 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003314 assert_string_equal(parsed->exts[0].name, "myext:c-define");
3315 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3316 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003317 lysp_node_free(st->ctx, siblings);
3318 siblings = NULL;
3319
3320 /* min subelems */
3321 data = ELEMENT_WRAPPER_START "<choice name=\"choice-name\" />" ELEMENT_WRAPPER_END;
3322 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
3323 parsed = (struct lysp_node_choice *)siblings;
3324 assert_string_equal(parsed->name, "choice-name");
3325 lysp_node_free(st->ctx, siblings);
3326 siblings = NULL;
3327
3328 st->finished_correctly = true;
3329}
3330
David Sedlák05404f62019-07-24 14:11:53 +02003331static void
3332test_inout_elem(void **state)
3333{
3334 struct state *st = *state;
3335 const char *data;
3336 struct lysp_action_inout inout = {};
3337 struct inout_meta inout_meta = {NULL, &inout};
3338
3339 /* max subelements */
3340 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3341 data = ELEMENT_WRAPPER_START
3342 "<input>"
3343 "<anydata name=\"anyd\"/>"
3344 "<anyxml name=\"anyx\"/>"
3345 "<choice name=\"choice\"/>"
3346 "<container name=\"subcont\"/>"
3347 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003348 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3349 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003350 "<list name=\"list\"/>"
3351 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003352 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003353 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003354 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003355 "</input>"
3356 ELEMENT_WRAPPER_END;
3357 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3358 assert_null(inout.parent);
3359 assert_int_equal(inout.nodetype, LYS_INPUT);
3360 assert_string_equal(inout.musts->arg, "cond");
3361 assert_string_equal(inout.typedefs->name, "tpdf");
3362 assert_string_equal(inout.groupings->name, "sub-grp");
3363 assert_string_equal(inout.data->name, "anyd");
3364 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3365 assert_string_equal(inout.data->next->name, "anyx");
3366 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3367 assert_string_equal(inout.data->next->next->name, "choice");
3368 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3369 assert_string_equal(inout.data->next->next->next->name, "subcont");
3370 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3371 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3372 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3373 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3374 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3375 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3376 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3377 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3378 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3379 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003380 assert_string_equal(inout.exts[0].name, "myext:c-define");
3381 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3382 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003383 lysp_action_inout_free(st->ctx, &inout);
3384 memset(&inout, 0, sizeof inout);
3385
3386 /* max subelements */
3387 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3388 data = ELEMENT_WRAPPER_START
3389 "<output>"
3390 "<anydata name=\"anyd\"/>"
3391 "<anyxml name=\"anyx\"/>"
3392 "<choice name=\"choice\"/>"
3393 "<container name=\"subcont\"/>"
3394 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003395 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3396 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003397 "<list name=\"list\"/>"
3398 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003399 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003400 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003401 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003402 "</output>"
3403 ELEMENT_WRAPPER_END;
3404 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3405 assert_null(inout.parent);
3406 assert_int_equal(inout.nodetype, LYS_OUTPUT);
3407 assert_string_equal(inout.musts->arg, "cond");
3408 assert_string_equal(inout.typedefs->name, "tpdf");
3409 assert_string_equal(inout.groupings->name, "sub-grp");
3410 assert_string_equal(inout.data->name, "anyd");
3411 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3412 assert_string_equal(inout.data->next->name, "anyx");
3413 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3414 assert_string_equal(inout.data->next->next->name, "choice");
3415 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3416 assert_string_equal(inout.data->next->next->next->name, "subcont");
3417 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3418 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3419 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3420 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3421 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3422 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3423 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3424 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3425 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3426 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedlákd1144562019-08-06 12:36:14 +02003427 assert_string_equal(inout.exts[0].name, "myext:c-define");
3428 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3429 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003430 lysp_action_inout_free(st->ctx, &inout);
3431 memset(&inout, 0, sizeof inout);
3432
3433 /* min subelems */
3434 data = ELEMENT_WRAPPER_START "<input />" ELEMENT_WRAPPER_END;
3435 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3436 memset(&inout, 0, sizeof inout);
3437
3438 data = ELEMENT_WRAPPER_START "<output />" ELEMENT_WRAPPER_END;
3439 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, true), LY_SUCCESS);
3440 memset(&inout, 0, sizeof inout);
3441
3442 /* invalid combinations */
3443 data = ELEMENT_WRAPPER_START "<input name=\"test\"/>" ELEMENT_WRAPPER_END;
3444 assert_int_equal(test_element_helper(st, &data, &inout_meta, NULL, NULL, false), LY_EVALID);
3445 logbuf_assert("Unexpected attribute \"name\" of input element. Line number 1.");
3446 memset(&inout, 0, sizeof inout);
3447
3448 st->finished_correctly = true;
3449}
3450
David Sedlák85d0eca2019-07-24 15:15:21 +02003451static void
3452test_action_elem(void **state)
3453{
3454 struct state *st = *state;
3455 const char *data;
3456 struct lysp_action *actions = NULL;
3457 struct action_meta act_meta = {NULL, &actions};
3458
3459 /* max subelems */
3460 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3461 data = ELEMENT_WRAPPER_START
3462 "<action name=\"act\">"
3463 "<description><text>desc</text></description>"
3464 "<grouping name=\"grouping\"/>"
3465 "<if-feature name=\"iff\"/>"
3466 "<input><uses name=\"uses-name\"/></input>"
3467 "<output><must condition=\"cond\"/></output>"
3468 "<reference><text>ref</text></reference>"
3469 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003470 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003471 EXT_SUBELEM
David Sedlák85d0eca2019-07-24 15:15:21 +02003472 "</action>"
3473 ELEMENT_WRAPPER_END;
3474 assert_int_equal(test_element_helper(st, &data, &act_meta, NULL, NULL, true), LY_SUCCESS);
3475 assert_null(actions->parent);
3476 assert_int_equal(actions->nodetype, LYS_ACTION);
3477 assert_true(actions->flags & LYS_STATUS_DEPRC);
3478 assert_string_equal(actions->name, "act");
3479 assert_string_equal(actions->dsc, "desc");
3480 assert_string_equal(actions->ref, "ref");
3481 assert_string_equal(*actions->iffeatures, "iff");
3482 assert_string_equal(actions->typedefs->name, "tpdf");
3483 assert_string_equal(actions->groupings->name, "grouping");
3484 assert_string_equal(actions->input.data->name, "uses-name");
3485 assert_string_equal(actions->output.musts->arg, "cond");
David Sedlákd1144562019-08-06 12:36:14 +02003486 assert_string_equal(actions->exts[0].name, "myext:c-define");
3487 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3488 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák85d0eca2019-07-24 15:15:21 +02003489 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3490 actions = NULL;
3491
David Sedlákeaa45792019-07-24 15:25:01 +02003492 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3493 data = ELEMENT_WRAPPER_START
3494 "<rpc name=\"act\">"
3495 "<description><text>desc</text></description>"
3496 "<grouping name=\"grouping\"/>"
3497 "<if-feature name=\"iff\"/>"
3498 "<input><uses name=\"uses-name\"/></input>"
3499 "<output><must condition=\"cond\"/></output>"
3500 "<reference><text>ref</text></reference>"
3501 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003502 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003503 EXT_SUBELEM
David Sedlákeaa45792019-07-24 15:25:01 +02003504 "</rpc>"
3505 ELEMENT_WRAPPER_END;
3506 assert_int_equal(test_element_helper(st, &data, &act_meta, NULL, NULL, true), LY_SUCCESS);
3507 assert_null(actions->parent);
3508 assert_int_equal(actions->nodetype, LYS_ACTION);
3509 assert_true(actions->flags & LYS_STATUS_DEPRC);
3510 assert_string_equal(actions->name, "act");
3511 assert_string_equal(actions->dsc, "desc");
3512 assert_string_equal(actions->ref, "ref");
3513 assert_string_equal(*actions->iffeatures, "iff");
3514 assert_string_equal(actions->typedefs->name, "tpdf");
3515 assert_string_equal(actions->groupings->name, "grouping");
3516 assert_string_equal(actions->input.data->name, "uses-name");
3517 assert_string_equal(actions->output.musts->arg, "cond");
David Sedlákd1144562019-08-06 12:36:14 +02003518 assert_string_equal(actions->exts[0].name, "myext:c-define");
3519 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3520 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákeaa45792019-07-24 15:25:01 +02003521 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3522 actions = NULL;
3523
David Sedlák85d0eca2019-07-24 15:15:21 +02003524 /* min subelems */
3525 data = ELEMENT_WRAPPER_START "<action name=\"act\" />" ELEMENT_WRAPPER_END;
3526 assert_int_equal(test_element_helper(st, &data, &act_meta, NULL, NULL, true), LY_SUCCESS);
3527 assert_string_equal(actions->name, "act");
3528 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3529 actions = NULL;
3530
3531 st->finished_correctly = true;
3532}
3533
David Sedlák992fb7c2019-07-24 16:51:01 +02003534static void
3535test_augment_elem(void **state)
3536{
3537 struct state *st = *state;
3538 const char *data;
3539 struct lysp_augment *augments = NULL;
3540 struct augment_meta aug_meta = {NULL, &augments};
3541
3542 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3543 data = ELEMENT_WRAPPER_START
3544 "<augment target-node=\"target\">"
3545 "<action name=\"action\"/>"
3546 "<anydata name=\"anyd\"/>"
3547 "<anyxml name=\"anyx\"/>"
3548 "<case name=\"case\"/>"
3549 "<choice name=\"choice\"/>"
3550 "<container name=\"subcont\"/>"
3551 "<description><text>desc</text></description>"
3552 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003553 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3554 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák992fb7c2019-07-24 16:51:01 +02003555 "<list name=\"list\"/>"
3556 "<notification name=\"notif\"/>"
3557 "<reference><text>ref</text></reference>"
3558 "<status value=\"current\"/>"
3559 "<uses name=\"uses\"/>"
3560 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003561 EXT_SUBELEM
David Sedlák992fb7c2019-07-24 16:51:01 +02003562 "</augment>"
3563 ELEMENT_WRAPPER_END;
3564 assert_int_equal(test_element_helper(st, &data, &aug_meta, NULL, NULL, true), LY_SUCCESS);
3565 assert_string_equal(augments->nodeid, "target");
3566 assert_null(augments->parent);
3567 assert_int_equal(augments->nodetype, LYS_AUGMENT);
3568 assert_true(augments->flags & LYS_STATUS_CURR);
3569 assert_string_equal(augments->dsc, "desc");
3570 assert_string_equal(augments->ref, "ref");
3571 assert_string_equal(augments->when->cond, "when-cond");
3572 assert_string_equal(*augments->iffeatures, "iff");
3573 assert_string_equal(augments->child->name, "anyd");
3574 assert_int_equal(augments->child->nodetype, LYS_ANYDATA);
3575 assert_string_equal(augments->child->next->name, "anyx");
3576 assert_int_equal(augments->child->next->nodetype, LYS_ANYXML);
3577 assert_string_equal(augments->child->next->next->name, "case");
3578 assert_int_equal(augments->child->next->next->nodetype, LYS_CASE);
3579 assert_string_equal(augments->child->next->next->next->name, "choice");
3580 assert_int_equal(augments->child->next->next->next->nodetype, LYS_CHOICE);
3581 assert_string_equal(augments->child->next->next->next->next->name, "subcont");
3582 assert_int_equal(augments->child->next->next->next->next->nodetype, LYS_CONTAINER);
3583 assert_string_equal(augments->child->next->next->next->next->next->name, "leaf");
3584 assert_int_equal(augments->child->next->next->next->next->next->nodetype, LYS_LEAF);
3585 assert_string_equal(augments->child->next->next->next->next->next->next->name, "llist");
3586 assert_int_equal(augments->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3587 assert_string_equal(augments->child->next->next->next->next->next->next->next->name, "list");
3588 assert_int_equal(augments->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3589 assert_string_equal(augments->child->next->next->next->next->next->next->next->next->name, "uses");
3590 assert_int_equal(augments->child->next->next->next->next->next->next->next->next->nodetype, LYS_USES);
3591 assert_null(augments->child->next->next->next->next->next->next->next->next->next);
3592 assert_string_equal(augments->actions->name, "action");
3593 assert_string_equal(augments->notifs->name, "notif");
David Sedlákd1144562019-08-06 12:36:14 +02003594 assert_string_equal(augments->exts[0].name, "myext:c-define");
3595 assert_int_equal(augments->exts[0].insubstmt_index, 0);
3596 assert_int_equal(augments->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák992fb7c2019-07-24 16:51:01 +02003597 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3598 augments = NULL;
3599
3600 data = ELEMENT_WRAPPER_START "<augment target-node=\"target\" />" ELEMENT_WRAPPER_END;
3601 assert_int_equal(test_element_helper(st, &data, &aug_meta, NULL, NULL, true), LY_SUCCESS);
3602 assert_string_equal(augments->nodeid, "target");
3603 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3604 augments = NULL;
3605
3606 st->finished_correctly = true;
3607}
3608
David Sedlák4ffcec82019-07-25 15:10:21 +02003609static void
3610test_deviate_elem(void **state)
3611{
3612 struct state *st = *state;
3613 const char *data;
3614 struct lysp_deviate *deviates = NULL;
3615 struct lysp_deviate_add *d_add;
3616 struct lysp_deviate_rpl *d_rpl;
3617 struct lysp_deviate_del *d_del;
3618
3619 /* all valid arguments with min subelems */
3620 data = ELEMENT_WRAPPER_START "<deviate value=\"not-supported\" />" ELEMENT_WRAPPER_END;
3621 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3622 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
3623 lysp_deviate_free(st->ctx, deviates);
3624 free(deviates);
3625 deviates = NULL;
3626
3627 data = ELEMENT_WRAPPER_START "<deviate value=\"add\" />" ELEMENT_WRAPPER_END;
3628 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3629 assert_int_equal(deviates->mod, LYS_DEV_ADD);
3630 lysp_deviate_free(st->ctx, deviates);
3631 free(deviates);
3632 deviates = NULL;
3633
3634 data = ELEMENT_WRAPPER_START "<deviate value=\"replace\" />" ELEMENT_WRAPPER_END;
3635 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3636 assert_int_equal(deviates->mod, LYS_DEV_REPLACE);
3637 lysp_deviate_free(st->ctx, deviates);
3638 free(deviates);
3639 deviates = NULL;
3640
3641 data = ELEMENT_WRAPPER_START "<deviate value=\"delete\" />" ELEMENT_WRAPPER_END;
3642 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3643 assert_int_equal(deviates->mod, LYS_DEV_DELETE);
3644 lysp_deviate_free(st->ctx, deviates);
3645 free(deviates);
3646 deviates = NULL;
3647
3648 /* max subelems and valid arguments */
3649 data = ELEMENT_WRAPPER_START
3650 "<deviate value=\"not-supported\">"
David Sedlákd1144562019-08-06 12:36:14 +02003651 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003652 "</deviate>"
3653 ELEMENT_WRAPPER_END;
3654 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3655 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
David Sedlákd1144562019-08-06 12:36:14 +02003656 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3657 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3658 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003659 lysp_deviate_free(st->ctx, deviates);
3660 free(deviates);
3661 deviates = NULL;
3662
3663 data = ELEMENT_WRAPPER_START
3664 "<deviate value=\"add\">"
3665 "<units name=\"units\"/>"
3666 "<must condition=\"cond\"/>"
3667 "<unique tag=\"utag\"/>"
3668 "<default value=\"def\"/>"
3669 "<config value=\"true\"/>"
3670 "<mandatory value=\"true\"/>"
3671 "<min-elements value=\"5\"/>"
3672 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003673 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003674 "</deviate>"
3675 ELEMENT_WRAPPER_END;
3676 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3677 d_add = (struct lysp_deviate_add *)deviates;
3678 assert_int_equal(d_add->mod, LYS_DEV_ADD);
3679 assert_null(d_add->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003680 assert_string_equal(d_add->units, "units");
3681 assert_string_equal(d_add->musts->arg, "cond");
3682 assert_string_equal(*d_add->uniques, "utag");
3683 assert_string_equal(*d_add->dflts, "def");
3684 assert_true(d_add->flags & LYS_MAND_TRUE && d_add->flags & LYS_CONFIG_W);
3685 assert_int_equal(d_add->min, 5);
3686 assert_int_equal(d_add->max, 15);
David Sedlákd1144562019-08-06 12:36:14 +02003687 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3688 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3689 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003690 lysp_deviate_free(st->ctx, deviates);
3691 free(deviates);
3692 deviates = NULL;
3693
3694 data = ELEMENT_WRAPPER_START
3695 "<deviate value=\"replace\">"
3696 "<type name=\"newtype\"/>"
3697 "<units name=\"uni\"/>"
3698 "<default value=\"def\"/>"
3699 "<config value=\"true\"/>"
3700 "<mandatory value=\"true\"/>"
3701 "<min-elements value=\"5\"/>"
3702 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003703 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003704 "</deviate>"
3705 ELEMENT_WRAPPER_END;
3706 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3707 d_rpl = (struct lysp_deviate_rpl *)deviates;
3708 assert_int_equal(d_rpl->mod, LYS_DEV_REPLACE);
3709 assert_null(d_rpl->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003710 assert_string_equal(d_rpl->type->name, "newtype");
3711 assert_string_equal(d_rpl->units, "uni");
3712 assert_string_equal(d_rpl->dflt, "def");
3713 assert_true(d_rpl->flags & LYS_MAND_TRUE && d_rpl->flags & LYS_CONFIG_W);
3714 assert_int_equal(d_rpl->min, 5);
3715 assert_int_equal(d_rpl->max, 15);
David Sedlákd1144562019-08-06 12:36:14 +02003716 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3717 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3718 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003719 lysp_deviate_free(st->ctx, deviates);
3720 free(deviates);
3721 deviates = NULL;
3722
3723 data = ELEMENT_WRAPPER_START
3724 "<deviate value=\"delete\">"
3725 "<units name=\"u\"/>"
3726 "<must condition=\"c\"/>"
3727 "<unique tag=\"tag\"/>"
3728 "<default value=\"default\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003729 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003730 "</deviate>"
3731 ELEMENT_WRAPPER_END;
3732 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, true), LY_SUCCESS);
3733 d_del = (struct lysp_deviate_del *)deviates;
3734 assert_int_equal(d_del->mod, LYS_DEV_DELETE);
3735 assert_null(d_del->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003736 assert_string_equal(d_del->units, "u");
3737 assert_string_equal(d_del->musts->arg, "c");
3738 assert_string_equal(*d_del->uniques, "tag");
3739 assert_string_equal(*d_del->dflts, "default");
David Sedlákd1144562019-08-06 12:36:14 +02003740 assert_string_equal(deviates->exts[0].name, "myext:c-define");
3741 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3742 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003743 lysp_deviate_free(st->ctx, deviates);
3744 free(deviates);
3745 deviates = NULL;
3746
3747 /* invalid arguments */
3748 data = ELEMENT_WRAPPER_START "<deviate value=\"\" />" ELEMENT_WRAPPER_END;
3749 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3750 logbuf_assert("Invalid value \"\" of \"deviate\". Line number 1.");
3751 deviates = NULL;
3752
3753 data = ELEMENT_WRAPPER_START "<deviate value=\"invalid\" />" ELEMENT_WRAPPER_END;
3754 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3755 logbuf_assert("Invalid value \"invalid\" of \"deviate\". Line number 1.");
3756 deviates = NULL;
3757
3758 data = ELEMENT_WRAPPER_START "<deviate value=\"ad\" />" ELEMENT_WRAPPER_END;
3759 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3760 logbuf_assert("Invalid value \"ad\" of \"deviate\". Line number 1.");
3761 deviates = NULL;
3762
3763 data = ELEMENT_WRAPPER_START "<deviate value=\"adds\" />" ELEMENT_WRAPPER_END;
3764 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3765 logbuf_assert("Invalid value \"adds\" of \"deviate\". Line number 1.");
3766 deviates = NULL;
3767
3768 data = ELEMENT_WRAPPER_START
3769 "<deviate value=\"not-supported\">"
3770 "<must condition=\"c\"/>"
3771 "</deviate>"
3772 ELEMENT_WRAPPER_END;
3773 assert_int_equal(test_element_helper(st, &data, &deviates, NULL, NULL, false), LY_EVALID);
3774 logbuf_assert("Deviate of this type doesn't allow \"must\" as it's sub-element. Line number 1.");
3775
3776 st->finished_correctly = true;
3777}
3778
David Sedlák8b754462019-07-25 16:22:13 +02003779static void
3780test_deviation_elem(void **state)
3781{
3782 struct state *st = *state;
3783 const char *data;
3784 struct lysp_deviation *deviations = NULL;
3785
3786 /* min subelems */
3787 data = ELEMENT_WRAPPER_START
3788 "<deviation target-node=\"target\">"
3789 "<deviate value=\"not-supported\"/>"
3790 "</deviation>"
3791 ELEMENT_WRAPPER_END;
3792 assert_int_equal(test_element_helper(st, &data, &deviations, NULL, NULL, true), LY_SUCCESS);
3793 assert_string_equal(deviations->nodeid, "target");
3794 assert_int_equal(deviations->deviates->mod, LYS_DEV_NOT_SUPPORTED);
3795 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3796 deviations = NULL;
3797
3798 /* max subelems */
3799 data = ELEMENT_WRAPPER_START
3800 "<deviation target-node=\"target\">"
3801 "<reference><text>ref</text></reference>"
3802 "<description><text>desc</text></description>"
3803 "<deviate value=\"add\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003804 EXT_SUBELEM
David Sedlák8b754462019-07-25 16:22:13 +02003805 "</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_ADD);
3810 assert_string_equal(deviations->ref, "ref");
3811 assert_string_equal(deviations->dsc, "desc");
David Sedlákd1144562019-08-06 12:36:14 +02003812 assert_string_equal(deviations->exts[0].name, "myext:c-define");
3813 assert_int_equal(deviations->exts[0].insubstmt_index, 0);
3814 assert_int_equal(deviations->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8b754462019-07-25 16:22:13 +02003815 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3816 deviations = NULL;
3817
3818 /* invalid */
3819 data = ELEMENT_WRAPPER_START "<deviation target-node=\"target\"/>" ELEMENT_WRAPPER_END;
3820 assert_int_equal(test_element_helper(st, &data, &deviations, NULL, NULL, false), LY_EVALID);
3821 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3822 deviations = NULL;
3823 logbuf_assert("Missing mandatory subelement deviate of deviate element. Line number 1.");
3824
3825 st->finished_correctly = true;
3826}
3827
David Sedlák4f03b932019-07-26 13:01:47 +02003828static void
3829test_module_elem(void **state)
3830{
3831 struct state *st = *state;
3832 const char *data;
3833 struct yin_arg_record *attrs = NULL;
3834 struct sized_string name, prefix;
3835 struct lys_module *lys_mod = NULL;
3836 struct lysp_module *lysp_mod = NULL;
3837
3838 /* max subelems */
3839 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3840 lys_mod = calloc(1, sizeof *lys_mod);
3841 lysp_mod = calloc(1, sizeof *lysp_mod);
3842 lys_mod->ctx = st->ctx;
3843 lysp_mod->mod = lys_mod;
3844 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3845 "<yang-version value=\"1.1\"/>\n"
3846 "<namespace uri=\"ns\"/>\n"
3847 "<prefix value=\"pref\"/>\n"
3848 "<include module=\"b-mod\"/>\n"
3849 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3850 "<organization><text>org</text></organization>\n"
3851 "<contact><text>contact</text></contact>\n"
3852 "<description><text>desc</text></description>"
3853 "<reference><text>ref</text></reference>\n"
3854 "<revision date=\"2019-02-02\"/>\n"
3855 "<anydata name=\"anyd\"/>\n"
3856 "<anyxml name=\"anyx\"/>\n"
3857 "<choice name=\"choice\"/>\n"
3858 "<container name=\"cont\"/>\n"
3859 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3860 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3861 "<list name=\"sub-list\"/>\n"
3862 "<uses name=\"uses-name\"/>\n"
3863 "<augment target-node=\"target\"/>\n"
3864 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
3865 "<extension name=\"ext\"/>\n"
3866 "<feature name=\"feature\"/>\n"
3867 "<grouping name=\"grp\"/>\n"
3868 "<identity name=\"ident-name\"/>\n"
3869 "<notification name=\"notf\"/>\n"
3870 "<rpc name=\"rpc-name\"/>\n"
3871 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02003872 EXT_SUBELEM"\n"
David Sedlák4f03b932019-07-26 13:01:47 +02003873 "</module>\n";
3874 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
3875 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
3876 assert_int_equal(yin_parse_mod(st->yin_ctx, attrs, &data, lysp_mod), LY_SUCCESS);
3877 assert_string_equal(lysp_mod->mod->name, "mod");
3878 assert_string_equal(lysp_mod->revs, "2019-02-02");
3879 assert_string_equal(lysp_mod->mod->ns, "ns");
3880 assert_string_equal(lysp_mod->mod->prefix, "pref");
3881 assert_null(lysp_mod->mod->filepath);
3882 assert_string_equal(lysp_mod->mod->org, "org");
3883 assert_string_equal(lysp_mod->mod->contact, "contact");
3884 assert_string_equal(lysp_mod->mod->dsc, "desc");
3885 assert_string_equal(lysp_mod->mod->ref, "ref");
3886 assert_int_equal(lysp_mod->mod->version, LYS_VERSION_1_1);
3887 assert_string_equal(lysp_mod->imports->name, "a-mod");
3888 assert_string_equal(lysp_mod->includes->name, "b-mod");
3889 assert_string_equal(lysp_mod->extensions->name, "ext");
3890 assert_string_equal(lysp_mod->features->name, "feature");
3891 assert_string_equal(lysp_mod->identities->name, "ident-name");
3892 assert_string_equal(lysp_mod->typedefs->name, "tpdf");
3893 assert_string_equal(lysp_mod->groupings->name, "grp");
3894 assert_string_equal(lysp_mod->data->name, "anyd");
3895 assert_int_equal(lysp_mod->data->nodetype, LYS_ANYDATA);
3896 assert_string_equal(lysp_mod->data->next->name, "anyx");
3897 assert_int_equal(lysp_mod->data->next->nodetype, LYS_ANYXML);
3898 assert_string_equal(lysp_mod->data->next->next->name, "choice");
3899 assert_int_equal(lysp_mod->data->next->next->nodetype, LYS_CHOICE);
3900 assert_string_equal(lysp_mod->data->next->next->next->name, "cont");
3901 assert_int_equal(lysp_mod->data->next->next->next->nodetype, LYS_CONTAINER);
3902 assert_string_equal(lysp_mod->data->next->next->next->next->name, "leaf");
3903 assert_int_equal(lysp_mod->data->next->next->next->next->nodetype, LYS_LEAF);
3904 assert_string_equal(lysp_mod->data->next->next->next->next->next->name, "llist");
3905 assert_int_equal(lysp_mod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3906 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->name, "sub-list");
3907 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
3908 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->next->name, "uses-name");
3909 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3910 assert_null(lysp_mod->data->next->next->next->next->next->next->next->next);
3911 assert_string_equal(lysp_mod->augments->nodeid, "target");
3912 assert_string_equal(lysp_mod->rpcs->name, "rpc-name");
3913 assert_string_equal(lysp_mod->notifs->name, "notf");
3914 assert_string_equal(lysp_mod->deviations->nodeid, "target");
David Sedlákd1144562019-08-06 12:36:14 +02003915 assert_string_equal(lysp_mod->exts[0].name, "myext:c-define");
3916 assert_int_equal(lysp_mod->exts[0].insubstmt_index, 0);
3917 assert_int_equal(lysp_mod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4f03b932019-07-26 13:01:47 +02003918 lysp_module_free(lysp_mod);
3919 lys_module_free(lys_mod, NULL);
3920 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
3921 attrs = NULL;
3922
3923 /* min subelems */
3924 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3925 lys_mod = calloc(1, sizeof *lys_mod);
3926 lysp_mod = calloc(1, sizeof *lysp_mod);
3927 lys_mod->ctx = st->ctx;
3928 lysp_mod->mod = lys_mod;
3929 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3930 "<namespace uri=\"ns\"/>"
3931 "<prefix value=\"pref\"/>"
3932 "<yang-version value=\"1.1\"/>"
3933 "</module>";
3934 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
3935 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
3936 assert_int_equal(yin_parse_mod(st->yin_ctx, attrs, &data, lysp_mod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003937 assert_string_equal(lysp_mod->mod->name, "mod");
David Sedlák4f03b932019-07-26 13:01:47 +02003938 lysp_module_free(lysp_mod);
3939 lys_module_free(lys_mod, NULL);
3940 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
3941 attrs = NULL;
David Sedlák298ff6d2019-07-26 14:29:03 +02003942
David Sedláke6cd89e2019-08-07 12:46:02 +02003943 /* incorrect subelem order */
3944 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3945 lys_mod = calloc(1, sizeof *lys_mod);
3946 lysp_mod = calloc(1, sizeof *lysp_mod);
3947 lys_mod->ctx = st->ctx;
3948 lysp_mod->mod = lys_mod;
3949 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3950 "<feature name=\"feature\"/>\n"
3951 "<namespace uri=\"ns\"/>"
3952 "<prefix value=\"pref\"/>"
3953 "<yang-version value=\"1.1\"/>"
3954 "</module>";
3955 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
3956 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
3957 assert_int_equal(yin_parse_mod(st->yin_ctx, attrs, &data, lysp_mod), LY_EVALID);
3958 logbuf_assert("Invalid order of module\'s subelements \"namespace\" can\'t appear after \"feature\". Line number 30.");
3959 lysp_module_free(lysp_mod);
3960 lys_module_free(lys_mod, NULL);
3961 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
3962 attrs = NULL;
3963
David Sedlák298ff6d2019-07-26 14:29:03 +02003964 st->finished_correctly = true;
3965}
3966
3967static void
3968test_submodule_elem(void **state)
3969{
3970 struct state *st = *state;
3971 const char *data;
3972 struct yin_arg_record *attrs = NULL;
3973 struct sized_string name, prefix;
3974 struct lysp_submodule *lysp_submod = NULL;
3975
3976 /* max subelements */
3977 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
3978 lysp_submod = calloc(1, sizeof *lysp_submod);
3979 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3980 "<yang-version value=\"1.1\"/>\n"
3981 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
3982 "<include module=\"b-mod\"/>\n"
3983 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3984 "<organization><text>org</text></organization>\n"
3985 "<contact><text>contact</text></contact>\n"
3986 "<description><text>desc</text></description>"
3987 "<reference><text>ref</text></reference>\n"
3988 "<revision date=\"2019-02-02\"/>\n"
3989 "<anydata name=\"anyd\"/>\n"
3990 "<anyxml name=\"anyx\"/>\n"
3991 "<choice name=\"choice\"/>\n"
3992 "<container name=\"cont\"/>\n"
3993 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3994 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3995 "<list name=\"sub-list\"/>\n"
3996 "<uses name=\"uses-name\"/>\n"
3997 "<augment target-node=\"target\"/>\n"
3998 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
3999 "<extension name=\"ext\"/>\n"
4000 "<feature name=\"feature\"/>\n"
4001 "<grouping name=\"grp\"/>\n"
4002 "<identity name=\"ident-name\"/>\n"
4003 "<notification name=\"notf\"/>\n"
4004 "<rpc name=\"rpc-name\"/>\n"
4005 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02004006 EXT_SUBELEM"\n"
David Sedlák298ff6d2019-07-26 14:29:03 +02004007 "</submodule>\n";
4008 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
4009 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
4010 assert_int_equal(yin_parse_submod(st->yin_ctx, attrs, &data, lysp_submod), LY_SUCCESS);
4011
4012 assert_string_equal(lysp_submod->name, "mod");
4013 assert_string_equal(lysp_submod->revs, "2019-02-02");
David Sedlák298ff6d2019-07-26 14:29:03 +02004014 assert_string_equal(lysp_submod->prefix, "pref");
4015 assert_null(lysp_submod->filepath);
4016 assert_string_equal(lysp_submod->org, "org");
4017 assert_string_equal(lysp_submod->contact, "contact");
4018 assert_string_equal(lysp_submod->dsc, "desc");
4019 assert_string_equal(lysp_submod->ref, "ref");
4020 assert_int_equal(lysp_submod->version, LYS_VERSION_1_1);
4021 assert_string_equal(lysp_submod->imports->name, "a-mod");
4022 assert_string_equal(lysp_submod->includes->name, "b-mod");
4023 assert_string_equal(lysp_submod->extensions->name, "ext");
4024 assert_string_equal(lysp_submod->features->name, "feature");
4025 assert_string_equal(lysp_submod->identities->name, "ident-name");
4026 assert_string_equal(lysp_submod->typedefs->name, "tpdf");
4027 assert_string_equal(lysp_submod->groupings->name, "grp");
4028 assert_string_equal(lysp_submod->data->name, "anyd");
4029 assert_int_equal(lysp_submod->data->nodetype, LYS_ANYDATA);
4030 assert_string_equal(lysp_submod->data->next->name, "anyx");
4031 assert_int_equal(lysp_submod->data->next->nodetype, LYS_ANYXML);
4032 assert_string_equal(lysp_submod->data->next->next->name, "choice");
4033 assert_int_equal(lysp_submod->data->next->next->nodetype, LYS_CHOICE);
4034 assert_string_equal(lysp_submod->data->next->next->next->name, "cont");
4035 assert_int_equal(lysp_submod->data->next->next->next->nodetype, LYS_CONTAINER);
4036 assert_string_equal(lysp_submod->data->next->next->next->next->name, "leaf");
4037 assert_int_equal(lysp_submod->data->next->next->next->next->nodetype, LYS_LEAF);
4038 assert_string_equal(lysp_submod->data->next->next->next->next->next->name, "llist");
4039 assert_int_equal(lysp_submod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
4040 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->name, "sub-list");
4041 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
4042 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->next->name, "uses-name");
4043 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
4044 assert_null(lysp_submod->data->next->next->next->next->next->next->next->next);
4045 assert_string_equal(lysp_submod->augments->nodeid, "target");
4046 assert_string_equal(lysp_submod->rpcs->name, "rpc-name");
4047 assert_string_equal(lysp_submod->notifs->name, "notf");
4048 assert_string_equal(lysp_submod->deviations->nodeid, "target");
David Sedlákd1144562019-08-06 12:36:14 +02004049 assert_string_equal(lysp_submod->exts[0].name, "myext:c-define");
4050 assert_int_equal(lysp_submod->exts[0].insubstmt_index, 0);
4051 assert_int_equal(lysp_submod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák298ff6d2019-07-26 14:29:03 +02004052
4053 lysp_submodule_free(st->ctx, lysp_submod);
4054 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
4055 attrs = NULL;
4056
4057 /* min subelemnts */
4058 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
4059 lysp_submod = calloc(1, sizeof *lysp_submod);
4060 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
4061 "<yang-version value=\"1.0\"/>"
4062 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
4063 "</submodule>";
4064 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
4065 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
4066 assert_int_equal(yin_parse_submod(st->yin_ctx, attrs, &data, lysp_submod), LY_SUCCESS);
4067 assert_string_equal(lysp_submod->prefix, "pref");
4068 assert_string_equal(lysp_submod->belongsto, "mod-name");
4069 assert_int_equal(lysp_submod->version, LYS_VERSION_1_0);
4070 lysp_submodule_free(st->ctx, lysp_submod);
4071 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
4072 attrs = NULL;
4073
David Sedláke6cd89e2019-08-07 12:46:02 +02004074 /* incorrect subelem order */
4075 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
4076 lysp_submod = calloc(1, sizeof *lysp_submod);
4077 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
4078 "<yang-version value=\"1.0\"/>"
4079 "<reference><text>ref</text></reference>\n"
4080 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
4081 "</submodule>";
4082 assert_int_equal(lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len), LY_SUCCESS);
4083 assert_int_equal(yin_load_attributes(st->yin_ctx, &data, &attrs), LY_SUCCESS);
4084 assert_int_equal(yin_parse_submod(st->yin_ctx, attrs, &data, lysp_submod), LY_EVALID);
4085 logbuf_assert("Invalid order of submodule's subelements \"belongs-to\" can't appear after \"reference\". Line number 28.");
4086 lysp_submodule_free(st->ctx, lysp_submod);
4087 FREE_ARRAY(st->yin_ctx, attrs, free_arg_rec);
4088 attrs = NULL;
4089
David Sedlák298ff6d2019-07-26 14:29:03 +02004090 st->finished_correctly = true;
David Sedlák4f03b932019-07-26 13:01:47 +02004091}
4092
David Sedlák8985a142019-07-31 16:43:06 +02004093static void
4094test_yin_parse_module(void **state)
4095{
4096 struct state *st = *state;
4097 const char *data;
4098 struct lys_module *mod;
4099 struct yin_parser_ctx *yin_ctx = NULL;
4100
4101 mod = calloc(1, sizeof *mod);
4102 mod->ctx = st->ctx;
4103 data = "<module name=\"example-foo\""
4104 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4105 "xmlns:foo=\"urn:example:foo\""
4106 "xmlns:myext=\"urn:example:extensions\">\n"
4107
4108 "<yang-version value=\"1.0\"/>\n"
4109
4110 "<namespace uri=\"urn:example:foo\"/>\n"
4111 "<prefix value=\"foo\"/>\n"
4112
4113 "<import module=\"example-extensions\">\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004114 "<prefix value=\"myext\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02004115 "</import>\n"
4116
4117 "<list name=\"interface\">\n"
4118 "<key value=\"name\"/>\n"
4119 "<leaf name=\"name\">\n"
4120 "<type name=\"string\"/>\n"
4121 "</leaf>\n"
4122 "<leaf name=\"mtu\">\n"
4123 "<type name=\"uint32\"/>\n"
4124 "<description>\n"
4125 "<text>The MTU of the interface.</text>\n"
4126 "</description>\n"
4127 "<myext:c-define name=\"MY_MTU\"/>\n"
4128 "</leaf>\n"
4129 "</list>\n"
4130 "</module>\n";
4131 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4132 lys_module_free(mod, NULL);
4133 yin_parser_ctx_free(yin_ctx);
4134 mod = NULL;
4135 yin_ctx = NULL;
4136
4137 mod = calloc(1, sizeof *mod);
4138 mod->ctx = st->ctx;
David Sedlák6d781b62019-08-02 15:22:52 +02004139 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
4140 "<yang-version value=\"1.0\"/>\n"
4141 "<namespace uri=\"urn:example:foo\"/>\n"
4142 "<prefix value=\"foo\"/>\n"
4143 "</module>\n";
4144 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4145 lys_module_free(mod, NULL);
4146 yin_parser_ctx_free(yin_ctx);
4147 mod = NULL;
4148 yin_ctx = NULL;
4149
4150
4151 mod = calloc(1, sizeof *mod);
4152 mod->ctx = st->ctx;
David Sedlák8985a142019-07-31 16:43:06 +02004153 data = "<submodule name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4154 "</submodule>\n";
4155 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_EINVAL);
4156 logbuf_assert("Input data contains submodule which cannot be parsed directly without its main module.");
4157 lys_module_free(mod, NULL);
4158 yin_parser_ctx_free(yin_ctx);
4159
David Sedlák6d781b62019-08-02 15:22:52 +02004160 mod = calloc(1, sizeof *mod);
4161 mod->ctx = st->ctx;
4162 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
4163 "<yang-version value=\"1.0\"/>\n"
4164 "<namespace uri=\"urn:example:foo\"/>\n"
4165 "<prefix value=\"foo\"/>\n"
4166 "</module>"
4167 "<module>";
4168 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_EVALID);
4169 logbuf_assert("Trailing garbage \"<module>\" after module, expected end-of-input. Line number 5.");
4170 lys_module_free(mod, NULL);
4171 yin_parser_ctx_free(yin_ctx);
4172 mod = NULL;
4173 yin_ctx = NULL;
4174
David Sedlák8985a142019-07-31 16:43:06 +02004175 st->finished_correctly = true;
4176}
4177
4178static void
4179test_yin_parse_submodule(void **state)
4180{
4181 struct state *st = *state;
4182 const char *data;
4183 struct yin_parser_ctx *yin_ctx = NULL;
4184 struct lysp_submodule *submod = NULL;
David Sedlák1b623122019-08-05 15:27:49 +02004185 struct lys_parser_ctx main_ctx = {};
David Sedlák8985a142019-07-31 16:43:06 +02004186
4187 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4188 "<submodule name=\"asub\""
4189 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4190 "xmlns:a=\"urn:a\">"
4191 "<yang-version value=\"1.0\"/>\n"
4192 "<belongs-to module=\"a\">"
4193 "<prefix value=\"a_pref\"/>"
4194 "</belongs-to>"
4195 "<include module=\"atop\"/>"
4196 "<feature name=\"fox\"/>"
4197 "<notification name=\"bar-notif\">"
4198 "<if-feature name=\"bar\"/>"
4199 "</notification>"
4200 "<notification name=\"fox-notif\">"
4201 "<if-feature name=\"fox\"/>"
4202 "</notification>"
4203 "<augment target-node=\"/a_pref:top\">"
4204 "<if-feature name=\"bar\"/>"
4205 "<container name=\"bar-sub\"/>"
4206 "</augment>"
4207 "<augment target-node=\"/top\">"
4208 "<container name=\"bar-sub2\"/>"
4209 "</augment>"
4210 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004211 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_SUCCESS);
David Sedlák8985a142019-07-31 16:43:06 +02004212 lysp_submodule_free(st->ctx, submod);
4213 yin_parser_ctx_free(yin_ctx);
4214 yin_ctx = NULL;
4215 submod = NULL;
4216
4217 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák6d781b62019-08-02 15:22:52 +02004218 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4219 "<yang-version value=\"1.0\"/>\n"
4220 "<belongs-to module=\"a\">"
4221 "<prefix value=\"a_pref\"/>"
4222 "</belongs-to>"
4223 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004224 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_SUCCESS);
David Sedlák6d781b62019-08-02 15:22:52 +02004225 lysp_submodule_free(st->ctx, submod);
4226 yin_parser_ctx_free(yin_ctx);
4227 yin_ctx = NULL;
4228 submod = NULL;
4229
4230 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák8985a142019-07-31 16:43:06 +02004231 "<module name=\"inval\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4232 "</module>";
David Sedlák1b623122019-08-05 15:27:49 +02004233 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_EINVAL);
David Sedlák8985a142019-07-31 16:43:06 +02004234 logbuf_assert("Input data contains module in situation when a submodule is expected.");
4235 lysp_submodule_free(st->ctx, submod);
4236 yin_parser_ctx_free(yin_ctx);
4237 yin_ctx = NULL;
4238 submod = NULL;
4239
David Sedlák6d781b62019-08-02 15:22:52 +02004240 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4241 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4242 "<yang-version value=\"1.0\"/>\n"
4243 "<belongs-to module=\"a\">"
4244 "<prefix value=\"a_pref\"/>"
4245 "</belongs-to>"
4246 "</submodule>"
4247 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4248 "<yang-version value=\"1.0\"/>\n"
4249 "<belongs-to module=\"a\">"
4250 "<prefix value=\"a_pref\"/>"
4251 "</belongs-to>"
4252 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004253 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_EVALID);
David Sedlák6d781b62019-08-02 15:22:52 +02004254 logbuf_assert("Trailing garbage \"<submodule name...\" after submodule, expected end-of-input. Line number 2.");
4255 lysp_submodule_free(st->ctx, submod);
4256 yin_parser_ctx_free(yin_ctx);
4257 yin_ctx = NULL;
4258 submod = NULL;
4259
David Sedlák8985a142019-07-31 16:43:06 +02004260 st->finished_correctly = true;
4261}
4262
David Sedlák3b4db242018-10-19 16:11:01 +02004263int
4264main(void)
4265{
4266
4267 const struct CMUnitTest tests[] = {
David Sedlák8f7a1172019-06-20 14:42:18 +02004268 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02004269 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
4270 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák555c7202019-07-04 12:14:12 +02004271 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02004272 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02004273
David Sedlák8e7bda82019-07-16 17:57:50 +02004274 cmocka_unit_test(test_yin_match_argument_name),
David Sedlák43801c92019-08-05 15:58:54 +02004275 cmocka_unit_test_setup_teardown(test_enum_elem, setup_element_test, teardown_element_test),
4276 cmocka_unit_test_setup_teardown(test_bit_elem, setup_element_test, teardown_element_test),
David Sedlák32488102019-07-15 17:44:10 +02004277 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_element_test),
4278 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_element_test),
4279 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_element_test),
4280 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_element_test),
4281 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_element_test),
4282 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_element_test),
4283 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02004284 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_element_test),
4285 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_element_test),
4286 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_element_test),
4287 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_element_test),
4288 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_element_test),
4289 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_element_test),
4290 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_element_test),
4291 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_element_test),
4292 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_element_test),
4293 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_element_test),
4294 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_element_test),
4295 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_element_test),
4296 cmocka_unit_test_setup_teardown(test_path_elem, setup_element_test, teardown_element_test),
4297 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_element_test),
4298 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_element_test),
David Sedlák69f01612019-07-17 11:41:08 +02004299 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_element_test),
4300 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_element_test),
4301 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_element_test),
4302 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_element_test),
4303 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_element_test),
4304 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_element_test),
4305 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_element_test),
4306 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_element_test),
David Sedlák374d2b32019-07-17 15:06:55 +02004307 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_element_test),
David Sedlák1af868e2019-07-17 17:03:14 +02004308 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_element_test),
David Sedlák09e18c92019-07-18 11:17:11 +02004309 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_element_test),
David Sedláka2dad212019-07-18 12:45:19 +02004310 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_element_test),
David Sedlák8a83bbb2019-07-18 14:46:00 +02004311 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02004312 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_element_test),
David Sedlákc3da3ef2019-07-19 12:56:08 +02004313 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_element_test),
David Sedlákcb39f642019-07-19 13:19:55 +02004314 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_element_test),
David Sedlák12470a82019-07-19 13:44:36 +02004315 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_element_test),
David Sedlák04e17b22019-07-19 15:29:48 +02004316 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_element_test),
David Sedlákd2d676a2019-07-22 11:28:19 +02004317 cmocka_unit_test_setup_teardown(test_refine_elem, setup_element_test, teardown_element_test),
David Sedlák0d6de5a2019-07-22 13:25:44 +02004318 cmocka_unit_test_setup_teardown(test_uses_elem, setup_element_test, teardown_element_test),
David Sedlákaa854b02019-07-22 14:17:10 +02004319 cmocka_unit_test_setup_teardown(test_revision_elem, setup_element_test, teardown_element_test),
David Sedlák0c2bab92019-07-22 15:33:19 +02004320 cmocka_unit_test_setup_teardown(test_include_elem, setup_element_test, teardown_element_test),
David Sedlák5e13dea2019-07-22 16:06:45 +02004321 cmocka_unit_test_setup_teardown(test_feature_elem, setup_element_test, teardown_element_test),
David Sedlák28794f22019-07-22 16:45:00 +02004322 cmocka_unit_test_setup_teardown(test_identity_elem, setup_element_test, teardown_element_test),
David Sedlákaf536aa2019-07-23 13:42:23 +02004323 cmocka_unit_test_setup_teardown(test_list_elem, setup_element_test, teardown_element_test),
David Sedlák031b9e72019-07-23 15:19:37 +02004324 cmocka_unit_test_setup_teardown(test_notification_elem, setup_element_test, teardown_element_test),
David Sedláke3ce9ef2019-07-23 16:34:30 +02004325 cmocka_unit_test_setup_teardown(test_grouping_elem, setup_element_test, teardown_element_test),
David Sedlákf111bcb2019-07-23 17:15:51 +02004326 cmocka_unit_test_setup_teardown(test_container_elem, setup_element_test, teardown_element_test),
David Sedlák5379d392019-07-24 10:42:03 +02004327 cmocka_unit_test_setup_teardown(test_case_elem, setup_element_test, teardown_element_test),
David Sedlákb7abcfa2019-07-24 12:33:35 +02004328 cmocka_unit_test_setup_teardown(test_choice_elem, setup_element_test, teardown_element_test),
David Sedlák05404f62019-07-24 14:11:53 +02004329 cmocka_unit_test_setup_teardown(test_inout_elem, setup_element_test, teardown_element_test),
David Sedlák85d0eca2019-07-24 15:15:21 +02004330 cmocka_unit_test_setup_teardown(test_action_elem, setup_element_test, teardown_element_test),
David Sedlák992fb7c2019-07-24 16:51:01 +02004331 cmocka_unit_test_setup_teardown(test_augment_elem, setup_element_test, teardown_element_test),
David Sedlák4ffcec82019-07-25 15:10:21 +02004332 cmocka_unit_test_setup_teardown(test_deviate_elem, setup_element_test, teardown_element_test),
David Sedlák8b754462019-07-25 16:22:13 +02004333 cmocka_unit_test_setup_teardown(test_deviation_elem, setup_element_test, teardown_element_test),
David Sedlák4f03b932019-07-26 13:01:47 +02004334 cmocka_unit_test_setup_teardown(test_module_elem, setup_element_test, teardown_element_test),
David Sedlák298ff6d2019-07-26 14:29:03 +02004335 cmocka_unit_test_setup_teardown(test_submodule_elem, setup_element_test, teardown_element_test),
David Sedlák8985a142019-07-31 16:43:06 +02004336
4337 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_logger, teardown_logger),
4338 cmocka_unit_test_setup_teardown(test_yin_parse_submodule, setup_logger, teardown_logger),
David Sedlák3b4db242018-10-19 16:11:01 +02004339 };
4340
David Sedlák8e7bda82019-07-16 17:57:50 +02004341 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02004342}