blob: 809bfd6f76674b6c39e2d938805068ca8ad9a135 [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
Radek Krejci3a4889a2020-05-19 17:01:58 +020024#include "../../../src/common.h"
25#include "../../../src/tree_schema.h"
26#include "../../../src/tree_schema_internal.h"
27#include "../../../src/parser_yin.h"
28#include "../../../src/xml.h"
Michal Vasko004d3152020-06-11 19:59:22 +020029#include "../../../src/xpath.h"
David Sedlák3b4db242018-10-19 16:11:01 +020030
David Sedlák555c7202019-07-04 12:14:12 +020031/* prototypes of static functions */
32void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
David Sedlák986cb412019-07-04 13:10:11 +020033void lysp_ext_free(struct ly_ctx *ctx, struct lysp_ext *ext);
David Sedlák32eee7b2019-07-09 12:38:44 +020034void lysp_when_free(struct ly_ctx *ctx, struct lysp_when *when);
David Sedlák32488102019-07-15 17:44:10 +020035void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
David Sedlák8a83bbb2019-07-18 14:46:00 +020036void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
David Sedlák04e17b22019-07-19 15:29:48 +020037void lysp_tpdf_free(struct ly_ctx *ctx, struct lysp_tpdf *tpdf);
David Sedlákd2d676a2019-07-22 11:28:19 +020038void lysp_refine_free(struct ly_ctx *ctx, struct lysp_refine *ref);
David Sedlákaa854b02019-07-22 14:17:10 +020039void lysp_revision_free(struct ly_ctx *ctx, struct lysp_revision *rev);
David Sedlák0c2bab92019-07-22 15:33:19 +020040void lysp_include_free(struct ly_ctx *ctx, struct lysp_include *include);
David Sedlák5e13dea2019-07-22 16:06:45 +020041void lysp_feature_free(struct ly_ctx *ctx, struct lysp_feature *feat);
David Sedlák28794f22019-07-22 16:45:00 +020042void lysp_ident_free(struct ly_ctx *ctx, struct lysp_ident *ident);
David Sedlák031b9e72019-07-23 15:19:37 +020043void lysp_notif_free(struct ly_ctx *ctx, struct lysp_notif *notif);
David Sedláke3ce9ef2019-07-23 16:34:30 +020044void lysp_grp_free(struct ly_ctx *ctx, struct lysp_grp *grp);
David Sedlák05404f62019-07-24 14:11:53 +020045void lysp_action_inout_free(struct ly_ctx *ctx, struct lysp_action_inout *inout);
David Sedlák85d0eca2019-07-24 15:15:21 +020046void lysp_action_free(struct ly_ctx *ctx, struct lysp_action *action);
David Sedlák992fb7c2019-07-24 16:51:01 +020047void lysp_augment_free(struct ly_ctx *ctx, struct lysp_augment *augment);
David Sedlák4ffcec82019-07-25 15:10:21 +020048void lysp_deviate_free(struct ly_ctx *ctx, struct lysp_deviate *d);
David Sedlák8b754462019-07-25 16:22:13 +020049void lysp_deviation_free(struct ly_ctx *ctx, struct lysp_deviation *dev);
David Sedlák298ff6d2019-07-26 14:29:03 +020050void lysp_submodule_free(struct ly_ctx *ctx, struct lysp_submodule *submod);
51void lysp_import_free(struct ly_ctx *ctx, struct lysp_import *import);
David Sedlák555c7202019-07-04 12:14:12 +020052
David Sedláke6cd89e2019-08-07 12:46:02 +020053/* wrapping element used for mocking has nothing to do with real module structure */
54#define ELEMENT_WRAPPER_START "<status xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
55#define ELEMENT_WRAPPER_END "</status>"
56
Radek Krejci3a4889a2020-05-19 17:01:58 +020057struct test_parser_yin_state {
David Sedlák3b4db242018-10-19 16:11:01 +020058 struct ly_ctx *ctx;
David Sedlák3017da42019-02-15 09:48:04 +010059 struct lys_module *mod;
David Sedlák619db942019-07-03 14:47:30 +020060 struct lysp_module *lysp_mod;
Michal Vaskob36053d2020-03-26 15:49:30 +010061 struct lys_yin_parser_ctx *yin_ctx;
David Sedlák79e50cb2019-06-05 16:33:09 +020062 bool finished_correctly;
David Sedlák68a1af12019-03-08 13:46:54 +010063};
David Sedlák872c7b42018-10-26 13:15:20 +020064
David Sedlák79e50cb2019-06-05 16:33:09 +020065#define BUFSIZE 1024
66char logbuf[BUFSIZE] = {0};
67int store = -1; /* negative for infinite logging, positive for limited logging */
68
69/* set to 0 to printing error messages to stderr instead of checking them in code */
David Sedláke0ef1c62019-09-13 10:05:55 +020070#define ENABLE_LOGGER_CHECKING 1
David Sedlák79e50cb2019-06-05 16:33:09 +020071
72#if ENABLE_LOGGER_CHECKING
73static void
74logger(LY_LOG_LEVEL level, const char *msg, const char *path)
75{
76 (void) level; /* unused */
77 if (store) {
78 if (path && path[0]) {
79 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
80 } else {
81 strncpy(logbuf, msg, BUFSIZE - 1);
82 }
83 if (store > 0) {
84 --store;
85 }
86 }
87}
88#endif
89
90#if ENABLE_LOGGER_CHECKING
91# define logbuf_assert(str) assert_string_equal(logbuf, str)
92#else
93# define logbuf_assert(str)
94#endif
95
96#define TEST_DUP_GENERIC(PREFIX, MEMBER, VALUE1, VALUE2, FUNC, RESULT, LINE, CLEANUP) \
97 str = PREFIX MEMBER" "VALUE1";"MEMBER" "VALUE2";} ..."; \
98 assert_int_equal(LY_EVALID, FUNC(&ctx, &str, RESULT)); \
99 logbuf_assert("Duplicate keyword \""MEMBER"\". Line number "LINE"."); \
100 CLEANUP
101
David Sedlák8e7bda82019-07-16 17:57:50 +0200102int
103setup_ly_ctx(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100104{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200105 struct test_parser_yin_state *st = NULL;
David Sedlák3b4db242018-10-19 16:11:01 +0200106
David Sedlák68a1af12019-03-08 13:46:54 +0100107 /* allocate state variable */
108 (*state) = st = calloc(1, sizeof(*st));
109 if (!st) {
110 fprintf(stderr, "Memmory allocation failed");
111 return EXIT_FAILURE;
112 }
David Sedlák872c7b42018-10-26 13:15:20 +0200113
David Sedlák68a1af12019-03-08 13:46:54 +0100114 /* create new libyang context */
115 ly_ctx_new(NULL, 0, &st->ctx);
David Sedlák872c7b42018-10-26 13:15:20 +0200116
David Sedlák8e7bda82019-07-16 17:57:50 +0200117 return EXIT_SUCCESS;
118}
119
120int
121destroy_ly_ctx(void **state)
122{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200123 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +0200124 ly_ctx_destroy(st->ctx, NULL);
125 free(st);
126
127 return EXIT_SUCCESS;
128}
129
130static int
131setup_f(void **state)
132{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200133 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +0200134
135#if ENABLE_LOGGER_CHECKING
136 /* setup logger */
137 ly_set_log_clb(logger, 1);
138#endif
139
David Sedlák68a1af12019-03-08 13:46:54 +0100140 /* allocate new module */
141 st->mod = calloc(1, sizeof(*st->mod));
142 st->mod->ctx = st->ctx;
143
David Sedlák619db942019-07-03 14:47:30 +0200144 /* allocate new parsed module */
145 st->lysp_mod = calloc(1, sizeof(*st->lysp_mod));
146 st->lysp_mod->mod = calloc(1, sizeof(*st->lysp_mod->mod));
147 st->lysp_mod->mod->ctx = st->ctx;
148
149 /* allocate parser context */
David Sedlákda8ffa32019-07-08 14:17:10 +0200150 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
Michal Vaskob36053d2020-03-26 15:49:30 +0100151 st->yin_ctx->format = LYS_IN_YIN;
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{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200159 struct test_parser_yin_state *st = *(struct test_parser_yin_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
Michal Vaskob36053d2020-03-26 15:49:30 +0100171 lyxml_ctx_free(st->yin_ctx->xmlctx);
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
Radek Krejci3a4889a2020-05-19 17:01:58 +0200180static struct test_parser_yin_state*
David Sedlák392af4f2019-06-04 16:02:42 +0200181reset_state(void **state)
182{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200183 ((struct test_parser_yin_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{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200214 struct test_parser_yin_state *st = *state;
David Sedlák8985a142019-07-31 16:43:06 +0200215
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);
Radek Krejci3a4889a2020-05-19 17:01:58 +0200230 struct test_parser_yin_state *st = *state;
David Sedlák8985a142019-07-31 16:43:06 +0200231
232 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
Michal Vaskob36053d2020-03-26 15:49:30 +0100233 st->yin_ctx->format = LYS_IN_YIN;
David Sedlák8985a142019-07-31 16:43:06 +0200234
235 return EXIT_SUCCESS;
236}
237
238static int
239teardown_element_test(void **state)
240{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200241 struct test_parser_yin_state *st = *(struct test_parser_yin_state **)state;
David Sedlák8985a142019-07-31 16:43:06 +0200242
Michal Vaskob36053d2020-03-26 15:49:30 +0100243 lyxml_ctx_free(st->yin_ctx->xmlctx);
David Sedlák8985a142019-07-31 16:43:06 +0200244 free(st->yin_ctx);
245
246 teardown_logger(state);
247
248 return EXIT_SUCCESS;
249}
250
David Sedlák68a1af12019-03-08 13:46:54 +0100251static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200252test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200253{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200254 struct test_parser_yin_state *st = *state;
David Sedlák3b4db242018-10-19 16:11:01 +0200255
Michal Vaskob36053d2020-03-26 15:49:30 +0100256 const char *prefix;
257 size_t prefix_len;
David Sedlák8f7a1172019-06-20 14:42:18 +0200258 /* create mock yin namespace in xml context */
259 const char *data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />";
Michal Vaskob36053d2020-03-26 15:49:30 +0100260 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
261 prefix = st->yin_ctx->xmlctx->prefix;
262 prefix_len = st->yin_ctx->xmlctx->prefix_len;
David Sedlák8f7a1172019-06-20 14:42:18 +0200263
Radek Krejcid6b76452019-09-03 17:03:03 +0200264 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydatax", strlen("anydatax"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
265 assert_int_equal(yin_match_keyword(st->yin_ctx, "asdasd", strlen("asdasd"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
266 assert_int_equal(yin_match_keyword(st->yin_ctx, "", 0, prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
267 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydata", strlen("anydata"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ANYDATA);
268 assert_int_equal(yin_match_keyword(st->yin_ctx, "anyxml", strlen("anyxml"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ANYXML);
269 assert_int_equal(yin_match_keyword(st->yin_ctx, "argument", strlen("argument"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ARGUMENT);
270 assert_int_equal(yin_match_keyword(st->yin_ctx, "augment", strlen("augment"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_AUGMENT);
271 assert_int_equal(yin_match_keyword(st->yin_ctx, "base", strlen("base"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BASE);
272 assert_int_equal(yin_match_keyword(st->yin_ctx, "belongs-to", strlen("belongs-to"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BELONGS_TO);
273 assert_int_equal(yin_match_keyword(st->yin_ctx, "bit", strlen("bit"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BIT);
274 assert_int_equal(yin_match_keyword(st->yin_ctx, "case", strlen("case"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CASE);
275 assert_int_equal(yin_match_keyword(st->yin_ctx, "choice", strlen("choice"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CHOICE);
276 assert_int_equal(yin_match_keyword(st->yin_ctx, "config", strlen("config"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONFIG);
277 assert_int_equal(yin_match_keyword(st->yin_ctx, "contact", strlen("contact"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONTACT);
278 assert_int_equal(yin_match_keyword(st->yin_ctx, "container", strlen("container"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONTAINER);
279 assert_int_equal(yin_match_keyword(st->yin_ctx, "default", strlen("default"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEFAULT);
280 assert_int_equal(yin_match_keyword(st->yin_ctx, "description", strlen("description"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DESCRIPTION);
281 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviate", strlen("deviate"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEVIATE);
282 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviation", strlen("deviation"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEVIATION);
283 assert_int_equal(yin_match_keyword(st->yin_ctx, "enum", strlen("enum"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ENUM);
284 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-app-tag", strlen("error-app-tag"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ERROR_APP_TAG);
285 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-message", strlen("error-message"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ERROR_MESSAGE);
286 assert_int_equal(yin_match_keyword(st->yin_ctx, "extension", strlen("extension"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_EXTENSION);
287 assert_int_equal(yin_match_keyword(st->yin_ctx, "feature", strlen("feature"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_FEATURE);
288 assert_int_equal(yin_match_keyword(st->yin_ctx, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_FRACTION_DIGITS);
289 assert_int_equal(yin_match_keyword(st->yin_ctx, "grouping", strlen("grouping"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_GROUPING);
290 assert_int_equal(yin_match_keyword(st->yin_ctx, "identity", strlen("identity"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IDENTITY);
291 assert_int_equal(yin_match_keyword(st->yin_ctx, "if-feature", strlen("if-feature"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IF_FEATURE);
292 assert_int_equal(yin_match_keyword(st->yin_ctx, "import", strlen("import"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IMPORT);
293 assert_int_equal(yin_match_keyword(st->yin_ctx, "include", strlen("include"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_INCLUDE);
294 assert_int_equal(yin_match_keyword(st->yin_ctx, "input", strlen("input"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_INPUT);
295 assert_int_equal(yin_match_keyword(st->yin_ctx, "key", strlen("key"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_KEY);
296 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf", strlen("leaf"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LEAF);
297 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf-list", strlen("leaf-list"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LEAF_LIST);
298 assert_int_equal(yin_match_keyword(st->yin_ctx, "length", strlen("length"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LENGTH);
299 assert_int_equal(yin_match_keyword(st->yin_ctx, "list", strlen("list"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LIST);
300 assert_int_equal(yin_match_keyword(st->yin_ctx, "mandatory", strlen("mandatory"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MANDATORY);
301 assert_int_equal(yin_match_keyword(st->yin_ctx, "max-elements", strlen("max-elements"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MAX_ELEMENTS);
302 assert_int_equal(yin_match_keyword(st->yin_ctx, "min-elements", strlen("min-elements"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MIN_ELEMENTS);
303 assert_int_equal(yin_match_keyword(st->yin_ctx, "modifier", strlen("modifier"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MODIFIER);
304 assert_int_equal(yin_match_keyword(st->yin_ctx, "module", strlen("module"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MODULE);
305 assert_int_equal(yin_match_keyword(st->yin_ctx, "must", strlen("must"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MUST);
306 assert_int_equal(yin_match_keyword(st->yin_ctx, "namespace", strlen("namespace"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NAMESPACE);
307 assert_int_equal(yin_match_keyword(st->yin_ctx, "notification", strlen("notification"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NOTIFICATION);
308 assert_int_equal(yin_match_keyword(st->yin_ctx, "ordered-by", strlen("ordered-by"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ORDERED_BY);
309 assert_int_equal(yin_match_keyword(st->yin_ctx, "organization", strlen("organization"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ORGANIZATION);
310 assert_int_equal(yin_match_keyword(st->yin_ctx, "output", strlen("output"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_OUTPUT);
311 assert_int_equal(yin_match_keyword(st->yin_ctx, "path", strlen("path"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PATH);
312 assert_int_equal(yin_match_keyword(st->yin_ctx, "pattern", strlen("pattern"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PATTERN);
313 assert_int_equal(yin_match_keyword(st->yin_ctx, "position", strlen("position"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_POSITION);
314 assert_int_equal(yin_match_keyword(st->yin_ctx, "prefix", strlen("prefix"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PREFIX);
315 assert_int_equal(yin_match_keyword(st->yin_ctx, "presence", strlen("presence"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PRESENCE);
316 assert_int_equal(yin_match_keyword(st->yin_ctx, "range", strlen("range"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_RANGE);
317 assert_int_equal(yin_match_keyword(st->yin_ctx, "reference", strlen("reference"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REFERENCE);
318 assert_int_equal(yin_match_keyword(st->yin_ctx, "refine", strlen("refine"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REFINE);
319 assert_int_equal(yin_match_keyword(st->yin_ctx, "require-instance", strlen("require-instance"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REQUIRE_INSTANCE);
320 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision", strlen("revision"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REVISION);
321 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision-date", strlen("revision-date"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REVISION_DATE);
322 assert_int_equal(yin_match_keyword(st->yin_ctx, "rpc", strlen("rpc"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_RPC);
323 assert_int_equal(yin_match_keyword(st->yin_ctx, "status", strlen("status"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_STATUS);
324 assert_int_equal(yin_match_keyword(st->yin_ctx, "submodule", strlen("submodule"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_SUBMODULE);
325 assert_int_equal(yin_match_keyword(st->yin_ctx, "type", strlen("type"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_TYPE);
326 assert_int_equal(yin_match_keyword(st->yin_ctx, "typedef", strlen("typedef"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_TYPEDEF);
327 assert_int_equal(yin_match_keyword(st->yin_ctx, "unique", strlen("unique"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_UNIQUE);
328 assert_int_equal(yin_match_keyword(st->yin_ctx, "units", strlen("units"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_UNITS);
329 assert_int_equal(yin_match_keyword(st->yin_ctx, "uses", strlen("uses"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_USES);
330 assert_int_equal(yin_match_keyword(st->yin_ctx, "value", strlen("value"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_VALUE);
331 assert_int_equal(yin_match_keyword(st->yin_ctx, "when", strlen("when"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_WHEN);
332 assert_int_equal(yin_match_keyword(st->yin_ctx, "yang-version", strlen("yang-version"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_YANG_VERSION);
333 assert_int_equal(yin_match_keyword(st->yin_ctx, "yin-element", strlen("yin-element"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_YIN_ELEMENT);
David Sedlák8f7a1172019-06-20 14:42:18 +0200334
335 st->finished_correctly = true;
David Sedlák872c7b42018-10-26 13:15:20 +0200336}
David Sedlák3b4db242018-10-19 16:11:01 +0200337
David Sedlák872c7b42018-10-26 13:15:20 +0200338static void
David Sedlák060b00e2019-06-19 11:12:06 +0200339test_yin_match_argument_name(void **state)
David Sedlák872c7b42018-10-26 13:15:20 +0200340{
David Sedlák68a1af12019-03-08 13:46:54 +0100341 (void)state; /* unused */
David Sedlák872c7b42018-10-26 13:15:20 +0200342
David Sedlák060b00e2019-06-19 11:12:06 +0200343 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
344 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
345 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
346 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
347 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
348 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
349 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
350 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
351 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
352 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
353 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
354 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200355}
356
David Sedlák68a1af12019-03-08 13:46:54 +0100357static void
David Sedlákb1a78352019-06-28 16:16:29 +0200358test_yin_parse_element_generic(void **state)
359{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200360 struct test_parser_yin_state *st = *state;
David Sedlákb1a78352019-06-28 16:16:29 +0200361 struct lysp_ext_instance exts;
David Sedlákb1a78352019-06-28 16:16:29 +0200362 LY_ERR ret;
363
364 memset(&exts, 0, sizeof(exts));
365
David Sedlákb0ca07d2019-09-11 11:54:05 +0200366 const char *data = "<myext:elem attr=\"value\" xmlns:myext=\"urn:example:extensions\">text_value</myext:elem>";
Michal Vaskob36053d2020-03-26 15:49:30 +0100367 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
368
369 ret = yin_parse_element_generic(st->yin_ctx, LY_STMT_EXTENSION_INSTANCE, &exts.child);
David Sedlákb1a78352019-06-28 16:16:29 +0200370 assert_int_equal(ret, LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +0100371 assert_int_equal(st->yin_ctx->xmlctx->status, LYXML_ELEM_CLOSE);
David Sedláke0ef1c62019-09-13 10:05:55 +0200372 assert_string_equal(exts.child->stmt, "urn:example:extensions:elem");
David Sedlákb1a78352019-06-28 16:16:29 +0200373 assert_string_equal(exts.child->arg, "text_value");
David Sedlákb1a78352019-06-28 16:16:29 +0200374 assert_string_equal(exts.child->child->stmt, "attr");
375 assert_string_equal(exts.child->child->arg, "value");
376 assert_true(exts.child->child->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200377 lysp_ext_instance_free(st->ctx, &exts);
David Sedlák5392a212019-07-01 09:19:10 +0200378 st = reset_state(state);
379
David Sedlákb0ca07d2019-09-11 11:54:05 +0200380 data = "<myext:elem xmlns:myext=\"urn:example:extensions\"></myext:elem>";
Michal Vaskob36053d2020-03-26 15:49:30 +0100381 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
382
383 ret = yin_parse_element_generic(st->yin_ctx, LY_STMT_EXTENSION_INSTANCE, &exts.child);
David Sedlák5392a212019-07-01 09:19:10 +0200384 assert_int_equal(ret, LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +0100385 assert_int_equal(st->yin_ctx->xmlctx->status, LYXML_ELEM_CLOSE);
David Sedláke0ef1c62019-09-13 10:05:55 +0200386 assert_string_equal(exts.child->stmt, "urn:example:extensions:elem");
David Sedlák5392a212019-07-01 09:19:10 +0200387 assert_null(exts.child->child);
388 assert_null(exts.child->arg);
389 lysp_ext_instance_free(st->ctx, &exts);
390
David Sedlákb1a78352019-06-28 16:16:29 +0200391 st->finished_correctly = true;
392}
393
394static void
395test_yin_parse_extension_instance(void **state)
396{
397 LY_ERR ret;
Radek Krejci3a4889a2020-05-19 17:01:58 +0200398 struct test_parser_yin_state *st = *state;
David Sedlákb1a78352019-06-28 16:16:29 +0200399 struct lysp_ext_instance *exts = NULL;
David Sedlákb0ca07d2019-09-11 11:54:05 +0200400 const char *data = "<myext:ext value1=\"test\" value=\"test2\" xmlns:myext=\"urn:example:extensions\"><myext:subelem>text</myext:subelem></myext:ext>";
Michal Vaskob36053d2020-03-26 15:49:30 +0100401 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
402
403 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200404 assert_int_equal(ret, LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200405 assert_string_equal(exts->name, "urn:example:extensions:ext");
David Sedlákb1a78352019-06-28 16:16:29 +0200406 assert_int_equal(exts->insubstmt_index, 0);
407 assert_true(exts->insubstmt == LYEXT_SUBSTMT_CONTACT);
408 assert_true(exts->yin & LYS_YIN);
409 assert_string_equal(exts->child->stmt, "value1");
410 assert_string_equal(exts->child->arg, "test");
411 assert_null(exts->child->child);
412 assert_true(exts->child->flags & LYS_YIN_ATTR);
413 assert_string_equal(exts->child->next->stmt, "value");
414 assert_string_equal(exts->child->next->arg, "test2");
415 assert_null(exts->child->next->child);
416 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
417
David Sedláke0ef1c62019-09-13 10:05:55 +0200418 assert_string_equal(exts->child->next->next->stmt, "urn:example:extensions:subelem");
David Sedlákb1a78352019-06-28 16:16:29 +0200419 assert_string_equal(exts->child->next->next->arg, "text");
420 assert_null(exts->child->next->next->child);
421 assert_null(exts->child->next->next->next);
422 assert_false(exts->child->next->next->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200423 lysp_ext_instance_free(st->ctx, exts);
424 LY_ARRAY_FREE(exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200425 exts = NULL;
David Sedlákf250ecf2019-07-01 11:02:05 +0200426 st = reset_state(state);
427
David Sedlákb0ca07d2019-09-11 11:54:05 +0200428 data = "<myext:extension-elem xmlns:myext=\"urn:example:extensions\" />";
Michal Vaskob36053d2020-03-26 15:49:30 +0100429 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
430
431 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200432 assert_int_equal(ret, LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200433 assert_string_equal(exts->name, "urn:example:extensions:extension-elem");
David Sedlákf250ecf2019-07-01 11:02:05 +0200434 assert_null(exts->argument);
435 assert_null(exts->child);
436 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
437 assert_int_equal(exts->insubstmt_index, 0);
438 assert_true(exts->yin & LYS_YIN);
David Sedlákf250ecf2019-07-01 11:02:05 +0200439 lysp_ext_instance_free(st->ctx, exts);
440 LY_ARRAY_FREE(exts);
David Sedlákadd0c2e2019-08-16 10:49:12 +0200441 exts = NULL;
David Sedlákadd0c2e2019-08-16 10:49:12 +0200442 st = reset_state(state);
443
David Sedlákb0ca07d2019-09-11 11:54:05 +0200444 data = "<myext:ext attr1=\"text1\" attr2=\"text2\" xmlns:myext=\"urn:example:extensions\">"
445 "<myext:ext-sub1/>"
446 "<myext:ext-sub2 sattr1=\"stext2\">"
447 "<myext:ext-sub21>"
448 "<myext:ext-sub211 sattr21=\"text21\"/>"
449 "</myext:ext-sub21>"
450 "</myext:ext-sub2>"
451 "<myext:ext-sub3 attr3=\"text3\"></myext:ext-sub3>"
452 "</myext:ext>";
Michal Vaskob36053d2020-03-26 15:49:30 +0100453 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
454
455 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákadd0c2e2019-08-16 10:49:12 +0200456 assert_int_equal(ret, LY_SUCCESS);
457
David Sedláke0ef1c62019-09-13 10:05:55 +0200458 assert_string_equal(exts->name, "urn:example:extensions:ext");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200459 assert_null(exts->argument);
460 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
461 assert_int_equal(exts->insubstmt_index, 0);
462 assert_true(exts->yin & LYS_YIN);
463 assert_string_equal(exts->child->stmt, "attr1");
464 assert_string_equal(exts->child->arg, "text1");
465 assert_null(exts->child->child);
466 assert_true(exts->child->flags & LYS_YIN_ATTR);
467
468 assert_string_equal(exts->child->next->stmt, "attr2");
469 assert_string_equal(exts->child->next->arg, "text2");
470 assert_null(exts->child->next->child);
471 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
472
David Sedláke0ef1c62019-09-13 10:05:55 +0200473 assert_string_equal(exts->child->next->next->stmt, "urn:example:extensions:ext-sub1");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200474 assert_null(exts->child->next->next->arg);
475 assert_null(exts->child->next->next->child);
476 assert_int_equal(exts->child->next->next->flags, 0);
477
David Sedláke0ef1c62019-09-13 10:05:55 +0200478 assert_string_equal(exts->child->next->next->next->stmt, "urn:example:extensions:ext-sub2");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200479 assert_null(exts->child->next->next->next->arg);
480 assert_int_equal(exts->child->next->next->next->flags, 0);
481 assert_string_equal(exts->child->next->next->next->child->stmt, "sattr1");
482 assert_string_equal(exts->child->next->next->next->child->arg, "stext2");
483 assert_null(exts->child->next->next->next->child->child);
484 assert_true(exts->child->next->next->next->child->flags & LYS_YIN_ATTR);
485
David Sedláke0ef1c62019-09-13 10:05:55 +0200486 assert_string_equal(exts->child->next->next->next->child->next->stmt, "urn:example:extensions:ext-sub21");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200487 assert_null(exts->child->next->next->next->child->next->arg);
488 assert_null(exts->child->next->next->next->child->next->next);
489 assert_int_equal(exts->child->next->next->next->child->next->flags, 0);
490
David Sedláke0ef1c62019-09-13 10:05:55 +0200491 assert_string_equal(exts->child->next->next->next->child->next->child->stmt, "urn:example:extensions:ext-sub211");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200492 assert_null(exts->child->next->next->next->child->next->child->arg);
493 assert_int_equal(exts->child->next->next->next->child->next->child->flags, 0);
494 assert_null(exts->child->next->next->next->child->next->child->next);
495
496 assert_string_equal(exts->child->next->next->next->child->next->child->child->stmt, "sattr21");
497 assert_string_equal(exts->child->next->next->next->child->next->child->child->arg, "text21");
498 assert_null(exts->child->next->next->next->child->next->child->child->next);
499 assert_null(exts->child->next->next->next->child->next->child->child->child);
500 assert_true(exts->child->next->next->next->child->next->child->child->flags & LYS_YIN_ATTR);
501
David Sedláke0ef1c62019-09-13 10:05:55 +0200502 assert_string_equal(exts->child->next->next->next->next->stmt, "urn:example:extensions:ext-sub3");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200503 assert_null(exts->child->next->next->next->next->arg);
504 assert_null(exts->child->next->next->next->next->next);
505 assert_int_equal(exts->child->next->next->next->next->flags, 0);
506
507 assert_string_equal(exts->child->next->next->next->next->child->stmt, "attr3");
508 assert_string_equal(exts->child->next->next->next->next->child->arg, "text3");
509 assert_null(exts->child->next->next->next->next->child->next);
510 assert_null(exts->child->next->next->next->next->child->child);
511 assert_true(exts->child->next->next->next->next->child->flags & LYS_YIN_ATTR);
512
David Sedlákadd0c2e2019-08-16 10:49:12 +0200513 lysp_ext_instance_free(st->ctx, exts);
514 LY_ARRAY_FREE(exts);
515 exts = NULL;
David Sedlákaa98bba2019-09-12 11:52:14 +0200516 st = reset_state(state);
517
518 data = "<myext:extension-elem xmlns:myext=\"urn:example:extensions\" xmlns:yin=\"urn:ietf:params:xml:ns:yang:yin:1\">"
519 "<yin:action name=\"act-name\" pre:prefixed=\"ignored\"/>"
520 "<yin:augment target-node=\"target\"/>"
521 "<yin:status value=\"value\"/>"
522 "<yin:include module=\"mod\"/>"
523 "<yin:input />"
524 "<yin:must condition=\"cond\"/>"
525 "<yin:namespace uri=\"uri\"/>"
526 "<yin:revision date=\"data\"/>"
527 "<yin:unique tag=\"tag\"/>"
David Sedlákd2844882019-09-13 16:01:22 +0200528 "<yin:description><yin:text>contact-val</yin:text></yin:description>"
529 "<yin:error-message><yin:value>err-msg</yin:value></yin:error-message>"
David Sedlákaa98bba2019-09-12 11:52:14 +0200530 "</myext:extension-elem>";
Michal Vaskob36053d2020-03-26 15:49:30 +0100531 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
532
533 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákaa98bba2019-09-12 11:52:14 +0200534 assert_int_equal(ret, LY_SUCCESS);
535 assert_string_equal(exts->child->arg, "act-name");
536 assert_string_equal(exts->child->next->arg, "target");
537 assert_string_equal(exts->child->next->next->arg, "value");
538 assert_string_equal(exts->child->next->next->next->arg, "mod");
539 assert_null(exts->child->next->next->next->next->arg);
540 assert_string_equal(exts->child->next->next->next->next->next->arg, "cond");
541 assert_string_equal(exts->child->next->next->next->next->next->next->arg, "uri");
542 assert_string_equal(exts->child->next->next->next->next->next->next->next->arg, "data");
543 assert_string_equal(exts->child->next->next->next->next->next->next->next->next->arg, "tag");
544 assert_string_equal(exts->child->next->next->next->next->next->next->next->next->next->arg, "contact-val");
David Sedlákaa98bba2019-09-12 11:52:14 +0200545 lysp_ext_instance_free(st->ctx, exts);
546 LY_ARRAY_FREE(exts);
547 exts = NULL;
David Sedlákaa98bba2019-09-12 11:52:14 +0200548 st = reset_state(state);
David Sedlákadd0c2e2019-08-16 10:49:12 +0200549
David Sedlákb1a78352019-06-28 16:16:29 +0200550 st->finished_correctly = true;
551}
552
David Sedlák555c7202019-07-04 12:14:12 +0200553static void
554test_yin_parse_content(void **state)
555{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200556 struct test_parser_yin_state *st = *state;
David Sedlák555c7202019-07-04 12:14:12 +0200557 LY_ERR ret = LY_SUCCESS;
David Sedlák555c7202019-07-04 12:14:12 +0200558 const char *data = "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákb0ca07d2019-09-11 11:54:05 +0200559 "<myext:custom xmlns:myext=\"urn:example:extensions\">"
David Sedlák555c7202019-07-04 12:14:12 +0200560 "totally amazing extension"
David Sedlákb0ca07d2019-09-11 11:54:05 +0200561 "</myext:custom>"
David Sedlákaa98bba2019-09-12 11:52:14 +0200562 "<extension name=\"ext\">"
David Sedlák986cb412019-07-04 13:10:11 +0200563 "<argument name=\"argname\"></argument>"
564 "<description><text>desc</text></description>"
565 "<reference><text>ref</text></reference>"
566 "<status value=\"deprecated\"></status>"
David Sedlákaa98bba2019-09-12 11:52:14 +0200567 "</extension>"
David Sedlák555c7202019-07-04 12:14:12 +0200568 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedlák32488102019-07-15 17:44:10 +0200569 "<if-feature name=\"foo\"></if-feature>"
David Sedlák32eee7b2019-07-09 12:38:44 +0200570 "<when condition=\"condition...\">"
571 "<reference><text>when_ref</text></reference>"
572 "<description><text>when_desc</text></description>"
573 "</when>"
David Sedláke1a30302019-07-10 13:49:38 +0200574 "<config value=\"true\"/>"
David Sedlákc1771b12019-07-10 15:55:46 +0200575 "<error-message>"
576 "<value>error-msg</value>"
577 "</error-message>"
David Sedlák2ce1be62019-07-10 16:15:09 +0200578 "<error-app-tag value=\"err-app-tag\"/>"
David Sedláka5b1d382019-07-10 16:31:09 +0200579 "<units name=\"radians\"></units>"
David Sedláke7084ce2019-07-10 16:44:15 +0200580 "<default value=\"default-value\"/>"
David Sedlák5545f5d2019-07-11 11:55:16 +0200581 "<position value=\"25\"></position>"
582 "<value value=\"-5\"/>"
David Sedlákcf5569a2019-07-11 13:31:34 +0200583 "<require-instance value=\"true\"></require-instance>"
David Sedlákb7296dd2019-07-11 14:58:38 +0200584 "<range value=\"5..10\" />"
David Sedlák438ae432019-07-11 15:36:54 +0200585 "<length value=\"baf\"/>"
David Sedlákd3983112019-07-12 11:20:56 +0200586 "<pattern value='pattern'>"
587 "<modifier value='invert-match'/>"
588 "</pattern>"
David Sedlákfd5b9c32019-07-12 15:33:13 +0200589 "<enum name=\"yay\">"
590 "</enum>"
David Sedlák555c7202019-07-04 12:14:12 +0200591 "</prefix>";
592 struct lysp_ext_instance *exts = NULL;
David Sedlák5f8191e2019-07-08 16:35:52 +0200593 const char **if_features = NULL;
David Sedláke7084ce2019-07-10 16:44:15 +0200594 const char *value, *err_msg, *app_tag, *units, *def;
David Sedlák986cb412019-07-04 13:10:11 +0200595 struct lysp_ext *ext_def = NULL;
David Sedlák32eee7b2019-07-09 12:38:44 +0200596 struct lysp_when *when_p = NULL;
David Sedlákcf5569a2019-07-11 13:31:34 +0200597 struct lysp_type_enum pos_enum = {}, val_enum = {};
David Sedlákfd5b9c32019-07-12 15:33:13 +0200598 struct lysp_type req_type = {}, range_type = {}, len_type = {}, patter_type = {}, enum_type = {};
David Sedláke1a30302019-07-10 13:49:38 +0200599 uint8_t config = 0;
David Sedlák555c7202019-07-04 12:14:12 +0200600
Michal Vaskob36053d2020-03-26 15:49:30 +0100601 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
602 lyxml_ctx_next(st->yin_ctx->xmlctx);
603 lyxml_ctx_next(st->yin_ctx->xmlctx);
604 lyxml_ctx_next(st->yin_ctx->xmlctx);
David Sedlák555c7202019-07-04 12:14:12 +0200605
David Sedlákfd5b9c32019-07-12 15:33:13 +0200606 struct yin_subelement subelems[17] = {
Radek Krejcid6b76452019-09-03 17:03:03 +0200607 {LY_STMT_CONFIG, &config, 0},
608 {LY_STMT_DEFAULT, &def, YIN_SUBELEM_UNIQUE},
609 {LY_STMT_ENUM, &enum_type, 0},
610 {LY_STMT_ERROR_APP_TAG, &app_tag, YIN_SUBELEM_UNIQUE},
611 {LY_STMT_ERROR_MESSAGE, &err_msg, 0},
612 {LY_STMT_EXTENSION, &ext_def, 0},
613 {LY_STMT_IF_FEATURE, &if_features, 0},
614 {LY_STMT_LENGTH, &len_type, 0},
615 {LY_STMT_PATTERN, &patter_type, 0},
616 {LY_STMT_POSITION, &pos_enum, 0},
617 {LY_STMT_RANGE, &range_type, 0},
618 {LY_STMT_REQUIRE_INSTANCE, &req_type, 0},
619 {LY_STMT_UNITS, &units, YIN_SUBELEM_UNIQUE},
620 {LY_STMT_VALUE, &val_enum, 0},
621 {LY_STMT_WHEN, &when_p, 0},
622 {LY_STMT_EXTENSION_INSTANCE, NULL, 0},
623 {LY_STMT_ARG_TEXT, &value, 0}
David Sedlákd3983112019-07-12 11:20:56 +0200624 };
Michal Vaskob36053d2020-03-26 15:49:30 +0100625 ret = yin_parse_content(st->yin_ctx, subelems, 17, LY_STMT_PREFIX, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200626 assert_int_equal(ret, LY_SUCCESS);
David Sedlák2ce1be62019-07-10 16:15:09 +0200627 /* check parsed values */
David Sedláke7084ce2019-07-10 16:44:15 +0200628 assert_string_equal(def, "default-value");
David Sedláke0ef1c62019-09-13 10:05:55 +0200629 assert_string_equal(exts->name, "urn:example:extensions:custom");
David Sedlák555c7202019-07-04 12:14:12 +0200630 assert_string_equal(exts->argument, "totally amazing extension");
631 assert_string_equal(value, "wsefsdf");
David Sedláka5b1d382019-07-10 16:31:09 +0200632 assert_string_equal(units, "radians");
David Sedlák32eee7b2019-07-09 12:38:44 +0200633 assert_string_equal(when_p->cond, "condition...");
634 assert_string_equal(when_p->dsc, "when_desc");
635 assert_string_equal(when_p->ref, "when_ref");
David Sedláke1a30302019-07-10 13:49:38 +0200636 assert_int_equal(config, LYS_CONFIG_W);
David Sedlák5545f5d2019-07-11 11:55:16 +0200637 assert_int_equal(pos_enum.value, 25);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200638 assert_true(pos_enum.flags & LYS_SET_VALUE);
David Sedlák5545f5d2019-07-11 11:55:16 +0200639 assert_int_equal(val_enum.value, -5);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200640 assert_true(val_enum.flags & LYS_SET_VALUE);
David Sedlákcf5569a2019-07-11 13:31:34 +0200641 assert_int_equal(req_type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200642 assert_true(req_type.flags &= LYS_SET_REQINST);
David Sedlákb7296dd2019-07-11 14:58:38 +0200643 assert_string_equal(range_type.range->arg, "5..10");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200644 assert_true(range_type.flags & LYS_SET_RANGE);
David Sedlákc1771b12019-07-10 15:55:46 +0200645 assert_string_equal(err_msg, "error-msg");
David Sedlák2ce1be62019-07-10 16:15:09 +0200646 assert_string_equal(app_tag, "err-app-tag");
David Sedlákfd5b9c32019-07-12 15:33:13 +0200647 assert_string_equal(enum_type.enums->name, "yay");
David Sedlák438ae432019-07-11 15:36:54 +0200648 assert_string_equal(len_type.length->arg, "baf");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200649 assert_true(len_type.flags & LYS_SET_LENGTH);
David Sedlákd3983112019-07-12 11:20:56 +0200650 assert_string_equal(patter_type.patterns->arg, "\x015pattern");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200651 assert_true(patter_type.flags & LYS_SET_PATTERN);
David Sedlák2ce1be62019-07-10 16:15:09 +0200652 /* cleanup */
David Sedlák555c7202019-07-04 12:14:12 +0200653 lysp_ext_instance_free(st->ctx, exts);
David Sedlák32eee7b2019-07-09 12:38:44 +0200654 lysp_when_free(st->ctx, when_p);
David Sedlák986cb412019-07-04 13:10:11 +0200655 lysp_ext_free(st->ctx, ext_def);
David Sedlák5f8191e2019-07-08 16:35:52 +0200656 FREE_STRING(st->ctx, *if_features);
David Sedlákc1771b12019-07-10 15:55:46 +0200657 FREE_STRING(st->ctx, err_msg);
David Sedlák2ce1be62019-07-10 16:15:09 +0200658 FREE_STRING(st->ctx, app_tag);
David Sedláka5b1d382019-07-10 16:31:09 +0200659 FREE_STRING(st->ctx, units);
David Sedlákd3983112019-07-12 11:20:56 +0200660 FREE_STRING(st->ctx, patter_type.patterns->arg);
David Sedláke7084ce2019-07-10 16:44:15 +0200661 FREE_STRING(st->ctx, def);
David Sedlákb7296dd2019-07-11 14:58:38 +0200662 FREE_STRING(st->ctx, range_type.range->arg);
David Sedlák438ae432019-07-11 15:36:54 +0200663 FREE_STRING(st->ctx, len_type.length->arg);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200664 FREE_STRING(st->ctx, enum_type.enums->name);
David Sedlákb7296dd2019-07-11 14:58:38 +0200665 FREE_STRING(st->ctx, value);
David Sedlák5f8191e2019-07-08 16:35:52 +0200666 LY_ARRAY_FREE(if_features);
David Sedlák555c7202019-07-04 12:14:12 +0200667 LY_ARRAY_FREE(exts);
David Sedlák986cb412019-07-04 13:10:11 +0200668 LY_ARRAY_FREE(ext_def);
David Sedlákd3983112019-07-12 11:20:56 +0200669 LY_ARRAY_FREE(patter_type.patterns);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200670 LY_ARRAY_FREE(enum_type.enums);
David Sedlák32eee7b2019-07-09 12:38:44 +0200671 free(when_p);
David Sedlákb7296dd2019-07-11 14:58:38 +0200672 free(range_type.range);
David Sedlák438ae432019-07-11 15:36:54 +0200673 free(len_type.length);
David Sedlák555c7202019-07-04 12:14:12 +0200674 st = reset_state(state);
675
676 /* test unique subelem */
677 const char *prefix_value;
Radek Krejcid6b76452019-09-03 17:03:03 +0200678 struct yin_subelement subelems2[2] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_UNIQUE},
679 {LY_STMT_ARG_TEXT, &value, YIN_SUBELEM_UNIQUE}};
David Sedláke6cd89e2019-08-07 12:46:02 +0200680 data = ELEMENT_WRAPPER_START
David Sedlák555c7202019-07-04 12:14:12 +0200681 "<prefix value=\"inv_mod\" />"
682 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
683 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedláke6cd89e2019-08-07 12:46:02 +0200684 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100685 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
686 lyxml_ctx_next(st->yin_ctx->xmlctx);
687
688 ret = yin_parse_content(st->yin_ctx, subelems2, 2, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200689 assert_int_equal(ret, LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200690 logbuf_assert("Redefinition of \"text\" sub-element in \"status\" element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200691 lydict_remove(st->ctx, prefix_value);
692 lydict_remove(st->ctx, value);
693 st = reset_state(state);
David Sedlák555c7202019-07-04 12:14:12 +0200694
695 /* test first subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200696 data = ELEMENT_WRAPPER_START
David Sedlák555c7202019-07-04 12:14:12 +0200697 "<prefix value=\"inv_mod\" />"
698 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
699 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedláke6cd89e2019-08-07 12:46:02 +0200700 ELEMENT_WRAPPER_END;
Radek Krejcid6b76452019-09-03 17:03:03 +0200701 struct yin_subelement subelems3[2] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_UNIQUE},
702 {LY_STMT_ARG_TEXT, &value, YIN_SUBELEM_FIRST}};
Michal Vaskob36053d2020-03-26 15:49:30 +0100703 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
704 lyxml_ctx_next(st->yin_ctx->xmlctx);
705
706 ret = yin_parse_content(st->yin_ctx, subelems3, 2, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200707 assert_int_equal(ret, LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200708 logbuf_assert("Sub-element \"text\" of \"status\" element must be defined as it's first sub-element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200709 lydict_remove(st->ctx, prefix_value);
710 st = reset_state(state);
David Sedlák555c7202019-07-04 12:14:12 +0200711
712 /* test mandatory subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200713 data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
Radek Krejcid6b76452019-09-03 17:03:03 +0200714 struct yin_subelement subelems4[1] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY | YIN_SUBELEM_UNIQUE}};
Michal Vaskob36053d2020-03-26 15:49:30 +0100715 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
716 lyxml_ctx_next(st->yin_ctx->xmlctx);
717
718 ret = yin_parse_content(st->yin_ctx, subelems4, 1, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200719 assert_int_equal(ret, LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200720 logbuf_assert("Missing mandatory sub-element \"prefix\" of \"status\" element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200721
722 st->finished_correctly = true;
723}
724
David Sedlák92147b02019-07-09 14:01:01 +0200725static void
David Sedlák4a650532019-07-10 11:55:18 +0200726test_validate_value(void **state)
727{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200728 struct test_parser_yin_state *st = *state;
Michal Vaskob36053d2020-03-26 15:49:30 +0100729 const char *data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
730
731 /* create some XML context */
732 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
733 st->yin_ctx->xmlctx->status = LYXML_ELEM_CONTENT;
734 st->yin_ctx->xmlctx->dynamic = 0;
735
736 st->yin_ctx->xmlctx->value = "#invalid";
737 st->yin_ctx->xmlctx->value_len = 8;
738 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG), LY_EVALID);
David Sedlák4a650532019-07-10 11:55:18 +0200739 logbuf_assert("Invalid identifier character '#'. Line number 1.");
Michal Vaskob36053d2020-03-26 15:49:30 +0100740
741 st->yin_ctx->xmlctx->value = "";
742 st->yin_ctx->xmlctx->value_len = 0;
743 assert_int_equal(yin_validate_value(st->yin_ctx, Y_STR_ARG), LY_SUCCESS);
744
745 st->yin_ctx->xmlctx->value = "pre:b";
746 st->yin_ctx->xmlctx->value_len = 5;
747 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG), LY_EVALID);
748 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG), LY_SUCCESS);
749
750 st->yin_ctx->xmlctx->value = "pre:pre:b";
751 st->yin_ctx->xmlctx->value_len = 9;
752 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG), LY_EVALID);
David Sedlák4a650532019-07-10 11:55:18 +0200753
754 st->finished_correctly = true;
755}
756
David Sedlák32488102019-07-15 17:44:10 +0200757/* helper function to simplify unit test of each element using parse_content function */
758LY_ERR
Radek Krejci3a4889a2020-05-19 17:01:58 +0200759test_element_helper(struct test_parser_yin_state *st, const char *data, void *dest, const char **text, struct lysp_ext_instance **exts)
David Sedlák32488102019-07-15 17:44:10 +0200760{
David Sedlákc5b20842019-08-13 10:18:31 +0200761 const char *name, *prefix;
762 size_t name_len, prefix_len;
David Sedlák32488102019-07-15 17:44:10 +0200763 LY_ERR ret = LY_SUCCESS;
764 struct yin_subelement subelems[71] = {
Radek Krejcid6b76452019-09-03 17:03:03 +0200765 {LY_STMT_ACTION, dest, 0},
766 {LY_STMT_ANYDATA, dest, 0},
767 {LY_STMT_ANYXML, dest, 0},
768 {LY_STMT_ARGUMENT,dest, 0},
769 {LY_STMT_AUGMENT, dest, 0},
770 {LY_STMT_BASE, dest, 0},
771 {LY_STMT_BELONGS_TO, dest, 0},
772 {LY_STMT_BIT, dest, 0},
773 {LY_STMT_CASE, dest, 0},
774 {LY_STMT_CHOICE, dest, 0},
775 {LY_STMT_CONFIG, dest, 0},
776 {LY_STMT_CONTACT, dest, 0},
777 {LY_STMT_CONTAINER, dest, 0},
778 {LY_STMT_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
779 {LY_STMT_DESCRIPTION, dest, 0},
780 {LY_STMT_DEVIATE, dest, 0},
781 {LY_STMT_DEVIATION, dest, 0},
782 {LY_STMT_ENUM, dest, 0},
783 {LY_STMT_ERROR_APP_TAG, dest, YIN_SUBELEM_UNIQUE},
784 {LY_STMT_ERROR_MESSAGE, dest, 0},
785 {LY_STMT_EXTENSION, dest, 0},
786 {LY_STMT_FEATURE, dest, 0},
787 {LY_STMT_FRACTION_DIGITS, dest, 0},
788 {LY_STMT_GROUPING, dest, 0},
789 {LY_STMT_IDENTITY, dest, 0},
790 {LY_STMT_IF_FEATURE, dest, 0},
791 {LY_STMT_IMPORT, dest, 0},
792 {LY_STMT_INCLUDE, dest, 0},
793 {LY_STMT_INPUT, dest, 0},
794 {LY_STMT_KEY, dest, YIN_SUBELEM_UNIQUE},
795 {LY_STMT_LEAF, dest, 0},
796 {LY_STMT_LEAF_LIST, dest, 0},
797 {LY_STMT_LENGTH, dest, 0},
798 {LY_STMT_LIST, dest, 0},
799 {LY_STMT_MANDATORY, dest, 0},
800 {LY_STMT_MAX_ELEMENTS, dest, 0},
801 {LY_STMT_MIN_ELEMENTS, dest, 0},
802 {LY_STMT_MODIFIER, dest, 0},
803 {LY_STMT_MODULE, dest, 0},
804 {LY_STMT_MUST, dest, 0},
805 {LY_STMT_NAMESPACE, dest, YIN_SUBELEM_UNIQUE},
806 {LY_STMT_NOTIFICATION, dest, 0},
807 {LY_STMT_ORDERED_BY, dest, 0},
808 {LY_STMT_ORGANIZATION, dest, 0},
809 {LY_STMT_OUTPUT, dest, 0},
810 {LY_STMT_PATH, dest, 0},
811 {LY_STMT_PATTERN, dest, 0},
812 {LY_STMT_POSITION, dest, 0},
813 {LY_STMT_PREFIX, dest, YIN_SUBELEM_UNIQUE},
814 {LY_STMT_PRESENCE, dest, YIN_SUBELEM_UNIQUE},
815 {LY_STMT_RANGE, dest, 0},
816 {LY_STMT_REFERENCE, dest, 0},
817 {LY_STMT_REFINE, dest, 0},
818 {LY_STMT_REQUIRE_INSTANCE, dest, 0},
819 {LY_STMT_REVISION, dest, 0},
820 {LY_STMT_REVISION_DATE, dest, 0},
821 {LY_STMT_RPC, dest, 0},
822 {LY_STMT_STATUS, dest, 0},
823 {LY_STMT_SUBMODULE, dest, 0},
824 {LY_STMT_TYPE, dest, 0},
825 {LY_STMT_TYPEDEF, dest, 0},
826 {LY_STMT_UNIQUE, dest, 0},
827 {LY_STMT_UNITS, dest, YIN_SUBELEM_UNIQUE},
828 {LY_STMT_USES, dest, 0},
829 {LY_STMT_VALUE, dest, 0},
830 {LY_STMT_WHEN, dest, 0},
831 {LY_STMT_YANG_VERSION, dest, 0},
832 {LY_STMT_YIN_ELEMENT, dest, 0},
833 {LY_STMT_EXTENSION_INSTANCE, dest, 0},
834 {LY_STMT_ARG_TEXT, dest, 0},
835 {LY_STMT_ARG_VALUE, dest, 0}
David Sedlák32488102019-07-15 17:44:10 +0200836 };
Michal Vaskob36053d2020-03-26 15:49:30 +0100837 lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx);
838 prefix = st->yin_ctx->xmlctx->prefix;
839 prefix_len = st->yin_ctx->xmlctx->prefix_len;
840 name = st->yin_ctx->xmlctx->name;
841 name_len = st->yin_ctx->xmlctx->name_len;
842 lyxml_ctx_next(st->yin_ctx->xmlctx);
843
844 ret = yin_parse_content(st->yin_ctx, subelems, 71, yin_match_keyword(st->yin_ctx, name, name_len, prefix, prefix_len, LY_STMT_NONE), text, exts);
845
846 /* free parser */
847 lyxml_ctx_free(st->yin_ctx->xmlctx);
848 st->yin_ctx->xmlctx = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200849 return ret;
850}
851
David Sedlákd1144562019-08-06 12:36:14 +0200852#define EXT_SUBELEM "<myext:c-define name=\"MY_MTU\" xmlns:myext=\"urn:example:extensions\"/>"
853
David Sedlák32488102019-07-15 17:44:10 +0200854static void
David Sedlák43801c92019-08-05 15:58:54 +0200855test_enum_elem(void **state)
David Sedlák32488102019-07-15 17:44:10 +0200856{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200857 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200858 struct lysp_type type = {};
859 const char *data;
860 data = ELEMENT_WRAPPER_START
861 "<enum name=\"enum-name\">"
862 "<if-feature name=\"feature\" />"
863 "<value value=\"55\" />"
864 "<status value=\"deprecated\" />"
865 "<description><text>desc...</text></description>"
866 "<reference><text>ref...</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +0200867 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +0200868 "</enum>"
869 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100870 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200871 assert_string_equal(type.enums->name, "enum-name");
David Sedlák32488102019-07-15 17:44:10 +0200872 assert_string_equal(*type.enums->iffeatures, "feature");
873 assert_int_equal(type.enums->value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200874 assert_true((type.enums->flags & LYS_STATUS_DEPRC) && (type.enums->flags & LYS_SET_VALUE));
David Sedlák32488102019-07-15 17:44:10 +0200875 assert_string_equal(type.enums->dsc, "desc...");
876 assert_string_equal(type.enums->ref, "ref...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200877 assert_string_equal(type.enums->exts->name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200878 assert_int_equal(type.enums->exts->insubstmt_index, 0);
879 assert_int_equal(type.enums->exts->insubstmt, LYEXT_SUBSTMT_SELF);
880 lysp_type_free(st->ctx, &type);
881 memset(&type, 0, sizeof type);
882
883 data = ELEMENT_WRAPPER_START
884 "<enum name=\"enum-name\"></enum>"
885 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100886 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200887 assert_string_equal(type.enums->name, "enum-name");
David Sedlák32488102019-07-15 17:44:10 +0200888 lysp_type_free(st->ctx, &type);
889 memset(&type, 0, sizeof type);
890
David Sedlák43801c92019-08-05 15:58:54 +0200891 st->finished_correctly = true;
892}
893
894static void
895test_bit_elem(void **state)
896{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200897 struct test_parser_yin_state *st = *state;
David Sedlák43801c92019-08-05 15:58:54 +0200898 struct lysp_type type = {};
899 const char *data;
900 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200901 "<bit name=\"bit-name\">"
David Sedlák43801c92019-08-05 15:58:54 +0200902 "<if-feature name=\"feature\" />"
903 "<position value=\"55\" />"
904 "<status value=\"deprecated\" />"
905 "<description><text>desc...</text></description>"
906 "<reference><text>ref...</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +0200907 EXT_SUBELEM
David Sedlák43801c92019-08-05 15:58:54 +0200908 "</bit>"
909 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100910 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200911 assert_string_equal(type.bits->name, "bit-name");
David Sedlák43801c92019-08-05 15:58:54 +0200912 assert_string_equal(*type.bits->iffeatures, "feature");
913 assert_int_equal(type.bits->value, 55);
914 assert_true((type.bits->flags & LYS_STATUS_DEPRC) && (type.bits->flags & LYS_SET_VALUE));
915 assert_string_equal(type.bits->dsc, "desc...");
916 assert_string_equal(type.bits->ref, "ref...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200917 assert_string_equal(type.bits->exts->name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200918 assert_int_equal(type.bits->exts->insubstmt_index, 0);
919 assert_int_equal(type.bits->exts->insubstmt, LYEXT_SUBSTMT_SELF);
920 lysp_type_free(st->ctx, &type);
921 memset(&type, 0, sizeof type);
922
923 data = ELEMENT_WRAPPER_START
924 "<bit name=\"bit-name\"> </bit>"
925 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100926 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200927 assert_string_equal(type.bits->name, "bit-name");
David Sedlák43801c92019-08-05 15:58:54 +0200928 lysp_type_free(st->ctx, &type);
929 memset(&type, 0, sizeof type);
930
David Sedlák32488102019-07-15 17:44:10 +0200931 st->finished_correctly = true;
932}
933
934static void
935test_meta_elem(void **state)
936{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200937 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200938 char *value = NULL;
939 const char *data;
David Sedlákd1144562019-08-06 12:36:14 +0200940 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200941
942 /* organization element */
943 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200944 "<organization><text>organization...</text>" EXT_SUBELEM EXT_SUBELEM "</organization>"
David Sedlák32488102019-07-15 17:44:10 +0200945 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100946 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200947 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200948 assert_int_equal(exts[0].insubstmt_index, 0);
949 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORGANIZATION);
David Sedláke0ef1c62019-09-13 10:05:55 +0200950 assert_string_equal(exts[1].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200951 assert_int_equal(exts[1].insubstmt_index, 0);
952 assert_int_equal(exts[1].insubstmt, LYEXT_SUBSTMT_ORGANIZATION);
David Sedlák32488102019-07-15 17:44:10 +0200953 assert_string_equal(value, "organization...");
954 FREE_STRING(st->ctx, value);
David Sedlákd1144562019-08-06 12:36:14 +0200955 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +0200956 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200957 exts = NULL;
958
David Sedlák32488102019-07-15 17:44:10 +0200959 /* contact element */
960 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200961 "<contact><text>contact...</text>" EXT_SUBELEM "</contact>"
David Sedlák32488102019-07-15 17:44:10 +0200962 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100963 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200964 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200965 assert_int_equal(exts[0].insubstmt_index, 0);
966 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONTACT);
David Sedlák32488102019-07-15 17:44:10 +0200967 assert_string_equal(value, "contact...");
968 FREE_STRING(st->ctx, value);
David Sedlákd1144562019-08-06 12:36:14 +0200969 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
970 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200971 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200972
David Sedlák32488102019-07-15 17:44:10 +0200973 /* description element */
974 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200975 "<description><text>description...</text>" EXT_SUBELEM "</description>"
David Sedlák32488102019-07-15 17:44:10 +0200976 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100977 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +0200978 assert_string_equal(value, "description...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200979 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200980 assert_int_equal(exts[0].insubstmt_index, 0);
981 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DESCRIPTION);
David Sedlák32488102019-07-15 17:44:10 +0200982 FREE_STRING(st->ctx, value);
983 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200984 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
985 exts = NULL;
986
David Sedlák32488102019-07-15 17:44:10 +0200987 /* reference element */
988 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200989 "<reference><text>reference...</text>" EXT_SUBELEM "</reference>"
David Sedlák32488102019-07-15 17:44:10 +0200990 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100991 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +0200992 assert_string_equal(value, "reference...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200993 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200994 assert_int_equal(exts[0].insubstmt_index, 0);
995 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_REFERENCE);
David Sedlák32488102019-07-15 17:44:10 +0200996 FREE_STRING(st->ctx, value);
997 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200998 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
999 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001000
David Sedlákdf2a9732019-08-07 13:23:16 +02001001 /* reference element */
1002 data = ELEMENT_WRAPPER_START
1003 "<reference invalid=\"text\"><text>reference...</text>""</reference>"
1004 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001005 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001006 logbuf_assert("Unexpected attribute \"invalid\" of \"reference\" element. Line number 1.");
David Sedlákdf2a9732019-08-07 13:23:16 +02001007 FREE_STRING(st->ctx, value);
1008 value = NULL;
1009 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1010 exts = NULL;
1011
David Sedlák32488102019-07-15 17:44:10 +02001012 /* missing text subelement */
1013 data = ELEMENT_WRAPPER_START
1014 "<reference>reference...</reference>"
1015 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001016 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001017 logbuf_assert("Missing mandatory sub-element \"text\" of \"reference\" element. Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001018
David Sedlákd1144562019-08-06 12:36:14 +02001019 /* reference element */
1020 data = ELEMENT_WRAPPER_START
1021 "<reference>" EXT_SUBELEM "<text>reference...</text></reference>"
1022 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001023 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001024 logbuf_assert("Sub-element \"text\" of \"reference\" element must be defined as it's first sub-element. Line number 1.");
David Sedlákd1144562019-08-06 12:36:14 +02001025 FREE_STRING(st->ctx, value);
1026 value = NULL;
1027 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1028 exts = NULL;
1029
David Sedlák32488102019-07-15 17:44:10 +02001030 st->finished_correctly = true;
1031}
1032
1033static void
1034test_import_elem(void **state)
1035{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001036 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001037 const char *data;
David Sedlák298ff6d2019-07-26 14:29:03 +02001038 struct lysp_import *imports = NULL;
1039 struct import_meta imp_meta = {"prefix", &imports};
David Sedlák32488102019-07-15 17:44:10 +02001040
1041 /* max subelems */
1042 data = ELEMENT_WRAPPER_START
1043 "<import module=\"a\">"
David Sedlákd1144562019-08-06 12:36:14 +02001044 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +02001045 "<prefix value=\"a_mod\"/>"
1046 "<revision-date date=\"2015-01-01\"></revision-date>"
1047 "<description><text>import description</text></description>"
1048 "<reference><text>import reference</text></reference>"
1049 "</import>"
1050 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001051 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02001052 assert_string_equal(imports->name, "a");
1053 assert_string_equal(imports->prefix, "a_mod");
1054 assert_string_equal(imports->rev, "2015-01-01");
1055 assert_string_equal(imports->dsc, "import description");
1056 assert_string_equal(imports->ref, "import reference");
David Sedláke0ef1c62019-09-13 10:05:55 +02001057 assert_string_equal(imports->exts->name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001058 assert_int_equal(imports->exts->insubstmt, LYEXT_SUBSTMT_SELF);
1059 assert_int_equal(imports->exts->insubstmt_index, 0);
David Sedlák298ff6d2019-07-26 14:29:03 +02001060 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1061 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001062
1063 /* min subelems */
David Sedlák32488102019-07-15 17:44:10 +02001064 data = ELEMENT_WRAPPER_START
1065 "<import module=\"a\">"
1066 "<prefix value=\"a_mod\"/>"
1067 "</import>"
1068 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001069 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02001070 assert_string_equal(imports->prefix, "a_mod");
1071 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1072 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001073
1074 /* invalid (missing prefix) */
David Sedlák298ff6d2019-07-26 14:29:03 +02001075 data = ELEMENT_WRAPPER_START "<import module=\"a\"></import>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001076 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001077 logbuf_assert("Missing mandatory sub-element \"prefix\" of \"import\" element. Line number 1.");
David Sedlák298ff6d2019-07-26 14:29:03 +02001078 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1079 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001080
1081 /* invalid reused prefix */
David Sedlák32488102019-07-15 17:44:10 +02001082 data = ELEMENT_WRAPPER_START
1083 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +02001084 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +02001085 "</import>"
1086 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +02001087 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +02001088 "</import>"
1089 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001090 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_EVALID);
David Sedlák298ff6d2019-07-26 14:29:03 +02001091 logbuf_assert("Prefix \"prefix\" already used as module prefix. Line number 1.");
1092 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1093 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001094
1095 st->finished_correctly = true;
1096}
1097
1098static void
1099test_status_elem(void **state)
1100{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001101 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001102 const char *data;
1103 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001104 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001105
1106 /* test valid values */
1107 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001108 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001109 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +02001110
1111 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001112 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001113 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +02001114
David Sedlákd1144562019-08-06 12:36:14 +02001115 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\">"EXT_SUBELEM"</status>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001116 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001117 assert_true(flags & LYS_STATUS_OBSLT);
David Sedláke0ef1c62019-09-13 10:05:55 +02001118 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001119 assert_int_equal(exts[0].insubstmt_index, 0);
1120 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_STATUS);
1121 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1122 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001123
1124 /* test invalid value */
1125 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001126 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001127 logbuf_assert("Invalid value \"invalid\" of \"value\" attribute in \"status\" element. Valid values are \"current\", \"deprecated\" and \"obsolete\". Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001128 st->finished_correctly = true;
1129}
1130
1131static void
1132test_ext_elem(void **state)
1133{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001134 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001135 const char *data;
1136 struct lysp_ext *ext = NULL;
1137
1138 /* max subelems */
1139 data = ELEMENT_WRAPPER_START
1140 "<extension name=\"ext_name\">"
1141 "<argument name=\"arg\"></argument>"
1142 "<status value=\"current\"/>"
1143 "<description><text>ext_desc</text></description>"
1144 "<reference><text>ext_ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001145 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +02001146 "</extension>"
1147 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001148 assert_int_equal(test_element_helper(st, data, &ext, NULL, NULL), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001149 assert_string_equal(ext->name, "ext_name");
1150 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001151 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +02001152 assert_string_equal(ext->dsc, "ext_desc");
1153 assert_string_equal(ext->ref, "ext_ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001154 assert_string_equal(ext->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001155 assert_int_equal(ext->exts[0].insubstmt_index, 0);
1156 assert_int_equal(ext->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák32488102019-07-15 17:44:10 +02001157 lysp_ext_free(st->ctx, ext);
1158 LY_ARRAY_FREE(ext);
1159 ext = NULL;
1160
1161 /* min subelems */
1162 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001163 assert_int_equal(test_element_helper(st, data, &ext, NULL, NULL), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001164 assert_string_equal(ext->name, "ext_name");
1165 lysp_ext_free(st->ctx, ext);
1166 LY_ARRAY_FREE(ext);
1167 ext = NULL;
1168
1169 st->finished_correctly = true;
1170}
1171
1172static void
1173test_yin_element_elem(void **state)
1174{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001175 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001176 const char *data;
1177 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001178 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001179
1180 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001181 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001182 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +02001183
David Sedlákd1144562019-08-06 12:36:14 +02001184 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\">" EXT_SUBELEM "</yin-element>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001185 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001186 assert_true(flags & LYS_YINELEM_TRUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001187 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001188 assert_int_equal(exts[0].insubstmt_index, 0);
1189 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_YINELEM);
1190 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001191
1192 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001193 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001194 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák26ea1432019-08-14 13:42:23 +02001195 logbuf_assert("Invalid value \"invalid\" of \"value\" attribute in \"yin-element\" element. Valid values are \"true\" and \"false\". Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001196 st->finished_correctly = true;
1197}
1198
1199static void
1200test_yangversion_elem(void **state)
1201{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001202 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001203 const char *data;
1204 uint8_t version = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001205 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001206
1207 /* valid values */
1208 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.0\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001209 assert_int_equal(test_element_helper(st, data, &version, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001210 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001211 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_0);
1212
David Sedlákd1144562019-08-06 12:36:14 +02001213 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\">" EXT_SUBELEM "</yang-version>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001214 assert_int_equal(test_element_helper(st, data, &version, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001215 assert_true(version & LYS_VERSION_1_1);
David Sedlák32488102019-07-15 17:44:10 +02001216 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_1);
David Sedláke0ef1c62019-09-13 10:05:55 +02001217 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001218 assert_int_equal(exts[0].insubstmt_index, 0);
1219 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_VERSION);
1220 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001221
1222 /* invalid value */
1223 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001224 assert_int_equal(test_element_helper(st, data, &version, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001225 logbuf_assert("Invalid value \"version\" of \"value\" attribute in \"yang-version\" element. Valid values are \"1.0\" and \"1.1\". Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001226
1227 st->finished_correctly = true;
1228}
1229
1230static void
1231test_mandatory_elem(void **state)
1232{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001233 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001234 const char *data;
1235 uint16_t man = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001236 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001237
1238 /* valid values */
1239 data = ELEMENT_WRAPPER_START "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001240 assert_int_equal(test_element_helper(st, data, &man, NULL, NULL), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001241 assert_int_equal(man, LYS_MAND_TRUE);
1242 man = 0;
1243
David Sedlákd1144562019-08-06 12:36:14 +02001244 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\">" EXT_SUBELEM "</mandatory>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001245 assert_int_equal(test_element_helper(st, data, &man, NULL, &exts), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001246 assert_int_equal(man, LYS_MAND_FALSE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001247 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001248 assert_int_equal(exts[0].insubstmt_index, 0);
1249 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MANDATORY);
1250 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001251
1252 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001253 assert_int_equal(test_element_helper(st, data, &man, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001254 logbuf_assert("Invalid value \"invalid\" of \"value\" attribute in \"mandatory\" element. Valid values are \"true\" and \"false\". Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001255
1256 st->finished_correctly = true;
1257}
1258
David Sedlák8e7bda82019-07-16 17:57:50 +02001259static void
1260test_argument_elem(void **state)
1261{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001262 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001263 const char *data;
1264 uint16_t flags = 0;
1265 const char *arg;
1266 struct yin_argument_meta arg_meta = {&flags, &arg};
David Sedlákd1144562019-08-06 12:36:14 +02001267 struct lysp_ext_instance *exts = NULL;
1268
David Sedlák8e7bda82019-07-16 17:57:50 +02001269 /* max subelems */
1270 data = ELEMENT_WRAPPER_START
1271 "<argument name=\"arg-name\">"
1272 "<yin-element value=\"true\" />"
David Sedlákd1144562019-08-06 12:36:14 +02001273 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001274 "</argument>"
1275 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001276 assert_int_equal(test_element_helper(st, data, &arg_meta, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001277 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001278 assert_true(flags & LYS_YINELEM_TRUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001279 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001280 assert_int_equal(exts[0].insubstmt_index, 0);
1281 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ARGUMENT);
1282 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1283 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001284 flags = 0;
1285 FREE_STRING(st->ctx, arg);
1286 arg = NULL;
1287
1288 /* min subelems */
1289 data = ELEMENT_WRAPPER_START
1290 "<argument name=\"arg\">"
1291 "</argument>"
1292 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001293 assert_int_equal(test_element_helper(st, data, &arg_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001294 assert_string_equal(arg, "arg");
1295 assert_true(flags == 0);
1296 FREE_STRING(st->ctx, arg);
1297
1298 st->finished_correctly = true;
1299}
1300
1301static void
1302test_base_elem(void **state)
1303{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001304 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001305 const char *data;
1306 const char **bases = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001307 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001308 struct lysp_type type = {};
1309
1310 /* as identity subelement */
1311 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001312 "<base name=\"base-name\">"
1313 EXT_SUBELEM
1314 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001315 "</identity>";
Michal Vaskob36053d2020-03-26 15:49:30 +01001316 assert_int_equal(test_element_helper(st, data, &bases, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001317 assert_string_equal(*bases, "base-name");
David Sedláke0ef1c62019-09-13 10:05:55 +02001318 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001319 assert_int_equal(exts[0].insubstmt_index, 0);
1320 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1321 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1322 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001323 FREE_STRING(st->ctx, *bases);
1324 LY_ARRAY_FREE(bases);
1325
1326 /* as type subelement */
1327 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001328 "<base name=\"base-name\">"
1329 EXT_SUBELEM
1330 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001331 "</type>";
Michal Vaskob36053d2020-03-26 15:49:30 +01001332 assert_int_equal(test_element_helper(st, data, &type, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001333 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001334 assert_true(type.flags & LYS_SET_BASE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001335 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001336 assert_int_equal(exts[0].insubstmt_index, 0);
1337 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1338 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1339 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001340 FREE_STRING(st->ctx, *type.bases);
1341 LY_ARRAY_FREE(type.bases);
1342
1343 st->finished_correctly = true;
1344}
1345
1346static void
1347test_belongsto_elem(void **state)
1348{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001349 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001350 const char *data;
1351 struct lysp_submodule submod;
David Sedlákd1144562019-08-06 12:36:14 +02001352 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001353
1354 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +02001355 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/>"EXT_SUBELEM"</belongs-to>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001356 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001357 assert_int_equal(test_element_helper(st, data, &submod, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001358 assert_string_equal(submod.belongsto, "module-name");
1359 assert_string_equal(submod.prefix, "pref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001360 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001361 assert_int_equal(exts[0].insubstmt_index, 0);
1362 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BELONGSTO);
1363 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1364 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001365 FREE_STRING(st->ctx, submod.belongsto);
1366 FREE_STRING(st->ctx, submod.prefix);
1367
1368 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001369 assert_int_equal(test_element_helper(st, data, &submod, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001370 logbuf_assert("Missing mandatory sub-element \"prefix\" of \"belongs-to\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001371 FREE_STRING(st->ctx, submod.belongsto);
1372
1373 st->finished_correctly = true;
1374}
1375
1376static void
1377test_config_elem(void **state)
1378{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001379 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001380 const char *data;
1381 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001382 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001383
David Sedlákd1144562019-08-06 12:36:14 +02001384 data = ELEMENT_WRAPPER_START "<config value=\"true\">" EXT_SUBELEM "</config>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001385 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001386 assert_true(flags & LYS_CONFIG_W);
David Sedláke0ef1c62019-09-13 10:05:55 +02001387 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001388 assert_int_equal(exts[0].insubstmt_index, 0);
1389 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONFIG);
1390 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1391 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001392 flags = 0;
1393
1394 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001395 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001396 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001397 flags = 0;
1398
1399 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001400 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001401 logbuf_assert("Invalid value \"invalid\" of \"value\" attribute in \"config\" element. Valid values are \"true\" and \"false\". Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001402
1403 st->finished_correctly = true;
1404}
1405
1406static void
1407test_default_elem(void **state)
1408{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001409 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001410 const char *data;
1411 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001412 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001413
David Sedlákd1144562019-08-06 12:36:14 +02001414 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\">"EXT_SUBELEM"</default>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001415 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001416 assert_string_equal(val, "defaul-value");
David Sedláke0ef1c62019-09-13 10:05:55 +02001417 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001418 assert_int_equal(exts[0].insubstmt_index, 0);
1419 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DEFAULT);
1420 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1421 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001422 FREE_STRING(st->ctx, val);
1423 val = NULL;
1424
1425 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001426 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001427 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1428
1429 st->finished_correctly = true;
1430}
1431
1432static void
1433test_err_app_tag_elem(void **state)
1434{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001435 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001436 const char *data;
1437 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001438 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001439
David Sedlákd1144562019-08-06 12:36:14 +02001440 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\">"EXT_SUBELEM"</error-app-tag>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001441 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001442 assert_string_equal(val, "val");
David Sedláke0ef1c62019-09-13 10:05:55 +02001443 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001444 assert_int_equal(exts[0].insubstmt_index, 0);
1445 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRTAG);
1446 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1447 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001448 FREE_STRING(st->ctx, val);
1449 val = NULL;
1450
1451 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001452 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001453 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1454
1455 st->finished_correctly = true;
1456}
1457
1458static void
1459test_err_msg_elem(void **state)
1460{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001461 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001462 const char *data;
1463 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001464 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001465
David Sedlákd1144562019-08-06 12:36:14 +02001466 data = ELEMENT_WRAPPER_START "<error-message><value>val</value>"EXT_SUBELEM"</error-message>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001467 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001468 assert_string_equal(val, "val");
David Sedláke0ef1c62019-09-13 10:05:55 +02001469 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001470 assert_int_equal(exts[0].insubstmt_index, 0);
1471 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRMSG);
1472 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1473 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001474 FREE_STRING(st->ctx, val);
1475
1476 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001477 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001478 logbuf_assert("Missing mandatory sub-element \"value\" of \"error-message\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001479
David Sedlákdf2a9732019-08-07 13:23:16 +02001480 data = ELEMENT_WRAPPER_START "<error-message invalid=\"text\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001481 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001482 logbuf_assert("Unexpected attribute \"invalid\" of \"error-message\" element. Line number 1.");
David Sedlákdf2a9732019-08-07 13:23:16 +02001483
David Sedlák8e7bda82019-07-16 17:57:50 +02001484 st->finished_correctly = true;
1485}
1486
1487static void
1488test_fracdigits_elem(void **state)
1489{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001490 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001491 const char *data;
1492 struct lysp_type type = {};
1493
1494 /* valid value */
David Sedlákd1144562019-08-06 12:36:14 +02001495 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\">"EXT_SUBELEM"</fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001496 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +02001497 assert_string_equal(type.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001498 assert_int_equal(type.exts[0].insubstmt_index, 0);
1499 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_FRACDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001500 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001501 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlákd1144562019-08-06 12:36:14 +02001502 FREE_ARRAY(st->ctx, type.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001503
1504 /* invalid values */
1505 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001506 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001507 logbuf_assert("Invalid value \"-1\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001508
1509 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001510 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001511 logbuf_assert("Invalid value \"02\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001512
1513 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001514 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001515 logbuf_assert("Invalid value \"1p\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001516
1517 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001518 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001519 logbuf_assert("Invalid value \"19\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001520
1521 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001522 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001523 logbuf_assert("Invalid value \"999999999999999999\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001524
1525 st->finished_correctly = true;
1526}
1527
1528static void
1529test_iffeature_elem(void **state)
1530{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001531 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001532 const char *data;
1533 const char **iffeatures = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001534 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001535
David Sedlákd1144562019-08-06 12:36:14 +02001536 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\">"EXT_SUBELEM"</if-feature>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001537 assert_int_equal(test_element_helper(st, data, &iffeatures, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001538 assert_string_equal(*iffeatures, "local-storage");
David Sedláke0ef1c62019-09-13 10:05:55 +02001539 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001540 assert_int_equal(exts[0].insubstmt_index, 0);
1541 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_IFFEATURE);
1542 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1543 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001544 FREE_STRING(st->ctx, *iffeatures);
1545 LY_ARRAY_FREE(iffeatures);
1546 iffeatures = NULL;
1547
1548 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001549 assert_int_equal(test_element_helper(st, data, &iffeatures, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001550 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1551 LY_ARRAY_FREE(iffeatures);
1552 iffeatures = NULL;
1553
1554 st->finished_correctly = true;
1555}
1556
1557static void
1558test_length_elem(void **state)
1559{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001560 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001561 const char *data;
1562 struct lysp_type type = {};
1563
1564 /* max subelems */
1565 data = ELEMENT_WRAPPER_START
1566 "<length value=\"length-str\">"
1567 "<error-message><value>err-msg</value></error-message>"
1568 "<error-app-tag value=\"err-app-tag\"/>"
1569 "<description><text>desc</text></description>"
1570 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001571 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001572 "</length>"
1573 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001574 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001575 assert_string_equal(type.length->arg, "length-str");
1576 assert_string_equal(type.length->emsg, "err-msg");
1577 assert_string_equal(type.length->eapptag, "err-app-tag");
1578 assert_string_equal(type.length->dsc, "desc");
1579 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001580 assert_true(type.flags & LYS_SET_LENGTH);
David Sedláke0ef1c62019-09-13 10:05:55 +02001581 assert_string_equal(type.length->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001582 assert_int_equal(type.length->exts[0].insubstmt_index, 0);
1583 assert_int_equal(type.length->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001584 lysp_type_free(st->ctx, &type);
1585 memset(&type, 0, sizeof(type));
1586
1587 /* min subelems */
1588 data = ELEMENT_WRAPPER_START
1589 "<length value=\"length-str\">"
1590 "</length>"
1591 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001592 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001593 assert_string_equal(type.length->arg, "length-str");
1594 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001595 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001596 memset(&type, 0, sizeof(type));
1597
1598 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001599 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001600 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1601 lysp_type_free(st->ctx, &type);
1602 memset(&type, 0, sizeof(type));
1603
1604 st->finished_correctly = true;
1605}
1606
1607static void
1608test_modifier_elem(void **state)
1609{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001610 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001611 const char *data;
1612 const char *pat = lydict_insert(st->ctx, "\006pattern", 8);
David Sedlákd1144562019-08-06 12:36:14 +02001613 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001614
David Sedlákd1144562019-08-06 12:36:14 +02001615 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\">" EXT_SUBELEM "</modifier>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001616 assert_int_equal(test_element_helper(st, data, &pat, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001617 assert_string_equal(pat, "\x015pattern");
David Sedláke0ef1c62019-09-13 10:05:55 +02001618 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001619 assert_int_equal(exts[0].insubstmt_index, 0);
1620 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MODIFIER);
1621 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1622 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001623 FREE_STRING(st->ctx, pat);
1624
1625 pat = lydict_insert(st->ctx, "\006pattern", 8);
1626 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001627 assert_int_equal(test_element_helper(st, data, &pat, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001628 logbuf_assert("Invalid value \"invert\" of \"value\" attribute in \"modifier\" element. Only valid value is \"invert-match\". Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001629 FREE_STRING(st->ctx, pat);
1630
1631 st->finished_correctly = true;
1632}
1633
1634static void
1635test_namespace_elem(void **state)
1636{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001637 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001638 const char *data;
1639 const char *ns;
David Sedlákd1144562019-08-06 12:36:14 +02001640 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001641
David Sedlákd1144562019-08-06 12:36:14 +02001642 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\">" EXT_SUBELEM "</namespace>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001643 assert_int_equal(test_element_helper(st, data, &ns, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001644 assert_string_equal(ns, "ns");
David Sedláke0ef1c62019-09-13 10:05:55 +02001645 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001646 assert_int_equal(exts[0].insubstmt_index, 0);
1647 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_NAMESPACE);
1648 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1649 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001650 FREE_STRING(st->ctx, ns);
1651
1652 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001653 assert_int_equal(test_element_helper(st, data, &ns, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001654 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1655
1656 st->finished_correctly = true;
1657}
1658
1659static void
David Sedlák8e7bda82019-07-16 17:57:50 +02001660test_pattern_elem(void **state)
1661{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001662 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001663 const char *data;
1664 struct lysp_type type = {};
1665
1666 /* max subelems */
1667 data = ELEMENT_WRAPPER_START
1668 "<pattern value=\"super_pattern\">"
1669 "<modifier value=\"invert-match\"/>"
1670 "<error-message><value>err-msg-value</value></error-message>"
1671 "<error-app-tag value=\"err-app-tag-value\"/>"
David Sedlák169cc522019-08-15 13:23:45 +02001672 "<description><text>&quot;pattern-desc&quot;</text></description>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001673 "<reference><text>pattern-ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001674 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001675 "</pattern>"
1676 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001677 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001678 assert_true(type.flags & LYS_SET_PATTERN);
David Sedlák8e7bda82019-07-16 17:57:50 +02001679 assert_string_equal(type.patterns->arg, "\x015super_pattern");
David Sedlák169cc522019-08-15 13:23:45 +02001680 assert_string_equal(type.patterns->dsc, "\"pattern-desc\"");
David Sedlák8e7bda82019-07-16 17:57:50 +02001681 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1682 assert_string_equal(type.patterns->emsg, "err-msg-value");
David Sedlák8e7bda82019-07-16 17:57:50 +02001683 assert_string_equal(type.patterns->ref, "pattern-ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001684 assert_string_equal(type.patterns->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001685 assert_int_equal(type.patterns->exts[0].insubstmt_index, 0);
1686 assert_int_equal(type.patterns->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001687 lysp_type_free(st->ctx, &type);
1688 memset(&type, 0, sizeof(type));
1689
1690 /* min subelems */
1691 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001692 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001693 assert_string_equal(type.patterns->arg, "\x006pattern");
1694 lysp_type_free(st->ctx, &type);
1695 memset(&type, 0, sizeof(type));
1696
1697 st->finished_correctly = true;
1698}
1699
1700static void
1701test_value_position_elem(void **state)
1702{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001703 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001704 const char *data;
1705 struct lysp_type_enum en = {};
1706
1707 /* valid values */
David Sedlákd1144562019-08-06 12:36:14 +02001708 data = ELEMENT_WRAPPER_START "<value value=\"55\">" EXT_SUBELEM "</value>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001709 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001710 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001711 assert_true(en.flags & LYS_SET_VALUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001712 assert_string_equal(en.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001713 assert_int_equal(en.exts[0].insubstmt_index, 0);
1714 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_VALUE);
1715 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001716 memset(&en, 0, sizeof(en));
1717
1718 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001719 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001720 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001721 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001722 memset(&en, 0, sizeof(en));
1723
1724 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001725 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001726 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001727 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001728 memset(&en, 0, sizeof(en));
1729
1730 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001731 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001732 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001733 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001734 memset(&en, 0, sizeof(en));
1735
1736 /* valid positions */
David Sedlák8d552d62019-08-06 15:29:05 +02001737 data = ELEMENT_WRAPPER_START "<position value=\"55\">" EXT_SUBELEM "</position>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001738 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001739 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001740 assert_true(en.flags & LYS_SET_VALUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001741 assert_string_equal(en.exts[0].name, "urn:example:extensions:c-define");
David Sedlák8d552d62019-08-06 15:29:05 +02001742 assert_int_equal(en.exts[0].insubstmt_index, 0);
1743 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_POSITION);
1744 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001745 memset(&en, 0, sizeof(en));
1746
1747 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001748 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001749 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001750 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001751 memset(&en, 0, sizeof(en));
1752
1753 /* invalid values */
1754 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001755 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001756 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\" attribute in \"value\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001757
1758 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001759 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001760 logbuf_assert("Invalid value \"1k\" of \"value\" attribute in \"value\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001761
David Sedlák69f01612019-07-17 11:41:08 +02001762 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001763 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001764 logbuf_assert("Invalid value \"\" of \"value\" attribute in \"value\" element. Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001765
David Sedlák8e7bda82019-07-16 17:57:50 +02001766 /*invalid positions */
1767 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001768 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001769 logbuf_assert("Invalid value \"-5\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001770
1771 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001772 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001773 logbuf_assert("Invalid value \"-0\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001774
1775 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001776 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001777 logbuf_assert("Invalid value \"99999999999999999999\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001778
David Sedlák69f01612019-07-17 11:41:08 +02001779 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001780 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001781 logbuf_assert("Invalid value \"\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001782
1783 st->finished_correctly = true;
1784}
1785
1786static void
1787test_prefix_elem(void **state)
1788{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001789 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001790 const char *data;
1791 const char *value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001792 struct lysp_ext_instance *exts = NULL;
1793
1794 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\">" EXT_SUBELEM "</prefix>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001795 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001796 assert_string_equal(value, "pref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001797 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001798 assert_int_equal(exts[0].insubstmt_index, 0);
1799 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PREFIX);
1800 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1801 exts = NULL;
1802 FREE_STRING(st->ctx, value);
David Sedlák69f01612019-07-17 11:41:08 +02001803
1804 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001805 assert_int_equal(test_element_helper(st, data, &value, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001806 assert_string_equal(value, "pref");
1807 FREE_STRING(st->ctx, value);
1808
1809 st->finished_correctly = true;
1810}
1811
1812static void
1813test_range_elem(void **state)
1814{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001815 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001816 const char *data;
1817 struct lysp_type type = {};
1818
1819 /* max subelems */
1820 data = ELEMENT_WRAPPER_START
1821 "<range value=\"range-str\">"
1822 "<error-message><value>err-msg</value></error-message>"
1823 "<error-app-tag value=\"err-app-tag\" />"
1824 "<description><text>desc</text></description>"
1825 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001826 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001827 "</range>"
1828 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001829 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001830 assert_string_equal(type.range->arg, "range-str");
1831 assert_string_equal(type.range->dsc, "desc");
1832 assert_string_equal(type.range->eapptag, "err-app-tag");
1833 assert_string_equal(type.range->emsg, "err-msg");
1834 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001835 assert_true(type.flags & LYS_SET_RANGE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001836 assert_string_equal(type.range->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001837 assert_int_equal(type.range->exts[0].insubstmt_index, 0);
1838 assert_int_equal(type.range->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001839 lysp_type_free(st->ctx, &type);
1840 memset(&type, 0, sizeof(type));
1841
1842 /* min subelems */
1843 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001844 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001845 assert_string_equal(type.range->arg, "range-str");
1846 lysp_type_free(st->ctx, &type);
1847 memset(&type, 0, sizeof(type));
1848
1849 st->finished_correctly = true;
1850}
1851
1852static void
1853test_reqinstance_elem(void **state)
1854{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001855 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001856 const char *data;
1857 struct lysp_type type = {};
1858
David Sedlákd1144562019-08-06 12:36:14 +02001859 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\">" EXT_SUBELEM "</require-instance>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001860 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001861 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001862 assert_true(type.flags & LYS_SET_REQINST);
David Sedláke0ef1c62019-09-13 10:05:55 +02001863 assert_string_equal(type.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001864 assert_int_equal(type.exts[0].insubstmt_index, 0);
1865 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_REQINSTANCE);
1866 lysp_type_free(st->ctx, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001867 memset(&type, 0, sizeof(type));
1868
1869 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001870 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001871 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001872 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001873 memset(&type, 0, sizeof(type));
1874
1875 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001876 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák69f01612019-07-17 11:41:08 +02001877 memset(&type, 0, sizeof(type));
David Sedlák26ea1432019-08-14 13:42:23 +02001878 logbuf_assert("Invalid value \"invalid\" of \"value\" attribute in \"require-instance\" element. Valid values are \"true\" and \"false\". Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001879
1880 st->finished_correctly = true;
1881}
1882
1883static void
1884test_revision_date_elem(void **state)
1885{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001886 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001887 const char *data;
1888 char rev[LY_REV_SIZE];
David Sedlákd1144562019-08-06 12:36:14 +02001889 struct lysp_ext_instance *exts = NULL;
1890
1891 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\">"EXT_SUBELEM"</revision-date>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001892 assert_int_equal(test_element_helper(st, data, rev, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001893 assert_string_equal(rev, "2000-01-01");
David Sedláke0ef1c62019-09-13 10:05:55 +02001894 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001895 assert_int_equal(exts[0].insubstmt_index, 0);
1896 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_REVISIONDATE);
1897 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák69f01612019-07-17 11:41:08 +02001898
1899 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001900 assert_int_equal(test_element_helper(st, data, rev, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001901 assert_string_equal(rev, "2000-01-01");
1902
1903 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001904 assert_int_equal(test_element_helper(st, data, rev, NULL, NULL), LY_EVALID);
David Sedlák69f01612019-07-17 11:41:08 +02001905 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1906
1907 st->finished_correctly = true;
1908}
1909
1910static void
1911test_unique_elem(void **state)
1912{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001913 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001914 const char *data;
1915 const char **values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001916 struct lysp_ext_instance *exts = NULL;
1917
1918 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\">"EXT_SUBELEM"</unique>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001919 assert_int_equal(test_element_helper(st, data, &values, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001920 assert_string_equal(*values, "tag");
David Sedláke0ef1c62019-09-13 10:05:55 +02001921 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001922 assert_int_equal(exts[0].insubstmt_index, 0);
1923 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNIQUE);
1924 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1925 FREE_STRING(st->ctx, *values);
1926 LY_ARRAY_FREE(values);
1927 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001928
1929 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001930 assert_int_equal(test_element_helper(st, data, &values, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001931 assert_string_equal(*values, "tag");
1932 FREE_STRING(st->ctx, *values);
1933 LY_ARRAY_FREE(values);
David Sedlákd1144562019-08-06 12:36:14 +02001934 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001935
1936 st->finished_correctly = true;
1937}
1938
1939static void
1940test_units_elem(void **state)
1941{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001942 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001943 const char *data;
1944 const char *values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001945 struct lysp_ext_instance *exts = NULL;
1946
1947 data = ELEMENT_WRAPPER_START "<units name=\"name\">"EXT_SUBELEM"</units>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001948 assert_int_equal(test_element_helper(st, data, &values, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001949 assert_string_equal(values, "name");
David Sedláke0ef1c62019-09-13 10:05:55 +02001950 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001951 assert_int_equal(exts[0].insubstmt_index, 0);
1952 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNITS);
1953 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1954 FREE_STRING(st->ctx, values);
1955 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001956
1957 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001958 assert_int_equal(test_element_helper(st, data, &values, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001959 assert_string_equal(values, "name");
1960 FREE_STRING(st->ctx, values);
David Sedlákd1144562019-08-06 12:36:14 +02001961 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001962
1963 st->finished_correctly = true;
1964}
1965
1966static void
1967test_when_elem(void **state)
1968{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001969 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001970 const char *data;
1971 struct lysp_when *when = NULL;
1972
1973 data = ELEMENT_WRAPPER_START
1974 "<when condition=\"cond\">"
1975 "<description><text>desc</text></description>"
1976 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001977 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001978 "</when>"
1979 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001980 assert_int_equal(test_element_helper(st, data, &when, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001981 assert_string_equal(when->cond, "cond");
1982 assert_string_equal(when->dsc, "desc");
1983 assert_string_equal(when->ref, "ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001984 assert_string_equal(when->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001985 assert_int_equal(when->exts[0].insubstmt_index, 0);
1986 assert_int_equal(when->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001987 lysp_when_free(st->ctx, when);
1988 free(when);
1989 when = NULL;
1990
1991 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001992 assert_int_equal(test_element_helper(st, data, &when, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001993 assert_string_equal(when->cond, "cond");
1994 lysp_when_free(st->ctx, when);
1995 free(when);
1996 when = NULL;
1997
1998 st->finished_correctly = true;
1999}
2000
2001static void
2002test_yin_text_value_elem(void **state)
2003{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002004 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02002005 const char *data;
2006 const char *val;
2007
2008 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002009 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02002010 assert_string_equal(val, "text");
2011 FREE_STRING(st->ctx, val);
2012
2013 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002014 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02002015 assert_string_equal(val, "text");
2016 FREE_STRING(st->ctx, val);
2017
2018 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002019 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02002020 assert_string_equal("", val);
2021 FREE_STRING(st->ctx, val);
2022
David Sedlák8e7bda82019-07-16 17:57:50 +02002023 st->finished_correctly = true;
2024}
David Sedlák32488102019-07-15 17:44:10 +02002025
David Sedlák374d2b32019-07-17 15:06:55 +02002026static void
2027test_type_elem(void **state)
2028{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002029 struct test_parser_yin_state *st = *state;
David Sedlák374d2b32019-07-17 15:06:55 +02002030 const char *data;
2031 struct lysp_type type = {};
2032
2033 /* max subelems */
2034 data = ELEMENT_WRAPPER_START
2035 "<type name=\"type-name\">"
2036 "<base name=\"base-name\"/>"
2037 "<bit name=\"bit\"/>"
2038 "<enum name=\"enum\"/>"
2039 "<fraction-digits value=\"2\"/>"
2040 "<length value=\"length\"/>"
2041 "<path value=\"path\"/>"
2042 "<pattern value=\"pattern\"/>"
2043 "<range value=\"range\" />"
2044 "<require-instance value=\"true\"/>"
2045 "<type name=\"sub-type-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002046 EXT_SUBELEM
David Sedlák374d2b32019-07-17 15:06:55 +02002047 "</type>"
2048 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002049 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák374d2b32019-07-17 15:06:55 +02002050 assert_string_equal(type.name, "type-name");
2051 assert_string_equal(*type.bases, "base-name");
2052 assert_string_equal(type.bits->name, "bit");
2053 assert_string_equal(type.enums->name, "enum");
2054 assert_int_equal(type.fraction_digits, 2);
2055 assert_string_equal(type.length->arg, "length");
Michal Vasko004d3152020-06-11 19:59:22 +02002056 assert_string_equal(type.path->expr, "path");
David Sedlák374d2b32019-07-17 15:06:55 +02002057 assert_string_equal(type.patterns->arg, "\006pattern");
2058 assert_string_equal(type.range->arg, "range");
2059 assert_int_equal(type.require_instance, 1);
2060 assert_string_equal(type.types->name, "sub-type-name");
David Sedláke0ef1c62019-09-13 10:05:55 +02002061 assert_string_equal(type.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002062 assert_int_equal(type.exts[0].insubstmt_index, 0);
2063 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002064 assert_true(type.flags & LYS_SET_BASE);
2065 assert_true(type.flags & LYS_SET_BIT);
2066 assert_true(type.flags & LYS_SET_ENUM);
2067 assert_true(type.flags & LYS_SET_FRDIGITS);
2068 assert_true(type.flags & LYS_SET_LENGTH);
2069 assert_true(type.flags & LYS_SET_PATH);
2070 assert_true(type.flags & LYS_SET_PATTERN);
2071 assert_true(type.flags & LYS_SET_RANGE);
2072 assert_true(type.flags & LYS_SET_REQINST);
2073 assert_true(type.flags & LYS_SET_TYPE);
David Sedlákd1144562019-08-06 12:36:14 +02002074 lysp_type_free(st->ctx, &type);
David Sedlák374d2b32019-07-17 15:06:55 +02002075 memset(&type, 0, sizeof(type));
2076
2077 /* min subelems */
2078 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002079 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák374d2b32019-07-17 15:06:55 +02002080 lysp_type_free(st->ctx, &type);
2081 memset(&type, 0, sizeof(type));
2082
2083 st->finished_correctly = true;
2084}
2085
David Sedlák1af868e2019-07-17 17:03:14 +02002086static void
2087test_max_elems_elem(void **state)
2088{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002089 struct test_parser_yin_state *st = *state;
David Sedlák1af868e2019-07-17 17:03:14 +02002090 const char *data;
2091 struct lysp_node_list list = {};
2092 struct lysp_node_leaflist llist = {};
2093 struct lysp_refine refine = {};
2094
David Sedlákd1144562019-08-06 12:36:14 +02002095 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"unbounded\">"EXT_SUBELEM"</max-elements> </refine>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002096 assert_int_equal(test_element_helper(st, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002097 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002098 assert_true(refine.flags & LYS_SET_MAX);
David Sedláke0ef1c62019-09-13 10:05:55 +02002099 assert_string_equal(refine.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002100 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2101 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2102 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002103
David Sedlákd1144562019-08-06 12:36:14 +02002104 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"5\">"EXT_SUBELEM"</max-elements> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002105 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002106 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002107 assert_true(list.flags & LYS_SET_MAX);
David Sedláke0ef1c62019-09-13 10:05:55 +02002108 assert_string_equal(list.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002109 assert_int_equal(list.exts[0].insubstmt_index, 0);
2110 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2111 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002112
David Sedlákd1144562019-08-06 12:36:14 +02002113 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"85\">"EXT_SUBELEM"</max-elements> </leaf-list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002114 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002115 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002116 assert_true(llist.flags & LYS_SET_MAX);
David Sedláke0ef1c62019-09-13 10:05:55 +02002117 assert_string_equal(llist.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002118 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2119 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2120 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002121
2122 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002123 assert_int_equal(test_element_helper(st, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002124 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002125 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02002126
2127 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002128 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002129 logbuf_assert("Invalid value \"0\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002130
2131 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002132 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002133 logbuf_assert("Invalid value \"-10\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002134
2135 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002136 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002137 logbuf_assert("Invalid value \"k\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002138
2139 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002140 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002141 logbuf_assert("Invalid value \"u12\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002142
2143 st->finished_correctly = true;
2144}
2145
David Sedlák09e18c92019-07-18 11:17:11 +02002146static void
2147test_min_elems_elem(void **state)
2148{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002149 struct test_parser_yin_state *st = *state;
David Sedlák09e18c92019-07-18 11:17:11 +02002150 const char *data;
2151 struct lysp_node_list list = {};
2152 struct lysp_node_leaflist llist = {};
2153 struct lysp_refine refine = {};
2154
David Sedlákd1144562019-08-06 12:36:14 +02002155 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"0\">"EXT_SUBELEM"</min-elements> </refine>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002156 assert_int_equal(test_element_helper(st, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák09e18c92019-07-18 11:17:11 +02002157 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002158 assert_true(refine.flags & LYS_SET_MIN);
David Sedláke0ef1c62019-09-13 10:05:55 +02002159 assert_string_equal(refine.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002160 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2161 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2162 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002163
David Sedlákd1144562019-08-06 12:36:14 +02002164 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"41\">"EXT_SUBELEM"</min-elements> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002165 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_SUCCESS);
David Sedlák09e18c92019-07-18 11:17:11 +02002166 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002167 assert_true(list.flags & LYS_SET_MIN);
David Sedláke0ef1c62019-09-13 10:05:55 +02002168 assert_string_equal(list.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002169 assert_int_equal(list.exts[0].insubstmt_index, 0);
2170 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2171 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002172
David Sedlákd1144562019-08-06 12:36:14 +02002173 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"50\">"EXT_SUBELEM"</min-elements> </leaf-list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002174 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_SUCCESS);
David Sedlák09e18c92019-07-18 11:17:11 +02002175 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002176 assert_true(llist.flags & LYS_SET_MIN);
David Sedláke0ef1c62019-09-13 10:05:55 +02002177 assert_string_equal(llist.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002178 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2179 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2180 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002181
2182 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002183 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002184 logbuf_assert("Value \"-5\" of \"value\" attribute in \"min-elements\" element is out of bounds. Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02002185
2186 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002187 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002188 logbuf_assert("Value \"99999999999999999\" of \"value\" attribute in \"min-elements\" element is out of bounds. Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02002189
2190 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002191 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002192 logbuf_assert("Invalid value \"5k\" of \"value\" attribute in \"min-elements\" element. Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02002193
2194 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002195 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002196 logbuf_assert("Invalid value \"05\" of \"value\" attribute in \"min-elements\" element. Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02002197
2198 st->finished_correctly = true;
2199}
2200
David Sedláka2dad212019-07-18 12:45:19 +02002201static void
2202test_ordby_elem(void **state)
2203{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002204 struct test_parser_yin_state *st = *state;
David Sedláka2dad212019-07-18 12:45:19 +02002205 const char *data;
2206 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02002207 struct lysp_ext_instance *exts = NULL;
David Sedláka2dad212019-07-18 12:45:19 +02002208
David Sedlákd1144562019-08-06 12:36:14 +02002209 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\">"EXT_SUBELEM"</ordered-by>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002210 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002211 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedláke0ef1c62019-09-13 10:05:55 +02002212 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002213 assert_int_equal(exts[0].insubstmt_index, 0);
2214 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORDEREDBY);
2215 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedláka2dad212019-07-18 12:45:19 +02002216
2217 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002218 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002219 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02002220
2221 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002222 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02002223 logbuf_assert("Invalid value \"inv\" of \"value\" attribute in \"ordered-by\" element. Valid values are \"system\" and \"user\". Line number 1.");
David Sedláka2dad212019-07-18 12:45:19 +02002224
2225 st->finished_correctly = true;
2226}
2227
David Sedlák8a83bbb2019-07-18 14:46:00 +02002228static void
2229test_any_elem(void **state)
2230{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002231 struct test_parser_yin_state *st = *state;
David Sedlák8a83bbb2019-07-18 14:46:00 +02002232 const char *data;
2233 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002234 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlák8a83bbb2019-07-18 14:46:00 +02002235 struct lysp_node_anydata *parsed = NULL;
2236
2237 /* anyxml max subelems */
2238 data = ELEMENT_WRAPPER_START
2239 "<anyxml name=\"any-name\">"
2240 "<config value=\"true\" />"
2241 "<description><text>desc</text></description>"
2242 "<if-feature name=\"feature\" />"
2243 "<mandatory value=\"true\" />"
2244 "<must condition=\"must-cond\" />"
2245 "<reference><text>ref</text></reference>"
2246 "<status value=\"deprecated\"/>"
2247 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002248 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002249 "</anyxml>"
2250 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002251 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002252 parsed = (struct lysp_node_anydata *)siblings;
2253 assert_null(parsed->parent);
2254 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002255 assert_true(parsed->flags & LYS_CONFIG_W);
2256 assert_true(parsed->flags & LYS_MAND_TRUE);
2257 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002258 assert_null(parsed->next);
2259 assert_string_equal(parsed->name, "any-name");
2260 assert_string_equal(parsed->dsc, "desc");
2261 assert_string_equal(parsed->ref, "ref");
2262 assert_string_equal(parsed->when->cond, "when-cond");
2263 assert_string_equal(*parsed->iffeatures, "feature");
David Sedláke0ef1c62019-09-13 10:05:55 +02002264 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002265 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2266 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002267 lysp_node_free(st->ctx, siblings);
2268 siblings = NULL;
2269
2270 /* anydata max subelems */
2271 data = ELEMENT_WRAPPER_START
2272 "<anydata name=\"any-name\">"
2273 "<config value=\"true\" />"
2274 "<description><text>desc</text></description>"
2275 "<if-feature name=\"feature\" />"
2276 "<mandatory value=\"true\" />"
2277 "<must condition=\"must-cond\" />"
2278 "<reference><text>ref</text></reference>"
2279 "<status value=\"deprecated\"/>"
2280 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002281 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002282 "</anydata>"
2283 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002284 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002285 parsed = (struct lysp_node_anydata *)siblings;
2286 assert_null(parsed->parent);
2287 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002288 assert_true(parsed->flags & LYS_CONFIG_W);
2289 assert_true(parsed->flags & LYS_MAND_TRUE);
2290 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002291 assert_null(parsed->next);
2292 assert_string_equal(parsed->name, "any-name");
2293 assert_string_equal(parsed->dsc, "desc");
2294 assert_string_equal(parsed->ref, "ref");
2295 assert_string_equal(parsed->when->cond, "when-cond");
2296 assert_string_equal(*parsed->iffeatures, "feature");
David Sedláke0ef1c62019-09-13 10:05:55 +02002297 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002298 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2299 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002300 lysp_node_free(st->ctx, siblings);
2301 siblings = NULL;
2302
2303 /* min subelems */
2304 node_meta.parent = (void *)0x10;
2305 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002306 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002307 parsed = (struct lysp_node_anydata *)siblings;
2308 assert_ptr_equal(parsed->parent, node_meta.parent);
2309 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
2310 assert_null(parsed->next);
2311 assert_null(parsed->exts);
2312 lysp_node_free(st->ctx, siblings);
2313
2314 st->finished_correctly = true;
2315}
2316
David Sedlák203ca3a2019-07-18 15:26:25 +02002317static void
2318test_leaf_elem(void **state)
2319{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002320 struct test_parser_yin_state *st = *state;
David Sedlák203ca3a2019-07-18 15:26:25 +02002321 const char *data;
2322 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002323 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlák203ca3a2019-07-18 15:26:25 +02002324 struct lysp_node_leaf *parsed = NULL;
2325
2326 /* max elements */
2327 data = ELEMENT_WRAPPER_START
2328 "<leaf name=\"leaf\">"
2329 "<config value=\"true\" />"
2330 "<default value=\"def-val\"/>"
2331 "<description><text>desc</text></description>"
2332 "<if-feature name=\"feature\" />"
2333 "<mandatory value=\"true\" />"
2334 "<must condition=\"must-cond\" />"
2335 "<reference><text>ref</text></reference>"
2336 "<status value=\"deprecated\"/>"
2337 "<type name=\"type\"/>"
2338 "<units name=\"uni\"/>"
2339 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002340 EXT_SUBELEM
David Sedlák203ca3a2019-07-18 15:26:25 +02002341 "</leaf>"
2342 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002343 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák203ca3a2019-07-18 15:26:25 +02002344 parsed = (struct lysp_node_leaf *)siblings;
2345 assert_null(parsed->parent);
2346 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002347 assert_true(parsed->flags & LYS_CONFIG_W);
2348 assert_true(parsed->flags & LYS_MAND_TRUE);
2349 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02002350 assert_null(parsed->next);
2351 assert_string_equal(parsed->name, "leaf");
2352 assert_string_equal(parsed->dsc, "desc");
2353 assert_string_equal(parsed->ref, "ref");
2354 assert_string_equal(parsed->when->cond, "when-cond");
2355 assert_string_equal(*parsed->iffeatures, "feature");
David Sedláke0ef1c62019-09-13 10:05:55 +02002356 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002357 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2358 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák203ca3a2019-07-18 15:26:25 +02002359 assert_string_equal(parsed->musts->arg, "must-cond");
2360 assert_string_equal(parsed->type.name, "type");
2361 assert_string_equal(parsed->units, "uni");
2362 assert_string_equal(parsed->dflt, "def-val");
2363 lysp_node_free(st->ctx, siblings);
2364 siblings = NULL;
2365
2366 /* min elements */
2367 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002368 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák203ca3a2019-07-18 15:26:25 +02002369 parsed = (struct lysp_node_leaf *)siblings;
2370 assert_string_equal(parsed->name, "leaf");
2371 assert_string_equal(parsed->type.name, "type");
2372 lysp_node_free(st->ctx, siblings);
2373 siblings = NULL;
2374
2375 st->finished_correctly = true;
2376}
2377
David Sedlákc3da3ef2019-07-19 12:56:08 +02002378static void
2379test_leaf_list_elem(void **state)
2380{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002381 struct test_parser_yin_state *st = *state;
David Sedlákc3da3ef2019-07-19 12:56:08 +02002382 const char *data;
2383 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002384 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlákc3da3ef2019-07-19 12:56:08 +02002385 struct lysp_node_leaflist *parsed = NULL;
2386
2387 data = ELEMENT_WRAPPER_START
2388 "<leaf-list name=\"llist\">"
2389 "<config value=\"true\" />"
2390 "<default value=\"def-val0\"/>"
2391 "<default value=\"def-val1\"/>"
2392 "<description><text>desc</text></description>"
2393 "<if-feature name=\"feature\"/>"
2394 "<max-elements value=\"5\"/>"
2395 "<must condition=\"must-cond\"/>"
2396 "<ordered-by value=\"user\" />"
2397 "<reference><text>ref</text></reference>"
2398 "<status value=\"current\"/>"
2399 "<type name=\"type\"/>"
2400 "<units name=\"uni\"/>"
2401 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002402 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002403 "</leaf-list>"
2404 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002405 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002406 parsed = (struct lysp_node_leaflist *)siblings;
2407 assert_string_equal(parsed->dflts[0], "def-val0");
2408 assert_string_equal(parsed->dflts[1], "def-val1");
2409 assert_string_equal(parsed->dsc, "desc");
2410 assert_string_equal(*parsed->iffeatures, "feature");
2411 assert_int_equal(parsed->max, 5);
2412 assert_string_equal(parsed->musts->arg, "must-cond");
2413 assert_string_equal(parsed->name, "llist");
2414 assert_null(parsed->next);
2415 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2416 assert_null(parsed->parent);
2417 assert_string_equal(parsed->ref, "ref");
2418 assert_string_equal(parsed->type.name, "type");
2419 assert_string_equal(parsed->units, "uni");
2420 assert_string_equal(parsed->when->cond, "when-cond");
2421 assert_true(parsed->flags & LYS_CONFIG_W);
2422 assert_true(parsed->flags & LYS_ORDBY_USER);
2423 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedláke0ef1c62019-09-13 10:05:55 +02002424 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002425 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2426 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002427 lysp_node_free(st->ctx, siblings);
2428 siblings = NULL;
2429
2430 data = ELEMENT_WRAPPER_START
2431 "<leaf-list name=\"llist\">"
2432 "<config value=\"true\" />"
2433 "<description><text>desc</text></description>"
2434 "<if-feature name=\"feature\"/>"
2435 "<min-elements value=\"5\"/>"
2436 "<must condition=\"must-cond\"/>"
2437 "<ordered-by value=\"user\" />"
2438 "<reference><text>ref</text></reference>"
2439 "<status value=\"current\"/>"
2440 "<type name=\"type\"/>"
2441 "<units name=\"uni\"/>"
2442 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002443 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002444 "</leaf-list>"
2445 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002446 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002447 parsed = (struct lysp_node_leaflist *)siblings;
2448 assert_string_equal(parsed->dsc, "desc");
2449 assert_string_equal(*parsed->iffeatures, "feature");
2450 assert_int_equal(parsed->min, 5);
2451 assert_string_equal(parsed->musts->arg, "must-cond");
2452 assert_string_equal(parsed->name, "llist");
2453 assert_null(parsed->next);
2454 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2455 assert_null(parsed->parent);
2456 assert_string_equal(parsed->ref, "ref");
2457 assert_string_equal(parsed->type.name, "type");
2458 assert_string_equal(parsed->units, "uni");
2459 assert_string_equal(parsed->when->cond, "when-cond");
2460 assert_true(parsed->flags & LYS_CONFIG_W);
2461 assert_true(parsed->flags & LYS_ORDBY_USER);
2462 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedláke0ef1c62019-09-13 10:05:55 +02002463 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002464 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2465 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002466 lysp_node_free(st->ctx, siblings);
2467 siblings = NULL;
2468
2469 data = ELEMENT_WRAPPER_START
2470 "<leaf-list name=\"llist\">"
2471 "<config value=\"true\" />"
2472 "<description><text>desc</text></description>"
2473 "<if-feature name=\"feature\"/>"
2474 "<max-elements value=\"15\"/>"
2475 "<min-elements value=\"5\"/>"
2476 "<must condition=\"must-cond\"/>"
2477 "<ordered-by value=\"user\" />"
2478 "<reference><text>ref</text></reference>"
2479 "<status value=\"current\"/>"
2480 "<type name=\"type\"/>"
2481 "<units name=\"uni\"/>"
2482 "<when condition=\"when-cond\"/>"
2483 "</leaf-list>"
2484 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002485 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002486 parsed = (struct lysp_node_leaflist *)siblings;
2487 assert_string_equal(parsed->dsc, "desc");
2488 assert_string_equal(*parsed->iffeatures, "feature");
2489 assert_int_equal(parsed->min, 5);
2490 assert_int_equal(parsed->max, 15);
2491 assert_string_equal(parsed->musts->arg, "must-cond");
2492 assert_string_equal(parsed->name, "llist");
2493 assert_null(parsed->next);
2494 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2495 assert_null(parsed->parent);
2496 assert_string_equal(parsed->ref, "ref");
2497 assert_string_equal(parsed->type.name, "type");
2498 assert_string_equal(parsed->units, "uni");
2499 assert_string_equal(parsed->when->cond, "when-cond");
2500 assert_true(parsed->flags & LYS_CONFIG_W);
2501 assert_true(parsed->flags & LYS_ORDBY_USER);
2502 assert_true(parsed->flags & LYS_STATUS_CURR);
2503 lysp_node_free(st->ctx, siblings);
2504 siblings = NULL;
2505
2506 data = ELEMENT_WRAPPER_START
2507 "<leaf-list name=\"llist\">"
2508 "<type name=\"type\"/>"
2509 "</leaf-list>"
2510 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002511 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002512 parsed = (struct lysp_node_leaflist *)siblings;
2513 assert_string_equal(parsed->name, "llist");
2514 assert_string_equal(parsed->type.name, "type");
2515 lysp_node_free(st->ctx, siblings);
2516 siblings = NULL;
2517
2518 /* invalid combinations */
2519 data = ELEMENT_WRAPPER_START
2520 "<leaf-list name=\"llist\">"
2521 "<max-elements value=\"5\"/>"
2522 "<min-elements value=\"15\"/>"
2523 "<type name=\"type\"/>"
2524 "</leaf-list>"
2525 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002526 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002527 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2528 lysp_node_free(st->ctx, siblings);
2529 siblings = NULL;
2530
2531 data = ELEMENT_WRAPPER_START
2532 "<leaf-list name=\"llist\">"
2533 "<default value=\"def-val1\"/>"
2534 "<min-elements value=\"15\"/>"
2535 "<type name=\"type\"/>"
2536 "</leaf-list>"
2537 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002538 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002539 logbuf_assert("Invalid combination of sub-elemnts \"min-elements\" and \"default\" in \"leaf-list\" element. Line number 1.");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002540 lysp_node_free(st->ctx, siblings);
2541 siblings = NULL;
2542
2543 data = ELEMENT_WRAPPER_START
2544 "<leaf-list name=\"llist\">"
2545 "</leaf-list>"
2546 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002547 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002548 logbuf_assert("Missing mandatory sub-element \"type\" of \"leaf-list\" element. Line number 1.");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002549 lysp_node_free(st->ctx, siblings);
2550 siblings = NULL;
2551
2552 st->finished_correctly = true;
2553}
2554
David Sedlákcb39f642019-07-19 13:19:55 +02002555static void
2556test_presence_elem(void **state)
2557{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002558 struct test_parser_yin_state *st = *state;
David Sedlákcb39f642019-07-19 13:19:55 +02002559 const char *data;
2560 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002561 struct lysp_ext_instance *exts = NULL;
2562
2563 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\">"EXT_SUBELEM"</presence>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002564 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02002565 assert_string_equal(val, "presence-val");
David Sedláke0ef1c62019-09-13 10:05:55 +02002566 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002567 assert_int_equal(exts[0].insubstmt_index, 0);
2568 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PRESENCE);
2569 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2570 FREE_STRING(st->ctx, val);
David Sedlákcb39f642019-07-19 13:19:55 +02002571
2572 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002573 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlákcb39f642019-07-19 13:19:55 +02002574 assert_string_equal(val, "presence-val");
2575 FREE_STRING(st->ctx, val);
2576
2577 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002578 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlákcb39f642019-07-19 13:19:55 +02002579 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2580
2581 st->finished_correctly = true;
2582}
2583
David Sedlák12470a82019-07-19 13:44:36 +02002584static void
2585test_key_elem(void **state)
2586{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002587 struct test_parser_yin_state *st = *state;
David Sedlák12470a82019-07-19 13:44:36 +02002588 const char *data;
2589 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002590 struct lysp_ext_instance *exts = NULL;
2591
2592 data = ELEMENT_WRAPPER_START "<key value=\"key-value\">"EXT_SUBELEM"</key>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002593 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02002594 assert_string_equal(val, "key-value");
David Sedláke0ef1c62019-09-13 10:05:55 +02002595 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002596 assert_int_equal(exts[0].insubstmt_index, 0);
2597 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_KEY);
2598 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2599 FREE_STRING(st->ctx, val);
David Sedlák12470a82019-07-19 13:44:36 +02002600
2601 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002602 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák12470a82019-07-19 13:44:36 +02002603 assert_string_equal(val, "key-value");
2604 FREE_STRING(st->ctx, val);
2605
2606 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002607 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák12470a82019-07-19 13:44:36 +02002608 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2609
2610 st->finished_correctly = true;
2611}
2612
David Sedlák04e17b22019-07-19 15:29:48 +02002613static void
2614test_typedef_elem(void **state)
2615{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002616 struct test_parser_yin_state *st = *state;
David Sedlák04e17b22019-07-19 15:29:48 +02002617 const char *data;
2618 struct lysp_tpdf *tpdfs = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002619 struct tree_node_meta typdef_meta = {NULL, (struct lysp_node **)&tpdfs};
David Sedlák04e17b22019-07-19 15:29:48 +02002620
2621 data = ELEMENT_WRAPPER_START
2622 "<typedef name=\"tpdf-name\">"
2623 "<default value=\"def-val\"/>"
2624 "<description><text>desc-text</text></description>"
2625 "<reference><text>ref-text</text></reference>"
2626 "<status value=\"current\"/>"
2627 "<type name=\"type\"/>"
2628 "<units name=\"uni\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002629 EXT_SUBELEM
David Sedlák04e17b22019-07-19 15:29:48 +02002630 "</typedef>"
2631 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002632 assert_int_equal(test_element_helper(st, data, &typdef_meta, NULL, NULL), LY_SUCCESS);
David Sedlák04e17b22019-07-19 15:29:48 +02002633 assert_string_equal(tpdfs[0].dflt, "def-val");
2634 assert_string_equal(tpdfs[0].dsc, "desc-text");
David Sedlák04e17b22019-07-19 15:29:48 +02002635 assert_string_equal(tpdfs[0].name, "tpdf-name");
2636 assert_string_equal(tpdfs[0].ref, "ref-text");
2637 assert_string_equal(tpdfs[0].type.name, "type");
2638 assert_string_equal(tpdfs[0].units, "uni");
2639 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
David Sedláke0ef1c62019-09-13 10:05:55 +02002640 assert_string_equal(tpdfs[0].exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002641 assert_int_equal(tpdfs[0].exts[0].insubstmt_index, 0);
2642 assert_int_equal(tpdfs[0].exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák04e17b22019-07-19 15:29:48 +02002643 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2644 tpdfs = NULL;
2645
2646 data = ELEMENT_WRAPPER_START
2647 "<typedef name=\"tpdf-name\">"
2648 "<type name=\"type\"/>"
2649 "</typedef>"
2650 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002651 assert_int_equal(test_element_helper(st, data, &typdef_meta, NULL, NULL), LY_SUCCESS);
David Sedlák04e17b22019-07-19 15:29:48 +02002652 assert_string_equal(tpdfs[0].name, "tpdf-name");
2653 assert_string_equal(tpdfs[0].type.name, "type");
2654 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2655 tpdfs = NULL;
2656
2657 st->finished_correctly = true;
2658}
2659
David Sedlákd2d676a2019-07-22 11:28:19 +02002660static void
2661test_refine_elem(void **state)
2662{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002663 struct test_parser_yin_state *st = *state;
David Sedlákd2d676a2019-07-22 11:28:19 +02002664 const char *data;
2665 struct lysp_refine *refines = NULL;
2666
2667 /* max subelems */
2668 data = ELEMENT_WRAPPER_START
2669 "<refine target-node=\"target\">"
2670 "<if-feature name=\"feature\" />"
2671 "<must condition=\"cond\" />"
2672 "<presence value=\"presence\" />"
2673 "<default value=\"def\" />"
2674 "<config value=\"true\" />"
2675 "<mandatory value=\"true\" />"
2676 "<min-elements value=\"10\" />"
2677 "<max-elements value=\"20\" />"
2678 "<description><text>desc</text></description>"
2679 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002680 EXT_SUBELEM
David Sedlákd2d676a2019-07-22 11:28:19 +02002681 "</refine>"
2682 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002683 assert_int_equal(test_element_helper(st, data, &refines, NULL, NULL), LY_SUCCESS);
David Sedlákd2d676a2019-07-22 11:28:19 +02002684 assert_string_equal(refines->nodeid, "target");
2685 assert_string_equal(*refines->dflts, "def");
2686 assert_string_equal(refines->dsc, "desc");
David Sedlákd2d676a2019-07-22 11:28:19 +02002687 assert_true(refines->flags & LYS_CONFIG_W);
2688 assert_true(refines->flags & LYS_MAND_TRUE);
2689 assert_string_equal(*refines->iffeatures, "feature");
2690 assert_int_equal(refines->max, 20);
2691 assert_int_equal(refines->min, 10);
2692 assert_string_equal(refines->musts->arg, "cond");
2693 assert_string_equal(refines->presence, "presence");
2694 assert_string_equal(refines->ref, "ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02002695 assert_string_equal(refines->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002696 assert_int_equal(refines->exts[0].insubstmt_index, 0);
2697 assert_int_equal(refines->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákd2d676a2019-07-22 11:28:19 +02002698 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2699 refines = NULL;
2700
2701 /* min subelems */
2702 data = ELEMENT_WRAPPER_START "<refine target-node=\"target\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002703 assert_int_equal(test_element_helper(st, data, &refines, NULL, NULL), LY_SUCCESS);
David Sedlákd2d676a2019-07-22 11:28:19 +02002704 assert_string_equal(refines->nodeid, "target");
2705 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2706 refines = NULL;
2707
2708 st->finished_correctly = true;
2709}
2710
David Sedlák0d6de5a2019-07-22 13:25:44 +02002711static void
2712test_uses_elem(void **state)
2713{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002714 struct test_parser_yin_state *st = *state;
David Sedlák0d6de5a2019-07-22 13:25:44 +02002715 const char *data;
2716 struct lysp_node *siblings = NULL;
2717 struct tree_node_meta node_meta = {NULL, &siblings};
2718 struct lysp_node_uses *parsed = NULL;
2719
2720 /* max subelems */
2721 data = ELEMENT_WRAPPER_START
2722 "<uses name=\"uses-name\">"
2723 "<when condition=\"cond\" />"
2724 "<if-feature name=\"feature\" />"
2725 "<status value=\"obsolete\" />"
2726 "<description><text>desc</text></description>"
2727 "<reference><text>ref</text></reference>"
2728 "<refine target-node=\"target\"/>"
David Sedlák992fb7c2019-07-24 16:51:01 +02002729 "<augment target-node=\"target\" />"
David Sedlákd1144562019-08-06 12:36:14 +02002730 EXT_SUBELEM
David Sedlák0d6de5a2019-07-22 13:25:44 +02002731 "</uses>"
2732 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002733 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002734 parsed = (struct lysp_node_uses *)&siblings[0];
2735 assert_string_equal(parsed->name, "uses-name");
2736 assert_string_equal(parsed->dsc, "desc");
David Sedlák0d6de5a2019-07-22 13:25:44 +02002737 assert_true(parsed->flags & LYS_STATUS_OBSLT);
2738 assert_string_equal(*parsed->iffeatures, "feature");
2739 assert_null(parsed->next);
2740 assert_int_equal(parsed->nodetype, LYS_USES);
2741 assert_null(parsed->parent);
2742 assert_string_equal(parsed->ref, "ref");
2743 assert_string_equal(parsed->refines->nodeid, "target");
2744 assert_string_equal(parsed->when->cond, "cond");
David Sedlák992fb7c2019-07-24 16:51:01 +02002745 assert_string_equal(parsed->augments->nodeid, "target");
David Sedláke0ef1c62019-09-13 10:05:55 +02002746 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002747 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2748 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002749 lysp_node_free(st->ctx, siblings);
2750 siblings = NULL;
2751
2752 /* min subelems */
2753 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002754 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002755 assert_string_equal(siblings[0].name, "uses-name");
2756 lysp_node_free(st->ctx, siblings);
2757 siblings = NULL;
2758
2759 st->finished_correctly = true;
2760}
2761
David Sedlákaa854b02019-07-22 14:17:10 +02002762static void
2763test_revision_elem(void **state)
2764{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002765 struct test_parser_yin_state *st = *state;
David Sedlákaa854b02019-07-22 14:17:10 +02002766 const char *data;
2767 struct lysp_revision *revs = NULL;
2768
2769 /* max subelems */
2770 data = ELEMENT_WRAPPER_START
2771 "<revision date=\"2018-12-25\">"
2772 "<description><text>desc</text></description>"
2773 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002774 EXT_SUBELEM
David Sedlákaa854b02019-07-22 14:17:10 +02002775 "</revision>"
2776 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002777 assert_int_equal(test_element_helper(st, data, &revs, NULL, NULL), LY_SUCCESS);
David Sedlákaa854b02019-07-22 14:17:10 +02002778 assert_string_equal(revs->date, "2018-12-25");
2779 assert_string_equal(revs->dsc, "desc");
2780 assert_string_equal(revs->ref, "ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02002781 assert_string_equal(revs->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002782 assert_int_equal(revs->exts[0].insubstmt_index, 0);
2783 assert_int_equal(revs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaa854b02019-07-22 14:17:10 +02002784 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2785 revs = NULL;
2786
2787 /* min subelems */
2788 data = ELEMENT_WRAPPER_START "<revision date=\"2005-05-05\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002789 assert_int_equal(test_element_helper(st, data, &revs, NULL, NULL), LY_SUCCESS);
David Sedlákaa854b02019-07-22 14:17:10 +02002790 assert_string_equal(revs->date, "2005-05-05");
2791 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2792 revs = NULL;
2793
2794 /* invalid value */
2795 data = ELEMENT_WRAPPER_START "<revision date=\"05-05-2005\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002796 assert_int_equal(test_element_helper(st, data, &revs, NULL, NULL), LY_EVALID);
David Sedlákaa854b02019-07-22 14:17:10 +02002797 logbuf_assert("Invalid value \"05-05-2005\" of \"revision\". Line number 1.");
2798 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2799 revs = NULL;
2800
2801 st->finished_correctly = true;
2802}
2803
David Sedlák0c2bab92019-07-22 15:33:19 +02002804static void
2805test_include_elem(void **state)
2806{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002807 struct test_parser_yin_state *st = *state;
David Sedlák0c2bab92019-07-22 15:33:19 +02002808 const char *data;
2809 struct lysp_include *includes = NULL;
2810 struct include_meta inc_meta = {"module-name", &includes};
2811
2812 /* max subelems */
2813 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2814 data = ELEMENT_WRAPPER_START
2815 "<include module=\"mod\">"
2816 "<description><text>desc</text></description>"
2817 "<reference><text>ref</text></reference>"
2818 "<revision-date date=\"1999-09-09\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002819 EXT_SUBELEM
David Sedlák0c2bab92019-07-22 15:33:19 +02002820 "</include>"
2821 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002822 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0c2bab92019-07-22 15:33:19 +02002823 assert_string_equal(includes->name, "mod");
2824 assert_string_equal(includes->dsc, "desc");
2825 assert_string_equal(includes->ref, "ref");
David Sedlák0c2bab92019-07-22 15:33:19 +02002826 assert_string_equal(includes->rev, "1999-09-09");
David Sedláke0ef1c62019-09-13 10:05:55 +02002827 assert_string_equal(includes->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002828 assert_int_equal(includes->exts[0].insubstmt_index, 0);
2829 assert_int_equal(includes->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0c2bab92019-07-22 15:33:19 +02002830 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2831 includes = NULL;
2832
2833 /* min subelems */
2834 data = ELEMENT_WRAPPER_START "<include module=\"mod\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002835 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0c2bab92019-07-22 15:33:19 +02002836 assert_string_equal(includes->name, "mod");
2837 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2838 includes = NULL;
2839
2840 /* invalid combinations */
2841 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2842 data = ELEMENT_WRAPPER_START
2843 "<include module=\"mod\">"
2844 "<description><text>desc</text></description>"
2845 "<revision-date date=\"1999-09-09\"/>"
2846 "</include>"
2847 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002848 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_EVALID);
David Sedlák0c2bab92019-07-22 15:33:19 +02002849 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.");
2850 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2851 includes = NULL;
2852
2853 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2854 data = ELEMENT_WRAPPER_START
2855 "<include module=\"mod\">"
2856 "<reference><text>ref</text></reference>"
2857 "<revision-date date=\"1999-09-09\"/>"
2858 "</include>"
2859 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002860 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_EVALID);
David Sedlák0c2bab92019-07-22 15:33:19 +02002861 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.");
2862 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2863 includes = NULL;
2864
2865 st->finished_correctly = true;
2866}
2867
David Sedlák5e13dea2019-07-22 16:06:45 +02002868static void
David Sedlákaf536aa2019-07-23 13:42:23 +02002869test_list_elem(void **state)
2870{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002871 struct test_parser_yin_state *st = *state;
David Sedlákaf536aa2019-07-23 13:42:23 +02002872 const char *data;
2873 struct lysp_node *siblings = NULL;
2874 struct tree_node_meta node_meta = {NULL, &siblings};
2875 struct lysp_node_list *parsed = NULL;
2876
2877 /* max subelems */
2878 data = ELEMENT_WRAPPER_START
2879 "<list name=\"list-name\">"
2880 "<when condition=\"when\"/>"
2881 "<if-feature name=\"iff\"/>"
2882 "<must condition=\"must-cond\"/>"
2883 "<key value=\"key\"/>"
2884 "<unique tag=\"utag\"/>"
2885 "<config value=\"true\"/>"
2886 "<min-elements value=\"10\"/>"
2887 "<ordered-by value=\"user\"/>"
2888 "<status value=\"deprecated\"/>"
2889 "<description><text>desc</text></description>"
2890 "<reference><text>ref</text></reference>"
2891 "<anydata name=\"anyd\"/>"
2892 "<anyxml name=\"anyx\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002893 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002894 "<choice name=\"choice\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02002895 "<action name=\"action\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002896 "<grouping name=\"grp\"/>"
David Sedlák031b9e72019-07-23 15:19:37 +02002897 "<notification name=\"notf\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002898 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2899 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002900 "<list name=\"sub-list\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002901 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002902 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002903 EXT_SUBELEM
David Sedlákaf536aa2019-07-23 13:42:23 +02002904 "</list>"
2905 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002906 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákaf536aa2019-07-23 13:42:23 +02002907 parsed = (struct lysp_node_list *)&siblings[0];
2908 assert_string_equal(parsed->dsc, "desc");
2909 assert_string_equal(parsed->child->name, "anyd");
2910 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2911 assert_string_equal(parsed->child->next->name, "anyx");
2912 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
David Sedlákf111bcb2019-07-23 17:15:51 +02002913 assert_string_equal(parsed->child->next->next->name, "cont");
2914 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002915 assert_string_equal(parsed->child->next->next->next->name, "choice");
2916 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
David Sedlák85d0eca2019-07-24 15:15:21 +02002917 assert_string_equal(parsed->child->next->next->next->next->name, "leaf");
2918 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAF);
2919 assert_string_equal(parsed->child->next->next->next->next->next->name, "llist");
2920 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2921 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "sub-list");
2922 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LIST);
2923 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "uses-name");
2924 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2925 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002926 assert_string_equal(parsed->groupings->name, "grp");
David Sedlák85d0eca2019-07-24 15:15:21 +02002927 assert_string_equal(parsed->actions->name, "action");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002928 assert_int_equal(parsed->groupings->nodetype, LYS_GROUPING);
David Sedlák031b9e72019-07-23 15:19:37 +02002929 assert_string_equal(parsed->notifs->name, "notf");
David Sedlákaf536aa2019-07-23 13:42:23 +02002930 assert_true(parsed->flags & LYS_ORDBY_USER);
2931 assert_true(parsed->flags & LYS_STATUS_DEPRC);
2932 assert_true(parsed->flags & LYS_CONFIG_W);
2933 assert_string_equal(*parsed->iffeatures, "iff");
2934 assert_string_equal(parsed->key, "key");
2935 assert_int_equal(parsed->min, 10);
2936 assert_string_equal(parsed->musts->arg, "must-cond");
2937 assert_string_equal(parsed->name, "list-name");
2938 assert_null(parsed->next);
2939 assert_int_equal(parsed->nodetype, LYS_LIST);
2940 assert_null(parsed->parent);
2941 assert_string_equal(parsed->ref, "ref");
2942 assert_string_equal(parsed->typedefs->name, "tpdf");
2943 assert_string_equal(*parsed->uniques, "utag");
2944 assert_string_equal(parsed->when->cond, "when");
David Sedláke0ef1c62019-09-13 10:05:55 +02002945 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002946 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2947 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaf536aa2019-07-23 13:42:23 +02002948 lysp_node_free(st->ctx, siblings);
2949 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
2950 siblings = NULL;
2951
2952 /* min subelems */
2953 data = ELEMENT_WRAPPER_START "<list name=\"list-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002954 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákaf536aa2019-07-23 13:42:23 +02002955 parsed = (struct lysp_node_list *)&siblings[0];
2956 assert_string_equal(parsed->name, "list-name");
2957 lysp_node_free(st->ctx, siblings);
2958 siblings = NULL;
2959
2960 st->finished_correctly = true;
2961}
2962
David Sedlák031b9e72019-07-23 15:19:37 +02002963static void
2964test_notification_elem(void **state)
2965{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002966 struct test_parser_yin_state *st = *state;
David Sedlák031b9e72019-07-23 15:19:37 +02002967 const char *data;
2968 struct lysp_notif *notifs = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002969 struct tree_node_meta notif_meta = {NULL, (struct lysp_node **)&notifs};
David Sedlák031b9e72019-07-23 15:19:37 +02002970
2971 /* max subelems */
2972 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2973 data = ELEMENT_WRAPPER_START
2974 "<notification name=\"notif-name\">"
2975 "<anydata name=\"anyd\"/>"
2976 "<anyxml name=\"anyx\"/>"
2977 "<description><text>desc</text></description>"
2978 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002979 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2980 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák031b9e72019-07-23 15:19:37 +02002981 "<list name=\"sub-list\"/>"
2982 "<must condition=\"cond\"/>"
2983 "<reference><text>ref</text></reference>"
2984 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002985 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák031b9e72019-07-23 15:19:37 +02002986 "<uses name=\"uses-name\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002987 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002988 "<choice name=\"choice\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002989 "<grouping name=\"grp\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002990 EXT_SUBELEM
David Sedlák031b9e72019-07-23 15:19:37 +02002991 "</notification>"
2992 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002993 assert_int_equal(test_element_helper(st, data, &notif_meta, NULL, NULL), LY_SUCCESS);
David Sedlák031b9e72019-07-23 15:19:37 +02002994 assert_string_equal(notifs->name, "notif-name");
2995 assert_string_equal(notifs->data->name, "anyd");
2996 assert_int_equal(notifs->data->nodetype, LYS_ANYDATA);
2997 assert_string_equal(notifs->data->next->name, "anyx");
2998 assert_int_equal(notifs->data->next->nodetype, LYS_ANYXML);
2999 assert_string_equal(notifs->data->next->next->name, "leaf");
3000 assert_int_equal(notifs->data->next->next->nodetype, LYS_LEAF);
3001 assert_string_equal(notifs->data->next->next->next->name, "llist");
3002 assert_int_equal(notifs->data->next->next->next->nodetype, LYS_LEAFLIST);
3003 assert_string_equal(notifs->data->next->next->next->next->name, "sub-list");
3004 assert_int_equal(notifs->data->next->next->next->next->nodetype, LYS_LIST);
David Sedlák031b9e72019-07-23 15:19:37 +02003005 assert_true(notifs->flags & LYS_STATUS_DEPRC);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003006 assert_string_equal(notifs->groupings->name, "grp");
3007 assert_int_equal(notifs->groupings->nodetype, LYS_GROUPING);
David Sedlákf111bcb2019-07-23 17:15:51 +02003008 assert_string_equal(notifs->data->next->next->next->next->next->name, "uses-name");
3009 assert_int_equal(notifs->data->next->next->next->next->next->nodetype, LYS_USES);
3010 assert_string_equal(notifs->data->next->next->next->next->next->next->name, "cont");
3011 assert_int_equal(notifs->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003012 assert_int_equal(notifs->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3013 assert_string_equal(notifs->data->next->next->next->next->next->next->next->name, "choice");
3014 assert_null(notifs->data->next->next->next->next->next->next->next->next);
David Sedlák031b9e72019-07-23 15:19:37 +02003015 assert_string_equal(*notifs->iffeatures, "iff");
3016 assert_string_equal(notifs->musts->arg, "cond");
3017 assert_int_equal(notifs->nodetype, LYS_NOTIF);
3018 assert_null(notifs->parent);
3019 assert_string_equal(notifs->ref, "ref");
3020 assert_string_equal(notifs->typedefs->name, "tpdf");
David Sedláke0ef1c62019-09-13 10:05:55 +02003021 assert_string_equal(notifs->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003022 assert_int_equal(notifs->exts[0].insubstmt_index, 0);
3023 assert_int_equal(notifs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák031b9e72019-07-23 15:19:37 +02003024 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
3025 notifs = NULL;
3026
3027 /* min subelems */
3028 data = ELEMENT_WRAPPER_START "<notification name=\"notif-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003029 assert_int_equal(test_element_helper(st, data, &notif_meta, NULL, NULL), LY_SUCCESS);
David Sedlák031b9e72019-07-23 15:19:37 +02003030 assert_string_equal(notifs->name, "notif-name");
3031 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003032 notifs = NULL;
3033
3034 st->finished_correctly = true;
3035}
3036
3037static void
3038test_grouping_elem(void **state)
3039{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003040 struct test_parser_yin_state *st = *state;
David Sedláke3ce9ef2019-07-23 16:34:30 +02003041 const char *data;
3042 struct lysp_grp *grps = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02003043 struct tree_node_meta grp_meta = {NULL, (struct lysp_node **)&grps};
David Sedláke3ce9ef2019-07-23 16:34:30 +02003044
3045 /* max subelems */
3046 data = ELEMENT_WRAPPER_START
3047 "<grouping name=\"grp-name\">"
3048 "<anydata name=\"anyd\"/>"
3049 "<anyxml name=\"anyx\"/>"
3050 "<description><text>desc</text></description>"
3051 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003052 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3053 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003054 "<list name=\"list\"/>"
3055 "<notification name=\"notf\"/>"
3056 "<reference><text>ref</text></reference>"
3057 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003058 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003059 "<uses name=\"uses-name\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003060 "<action name=\"act\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02003061 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003062 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003063 EXT_SUBELEM
David Sedláke3ce9ef2019-07-23 16:34:30 +02003064 "</grouping>"
3065 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003066 assert_int_equal(test_element_helper(st, data, &grp_meta, NULL, NULL), LY_SUCCESS);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003067 assert_string_equal(grps->name, "grp-name");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003068 assert_string_equal(grps->data->name, "anyd");
3069 assert_string_equal(grps->data->next->name, "anyx");
3070 assert_string_equal(grps->data->next->next->name, "leaf");
3071 assert_string_equal(grps->data->next->next->next->name, "llist");
3072 assert_string_equal(grps->data->next->next->next->next->name, "list");
3073 assert_string_equal(grps->dsc, "desc");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003074 assert_true(grps->flags & LYS_STATUS_CURR);
3075 assert_string_equal(grps->groupings->name, "sub-grp");
3076 assert_int_equal(grps->nodetype, LYS_GROUPING);
3077 assert_string_equal(grps->notifs->name, "notf");
3078 assert_null(grps->parent);
3079 assert_string_equal(grps->ref, "ref");
3080 assert_string_equal(grps->typedefs->name, "tpdf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003081 assert_string_equal(grps->actions->name, "act");
David Sedlákf111bcb2019-07-23 17:15:51 +02003082 assert_string_equal(grps->data->next->next->next->next->next->name, "uses-name");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003083 assert_int_equal(grps->data->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákf111bcb2019-07-23 17:15:51 +02003084 assert_string_equal(grps->data->next->next->next->next->next->next->name, "cont");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003085 assert_int_equal(grps->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
3086 assert_string_equal(grps->data->next->next->next->next->next->next->next->name, "choice");
3087 assert_int_equal(grps->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
David Sedláke0ef1c62019-09-13 10:05:55 +02003088 assert_string_equal(grps->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003089 assert_int_equal(grps->exts[0].insubstmt_index, 0);
3090 assert_int_equal(grps->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003091 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3092 grps = NULL;
3093
3094 /* min subelems */
3095 data = ELEMENT_WRAPPER_START "<grouping name=\"grp-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003096 assert_int_equal(test_element_helper(st, data, &grp_meta, NULL, NULL), LY_SUCCESS);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003097 assert_string_equal(grps->name, "grp-name");
3098 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3099 grps = NULL;
David Sedlák031b9e72019-07-23 15:19:37 +02003100
3101 st->finished_correctly = true;
3102}
3103
David Sedlákf111bcb2019-07-23 17:15:51 +02003104static void
3105test_container_elem(void **state)
3106{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003107 struct test_parser_yin_state *st = *state;
David Sedlákf111bcb2019-07-23 17:15:51 +02003108 const char *data;
3109 struct lysp_node *siblings = NULL;
3110 struct tree_node_meta node_meta = {NULL, &siblings};
3111 struct lysp_node_container *parsed = NULL;
3112
3113 /* max subelems */
David Sedláke2dc9e92019-07-24 09:59:21 +02003114 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3115 data = ELEMENT_WRAPPER_START
3116 "<container name=\"cont-name\">"
3117 "<anydata name=\"anyd\"/>"
3118 "<anyxml name=\"anyx\"/>"
3119 "<config value=\"true\"/>"
3120 "<container name=\"subcont\"/>"
3121 "<description><text>desc</text></description>"
3122 "<grouping name=\"sub-grp\"/>"
3123 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003124 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3125 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003126 "<list name=\"list\"/>"
3127 "<must condition=\"cond\"/>"
3128 "<notification name=\"notf\"/>"
3129 "<presence value=\"presence\"/>"
3130 "<reference><text>ref</text></reference>"
3131 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003132 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003133 "<uses name=\"uses-name\"/>"
3134 "<when condition=\"when-cond\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003135 "<action name=\"act\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003136 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003137 EXT_SUBELEM
David Sedláke2dc9e92019-07-24 09:59:21 +02003138 "</container>"
3139 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003140 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedláke2dc9e92019-07-24 09:59:21 +02003141 parsed = (struct lysp_node_container *)siblings;
3142 assert_string_equal(parsed->name, "cont-name");
3143 assert_null(parsed->parent);
3144 assert_int_equal(parsed->nodetype, LYS_CONTAINER);
3145 assert_true(parsed->flags & LYS_CONFIG_W);
3146 assert_true(parsed->flags & LYS_STATUS_CURR);
3147 assert_null(parsed->next);
3148 assert_string_equal(parsed->dsc, "desc");
3149 assert_string_equal(parsed->ref, "ref");
3150 assert_string_equal(parsed->when->cond, "when-cond");
3151 assert_string_equal(*parsed->iffeatures, "iff");
David Sedláke2dc9e92019-07-24 09:59:21 +02003152 assert_string_equal(parsed->musts->arg, "cond");
3153 assert_string_equal(parsed->presence, "presence");
3154 assert_string_equal(parsed->typedefs->name, "tpdf");
3155 assert_string_equal(parsed->groupings->name, "sub-grp");
3156 assert_string_equal(parsed->child->name, "anyd");
3157 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3158 assert_string_equal(parsed->child->next->name, "anyx");
3159 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3160 assert_string_equal(parsed->child->next->next->name, "subcont");
3161 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3162 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3163 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3164 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3165 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3166 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3167 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3168 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3169 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003170 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3171 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3172 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke2dc9e92019-07-24 09:59:21 +02003173 assert_string_equal(parsed->notifs->name, "notf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003174 assert_string_equal(parsed->actions->name, "act");
David Sedláke0ef1c62019-09-13 10:05:55 +02003175 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003176 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3177 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke2dc9e92019-07-24 09:59:21 +02003178 lysp_node_free(st->ctx, siblings);
3179 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
3180 siblings = NULL;
David Sedlákf111bcb2019-07-23 17:15:51 +02003181
3182 /* min subelems */
3183 data = ELEMENT_WRAPPER_START "<container name=\"cont-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003184 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákf111bcb2019-07-23 17:15:51 +02003185 parsed = (struct lysp_node_container *)siblings;
3186 assert_string_equal(parsed->name, "cont-name");
3187 lysp_node_free(st->ctx, siblings);
3188 siblings = NULL;
3189
3190 st->finished_correctly = true;
3191}
3192
David Sedlák5379d392019-07-24 10:42:03 +02003193static void
3194test_case_elem(void **state)
3195{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003196 struct test_parser_yin_state *st = *state;
David Sedlák5379d392019-07-24 10:42:03 +02003197 const char *data;
3198 struct lysp_node *siblings = NULL;
3199 struct tree_node_meta node_meta = {NULL, &siblings};
3200 struct lysp_node_case *parsed = NULL;
3201
3202 /* max subelems */
3203 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3204 data = ELEMENT_WRAPPER_START
3205 "<case name=\"case-name\">"
3206 "<anydata name=\"anyd\"/>"
3207 "<anyxml name=\"anyx\"/>"
3208 "<container name=\"subcont\"/>"
3209 "<description><text>desc</text></description>"
3210 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003211 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3212 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák5379d392019-07-24 10:42:03 +02003213 "<list name=\"list\"/>"
3214 "<reference><text>ref</text></reference>"
3215 "<status value=\"current\"/>"
3216 "<uses name=\"uses-name\"/>"
3217 "<when condition=\"when-cond\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003218 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003219 EXT_SUBELEM
David Sedlák5379d392019-07-24 10:42:03 +02003220 "</case>"
3221 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003222 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák5379d392019-07-24 10:42:03 +02003223 parsed = (struct lysp_node_case *)siblings;
3224 assert_string_equal(parsed->name, "case-name");
3225 assert_null(parsed->parent);
3226 assert_int_equal(parsed->nodetype, LYS_CASE);
3227 assert_true(parsed->flags & LYS_STATUS_CURR);
3228 assert_null(parsed->next);
3229 assert_string_equal(parsed->dsc, "desc");
3230 assert_string_equal(parsed->ref, "ref");
3231 assert_string_equal(parsed->when->cond, "when-cond");
3232 assert_string_equal(*parsed->iffeatures, "iff");
David Sedlák5379d392019-07-24 10:42:03 +02003233 assert_string_equal(parsed->child->name, "anyd");
3234 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3235 assert_string_equal(parsed->child->next->name, "anyx");
3236 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3237 assert_string_equal(parsed->child->next->next->name, "subcont");
3238 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3239 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3240 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3241 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3242 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3243 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3244 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3245 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3246 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003247 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3248 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3249 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003250 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003251 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3252 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák5379d392019-07-24 10:42:03 +02003253 lysp_node_free(st->ctx, siblings);
3254 siblings = NULL;
3255
3256 /* min subelems */
3257 data = ELEMENT_WRAPPER_START "<case name=\"case-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003258 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák5379d392019-07-24 10:42:03 +02003259 parsed = (struct lysp_node_case *)siblings;
3260 assert_string_equal(parsed->name, "case-name");
3261 lysp_node_free(st->ctx, siblings);
3262 siblings = NULL;
3263
3264 st->finished_correctly = true;
3265}
3266
David Sedlákb7abcfa2019-07-24 12:33:35 +02003267static void
3268test_choice_elem(void **state)
3269{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003270 struct test_parser_yin_state *st = *state;
David Sedlákb7abcfa2019-07-24 12:33:35 +02003271 const char *data;
3272 struct lysp_node *siblings = NULL;
3273 struct tree_node_meta node_meta = {NULL, &siblings};
3274 struct lysp_node_choice *parsed = NULL;
3275
3276 /* max subelems */
3277 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3278 data = ELEMENT_WRAPPER_START
3279 "<choice name=\"choice-name\">"
3280 "<anydata name=\"anyd\"/>"
3281 "<anyxml name=\"anyx\"/>"
3282 "<case name=\"sub-case\"/>"
3283 "<choice name=\"choice\"/>"
3284 "<config value=\"true\"/>"
3285 "<container name=\"subcont\"/>"
3286 "<default value=\"def\"/>"
3287 "<description><text>desc</text></description>"
3288 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003289 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3290 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003291 "<list name=\"list\"/>"
3292 "<mandatory value=\"true\" />"
3293 "<reference><text>ref</text></reference>"
3294 "<status value=\"current\"/>"
3295 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003296 EXT_SUBELEM
David Sedlákb7abcfa2019-07-24 12:33:35 +02003297 "</choice>"
3298 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003299 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003300 parsed = (struct lysp_node_choice *)siblings;
3301 assert_string_equal(parsed->name, "choice-name");
3302 assert_null(parsed->parent);
3303 assert_int_equal(parsed->nodetype, LYS_CHOICE);
3304 assert_true(parsed->flags & LYS_CONFIG_W && parsed->flags & LYS_MAND_TRUE && parsed->flags & LYS_STATUS_CURR);
3305 assert_null(parsed->next);
3306 assert_string_equal(parsed->dsc, "desc");
3307 assert_string_equal(parsed->ref, "ref");
3308 assert_string_equal(parsed->when->cond, "when-cond");
3309 assert_string_equal(*parsed->iffeatures, "iff");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003310 assert_string_equal(parsed->child->name, "anyd");
3311 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3312 assert_string_equal(parsed->child->next->name, "anyx");
3313 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3314 assert_string_equal(parsed->child->next->next->name, "sub-case");
3315 assert_int_equal(parsed->child->next->next->nodetype, LYS_CASE);
3316 assert_string_equal(parsed->child->next->next->next->name, "choice");
3317 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
3318 assert_string_equal(parsed->child->next->next->next->next->name, "subcont");
3319 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_CONTAINER);
3320 assert_string_equal(parsed->child->next->next->next->next->next->name, "leaf");
3321 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAF);
3322 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "llist");
3323 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3324 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "list");
3325 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3326 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003327 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003328 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3329 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003330 lysp_node_free(st->ctx, siblings);
3331 siblings = NULL;
3332
3333 /* min subelems */
3334 data = ELEMENT_WRAPPER_START "<choice name=\"choice-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003335 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003336 parsed = (struct lysp_node_choice *)siblings;
3337 assert_string_equal(parsed->name, "choice-name");
3338 lysp_node_free(st->ctx, siblings);
3339 siblings = NULL;
3340
3341 st->finished_correctly = true;
3342}
3343
David Sedlák05404f62019-07-24 14:11:53 +02003344static void
3345test_inout_elem(void **state)
3346{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003347 struct test_parser_yin_state *st = *state;
David Sedlák05404f62019-07-24 14:11:53 +02003348 const char *data;
3349 struct lysp_action_inout inout = {};
3350 struct inout_meta inout_meta = {NULL, &inout};
3351
3352 /* max subelements */
3353 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3354 data = ELEMENT_WRAPPER_START
3355 "<input>"
3356 "<anydata name=\"anyd\"/>"
3357 "<anyxml name=\"anyx\"/>"
3358 "<choice name=\"choice\"/>"
3359 "<container name=\"subcont\"/>"
3360 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003361 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3362 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003363 "<list name=\"list\"/>"
3364 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003365 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003366 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003367 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003368 "</input>"
3369 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003370 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
David Sedlák05404f62019-07-24 14:11:53 +02003371 assert_null(inout.parent);
3372 assert_int_equal(inout.nodetype, LYS_INPUT);
3373 assert_string_equal(inout.musts->arg, "cond");
3374 assert_string_equal(inout.typedefs->name, "tpdf");
3375 assert_string_equal(inout.groupings->name, "sub-grp");
3376 assert_string_equal(inout.data->name, "anyd");
3377 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3378 assert_string_equal(inout.data->next->name, "anyx");
3379 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3380 assert_string_equal(inout.data->next->next->name, "choice");
3381 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3382 assert_string_equal(inout.data->next->next->next->name, "subcont");
3383 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3384 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3385 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3386 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3387 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3388 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3389 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3390 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3391 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3392 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003393 assert_string_equal(inout.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003394 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3395 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003396 lysp_action_inout_free(st->ctx, &inout);
3397 memset(&inout, 0, sizeof inout);
3398
3399 /* max subelements */
3400 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3401 data = ELEMENT_WRAPPER_START
3402 "<output>"
3403 "<anydata name=\"anyd\"/>"
3404 "<anyxml name=\"anyx\"/>"
3405 "<choice name=\"choice\"/>"
3406 "<container name=\"subcont\"/>"
3407 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003408 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3409 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003410 "<list name=\"list\"/>"
3411 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003412 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003413 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003414 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003415 "</output>"
3416 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003417 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
David Sedlák05404f62019-07-24 14:11:53 +02003418 assert_null(inout.parent);
3419 assert_int_equal(inout.nodetype, LYS_OUTPUT);
3420 assert_string_equal(inout.musts->arg, "cond");
3421 assert_string_equal(inout.typedefs->name, "tpdf");
3422 assert_string_equal(inout.groupings->name, "sub-grp");
3423 assert_string_equal(inout.data->name, "anyd");
3424 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3425 assert_string_equal(inout.data->next->name, "anyx");
3426 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3427 assert_string_equal(inout.data->next->next->name, "choice");
3428 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3429 assert_string_equal(inout.data->next->next->next->name, "subcont");
3430 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3431 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3432 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3433 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3434 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3435 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3436 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3437 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3438 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3439 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003440 assert_string_equal(inout.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003441 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3442 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003443 lysp_action_inout_free(st->ctx, &inout);
3444 memset(&inout, 0, sizeof inout);
3445
3446 /* min subelems */
Michal Vaskob83af8a2020-01-06 09:49:22 +01003447 data = ELEMENT_WRAPPER_START "<input><leaf name=\"l\"><type name=\"empty\"/></leaf></input>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003448 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
Michal Vaskob83af8a2020-01-06 09:49:22 +01003449 lysp_action_inout_free(st->ctx, &inout);
David Sedlák05404f62019-07-24 14:11:53 +02003450 memset(&inout, 0, sizeof inout);
3451
Michal Vaskob83af8a2020-01-06 09:49:22 +01003452 data = ELEMENT_WRAPPER_START "<output><leaf name=\"l\"><type name=\"empty\"/></leaf></output>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003453 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
Michal Vaskob83af8a2020-01-06 09:49:22 +01003454 lysp_action_inout_free(st->ctx, &inout);
David Sedlák05404f62019-07-24 14:11:53 +02003455 memset(&inout, 0, sizeof inout);
3456
3457 /* invalid combinations */
3458 data = ELEMENT_WRAPPER_START "<input name=\"test\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003459 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02003460 logbuf_assert("Unexpected attribute \"name\" of \"input\" element. Line number 1.");
David Sedlák05404f62019-07-24 14:11:53 +02003461 memset(&inout, 0, sizeof inout);
3462
3463 st->finished_correctly = true;
3464}
3465
David Sedlák85d0eca2019-07-24 15:15:21 +02003466static void
3467test_action_elem(void **state)
3468{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003469 struct test_parser_yin_state *st = *state;
David Sedlák85d0eca2019-07-24 15:15:21 +02003470 const char *data;
3471 struct lysp_action *actions = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02003472 struct tree_node_meta act_meta = {NULL, (struct lysp_node **)&actions};
David Sedlák85d0eca2019-07-24 15:15:21 +02003473
3474 /* max subelems */
3475 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3476 data = ELEMENT_WRAPPER_START
3477 "<action name=\"act\">"
3478 "<description><text>desc</text></description>"
3479 "<grouping name=\"grouping\"/>"
3480 "<if-feature name=\"iff\"/>"
3481 "<input><uses name=\"uses-name\"/></input>"
Michal Vaskob83af8a2020-01-06 09:49:22 +01003482 "<output><must condition=\"cond\"/><leaf name=\"l\"><type name=\"type\"/></leaf></output>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003483 "<reference><text>ref</text></reference>"
3484 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003485 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003486 EXT_SUBELEM
David Sedlák85d0eca2019-07-24 15:15:21 +02003487 "</action>"
3488 ELEMENT_WRAPPER_END;
Michal Vasko1bf09392020-03-27 12:38:10 +01003489 /* there must be parent for action */
3490 act_meta.parent = NULL + 1;
Michal Vaskob36053d2020-03-26 15:49:30 +01003491 assert_int_equal(test_element_helper(st, data, &act_meta, NULL, NULL), LY_SUCCESS);
Michal Vasko1bf09392020-03-27 12:38:10 +01003492 act_meta.parent = NULL;
3493 assert_non_null(actions->parent);
David Sedlák85d0eca2019-07-24 15:15:21 +02003494 assert_int_equal(actions->nodetype, LYS_ACTION);
3495 assert_true(actions->flags & LYS_STATUS_DEPRC);
3496 assert_string_equal(actions->name, "act");
3497 assert_string_equal(actions->dsc, "desc");
3498 assert_string_equal(actions->ref, "ref");
3499 assert_string_equal(*actions->iffeatures, "iff");
3500 assert_string_equal(actions->typedefs->name, "tpdf");
3501 assert_string_equal(actions->groupings->name, "grouping");
3502 assert_string_equal(actions->input.data->name, "uses-name");
3503 assert_string_equal(actions->output.musts->arg, "cond");
David Sedláke0ef1c62019-09-13 10:05:55 +02003504 assert_string_equal(actions->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003505 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3506 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák85d0eca2019-07-24 15:15:21 +02003507 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3508 actions = NULL;
3509
David Sedlákeaa45792019-07-24 15:25:01 +02003510 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3511 data = ELEMENT_WRAPPER_START
3512 "<rpc name=\"act\">"
3513 "<description><text>desc</text></description>"
3514 "<grouping name=\"grouping\"/>"
3515 "<if-feature name=\"iff\"/>"
3516 "<input><uses name=\"uses-name\"/></input>"
Michal Vaskob83af8a2020-01-06 09:49:22 +01003517 "<output><must condition=\"cond\"/><leaf name=\"l\"><type name=\"type\"/></leaf></output>"
David Sedlákeaa45792019-07-24 15:25:01 +02003518 "<reference><text>ref</text></reference>"
3519 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003520 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003521 EXT_SUBELEM
David Sedlákeaa45792019-07-24 15:25:01 +02003522 "</rpc>"
3523 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003524 assert_int_equal(test_element_helper(st, data, &act_meta, NULL, NULL), LY_SUCCESS);
David Sedlákeaa45792019-07-24 15:25:01 +02003525 assert_null(actions->parent);
Michal Vasko1bf09392020-03-27 12:38:10 +01003526 assert_int_equal(actions->nodetype, LYS_RPC);
David Sedlákeaa45792019-07-24 15:25:01 +02003527 assert_true(actions->flags & LYS_STATUS_DEPRC);
3528 assert_string_equal(actions->name, "act");
3529 assert_string_equal(actions->dsc, "desc");
3530 assert_string_equal(actions->ref, "ref");
3531 assert_string_equal(*actions->iffeatures, "iff");
3532 assert_string_equal(actions->typedefs->name, "tpdf");
3533 assert_string_equal(actions->groupings->name, "grouping");
3534 assert_string_equal(actions->input.data->name, "uses-name");
3535 assert_string_equal(actions->output.musts->arg, "cond");
David Sedláke0ef1c62019-09-13 10:05:55 +02003536 assert_string_equal(actions->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003537 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3538 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákeaa45792019-07-24 15:25:01 +02003539 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3540 actions = NULL;
3541
David Sedlák85d0eca2019-07-24 15:15:21 +02003542 /* min subelems */
3543 data = ELEMENT_WRAPPER_START "<action name=\"act\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003544 assert_int_equal(test_element_helper(st, data, &act_meta, NULL, NULL), LY_SUCCESS);
David Sedlák85d0eca2019-07-24 15:15:21 +02003545 assert_string_equal(actions->name, "act");
3546 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3547 actions = NULL;
3548
3549 st->finished_correctly = true;
3550}
3551
David Sedlák992fb7c2019-07-24 16:51:01 +02003552static void
3553test_augment_elem(void **state)
3554{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003555 struct test_parser_yin_state *st = *state;
David Sedlák992fb7c2019-07-24 16:51:01 +02003556 const char *data;
3557 struct lysp_augment *augments = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02003558 struct tree_node_meta aug_meta = {NULL, (struct lysp_node **)&augments};
David Sedlák992fb7c2019-07-24 16:51:01 +02003559
3560 st->yin_ctx->mod_version = LYS_VERSION_1_1;
3561 data = ELEMENT_WRAPPER_START
3562 "<augment target-node=\"target\">"
3563 "<action name=\"action\"/>"
3564 "<anydata name=\"anyd\"/>"
3565 "<anyxml name=\"anyx\"/>"
3566 "<case name=\"case\"/>"
3567 "<choice name=\"choice\"/>"
3568 "<container name=\"subcont\"/>"
3569 "<description><text>desc</text></description>"
3570 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003571 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3572 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák992fb7c2019-07-24 16:51:01 +02003573 "<list name=\"list\"/>"
3574 "<notification name=\"notif\"/>"
3575 "<reference><text>ref</text></reference>"
3576 "<status value=\"current\"/>"
3577 "<uses name=\"uses\"/>"
3578 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003579 EXT_SUBELEM
David Sedlák992fb7c2019-07-24 16:51:01 +02003580 "</augment>"
3581 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003582 assert_int_equal(test_element_helper(st, data, &aug_meta, NULL, NULL), LY_SUCCESS);
David Sedlák992fb7c2019-07-24 16:51:01 +02003583 assert_string_equal(augments->nodeid, "target");
3584 assert_null(augments->parent);
3585 assert_int_equal(augments->nodetype, LYS_AUGMENT);
3586 assert_true(augments->flags & LYS_STATUS_CURR);
3587 assert_string_equal(augments->dsc, "desc");
3588 assert_string_equal(augments->ref, "ref");
3589 assert_string_equal(augments->when->cond, "when-cond");
3590 assert_string_equal(*augments->iffeatures, "iff");
3591 assert_string_equal(augments->child->name, "anyd");
3592 assert_int_equal(augments->child->nodetype, LYS_ANYDATA);
3593 assert_string_equal(augments->child->next->name, "anyx");
3594 assert_int_equal(augments->child->next->nodetype, LYS_ANYXML);
3595 assert_string_equal(augments->child->next->next->name, "case");
3596 assert_int_equal(augments->child->next->next->nodetype, LYS_CASE);
3597 assert_string_equal(augments->child->next->next->next->name, "choice");
3598 assert_int_equal(augments->child->next->next->next->nodetype, LYS_CHOICE);
3599 assert_string_equal(augments->child->next->next->next->next->name, "subcont");
3600 assert_int_equal(augments->child->next->next->next->next->nodetype, LYS_CONTAINER);
3601 assert_string_equal(augments->child->next->next->next->next->next->name, "leaf");
3602 assert_int_equal(augments->child->next->next->next->next->next->nodetype, LYS_LEAF);
3603 assert_string_equal(augments->child->next->next->next->next->next->next->name, "llist");
3604 assert_int_equal(augments->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3605 assert_string_equal(augments->child->next->next->next->next->next->next->next->name, "list");
3606 assert_int_equal(augments->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3607 assert_string_equal(augments->child->next->next->next->next->next->next->next->next->name, "uses");
3608 assert_int_equal(augments->child->next->next->next->next->next->next->next->next->nodetype, LYS_USES);
3609 assert_null(augments->child->next->next->next->next->next->next->next->next->next);
3610 assert_string_equal(augments->actions->name, "action");
3611 assert_string_equal(augments->notifs->name, "notif");
David Sedláke0ef1c62019-09-13 10:05:55 +02003612 assert_string_equal(augments->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003613 assert_int_equal(augments->exts[0].insubstmt_index, 0);
3614 assert_int_equal(augments->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák992fb7c2019-07-24 16:51:01 +02003615 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3616 augments = NULL;
3617
3618 data = ELEMENT_WRAPPER_START "<augment target-node=\"target\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003619 assert_int_equal(test_element_helper(st, data, &aug_meta, NULL, NULL), LY_SUCCESS);
David Sedlák992fb7c2019-07-24 16:51:01 +02003620 assert_string_equal(augments->nodeid, "target");
3621 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3622 augments = NULL;
3623
3624 st->finished_correctly = true;
3625}
3626
David Sedlák4ffcec82019-07-25 15:10:21 +02003627static void
3628test_deviate_elem(void **state)
3629{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003630 struct test_parser_yin_state *st = *state;
David Sedlák4ffcec82019-07-25 15:10:21 +02003631 const char *data;
3632 struct lysp_deviate *deviates = NULL;
3633 struct lysp_deviate_add *d_add;
3634 struct lysp_deviate_rpl *d_rpl;
3635 struct lysp_deviate_del *d_del;
3636
3637 /* all valid arguments with min subelems */
3638 data = ELEMENT_WRAPPER_START "<deviate value=\"not-supported\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003639 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003640 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
3641 lysp_deviate_free(st->ctx, deviates);
3642 free(deviates);
3643 deviates = NULL;
3644
3645 data = ELEMENT_WRAPPER_START "<deviate value=\"add\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003646 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003647 assert_int_equal(deviates->mod, LYS_DEV_ADD);
3648 lysp_deviate_free(st->ctx, deviates);
3649 free(deviates);
3650 deviates = NULL;
3651
3652 data = ELEMENT_WRAPPER_START "<deviate value=\"replace\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003653 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003654 assert_int_equal(deviates->mod, LYS_DEV_REPLACE);
3655 lysp_deviate_free(st->ctx, deviates);
3656 free(deviates);
3657 deviates = NULL;
3658
3659 data = ELEMENT_WRAPPER_START "<deviate value=\"delete\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003660 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003661 assert_int_equal(deviates->mod, LYS_DEV_DELETE);
3662 lysp_deviate_free(st->ctx, deviates);
3663 free(deviates);
3664 deviates = NULL;
3665
3666 /* max subelems and valid arguments */
3667 data = ELEMENT_WRAPPER_START
3668 "<deviate value=\"not-supported\">"
David Sedlákd1144562019-08-06 12:36:14 +02003669 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003670 "</deviate>"
3671 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003672 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003673 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
David Sedláke0ef1c62019-09-13 10:05:55 +02003674 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003675 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3676 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003677 lysp_deviate_free(st->ctx, deviates);
3678 free(deviates);
3679 deviates = NULL;
3680
3681 data = ELEMENT_WRAPPER_START
3682 "<deviate value=\"add\">"
3683 "<units name=\"units\"/>"
3684 "<must condition=\"cond\"/>"
3685 "<unique tag=\"utag\"/>"
3686 "<default value=\"def\"/>"
3687 "<config value=\"true\"/>"
3688 "<mandatory value=\"true\"/>"
3689 "<min-elements value=\"5\"/>"
3690 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003691 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003692 "</deviate>"
3693 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003694 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003695 d_add = (struct lysp_deviate_add *)deviates;
3696 assert_int_equal(d_add->mod, LYS_DEV_ADD);
3697 assert_null(d_add->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003698 assert_string_equal(d_add->units, "units");
3699 assert_string_equal(d_add->musts->arg, "cond");
3700 assert_string_equal(*d_add->uniques, "utag");
3701 assert_string_equal(*d_add->dflts, "def");
3702 assert_true(d_add->flags & LYS_MAND_TRUE && d_add->flags & LYS_CONFIG_W);
3703 assert_int_equal(d_add->min, 5);
3704 assert_int_equal(d_add->max, 15);
David Sedláke0ef1c62019-09-13 10:05:55 +02003705 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003706 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3707 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003708 lysp_deviate_free(st->ctx, deviates);
3709 free(deviates);
3710 deviates = NULL;
3711
3712 data = ELEMENT_WRAPPER_START
3713 "<deviate value=\"replace\">"
3714 "<type name=\"newtype\"/>"
3715 "<units name=\"uni\"/>"
3716 "<default value=\"def\"/>"
3717 "<config value=\"true\"/>"
3718 "<mandatory value=\"true\"/>"
3719 "<min-elements value=\"5\"/>"
3720 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003721 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003722 "</deviate>"
3723 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003724 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003725 d_rpl = (struct lysp_deviate_rpl *)deviates;
3726 assert_int_equal(d_rpl->mod, LYS_DEV_REPLACE);
3727 assert_null(d_rpl->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003728 assert_string_equal(d_rpl->type->name, "newtype");
3729 assert_string_equal(d_rpl->units, "uni");
3730 assert_string_equal(d_rpl->dflt, "def");
3731 assert_true(d_rpl->flags & LYS_MAND_TRUE && d_rpl->flags & LYS_CONFIG_W);
3732 assert_int_equal(d_rpl->min, 5);
3733 assert_int_equal(d_rpl->max, 15);
David Sedláke0ef1c62019-09-13 10:05:55 +02003734 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003735 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3736 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003737 lysp_deviate_free(st->ctx, deviates);
3738 free(deviates);
3739 deviates = NULL;
3740
3741 data = ELEMENT_WRAPPER_START
3742 "<deviate value=\"delete\">"
3743 "<units name=\"u\"/>"
3744 "<must condition=\"c\"/>"
3745 "<unique tag=\"tag\"/>"
3746 "<default value=\"default\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003747 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003748 "</deviate>"
3749 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003750 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003751 d_del = (struct lysp_deviate_del *)deviates;
3752 assert_int_equal(d_del->mod, LYS_DEV_DELETE);
3753 assert_null(d_del->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003754 assert_string_equal(d_del->units, "u");
3755 assert_string_equal(d_del->musts->arg, "c");
3756 assert_string_equal(*d_del->uniques, "tag");
3757 assert_string_equal(*d_del->dflts, "default");
David Sedláke0ef1c62019-09-13 10:05:55 +02003758 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003759 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3760 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003761 lysp_deviate_free(st->ctx, deviates);
3762 free(deviates);
3763 deviates = NULL;
3764
3765 /* invalid arguments */
3766 data = ELEMENT_WRAPPER_START "<deviate value=\"\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003767 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003768 logbuf_assert("Invalid value \"\" of \"value\" attribute in \"deviate\" element. Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\". Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02003769 deviates = NULL;
3770
3771 data = ELEMENT_WRAPPER_START "<deviate value=\"invalid\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003772 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003773 logbuf_assert("Invalid value \"invalid\" of \"value\" attribute in \"deviate\" element. Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\". Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02003774 deviates = NULL;
3775
3776 data = ELEMENT_WRAPPER_START "<deviate value=\"ad\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003777 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003778 logbuf_assert("Invalid value \"ad\" of \"value\" attribute in \"deviate\" element. Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\". Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02003779 deviates = NULL;
3780
3781 data = ELEMENT_WRAPPER_START "<deviate value=\"adds\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003782 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003783 logbuf_assert("Invalid value \"adds\" of \"value\" attribute in \"deviate\" element. Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\". Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02003784 deviates = NULL;
3785
3786 data = ELEMENT_WRAPPER_START
3787 "<deviate value=\"not-supported\">"
3788 "<must condition=\"c\"/>"
3789 "</deviate>"
3790 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003791 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák4ffcec82019-07-25 15:10:21 +02003792 logbuf_assert("Deviate of this type doesn't allow \"must\" as it's sub-element. Line number 1.");
3793
3794 st->finished_correctly = true;
3795}
3796
David Sedlák8b754462019-07-25 16:22:13 +02003797static void
3798test_deviation_elem(void **state)
3799{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003800 struct test_parser_yin_state *st = *state;
David Sedlák8b754462019-07-25 16:22:13 +02003801 const char *data;
3802 struct lysp_deviation *deviations = NULL;
3803
3804 /* min subelems */
3805 data = ELEMENT_WRAPPER_START
3806 "<deviation target-node=\"target\">"
3807 "<deviate value=\"not-supported\"/>"
3808 "</deviation>"
3809 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003810 assert_int_equal(test_element_helper(st, data, &deviations, NULL, NULL), LY_SUCCESS);
David Sedlák8b754462019-07-25 16:22:13 +02003811 assert_string_equal(deviations->nodeid, "target");
3812 assert_int_equal(deviations->deviates->mod, LYS_DEV_NOT_SUPPORTED);
3813 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3814 deviations = NULL;
3815
3816 /* max subelems */
3817 data = ELEMENT_WRAPPER_START
3818 "<deviation target-node=\"target\">"
3819 "<reference><text>ref</text></reference>"
3820 "<description><text>desc</text></description>"
3821 "<deviate value=\"add\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003822 EXT_SUBELEM
David Sedlák8b754462019-07-25 16:22:13 +02003823 "</deviation>"
3824 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003825 assert_int_equal(test_element_helper(st, data, &deviations, NULL, NULL), LY_SUCCESS);
David Sedlák8b754462019-07-25 16:22:13 +02003826 assert_string_equal(deviations->nodeid, "target");
3827 assert_int_equal(deviations->deviates->mod, LYS_DEV_ADD);
3828 assert_string_equal(deviations->ref, "ref");
3829 assert_string_equal(deviations->dsc, "desc");
David Sedláke0ef1c62019-09-13 10:05:55 +02003830 assert_string_equal(deviations->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003831 assert_int_equal(deviations->exts[0].insubstmt_index, 0);
3832 assert_int_equal(deviations->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8b754462019-07-25 16:22:13 +02003833 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3834 deviations = NULL;
3835
3836 /* invalid */
3837 data = ELEMENT_WRAPPER_START "<deviation target-node=\"target\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003838 assert_int_equal(test_element_helper(st, data, &deviations, NULL, NULL), LY_EVALID);
David Sedlák8b754462019-07-25 16:22:13 +02003839 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3840 deviations = NULL;
David Sedlák1538a842019-08-08 15:38:51 +02003841 logbuf_assert("Missing mandatory sub-element \"deviate\" of \"deviation\" element. Line number 1.");
3842 /* TODO */
David Sedlák8b754462019-07-25 16:22:13 +02003843 st->finished_correctly = true;
3844}
3845
David Sedlák4f03b932019-07-26 13:01:47 +02003846static void
3847test_module_elem(void **state)
3848{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003849 struct test_parser_yin_state *st = *state;
Michal Vaskob36053d2020-03-26 15:49:30 +01003850 const char *data;
David Sedlák4f03b932019-07-26 13:01:47 +02003851 struct lys_module *lys_mod = NULL;
3852 struct lysp_module *lysp_mod = NULL;
3853
3854 /* max subelems */
David Sedlák4f03b932019-07-26 13:01:47 +02003855 lys_mod = calloc(1, sizeof *lys_mod);
3856 lysp_mod = calloc(1, sizeof *lysp_mod);
3857 lys_mod->ctx = st->ctx;
3858 lysp_mod->mod = lys_mod;
3859 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3860 "<yang-version value=\"1.1\"/>\n"
3861 "<namespace uri=\"ns\"/>\n"
3862 "<prefix value=\"pref\"/>\n"
3863 "<include module=\"b-mod\"/>\n"
3864 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3865 "<organization><text>org</text></organization>\n"
3866 "<contact><text>contact</text></contact>\n"
3867 "<description><text>desc</text></description>"
3868 "<reference><text>ref</text></reference>\n"
3869 "<revision date=\"2019-02-02\"/>\n"
3870 "<anydata name=\"anyd\"/>\n"
3871 "<anyxml name=\"anyx\"/>\n"
3872 "<choice name=\"choice\"/>\n"
3873 "<container name=\"cont\"/>\n"
3874 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3875 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3876 "<list name=\"sub-list\"/>\n"
3877 "<uses name=\"uses-name\"/>\n"
3878 "<augment target-node=\"target\"/>\n"
3879 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
3880 "<extension name=\"ext\"/>\n"
3881 "<feature name=\"feature\"/>\n"
3882 "<grouping name=\"grp\"/>\n"
3883 "<identity name=\"ident-name\"/>\n"
3884 "<notification name=\"notf\"/>\n"
3885 "<rpc name=\"rpc-name\"/>\n"
3886 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02003887 EXT_SUBELEM"\n"
David Sedlák4f03b932019-07-26 13:01:47 +02003888 "</module>\n";
Michal Vaskob36053d2020-03-26 15:49:30 +01003889 assert_int_equal(lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx), LY_SUCCESS);
3890
3891 assert_int_equal(yin_parse_mod(st->yin_ctx, lysp_mod), LY_SUCCESS);
David Sedlák4f03b932019-07-26 13:01:47 +02003892 assert_string_equal(lysp_mod->mod->name, "mod");
3893 assert_string_equal(lysp_mod->revs, "2019-02-02");
3894 assert_string_equal(lysp_mod->mod->ns, "ns");
3895 assert_string_equal(lysp_mod->mod->prefix, "pref");
3896 assert_null(lysp_mod->mod->filepath);
3897 assert_string_equal(lysp_mod->mod->org, "org");
3898 assert_string_equal(lysp_mod->mod->contact, "contact");
3899 assert_string_equal(lysp_mod->mod->dsc, "desc");
3900 assert_string_equal(lysp_mod->mod->ref, "ref");
3901 assert_int_equal(lysp_mod->mod->version, LYS_VERSION_1_1);
3902 assert_string_equal(lysp_mod->imports->name, "a-mod");
3903 assert_string_equal(lysp_mod->includes->name, "b-mod");
3904 assert_string_equal(lysp_mod->extensions->name, "ext");
3905 assert_string_equal(lysp_mod->features->name, "feature");
3906 assert_string_equal(lysp_mod->identities->name, "ident-name");
3907 assert_string_equal(lysp_mod->typedefs->name, "tpdf");
3908 assert_string_equal(lysp_mod->groupings->name, "grp");
3909 assert_string_equal(lysp_mod->data->name, "anyd");
3910 assert_int_equal(lysp_mod->data->nodetype, LYS_ANYDATA);
3911 assert_string_equal(lysp_mod->data->next->name, "anyx");
3912 assert_int_equal(lysp_mod->data->next->nodetype, LYS_ANYXML);
3913 assert_string_equal(lysp_mod->data->next->next->name, "choice");
3914 assert_int_equal(lysp_mod->data->next->next->nodetype, LYS_CHOICE);
3915 assert_string_equal(lysp_mod->data->next->next->next->name, "cont");
3916 assert_int_equal(lysp_mod->data->next->next->next->nodetype, LYS_CONTAINER);
3917 assert_string_equal(lysp_mod->data->next->next->next->next->name, "leaf");
3918 assert_int_equal(lysp_mod->data->next->next->next->next->nodetype, LYS_LEAF);
3919 assert_string_equal(lysp_mod->data->next->next->next->next->next->name, "llist");
3920 assert_int_equal(lysp_mod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3921 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->name, "sub-list");
3922 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
3923 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->next->name, "uses-name");
3924 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3925 assert_null(lysp_mod->data->next->next->next->next->next->next->next->next);
3926 assert_string_equal(lysp_mod->augments->nodeid, "target");
3927 assert_string_equal(lysp_mod->rpcs->name, "rpc-name");
3928 assert_string_equal(lysp_mod->notifs->name, "notf");
3929 assert_string_equal(lysp_mod->deviations->nodeid, "target");
David Sedláke0ef1c62019-09-13 10:05:55 +02003930 assert_string_equal(lysp_mod->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003931 assert_int_equal(lysp_mod->exts[0].insubstmt_index, 0);
3932 assert_int_equal(lysp_mod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4f03b932019-07-26 13:01:47 +02003933 lysp_module_free(lysp_mod);
3934 lys_module_free(lys_mod, NULL);
David Sedlák4f03b932019-07-26 13:01:47 +02003935
3936 /* min subelems */
Michal Vaskob36053d2020-03-26 15:49:30 +01003937 lyxml_ctx_free(st->yin_ctx->xmlctx);
David Sedlák4f03b932019-07-26 13:01:47 +02003938 lys_mod = calloc(1, sizeof *lys_mod);
3939 lysp_mod = calloc(1, sizeof *lysp_mod);
3940 lys_mod->ctx = st->ctx;
3941 lysp_mod->mod = lys_mod;
3942 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3943 "<namespace uri=\"ns\"/>"
3944 "<prefix value=\"pref\"/>"
3945 "<yang-version value=\"1.1\"/>"
3946 "</module>";
Michal Vaskob36053d2020-03-26 15:49:30 +01003947 assert_int_equal(lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx), LY_SUCCESS);
3948 assert_int_equal(yin_parse_mod(st->yin_ctx, lysp_mod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003949 assert_string_equal(lysp_mod->mod->name, "mod");
David Sedlák4f03b932019-07-26 13:01:47 +02003950 lysp_module_free(lysp_mod);
3951 lys_module_free(lys_mod, NULL);
David Sedlák298ff6d2019-07-26 14:29:03 +02003952
David Sedláke6cd89e2019-08-07 12:46:02 +02003953 /* incorrect subelem order */
Michal Vaskob36053d2020-03-26 15:49:30 +01003954 lyxml_ctx_free(st->yin_ctx->xmlctx);
David Sedláke6cd89e2019-08-07 12:46:02 +02003955 lys_mod = calloc(1, sizeof *lys_mod);
3956 lysp_mod = calloc(1, sizeof *lysp_mod);
3957 lys_mod->ctx = st->ctx;
3958 lysp_mod->mod = lys_mod;
3959 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3960 "<feature name=\"feature\"/>\n"
3961 "<namespace uri=\"ns\"/>"
3962 "<prefix value=\"pref\"/>"
3963 "<yang-version value=\"1.1\"/>"
3964 "</module>";
Michal Vaskob36053d2020-03-26 15:49:30 +01003965 assert_int_equal(lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx), LY_SUCCESS);
3966 assert_int_equal(yin_parse_mod(st->yin_ctx, lysp_mod), LY_EVALID);
3967 logbuf_assert("Invalid order of module\'s sub-elements \"namespace\" can\'t appear after \"feature\". Line number 2.");
David Sedláke6cd89e2019-08-07 12:46:02 +02003968 lysp_module_free(lysp_mod);
3969 lys_module_free(lys_mod, NULL);
David Sedláke6cd89e2019-08-07 12:46:02 +02003970
David Sedlák298ff6d2019-07-26 14:29:03 +02003971 st->finished_correctly = true;
3972}
3973
3974static void
3975test_submodule_elem(void **state)
3976{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003977 struct test_parser_yin_state *st = *state;
Michal Vaskob36053d2020-03-26 15:49:30 +01003978 const char *data;
David Sedlák298ff6d2019-07-26 14:29:03 +02003979 struct lysp_submodule *lysp_submod = NULL;
3980
3981 /* max subelements */
David Sedlák298ff6d2019-07-26 14:29:03 +02003982 lysp_submod = calloc(1, sizeof *lysp_submod);
3983 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3984 "<yang-version value=\"1.1\"/>\n"
3985 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
3986 "<include module=\"b-mod\"/>\n"
3987 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3988 "<organization><text>org</text></organization>\n"
3989 "<contact><text>contact</text></contact>\n"
3990 "<description><text>desc</text></description>"
3991 "<reference><text>ref</text></reference>\n"
3992 "<revision date=\"2019-02-02\"/>\n"
3993 "<anydata name=\"anyd\"/>\n"
3994 "<anyxml name=\"anyx\"/>\n"
3995 "<choice name=\"choice\"/>\n"
3996 "<container name=\"cont\"/>\n"
3997 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3998 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3999 "<list name=\"sub-list\"/>\n"
4000 "<uses name=\"uses-name\"/>\n"
4001 "<augment target-node=\"target\"/>\n"
4002 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
4003 "<extension name=\"ext\"/>\n"
4004 "<feature name=\"feature\"/>\n"
4005 "<grouping name=\"grp\"/>\n"
4006 "<identity name=\"ident-name\"/>\n"
4007 "<notification name=\"notf\"/>\n"
4008 "<rpc name=\"rpc-name\"/>\n"
4009 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02004010 EXT_SUBELEM"\n"
David Sedlák298ff6d2019-07-26 14:29:03 +02004011 "</submodule>\n";
Michal Vaskob36053d2020-03-26 15:49:30 +01004012 assert_int_equal(lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx), LY_SUCCESS);
4013 assert_int_equal(yin_parse_submod(st->yin_ctx, lysp_submod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02004014
4015 assert_string_equal(lysp_submod->name, "mod");
4016 assert_string_equal(lysp_submod->revs, "2019-02-02");
David Sedlák298ff6d2019-07-26 14:29:03 +02004017 assert_string_equal(lysp_submod->prefix, "pref");
4018 assert_null(lysp_submod->filepath);
4019 assert_string_equal(lysp_submod->org, "org");
4020 assert_string_equal(lysp_submod->contact, "contact");
4021 assert_string_equal(lysp_submod->dsc, "desc");
4022 assert_string_equal(lysp_submod->ref, "ref");
4023 assert_int_equal(lysp_submod->version, LYS_VERSION_1_1);
4024 assert_string_equal(lysp_submod->imports->name, "a-mod");
4025 assert_string_equal(lysp_submod->includes->name, "b-mod");
4026 assert_string_equal(lysp_submod->extensions->name, "ext");
4027 assert_string_equal(lysp_submod->features->name, "feature");
4028 assert_string_equal(lysp_submod->identities->name, "ident-name");
4029 assert_string_equal(lysp_submod->typedefs->name, "tpdf");
4030 assert_string_equal(lysp_submod->groupings->name, "grp");
4031 assert_string_equal(lysp_submod->data->name, "anyd");
4032 assert_int_equal(lysp_submod->data->nodetype, LYS_ANYDATA);
4033 assert_string_equal(lysp_submod->data->next->name, "anyx");
4034 assert_int_equal(lysp_submod->data->next->nodetype, LYS_ANYXML);
4035 assert_string_equal(lysp_submod->data->next->next->name, "choice");
4036 assert_int_equal(lysp_submod->data->next->next->nodetype, LYS_CHOICE);
4037 assert_string_equal(lysp_submod->data->next->next->next->name, "cont");
4038 assert_int_equal(lysp_submod->data->next->next->next->nodetype, LYS_CONTAINER);
4039 assert_string_equal(lysp_submod->data->next->next->next->next->name, "leaf");
4040 assert_int_equal(lysp_submod->data->next->next->next->next->nodetype, LYS_LEAF);
4041 assert_string_equal(lysp_submod->data->next->next->next->next->next->name, "llist");
4042 assert_int_equal(lysp_submod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
4043 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->name, "sub-list");
4044 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
4045 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->next->name, "uses-name");
4046 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
4047 assert_null(lysp_submod->data->next->next->next->next->next->next->next->next);
4048 assert_string_equal(lysp_submod->augments->nodeid, "target");
4049 assert_string_equal(lysp_submod->rpcs->name, "rpc-name");
4050 assert_string_equal(lysp_submod->notifs->name, "notf");
4051 assert_string_equal(lysp_submod->deviations->nodeid, "target");
David Sedláke0ef1c62019-09-13 10:05:55 +02004052 assert_string_equal(lysp_submod->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02004053 assert_int_equal(lysp_submod->exts[0].insubstmt_index, 0);
4054 assert_int_equal(lysp_submod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák298ff6d2019-07-26 14:29:03 +02004055
4056 lysp_submodule_free(st->ctx, lysp_submod);
David Sedlák298ff6d2019-07-26 14:29:03 +02004057
4058 /* min subelemnts */
Michal Vaskob36053d2020-03-26 15:49:30 +01004059 lyxml_ctx_free(st->yin_ctx->xmlctx);
David Sedlák298ff6d2019-07-26 14:29:03 +02004060 lysp_submod = calloc(1, sizeof *lysp_submod);
4061 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
4062 "<yang-version value=\"1.0\"/>"
4063 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
4064 "</submodule>";
Michal Vaskob36053d2020-03-26 15:49:30 +01004065 assert_int_equal(lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx), LY_SUCCESS);
4066 assert_int_equal(yin_parse_submod(st->yin_ctx, lysp_submod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02004067 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);
David Sedlák298ff6d2019-07-26 14:29:03 +02004071
David Sedláke6cd89e2019-08-07 12:46:02 +02004072 /* incorrect subelem order */
Michal Vaskob36053d2020-03-26 15:49:30 +01004073 lyxml_ctx_free(st->yin_ctx->xmlctx);
David Sedláke6cd89e2019-08-07 12:46:02 +02004074 lysp_submod = calloc(1, sizeof *lysp_submod);
4075 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
4076 "<yang-version value=\"1.0\"/>"
4077 "<reference><text>ref</text></reference>\n"
4078 "<belongs-to module=\"mod-name\"><prefix value=\"pref\"/></belongs-to>"
4079 "</submodule>";
Michal Vaskob36053d2020-03-26 15:49:30 +01004080 assert_int_equal(lyxml_ctx_new(st->ctx, data, &st->yin_ctx->xmlctx), LY_SUCCESS);
4081 assert_int_equal(yin_parse_submod(st->yin_ctx, lysp_submod), LY_EVALID);
4082 logbuf_assert("Invalid order of submodule's sub-elements \"belongs-to\" can't appear after \"reference\". Line number 2.");
David Sedláke6cd89e2019-08-07 12:46:02 +02004083 lysp_submodule_free(st->ctx, lysp_submod);
David Sedláke6cd89e2019-08-07 12:46:02 +02004084
David Sedlák298ff6d2019-07-26 14:29:03 +02004085 st->finished_correctly = true;
David Sedlák4f03b932019-07-26 13:01:47 +02004086}
4087
David Sedlák8985a142019-07-31 16:43:06 +02004088static void
4089test_yin_parse_module(void **state)
4090{
Radek Krejci3a4889a2020-05-19 17:01:58 +02004091 struct test_parser_yin_state *st = *state;
David Sedlák8985a142019-07-31 16:43:06 +02004092 const char *data;
4093 struct lys_module *mod;
Michal Vaskob36053d2020-03-26 15:49:30 +01004094 struct lys_yin_parser_ctx *yin_ctx = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02004095
4096 mod = calloc(1, sizeof *mod);
4097 mod->ctx = st->ctx;
David Sedlákd2844882019-09-13 16:01:22 +02004098 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" xmlns:md=\"urn:ietf:params:xml:ns:yang:ietf-yang-metadata\" name=\"a\"> \n"
4099 "<yang-version value=\"1.1\"/>\n"
4100 "<namespace uri=\"urn:tests:extensions:metadata:a\"/>\n"
4101 "<prefix value=\"a\"/>\n"
4102 "<import module=\"ietf-yang-metadata\">\n"
4103 "<prefix value=\"md\"/>\n"
4104 "</import>\n"
4105 "<feature name=\"f\"/>\n"
4106 "<md:annotation name=\"x\">\n"
4107 "<description>\n"
4108 "<text>test</text>\n"
4109 "</description>\n"
4110 "<reference>\n"
4111 "<text>test</text>\n"
4112 "</reference>\n"
4113 "<if-feature name=\"f\"/>\n"
4114 "<status value=\"current\"/>\n"
4115 "<type name=\"uint8\"/>\n"
4116 "<units name=\"meters\"/>\n"
4117 "</md:annotation>\n"
4118 "</module>\n";
4119 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4120 assert_null(mod->parsed->exts->child->next->child);
4121 assert_string_equal(mod->parsed->exts->child->next->arg, "test");
4122 lys_module_free(mod, NULL);
4123 yin_parser_ctx_free(yin_ctx);
4124 mod = NULL;
4125 yin_ctx = NULL;
4126
4127 mod = calloc(1, sizeof *mod);
4128 mod->ctx = st->ctx;
David Sedlák8985a142019-07-31 16:43:06 +02004129 data = "<module name=\"example-foo\""
4130 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4131 "xmlns:foo=\"urn:example:foo\""
4132 "xmlns:myext=\"urn:example:extensions\">\n"
4133
4134 "<yang-version value=\"1.0\"/>\n"
4135
4136 "<namespace uri=\"urn:example:foo\"/>\n"
4137 "<prefix value=\"foo\"/>\n"
4138
4139 "<import module=\"example-extensions\">\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004140 "<prefix value=\"myext\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02004141 "</import>\n"
4142
4143 "<list name=\"interface\">\n"
4144 "<key value=\"name\"/>\n"
4145 "<leaf name=\"name\">\n"
4146 "<type name=\"string\"/>\n"
4147 "</leaf>\n"
4148 "<leaf name=\"mtu\">\n"
4149 "<type name=\"uint32\"/>\n"
4150 "<description>\n"
4151 "<text>The MTU of the interface.</text>\n"
4152 "</description>\n"
4153 "<myext:c-define name=\"MY_MTU\"/>\n"
4154 "</leaf>\n"
4155 "</list>\n"
4156 "</module>\n";
4157 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4158 lys_module_free(mod, NULL);
4159 yin_parser_ctx_free(yin_ctx);
4160 mod = NULL;
4161 yin_ctx = NULL;
4162
4163 mod = calloc(1, sizeof *mod);
4164 mod->ctx = st->ctx;
David Sedlák6d781b62019-08-02 15:22:52 +02004165 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
4166 "<yang-version value=\"1.0\"/>\n"
4167 "<namespace uri=\"urn:example:foo\"/>\n"
4168 "<prefix value=\"foo\"/>\n"
4169 "</module>\n";
4170 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_SUCCESS);
4171 lys_module_free(mod, NULL);
4172 yin_parser_ctx_free(yin_ctx);
4173 mod = NULL;
4174 yin_ctx = NULL;
4175
4176
4177 mod = calloc(1, sizeof *mod);
4178 mod->ctx = st->ctx;
David Sedlák8985a142019-07-31 16:43:06 +02004179 data = "<submodule name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4180 "</submodule>\n";
4181 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_EINVAL);
4182 logbuf_assert("Input data contains submodule which cannot be parsed directly without its main module.");
4183 lys_module_free(mod, NULL);
4184 yin_parser_ctx_free(yin_ctx);
4185
David Sedlák6d781b62019-08-02 15:22:52 +02004186 mod = calloc(1, sizeof *mod);
4187 mod->ctx = st->ctx;
4188 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
4189 "<yang-version value=\"1.0\"/>\n"
4190 "<namespace uri=\"urn:example:foo\"/>\n"
4191 "<prefix value=\"foo\"/>\n"
4192 "</module>"
4193 "<module>";
4194 assert_int_equal(yin_parse_module(&yin_ctx, data, mod), LY_EVALID);
4195 logbuf_assert("Trailing garbage \"<module>\" after module, expected end-of-input. Line number 5.");
4196 lys_module_free(mod, NULL);
4197 yin_parser_ctx_free(yin_ctx);
4198 mod = NULL;
4199 yin_ctx = NULL;
4200
David Sedlák8985a142019-07-31 16:43:06 +02004201 st->finished_correctly = true;
4202}
4203
4204static void
4205test_yin_parse_submodule(void **state)
4206{
Radek Krejci3a4889a2020-05-19 17:01:58 +02004207 struct test_parser_yin_state *st = *state;
David Sedlák8985a142019-07-31 16:43:06 +02004208 const char *data;
Michal Vaskob36053d2020-03-26 15:49:30 +01004209 struct lys_yin_parser_ctx *yin_ctx = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02004210 struct lysp_submodule *submod = NULL;
David Sedlák1b623122019-08-05 15:27:49 +02004211 struct lys_parser_ctx main_ctx = {};
David Sedlák8985a142019-07-31 16:43:06 +02004212
4213 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4214 "<submodule name=\"asub\""
4215 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4216 "xmlns:a=\"urn:a\">"
4217 "<yang-version value=\"1.0\"/>\n"
4218 "<belongs-to module=\"a\">"
4219 "<prefix value=\"a_pref\"/>"
4220 "</belongs-to>"
4221 "<include module=\"atop\"/>"
4222 "<feature name=\"fox\"/>"
4223 "<notification name=\"bar-notif\">"
4224 "<if-feature name=\"bar\"/>"
4225 "</notification>"
4226 "<notification name=\"fox-notif\">"
4227 "<if-feature name=\"fox\"/>"
4228 "</notification>"
4229 "<augment target-node=\"/a_pref:top\">"
4230 "<if-feature name=\"bar\"/>"
4231 "<container name=\"bar-sub\"/>"
4232 "</augment>"
4233 "<augment target-node=\"/top\">"
4234 "<container name=\"bar-sub2\"/>"
4235 "</augment>"
4236 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004237 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_SUCCESS);
David Sedlák8985a142019-07-31 16:43:06 +02004238 lysp_submodule_free(st->ctx, submod);
4239 yin_parser_ctx_free(yin_ctx);
4240 yin_ctx = NULL;
4241 submod = NULL;
4242
4243 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák6d781b62019-08-02 15:22:52 +02004244 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4245 "<yang-version value=\"1.0\"/>\n"
4246 "<belongs-to module=\"a\">"
4247 "<prefix value=\"a_pref\"/>"
4248 "</belongs-to>"
4249 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004250 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_SUCCESS);
David Sedlák6d781b62019-08-02 15:22:52 +02004251 lysp_submodule_free(st->ctx, submod);
4252 yin_parser_ctx_free(yin_ctx);
4253 yin_ctx = NULL;
4254 submod = NULL;
4255
4256 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák8985a142019-07-31 16:43:06 +02004257 "<module name=\"inval\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4258 "</module>";
David Sedlák1b623122019-08-05 15:27:49 +02004259 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_EINVAL);
David Sedlák8985a142019-07-31 16:43:06 +02004260 logbuf_assert("Input data contains module in situation when a submodule is expected.");
4261 lysp_submodule_free(st->ctx, submod);
4262 yin_parser_ctx_free(yin_ctx);
4263 yin_ctx = NULL;
4264 submod = NULL;
4265
David Sedlák6d781b62019-08-02 15:22:52 +02004266 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4267 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4268 "<yang-version value=\"1.0\"/>\n"
4269 "<belongs-to module=\"a\">"
4270 "<prefix value=\"a_pref\"/>"
4271 "</belongs-to>"
4272 "</submodule>"
4273 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4274 "<yang-version value=\"1.0\"/>\n"
4275 "<belongs-to module=\"a\">"
4276 "<prefix value=\"a_pref\"/>"
4277 "</belongs-to>"
4278 "</submodule>";
David Sedlák1b623122019-08-05 15:27:49 +02004279 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, &main_ctx, data, &submod), LY_EVALID);
David Sedlák6d781b62019-08-02 15:22:52 +02004280 logbuf_assert("Trailing garbage \"<submodule name...\" after submodule, expected end-of-input. Line number 2.");
4281 lysp_submodule_free(st->ctx, submod);
4282 yin_parser_ctx_free(yin_ctx);
4283 yin_ctx = NULL;
4284 submod = NULL;
4285
David Sedlák8985a142019-07-31 16:43:06 +02004286 st->finished_correctly = true;
4287}
4288
David Sedlák3b4db242018-10-19 16:11:01 +02004289int
4290main(void)
4291{
4292
4293 const struct CMUnitTest tests[] = {
David Sedlák8f7a1172019-06-20 14:42:18 +02004294 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02004295 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
4296 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák071f7662019-09-12 02:02:51 +02004297 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02004298 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02004299
David Sedlák8e7bda82019-07-16 17:57:50 +02004300 cmocka_unit_test(test_yin_match_argument_name),
David Sedlák43801c92019-08-05 15:58:54 +02004301 cmocka_unit_test_setup_teardown(test_enum_elem, setup_element_test, teardown_element_test),
4302 cmocka_unit_test_setup_teardown(test_bit_elem, setup_element_test, teardown_element_test),
David Sedlák32488102019-07-15 17:44:10 +02004303 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_element_test),
4304 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_element_test),
4305 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_element_test),
4306 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_element_test),
4307 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_element_test),
4308 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_element_test),
4309 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02004310 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_element_test),
4311 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_element_test),
4312 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_element_test),
4313 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_element_test),
4314 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_element_test),
4315 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_element_test),
4316 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_element_test),
4317 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_element_test),
4318 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_element_test),
4319 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_element_test),
4320 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_element_test),
4321 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02004322 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_element_test),
4323 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_element_test),
David Sedlák69f01612019-07-17 11:41:08 +02004324 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_element_test),
4325 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_element_test),
4326 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_element_test),
4327 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_element_test),
4328 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_element_test),
4329 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_element_test),
4330 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_element_test),
4331 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_element_test),
David Sedlák374d2b32019-07-17 15:06:55 +02004332 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_element_test),
David Sedlák1af868e2019-07-17 17:03:14 +02004333 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_element_test),
David Sedlák09e18c92019-07-18 11:17:11 +02004334 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_element_test),
David Sedláka2dad212019-07-18 12:45:19 +02004335 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_element_test),
David Sedlák8a83bbb2019-07-18 14:46:00 +02004336 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02004337 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_element_test),
David Sedlákc3da3ef2019-07-19 12:56:08 +02004338 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_element_test),
David Sedlákcb39f642019-07-19 13:19:55 +02004339 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_element_test),
David Sedlák12470a82019-07-19 13:44:36 +02004340 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_element_test),
David Sedlák04e17b22019-07-19 15:29:48 +02004341 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_element_test),
David Sedlákd2d676a2019-07-22 11:28:19 +02004342 cmocka_unit_test_setup_teardown(test_refine_elem, setup_element_test, teardown_element_test),
David Sedlák0d6de5a2019-07-22 13:25:44 +02004343 cmocka_unit_test_setup_teardown(test_uses_elem, setup_element_test, teardown_element_test),
David Sedlákaa854b02019-07-22 14:17:10 +02004344 cmocka_unit_test_setup_teardown(test_revision_elem, setup_element_test, teardown_element_test),
David Sedlák0c2bab92019-07-22 15:33:19 +02004345 cmocka_unit_test_setup_teardown(test_include_elem, setup_element_test, teardown_element_test),
David Sedlákaf536aa2019-07-23 13:42:23 +02004346 cmocka_unit_test_setup_teardown(test_list_elem, setup_element_test, teardown_element_test),
David Sedlák031b9e72019-07-23 15:19:37 +02004347 cmocka_unit_test_setup_teardown(test_notification_elem, setup_element_test, teardown_element_test),
David Sedláke3ce9ef2019-07-23 16:34:30 +02004348 cmocka_unit_test_setup_teardown(test_grouping_elem, setup_element_test, teardown_element_test),
David Sedlákf111bcb2019-07-23 17:15:51 +02004349 cmocka_unit_test_setup_teardown(test_container_elem, setup_element_test, teardown_element_test),
David Sedlák5379d392019-07-24 10:42:03 +02004350 cmocka_unit_test_setup_teardown(test_case_elem, setup_element_test, teardown_element_test),
David Sedlákb7abcfa2019-07-24 12:33:35 +02004351 cmocka_unit_test_setup_teardown(test_choice_elem, setup_element_test, teardown_element_test),
David Sedlák05404f62019-07-24 14:11:53 +02004352 cmocka_unit_test_setup_teardown(test_inout_elem, setup_element_test, teardown_element_test),
David Sedlák85d0eca2019-07-24 15:15:21 +02004353 cmocka_unit_test_setup_teardown(test_action_elem, setup_element_test, teardown_element_test),
David Sedlák992fb7c2019-07-24 16:51:01 +02004354 cmocka_unit_test_setup_teardown(test_augment_elem, setup_element_test, teardown_element_test),
David Sedlák4ffcec82019-07-25 15:10:21 +02004355 cmocka_unit_test_setup_teardown(test_deviate_elem, setup_element_test, teardown_element_test),
David Sedlák8b754462019-07-25 16:22:13 +02004356 cmocka_unit_test_setup_teardown(test_deviation_elem, setup_element_test, teardown_element_test),
David Sedlák4f03b932019-07-26 13:01:47 +02004357 cmocka_unit_test_setup_teardown(test_module_elem, setup_element_test, teardown_element_test),
David Sedlák298ff6d2019-07-26 14:29:03 +02004358 cmocka_unit_test_setup_teardown(test_submodule_elem, setup_element_test, teardown_element_test),
David Sedlák8985a142019-07-31 16:43:06 +02004359
4360 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_logger, teardown_logger),
4361 cmocka_unit_test_setup_teardown(test_yin_parse_submodule, setup_logger, teardown_logger),
David Sedlák3b4db242018-10-19 16:11:01 +02004362 };
4363
David Sedlák8e7bda82019-07-16 17:57:50 +02004364 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02004365}