blob: d01a1f296bda5fafd484a2e222679cd40a0c98fb [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 Krejci70593c12020-06-13 20:48:09 +020024#include "common.h"
25#include "parser_internal.h"
26#include "parser_yin.h"
27#include "tree_schema.h"
28#include "tree_schema_internal.h"
29#include "xml.h"
30#include "xpath.h"
David Sedlák3b4db242018-10-19 16:11:01 +020031
David Sedlák555c7202019-07-04 12:14:12 +020032/* prototypes of static functions */
33void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
David Sedlák986cb412019-07-04 13:10:11 +020034void lysp_ext_free(struct ly_ctx *ctx, struct lysp_ext *ext);
David Sedlák32eee7b2019-07-09 12:38:44 +020035void lysp_when_free(struct ly_ctx *ctx, struct lysp_when *when);
David Sedlák32488102019-07-15 17:44:10 +020036void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
David Sedlák8a83bbb2019-07-18 14:46:00 +020037void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
David Sedlák04e17b22019-07-19 15:29:48 +020038void lysp_tpdf_free(struct ly_ctx *ctx, struct lysp_tpdf *tpdf);
David Sedlákd2d676a2019-07-22 11:28:19 +020039void lysp_refine_free(struct ly_ctx *ctx, struct lysp_refine *ref);
David Sedlákaa854b02019-07-22 14:17:10 +020040void lysp_revision_free(struct ly_ctx *ctx, struct lysp_revision *rev);
David Sedlák0c2bab92019-07-22 15:33:19 +020041void lysp_include_free(struct ly_ctx *ctx, struct lysp_include *include);
David Sedlák5e13dea2019-07-22 16:06:45 +020042void lysp_feature_free(struct ly_ctx *ctx, struct lysp_feature *feat);
David Sedlák28794f22019-07-22 16:45:00 +020043void lysp_ident_free(struct ly_ctx *ctx, struct lysp_ident *ident);
David Sedlák031b9e72019-07-23 15:19:37 +020044void lysp_notif_free(struct ly_ctx *ctx, struct lysp_notif *notif);
David Sedláke3ce9ef2019-07-23 16:34:30 +020045void lysp_grp_free(struct ly_ctx *ctx, struct lysp_grp *grp);
David Sedlák05404f62019-07-24 14:11:53 +020046void lysp_action_inout_free(struct ly_ctx *ctx, struct lysp_action_inout *inout);
David Sedlák85d0eca2019-07-24 15:15:21 +020047void lysp_action_free(struct ly_ctx *ctx, struct lysp_action *action);
David Sedlák992fb7c2019-07-24 16:51:01 +020048void lysp_augment_free(struct ly_ctx *ctx, struct lysp_augment *augment);
David Sedlák4ffcec82019-07-25 15:10:21 +020049void lysp_deviate_free(struct ly_ctx *ctx, struct lysp_deviate *d);
David Sedlák8b754462019-07-25 16:22:13 +020050void lysp_deviation_free(struct ly_ctx *ctx, struct lysp_deviation *dev);
David Sedlák298ff6d2019-07-26 14:29:03 +020051void 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;
Michal Vaskob36053d2020-03-26 15:49:30 +010059 struct lys_yin_parser_ctx *yin_ctx;
Michal Vasko63f3d842020-07-08 10:10:14 +020060 struct ly_in *in;
David Sedlák79e50cb2019-06-05 16:33:09 +020061 bool finished_correctly;
David Sedlák68a1af12019-03-08 13:46:54 +010062};
David Sedlák872c7b42018-10-26 13:15:20 +020063
David Sedlák79e50cb2019-06-05 16:33:09 +020064#define BUFSIZE 1024
65char logbuf[BUFSIZE] = {0};
66int store = -1; /* negative for infinite logging, positive for limited logging */
67
68/* set to 0 to printing error messages to stderr instead of checking them in code */
David Sedláke0ef1c62019-09-13 10:05:55 +020069#define ENABLE_LOGGER_CHECKING 1
David Sedlák79e50cb2019-06-05 16:33:09 +020070
71#if ENABLE_LOGGER_CHECKING
72static void
73logger(LY_LOG_LEVEL level, const char *msg, const char *path)
74{
75 (void) level; /* unused */
76 if (store) {
77 if (path && path[0]) {
78 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
79 } else {
80 strncpy(logbuf, msg, BUFSIZE - 1);
81 }
82 if (store > 0) {
83 --store;
84 }
85 }
86}
87#endif
88
89#if ENABLE_LOGGER_CHECKING
90# define logbuf_assert(str) assert_string_equal(logbuf, str)
91#else
92# define logbuf_assert(str)
93#endif
94
95#define TEST_DUP_GENERIC(PREFIX, MEMBER, VALUE1, VALUE2, FUNC, RESULT, LINE, CLEANUP) \
96 str = PREFIX MEMBER" "VALUE1";"MEMBER" "VALUE2";} ..."; \
97 assert_int_equal(LY_EVALID, FUNC(&ctx, &str, RESULT)); \
98 logbuf_assert("Duplicate keyword \""MEMBER"\". Line number "LINE"."); \
99 CLEANUP
100
David Sedlák8e7bda82019-07-16 17:57:50 +0200101int
102setup_ly_ctx(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100103{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200104 struct test_parser_yin_state *st = NULL;
David Sedlák3b4db242018-10-19 16:11:01 +0200105
David Sedlák68a1af12019-03-08 13:46:54 +0100106 /* allocate state variable */
107 (*state) = st = calloc(1, sizeof(*st));
108 if (!st) {
109 fprintf(stderr, "Memmory allocation failed");
110 return EXIT_FAILURE;
111 }
David Sedlák872c7b42018-10-26 13:15:20 +0200112
David Sedlák68a1af12019-03-08 13:46:54 +0100113 /* create new libyang context */
114 ly_ctx_new(NULL, 0, &st->ctx);
David Sedlák872c7b42018-10-26 13:15:20 +0200115
David Sedlák8e7bda82019-07-16 17:57:50 +0200116 return EXIT_SUCCESS;
117}
118
119int
120destroy_ly_ctx(void **state)
121{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200122 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +0200123 ly_ctx_destroy(st->ctx, NULL);
124 free(st);
125
126 return EXIT_SUCCESS;
127}
128
129static int
130setup_f(void **state)
131{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200132 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +0200133
134#if ENABLE_LOGGER_CHECKING
135 /* setup logger */
136 ly_set_log_clb(logger, 1);
137#endif
138
David Sedlák619db942019-07-03 14:47:30 +0200139 /* allocate parser context */
David Sedlákda8ffa32019-07-08 14:17:10 +0200140 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
Michal Vaskob36053d2020-03-26 15:49:30 +0100141 st->yin_ctx->format = LYS_IN_YIN;
David Sedlák8f5bce02019-06-03 16:41:08 +0200142
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200143 /* allocate new parsed module */
144 st->yin_ctx->parsed_mod = calloc(1, sizeof *st->yin_ctx->parsed_mod);
145
146 /* allocate new module */
147 st->yin_ctx->parsed_mod->mod = calloc(1, sizeof *st->yin_ctx->parsed_mod->mod);
148 st->yin_ctx->parsed_mod->mod->ctx = st->ctx;
149 st->yin_ctx->parsed_mod->mod->parsed = st->yin_ctx->parsed_mod;
150
Michal Vasko63f3d842020-07-08 10:10:14 +0200151 st->in = NULL;
152
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ák68a1af12019-03-08 13:46:54 +0100160
David Sedlák79e50cb2019-06-05 16:33:09 +0200161#if ENABLE_LOGGER_CHECKING
162 /* teardown logger */
163 if (!st->finished_correctly && logbuf[0] != '\0') {
164 fprintf(stderr, "%s\n", logbuf);
165 }
166#endif
167
Michal Vaskob36053d2020-03-26 15:49:30 +0100168 lyxml_ctx_free(st->yin_ctx->xmlctx);
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200169 lys_module_free(st->yin_ctx->parsed_mod->mod, NULL);
David Sedlákda8ffa32019-07-08 14:17:10 +0200170 free(st->yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +0200171 ly_in_free(st->in, 0);
David Sedlák68a1af12019-03-08 13:46:54 +0100172
173 return EXIT_SUCCESS;
174}
175
Radek Krejci3a4889a2020-05-19 17:01:58 +0200176static struct test_parser_yin_state*
David Sedlák392af4f2019-06-04 16:02:42 +0200177reset_state(void **state)
178{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200179 ((struct test_parser_yin_state *)*state)->finished_correctly = true;
David Sedlák555c7202019-07-04 12:14:12 +0200180 logbuf[0] = '\0';
David Sedlák392af4f2019-06-04 16:02:42 +0200181 teardown_f(state);
182 setup_f(state);
183
184 return *state;
185}
186
David Sedlák79e50cb2019-06-05 16:33:09 +0200187void
188logbuf_clean(void)
189{
190 logbuf[0] = '\0';
191}
192
David Sedlák8985a142019-07-31 16:43:06 +0200193static int
David Sedlák8985a142019-07-31 16:43:06 +0200194setup_element_test(void **state)
195{
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200196 struct test_parser_yin_state *st;
David Sedlák8985a142019-07-31 16:43:06 +0200197
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200198 setup_f(state);
199 st = *state;
David Sedlák8985a142019-07-31 16:43:06 +0200200
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200201 lydict_insert(st->ctx, "module-name", 0, &st->yin_ctx->parsed_mod->mod->name);
David Sedlák8985a142019-07-31 16:43:06 +0200202
203 return EXIT_SUCCESS;
204}
205
David Sedlák68a1af12019-03-08 13:46:54 +0100206static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200207test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200208{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200209 struct test_parser_yin_state *st = *state;
David Sedlák3b4db242018-10-19 16:11:01 +0200210
Michal Vaskob36053d2020-03-26 15:49:30 +0100211 const char *prefix;
212 size_t prefix_len;
David Sedlák8f7a1172019-06-20 14:42:18 +0200213 /* create mock yin namespace in xml context */
214 const char *data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />";
Michal Vasko63f3d842020-07-08 10:10:14 +0200215 ly_in_new_memory(data, &st->in);
216 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100217 prefix = st->yin_ctx->xmlctx->prefix;
218 prefix_len = st->yin_ctx->xmlctx->prefix_len;
David Sedlák8f7a1172019-06-20 14:42:18 +0200219
Radek Krejcid6b76452019-09-03 17:03:03 +0200220 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydatax", strlen("anydatax"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
221 assert_int_equal(yin_match_keyword(st->yin_ctx, "asdasd", strlen("asdasd"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
222 assert_int_equal(yin_match_keyword(st->yin_ctx, "", 0, prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
223 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydata", strlen("anydata"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ANYDATA);
224 assert_int_equal(yin_match_keyword(st->yin_ctx, "anyxml", strlen("anyxml"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ANYXML);
225 assert_int_equal(yin_match_keyword(st->yin_ctx, "argument", strlen("argument"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ARGUMENT);
226 assert_int_equal(yin_match_keyword(st->yin_ctx, "augment", strlen("augment"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_AUGMENT);
227 assert_int_equal(yin_match_keyword(st->yin_ctx, "base", strlen("base"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BASE);
228 assert_int_equal(yin_match_keyword(st->yin_ctx, "belongs-to", strlen("belongs-to"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BELONGS_TO);
229 assert_int_equal(yin_match_keyword(st->yin_ctx, "bit", strlen("bit"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BIT);
230 assert_int_equal(yin_match_keyword(st->yin_ctx, "case", strlen("case"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CASE);
231 assert_int_equal(yin_match_keyword(st->yin_ctx, "choice", strlen("choice"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CHOICE);
232 assert_int_equal(yin_match_keyword(st->yin_ctx, "config", strlen("config"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONFIG);
233 assert_int_equal(yin_match_keyword(st->yin_ctx, "contact", strlen("contact"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONTACT);
234 assert_int_equal(yin_match_keyword(st->yin_ctx, "container", strlen("container"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONTAINER);
235 assert_int_equal(yin_match_keyword(st->yin_ctx, "default", strlen("default"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEFAULT);
236 assert_int_equal(yin_match_keyword(st->yin_ctx, "description", strlen("description"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DESCRIPTION);
237 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviate", strlen("deviate"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEVIATE);
238 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviation", strlen("deviation"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEVIATION);
239 assert_int_equal(yin_match_keyword(st->yin_ctx, "enum", strlen("enum"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ENUM);
240 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);
241 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-message", strlen("error-message"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ERROR_MESSAGE);
242 assert_int_equal(yin_match_keyword(st->yin_ctx, "extension", strlen("extension"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_EXTENSION);
243 assert_int_equal(yin_match_keyword(st->yin_ctx, "feature", strlen("feature"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_FEATURE);
244 assert_int_equal(yin_match_keyword(st->yin_ctx, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_FRACTION_DIGITS);
245 assert_int_equal(yin_match_keyword(st->yin_ctx, "grouping", strlen("grouping"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_GROUPING);
246 assert_int_equal(yin_match_keyword(st->yin_ctx, "identity", strlen("identity"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IDENTITY);
247 assert_int_equal(yin_match_keyword(st->yin_ctx, "if-feature", strlen("if-feature"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IF_FEATURE);
248 assert_int_equal(yin_match_keyword(st->yin_ctx, "import", strlen("import"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IMPORT);
249 assert_int_equal(yin_match_keyword(st->yin_ctx, "include", strlen("include"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_INCLUDE);
250 assert_int_equal(yin_match_keyword(st->yin_ctx, "input", strlen("input"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_INPUT);
251 assert_int_equal(yin_match_keyword(st->yin_ctx, "key", strlen("key"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_KEY);
252 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf", strlen("leaf"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LEAF);
253 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf-list", strlen("leaf-list"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LEAF_LIST);
254 assert_int_equal(yin_match_keyword(st->yin_ctx, "length", strlen("length"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LENGTH);
255 assert_int_equal(yin_match_keyword(st->yin_ctx, "list", strlen("list"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LIST);
256 assert_int_equal(yin_match_keyword(st->yin_ctx, "mandatory", strlen("mandatory"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MANDATORY);
257 assert_int_equal(yin_match_keyword(st->yin_ctx, "max-elements", strlen("max-elements"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MAX_ELEMENTS);
258 assert_int_equal(yin_match_keyword(st->yin_ctx, "min-elements", strlen("min-elements"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MIN_ELEMENTS);
259 assert_int_equal(yin_match_keyword(st->yin_ctx, "modifier", strlen("modifier"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MODIFIER);
260 assert_int_equal(yin_match_keyword(st->yin_ctx, "module", strlen("module"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MODULE);
261 assert_int_equal(yin_match_keyword(st->yin_ctx, "must", strlen("must"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MUST);
262 assert_int_equal(yin_match_keyword(st->yin_ctx, "namespace", strlen("namespace"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NAMESPACE);
263 assert_int_equal(yin_match_keyword(st->yin_ctx, "notification", strlen("notification"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NOTIFICATION);
264 assert_int_equal(yin_match_keyword(st->yin_ctx, "ordered-by", strlen("ordered-by"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ORDERED_BY);
265 assert_int_equal(yin_match_keyword(st->yin_ctx, "organization", strlen("organization"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ORGANIZATION);
266 assert_int_equal(yin_match_keyword(st->yin_ctx, "output", strlen("output"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_OUTPUT);
267 assert_int_equal(yin_match_keyword(st->yin_ctx, "path", strlen("path"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PATH);
268 assert_int_equal(yin_match_keyword(st->yin_ctx, "pattern", strlen("pattern"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PATTERN);
269 assert_int_equal(yin_match_keyword(st->yin_ctx, "position", strlen("position"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_POSITION);
270 assert_int_equal(yin_match_keyword(st->yin_ctx, "prefix", strlen("prefix"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PREFIX);
271 assert_int_equal(yin_match_keyword(st->yin_ctx, "presence", strlen("presence"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PRESENCE);
272 assert_int_equal(yin_match_keyword(st->yin_ctx, "range", strlen("range"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_RANGE);
273 assert_int_equal(yin_match_keyword(st->yin_ctx, "reference", strlen("reference"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REFERENCE);
274 assert_int_equal(yin_match_keyword(st->yin_ctx, "refine", strlen("refine"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REFINE);
275 assert_int_equal(yin_match_keyword(st->yin_ctx, "require-instance", strlen("require-instance"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REQUIRE_INSTANCE);
276 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision", strlen("revision"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REVISION);
277 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision-date", strlen("revision-date"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REVISION_DATE);
278 assert_int_equal(yin_match_keyword(st->yin_ctx, "rpc", strlen("rpc"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_RPC);
279 assert_int_equal(yin_match_keyword(st->yin_ctx, "status", strlen("status"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_STATUS);
280 assert_int_equal(yin_match_keyword(st->yin_ctx, "submodule", strlen("submodule"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_SUBMODULE);
281 assert_int_equal(yin_match_keyword(st->yin_ctx, "type", strlen("type"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_TYPE);
282 assert_int_equal(yin_match_keyword(st->yin_ctx, "typedef", strlen("typedef"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_TYPEDEF);
283 assert_int_equal(yin_match_keyword(st->yin_ctx, "unique", strlen("unique"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_UNIQUE);
284 assert_int_equal(yin_match_keyword(st->yin_ctx, "units", strlen("units"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_UNITS);
285 assert_int_equal(yin_match_keyword(st->yin_ctx, "uses", strlen("uses"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_USES);
286 assert_int_equal(yin_match_keyword(st->yin_ctx, "value", strlen("value"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_VALUE);
287 assert_int_equal(yin_match_keyword(st->yin_ctx, "when", strlen("when"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_WHEN);
288 assert_int_equal(yin_match_keyword(st->yin_ctx, "yang-version", strlen("yang-version"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_YANG_VERSION);
289 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 +0200290
291 st->finished_correctly = true;
David Sedlák872c7b42018-10-26 13:15:20 +0200292}
David Sedlák3b4db242018-10-19 16:11:01 +0200293
David Sedlák872c7b42018-10-26 13:15:20 +0200294static void
David Sedlák060b00e2019-06-19 11:12:06 +0200295test_yin_match_argument_name(void **state)
David Sedlák872c7b42018-10-26 13:15:20 +0200296{
David Sedlák68a1af12019-03-08 13:46:54 +0100297 (void)state; /* unused */
David Sedlák872c7b42018-10-26 13:15:20 +0200298
David Sedlák060b00e2019-06-19 11:12:06 +0200299 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
300 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
301 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
302 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
303 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
304 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
305 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
306 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
307 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
308 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
309 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
310 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200311}
312
David Sedlák68a1af12019-03-08 13:46:54 +0100313static void
David Sedlákb1a78352019-06-28 16:16:29 +0200314test_yin_parse_element_generic(void **state)
315{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200316 struct test_parser_yin_state *st = *state;
David Sedlákb1a78352019-06-28 16:16:29 +0200317 struct lysp_ext_instance exts;
David Sedlákb1a78352019-06-28 16:16:29 +0200318 LY_ERR ret;
319
320 memset(&exts, 0, sizeof(exts));
321
David Sedlákb0ca07d2019-09-11 11:54:05 +0200322 const char *data = "<myext:elem attr=\"value\" xmlns:myext=\"urn:example:extensions\">text_value</myext:elem>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200323 ly_in_new_memory(data, &st->in);
324 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100325
326 ret = yin_parse_element_generic(st->yin_ctx, LY_STMT_EXTENSION_INSTANCE, &exts.child);
David Sedlákb1a78352019-06-28 16:16:29 +0200327 assert_int_equal(ret, LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +0100328 assert_int_equal(st->yin_ctx->xmlctx->status, LYXML_ELEM_CLOSE);
David Sedláke0ef1c62019-09-13 10:05:55 +0200329 assert_string_equal(exts.child->stmt, "urn:example:extensions:elem");
David Sedlákb1a78352019-06-28 16:16:29 +0200330 assert_string_equal(exts.child->arg, "text_value");
David Sedlákb1a78352019-06-28 16:16:29 +0200331 assert_string_equal(exts.child->child->stmt, "attr");
332 assert_string_equal(exts.child->child->arg, "value");
333 assert_true(exts.child->child->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200334 lysp_ext_instance_free(st->ctx, &exts);
David Sedlák5392a212019-07-01 09:19:10 +0200335 st = reset_state(state);
336
David Sedlákb0ca07d2019-09-11 11:54:05 +0200337 data = "<myext:elem xmlns:myext=\"urn:example:extensions\"></myext:elem>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200338 ly_in_new_memory(data, &st->in);
339 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100340
341 ret = yin_parse_element_generic(st->yin_ctx, LY_STMT_EXTENSION_INSTANCE, &exts.child);
David Sedlák5392a212019-07-01 09:19:10 +0200342 assert_int_equal(ret, LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +0100343 assert_int_equal(st->yin_ctx->xmlctx->status, LYXML_ELEM_CLOSE);
David Sedláke0ef1c62019-09-13 10:05:55 +0200344 assert_string_equal(exts.child->stmt, "urn:example:extensions:elem");
David Sedlák5392a212019-07-01 09:19:10 +0200345 assert_null(exts.child->child);
346 assert_null(exts.child->arg);
347 lysp_ext_instance_free(st->ctx, &exts);
348
David Sedlákb1a78352019-06-28 16:16:29 +0200349 st->finished_correctly = true;
350}
351
352static void
353test_yin_parse_extension_instance(void **state)
354{
355 LY_ERR ret;
Radek Krejci3a4889a2020-05-19 17:01:58 +0200356 struct test_parser_yin_state *st = *state;
David Sedlákb1a78352019-06-28 16:16:29 +0200357 struct lysp_ext_instance *exts = NULL;
David Sedlákb0ca07d2019-09-11 11:54:05 +0200358 const char *data = "<myext:ext value1=\"test\" value=\"test2\" xmlns:myext=\"urn:example:extensions\"><myext:subelem>text</myext:subelem></myext:ext>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200359 ly_in_new_memory(data, &st->in);
360 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100361
362 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200363 assert_int_equal(ret, LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200364 assert_string_equal(exts->name, "urn:example:extensions:ext");
David Sedlákb1a78352019-06-28 16:16:29 +0200365 assert_int_equal(exts->insubstmt_index, 0);
366 assert_true(exts->insubstmt == LYEXT_SUBSTMT_CONTACT);
367 assert_true(exts->yin & LYS_YIN);
368 assert_string_equal(exts->child->stmt, "value1");
369 assert_string_equal(exts->child->arg, "test");
370 assert_null(exts->child->child);
371 assert_true(exts->child->flags & LYS_YIN_ATTR);
372 assert_string_equal(exts->child->next->stmt, "value");
373 assert_string_equal(exts->child->next->arg, "test2");
374 assert_null(exts->child->next->child);
375 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
376
David Sedláke0ef1c62019-09-13 10:05:55 +0200377 assert_string_equal(exts->child->next->next->stmt, "urn:example:extensions:subelem");
David Sedlákb1a78352019-06-28 16:16:29 +0200378 assert_string_equal(exts->child->next->next->arg, "text");
379 assert_null(exts->child->next->next->child);
380 assert_null(exts->child->next->next->next);
381 assert_false(exts->child->next->next->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200382 lysp_ext_instance_free(st->ctx, exts);
383 LY_ARRAY_FREE(exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200384 exts = NULL;
David Sedlákf250ecf2019-07-01 11:02:05 +0200385 st = reset_state(state);
386
David Sedlákb0ca07d2019-09-11 11:54:05 +0200387 data = "<myext:extension-elem xmlns:myext=\"urn:example:extensions\" />";
Michal Vasko63f3d842020-07-08 10:10:14 +0200388 ly_in_new_memory(data, &st->in);
389 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100390
391 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200392 assert_int_equal(ret, LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200393 assert_string_equal(exts->name, "urn:example:extensions:extension-elem");
David Sedlákf250ecf2019-07-01 11:02:05 +0200394 assert_null(exts->argument);
395 assert_null(exts->child);
396 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
397 assert_int_equal(exts->insubstmt_index, 0);
398 assert_true(exts->yin & LYS_YIN);
David Sedlákf250ecf2019-07-01 11:02:05 +0200399 lysp_ext_instance_free(st->ctx, exts);
400 LY_ARRAY_FREE(exts);
David Sedlákadd0c2e2019-08-16 10:49:12 +0200401 exts = NULL;
David Sedlákadd0c2e2019-08-16 10:49:12 +0200402 st = reset_state(state);
403
David Sedlákb0ca07d2019-09-11 11:54:05 +0200404 data = "<myext:ext attr1=\"text1\" attr2=\"text2\" xmlns:myext=\"urn:example:extensions\">"
405 "<myext:ext-sub1/>"
406 "<myext:ext-sub2 sattr1=\"stext2\">"
407 "<myext:ext-sub21>"
408 "<myext:ext-sub211 sattr21=\"text21\"/>"
409 "</myext:ext-sub21>"
410 "</myext:ext-sub2>"
411 "<myext:ext-sub3 attr3=\"text3\"></myext:ext-sub3>"
412 "</myext:ext>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200413 ly_in_new_memory(data, &st->in);
414 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100415
416 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákadd0c2e2019-08-16 10:49:12 +0200417 assert_int_equal(ret, LY_SUCCESS);
418
David Sedláke0ef1c62019-09-13 10:05:55 +0200419 assert_string_equal(exts->name, "urn:example:extensions:ext");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200420 assert_null(exts->argument);
421 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
422 assert_int_equal(exts->insubstmt_index, 0);
423 assert_true(exts->yin & LYS_YIN);
424 assert_string_equal(exts->child->stmt, "attr1");
425 assert_string_equal(exts->child->arg, "text1");
426 assert_null(exts->child->child);
427 assert_true(exts->child->flags & LYS_YIN_ATTR);
428
429 assert_string_equal(exts->child->next->stmt, "attr2");
430 assert_string_equal(exts->child->next->arg, "text2");
431 assert_null(exts->child->next->child);
432 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
433
David Sedláke0ef1c62019-09-13 10:05:55 +0200434 assert_string_equal(exts->child->next->next->stmt, "urn:example:extensions:ext-sub1");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200435 assert_null(exts->child->next->next->arg);
436 assert_null(exts->child->next->next->child);
437 assert_int_equal(exts->child->next->next->flags, 0);
438
David Sedláke0ef1c62019-09-13 10:05:55 +0200439 assert_string_equal(exts->child->next->next->next->stmt, "urn:example:extensions:ext-sub2");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200440 assert_null(exts->child->next->next->next->arg);
441 assert_int_equal(exts->child->next->next->next->flags, 0);
442 assert_string_equal(exts->child->next->next->next->child->stmt, "sattr1");
443 assert_string_equal(exts->child->next->next->next->child->arg, "stext2");
444 assert_null(exts->child->next->next->next->child->child);
445 assert_true(exts->child->next->next->next->child->flags & LYS_YIN_ATTR);
446
David Sedláke0ef1c62019-09-13 10:05:55 +0200447 assert_string_equal(exts->child->next->next->next->child->next->stmt, "urn:example:extensions:ext-sub21");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200448 assert_null(exts->child->next->next->next->child->next->arg);
449 assert_null(exts->child->next->next->next->child->next->next);
450 assert_int_equal(exts->child->next->next->next->child->next->flags, 0);
451
David Sedláke0ef1c62019-09-13 10:05:55 +0200452 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 +0200453 assert_null(exts->child->next->next->next->child->next->child->arg);
454 assert_int_equal(exts->child->next->next->next->child->next->child->flags, 0);
455 assert_null(exts->child->next->next->next->child->next->child->next);
456
457 assert_string_equal(exts->child->next->next->next->child->next->child->child->stmt, "sattr21");
458 assert_string_equal(exts->child->next->next->next->child->next->child->child->arg, "text21");
459 assert_null(exts->child->next->next->next->child->next->child->child->next);
460 assert_null(exts->child->next->next->next->child->next->child->child->child);
461 assert_true(exts->child->next->next->next->child->next->child->child->flags & LYS_YIN_ATTR);
462
David Sedláke0ef1c62019-09-13 10:05:55 +0200463 assert_string_equal(exts->child->next->next->next->next->stmt, "urn:example:extensions:ext-sub3");
David Sedlákadd0c2e2019-08-16 10:49:12 +0200464 assert_null(exts->child->next->next->next->next->arg);
465 assert_null(exts->child->next->next->next->next->next);
466 assert_int_equal(exts->child->next->next->next->next->flags, 0);
467
468 assert_string_equal(exts->child->next->next->next->next->child->stmt, "attr3");
469 assert_string_equal(exts->child->next->next->next->next->child->arg, "text3");
470 assert_null(exts->child->next->next->next->next->child->next);
471 assert_null(exts->child->next->next->next->next->child->child);
472 assert_true(exts->child->next->next->next->next->child->flags & LYS_YIN_ATTR);
473
David Sedlákadd0c2e2019-08-16 10:49:12 +0200474 lysp_ext_instance_free(st->ctx, exts);
475 LY_ARRAY_FREE(exts);
476 exts = NULL;
David Sedlákaa98bba2019-09-12 11:52:14 +0200477 st = reset_state(state);
478
479 data = "<myext:extension-elem xmlns:myext=\"urn:example:extensions\" xmlns:yin=\"urn:ietf:params:xml:ns:yang:yin:1\">"
480 "<yin:action name=\"act-name\" pre:prefixed=\"ignored\"/>"
481 "<yin:augment target-node=\"target\"/>"
482 "<yin:status value=\"value\"/>"
483 "<yin:include module=\"mod\"/>"
484 "<yin:input />"
485 "<yin:must condition=\"cond\"/>"
486 "<yin:namespace uri=\"uri\"/>"
487 "<yin:revision date=\"data\"/>"
488 "<yin:unique tag=\"tag\"/>"
David Sedlákd2844882019-09-13 16:01:22 +0200489 "<yin:description><yin:text>contact-val</yin:text></yin:description>"
490 "<yin:error-message><yin:value>err-msg</yin:value></yin:error-message>"
David Sedlákaa98bba2019-09-12 11:52:14 +0200491 "</myext:extension-elem>";
Michal Vasko63f3d842020-07-08 10:10:14 +0200492 ly_in_new_memory(data, &st->in);
493 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100494
495 ret = yin_parse_extension_instance(st->yin_ctx, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákaa98bba2019-09-12 11:52:14 +0200496 assert_int_equal(ret, LY_SUCCESS);
497 assert_string_equal(exts->child->arg, "act-name");
498 assert_string_equal(exts->child->next->arg, "target");
499 assert_string_equal(exts->child->next->next->arg, "value");
500 assert_string_equal(exts->child->next->next->next->arg, "mod");
501 assert_null(exts->child->next->next->next->next->arg);
502 assert_string_equal(exts->child->next->next->next->next->next->arg, "cond");
503 assert_string_equal(exts->child->next->next->next->next->next->next->arg, "uri");
504 assert_string_equal(exts->child->next->next->next->next->next->next->next->arg, "data");
505 assert_string_equal(exts->child->next->next->next->next->next->next->next->next->arg, "tag");
506 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 +0200507 lysp_ext_instance_free(st->ctx, exts);
508 LY_ARRAY_FREE(exts);
509 exts = NULL;
David Sedlákaa98bba2019-09-12 11:52:14 +0200510 st = reset_state(state);
David Sedlákadd0c2e2019-08-16 10:49:12 +0200511
David Sedlákb1a78352019-06-28 16:16:29 +0200512 st->finished_correctly = true;
513}
514
David Sedlák555c7202019-07-04 12:14:12 +0200515static void
516test_yin_parse_content(void **state)
517{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200518 struct test_parser_yin_state *st = *state;
David Sedlák555c7202019-07-04 12:14:12 +0200519 LY_ERR ret = LY_SUCCESS;
David Sedlák555c7202019-07-04 12:14:12 +0200520 const char *data = "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákb0ca07d2019-09-11 11:54:05 +0200521 "<myext:custom xmlns:myext=\"urn:example:extensions\">"
David Sedlák555c7202019-07-04 12:14:12 +0200522 "totally amazing extension"
David Sedlákb0ca07d2019-09-11 11:54:05 +0200523 "</myext:custom>"
David Sedlákaa98bba2019-09-12 11:52:14 +0200524 "<extension name=\"ext\">"
David Sedlák986cb412019-07-04 13:10:11 +0200525 "<argument name=\"argname\"></argument>"
526 "<description><text>desc</text></description>"
527 "<reference><text>ref</text></reference>"
528 "<status value=\"deprecated\"></status>"
David Sedlákaa98bba2019-09-12 11:52:14 +0200529 "</extension>"
David Sedlák555c7202019-07-04 12:14:12 +0200530 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedlák32488102019-07-15 17:44:10 +0200531 "<if-feature name=\"foo\"></if-feature>"
David Sedlák32eee7b2019-07-09 12:38:44 +0200532 "<when condition=\"condition...\">"
533 "<reference><text>when_ref</text></reference>"
534 "<description><text>when_desc</text></description>"
535 "</when>"
David Sedláke1a30302019-07-10 13:49:38 +0200536 "<config value=\"true\"/>"
David Sedlákc1771b12019-07-10 15:55:46 +0200537 "<error-message>"
538 "<value>error-msg</value>"
539 "</error-message>"
David Sedlák2ce1be62019-07-10 16:15:09 +0200540 "<error-app-tag value=\"err-app-tag\"/>"
David Sedláka5b1d382019-07-10 16:31:09 +0200541 "<units name=\"radians\"></units>"
David Sedláke7084ce2019-07-10 16:44:15 +0200542 "<default value=\"default-value\"/>"
David Sedlák5545f5d2019-07-11 11:55:16 +0200543 "<position value=\"25\"></position>"
544 "<value value=\"-5\"/>"
David Sedlákcf5569a2019-07-11 13:31:34 +0200545 "<require-instance value=\"true\"></require-instance>"
David Sedlákb7296dd2019-07-11 14:58:38 +0200546 "<range value=\"5..10\" />"
David Sedlák438ae432019-07-11 15:36:54 +0200547 "<length value=\"baf\"/>"
David Sedlákd3983112019-07-12 11:20:56 +0200548 "<pattern value='pattern'>"
549 "<modifier value='invert-match'/>"
550 "</pattern>"
David Sedlákfd5b9c32019-07-12 15:33:13 +0200551 "<enum name=\"yay\">"
552 "</enum>"
David Sedlák555c7202019-07-04 12:14:12 +0200553 "</prefix>";
554 struct lysp_ext_instance *exts = NULL;
David Sedlák5f8191e2019-07-08 16:35:52 +0200555 const char **if_features = NULL;
Michal Vasko7f45cf22020-10-01 12:49:44 +0200556 const char *value, *err_msg, *app_tag, *units;
557 struct lysp_qname def = {0};
David Sedlák986cb412019-07-04 13:10:11 +0200558 struct lysp_ext *ext_def = NULL;
David Sedlák32eee7b2019-07-09 12:38:44 +0200559 struct lysp_when *when_p = NULL;
David Sedlákcf5569a2019-07-11 13:31:34 +0200560 struct lysp_type_enum pos_enum = {}, val_enum = {};
David Sedlákfd5b9c32019-07-12 15:33:13 +0200561 struct lysp_type req_type = {}, range_type = {}, len_type = {}, patter_type = {}, enum_type = {};
David Sedláke1a30302019-07-10 13:49:38 +0200562 uint8_t config = 0;
David Sedlák555c7202019-07-04 12:14:12 +0200563
Michal Vasko63f3d842020-07-08 10:10:14 +0200564 ly_in_new_memory(data, &st->in);
565 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100566 lyxml_ctx_next(st->yin_ctx->xmlctx);
567 lyxml_ctx_next(st->yin_ctx->xmlctx);
568 lyxml_ctx_next(st->yin_ctx->xmlctx);
David Sedlák555c7202019-07-04 12:14:12 +0200569
David Sedlákfd5b9c32019-07-12 15:33:13 +0200570 struct yin_subelement subelems[17] = {
Radek Krejcid6b76452019-09-03 17:03:03 +0200571 {LY_STMT_CONFIG, &config, 0},
572 {LY_STMT_DEFAULT, &def, YIN_SUBELEM_UNIQUE},
573 {LY_STMT_ENUM, &enum_type, 0},
574 {LY_STMT_ERROR_APP_TAG, &app_tag, YIN_SUBELEM_UNIQUE},
575 {LY_STMT_ERROR_MESSAGE, &err_msg, 0},
576 {LY_STMT_EXTENSION, &ext_def, 0},
577 {LY_STMT_IF_FEATURE, &if_features, 0},
578 {LY_STMT_LENGTH, &len_type, 0},
579 {LY_STMT_PATTERN, &patter_type, 0},
580 {LY_STMT_POSITION, &pos_enum, 0},
581 {LY_STMT_RANGE, &range_type, 0},
582 {LY_STMT_REQUIRE_INSTANCE, &req_type, 0},
583 {LY_STMT_UNITS, &units, YIN_SUBELEM_UNIQUE},
584 {LY_STMT_VALUE, &val_enum, 0},
585 {LY_STMT_WHEN, &when_p, 0},
586 {LY_STMT_EXTENSION_INSTANCE, NULL, 0},
587 {LY_STMT_ARG_TEXT, &value, 0}
David Sedlákd3983112019-07-12 11:20:56 +0200588 };
Michal Vaskob36053d2020-03-26 15:49:30 +0100589 ret = yin_parse_content(st->yin_ctx, subelems, 17, LY_STMT_PREFIX, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200590 assert_int_equal(ret, LY_SUCCESS);
David Sedlák2ce1be62019-07-10 16:15:09 +0200591 /* check parsed values */
Michal Vasko7f45cf22020-10-01 12:49:44 +0200592 assert_string_equal(def.str, "default-value");
David Sedláke0ef1c62019-09-13 10:05:55 +0200593 assert_string_equal(exts->name, "urn:example:extensions:custom");
David Sedlák555c7202019-07-04 12:14:12 +0200594 assert_string_equal(exts->argument, "totally amazing extension");
595 assert_string_equal(value, "wsefsdf");
David Sedláka5b1d382019-07-10 16:31:09 +0200596 assert_string_equal(units, "radians");
David Sedlák32eee7b2019-07-09 12:38:44 +0200597 assert_string_equal(when_p->cond, "condition...");
598 assert_string_equal(when_p->dsc, "when_desc");
599 assert_string_equal(when_p->ref, "when_ref");
David Sedláke1a30302019-07-10 13:49:38 +0200600 assert_int_equal(config, LYS_CONFIG_W);
David Sedlák5545f5d2019-07-11 11:55:16 +0200601 assert_int_equal(pos_enum.value, 25);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200602 assert_true(pos_enum.flags & LYS_SET_VALUE);
David Sedlák5545f5d2019-07-11 11:55:16 +0200603 assert_int_equal(val_enum.value, -5);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200604 assert_true(val_enum.flags & LYS_SET_VALUE);
David Sedlákcf5569a2019-07-11 13:31:34 +0200605 assert_int_equal(req_type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200606 assert_true(req_type.flags &= LYS_SET_REQINST);
Michal Vasko7f45cf22020-10-01 12:49:44 +0200607 assert_string_equal(range_type.range->arg.str, "5..10");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200608 assert_true(range_type.flags & LYS_SET_RANGE);
David Sedlákc1771b12019-07-10 15:55:46 +0200609 assert_string_equal(err_msg, "error-msg");
David Sedlák2ce1be62019-07-10 16:15:09 +0200610 assert_string_equal(app_tag, "err-app-tag");
David Sedlákfd5b9c32019-07-12 15:33:13 +0200611 assert_string_equal(enum_type.enums->name, "yay");
Michal Vasko7f45cf22020-10-01 12:49:44 +0200612 assert_string_equal(len_type.length->arg.str, "baf");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200613 assert_true(len_type.flags & LYS_SET_LENGTH);
Michal Vasko7f45cf22020-10-01 12:49:44 +0200614 assert_string_equal(patter_type.patterns->arg.str, "\x015pattern");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200615 assert_true(patter_type.flags & LYS_SET_PATTERN);
David Sedlák2ce1be62019-07-10 16:15:09 +0200616 /* cleanup */
David Sedlák555c7202019-07-04 12:14:12 +0200617 lysp_ext_instance_free(st->ctx, exts);
David Sedlák32eee7b2019-07-09 12:38:44 +0200618 lysp_when_free(st->ctx, when_p);
David Sedlák986cb412019-07-04 13:10:11 +0200619 lysp_ext_free(st->ctx, ext_def);
David Sedlák5f8191e2019-07-08 16:35:52 +0200620 FREE_STRING(st->ctx, *if_features);
David Sedlákc1771b12019-07-10 15:55:46 +0200621 FREE_STRING(st->ctx, err_msg);
David Sedlák2ce1be62019-07-10 16:15:09 +0200622 FREE_STRING(st->ctx, app_tag);
David Sedláka5b1d382019-07-10 16:31:09 +0200623 FREE_STRING(st->ctx, units);
Michal Vasko7f45cf22020-10-01 12:49:44 +0200624 FREE_STRING(st->ctx, patter_type.patterns->arg.str);
625 FREE_STRING(st->ctx, def.str);
626 FREE_STRING(st->ctx, range_type.range->arg.str);
627 FREE_STRING(st->ctx, len_type.length->arg.str);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200628 FREE_STRING(st->ctx, enum_type.enums->name);
David Sedlákb7296dd2019-07-11 14:58:38 +0200629 FREE_STRING(st->ctx, value);
David Sedlák5f8191e2019-07-08 16:35:52 +0200630 LY_ARRAY_FREE(if_features);
David Sedlák555c7202019-07-04 12:14:12 +0200631 LY_ARRAY_FREE(exts);
David Sedlák986cb412019-07-04 13:10:11 +0200632 LY_ARRAY_FREE(ext_def);
David Sedlákd3983112019-07-12 11:20:56 +0200633 LY_ARRAY_FREE(patter_type.patterns);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200634 LY_ARRAY_FREE(enum_type.enums);
David Sedlák32eee7b2019-07-09 12:38:44 +0200635 free(when_p);
David Sedlákb7296dd2019-07-11 14:58:38 +0200636 free(range_type.range);
David Sedlák438ae432019-07-11 15:36:54 +0200637 free(len_type.length);
David Sedlák555c7202019-07-04 12:14:12 +0200638 st = reset_state(state);
639
640 /* test unique subelem */
641 const char *prefix_value;
Radek Krejcid6b76452019-09-03 17:03:03 +0200642 struct yin_subelement subelems2[2] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_UNIQUE},
643 {LY_STMT_ARG_TEXT, &value, YIN_SUBELEM_UNIQUE}};
David Sedláke6cd89e2019-08-07 12:46:02 +0200644 data = ELEMENT_WRAPPER_START
David Sedlák555c7202019-07-04 12:14:12 +0200645 "<prefix value=\"inv_mod\" />"
646 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
647 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedláke6cd89e2019-08-07 12:46:02 +0200648 ELEMENT_WRAPPER_END;
Michal Vasko63f3d842020-07-08 10:10:14 +0200649 ly_in_new_memory(data, &st->in);
650 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100651 lyxml_ctx_next(st->yin_ctx->xmlctx);
652
653 ret = yin_parse_content(st->yin_ctx, subelems2, 2, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200654 assert_int_equal(ret, LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200655 logbuf_assert("Redefinition of \"text\" sub-element in \"status\" element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200656 lydict_remove(st->ctx, prefix_value);
657 lydict_remove(st->ctx, value);
658 st = reset_state(state);
David Sedlák555c7202019-07-04 12:14:12 +0200659
660 /* test first subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200661 data = ELEMENT_WRAPPER_START
David Sedlák555c7202019-07-04 12:14:12 +0200662 "<prefix value=\"inv_mod\" />"
663 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
664 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedláke6cd89e2019-08-07 12:46:02 +0200665 ELEMENT_WRAPPER_END;
Radek Krejcid6b76452019-09-03 17:03:03 +0200666 struct yin_subelement subelems3[2] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_UNIQUE},
667 {LY_STMT_ARG_TEXT, &value, YIN_SUBELEM_FIRST}};
Michal Vasko63f3d842020-07-08 10:10:14 +0200668 ly_in_new_memory(data, &st->in);
669 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100670 lyxml_ctx_next(st->yin_ctx->xmlctx);
671
672 ret = yin_parse_content(st->yin_ctx, subelems3, 2, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200673 assert_int_equal(ret, LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200674 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 +0200675 lydict_remove(st->ctx, prefix_value);
676 st = reset_state(state);
David Sedlák555c7202019-07-04 12:14:12 +0200677
678 /* test mandatory subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200679 data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
Radek Krejcid6b76452019-09-03 17:03:03 +0200680 struct yin_subelement subelems4[1] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY | YIN_SUBELEM_UNIQUE}};
Michal Vasko63f3d842020-07-08 10:10:14 +0200681 ly_in_new_memory(data, &st->in);
682 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100683 lyxml_ctx_next(st->yin_ctx->xmlctx);
684
685 ret = yin_parse_content(st->yin_ctx, subelems4, 1, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200686 assert_int_equal(ret, LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200687 logbuf_assert("Missing mandatory sub-element \"prefix\" of \"status\" element. Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200688
689 st->finished_correctly = true;
690}
691
David Sedlák92147b02019-07-09 14:01:01 +0200692static void
David Sedlák4a650532019-07-10 11:55:18 +0200693test_validate_value(void **state)
694{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200695 struct test_parser_yin_state *st = *state;
Michal Vaskob36053d2020-03-26 15:49:30 +0100696 const char *data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
697
698 /* create some XML context */
Michal Vasko63f3d842020-07-08 10:10:14 +0200699 ly_in_new_memory(data, &st->in);
700 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100701 st->yin_ctx->xmlctx->status = LYXML_ELEM_CONTENT;
702 st->yin_ctx->xmlctx->dynamic = 0;
703
704 st->yin_ctx->xmlctx->value = "#invalid";
705 st->yin_ctx->xmlctx->value_len = 8;
706 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG), LY_EVALID);
Radek Krejci1deb5be2020-08-26 16:43:36 +0200707 logbuf_assert("Invalid identifier character '#' (0x0023). Line number 1.");
Michal Vaskob36053d2020-03-26 15:49:30 +0100708
709 st->yin_ctx->xmlctx->value = "";
710 st->yin_ctx->xmlctx->value_len = 0;
711 assert_int_equal(yin_validate_value(st->yin_ctx, Y_STR_ARG), LY_SUCCESS);
712
713 st->yin_ctx->xmlctx->value = "pre:b";
714 st->yin_ctx->xmlctx->value_len = 5;
715 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG), LY_EVALID);
716 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG), LY_SUCCESS);
717
718 st->yin_ctx->xmlctx->value = "pre:pre:b";
719 st->yin_ctx->xmlctx->value_len = 9;
720 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG), LY_EVALID);
David Sedlák4a650532019-07-10 11:55:18 +0200721
722 st->finished_correctly = true;
723}
724
David Sedlák32488102019-07-15 17:44:10 +0200725/* helper function to simplify unit test of each element using parse_content function */
726LY_ERR
Radek Krejci3a4889a2020-05-19 17:01:58 +0200727test_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 +0200728{
David Sedlákc5b20842019-08-13 10:18:31 +0200729 const char *name, *prefix;
730 size_t name_len, prefix_len;
David Sedlák32488102019-07-15 17:44:10 +0200731 LY_ERR ret = LY_SUCCESS;
732 struct yin_subelement subelems[71] = {
Radek Krejcid6b76452019-09-03 17:03:03 +0200733 {LY_STMT_ACTION, dest, 0},
734 {LY_STMT_ANYDATA, dest, 0},
735 {LY_STMT_ANYXML, dest, 0},
736 {LY_STMT_ARGUMENT,dest, 0},
737 {LY_STMT_AUGMENT, dest, 0},
738 {LY_STMT_BASE, dest, 0},
739 {LY_STMT_BELONGS_TO, dest, 0},
740 {LY_STMT_BIT, dest, 0},
741 {LY_STMT_CASE, dest, 0},
742 {LY_STMT_CHOICE, dest, 0},
743 {LY_STMT_CONFIG, dest, 0},
744 {LY_STMT_CONTACT, dest, 0},
745 {LY_STMT_CONTAINER, dest, 0},
746 {LY_STMT_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
747 {LY_STMT_DESCRIPTION, dest, 0},
748 {LY_STMT_DEVIATE, dest, 0},
749 {LY_STMT_DEVIATION, dest, 0},
750 {LY_STMT_ENUM, dest, 0},
751 {LY_STMT_ERROR_APP_TAG, dest, YIN_SUBELEM_UNIQUE},
752 {LY_STMT_ERROR_MESSAGE, dest, 0},
753 {LY_STMT_EXTENSION, dest, 0},
754 {LY_STMT_FEATURE, dest, 0},
755 {LY_STMT_FRACTION_DIGITS, dest, 0},
756 {LY_STMT_GROUPING, dest, 0},
757 {LY_STMT_IDENTITY, dest, 0},
758 {LY_STMT_IF_FEATURE, dest, 0},
759 {LY_STMT_IMPORT, dest, 0},
760 {LY_STMT_INCLUDE, dest, 0},
761 {LY_STMT_INPUT, dest, 0},
762 {LY_STMT_KEY, dest, YIN_SUBELEM_UNIQUE},
763 {LY_STMT_LEAF, dest, 0},
764 {LY_STMT_LEAF_LIST, dest, 0},
765 {LY_STMT_LENGTH, dest, 0},
766 {LY_STMT_LIST, dest, 0},
767 {LY_STMT_MANDATORY, dest, 0},
768 {LY_STMT_MAX_ELEMENTS, dest, 0},
769 {LY_STMT_MIN_ELEMENTS, dest, 0},
770 {LY_STMT_MODIFIER, dest, 0},
771 {LY_STMT_MODULE, dest, 0},
772 {LY_STMT_MUST, dest, 0},
773 {LY_STMT_NAMESPACE, dest, YIN_SUBELEM_UNIQUE},
774 {LY_STMT_NOTIFICATION, dest, 0},
775 {LY_STMT_ORDERED_BY, dest, 0},
776 {LY_STMT_ORGANIZATION, dest, 0},
777 {LY_STMT_OUTPUT, dest, 0},
778 {LY_STMT_PATH, dest, 0},
779 {LY_STMT_PATTERN, dest, 0},
780 {LY_STMT_POSITION, dest, 0},
781 {LY_STMT_PREFIX, dest, YIN_SUBELEM_UNIQUE},
782 {LY_STMT_PRESENCE, dest, YIN_SUBELEM_UNIQUE},
783 {LY_STMT_RANGE, dest, 0},
784 {LY_STMT_REFERENCE, dest, 0},
785 {LY_STMT_REFINE, dest, 0},
786 {LY_STMT_REQUIRE_INSTANCE, dest, 0},
787 {LY_STMT_REVISION, dest, 0},
788 {LY_STMT_REVISION_DATE, dest, 0},
789 {LY_STMT_RPC, dest, 0},
790 {LY_STMT_STATUS, dest, 0},
791 {LY_STMT_SUBMODULE, dest, 0},
792 {LY_STMT_TYPE, dest, 0},
793 {LY_STMT_TYPEDEF, dest, 0},
794 {LY_STMT_UNIQUE, dest, 0},
795 {LY_STMT_UNITS, dest, YIN_SUBELEM_UNIQUE},
796 {LY_STMT_USES, dest, 0},
797 {LY_STMT_VALUE, dest, 0},
798 {LY_STMT_WHEN, dest, 0},
799 {LY_STMT_YANG_VERSION, dest, 0},
800 {LY_STMT_YIN_ELEMENT, dest, 0},
801 {LY_STMT_EXTENSION_INSTANCE, dest, 0},
802 {LY_STMT_ARG_TEXT, dest, 0},
803 {LY_STMT_ARG_VALUE, dest, 0}
David Sedlák32488102019-07-15 17:44:10 +0200804 };
Michal Vasko63f3d842020-07-08 10:10:14 +0200805 ly_in_new_memory(data, &st->in);
806 lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100807 prefix = st->yin_ctx->xmlctx->prefix;
808 prefix_len = st->yin_ctx->xmlctx->prefix_len;
809 name = st->yin_ctx->xmlctx->name;
810 name_len = st->yin_ctx->xmlctx->name_len;
811 lyxml_ctx_next(st->yin_ctx->xmlctx);
812
813 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);
814
Michal Vasko63f3d842020-07-08 10:10:14 +0200815 /* free parser and input */
Michal Vaskob36053d2020-03-26 15:49:30 +0100816 lyxml_ctx_free(st->yin_ctx->xmlctx);
817 st->yin_ctx->xmlctx = NULL;
Michal Vasko63f3d842020-07-08 10:10:14 +0200818 ly_in_free(st->in, 0);
819 st->in = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200820 return ret;
821}
822
David Sedlákd1144562019-08-06 12:36:14 +0200823#define EXT_SUBELEM "<myext:c-define name=\"MY_MTU\" xmlns:myext=\"urn:example:extensions\"/>"
824
David Sedlák32488102019-07-15 17:44:10 +0200825static void
David Sedlák43801c92019-08-05 15:58:54 +0200826test_enum_elem(void **state)
David Sedlák32488102019-07-15 17:44:10 +0200827{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200828 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200829 struct lysp_type type = {};
830 const char *data;
831 data = ELEMENT_WRAPPER_START
832 "<enum name=\"enum-name\">"
833 "<if-feature name=\"feature\" />"
834 "<value value=\"55\" />"
835 "<status value=\"deprecated\" />"
836 "<description><text>desc...</text></description>"
837 "<reference><text>ref...</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +0200838 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +0200839 "</enum>"
840 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100841 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200842 assert_string_equal(type.enums->name, "enum-name");
Michal Vasko7f45cf22020-10-01 12:49:44 +0200843 assert_string_equal(type.enums->iffeatures[0].str, "feature");
David Sedlák32488102019-07-15 17:44:10 +0200844 assert_int_equal(type.enums->value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200845 assert_true((type.enums->flags & LYS_STATUS_DEPRC) && (type.enums->flags & LYS_SET_VALUE));
David Sedlák32488102019-07-15 17:44:10 +0200846 assert_string_equal(type.enums->dsc, "desc...");
847 assert_string_equal(type.enums->ref, "ref...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200848 assert_string_equal(type.enums->exts->name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200849 assert_int_equal(type.enums->exts->insubstmt_index, 0);
850 assert_int_equal(type.enums->exts->insubstmt, LYEXT_SUBSTMT_SELF);
851 lysp_type_free(st->ctx, &type);
852 memset(&type, 0, sizeof type);
853
854 data = ELEMENT_WRAPPER_START
855 "<enum name=\"enum-name\"></enum>"
856 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100857 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200858 assert_string_equal(type.enums->name, "enum-name");
David Sedlák32488102019-07-15 17:44:10 +0200859 lysp_type_free(st->ctx, &type);
860 memset(&type, 0, sizeof type);
861
David Sedlák43801c92019-08-05 15:58:54 +0200862 st->finished_correctly = true;
863}
864
865static void
866test_bit_elem(void **state)
867{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200868 struct test_parser_yin_state *st = *state;
David Sedlák43801c92019-08-05 15:58:54 +0200869 struct lysp_type type = {};
870 const char *data;
871 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200872 "<bit name=\"bit-name\">"
David Sedlák43801c92019-08-05 15:58:54 +0200873 "<if-feature name=\"feature\" />"
874 "<position value=\"55\" />"
875 "<status value=\"deprecated\" />"
876 "<description><text>desc...</text></description>"
877 "<reference><text>ref...</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +0200878 EXT_SUBELEM
David Sedlák43801c92019-08-05 15:58:54 +0200879 "</bit>"
880 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100881 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200882 assert_string_equal(type.bits->name, "bit-name");
Michal Vasko7f45cf22020-10-01 12:49:44 +0200883 assert_string_equal(type.bits->iffeatures[0].str, "feature");
David Sedlák43801c92019-08-05 15:58:54 +0200884 assert_int_equal(type.bits->value, 55);
885 assert_true((type.bits->flags & LYS_STATUS_DEPRC) && (type.bits->flags & LYS_SET_VALUE));
886 assert_string_equal(type.bits->dsc, "desc...");
887 assert_string_equal(type.bits->ref, "ref...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200888 assert_string_equal(type.bits->exts->name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200889 assert_int_equal(type.bits->exts->insubstmt_index, 0);
890 assert_int_equal(type.bits->exts->insubstmt, LYEXT_SUBSTMT_SELF);
891 lysp_type_free(st->ctx, &type);
892 memset(&type, 0, sizeof type);
893
894 data = ELEMENT_WRAPPER_START
895 "<bit name=\"bit-name\"> </bit>"
896 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100897 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +0200898 assert_string_equal(type.bits->name, "bit-name");
David Sedlák43801c92019-08-05 15:58:54 +0200899 lysp_type_free(st->ctx, &type);
900 memset(&type, 0, sizeof type);
901
David Sedlák32488102019-07-15 17:44:10 +0200902 st->finished_correctly = true;
903}
904
905static void
906test_meta_elem(void **state)
907{
Radek Krejci3a4889a2020-05-19 17:01:58 +0200908 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200909 char *value = NULL;
910 const char *data;
David Sedlákd1144562019-08-06 12:36:14 +0200911 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200912
913 /* organization element */
914 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200915 "<organization><text>organization...</text>" EXT_SUBELEM EXT_SUBELEM "</organization>"
David Sedlák32488102019-07-15 17:44:10 +0200916 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100917 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200918 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200919 assert_int_equal(exts[0].insubstmt_index, 0);
920 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORGANIZATION);
David Sedláke0ef1c62019-09-13 10:05:55 +0200921 assert_string_equal(exts[1].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200922 assert_int_equal(exts[1].insubstmt_index, 0);
923 assert_int_equal(exts[1].insubstmt, LYEXT_SUBSTMT_ORGANIZATION);
David Sedlák32488102019-07-15 17:44:10 +0200924 assert_string_equal(value, "organization...");
925 FREE_STRING(st->ctx, value);
David Sedlákd1144562019-08-06 12:36:14 +0200926 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +0200927 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200928 exts = NULL;
929
David Sedlák32488102019-07-15 17:44:10 +0200930 /* contact element */
931 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200932 "<contact><text>contact...</text>" EXT_SUBELEM "</contact>"
David Sedlák32488102019-07-15 17:44:10 +0200933 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100934 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +0200935 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200936 assert_int_equal(exts[0].insubstmt_index, 0);
937 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONTACT);
David Sedlák32488102019-07-15 17:44:10 +0200938 assert_string_equal(value, "contact...");
939 FREE_STRING(st->ctx, value);
David Sedlákd1144562019-08-06 12:36:14 +0200940 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
941 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +0200942 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200943
David Sedlák32488102019-07-15 17:44:10 +0200944 /* description element */
945 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200946 "<description><text>description...</text>" EXT_SUBELEM "</description>"
David Sedlák32488102019-07-15 17:44:10 +0200947 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100948 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +0200949 assert_string_equal(value, "description...");
David Sedláke0ef1c62019-09-13 10:05:55 +0200950 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +0200951 assert_int_equal(exts[0].insubstmt_index, 0);
952 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DESCRIPTION);
David Sedlák32488102019-07-15 17:44:10 +0200953 FREE_STRING(st->ctx, value);
954 value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +0200955 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
956 exts = NULL;
957
David Sedlák32488102019-07-15 17:44:10 +0200958 /* reference element */
959 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +0200960 "<reference><text>reference...</text>" EXT_SUBELEM "</reference>"
David Sedlák32488102019-07-15 17:44:10 +0200961 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100962 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +0200963 assert_string_equal(value, "reference...");
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_REFERENCE);
David Sedlák32488102019-07-15 17:44:10 +0200967 FREE_STRING(st->ctx, value);
968 value = NULL;
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
David Sedlákdf2a9732019-08-07 13:23:16 +0200972 /* reference element */
973 data = ELEMENT_WRAPPER_START
974 "<reference invalid=\"text\"><text>reference...</text>""</reference>"
975 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100976 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200977 logbuf_assert("Unexpected attribute \"invalid\" of \"reference\" element. Line number 1.");
David Sedlákdf2a9732019-08-07 13:23:16 +0200978 FREE_STRING(st->ctx, value);
979 value = NULL;
980 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
981 exts = NULL;
982
David Sedlák32488102019-07-15 17:44:10 +0200983 /* missing text subelement */
984 data = ELEMENT_WRAPPER_START
985 "<reference>reference...</reference>"
986 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100987 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200988 logbuf_assert("Missing mandatory sub-element \"text\" of \"reference\" element. Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +0200989
David Sedlákd1144562019-08-06 12:36:14 +0200990 /* reference element */
991 data = ELEMENT_WRAPPER_START
992 "<reference>" EXT_SUBELEM "<text>reference...</text></reference>"
993 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +0100994 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +0200995 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 +0200996 FREE_STRING(st->ctx, value);
997 value = NULL;
998 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
999 exts = NULL;
1000
David Sedlák32488102019-07-15 17:44:10 +02001001 st->finished_correctly = true;
1002}
1003
1004static void
1005test_import_elem(void **state)
1006{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001007 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001008 const char *data;
David Sedlák298ff6d2019-07-26 14:29:03 +02001009 struct lysp_import *imports = NULL;
1010 struct import_meta imp_meta = {"prefix", &imports};
David Sedlák32488102019-07-15 17:44:10 +02001011
1012 /* max subelems */
1013 data = ELEMENT_WRAPPER_START
1014 "<import module=\"a\">"
David Sedlákd1144562019-08-06 12:36:14 +02001015 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +02001016 "<prefix value=\"a_mod\"/>"
1017 "<revision-date date=\"2015-01-01\"></revision-date>"
1018 "<description><text>import description</text></description>"
1019 "<reference><text>import reference</text></reference>"
1020 "</import>"
1021 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001022 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02001023 assert_string_equal(imports->name, "a");
1024 assert_string_equal(imports->prefix, "a_mod");
1025 assert_string_equal(imports->rev, "2015-01-01");
1026 assert_string_equal(imports->dsc, "import description");
1027 assert_string_equal(imports->ref, "import reference");
David Sedláke0ef1c62019-09-13 10:05:55 +02001028 assert_string_equal(imports->exts->name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001029 assert_int_equal(imports->exts->insubstmt, LYEXT_SUBSTMT_SELF);
1030 assert_int_equal(imports->exts->insubstmt_index, 0);
David Sedlák298ff6d2019-07-26 14:29:03 +02001031 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1032 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001033
1034 /* min subelems */
David Sedlák32488102019-07-15 17:44:10 +02001035 data = ELEMENT_WRAPPER_START
1036 "<import module=\"a\">"
1037 "<prefix value=\"a_mod\"/>"
1038 "</import>"
1039 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001040 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02001041 assert_string_equal(imports->prefix, "a_mod");
1042 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1043 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001044
1045 /* invalid (missing prefix) */
David Sedlák298ff6d2019-07-26 14:29:03 +02001046 data = ELEMENT_WRAPPER_START "<import module=\"a\"></import>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001047 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001048 logbuf_assert("Missing mandatory sub-element \"prefix\" of \"import\" element. Line number 1.");
David Sedlák298ff6d2019-07-26 14:29:03 +02001049 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1050 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001051
1052 /* invalid reused prefix */
David Sedlák32488102019-07-15 17:44:10 +02001053 data = ELEMENT_WRAPPER_START
1054 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +02001055 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +02001056 "</import>"
1057 "<import module=\"a\">"
David Sedlák298ff6d2019-07-26 14:29:03 +02001058 "<prefix value=\"prefix\"/>"
David Sedlák32488102019-07-15 17:44:10 +02001059 "</import>"
1060 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001061 assert_int_equal(test_element_helper(st, data, &imp_meta, NULL, NULL), LY_EVALID);
David Sedlák298ff6d2019-07-26 14:29:03 +02001062 logbuf_assert("Prefix \"prefix\" already used as module prefix. Line number 1.");
1063 FREE_ARRAY(st->ctx, imports, lysp_import_free);
1064 imports = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001065
1066 st->finished_correctly = true;
1067}
1068
1069static void
1070test_status_elem(void **state)
1071{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001072 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001073 const char *data;
1074 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001075 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001076
1077 /* test valid values */
1078 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001079 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001080 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +02001081
1082 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001083 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001084 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +02001085
David Sedlákd1144562019-08-06 12:36:14 +02001086 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\">"EXT_SUBELEM"</status>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001087 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001088 assert_true(flags & LYS_STATUS_OBSLT);
David Sedláke0ef1c62019-09-13 10:05:55 +02001089 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001090 assert_int_equal(exts[0].insubstmt_index, 0);
1091 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_STATUS);
1092 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1093 exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001094
1095 /* test invalid value */
1096 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001097 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001098 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 +02001099 st->finished_correctly = true;
1100}
1101
1102static void
1103test_ext_elem(void **state)
1104{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001105 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001106 const char *data;
1107 struct lysp_ext *ext = NULL;
1108
1109 /* max subelems */
1110 data = ELEMENT_WRAPPER_START
1111 "<extension name=\"ext_name\">"
1112 "<argument name=\"arg\"></argument>"
1113 "<status value=\"current\"/>"
1114 "<description><text>ext_desc</text></description>"
1115 "<reference><text>ext_ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001116 EXT_SUBELEM
David Sedlák32488102019-07-15 17:44:10 +02001117 "</extension>"
1118 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001119 assert_int_equal(test_element_helper(st, data, &ext, NULL, NULL), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001120 assert_string_equal(ext->name, "ext_name");
1121 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001122 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +02001123 assert_string_equal(ext->dsc, "ext_desc");
1124 assert_string_equal(ext->ref, "ext_ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001125 assert_string_equal(ext->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001126 assert_int_equal(ext->exts[0].insubstmt_index, 0);
1127 assert_int_equal(ext->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák32488102019-07-15 17:44:10 +02001128 lysp_ext_free(st->ctx, ext);
1129 LY_ARRAY_FREE(ext);
1130 ext = NULL;
1131
1132 /* min subelems */
1133 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001134 assert_int_equal(test_element_helper(st, data, &ext, NULL, NULL), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001135 assert_string_equal(ext->name, "ext_name");
1136 lysp_ext_free(st->ctx, ext);
1137 LY_ARRAY_FREE(ext);
1138 ext = NULL;
1139
1140 st->finished_correctly = true;
1141}
1142
1143static void
1144test_yin_element_elem(void **state)
1145{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001146 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001147 const char *data;
1148 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001149 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001150
1151 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001152 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001153 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +02001154
David Sedlákd1144562019-08-06 12:36:14 +02001155 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\">" EXT_SUBELEM "</yin-element>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001156 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001157 assert_true(flags & LYS_YINELEM_TRUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001158 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001159 assert_int_equal(exts[0].insubstmt_index, 0);
1160 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_YINELEM);
1161 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001162
1163 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001164 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001165 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák26ea1432019-08-14 13:42:23 +02001166 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 +02001167 st->finished_correctly = true;
1168}
1169
1170static void
1171test_yangversion_elem(void **state)
1172{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001173 struct test_parser_yin_state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +02001174 const char *data;
1175 uint8_t version = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001176 struct lysp_ext_instance *exts = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001177
1178 /* valid values */
Radek Krejci96e48da2020-09-04 13:18:06 +02001179 data = ELEMENT_WRAPPER_START "<yang-version value=\"1\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001180 assert_int_equal(test_element_helper(st, data, &version, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001181 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001182
David Sedlákd1144562019-08-06 12:36:14 +02001183 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\">" EXT_SUBELEM "</yang-version>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001184 assert_int_equal(test_element_helper(st, data, &version, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001185 assert_true(version & LYS_VERSION_1_1);
David Sedláke0ef1c62019-09-13 10:05:55 +02001186 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001187 assert_int_equal(exts[0].insubstmt_index, 0);
1188 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_VERSION);
1189 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001190
1191 /* invalid value */
1192 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001193 assert_int_equal(test_element_helper(st, data, &version, NULL, NULL), LY_EVALID);
Radek Krejci96e48da2020-09-04 13:18:06 +02001194 logbuf_assert("Invalid value \"version\" of \"value\" attribute in \"yang-version\" element. Valid values are \"1\" and \"1.1\". Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001195
1196 st->finished_correctly = true;
1197}
1198
1199static void
1200test_mandatory_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 uint16_t man = 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 "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001209 assert_int_equal(test_element_helper(st, data, &man, NULL, NULL), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001210 assert_int_equal(man, LYS_MAND_TRUE);
1211 man = 0;
1212
David Sedlákd1144562019-08-06 12:36:14 +02001213 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\">" EXT_SUBELEM "</mandatory>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001214 assert_int_equal(test_element_helper(st, data, &man, NULL, &exts), LY_SUCCESS);
David Sedlák32488102019-07-15 17:44:10 +02001215 assert_int_equal(man, LYS_MAND_FALSE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001216 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001217 assert_int_equal(exts[0].insubstmt_index, 0);
1218 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MANDATORY);
1219 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák32488102019-07-15 17:44:10 +02001220
1221 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001222 assert_int_equal(test_element_helper(st, data, &man, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001223 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 +02001224
1225 st->finished_correctly = true;
1226}
1227
David Sedlák8e7bda82019-07-16 17:57:50 +02001228static void
1229test_argument_elem(void **state)
1230{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001231 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001232 const char *data;
1233 uint16_t flags = 0;
1234 const char *arg;
1235 struct yin_argument_meta arg_meta = {&flags, &arg};
David Sedlákd1144562019-08-06 12:36:14 +02001236 struct lysp_ext_instance *exts = NULL;
1237
David Sedlák8e7bda82019-07-16 17:57:50 +02001238 /* max subelems */
1239 data = ELEMENT_WRAPPER_START
1240 "<argument name=\"arg-name\">"
1241 "<yin-element value=\"true\" />"
David Sedlákd1144562019-08-06 12:36:14 +02001242 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001243 "</argument>"
1244 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001245 assert_int_equal(test_element_helper(st, data, &arg_meta, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001246 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001247 assert_true(flags & LYS_YINELEM_TRUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001248 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001249 assert_int_equal(exts[0].insubstmt_index, 0);
1250 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ARGUMENT);
1251 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1252 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001253 flags = 0;
1254 FREE_STRING(st->ctx, arg);
1255 arg = NULL;
1256
1257 /* min subelems */
1258 data = ELEMENT_WRAPPER_START
1259 "<argument name=\"arg\">"
1260 "</argument>"
1261 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001262 assert_int_equal(test_element_helper(st, data, &arg_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001263 assert_string_equal(arg, "arg");
1264 assert_true(flags == 0);
1265 FREE_STRING(st->ctx, arg);
1266
1267 st->finished_correctly = true;
1268}
1269
1270static void
1271test_base_elem(void **state)
1272{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001273 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001274 const char *data;
1275 const char **bases = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001276 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001277 struct lysp_type type = {};
1278
1279 /* as identity subelement */
1280 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001281 "<base name=\"base-name\">"
1282 EXT_SUBELEM
1283 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001284 "</identity>";
Michal Vaskob36053d2020-03-26 15:49:30 +01001285 assert_int_equal(test_element_helper(st, data, &bases, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001286 assert_string_equal(*bases, "base-name");
David Sedláke0ef1c62019-09-13 10:05:55 +02001287 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001288 assert_int_equal(exts[0].insubstmt_index, 0);
1289 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1290 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1291 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001292 FREE_STRING(st->ctx, *bases);
1293 LY_ARRAY_FREE(bases);
1294
1295 /* as type subelement */
1296 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlákd1144562019-08-06 12:36:14 +02001297 "<base name=\"base-name\">"
1298 EXT_SUBELEM
1299 "</base>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001300 "</type>";
Michal Vaskob36053d2020-03-26 15:49:30 +01001301 assert_int_equal(test_element_helper(st, data, &type, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001302 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001303 assert_true(type.flags & LYS_SET_BASE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001304 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001305 assert_int_equal(exts[0].insubstmt_index, 0);
1306 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BASE);
1307 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1308 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001309 FREE_STRING(st->ctx, *type.bases);
1310 LY_ARRAY_FREE(type.bases);
1311
1312 st->finished_correctly = true;
1313}
1314
1315static void
1316test_belongsto_elem(void **state)
1317{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001318 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001319 const char *data;
1320 struct lysp_submodule submod;
David Sedlákd1144562019-08-06 12:36:14 +02001321 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001322
1323 data = ELEMENT_WRAPPER_START
David Sedlákd1144562019-08-06 12:36:14 +02001324 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/>"EXT_SUBELEM"</belongs-to>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001325 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001326 assert_int_equal(test_element_helper(st, data, &submod, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001327 assert_string_equal(submod.prefix, "pref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001328 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001329 assert_int_equal(exts[0].insubstmt_index, 0);
1330 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_BELONGSTO);
1331 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1332 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001333 FREE_STRING(st->ctx, submod.prefix);
1334
1335 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001336 assert_int_equal(test_element_helper(st, data, &submod, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001337 logbuf_assert("Missing mandatory sub-element \"prefix\" of \"belongs-to\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001338
1339 st->finished_correctly = true;
1340}
1341
1342static void
1343test_config_elem(void **state)
1344{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001345 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001346 const char *data;
1347 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02001348 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001349
David Sedlákd1144562019-08-06 12:36:14 +02001350 data = ELEMENT_WRAPPER_START "<config value=\"true\">" EXT_SUBELEM "</config>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001351 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001352 assert_true(flags & LYS_CONFIG_W);
David Sedláke0ef1c62019-09-13 10:05:55 +02001353 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001354 assert_int_equal(exts[0].insubstmt_index, 0);
1355 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_CONFIG);
1356 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1357 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001358 flags = 0;
1359
1360 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001361 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001362 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001363 flags = 0;
1364
1365 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001366 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001367 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 +02001368
1369 st->finished_correctly = true;
1370}
1371
1372static void
1373test_default_elem(void **state)
1374{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001375 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001376 const char *data;
Michal Vasko7f45cf22020-10-01 12:49:44 +02001377 struct lysp_qname val = {0};
David Sedlákd1144562019-08-06 12:36:14 +02001378 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001379
David Sedlákd1144562019-08-06 12:36:14 +02001380 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\">"EXT_SUBELEM"</default>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001381 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001382 assert_string_equal(val.str, "defaul-value");
David Sedláke0ef1c62019-09-13 10:05:55 +02001383 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001384 assert_int_equal(exts[0].insubstmt_index, 0);
1385 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_DEFAULT);
1386 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1387 exts = NULL;
Michal Vasko7f45cf22020-10-01 12:49:44 +02001388 FREE_STRING(st->ctx, val.str);
1389 val.str = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001390
1391 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001392 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001393 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1394
1395 st->finished_correctly = true;
1396}
1397
1398static void
1399test_err_app_tag_elem(void **state)
1400{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001401 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001402 const char *data;
1403 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001404 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001405
David Sedlákd1144562019-08-06 12:36:14 +02001406 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\">"EXT_SUBELEM"</error-app-tag>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001407 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001408 assert_string_equal(val, "val");
David Sedláke0ef1c62019-09-13 10:05:55 +02001409 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001410 assert_int_equal(exts[0].insubstmt_index, 0);
1411 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRTAG);
1412 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1413 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001414 FREE_STRING(st->ctx, val);
1415 val = NULL;
1416
1417 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001418 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001419 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1420
1421 st->finished_correctly = true;
1422}
1423
1424static void
1425test_err_msg_elem(void **state)
1426{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001427 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001428 const char *data;
1429 const char *val = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001430 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001431
David Sedlákd1144562019-08-06 12:36:14 +02001432 data = ELEMENT_WRAPPER_START "<error-message><value>val</value>"EXT_SUBELEM"</error-message>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001433 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001434 assert_string_equal(val, "val");
David Sedláke0ef1c62019-09-13 10:05:55 +02001435 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001436 assert_int_equal(exts[0].insubstmt_index, 0);
1437 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ERRMSG);
1438 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1439 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001440 FREE_STRING(st->ctx, val);
1441
1442 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001443 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001444 logbuf_assert("Missing mandatory sub-element \"value\" of \"error-message\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001445
David Sedlákdf2a9732019-08-07 13:23:16 +02001446 data = ELEMENT_WRAPPER_START "<error-message invalid=\"text\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001447 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001448 logbuf_assert("Unexpected attribute \"invalid\" of \"error-message\" element. Line number 1.");
David Sedlákdf2a9732019-08-07 13:23:16 +02001449
David Sedlák8e7bda82019-07-16 17:57:50 +02001450 st->finished_correctly = true;
1451}
1452
1453static void
1454test_fracdigits_elem(void **state)
1455{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001456 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001457 const char *data;
1458 struct lysp_type type = {};
1459
1460 /* valid value */
David Sedlákd1144562019-08-06 12:36:14 +02001461 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\">"EXT_SUBELEM"</fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001462 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedláke0ef1c62019-09-13 10:05:55 +02001463 assert_string_equal(type.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001464 assert_int_equal(type.exts[0].insubstmt_index, 0);
1465 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_FRACDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001466 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001467 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlákd1144562019-08-06 12:36:14 +02001468 FREE_ARRAY(st->ctx, type.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001469
1470 /* invalid values */
1471 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001472 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001473 logbuf_assert("Invalid value \"-1\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001474
1475 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001476 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001477 logbuf_assert("Invalid value \"02\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001478
1479 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001480 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001481 logbuf_assert("Invalid value \"1p\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001482
1483 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001484 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001485 logbuf_assert("Invalid value \"19\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001486
1487 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001488 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001489 logbuf_assert("Invalid value \"999999999999999999\" of \"value\" attribute in \"fraction-digits\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001490
1491 st->finished_correctly = true;
1492}
1493
1494static void
1495test_iffeature_elem(void **state)
1496{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001497 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001498 const char *data;
1499 const char **iffeatures = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001500 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001501
David Sedlákd1144562019-08-06 12:36:14 +02001502 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\">"EXT_SUBELEM"</if-feature>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001503 assert_int_equal(test_element_helper(st, data, &iffeatures, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001504 assert_string_equal(*iffeatures, "local-storage");
David Sedláke0ef1c62019-09-13 10:05:55 +02001505 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001506 assert_int_equal(exts[0].insubstmt_index, 0);
1507 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_IFFEATURE);
1508 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1509 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001510 FREE_STRING(st->ctx, *iffeatures);
1511 LY_ARRAY_FREE(iffeatures);
1512 iffeatures = NULL;
1513
1514 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001515 assert_int_equal(test_element_helper(st, data, &iffeatures, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001516 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1517 LY_ARRAY_FREE(iffeatures);
1518 iffeatures = NULL;
1519
1520 st->finished_correctly = true;
1521}
1522
1523static void
1524test_length_elem(void **state)
1525{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001526 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001527 const char *data;
1528 struct lysp_type type = {};
1529
1530 /* max subelems */
1531 data = ELEMENT_WRAPPER_START
1532 "<length value=\"length-str\">"
1533 "<error-message><value>err-msg</value></error-message>"
1534 "<error-app-tag value=\"err-app-tag\"/>"
1535 "<description><text>desc</text></description>"
1536 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001537 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001538 "</length>"
1539 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001540 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001541 assert_string_equal(type.length->arg.str, "length-str");
David Sedlák8e7bda82019-07-16 17:57:50 +02001542 assert_string_equal(type.length->emsg, "err-msg");
1543 assert_string_equal(type.length->eapptag, "err-app-tag");
1544 assert_string_equal(type.length->dsc, "desc");
1545 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001546 assert_true(type.flags & LYS_SET_LENGTH);
David Sedláke0ef1c62019-09-13 10:05:55 +02001547 assert_string_equal(type.length->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001548 assert_int_equal(type.length->exts[0].insubstmt_index, 0);
1549 assert_int_equal(type.length->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001550 lysp_type_free(st->ctx, &type);
1551 memset(&type, 0, sizeof(type));
1552
1553 /* min subelems */
1554 data = ELEMENT_WRAPPER_START
1555 "<length value=\"length-str\">"
1556 "</length>"
1557 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001558 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001559 assert_string_equal(type.length->arg.str, "length-str");
David Sedlák8e7bda82019-07-16 17:57:50 +02001560 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001561 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001562 memset(&type, 0, sizeof(type));
1563
1564 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001565 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001566 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1567 lysp_type_free(st->ctx, &type);
1568 memset(&type, 0, sizeof(type));
1569
1570 st->finished_correctly = true;
1571}
1572
1573static void
1574test_modifier_elem(void **state)
1575{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001576 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001577 const char *data;
Radek Krejci011e4aa2020-09-04 15:22:31 +02001578 const char *pat;
David Sedlákd1144562019-08-06 12:36:14 +02001579 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001580
Radek Krejci011e4aa2020-09-04 15:22:31 +02001581 assert_int_equal(LY_SUCCESS, lydict_insert(st->ctx, "\006pattern", 8, &pat));
David Sedlákd1144562019-08-06 12:36:14 +02001582 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\">" EXT_SUBELEM "</modifier>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001583 assert_int_equal(test_element_helper(st, data, &pat, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001584 assert_string_equal(pat, "\x015pattern");
David Sedláke0ef1c62019-09-13 10:05:55 +02001585 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001586 assert_int_equal(exts[0].insubstmt_index, 0);
1587 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_MODIFIER);
1588 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1589 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001590 FREE_STRING(st->ctx, pat);
1591
Radek Krejci011e4aa2020-09-04 15:22:31 +02001592 assert_int_equal(LY_SUCCESS, lydict_insert(st->ctx, "\006pattern", 8, &pat));
David Sedlák8e7bda82019-07-16 17:57:50 +02001593 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001594 assert_int_equal(test_element_helper(st, data, &pat, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02001595 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 +02001596 FREE_STRING(st->ctx, pat);
1597
1598 st->finished_correctly = true;
1599}
1600
1601static void
1602test_namespace_elem(void **state)
1603{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001604 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001605 const char *data;
1606 const char *ns;
David Sedlákd1144562019-08-06 12:36:14 +02001607 struct lysp_ext_instance *exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001608
David Sedlákd1144562019-08-06 12:36:14 +02001609 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\">" EXT_SUBELEM "</namespace>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001610 assert_int_equal(test_element_helper(st, data, &ns, NULL, &exts), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001611 assert_string_equal(ns, "ns");
David Sedláke0ef1c62019-09-13 10:05:55 +02001612 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001613 assert_int_equal(exts[0].insubstmt_index, 0);
1614 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_NAMESPACE);
1615 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1616 exts = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001617 FREE_STRING(st->ctx, ns);
1618
1619 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001620 assert_int_equal(test_element_helper(st, data, &ns, NULL, NULL), LY_EVALID);
David Sedlák8e7bda82019-07-16 17:57:50 +02001621 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1622
1623 st->finished_correctly = true;
1624}
1625
1626static void
David Sedlák8e7bda82019-07-16 17:57:50 +02001627test_pattern_elem(void **state)
1628{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001629 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001630 const char *data;
1631 struct lysp_type type = {};
1632
1633 /* max subelems */
1634 data = ELEMENT_WRAPPER_START
1635 "<pattern value=\"super_pattern\">"
1636 "<modifier value=\"invert-match\"/>"
1637 "<error-message><value>err-msg-value</value></error-message>"
1638 "<error-app-tag value=\"err-app-tag-value\"/>"
David Sedlák169cc522019-08-15 13:23:45 +02001639 "<description><text>&quot;pattern-desc&quot;</text></description>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001640 "<reference><text>pattern-ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001641 EXT_SUBELEM
David Sedlák8e7bda82019-07-16 17:57:50 +02001642 "</pattern>"
1643 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001644 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001645 assert_true(type.flags & LYS_SET_PATTERN);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001646 assert_string_equal(type.patterns->arg.str, "\x015super_pattern");
David Sedlák169cc522019-08-15 13:23:45 +02001647 assert_string_equal(type.patterns->dsc, "\"pattern-desc\"");
David Sedlák8e7bda82019-07-16 17:57:50 +02001648 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1649 assert_string_equal(type.patterns->emsg, "err-msg-value");
David Sedlák8e7bda82019-07-16 17:57:50 +02001650 assert_string_equal(type.patterns->ref, "pattern-ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001651 assert_string_equal(type.patterns->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001652 assert_int_equal(type.patterns->exts[0].insubstmt_index, 0);
1653 assert_int_equal(type.patterns->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8e7bda82019-07-16 17:57:50 +02001654 lysp_type_free(st->ctx, &type);
1655 memset(&type, 0, sizeof(type));
1656
1657 /* min subelems */
1658 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001659 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001660 assert_string_equal(type.patterns->arg.str, "\x006pattern");
David Sedlák8e7bda82019-07-16 17:57:50 +02001661 lysp_type_free(st->ctx, &type);
1662 memset(&type, 0, sizeof(type));
1663
1664 st->finished_correctly = true;
1665}
1666
1667static void
1668test_value_position_elem(void **state)
1669{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001670 struct test_parser_yin_state *st = *state;
David Sedlák8e7bda82019-07-16 17:57:50 +02001671 const char *data;
1672 struct lysp_type_enum en = {};
1673
1674 /* valid values */
David Sedlákd1144562019-08-06 12:36:14 +02001675 data = ELEMENT_WRAPPER_START "<value value=\"55\">" EXT_SUBELEM "</value>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001676 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001677 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001678 assert_true(en.flags & LYS_SET_VALUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001679 assert_string_equal(en.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001680 assert_int_equal(en.exts[0].insubstmt_index, 0);
1681 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_VALUE);
1682 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001683 memset(&en, 0, sizeof(en));
1684
1685 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001686 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001687 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001688 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001689 memset(&en, 0, sizeof(en));
1690
1691 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001692 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001693 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001694 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001695 memset(&en, 0, sizeof(en));
1696
1697 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001698 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001699 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001700 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001701 memset(&en, 0, sizeof(en));
1702
1703 /* valid positions */
David Sedlák8d552d62019-08-06 15:29:05 +02001704 data = ELEMENT_WRAPPER_START "<position value=\"55\">" EXT_SUBELEM "</position>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001705 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001706 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001707 assert_true(en.flags & LYS_SET_VALUE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001708 assert_string_equal(en.exts[0].name, "urn:example:extensions:c-define");
David Sedlák8d552d62019-08-06 15:29:05 +02001709 assert_int_equal(en.exts[0].insubstmt_index, 0);
1710 assert_int_equal(en.exts[0].insubstmt, LYEXT_SUBSTMT_POSITION);
1711 FREE_ARRAY(st->ctx, en.exts, lysp_ext_instance_free);
David Sedlák8e7bda82019-07-16 17:57:50 +02001712 memset(&en, 0, sizeof(en));
1713
1714 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001715 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001716 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001717 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001718 memset(&en, 0, sizeof(en));
1719
1720 /* invalid values */
1721 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001722 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001723 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\" attribute in \"value\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001724
1725 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001726 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001727 logbuf_assert("Invalid value \"1k\" of \"value\" attribute in \"value\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001728
David Sedlák69f01612019-07-17 11:41:08 +02001729 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001730 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001731 logbuf_assert("Invalid value \"\" of \"value\" attribute in \"value\" element. Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001732
David Sedlák8e7bda82019-07-16 17:57:50 +02001733 /*invalid positions */
1734 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001735 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001736 logbuf_assert("Invalid value \"-5\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001737
1738 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001739 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001740 logbuf_assert("Invalid value \"-0\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001741
1742 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001743 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001744 logbuf_assert("Invalid value \"99999999999999999999\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001745
David Sedlák69f01612019-07-17 11:41:08 +02001746 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001747 assert_int_equal(test_element_helper(st, data, &en, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02001748 logbuf_assert("Invalid value \"\" of \"value\" attribute in \"position\" element. Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001749
1750 st->finished_correctly = true;
1751}
1752
1753static void
1754test_prefix_elem(void **state)
1755{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001756 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001757 const char *data;
1758 const char *value = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001759 struct lysp_ext_instance *exts = NULL;
1760
1761 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\">" EXT_SUBELEM "</prefix>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001762 assert_int_equal(test_element_helper(st, data, &value, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001763 assert_string_equal(value, "pref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001764 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001765 assert_int_equal(exts[0].insubstmt_index, 0);
1766 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PREFIX);
1767 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1768 exts = NULL;
1769 FREE_STRING(st->ctx, value);
David Sedlák69f01612019-07-17 11:41:08 +02001770
1771 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001772 assert_int_equal(test_element_helper(st, data, &value, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001773 assert_string_equal(value, "pref");
1774 FREE_STRING(st->ctx, value);
1775
1776 st->finished_correctly = true;
1777}
1778
1779static void
1780test_range_elem(void **state)
1781{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001782 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001783 const char *data;
1784 struct lysp_type type = {};
1785
1786 /* max subelems */
1787 data = ELEMENT_WRAPPER_START
1788 "<range value=\"range-str\">"
1789 "<error-message><value>err-msg</value></error-message>"
1790 "<error-app-tag value=\"err-app-tag\" />"
1791 "<description><text>desc</text></description>"
1792 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001793 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001794 "</range>"
1795 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001796 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001797 assert_string_equal(type.range->arg.str, "range-str");
David Sedlák69f01612019-07-17 11:41:08 +02001798 assert_string_equal(type.range->dsc, "desc");
1799 assert_string_equal(type.range->eapptag, "err-app-tag");
1800 assert_string_equal(type.range->emsg, "err-msg");
1801 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001802 assert_true(type.flags & LYS_SET_RANGE);
David Sedláke0ef1c62019-09-13 10:05:55 +02001803 assert_string_equal(type.range->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001804 assert_int_equal(type.range->exts[0].insubstmt_index, 0);
1805 assert_int_equal(type.range->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001806 lysp_type_free(st->ctx, &type);
1807 memset(&type, 0, sizeof(type));
1808
1809 /* min subelems */
1810 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001811 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001812 assert_string_equal(type.range->arg.str, "range-str");
David Sedlák69f01612019-07-17 11:41:08 +02001813 lysp_type_free(st->ctx, &type);
1814 memset(&type, 0, sizeof(type));
1815
1816 st->finished_correctly = true;
1817}
1818
1819static void
1820test_reqinstance_elem(void **state)
1821{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001822 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001823 const char *data;
1824 struct lysp_type type = {};
1825
David Sedlákd1144562019-08-06 12:36:14 +02001826 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\">" EXT_SUBELEM "</require-instance>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001827 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001828 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001829 assert_true(type.flags & LYS_SET_REQINST);
David Sedláke0ef1c62019-09-13 10:05:55 +02001830 assert_string_equal(type.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001831 assert_int_equal(type.exts[0].insubstmt_index, 0);
1832 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_REQINSTANCE);
1833 lysp_type_free(st->ctx, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001834 memset(&type, 0, sizeof(type));
1835
1836 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001837 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001838 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001839 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001840 memset(&type, 0, sizeof(type));
1841
1842 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001843 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_EVALID);
David Sedlák69f01612019-07-17 11:41:08 +02001844 memset(&type, 0, sizeof(type));
David Sedlák26ea1432019-08-14 13:42:23 +02001845 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 +02001846
1847 st->finished_correctly = true;
1848}
1849
1850static void
1851test_revision_date_elem(void **state)
1852{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001853 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001854 const char *data;
1855 char rev[LY_REV_SIZE];
David Sedlákd1144562019-08-06 12:36:14 +02001856 struct lysp_ext_instance *exts = NULL;
1857
1858 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\">"EXT_SUBELEM"</revision-date>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001859 assert_int_equal(test_element_helper(st, data, rev, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001860 assert_string_equal(rev, "2000-01-01");
David Sedláke0ef1c62019-09-13 10:05:55 +02001861 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001862 assert_int_equal(exts[0].insubstmt_index, 0);
1863 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_REVISIONDATE);
1864 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedlák69f01612019-07-17 11:41:08 +02001865
1866 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001867 assert_int_equal(test_element_helper(st, data, rev, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001868 assert_string_equal(rev, "2000-01-01");
1869
1870 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001871 assert_int_equal(test_element_helper(st, data, rev, NULL, NULL), LY_EVALID);
David Sedlák69f01612019-07-17 11:41:08 +02001872 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1873
1874 st->finished_correctly = true;
1875}
1876
1877static void
1878test_unique_elem(void **state)
1879{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001880 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001881 const char *data;
1882 const char **values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001883 struct lysp_ext_instance *exts = NULL;
1884
1885 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\">"EXT_SUBELEM"</unique>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001886 assert_int_equal(test_element_helper(st, data, &values, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001887 assert_string_equal(*values, "tag");
David Sedláke0ef1c62019-09-13 10:05:55 +02001888 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001889 assert_int_equal(exts[0].insubstmt_index, 0);
1890 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNIQUE);
1891 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1892 FREE_STRING(st->ctx, *values);
1893 LY_ARRAY_FREE(values);
1894 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001895
1896 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001897 assert_int_equal(test_element_helper(st, data, &values, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001898 assert_string_equal(*values, "tag");
1899 FREE_STRING(st->ctx, *values);
1900 LY_ARRAY_FREE(values);
David Sedlákd1144562019-08-06 12:36:14 +02001901 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001902
1903 st->finished_correctly = true;
1904}
1905
1906static void
1907test_units_elem(void **state)
1908{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001909 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001910 const char *data;
1911 const char *values = NULL;
David Sedlákd1144562019-08-06 12:36:14 +02001912 struct lysp_ext_instance *exts = NULL;
1913
1914 data = ELEMENT_WRAPPER_START "<units name=\"name\">"EXT_SUBELEM"</units>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001915 assert_int_equal(test_element_helper(st, data, &values, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001916 assert_string_equal(values, "name");
David Sedláke0ef1c62019-09-13 10:05:55 +02001917 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001918 assert_int_equal(exts[0].insubstmt_index, 0);
1919 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_UNITS);
1920 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
1921 FREE_STRING(st->ctx, values);
1922 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001923
1924 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001925 assert_int_equal(test_element_helper(st, data, &values, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001926 assert_string_equal(values, "name");
1927 FREE_STRING(st->ctx, values);
David Sedlákd1144562019-08-06 12:36:14 +02001928 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001929
1930 st->finished_correctly = true;
1931}
1932
1933static void
1934test_when_elem(void **state)
1935{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001936 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001937 const char *data;
1938 struct lysp_when *when = NULL;
1939
1940 data = ELEMENT_WRAPPER_START
1941 "<when condition=\"cond\">"
1942 "<description><text>desc</text></description>"
1943 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02001944 EXT_SUBELEM
David Sedlák69f01612019-07-17 11:41:08 +02001945 "</when>"
1946 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001947 assert_int_equal(test_element_helper(st, data, &when, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001948 assert_string_equal(when->cond, "cond");
1949 assert_string_equal(when->dsc, "desc");
1950 assert_string_equal(when->ref, "ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02001951 assert_string_equal(when->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02001952 assert_int_equal(when->exts[0].insubstmt_index, 0);
1953 assert_int_equal(when->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák69f01612019-07-17 11:41:08 +02001954 lysp_when_free(st->ctx, when);
1955 free(when);
1956 when = NULL;
1957
1958 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001959 assert_int_equal(test_element_helper(st, data, &when, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001960 assert_string_equal(when->cond, "cond");
1961 lysp_when_free(st->ctx, when);
1962 free(when);
1963 when = NULL;
1964
1965 st->finished_correctly = true;
1966}
1967
1968static void
1969test_yin_text_value_elem(void **state)
1970{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001971 struct test_parser_yin_state *st = *state;
David Sedlák69f01612019-07-17 11:41:08 +02001972 const char *data;
1973 const char *val;
1974
1975 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001976 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001977 assert_string_equal(val, "text");
1978 FREE_STRING(st->ctx, val);
1979
1980 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
Michal Vaskob36053d2020-03-26 15:49:30 +01001981 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001982 assert_string_equal(val, "text");
1983 FREE_STRING(st->ctx, val);
1984
1985 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01001986 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001987 assert_string_equal("", val);
1988 FREE_STRING(st->ctx, val);
1989
David Sedlák8e7bda82019-07-16 17:57:50 +02001990 st->finished_correctly = true;
1991}
David Sedlák32488102019-07-15 17:44:10 +02001992
David Sedlák374d2b32019-07-17 15:06:55 +02001993static void
1994test_type_elem(void **state)
1995{
Radek Krejci3a4889a2020-05-19 17:01:58 +02001996 struct test_parser_yin_state *st = *state;
David Sedlák374d2b32019-07-17 15:06:55 +02001997 const char *data;
1998 struct lysp_type type = {};
1999
2000 /* max subelems */
2001 data = ELEMENT_WRAPPER_START
2002 "<type name=\"type-name\">"
2003 "<base name=\"base-name\"/>"
2004 "<bit name=\"bit\"/>"
2005 "<enum name=\"enum\"/>"
2006 "<fraction-digits value=\"2\"/>"
2007 "<length value=\"length\"/>"
2008 "<path value=\"path\"/>"
2009 "<pattern value=\"pattern\"/>"
2010 "<range value=\"range\" />"
2011 "<require-instance value=\"true\"/>"
2012 "<type name=\"sub-type-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002013 EXT_SUBELEM
David Sedlák374d2b32019-07-17 15:06:55 +02002014 "</type>"
2015 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002016 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák374d2b32019-07-17 15:06:55 +02002017 assert_string_equal(type.name, "type-name");
2018 assert_string_equal(*type.bases, "base-name");
2019 assert_string_equal(type.bits->name, "bit");
2020 assert_string_equal(type.enums->name, "enum");
2021 assert_int_equal(type.fraction_digits, 2);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002022 assert_string_equal(type.length->arg.str, "length");
Michal Vasko004d3152020-06-11 19:59:22 +02002023 assert_string_equal(type.path->expr, "path");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002024 assert_string_equal(type.patterns->arg.str, "\006pattern");
2025 assert_string_equal(type.range->arg.str, "range");
David Sedlák374d2b32019-07-17 15:06:55 +02002026 assert_int_equal(type.require_instance, 1);
2027 assert_string_equal(type.types->name, "sub-type-name");
David Sedláke0ef1c62019-09-13 10:05:55 +02002028 assert_string_equal(type.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002029 assert_int_equal(type.exts[0].insubstmt_index, 0);
2030 assert_int_equal(type.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002031 assert_true(type.flags & LYS_SET_BASE);
2032 assert_true(type.flags & LYS_SET_BIT);
2033 assert_true(type.flags & LYS_SET_ENUM);
2034 assert_true(type.flags & LYS_SET_FRDIGITS);
2035 assert_true(type.flags & LYS_SET_LENGTH);
2036 assert_true(type.flags & LYS_SET_PATH);
2037 assert_true(type.flags & LYS_SET_PATTERN);
2038 assert_true(type.flags & LYS_SET_RANGE);
2039 assert_true(type.flags & LYS_SET_REQINST);
2040 assert_true(type.flags & LYS_SET_TYPE);
David Sedlákd1144562019-08-06 12:36:14 +02002041 lysp_type_free(st->ctx, &type);
David Sedlák374d2b32019-07-17 15:06:55 +02002042 memset(&type, 0, sizeof(type));
2043
2044 /* min subelems */
2045 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002046 assert_int_equal(test_element_helper(st, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák374d2b32019-07-17 15:06:55 +02002047 lysp_type_free(st->ctx, &type);
2048 memset(&type, 0, sizeof(type));
2049
2050 st->finished_correctly = true;
2051}
2052
David Sedlák1af868e2019-07-17 17:03:14 +02002053static void
2054test_max_elems_elem(void **state)
2055{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002056 struct test_parser_yin_state *st = *state;
David Sedlák1af868e2019-07-17 17:03:14 +02002057 const char *data;
2058 struct lysp_node_list list = {};
2059 struct lysp_node_leaflist llist = {};
2060 struct lysp_refine refine = {};
2061
David Sedlákd1144562019-08-06 12:36:14 +02002062 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 +01002063 assert_int_equal(test_element_helper(st, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002064 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002065 assert_true(refine.flags & LYS_SET_MAX);
David Sedláke0ef1c62019-09-13 10:05:55 +02002066 assert_string_equal(refine.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002067 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2068 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2069 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002070
David Sedlákd1144562019-08-06 12:36:14 +02002071 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 +01002072 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002073 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002074 assert_true(list.flags & LYS_SET_MAX);
David Sedláke0ef1c62019-09-13 10:05:55 +02002075 assert_string_equal(list.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002076 assert_int_equal(list.exts[0].insubstmt_index, 0);
2077 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2078 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002079
David Sedlákd1144562019-08-06 12:36:14 +02002080 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 +01002081 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002082 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002083 assert_true(llist.flags & LYS_SET_MAX);
David Sedláke0ef1c62019-09-13 10:05:55 +02002084 assert_string_equal(llist.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002085 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2086 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MAX);
2087 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák1af868e2019-07-17 17:03:14 +02002088
2089 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002090 assert_int_equal(test_element_helper(st, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02002091 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002092 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02002093
2094 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002095 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002096 logbuf_assert("Invalid value \"0\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002097
2098 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002099 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002100 logbuf_assert("Invalid value \"-10\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002101
2102 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002103 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002104 logbuf_assert("Invalid value \"k\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002105
2106 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
Michal Vaskob36053d2020-03-26 15:49:30 +01002107 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002108 logbuf_assert("Invalid value \"u12\" of \"value\" attribute in \"max-elements\" element. Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02002109
2110 st->finished_correctly = true;
2111}
2112
David Sedlák09e18c92019-07-18 11:17:11 +02002113static void
2114test_min_elems_elem(void **state)
2115{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002116 struct test_parser_yin_state *st = *state;
David Sedlák09e18c92019-07-18 11:17:11 +02002117 const char *data;
2118 struct lysp_node_list list = {};
2119 struct lysp_node_leaflist llist = {};
2120 struct lysp_refine refine = {};
2121
David Sedlákd1144562019-08-06 12:36:14 +02002122 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 +01002123 assert_int_equal(test_element_helper(st, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák09e18c92019-07-18 11:17:11 +02002124 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002125 assert_true(refine.flags & LYS_SET_MIN);
David Sedláke0ef1c62019-09-13 10:05:55 +02002126 assert_string_equal(refine.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002127 assert_int_equal(refine.exts[0].insubstmt_index, 0);
2128 assert_int_equal(refine.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2129 FREE_ARRAY(st->ctx, refine.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002130
David Sedlákd1144562019-08-06 12:36:14 +02002131 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 +01002132 assert_int_equal(test_element_helper(st, data, &list, NULL, NULL), LY_SUCCESS);
David Sedlák09e18c92019-07-18 11:17:11 +02002133 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002134 assert_true(list.flags & LYS_SET_MIN);
David Sedláke0ef1c62019-09-13 10:05:55 +02002135 assert_string_equal(list.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002136 assert_int_equal(list.exts[0].insubstmt_index, 0);
2137 assert_int_equal(list.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2138 FREE_ARRAY(st->ctx, list.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002139
David Sedlákd1144562019-08-06 12:36:14 +02002140 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 +01002141 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_SUCCESS);
David Sedlák09e18c92019-07-18 11:17:11 +02002142 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002143 assert_true(llist.flags & LYS_SET_MIN);
David Sedláke0ef1c62019-09-13 10:05:55 +02002144 assert_string_equal(llist.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002145 assert_int_equal(llist.exts[0].insubstmt_index, 0);
2146 assert_int_equal(llist.exts[0].insubstmt, LYEXT_SUBSTMT_MIN);
2147 FREE_ARRAY(st->ctx, llist.exts, lysp_ext_instance_free);
David Sedlák09e18c92019-07-18 11:17:11 +02002148
2149 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 +01002150 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002151 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 +02002152
2153 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 +01002154 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002155 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 +02002156
2157 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 +01002158 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002159 logbuf_assert("Invalid value \"5k\" of \"value\" attribute in \"min-elements\" element. Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02002160
2161 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 +01002162 assert_int_equal(test_element_helper(st, data, &llist, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002163 logbuf_assert("Invalid value \"05\" of \"value\" attribute in \"min-elements\" element. Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02002164
2165 st->finished_correctly = true;
2166}
2167
David Sedláka2dad212019-07-18 12:45:19 +02002168static void
2169test_ordby_elem(void **state)
2170{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002171 struct test_parser_yin_state *st = *state;
David Sedláka2dad212019-07-18 12:45:19 +02002172 const char *data;
2173 uint16_t flags = 0;
David Sedlákd1144562019-08-06 12:36:14 +02002174 struct lysp_ext_instance *exts = NULL;
David Sedláka2dad212019-07-18 12:45:19 +02002175
David Sedlákd1144562019-08-06 12:36:14 +02002176 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\">"EXT_SUBELEM"</ordered-by>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002177 assert_int_equal(test_element_helper(st, data, &flags, NULL, &exts), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002178 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedláke0ef1c62019-09-13 10:05:55 +02002179 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002180 assert_int_equal(exts[0].insubstmt_index, 0);
2181 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_ORDEREDBY);
2182 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
David Sedláka2dad212019-07-18 12:45:19 +02002183
2184 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002185 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002186 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02002187
2188 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002189 assert_int_equal(test_element_helper(st, data, &flags, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02002190 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 +02002191
2192 st->finished_correctly = true;
2193}
2194
David Sedlák8a83bbb2019-07-18 14:46:00 +02002195static void
2196test_any_elem(void **state)
2197{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002198 struct test_parser_yin_state *st = *state;
David Sedlák8a83bbb2019-07-18 14:46:00 +02002199 const char *data;
2200 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002201 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlák8a83bbb2019-07-18 14:46:00 +02002202 struct lysp_node_anydata *parsed = NULL;
2203
2204 /* anyxml max subelems */
2205 data = ELEMENT_WRAPPER_START
2206 "<anyxml name=\"any-name\">"
2207 "<config value=\"true\" />"
2208 "<description><text>desc</text></description>"
2209 "<if-feature name=\"feature\" />"
2210 "<mandatory value=\"true\" />"
2211 "<must condition=\"must-cond\" />"
2212 "<reference><text>ref</text></reference>"
2213 "<status value=\"deprecated\"/>"
2214 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002215 EXT_SUBELEM
David Sedlák8a83bbb2019-07-18 14:46:00 +02002216 "</anyxml>"
2217 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002218 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002219 parsed = (struct lysp_node_anydata *)siblings;
2220 assert_null(parsed->parent);
2221 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002222 assert_true(parsed->flags & LYS_CONFIG_W);
2223 assert_true(parsed->flags & LYS_MAND_TRUE);
2224 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002225 assert_null(parsed->next);
2226 assert_string_equal(parsed->name, "any-name");
2227 assert_string_equal(parsed->dsc, "desc");
2228 assert_string_equal(parsed->ref, "ref");
2229 assert_string_equal(parsed->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002230 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedláke0ef1c62019-09-13 10:05:55 +02002231 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002232 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2233 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002234 lysp_node_free(st->ctx, siblings);
2235 siblings = NULL;
2236
2237 /* anydata max subelems */
2238 data = ELEMENT_WRAPPER_START
2239 "<anydata 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 "</anydata>"
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_ANYDATA);
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");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002263 assert_string_equal(parsed->iffeatures[0].str, "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 /* min subelems */
2271 node_meta.parent = (void *)0x10;
2272 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002273 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02002274 parsed = (struct lysp_node_anydata *)siblings;
2275 assert_ptr_equal(parsed->parent, node_meta.parent);
2276 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
2277 assert_null(parsed->next);
2278 assert_null(parsed->exts);
2279 lysp_node_free(st->ctx, siblings);
2280
2281 st->finished_correctly = true;
2282}
2283
David Sedlák203ca3a2019-07-18 15:26:25 +02002284static void
2285test_leaf_elem(void **state)
2286{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002287 struct test_parser_yin_state *st = *state;
David Sedlák203ca3a2019-07-18 15:26:25 +02002288 const char *data;
2289 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002290 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlák203ca3a2019-07-18 15:26:25 +02002291 struct lysp_node_leaf *parsed = NULL;
2292
2293 /* max elements */
2294 data = ELEMENT_WRAPPER_START
2295 "<leaf name=\"leaf\">"
2296 "<config value=\"true\" />"
2297 "<default value=\"def-val\"/>"
2298 "<description><text>desc</text></description>"
2299 "<if-feature name=\"feature\" />"
2300 "<mandatory value=\"true\" />"
2301 "<must condition=\"must-cond\" />"
2302 "<reference><text>ref</text></reference>"
2303 "<status value=\"deprecated\"/>"
2304 "<type name=\"type\"/>"
2305 "<units name=\"uni\"/>"
2306 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002307 EXT_SUBELEM
David Sedlák203ca3a2019-07-18 15:26:25 +02002308 "</leaf>"
2309 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002310 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák203ca3a2019-07-18 15:26:25 +02002311 parsed = (struct lysp_node_leaf *)siblings;
2312 assert_null(parsed->parent);
2313 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002314 assert_true(parsed->flags & LYS_CONFIG_W);
2315 assert_true(parsed->flags & LYS_MAND_TRUE);
2316 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02002317 assert_null(parsed->next);
2318 assert_string_equal(parsed->name, "leaf");
2319 assert_string_equal(parsed->dsc, "desc");
2320 assert_string_equal(parsed->ref, "ref");
2321 assert_string_equal(parsed->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002322 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedláke0ef1c62019-09-13 10:05:55 +02002323 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002324 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2325 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002326 assert_string_equal(parsed->musts->arg.str, "must-cond");
David Sedlák203ca3a2019-07-18 15:26:25 +02002327 assert_string_equal(parsed->type.name, "type");
2328 assert_string_equal(parsed->units, "uni");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002329 assert_string_equal(parsed->dflt.str, "def-val");
David Sedlák203ca3a2019-07-18 15:26:25 +02002330 lysp_node_free(st->ctx, siblings);
2331 siblings = NULL;
2332
2333 /* min elements */
2334 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002335 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák203ca3a2019-07-18 15:26:25 +02002336 parsed = (struct lysp_node_leaf *)siblings;
2337 assert_string_equal(parsed->name, "leaf");
2338 assert_string_equal(parsed->type.name, "type");
2339 lysp_node_free(st->ctx, siblings);
2340 siblings = NULL;
2341
2342 st->finished_correctly = true;
2343}
2344
David Sedlákc3da3ef2019-07-19 12:56:08 +02002345static void
2346test_leaf_list_elem(void **state)
2347{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002348 struct test_parser_yin_state *st = *state;
David Sedlákc3da3ef2019-07-19 12:56:08 +02002349 const char *data;
2350 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002351 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlákc3da3ef2019-07-19 12:56:08 +02002352 struct lysp_node_leaflist *parsed = NULL;
2353
2354 data = ELEMENT_WRAPPER_START
2355 "<leaf-list name=\"llist\">"
2356 "<config value=\"true\" />"
2357 "<default value=\"def-val0\"/>"
2358 "<default value=\"def-val1\"/>"
2359 "<description><text>desc</text></description>"
2360 "<if-feature name=\"feature\"/>"
2361 "<max-elements value=\"5\"/>"
2362 "<must condition=\"must-cond\"/>"
2363 "<ordered-by value=\"user\" />"
2364 "<reference><text>ref</text></reference>"
2365 "<status value=\"current\"/>"
2366 "<type name=\"type\"/>"
2367 "<units name=\"uni\"/>"
2368 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002369 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002370 "</leaf-list>"
2371 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002372 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002373 parsed = (struct lysp_node_leaflist *)siblings;
Michal Vasko7f45cf22020-10-01 12:49:44 +02002374 assert_string_equal(parsed->dflts[0].str, "def-val0");
2375 assert_string_equal(parsed->dflts[1].str, "def-val1");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002376 assert_string_equal(parsed->dsc, "desc");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002377 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002378 assert_int_equal(parsed->max, 5);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002379 assert_string_equal(parsed->musts->arg.str, "must-cond");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002380 assert_string_equal(parsed->name, "llist");
2381 assert_null(parsed->next);
2382 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2383 assert_null(parsed->parent);
2384 assert_string_equal(parsed->ref, "ref");
2385 assert_string_equal(parsed->type.name, "type");
2386 assert_string_equal(parsed->units, "uni");
2387 assert_string_equal(parsed->when->cond, "when-cond");
2388 assert_true(parsed->flags & LYS_CONFIG_W);
2389 assert_true(parsed->flags & LYS_ORDBY_USER);
2390 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedláke0ef1c62019-09-13 10:05:55 +02002391 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002392 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2393 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002394 lysp_node_free(st->ctx, siblings);
2395 siblings = NULL;
2396
2397 data = ELEMENT_WRAPPER_START
2398 "<leaf-list name=\"llist\">"
2399 "<config value=\"true\" />"
2400 "<description><text>desc</text></description>"
2401 "<if-feature name=\"feature\"/>"
2402 "<min-elements value=\"5\"/>"
2403 "<must condition=\"must-cond\"/>"
2404 "<ordered-by value=\"user\" />"
2405 "<reference><text>ref</text></reference>"
2406 "<status value=\"current\"/>"
2407 "<type name=\"type\"/>"
2408 "<units name=\"uni\"/>"
2409 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002410 EXT_SUBELEM
David Sedlákc3da3ef2019-07-19 12:56:08 +02002411 "</leaf-list>"
2412 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002413 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002414 parsed = (struct lysp_node_leaflist *)siblings;
2415 assert_string_equal(parsed->dsc, "desc");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002416 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002417 assert_int_equal(parsed->min, 5);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002418 assert_string_equal(parsed->musts->arg.str, "must-cond");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002419 assert_string_equal(parsed->name, "llist");
2420 assert_null(parsed->next);
2421 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2422 assert_null(parsed->parent);
2423 assert_string_equal(parsed->ref, "ref");
2424 assert_string_equal(parsed->type.name, "type");
2425 assert_string_equal(parsed->units, "uni");
2426 assert_string_equal(parsed->when->cond, "when-cond");
2427 assert_true(parsed->flags & LYS_CONFIG_W);
2428 assert_true(parsed->flags & LYS_ORDBY_USER);
2429 assert_true(parsed->flags & LYS_STATUS_CURR);
David Sedláke0ef1c62019-09-13 10:05:55 +02002430 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002431 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2432 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002433 lysp_node_free(st->ctx, siblings);
2434 siblings = NULL;
2435
2436 data = ELEMENT_WRAPPER_START
2437 "<leaf-list name=\"llist\">"
2438 "<config value=\"true\" />"
2439 "<description><text>desc</text></description>"
2440 "<if-feature name=\"feature\"/>"
2441 "<max-elements value=\"15\"/>"
2442 "<min-elements value=\"5\"/>"
2443 "<must condition=\"must-cond\"/>"
2444 "<ordered-by value=\"user\" />"
2445 "<reference><text>ref</text></reference>"
2446 "<status value=\"current\"/>"
2447 "<type name=\"type\"/>"
2448 "<units name=\"uni\"/>"
2449 "<when condition=\"when-cond\"/>"
2450 "</leaf-list>"
2451 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002452 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002453 parsed = (struct lysp_node_leaflist *)siblings;
2454 assert_string_equal(parsed->dsc, "desc");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002455 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002456 assert_int_equal(parsed->min, 5);
2457 assert_int_equal(parsed->max, 15);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002458 assert_string_equal(parsed->musts->arg.str, "must-cond");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002459 assert_string_equal(parsed->name, "llist");
2460 assert_null(parsed->next);
2461 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2462 assert_null(parsed->parent);
2463 assert_string_equal(parsed->ref, "ref");
2464 assert_string_equal(parsed->type.name, "type");
2465 assert_string_equal(parsed->units, "uni");
2466 assert_string_equal(parsed->when->cond, "when-cond");
2467 assert_true(parsed->flags & LYS_CONFIG_W);
2468 assert_true(parsed->flags & LYS_ORDBY_USER);
2469 assert_true(parsed->flags & LYS_STATUS_CURR);
2470 lysp_node_free(st->ctx, siblings);
2471 siblings = NULL;
2472
2473 data = ELEMENT_WRAPPER_START
2474 "<leaf-list name=\"llist\">"
2475 "<type name=\"type\"/>"
2476 "</leaf-list>"
2477 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002478 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002479 parsed = (struct lysp_node_leaflist *)siblings;
2480 assert_string_equal(parsed->name, "llist");
2481 assert_string_equal(parsed->type.name, "type");
2482 lysp_node_free(st->ctx, siblings);
2483 siblings = NULL;
2484
2485 /* invalid combinations */
2486 data = ELEMENT_WRAPPER_START
2487 "<leaf-list name=\"llist\">"
2488 "<max-elements value=\"5\"/>"
2489 "<min-elements value=\"15\"/>"
2490 "<type name=\"type\"/>"
2491 "</leaf-list>"
2492 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002493 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002494 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2495 lysp_node_free(st->ctx, siblings);
2496 siblings = NULL;
2497
2498 data = ELEMENT_WRAPPER_START
2499 "<leaf-list name=\"llist\">"
2500 "<default value=\"def-val1\"/>"
2501 "<min-elements value=\"15\"/>"
2502 "<type name=\"type\"/>"
2503 "</leaf-list>"
2504 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002505 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002506 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 +02002507 lysp_node_free(st->ctx, siblings);
2508 siblings = NULL;
2509
2510 data = ELEMENT_WRAPPER_START
2511 "<leaf-list name=\"llist\">"
2512 "</leaf-list>"
2513 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002514 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02002515 logbuf_assert("Missing mandatory sub-element \"type\" of \"leaf-list\" element. Line number 1.");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002516 lysp_node_free(st->ctx, siblings);
2517 siblings = NULL;
2518
2519 st->finished_correctly = true;
2520}
2521
David Sedlákcb39f642019-07-19 13:19:55 +02002522static void
2523test_presence_elem(void **state)
2524{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002525 struct test_parser_yin_state *st = *state;
David Sedlákcb39f642019-07-19 13:19:55 +02002526 const char *data;
2527 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002528 struct lysp_ext_instance *exts = NULL;
2529
2530 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\">"EXT_SUBELEM"</presence>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002531 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02002532 assert_string_equal(val, "presence-val");
David Sedláke0ef1c62019-09-13 10:05:55 +02002533 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002534 assert_int_equal(exts[0].insubstmt_index, 0);
2535 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_PRESENCE);
2536 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2537 FREE_STRING(st->ctx, val);
David Sedlákcb39f642019-07-19 13:19:55 +02002538
2539 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002540 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlákcb39f642019-07-19 13:19:55 +02002541 assert_string_equal(val, "presence-val");
2542 FREE_STRING(st->ctx, val);
2543
2544 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002545 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlákcb39f642019-07-19 13:19:55 +02002546 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2547
2548 st->finished_correctly = true;
2549}
2550
David Sedlák12470a82019-07-19 13:44:36 +02002551static void
2552test_key_elem(void **state)
2553{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002554 struct test_parser_yin_state *st = *state;
David Sedlák12470a82019-07-19 13:44:36 +02002555 const char *data;
2556 const char *val;
David Sedlákd1144562019-08-06 12:36:14 +02002557 struct lysp_ext_instance *exts = NULL;
2558
2559 data = ELEMENT_WRAPPER_START "<key value=\"key-value\">"EXT_SUBELEM"</key>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002560 assert_int_equal(test_element_helper(st, data, &val, NULL, &exts), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02002561 assert_string_equal(val, "key-value");
David Sedláke0ef1c62019-09-13 10:05:55 +02002562 assert_string_equal(exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002563 assert_int_equal(exts[0].insubstmt_index, 0);
2564 assert_int_equal(exts[0].insubstmt, LYEXT_SUBSTMT_KEY);
2565 FREE_ARRAY(st->ctx, exts, lysp_ext_instance_free);
2566 FREE_STRING(st->ctx, val);
David Sedlák12470a82019-07-19 13:44:36 +02002567
2568 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002569 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák12470a82019-07-19 13:44:36 +02002570 assert_string_equal(val, "key-value");
2571 FREE_STRING(st->ctx, val);
2572
2573 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002574 assert_int_equal(test_element_helper(st, data, &val, NULL, NULL), LY_EVALID);
David Sedlák12470a82019-07-19 13:44:36 +02002575 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2576
2577 st->finished_correctly = true;
2578}
2579
David Sedlák04e17b22019-07-19 15:29:48 +02002580static void
2581test_typedef_elem(void **state)
2582{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002583 struct test_parser_yin_state *st = *state;
David Sedlák04e17b22019-07-19 15:29:48 +02002584 const char *data;
2585 struct lysp_tpdf *tpdfs = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002586 struct tree_node_meta typdef_meta = {NULL, (struct lysp_node **)&tpdfs};
David Sedlák04e17b22019-07-19 15:29:48 +02002587
2588 data = ELEMENT_WRAPPER_START
2589 "<typedef name=\"tpdf-name\">"
2590 "<default value=\"def-val\"/>"
2591 "<description><text>desc-text</text></description>"
2592 "<reference><text>ref-text</text></reference>"
2593 "<status value=\"current\"/>"
2594 "<type name=\"type\"/>"
2595 "<units name=\"uni\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002596 EXT_SUBELEM
David Sedlák04e17b22019-07-19 15:29:48 +02002597 "</typedef>"
2598 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002599 assert_int_equal(test_element_helper(st, data, &typdef_meta, NULL, NULL), LY_SUCCESS);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002600 assert_string_equal(tpdfs[0].dflt.str, "def-val");
David Sedlák04e17b22019-07-19 15:29:48 +02002601 assert_string_equal(tpdfs[0].dsc, "desc-text");
David Sedlák04e17b22019-07-19 15:29:48 +02002602 assert_string_equal(tpdfs[0].name, "tpdf-name");
2603 assert_string_equal(tpdfs[0].ref, "ref-text");
2604 assert_string_equal(tpdfs[0].type.name, "type");
2605 assert_string_equal(tpdfs[0].units, "uni");
2606 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
David Sedláke0ef1c62019-09-13 10:05:55 +02002607 assert_string_equal(tpdfs[0].exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002608 assert_int_equal(tpdfs[0].exts[0].insubstmt_index, 0);
2609 assert_int_equal(tpdfs[0].exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák04e17b22019-07-19 15:29:48 +02002610 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2611 tpdfs = NULL;
2612
2613 data = ELEMENT_WRAPPER_START
2614 "<typedef name=\"tpdf-name\">"
2615 "<type name=\"type\"/>"
2616 "</typedef>"
2617 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002618 assert_int_equal(test_element_helper(st, data, &typdef_meta, NULL, NULL), LY_SUCCESS);
David Sedlák04e17b22019-07-19 15:29:48 +02002619 assert_string_equal(tpdfs[0].name, "tpdf-name");
2620 assert_string_equal(tpdfs[0].type.name, "type");
2621 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2622 tpdfs = NULL;
2623
2624 st->finished_correctly = true;
2625}
2626
David Sedlákd2d676a2019-07-22 11:28:19 +02002627static void
2628test_refine_elem(void **state)
2629{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002630 struct test_parser_yin_state *st = *state;
David Sedlákd2d676a2019-07-22 11:28:19 +02002631 const char *data;
2632 struct lysp_refine *refines = NULL;
2633
2634 /* max subelems */
2635 data = ELEMENT_WRAPPER_START
2636 "<refine target-node=\"target\">"
2637 "<if-feature name=\"feature\" />"
2638 "<must condition=\"cond\" />"
2639 "<presence value=\"presence\" />"
2640 "<default value=\"def\" />"
2641 "<config value=\"true\" />"
2642 "<mandatory value=\"true\" />"
2643 "<min-elements value=\"10\" />"
2644 "<max-elements value=\"20\" />"
2645 "<description><text>desc</text></description>"
2646 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002647 EXT_SUBELEM
David Sedlákd2d676a2019-07-22 11:28:19 +02002648 "</refine>"
2649 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002650 assert_int_equal(test_element_helper(st, data, &refines, NULL, NULL), LY_SUCCESS);
David Sedlákd2d676a2019-07-22 11:28:19 +02002651 assert_string_equal(refines->nodeid, "target");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02002652 assert_string_equal(refines->dflts[0].str, "def");
David Sedlákd2d676a2019-07-22 11:28:19 +02002653 assert_string_equal(refines->dsc, "desc");
David Sedlákd2d676a2019-07-22 11:28:19 +02002654 assert_true(refines->flags & LYS_CONFIG_W);
2655 assert_true(refines->flags & LYS_MAND_TRUE);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002656 assert_string_equal(refines->iffeatures[0].str, "feature");
David Sedlákd2d676a2019-07-22 11:28:19 +02002657 assert_int_equal(refines->max, 20);
2658 assert_int_equal(refines->min, 10);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002659 assert_string_equal(refines->musts->arg.str, "cond");
David Sedlákd2d676a2019-07-22 11:28:19 +02002660 assert_string_equal(refines->presence, "presence");
2661 assert_string_equal(refines->ref, "ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02002662 assert_string_equal(refines->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002663 assert_int_equal(refines->exts[0].insubstmt_index, 0);
2664 assert_int_equal(refines->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákd2d676a2019-07-22 11:28:19 +02002665 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2666 refines = NULL;
2667
2668 /* min subelems */
2669 data = ELEMENT_WRAPPER_START "<refine target-node=\"target\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002670 assert_int_equal(test_element_helper(st, data, &refines, NULL, NULL), LY_SUCCESS);
David Sedlákd2d676a2019-07-22 11:28:19 +02002671 assert_string_equal(refines->nodeid, "target");
2672 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2673 refines = NULL;
2674
2675 st->finished_correctly = true;
2676}
2677
David Sedlák0d6de5a2019-07-22 13:25:44 +02002678static void
2679test_uses_elem(void **state)
2680{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002681 struct test_parser_yin_state *st = *state;
David Sedlák0d6de5a2019-07-22 13:25:44 +02002682 const char *data;
2683 struct lysp_node *siblings = NULL;
2684 struct tree_node_meta node_meta = {NULL, &siblings};
2685 struct lysp_node_uses *parsed = NULL;
2686
2687 /* max subelems */
2688 data = ELEMENT_WRAPPER_START
2689 "<uses name=\"uses-name\">"
2690 "<when condition=\"cond\" />"
2691 "<if-feature name=\"feature\" />"
2692 "<status value=\"obsolete\" />"
2693 "<description><text>desc</text></description>"
2694 "<reference><text>ref</text></reference>"
2695 "<refine target-node=\"target\"/>"
David Sedlák992fb7c2019-07-24 16:51:01 +02002696 "<augment target-node=\"target\" />"
David Sedlákd1144562019-08-06 12:36:14 +02002697 EXT_SUBELEM
David Sedlák0d6de5a2019-07-22 13:25:44 +02002698 "</uses>"
2699 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002700 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002701 parsed = (struct lysp_node_uses *)&siblings[0];
2702 assert_string_equal(parsed->name, "uses-name");
2703 assert_string_equal(parsed->dsc, "desc");
David Sedlák0d6de5a2019-07-22 13:25:44 +02002704 assert_true(parsed->flags & LYS_STATUS_OBSLT);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002705 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlák0d6de5a2019-07-22 13:25:44 +02002706 assert_null(parsed->next);
2707 assert_int_equal(parsed->nodetype, LYS_USES);
2708 assert_null(parsed->parent);
2709 assert_string_equal(parsed->ref, "ref");
2710 assert_string_equal(parsed->refines->nodeid, "target");
2711 assert_string_equal(parsed->when->cond, "cond");
David Sedlák992fb7c2019-07-24 16:51:01 +02002712 assert_string_equal(parsed->augments->nodeid, "target");
David Sedláke0ef1c62019-09-13 10:05:55 +02002713 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002714 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2715 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002716 lysp_node_free(st->ctx, siblings);
2717 siblings = NULL;
2718
2719 /* min subelems */
2720 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002721 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002722 assert_string_equal(siblings[0].name, "uses-name");
2723 lysp_node_free(st->ctx, siblings);
2724 siblings = NULL;
2725
2726 st->finished_correctly = true;
2727}
2728
David Sedlákaa854b02019-07-22 14:17:10 +02002729static void
2730test_revision_elem(void **state)
2731{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002732 struct test_parser_yin_state *st = *state;
David Sedlákaa854b02019-07-22 14:17:10 +02002733 const char *data;
2734 struct lysp_revision *revs = NULL;
2735
2736 /* max subelems */
2737 data = ELEMENT_WRAPPER_START
2738 "<revision date=\"2018-12-25\">"
2739 "<description><text>desc</text></description>"
2740 "<reference><text>ref</text></reference>"
David Sedlákd1144562019-08-06 12:36:14 +02002741 EXT_SUBELEM
David Sedlákaa854b02019-07-22 14:17:10 +02002742 "</revision>"
2743 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002744 assert_int_equal(test_element_helper(st, data, &revs, NULL, NULL), LY_SUCCESS);
David Sedlákaa854b02019-07-22 14:17:10 +02002745 assert_string_equal(revs->date, "2018-12-25");
2746 assert_string_equal(revs->dsc, "desc");
2747 assert_string_equal(revs->ref, "ref");
David Sedláke0ef1c62019-09-13 10:05:55 +02002748 assert_string_equal(revs->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002749 assert_int_equal(revs->exts[0].insubstmt_index, 0);
2750 assert_int_equal(revs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaa854b02019-07-22 14:17:10 +02002751 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2752 revs = NULL;
2753
2754 /* min subelems */
2755 data = ELEMENT_WRAPPER_START "<revision date=\"2005-05-05\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002756 assert_int_equal(test_element_helper(st, data, &revs, NULL, NULL), LY_SUCCESS);
David Sedlákaa854b02019-07-22 14:17:10 +02002757 assert_string_equal(revs->date, "2005-05-05");
2758 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2759 revs = NULL;
2760
2761 /* invalid value */
2762 data = ELEMENT_WRAPPER_START "<revision date=\"05-05-2005\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002763 assert_int_equal(test_element_helper(st, data, &revs, NULL, NULL), LY_EVALID);
David Sedlákaa854b02019-07-22 14:17:10 +02002764 logbuf_assert("Invalid value \"05-05-2005\" of \"revision\". Line number 1.");
2765 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2766 revs = NULL;
2767
2768 st->finished_correctly = true;
2769}
2770
David Sedlák0c2bab92019-07-22 15:33:19 +02002771static void
2772test_include_elem(void **state)
2773{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002774 struct test_parser_yin_state *st = *state;
David Sedlák0c2bab92019-07-22 15:33:19 +02002775 const char *data;
2776 struct lysp_include *includes = NULL;
2777 struct include_meta inc_meta = {"module-name", &includes};
2778
2779 /* max subelems */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02002780 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák0c2bab92019-07-22 15:33:19 +02002781 data = ELEMENT_WRAPPER_START
2782 "<include module=\"mod\">"
2783 "<description><text>desc</text></description>"
2784 "<reference><text>ref</text></reference>"
2785 "<revision-date date=\"1999-09-09\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002786 EXT_SUBELEM
David Sedlák0c2bab92019-07-22 15:33:19 +02002787 "</include>"
2788 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002789 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0c2bab92019-07-22 15:33:19 +02002790 assert_string_equal(includes->name, "mod");
2791 assert_string_equal(includes->dsc, "desc");
2792 assert_string_equal(includes->ref, "ref");
David Sedlák0c2bab92019-07-22 15:33:19 +02002793 assert_string_equal(includes->rev, "1999-09-09");
David Sedláke0ef1c62019-09-13 10:05:55 +02002794 assert_string_equal(includes->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002795 assert_int_equal(includes->exts[0].insubstmt_index, 0);
2796 assert_int_equal(includes->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák0c2bab92019-07-22 15:33:19 +02002797 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2798 includes = NULL;
2799
2800 /* min subelems */
2801 data = ELEMENT_WRAPPER_START "<include module=\"mod\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002802 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0c2bab92019-07-22 15:33:19 +02002803 assert_string_equal(includes->name, "mod");
2804 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2805 includes = NULL;
2806
2807 /* invalid combinations */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02002808 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_0;
David Sedlák0c2bab92019-07-22 15:33:19 +02002809 data = ELEMENT_WRAPPER_START
2810 "<include module=\"mod\">"
2811 "<description><text>desc</text></description>"
2812 "<revision-date date=\"1999-09-09\"/>"
2813 "</include>"
2814 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002815 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_EVALID);
David Sedlák0c2bab92019-07-22 15:33:19 +02002816 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.");
2817 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2818 includes = NULL;
2819
Michal Vasko5d24f6c2020-10-13 13:49:06 +02002820 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_0;
David Sedlák0c2bab92019-07-22 15:33:19 +02002821 data = ELEMENT_WRAPPER_START
2822 "<include module=\"mod\">"
2823 "<reference><text>ref</text></reference>"
2824 "<revision-date date=\"1999-09-09\"/>"
2825 "</include>"
2826 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002827 assert_int_equal(test_element_helper(st, data, &inc_meta, NULL, NULL), LY_EVALID);
David Sedlák0c2bab92019-07-22 15:33:19 +02002828 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.");
2829 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2830 includes = NULL;
2831
2832 st->finished_correctly = true;
2833}
2834
David Sedlák5e13dea2019-07-22 16:06:45 +02002835static void
David Sedlákaf536aa2019-07-23 13:42:23 +02002836test_list_elem(void **state)
2837{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002838 struct test_parser_yin_state *st = *state;
David Sedlákaf536aa2019-07-23 13:42:23 +02002839 const char *data;
2840 struct lysp_node *siblings = NULL;
2841 struct tree_node_meta node_meta = {NULL, &siblings};
2842 struct lysp_node_list *parsed = NULL;
2843
2844 /* max subelems */
2845 data = ELEMENT_WRAPPER_START
2846 "<list name=\"list-name\">"
2847 "<when condition=\"when\"/>"
2848 "<if-feature name=\"iff\"/>"
2849 "<must condition=\"must-cond\"/>"
2850 "<key value=\"key\"/>"
2851 "<unique tag=\"utag\"/>"
2852 "<config value=\"true\"/>"
2853 "<min-elements value=\"10\"/>"
2854 "<ordered-by value=\"user\"/>"
2855 "<status value=\"deprecated\"/>"
2856 "<description><text>desc</text></description>"
2857 "<reference><text>ref</text></reference>"
2858 "<anydata name=\"anyd\"/>"
2859 "<anyxml name=\"anyx\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002860 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002861 "<choice name=\"choice\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02002862 "<action name=\"action\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002863 "<grouping name=\"grp\"/>"
David Sedlák031b9e72019-07-23 15:19:37 +02002864 "<notification name=\"notf\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002865 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2866 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002867 "<list name=\"sub-list\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002868 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákaf536aa2019-07-23 13:42:23 +02002869 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002870 EXT_SUBELEM
David Sedlákaf536aa2019-07-23 13:42:23 +02002871 "</list>"
2872 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002873 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákaf536aa2019-07-23 13:42:23 +02002874 parsed = (struct lysp_node_list *)&siblings[0];
2875 assert_string_equal(parsed->dsc, "desc");
2876 assert_string_equal(parsed->child->name, "anyd");
2877 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2878 assert_string_equal(parsed->child->next->name, "anyx");
2879 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
David Sedlákf111bcb2019-07-23 17:15:51 +02002880 assert_string_equal(parsed->child->next->next->name, "cont");
2881 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002882 assert_string_equal(parsed->child->next->next->next->name, "choice");
2883 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
David Sedlák85d0eca2019-07-24 15:15:21 +02002884 assert_string_equal(parsed->child->next->next->next->next->name, "leaf");
2885 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAF);
2886 assert_string_equal(parsed->child->next->next->next->next->next->name, "llist");
2887 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2888 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "sub-list");
2889 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LIST);
2890 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "uses-name");
2891 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2892 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002893 assert_string_equal(parsed->groupings->name, "grp");
David Sedlák85d0eca2019-07-24 15:15:21 +02002894 assert_string_equal(parsed->actions->name, "action");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002895 assert_int_equal(parsed->groupings->nodetype, LYS_GROUPING);
David Sedlák031b9e72019-07-23 15:19:37 +02002896 assert_string_equal(parsed->notifs->name, "notf");
David Sedlákaf536aa2019-07-23 13:42:23 +02002897 assert_true(parsed->flags & LYS_ORDBY_USER);
2898 assert_true(parsed->flags & LYS_STATUS_DEPRC);
2899 assert_true(parsed->flags & LYS_CONFIG_W);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002900 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedlákaf536aa2019-07-23 13:42:23 +02002901 assert_string_equal(parsed->key, "key");
2902 assert_int_equal(parsed->min, 10);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002903 assert_string_equal(parsed->musts->arg.str, "must-cond");
David Sedlákaf536aa2019-07-23 13:42:23 +02002904 assert_string_equal(parsed->name, "list-name");
2905 assert_null(parsed->next);
2906 assert_int_equal(parsed->nodetype, LYS_LIST);
2907 assert_null(parsed->parent);
2908 assert_string_equal(parsed->ref, "ref");
2909 assert_string_equal(parsed->typedefs->name, "tpdf");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002910 assert_string_equal(parsed->uniques->str, "utag");
David Sedlákaf536aa2019-07-23 13:42:23 +02002911 assert_string_equal(parsed->when->cond, "when");
David Sedláke0ef1c62019-09-13 10:05:55 +02002912 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002913 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
2914 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákaf536aa2019-07-23 13:42:23 +02002915 lysp_node_free(st->ctx, siblings);
2916 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
2917 siblings = NULL;
2918
2919 /* min subelems */
2920 data = ELEMENT_WRAPPER_START "<list name=\"list-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002921 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákaf536aa2019-07-23 13:42:23 +02002922 parsed = (struct lysp_node_list *)&siblings[0];
2923 assert_string_equal(parsed->name, "list-name");
2924 lysp_node_free(st->ctx, siblings);
2925 siblings = NULL;
2926
2927 st->finished_correctly = true;
2928}
2929
David Sedlák031b9e72019-07-23 15:19:37 +02002930static void
2931test_notification_elem(void **state)
2932{
Radek Krejci3a4889a2020-05-19 17:01:58 +02002933 struct test_parser_yin_state *st = *state;
David Sedlák031b9e72019-07-23 15:19:37 +02002934 const char *data;
2935 struct lysp_notif *notifs = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002936 struct tree_node_meta notif_meta = {NULL, (struct lysp_node **)&notifs};
David Sedlák031b9e72019-07-23 15:19:37 +02002937
2938 /* max subelems */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02002939 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák031b9e72019-07-23 15:19:37 +02002940 data = ELEMENT_WRAPPER_START
2941 "<notification name=\"notif-name\">"
2942 "<anydata name=\"anyd\"/>"
2943 "<anyxml name=\"anyx\"/>"
2944 "<description><text>desc</text></description>"
2945 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002946 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
2947 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák031b9e72019-07-23 15:19:37 +02002948 "<list name=\"sub-list\"/>"
2949 "<must condition=\"cond\"/>"
2950 "<reference><text>ref</text></reference>"
2951 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02002952 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák031b9e72019-07-23 15:19:37 +02002953 "<uses name=\"uses-name\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02002954 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02002955 "<choice name=\"choice\"/>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02002956 "<grouping name=\"grp\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02002957 EXT_SUBELEM
David Sedlák031b9e72019-07-23 15:19:37 +02002958 "</notification>"
2959 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002960 assert_int_equal(test_element_helper(st, data, &notif_meta, NULL, NULL), LY_SUCCESS);
David Sedlák031b9e72019-07-23 15:19:37 +02002961 assert_string_equal(notifs->name, "notif-name");
2962 assert_string_equal(notifs->data->name, "anyd");
2963 assert_int_equal(notifs->data->nodetype, LYS_ANYDATA);
2964 assert_string_equal(notifs->data->next->name, "anyx");
2965 assert_int_equal(notifs->data->next->nodetype, LYS_ANYXML);
2966 assert_string_equal(notifs->data->next->next->name, "leaf");
2967 assert_int_equal(notifs->data->next->next->nodetype, LYS_LEAF);
2968 assert_string_equal(notifs->data->next->next->next->name, "llist");
2969 assert_int_equal(notifs->data->next->next->next->nodetype, LYS_LEAFLIST);
2970 assert_string_equal(notifs->data->next->next->next->next->name, "sub-list");
2971 assert_int_equal(notifs->data->next->next->next->next->nodetype, LYS_LIST);
David Sedlák031b9e72019-07-23 15:19:37 +02002972 assert_true(notifs->flags & LYS_STATUS_DEPRC);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002973 assert_string_equal(notifs->groupings->name, "grp");
2974 assert_int_equal(notifs->groupings->nodetype, LYS_GROUPING);
David Sedlákf111bcb2019-07-23 17:15:51 +02002975 assert_string_equal(notifs->data->next->next->next->next->next->name, "uses-name");
2976 assert_int_equal(notifs->data->next->next->next->next->next->nodetype, LYS_USES);
2977 assert_string_equal(notifs->data->next->next->next->next->next->next->name, "cont");
2978 assert_int_equal(notifs->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002979 assert_int_equal(notifs->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
2980 assert_string_equal(notifs->data->next->next->next->next->next->next->next->name, "choice");
2981 assert_null(notifs->data->next->next->next->next->next->next->next->next);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002982 assert_string_equal(notifs->iffeatures[0].str, "iff");
2983 assert_string_equal(notifs->musts->arg.str, "cond");
David Sedlák031b9e72019-07-23 15:19:37 +02002984 assert_int_equal(notifs->nodetype, LYS_NOTIF);
2985 assert_null(notifs->parent);
2986 assert_string_equal(notifs->ref, "ref");
2987 assert_string_equal(notifs->typedefs->name, "tpdf");
David Sedláke0ef1c62019-09-13 10:05:55 +02002988 assert_string_equal(notifs->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02002989 assert_int_equal(notifs->exts[0].insubstmt_index, 0);
2990 assert_int_equal(notifs->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák031b9e72019-07-23 15:19:37 +02002991 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
2992 notifs = NULL;
2993
2994 /* min subelems */
2995 data = ELEMENT_WRAPPER_START "<notification name=\"notif-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01002996 assert_int_equal(test_element_helper(st, data, &notif_meta, NULL, NULL), LY_SUCCESS);
David Sedlák031b9e72019-07-23 15:19:37 +02002997 assert_string_equal(notifs->name, "notif-name");
2998 FREE_ARRAY(st->ctx, notifs, lysp_notif_free);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002999 notifs = NULL;
3000
3001 st->finished_correctly = true;
3002}
3003
3004static void
3005test_grouping_elem(void **state)
3006{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003007 struct test_parser_yin_state *st = *state;
David Sedláke3ce9ef2019-07-23 16:34:30 +02003008 const char *data;
3009 struct lysp_grp *grps = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02003010 struct tree_node_meta grp_meta = {NULL, (struct lysp_node **)&grps};
David Sedláke3ce9ef2019-07-23 16:34:30 +02003011
3012 /* max subelems */
3013 data = ELEMENT_WRAPPER_START
3014 "<grouping name=\"grp-name\">"
3015 "<anydata name=\"anyd\"/>"
3016 "<anyxml name=\"anyx\"/>"
3017 "<description><text>desc</text></description>"
3018 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003019 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3020 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003021 "<list name=\"list\"/>"
3022 "<notification name=\"notf\"/>"
3023 "<reference><text>ref</text></reference>"
3024 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003025 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke3ce9ef2019-07-23 16:34:30 +02003026 "<uses name=\"uses-name\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003027 "<action name=\"act\"/>"
David Sedlákf111bcb2019-07-23 17:15:51 +02003028 "<container name=\"cont\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003029 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003030 EXT_SUBELEM
David Sedláke3ce9ef2019-07-23 16:34:30 +02003031 "</grouping>"
3032 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003033 assert_int_equal(test_element_helper(st, data, &grp_meta, NULL, NULL), LY_SUCCESS);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003034 assert_string_equal(grps->name, "grp-name");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003035 assert_string_equal(grps->data->name, "anyd");
3036 assert_string_equal(grps->data->next->name, "anyx");
3037 assert_string_equal(grps->data->next->next->name, "leaf");
3038 assert_string_equal(grps->data->next->next->next->name, "llist");
3039 assert_string_equal(grps->data->next->next->next->next->name, "list");
3040 assert_string_equal(grps->dsc, "desc");
David Sedláke3ce9ef2019-07-23 16:34:30 +02003041 assert_true(grps->flags & LYS_STATUS_CURR);
3042 assert_string_equal(grps->groupings->name, "sub-grp");
3043 assert_int_equal(grps->nodetype, LYS_GROUPING);
3044 assert_string_equal(grps->notifs->name, "notf");
3045 assert_null(grps->parent);
3046 assert_string_equal(grps->ref, "ref");
3047 assert_string_equal(grps->typedefs->name, "tpdf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003048 assert_string_equal(grps->actions->name, "act");
David Sedlákf111bcb2019-07-23 17:15:51 +02003049 assert_string_equal(grps->data->next->next->next->next->next->name, "uses-name");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003050 assert_int_equal(grps->data->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákf111bcb2019-07-23 17:15:51 +02003051 assert_string_equal(grps->data->next->next->next->next->next->next->name, "cont");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003052 assert_int_equal(grps->data->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
3053 assert_string_equal(grps->data->next->next->next->next->next->next->next->name, "choice");
3054 assert_int_equal(grps->data->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
David Sedláke0ef1c62019-09-13 10:05:55 +02003055 assert_string_equal(grps->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003056 assert_int_equal(grps->exts[0].insubstmt_index, 0);
3057 assert_int_equal(grps->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003058 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3059 grps = NULL;
3060
3061 /* min subelems */
3062 data = ELEMENT_WRAPPER_START "<grouping name=\"grp-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003063 assert_int_equal(test_element_helper(st, data, &grp_meta, NULL, NULL), LY_SUCCESS);
David Sedláke3ce9ef2019-07-23 16:34:30 +02003064 assert_string_equal(grps->name, "grp-name");
3065 FREE_ARRAY(st->ctx, grps, lysp_grp_free);
3066 grps = NULL;
David Sedlák031b9e72019-07-23 15:19:37 +02003067
3068 st->finished_correctly = true;
3069}
3070
David Sedlákf111bcb2019-07-23 17:15:51 +02003071static void
3072test_container_elem(void **state)
3073{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003074 struct test_parser_yin_state *st = *state;
David Sedlákf111bcb2019-07-23 17:15:51 +02003075 const char *data;
3076 struct lysp_node *siblings = NULL;
3077 struct tree_node_meta node_meta = {NULL, &siblings};
3078 struct lysp_node_container *parsed = NULL;
3079
3080 /* max subelems */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003081 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedláke2dc9e92019-07-24 09:59:21 +02003082 data = ELEMENT_WRAPPER_START
3083 "<container name=\"cont-name\">"
3084 "<anydata name=\"anyd\"/>"
3085 "<anyxml name=\"anyx\"/>"
3086 "<config value=\"true\"/>"
3087 "<container name=\"subcont\"/>"
3088 "<description><text>desc</text></description>"
3089 "<grouping name=\"sub-grp\"/>"
3090 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003091 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3092 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003093 "<list name=\"list\"/>"
3094 "<must condition=\"cond\"/>"
3095 "<notification name=\"notf\"/>"
3096 "<presence value=\"presence\"/>"
3097 "<reference><text>ref</text></reference>"
3098 "<status value=\"current\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003099 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedláke2dc9e92019-07-24 09:59:21 +02003100 "<uses name=\"uses-name\"/>"
3101 "<when condition=\"when-cond\"/>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003102 "<action name=\"act\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003103 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003104 EXT_SUBELEM
David Sedláke2dc9e92019-07-24 09:59:21 +02003105 "</container>"
3106 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003107 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedláke2dc9e92019-07-24 09:59:21 +02003108 parsed = (struct lysp_node_container *)siblings;
3109 assert_string_equal(parsed->name, "cont-name");
3110 assert_null(parsed->parent);
3111 assert_int_equal(parsed->nodetype, LYS_CONTAINER);
3112 assert_true(parsed->flags & LYS_CONFIG_W);
3113 assert_true(parsed->flags & LYS_STATUS_CURR);
3114 assert_null(parsed->next);
3115 assert_string_equal(parsed->dsc, "desc");
3116 assert_string_equal(parsed->ref, "ref");
3117 assert_string_equal(parsed->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003118 assert_string_equal(parsed->iffeatures[0].str, "iff");
3119 assert_string_equal(parsed->musts->arg.str, "cond");
David Sedláke2dc9e92019-07-24 09:59:21 +02003120 assert_string_equal(parsed->presence, "presence");
3121 assert_string_equal(parsed->typedefs->name, "tpdf");
3122 assert_string_equal(parsed->groupings->name, "sub-grp");
3123 assert_string_equal(parsed->child->name, "anyd");
3124 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3125 assert_string_equal(parsed->child->next->name, "anyx");
3126 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3127 assert_string_equal(parsed->child->next->next->name, "subcont");
3128 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3129 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3130 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3131 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3132 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3133 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3134 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3135 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3136 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003137 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3138 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3139 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke2dc9e92019-07-24 09:59:21 +02003140 assert_string_equal(parsed->notifs->name, "notf");
David Sedlák85d0eca2019-07-24 15:15:21 +02003141 assert_string_equal(parsed->actions->name, "act");
David Sedláke0ef1c62019-09-13 10:05:55 +02003142 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003143 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3144 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedláke2dc9e92019-07-24 09:59:21 +02003145 lysp_node_free(st->ctx, siblings);
3146 ly_set_erase(&st->yin_ctx->tpdfs_nodes, NULL);
3147 siblings = NULL;
David Sedlákf111bcb2019-07-23 17:15:51 +02003148
3149 /* min subelems */
3150 data = ELEMENT_WRAPPER_START "<container name=\"cont-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003151 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákf111bcb2019-07-23 17:15:51 +02003152 parsed = (struct lysp_node_container *)siblings;
3153 assert_string_equal(parsed->name, "cont-name");
3154 lysp_node_free(st->ctx, siblings);
3155 siblings = NULL;
3156
3157 st->finished_correctly = true;
3158}
3159
David Sedlák5379d392019-07-24 10:42:03 +02003160static void
3161test_case_elem(void **state)
3162{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003163 struct test_parser_yin_state *st = *state;
David Sedlák5379d392019-07-24 10:42:03 +02003164 const char *data;
3165 struct lysp_node *siblings = NULL;
3166 struct tree_node_meta node_meta = {NULL, &siblings};
3167 struct lysp_node_case *parsed = NULL;
3168
3169 /* max subelems */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003170 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák5379d392019-07-24 10:42:03 +02003171 data = ELEMENT_WRAPPER_START
3172 "<case name=\"case-name\">"
3173 "<anydata name=\"anyd\"/>"
3174 "<anyxml name=\"anyx\"/>"
3175 "<container name=\"subcont\"/>"
3176 "<description><text>desc</text></description>"
3177 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003178 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3179 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák5379d392019-07-24 10:42:03 +02003180 "<list name=\"list\"/>"
3181 "<reference><text>ref</text></reference>"
3182 "<status value=\"current\"/>"
3183 "<uses name=\"uses-name\"/>"
3184 "<when condition=\"when-cond\"/>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003185 "<choice name=\"choice\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003186 EXT_SUBELEM
David Sedlák5379d392019-07-24 10:42:03 +02003187 "</case>"
3188 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003189 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák5379d392019-07-24 10:42:03 +02003190 parsed = (struct lysp_node_case *)siblings;
3191 assert_string_equal(parsed->name, "case-name");
3192 assert_null(parsed->parent);
3193 assert_int_equal(parsed->nodetype, LYS_CASE);
3194 assert_true(parsed->flags & LYS_STATUS_CURR);
3195 assert_null(parsed->next);
3196 assert_string_equal(parsed->dsc, "desc");
3197 assert_string_equal(parsed->ref, "ref");
3198 assert_string_equal(parsed->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003199 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedlák5379d392019-07-24 10:42:03 +02003200 assert_string_equal(parsed->child->name, "anyd");
3201 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3202 assert_string_equal(parsed->child->next->name, "anyx");
3203 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3204 assert_string_equal(parsed->child->next->next->name, "subcont");
3205 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
3206 assert_string_equal(parsed->child->next->next->next->name, "leaf");
3207 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
3208 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
3209 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
3210 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
3211 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
3212 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
3213 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003214 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
3215 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
3216 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003217 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003218 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3219 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák5379d392019-07-24 10:42:03 +02003220 lysp_node_free(st->ctx, siblings);
3221 siblings = NULL;
3222
3223 /* min subelems */
3224 data = ELEMENT_WRAPPER_START "<case name=\"case-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003225 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák5379d392019-07-24 10:42:03 +02003226 parsed = (struct lysp_node_case *)siblings;
3227 assert_string_equal(parsed->name, "case-name");
3228 lysp_node_free(st->ctx, siblings);
3229 siblings = NULL;
3230
3231 st->finished_correctly = true;
3232}
3233
David Sedlákb7abcfa2019-07-24 12:33:35 +02003234static void
3235test_choice_elem(void **state)
3236{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003237 struct test_parser_yin_state *st = *state;
David Sedlákb7abcfa2019-07-24 12:33:35 +02003238 const char *data;
3239 struct lysp_node *siblings = NULL;
3240 struct tree_node_meta node_meta = {NULL, &siblings};
3241 struct lysp_node_choice *parsed = NULL;
3242
3243 /* max subelems */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003244 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlákb7abcfa2019-07-24 12:33:35 +02003245 data = ELEMENT_WRAPPER_START
3246 "<choice name=\"choice-name\">"
3247 "<anydata name=\"anyd\"/>"
3248 "<anyxml name=\"anyx\"/>"
3249 "<case name=\"sub-case\"/>"
3250 "<choice name=\"choice\"/>"
3251 "<config value=\"true\"/>"
3252 "<container name=\"subcont\"/>"
3253 "<default value=\"def\"/>"
3254 "<description><text>desc</text></description>"
3255 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003256 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3257 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlákb7abcfa2019-07-24 12:33:35 +02003258 "<list name=\"list\"/>"
3259 "<mandatory value=\"true\" />"
3260 "<reference><text>ref</text></reference>"
3261 "<status value=\"current\"/>"
3262 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003263 EXT_SUBELEM
David Sedlákb7abcfa2019-07-24 12:33:35 +02003264 "</choice>"
3265 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003266 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003267 parsed = (struct lysp_node_choice *)siblings;
3268 assert_string_equal(parsed->name, "choice-name");
3269 assert_null(parsed->parent);
3270 assert_int_equal(parsed->nodetype, LYS_CHOICE);
3271 assert_true(parsed->flags & LYS_CONFIG_W && parsed->flags & LYS_MAND_TRUE && parsed->flags & LYS_STATUS_CURR);
3272 assert_null(parsed->next);
3273 assert_string_equal(parsed->dsc, "desc");
3274 assert_string_equal(parsed->ref, "ref");
3275 assert_string_equal(parsed->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003276 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedlákb7abcfa2019-07-24 12:33:35 +02003277 assert_string_equal(parsed->child->name, "anyd");
3278 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
3279 assert_string_equal(parsed->child->next->name, "anyx");
3280 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
3281 assert_string_equal(parsed->child->next->next->name, "sub-case");
3282 assert_int_equal(parsed->child->next->next->nodetype, LYS_CASE);
3283 assert_string_equal(parsed->child->next->next->next->name, "choice");
3284 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
3285 assert_string_equal(parsed->child->next->next->next->next->name, "subcont");
3286 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_CONTAINER);
3287 assert_string_equal(parsed->child->next->next->next->next->next->name, "leaf");
3288 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAF);
3289 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "llist");
3290 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3291 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "list");
3292 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3293 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003294 assert_string_equal(parsed->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003295 assert_int_equal(parsed->exts[0].insubstmt_index, 0);
3296 assert_int_equal(parsed->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003297 lysp_node_free(st->ctx, siblings);
3298 siblings = NULL;
3299
3300 /* min subelems */
3301 data = ELEMENT_WRAPPER_START "<choice name=\"choice-name\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003302 assert_int_equal(test_element_helper(st, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákb7abcfa2019-07-24 12:33:35 +02003303 parsed = (struct lysp_node_choice *)siblings;
3304 assert_string_equal(parsed->name, "choice-name");
3305 lysp_node_free(st->ctx, siblings);
3306 siblings = NULL;
3307
3308 st->finished_correctly = true;
3309}
3310
David Sedlák05404f62019-07-24 14:11:53 +02003311static void
3312test_inout_elem(void **state)
3313{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003314 struct test_parser_yin_state *st = *state;
David Sedlák05404f62019-07-24 14:11:53 +02003315 const char *data;
3316 struct lysp_action_inout inout = {};
3317 struct inout_meta inout_meta = {NULL, &inout};
3318
3319 /* max subelements */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003320 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák05404f62019-07-24 14:11:53 +02003321 data = ELEMENT_WRAPPER_START
3322 "<input>"
3323 "<anydata name=\"anyd\"/>"
3324 "<anyxml name=\"anyx\"/>"
3325 "<choice name=\"choice\"/>"
3326 "<container name=\"subcont\"/>"
3327 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003328 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3329 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003330 "<list name=\"list\"/>"
3331 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003332 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003333 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003334 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003335 "</input>"
3336 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003337 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
David Sedlák05404f62019-07-24 14:11:53 +02003338 assert_null(inout.parent);
3339 assert_int_equal(inout.nodetype, LYS_INPUT);
Michal Vasko7f45cf22020-10-01 12:49:44 +02003340 assert_string_equal(inout.musts->arg.str, "cond");
David Sedlák05404f62019-07-24 14:11:53 +02003341 assert_string_equal(inout.typedefs->name, "tpdf");
3342 assert_string_equal(inout.groupings->name, "sub-grp");
3343 assert_string_equal(inout.data->name, "anyd");
3344 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3345 assert_string_equal(inout.data->next->name, "anyx");
3346 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3347 assert_string_equal(inout.data->next->next->name, "choice");
3348 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3349 assert_string_equal(inout.data->next->next->next->name, "subcont");
3350 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3351 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3352 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3353 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3354 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3355 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3356 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3357 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3358 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3359 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003360 assert_string_equal(inout.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003361 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3362 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003363 lysp_action_inout_free(st->ctx, &inout);
3364 memset(&inout, 0, sizeof inout);
3365
3366 /* max subelements */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003367 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák05404f62019-07-24 14:11:53 +02003368 data = ELEMENT_WRAPPER_START
3369 "<output>"
3370 "<anydata name=\"anyd\"/>"
3371 "<anyxml name=\"anyx\"/>"
3372 "<choice name=\"choice\"/>"
3373 "<container name=\"subcont\"/>"
3374 "<grouping name=\"sub-grp\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003375 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3376 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák05404f62019-07-24 14:11:53 +02003377 "<list name=\"list\"/>"
3378 "<must condition=\"cond\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003379 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlák05404f62019-07-24 14:11:53 +02003380 "<uses name=\"uses-name\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003381 EXT_SUBELEM
David Sedlák05404f62019-07-24 14:11:53 +02003382 "</output>"
3383 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003384 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
David Sedlák05404f62019-07-24 14:11:53 +02003385 assert_null(inout.parent);
3386 assert_int_equal(inout.nodetype, LYS_OUTPUT);
Michal Vasko7f45cf22020-10-01 12:49:44 +02003387 assert_string_equal(inout.musts->arg.str, "cond");
David Sedlák05404f62019-07-24 14:11:53 +02003388 assert_string_equal(inout.typedefs->name, "tpdf");
3389 assert_string_equal(inout.groupings->name, "sub-grp");
3390 assert_string_equal(inout.data->name, "anyd");
3391 assert_int_equal(inout.data->nodetype, LYS_ANYDATA);
3392 assert_string_equal(inout.data->next->name, "anyx");
3393 assert_int_equal(inout.data->next->nodetype, LYS_ANYXML);
3394 assert_string_equal(inout.data->next->next->name, "choice");
3395 assert_int_equal(inout.data->next->next->nodetype, LYS_CHOICE);
3396 assert_string_equal(inout.data->next->next->next->name, "subcont");
3397 assert_int_equal(inout.data->next->next->next->nodetype, LYS_CONTAINER);
3398 assert_string_equal(inout.data->next->next->next->next->name, "leaf");
3399 assert_int_equal(inout.data->next->next->next->next->nodetype, LYS_LEAF);
3400 assert_string_equal(inout.data->next->next->next->next->next->name, "llist");
3401 assert_int_equal(inout.data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3402 assert_string_equal(inout.data->next->next->next->next->next->next->name, "list");
3403 assert_int_equal(inout.data->next->next->next->next->next->next->nodetype, LYS_LIST);
3404 assert_string_equal(inout.data->next->next->next->next->next->next->next->name, "uses-name");
3405 assert_int_equal(inout.data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3406 assert_null(inout.data->next->next->next->next->next->next->next->next);
David Sedláke0ef1c62019-09-13 10:05:55 +02003407 assert_string_equal(inout.exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003408 assert_int_equal(inout.exts[0].insubstmt_index, 0);
3409 assert_int_equal(inout.exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák05404f62019-07-24 14:11:53 +02003410 lysp_action_inout_free(st->ctx, &inout);
3411 memset(&inout, 0, sizeof inout);
3412
3413 /* min subelems */
Michal Vaskob83af8a2020-01-06 09:49:22 +01003414 data = ELEMENT_WRAPPER_START "<input><leaf name=\"l\"><type name=\"empty\"/></leaf></input>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003415 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
Michal Vaskob83af8a2020-01-06 09:49:22 +01003416 lysp_action_inout_free(st->ctx, &inout);
David Sedlák05404f62019-07-24 14:11:53 +02003417 memset(&inout, 0, sizeof inout);
3418
Michal Vaskob83af8a2020-01-06 09:49:22 +01003419 data = ELEMENT_WRAPPER_START "<output><leaf name=\"l\"><type name=\"empty\"/></leaf></output>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003420 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_SUCCESS);
Michal Vaskob83af8a2020-01-06 09:49:22 +01003421 lysp_action_inout_free(st->ctx, &inout);
David Sedlák05404f62019-07-24 14:11:53 +02003422 memset(&inout, 0, sizeof inout);
3423
3424 /* invalid combinations */
3425 data = ELEMENT_WRAPPER_START "<input name=\"test\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003426 assert_int_equal(test_element_helper(st, data, &inout_meta, NULL, NULL), LY_EVALID);
David Sedlák1538a842019-08-08 15:38:51 +02003427 logbuf_assert("Unexpected attribute \"name\" of \"input\" element. Line number 1.");
David Sedlák05404f62019-07-24 14:11:53 +02003428 memset(&inout, 0, sizeof inout);
3429
3430 st->finished_correctly = true;
3431}
3432
David Sedlák85d0eca2019-07-24 15:15:21 +02003433static void
3434test_action_elem(void **state)
3435{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003436 struct test_parser_yin_state *st = *state;
David Sedlák85d0eca2019-07-24 15:15:21 +02003437 const char *data;
3438 struct lysp_action *actions = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02003439 struct tree_node_meta act_meta = {NULL, (struct lysp_node **)&actions};
David Sedlák85d0eca2019-07-24 15:15:21 +02003440
3441 /* max subelems */
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003442 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák85d0eca2019-07-24 15:15:21 +02003443 data = ELEMENT_WRAPPER_START
3444 "<action name=\"act\">"
3445 "<description><text>desc</text></description>"
3446 "<grouping name=\"grouping\"/>"
3447 "<if-feature name=\"iff\"/>"
3448 "<input><uses name=\"uses-name\"/></input>"
Michal Vaskob83af8a2020-01-06 09:49:22 +01003449 "<output><must condition=\"cond\"/><leaf name=\"l\"><type name=\"type\"/></leaf></output>"
David Sedlák85d0eca2019-07-24 15:15:21 +02003450 "<reference><text>ref</text></reference>"
3451 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003452 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003453 EXT_SUBELEM
David Sedlák85d0eca2019-07-24 15:15:21 +02003454 "</action>"
3455 ELEMENT_WRAPPER_END;
Michal Vasko1bf09392020-03-27 12:38:10 +01003456 /* there must be parent for action */
Radek Krejcif482abc2020-08-27 15:29:05 +02003457 act_meta.parent = (void*)1;
Michal Vaskob36053d2020-03-26 15:49:30 +01003458 assert_int_equal(test_element_helper(st, data, &act_meta, NULL, NULL), LY_SUCCESS);
Michal Vasko1bf09392020-03-27 12:38:10 +01003459 act_meta.parent = NULL;
3460 assert_non_null(actions->parent);
David Sedlák85d0eca2019-07-24 15:15:21 +02003461 assert_int_equal(actions->nodetype, LYS_ACTION);
3462 assert_true(actions->flags & LYS_STATUS_DEPRC);
3463 assert_string_equal(actions->name, "act");
3464 assert_string_equal(actions->dsc, "desc");
3465 assert_string_equal(actions->ref, "ref");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003466 assert_string_equal(actions->iffeatures[0].str, "iff");
David Sedlák85d0eca2019-07-24 15:15:21 +02003467 assert_string_equal(actions->typedefs->name, "tpdf");
3468 assert_string_equal(actions->groupings->name, "grouping");
3469 assert_string_equal(actions->input.data->name, "uses-name");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003470 assert_string_equal(actions->output.musts->arg.str, "cond");
David Sedláke0ef1c62019-09-13 10:05:55 +02003471 assert_string_equal(actions->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003472 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3473 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák85d0eca2019-07-24 15:15:21 +02003474 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3475 actions = NULL;
3476
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003477 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlákeaa45792019-07-24 15:25:01 +02003478 data = ELEMENT_WRAPPER_START
3479 "<rpc name=\"act\">"
3480 "<description><text>desc</text></description>"
3481 "<grouping name=\"grouping\"/>"
3482 "<if-feature name=\"iff\"/>"
3483 "<input><uses name=\"uses-name\"/></input>"
Michal Vaskob83af8a2020-01-06 09:49:22 +01003484 "<output><must condition=\"cond\"/><leaf name=\"l\"><type name=\"type\"/></leaf></output>"
David Sedlákeaa45792019-07-24 15:25:01 +02003485 "<reference><text>ref</text></reference>"
3486 "<status value=\"deprecated\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003487 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>"
David Sedlákd1144562019-08-06 12:36:14 +02003488 EXT_SUBELEM
David Sedlákeaa45792019-07-24 15:25:01 +02003489 "</rpc>"
3490 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003491 assert_int_equal(test_element_helper(st, data, &act_meta, NULL, NULL), LY_SUCCESS);
David Sedlákeaa45792019-07-24 15:25:01 +02003492 assert_null(actions->parent);
Michal Vasko1bf09392020-03-27 12:38:10 +01003493 assert_int_equal(actions->nodetype, LYS_RPC);
David Sedlákeaa45792019-07-24 15:25:01 +02003494 assert_true(actions->flags & LYS_STATUS_DEPRC);
3495 assert_string_equal(actions->name, "act");
3496 assert_string_equal(actions->dsc, "desc");
3497 assert_string_equal(actions->ref, "ref");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003498 assert_string_equal(actions->iffeatures[0].str, "iff");
David Sedlákeaa45792019-07-24 15:25:01 +02003499 assert_string_equal(actions->typedefs->name, "tpdf");
3500 assert_string_equal(actions->groupings->name, "grouping");
3501 assert_string_equal(actions->input.data->name, "uses-name");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003502 assert_string_equal(actions->output.musts->arg.str, "cond");
David Sedláke0ef1c62019-09-13 10:05:55 +02003503 assert_string_equal(actions->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003504 assert_int_equal(actions->exts[0].insubstmt_index, 0);
3505 assert_int_equal(actions->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlákeaa45792019-07-24 15:25:01 +02003506 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3507 actions = NULL;
3508
David Sedlák85d0eca2019-07-24 15:15:21 +02003509 /* min subelems */
3510 data = ELEMENT_WRAPPER_START "<action name=\"act\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003511 assert_int_equal(test_element_helper(st, data, &act_meta, NULL, NULL), LY_SUCCESS);
David Sedlák85d0eca2019-07-24 15:15:21 +02003512 assert_string_equal(actions->name, "act");
3513 FREE_ARRAY(st->ctx, actions, lysp_action_free)
3514 actions = NULL;
3515
3516 st->finished_correctly = true;
3517}
3518
David Sedlák992fb7c2019-07-24 16:51:01 +02003519static void
3520test_augment_elem(void **state)
3521{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003522 struct test_parser_yin_state *st = *state;
David Sedlák992fb7c2019-07-24 16:51:01 +02003523 const char *data;
3524 struct lysp_augment *augments = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02003525 struct tree_node_meta aug_meta = {NULL, (struct lysp_node **)&augments};
David Sedlák992fb7c2019-07-24 16:51:01 +02003526
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003527 st->yin_ctx->parsed_mod->version = LYS_VERSION_1_1;
David Sedlák992fb7c2019-07-24 16:51:01 +02003528 data = ELEMENT_WRAPPER_START
3529 "<augment target-node=\"target\">"
3530 "<action name=\"action\"/>"
3531 "<anydata name=\"anyd\"/>"
3532 "<anyxml name=\"anyx\"/>"
3533 "<case name=\"case\"/>"
3534 "<choice name=\"choice\"/>"
3535 "<container name=\"subcont\"/>"
3536 "<description><text>desc</text></description>"
3537 "<if-feature name=\"iff\"/>"
David Sedlák8b754462019-07-25 16:22:13 +02003538 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>"
3539 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>"
David Sedlák992fb7c2019-07-24 16:51:01 +02003540 "<list name=\"list\"/>"
3541 "<notification name=\"notif\"/>"
3542 "<reference><text>ref</text></reference>"
3543 "<status value=\"current\"/>"
3544 "<uses name=\"uses\"/>"
3545 "<when condition=\"when-cond\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003546 EXT_SUBELEM
David Sedlák992fb7c2019-07-24 16:51:01 +02003547 "</augment>"
3548 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003549 assert_int_equal(test_element_helper(st, data, &aug_meta, NULL, NULL), LY_SUCCESS);
David Sedlák992fb7c2019-07-24 16:51:01 +02003550 assert_string_equal(augments->nodeid, "target");
3551 assert_null(augments->parent);
3552 assert_int_equal(augments->nodetype, LYS_AUGMENT);
3553 assert_true(augments->flags & LYS_STATUS_CURR);
3554 assert_string_equal(augments->dsc, "desc");
3555 assert_string_equal(augments->ref, "ref");
3556 assert_string_equal(augments->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003557 assert_string_equal(augments->iffeatures[0].str, "iff");
David Sedlák992fb7c2019-07-24 16:51:01 +02003558 assert_string_equal(augments->child->name, "anyd");
3559 assert_int_equal(augments->child->nodetype, LYS_ANYDATA);
3560 assert_string_equal(augments->child->next->name, "anyx");
3561 assert_int_equal(augments->child->next->nodetype, LYS_ANYXML);
3562 assert_string_equal(augments->child->next->next->name, "case");
3563 assert_int_equal(augments->child->next->next->nodetype, LYS_CASE);
3564 assert_string_equal(augments->child->next->next->next->name, "choice");
3565 assert_int_equal(augments->child->next->next->next->nodetype, LYS_CHOICE);
3566 assert_string_equal(augments->child->next->next->next->next->name, "subcont");
3567 assert_int_equal(augments->child->next->next->next->next->nodetype, LYS_CONTAINER);
3568 assert_string_equal(augments->child->next->next->next->next->next->name, "leaf");
3569 assert_int_equal(augments->child->next->next->next->next->next->nodetype, LYS_LEAF);
3570 assert_string_equal(augments->child->next->next->next->next->next->next->name, "llist");
3571 assert_int_equal(augments->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3572 assert_string_equal(augments->child->next->next->next->next->next->next->next->name, "list");
3573 assert_int_equal(augments->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
3574 assert_string_equal(augments->child->next->next->next->next->next->next->next->next->name, "uses");
3575 assert_int_equal(augments->child->next->next->next->next->next->next->next->next->nodetype, LYS_USES);
3576 assert_null(augments->child->next->next->next->next->next->next->next->next->next);
3577 assert_string_equal(augments->actions->name, "action");
3578 assert_string_equal(augments->notifs->name, "notif");
David Sedláke0ef1c62019-09-13 10:05:55 +02003579 assert_string_equal(augments->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003580 assert_int_equal(augments->exts[0].insubstmt_index, 0);
3581 assert_int_equal(augments->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák992fb7c2019-07-24 16:51:01 +02003582 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3583 augments = NULL;
3584
3585 data = ELEMENT_WRAPPER_START "<augment target-node=\"target\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003586 assert_int_equal(test_element_helper(st, data, &aug_meta, NULL, NULL), LY_SUCCESS);
David Sedlák992fb7c2019-07-24 16:51:01 +02003587 assert_string_equal(augments->nodeid, "target");
3588 FREE_ARRAY(st->ctx, augments, lysp_augment_free)
3589 augments = NULL;
3590
3591 st->finished_correctly = true;
3592}
3593
David Sedlák4ffcec82019-07-25 15:10:21 +02003594static void
3595test_deviate_elem(void **state)
3596{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003597 struct test_parser_yin_state *st = *state;
David Sedlák4ffcec82019-07-25 15:10:21 +02003598 const char *data;
3599 struct lysp_deviate *deviates = NULL;
3600 struct lysp_deviate_add *d_add;
3601 struct lysp_deviate_rpl *d_rpl;
3602 struct lysp_deviate_del *d_del;
3603
3604 /* all valid arguments with min subelems */
3605 data = ELEMENT_WRAPPER_START "<deviate value=\"not-supported\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003606 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003607 assert_int_equal(deviates->mod, LYS_DEV_NOT_SUPPORTED);
3608 lysp_deviate_free(st->ctx, deviates);
3609 free(deviates);
3610 deviates = NULL;
3611
3612 data = ELEMENT_WRAPPER_START "<deviate value=\"add\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003613 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003614 assert_int_equal(deviates->mod, LYS_DEV_ADD);
3615 lysp_deviate_free(st->ctx, deviates);
3616 free(deviates);
3617 deviates = NULL;
3618
3619 data = ELEMENT_WRAPPER_START "<deviate value=\"replace\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003620 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003621 assert_int_equal(deviates->mod, LYS_DEV_REPLACE);
3622 lysp_deviate_free(st->ctx, deviates);
3623 free(deviates);
3624 deviates = NULL;
3625
3626 data = ELEMENT_WRAPPER_START "<deviate value=\"delete\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003627 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003628 assert_int_equal(deviates->mod, LYS_DEV_DELETE);
3629 lysp_deviate_free(st->ctx, deviates);
3630 free(deviates);
3631 deviates = NULL;
3632
3633 /* max subelems and valid arguments */
3634 data = ELEMENT_WRAPPER_START
3635 "<deviate value=\"not-supported\">"
David Sedlákd1144562019-08-06 12:36:14 +02003636 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003637 "</deviate>"
3638 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);
David Sedláke0ef1c62019-09-13 10:05:55 +02003641 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003642 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3643 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003644 lysp_deviate_free(st->ctx, deviates);
3645 free(deviates);
3646 deviates = NULL;
3647
3648 data = ELEMENT_WRAPPER_START
3649 "<deviate value=\"add\">"
3650 "<units name=\"units\"/>"
3651 "<must condition=\"cond\"/>"
3652 "<unique tag=\"utag\"/>"
3653 "<default value=\"def\"/>"
3654 "<config value=\"true\"/>"
3655 "<mandatory value=\"true\"/>"
3656 "<min-elements value=\"5\"/>"
3657 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003658 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003659 "</deviate>"
3660 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003661 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003662 d_add = (struct lysp_deviate_add *)deviates;
3663 assert_int_equal(d_add->mod, LYS_DEV_ADD);
3664 assert_null(d_add->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003665 assert_string_equal(d_add->units, "units");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003666 assert_string_equal(d_add->musts->arg.str, "cond");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003667 assert_string_equal(d_add->uniques[0].str, "utag");
3668 assert_string_equal(d_add->dflts[0].str, "def");
David Sedlák4ffcec82019-07-25 15:10:21 +02003669 assert_true(d_add->flags & LYS_MAND_TRUE && d_add->flags & LYS_CONFIG_W);
3670 assert_int_equal(d_add->min, 5);
3671 assert_int_equal(d_add->max, 15);
David Sedláke0ef1c62019-09-13 10:05:55 +02003672 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003673 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3674 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003675 lysp_deviate_free(st->ctx, deviates);
3676 free(deviates);
3677 deviates = NULL;
3678
3679 data = ELEMENT_WRAPPER_START
3680 "<deviate value=\"replace\">"
3681 "<type name=\"newtype\"/>"
3682 "<units name=\"uni\"/>"
3683 "<default value=\"def\"/>"
3684 "<config value=\"true\"/>"
3685 "<mandatory value=\"true\"/>"
3686 "<min-elements value=\"5\"/>"
3687 "<max-elements value=\"15\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003688 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003689 "</deviate>"
3690 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003691 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003692 d_rpl = (struct lysp_deviate_rpl *)deviates;
3693 assert_int_equal(d_rpl->mod, LYS_DEV_REPLACE);
3694 assert_null(d_rpl->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003695 assert_string_equal(d_rpl->type->name, "newtype");
3696 assert_string_equal(d_rpl->units, "uni");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003697 assert_string_equal(d_rpl->dflt.str, "def");
David Sedlák4ffcec82019-07-25 15:10:21 +02003698 assert_true(d_rpl->flags & LYS_MAND_TRUE && d_rpl->flags & LYS_CONFIG_W);
3699 assert_int_equal(d_rpl->min, 5);
3700 assert_int_equal(d_rpl->max, 15);
David Sedláke0ef1c62019-09-13 10:05:55 +02003701 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003702 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3703 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003704 lysp_deviate_free(st->ctx, deviates);
3705 free(deviates);
3706 deviates = NULL;
3707
3708 data = ELEMENT_WRAPPER_START
3709 "<deviate value=\"delete\">"
3710 "<units name=\"u\"/>"
3711 "<must condition=\"c\"/>"
3712 "<unique tag=\"tag\"/>"
3713 "<default value=\"default\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003714 EXT_SUBELEM
David Sedlák4ffcec82019-07-25 15:10:21 +02003715 "</deviate>"
3716 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003717 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_SUCCESS);
David Sedlák4ffcec82019-07-25 15:10:21 +02003718 d_del = (struct lysp_deviate_del *)deviates;
3719 assert_int_equal(d_del->mod, LYS_DEV_DELETE);
3720 assert_null(d_del->next);
David Sedlák4ffcec82019-07-25 15:10:21 +02003721 assert_string_equal(d_del->units, "u");
Michal Vasko7f45cf22020-10-01 12:49:44 +02003722 assert_string_equal(d_del->musts->arg.str, "c");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003723 assert_string_equal(d_del->uniques[0].str, "tag");
3724 assert_string_equal(d_del->dflts[0].str, "default");
David Sedláke0ef1c62019-09-13 10:05:55 +02003725 assert_string_equal(deviates->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003726 assert_int_equal(deviates->exts[0].insubstmt_index, 0);
3727 assert_int_equal(deviates->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4ffcec82019-07-25 15:10:21 +02003728 lysp_deviate_free(st->ctx, deviates);
3729 free(deviates);
3730 deviates = NULL;
3731
3732 /* invalid arguments */
3733 data = ELEMENT_WRAPPER_START "<deviate value=\"\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003734 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003735 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 +02003736 deviates = NULL;
3737
3738 data = ELEMENT_WRAPPER_START "<deviate value=\"invalid\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003739 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003740 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 +02003741 deviates = NULL;
3742
3743 data = ELEMENT_WRAPPER_START "<deviate value=\"ad\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003744 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003745 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 +02003746 deviates = NULL;
3747
3748 data = ELEMENT_WRAPPER_START "<deviate value=\"adds\" />" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003749 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák26ea1432019-08-14 13:42:23 +02003750 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 +02003751 deviates = NULL;
3752
3753 data = ELEMENT_WRAPPER_START
3754 "<deviate value=\"not-supported\">"
3755 "<must condition=\"c\"/>"
3756 "</deviate>"
3757 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003758 assert_int_equal(test_element_helper(st, data, &deviates, NULL, NULL), LY_EVALID);
David Sedlák4ffcec82019-07-25 15:10:21 +02003759 logbuf_assert("Deviate of this type doesn't allow \"must\" as it's sub-element. Line number 1.");
3760
3761 st->finished_correctly = true;
3762}
3763
David Sedlák8b754462019-07-25 16:22:13 +02003764static void
3765test_deviation_elem(void **state)
3766{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003767 struct test_parser_yin_state *st = *state;
David Sedlák8b754462019-07-25 16:22:13 +02003768 const char *data;
3769 struct lysp_deviation *deviations = NULL;
3770
3771 /* min subelems */
3772 data = ELEMENT_WRAPPER_START
3773 "<deviation target-node=\"target\">"
3774 "<deviate value=\"not-supported\"/>"
3775 "</deviation>"
3776 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003777 assert_int_equal(test_element_helper(st, data, &deviations, NULL, NULL), LY_SUCCESS);
David Sedlák8b754462019-07-25 16:22:13 +02003778 assert_string_equal(deviations->nodeid, "target");
3779 assert_int_equal(deviations->deviates->mod, LYS_DEV_NOT_SUPPORTED);
3780 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3781 deviations = NULL;
3782
3783 /* max subelems */
3784 data = ELEMENT_WRAPPER_START
3785 "<deviation target-node=\"target\">"
3786 "<reference><text>ref</text></reference>"
3787 "<description><text>desc</text></description>"
3788 "<deviate value=\"add\"/>"
David Sedlákd1144562019-08-06 12:36:14 +02003789 EXT_SUBELEM
David Sedlák8b754462019-07-25 16:22:13 +02003790 "</deviation>"
3791 ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003792 assert_int_equal(test_element_helper(st, data, &deviations, NULL, NULL), LY_SUCCESS);
David Sedlák8b754462019-07-25 16:22:13 +02003793 assert_string_equal(deviations->nodeid, "target");
3794 assert_int_equal(deviations->deviates->mod, LYS_DEV_ADD);
3795 assert_string_equal(deviations->ref, "ref");
3796 assert_string_equal(deviations->dsc, "desc");
David Sedláke0ef1c62019-09-13 10:05:55 +02003797 assert_string_equal(deviations->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003798 assert_int_equal(deviations->exts[0].insubstmt_index, 0);
3799 assert_int_equal(deviations->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák8b754462019-07-25 16:22:13 +02003800 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3801 deviations = NULL;
3802
3803 /* invalid */
3804 data = ELEMENT_WRAPPER_START "<deviation target-node=\"target\"/>" ELEMENT_WRAPPER_END;
Michal Vaskob36053d2020-03-26 15:49:30 +01003805 assert_int_equal(test_element_helper(st, data, &deviations, NULL, NULL), LY_EVALID);
David Sedlák8b754462019-07-25 16:22:13 +02003806 FREE_ARRAY(st->ctx, deviations, lysp_deviation_free);
3807 deviations = NULL;
David Sedlák1538a842019-08-08 15:38:51 +02003808 logbuf_assert("Missing mandatory sub-element \"deviate\" of \"deviation\" element. Line number 1.");
3809 /* TODO */
David Sedlák8b754462019-07-25 16:22:13 +02003810 st->finished_correctly = true;
3811}
3812
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003813static struct lysp_module *
3814mod_renew(struct lys_yin_parser_ctx *ctx)
3815{
3816 struct ly_ctx *ly_ctx = ctx->parsed_mod->mod->ctx;
3817
3818 lys_module_free(ctx->parsed_mod->mod, NULL);
3819 ctx->parsed_mod = calloc(1, sizeof *ctx->parsed_mod);
3820 ctx->parsed_mod->mod = calloc(1, sizeof *ctx->parsed_mod->mod);
3821 ctx->parsed_mod->mod->parsed = ctx->parsed_mod;
3822 ctx->parsed_mod->mod->ctx = ly_ctx;
3823
3824 return ctx->parsed_mod;
3825}
3826
David Sedlák4f03b932019-07-26 13:01:47 +02003827static void
3828test_module_elem(void **state)
3829{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003830 struct test_parser_yin_state *st = *state;
Michal Vaskob36053d2020-03-26 15:49:30 +01003831 const char *data;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003832 struct lysp_module *lysp_mod = mod_renew(st->yin_ctx);
David Sedlák4f03b932019-07-26 13:01:47 +02003833
3834 /* max subelems */
David Sedlák4f03b932019-07-26 13:01:47 +02003835 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3836 "<yang-version value=\"1.1\"/>\n"
3837 "<namespace uri=\"ns\"/>\n"
3838 "<prefix value=\"pref\"/>\n"
3839 "<include module=\"b-mod\"/>\n"
3840 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3841 "<organization><text>org</text></organization>\n"
3842 "<contact><text>contact</text></contact>\n"
3843 "<description><text>desc</text></description>"
3844 "<reference><text>ref</text></reference>\n"
3845 "<revision date=\"2019-02-02\"/>\n"
3846 "<anydata name=\"anyd\"/>\n"
3847 "<anyxml name=\"anyx\"/>\n"
3848 "<choice name=\"choice\"/>\n"
3849 "<container name=\"cont\"/>\n"
3850 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3851 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3852 "<list name=\"sub-list\"/>\n"
3853 "<uses name=\"uses-name\"/>\n"
3854 "<augment target-node=\"target\"/>\n"
3855 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
3856 "<extension name=\"ext\"/>\n"
3857 "<feature name=\"feature\"/>\n"
3858 "<grouping name=\"grp\"/>\n"
3859 "<identity name=\"ident-name\"/>\n"
3860 "<notification name=\"notf\"/>\n"
3861 "<rpc name=\"rpc-name\"/>\n"
3862 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02003863 EXT_SUBELEM"\n"
David Sedlák4f03b932019-07-26 13:01:47 +02003864 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02003865 assert_int_equal(ly_in_new_memory(data, &st->in), LY_SUCCESS);
3866 assert_int_equal(lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +01003867
3868 assert_int_equal(yin_parse_mod(st->yin_ctx, lysp_mod), LY_SUCCESS);
David Sedlák4f03b932019-07-26 13:01:47 +02003869 assert_string_equal(lysp_mod->mod->name, "mod");
3870 assert_string_equal(lysp_mod->revs, "2019-02-02");
3871 assert_string_equal(lysp_mod->mod->ns, "ns");
3872 assert_string_equal(lysp_mod->mod->prefix, "pref");
3873 assert_null(lysp_mod->mod->filepath);
3874 assert_string_equal(lysp_mod->mod->org, "org");
3875 assert_string_equal(lysp_mod->mod->contact, "contact");
3876 assert_string_equal(lysp_mod->mod->dsc, "desc");
3877 assert_string_equal(lysp_mod->mod->ref, "ref");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003878 assert_int_equal(lysp_mod->version, LYS_VERSION_1_1);
David Sedlák4f03b932019-07-26 13:01:47 +02003879 assert_string_equal(lysp_mod->imports->name, "a-mod");
3880 assert_string_equal(lysp_mod->includes->name, "b-mod");
3881 assert_string_equal(lysp_mod->extensions->name, "ext");
3882 assert_string_equal(lysp_mod->features->name, "feature");
3883 assert_string_equal(lysp_mod->identities->name, "ident-name");
3884 assert_string_equal(lysp_mod->typedefs->name, "tpdf");
3885 assert_string_equal(lysp_mod->groupings->name, "grp");
3886 assert_string_equal(lysp_mod->data->name, "anyd");
3887 assert_int_equal(lysp_mod->data->nodetype, LYS_ANYDATA);
3888 assert_string_equal(lysp_mod->data->next->name, "anyx");
3889 assert_int_equal(lysp_mod->data->next->nodetype, LYS_ANYXML);
3890 assert_string_equal(lysp_mod->data->next->next->name, "choice");
3891 assert_int_equal(lysp_mod->data->next->next->nodetype, LYS_CHOICE);
3892 assert_string_equal(lysp_mod->data->next->next->next->name, "cont");
3893 assert_int_equal(lysp_mod->data->next->next->next->nodetype, LYS_CONTAINER);
3894 assert_string_equal(lysp_mod->data->next->next->next->next->name, "leaf");
3895 assert_int_equal(lysp_mod->data->next->next->next->next->nodetype, LYS_LEAF);
3896 assert_string_equal(lysp_mod->data->next->next->next->next->next->name, "llist");
3897 assert_int_equal(lysp_mod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3898 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->name, "sub-list");
3899 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
3900 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->next->name, "uses-name");
3901 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3902 assert_null(lysp_mod->data->next->next->next->next->next->next->next->next);
3903 assert_string_equal(lysp_mod->augments->nodeid, "target");
3904 assert_string_equal(lysp_mod->rpcs->name, "rpc-name");
3905 assert_string_equal(lysp_mod->notifs->name, "notf");
3906 assert_string_equal(lysp_mod->deviations->nodeid, "target");
David Sedláke0ef1c62019-09-13 10:05:55 +02003907 assert_string_equal(lysp_mod->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02003908 assert_int_equal(lysp_mod->exts[0].insubstmt_index, 0);
3909 assert_int_equal(lysp_mod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák4f03b932019-07-26 13:01:47 +02003910
3911 /* min subelems */
Michal Vasko63f3d842020-07-08 10:10:14 +02003912 ly_in_free(st->in, 0);
Michal Vaskob36053d2020-03-26 15:49:30 +01003913 lyxml_ctx_free(st->yin_ctx->xmlctx);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003914 lysp_mod = mod_renew(st->yin_ctx);
David Sedlák4f03b932019-07-26 13:01:47 +02003915 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3916 "<namespace uri=\"ns\"/>"
3917 "<prefix value=\"pref\"/>"
3918 "<yang-version value=\"1.1\"/>"
3919 "</module>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003920 assert_int_equal(ly_in_new_memory(data, &st->in), LY_SUCCESS);
3921 assert_int_equal(lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +01003922 assert_int_equal(yin_parse_mod(st->yin_ctx, lysp_mod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003923 assert_string_equal(lysp_mod->mod->name, "mod");
David Sedlák298ff6d2019-07-26 14:29:03 +02003924
David Sedláke6cd89e2019-08-07 12:46:02 +02003925 /* incorrect subelem order */
Michal Vasko63f3d842020-07-08 10:10:14 +02003926 ly_in_free(st->in, 0);
Michal Vaskob36053d2020-03-26 15:49:30 +01003927 lyxml_ctx_free(st->yin_ctx->xmlctx);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003928 lysp_mod = mod_renew(st->yin_ctx);
David Sedláke6cd89e2019-08-07 12:46:02 +02003929 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">"
3930 "<feature name=\"feature\"/>\n"
3931 "<namespace uri=\"ns\"/>"
3932 "<prefix value=\"pref\"/>"
3933 "<yang-version value=\"1.1\"/>"
3934 "</module>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003935 assert_int_equal(ly_in_new_memory(data, &st->in), LY_SUCCESS);
3936 assert_int_equal(lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +01003937 assert_int_equal(yin_parse_mod(st->yin_ctx, lysp_mod), LY_EVALID);
3938 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 +02003939
David Sedlák298ff6d2019-07-26 14:29:03 +02003940 st->finished_correctly = true;
3941}
3942
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003943static struct lysp_submodule *
3944submod_renew(struct lys_yin_parser_ctx *ctx, const char *belongs_to)
3945{
3946 struct ly_ctx *ly_ctx = ctx->parsed_mod->mod->ctx;
3947
3948 lys_module_free(ctx->parsed_mod->mod, NULL);
3949 ctx->parsed_mod = calloc(1, sizeof(struct lysp_submodule));
3950 ctx->parsed_mod->mod = calloc(1, sizeof *ctx->parsed_mod->mod);
3951 lydict_insert(ly_ctx, belongs_to, 0, &ctx->parsed_mod->mod->name);
3952 ctx->parsed_mod->mod->parsed = ctx->parsed_mod;
3953 ctx->parsed_mod->mod->ctx = ly_ctx;
3954
3955 return (struct lysp_submodule *)ctx->parsed_mod;
3956}
3957
David Sedlák298ff6d2019-07-26 14:29:03 +02003958static void
3959test_submodule_elem(void **state)
3960{
Radek Krejci3a4889a2020-05-19 17:01:58 +02003961 struct test_parser_yin_state *st = *state;
Michal Vaskob36053d2020-03-26 15:49:30 +01003962 const char *data;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003963 struct lysp_submodule *lysp_submod = submod_renew(st->yin_ctx, "module-name");
David Sedlák298ff6d2019-07-26 14:29:03 +02003964
3965 /* max subelements */
David Sedlák298ff6d2019-07-26 14:29:03 +02003966 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3967 "<yang-version value=\"1.1\"/>\n"
Michal Vaskoc3781c32020-10-06 14:04:08 +02003968 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>"
David Sedlák298ff6d2019-07-26 14:29:03 +02003969 "<include module=\"b-mod\"/>\n"
3970 "<import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3971 "<organization><text>org</text></organization>\n"
3972 "<contact><text>contact</text></contact>\n"
3973 "<description><text>desc</text></description>"
3974 "<reference><text>ref</text></reference>\n"
3975 "<revision date=\"2019-02-02\"/>\n"
3976 "<anydata name=\"anyd\"/>\n"
3977 "<anyxml name=\"anyx\"/>\n"
3978 "<choice name=\"choice\"/>\n"
3979 "<container name=\"cont\"/>\n"
3980 "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3981 "<leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3982 "<list name=\"sub-list\"/>\n"
3983 "<uses name=\"uses-name\"/>\n"
3984 "<augment target-node=\"target\"/>\n"
3985 "<deviation target-node=\"target\">""<deviate value=\"not-supported\"/>""</deviation>\n"
3986 "<extension name=\"ext\"/>\n"
3987 "<feature name=\"feature\"/>\n"
3988 "<grouping name=\"grp\"/>\n"
3989 "<identity name=\"ident-name\"/>\n"
3990 "<notification name=\"notf\"/>\n"
3991 "<rpc name=\"rpc-name\"/>\n"
3992 "<typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
David Sedlákd1144562019-08-06 12:36:14 +02003993 EXT_SUBELEM"\n"
David Sedlák298ff6d2019-07-26 14:29:03 +02003994 "</submodule>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02003995 assert_int_equal(ly_in_new_memory(data, &st->in), LY_SUCCESS);
3996 assert_int_equal(lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003997
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003998 assert_int_equal(yin_parse_submod(st->yin_ctx, lysp_submod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003999 assert_string_equal(lysp_submod->name, "mod");
4000 assert_string_equal(lysp_submod->revs, "2019-02-02");
David Sedlák298ff6d2019-07-26 14:29:03 +02004001 assert_string_equal(lysp_submod->prefix, "pref");
4002 assert_null(lysp_submod->filepath);
4003 assert_string_equal(lysp_submod->org, "org");
4004 assert_string_equal(lysp_submod->contact, "contact");
4005 assert_string_equal(lysp_submod->dsc, "desc");
4006 assert_string_equal(lysp_submod->ref, "ref");
4007 assert_int_equal(lysp_submod->version, LYS_VERSION_1_1);
4008 assert_string_equal(lysp_submod->imports->name, "a-mod");
4009 assert_string_equal(lysp_submod->includes->name, "b-mod");
4010 assert_string_equal(lysp_submod->extensions->name, "ext");
4011 assert_string_equal(lysp_submod->features->name, "feature");
4012 assert_string_equal(lysp_submod->identities->name, "ident-name");
4013 assert_string_equal(lysp_submod->typedefs->name, "tpdf");
4014 assert_string_equal(lysp_submod->groupings->name, "grp");
4015 assert_string_equal(lysp_submod->data->name, "anyd");
4016 assert_int_equal(lysp_submod->data->nodetype, LYS_ANYDATA);
4017 assert_string_equal(lysp_submod->data->next->name, "anyx");
4018 assert_int_equal(lysp_submod->data->next->nodetype, LYS_ANYXML);
4019 assert_string_equal(lysp_submod->data->next->next->name, "choice");
4020 assert_int_equal(lysp_submod->data->next->next->nodetype, LYS_CHOICE);
4021 assert_string_equal(lysp_submod->data->next->next->next->name, "cont");
4022 assert_int_equal(lysp_submod->data->next->next->next->nodetype, LYS_CONTAINER);
4023 assert_string_equal(lysp_submod->data->next->next->next->next->name, "leaf");
4024 assert_int_equal(lysp_submod->data->next->next->next->next->nodetype, LYS_LEAF);
4025 assert_string_equal(lysp_submod->data->next->next->next->next->next->name, "llist");
4026 assert_int_equal(lysp_submod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
4027 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->name, "sub-list");
4028 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
4029 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->next->name, "uses-name");
4030 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
4031 assert_null(lysp_submod->data->next->next->next->next->next->next->next->next);
4032 assert_string_equal(lysp_submod->augments->nodeid, "target");
4033 assert_string_equal(lysp_submod->rpcs->name, "rpc-name");
4034 assert_string_equal(lysp_submod->notifs->name, "notf");
4035 assert_string_equal(lysp_submod->deviations->nodeid, "target");
David Sedláke0ef1c62019-09-13 10:05:55 +02004036 assert_string_equal(lysp_submod->exts[0].name, "urn:example:extensions:c-define");
David Sedlákd1144562019-08-06 12:36:14 +02004037 assert_int_equal(lysp_submod->exts[0].insubstmt_index, 0);
4038 assert_int_equal(lysp_submod->exts[0].insubstmt, LYEXT_SUBSTMT_SELF);
David Sedlák298ff6d2019-07-26 14:29:03 +02004039
David Sedlák298ff6d2019-07-26 14:29:03 +02004040 /* min subelemnts */
Michal Vasko63f3d842020-07-08 10:10:14 +02004041 ly_in_free(st->in, 0);
Michal Vaskob36053d2020-03-26 15:49:30 +01004042 lyxml_ctx_free(st->yin_ctx->xmlctx);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004043 lysp_submod = submod_renew(st->yin_ctx, "module-name");
David Sedlák298ff6d2019-07-26 14:29:03 +02004044 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
Radek Krejci96e48da2020-09-04 13:18:06 +02004045 "<yang-version value=\"1\"/>"
Michal Vaskoc3781c32020-10-06 14:04:08 +02004046 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>"
David Sedlák298ff6d2019-07-26 14:29:03 +02004047 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004048 assert_int_equal(ly_in_new_memory(data, &st->in), LY_SUCCESS);
4049 assert_int_equal(lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +01004050 assert_int_equal(yin_parse_submod(st->yin_ctx, lysp_submod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02004051 assert_string_equal(lysp_submod->prefix, "pref");
David Sedlák298ff6d2019-07-26 14:29:03 +02004052 assert_int_equal(lysp_submod->version, LYS_VERSION_1_0);
David Sedlák298ff6d2019-07-26 14:29:03 +02004053
David Sedláke6cd89e2019-08-07 12:46:02 +02004054 /* incorrect subelem order */
Michal Vasko63f3d842020-07-08 10:10:14 +02004055 ly_in_free(st->in, 0);
Michal Vaskob36053d2020-03-26 15:49:30 +01004056 lyxml_ctx_free(st->yin_ctx->xmlctx);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004057 lysp_submod = submod_renew(st->yin_ctx, "module-name");
David Sedláke6cd89e2019-08-07 12:46:02 +02004058 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">"
Radek Krejci96e48da2020-09-04 13:18:06 +02004059 "<yang-version value=\"1\"/>"
David Sedláke6cd89e2019-08-07 12:46:02 +02004060 "<reference><text>ref</text></reference>\n"
Michal Vaskoc3781c32020-10-06 14:04:08 +02004061 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>"
David Sedláke6cd89e2019-08-07 12:46:02 +02004062 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004063 assert_int_equal(ly_in_new_memory(data, &st->in), LY_SUCCESS);
4064 assert_int_equal(lyxml_ctx_new(st->ctx, st->in, &st->yin_ctx->xmlctx), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +01004065 assert_int_equal(yin_parse_submod(st->yin_ctx, lysp_submod), LY_EVALID);
4066 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 +02004067
David Sedlák298ff6d2019-07-26 14:29:03 +02004068 st->finished_correctly = true;
David Sedlák4f03b932019-07-26 13:01:47 +02004069}
4070
David Sedlák8985a142019-07-31 16:43:06 +02004071static void
4072test_yin_parse_module(void **state)
4073{
Radek Krejci3a4889a2020-05-19 17:01:58 +02004074 struct test_parser_yin_state *st = *state;
David Sedlák8985a142019-07-31 16:43:06 +02004075 const char *data;
4076 struct lys_module *mod;
Michal Vaskob36053d2020-03-26 15:49:30 +01004077 struct lys_yin_parser_ctx *yin_ctx = NULL;
Michal Vasko63f3d842020-07-08 10:10:14 +02004078 struct ly_in *in = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02004079
4080 mod = calloc(1, sizeof *mod);
4081 mod->ctx = st->ctx;
David Sedlákd2844882019-09-13 16:01:22 +02004082 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"
4083 "<yang-version value=\"1.1\"/>\n"
4084 "<namespace uri=\"urn:tests:extensions:metadata:a\"/>\n"
4085 "<prefix value=\"a\"/>\n"
4086 "<import module=\"ietf-yang-metadata\">\n"
4087 "<prefix value=\"md\"/>\n"
4088 "</import>\n"
4089 "<feature name=\"f\"/>\n"
4090 "<md:annotation name=\"x\">\n"
4091 "<description>\n"
4092 "<text>test</text>\n"
4093 "</description>\n"
4094 "<reference>\n"
4095 "<text>test</text>\n"
4096 "</reference>\n"
4097 "<if-feature name=\"f\"/>\n"
4098 "<status value=\"current\"/>\n"
4099 "<type name=\"uint8\"/>\n"
4100 "<units name=\"meters\"/>\n"
4101 "</md:annotation>\n"
4102 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02004103 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
4104 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_SUCCESS);
David Sedlákd2844882019-09-13 16:01:22 +02004105 assert_null(mod->parsed->exts->child->next->child);
4106 assert_string_equal(mod->parsed->exts->child->next->arg, "test");
4107 lys_module_free(mod, NULL);
4108 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004109 ly_in_free(in, 0);
David Sedlákd2844882019-09-13 16:01:22 +02004110 mod = NULL;
4111 yin_ctx = NULL;
4112
4113 mod = calloc(1, sizeof *mod);
4114 mod->ctx = st->ctx;
David Sedlák8985a142019-07-31 16:43:06 +02004115 data = "<module name=\"example-foo\""
4116 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4117 "xmlns:foo=\"urn:example:foo\""
4118 "xmlns:myext=\"urn:example:extensions\">\n"
4119
Radek Krejci96e48da2020-09-04 13:18:06 +02004120 "<yang-version value=\"1\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02004121
4122 "<namespace uri=\"urn:example:foo\"/>\n"
4123 "<prefix value=\"foo\"/>\n"
4124
4125 "<import module=\"example-extensions\">\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004126 "<prefix value=\"myext\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02004127 "</import>\n"
4128
4129 "<list name=\"interface\">\n"
4130 "<key value=\"name\"/>\n"
4131 "<leaf name=\"name\">\n"
4132 "<type name=\"string\"/>\n"
4133 "</leaf>\n"
4134 "<leaf name=\"mtu\">\n"
4135 "<type name=\"uint32\"/>\n"
4136 "<description>\n"
4137 "<text>The MTU of the interface.</text>\n"
4138 "</description>\n"
4139 "<myext:c-define name=\"MY_MTU\"/>\n"
4140 "</leaf>\n"
4141 "</list>\n"
4142 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02004143 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
4144 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_SUCCESS);
David Sedlák8985a142019-07-31 16:43:06 +02004145 lys_module_free(mod, NULL);
4146 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004147 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02004148 mod = NULL;
4149 yin_ctx = NULL;
4150
4151 mod = calloc(1, sizeof *mod);
4152 mod->ctx = st->ctx;
David Sedlák6d781b62019-08-02 15:22:52 +02004153 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
Radek Krejci96e48da2020-09-04 13:18:06 +02004154 "<yang-version value=\"1\"/>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004155 "<namespace uri=\"urn:example:foo\"/>\n"
4156 "<prefix value=\"foo\"/>\n"
4157 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02004158 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
4159 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_SUCCESS);
David Sedlák6d781b62019-08-02 15:22:52 +02004160 lys_module_free(mod, NULL);
4161 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004162 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02004163 mod = NULL;
4164 yin_ctx = NULL;
4165
4166
4167 mod = calloc(1, sizeof *mod);
4168 mod->ctx = st->ctx;
David Sedlák8985a142019-07-31 16:43:06 +02004169 data = "<submodule name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
4170 "</submodule>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02004171 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
4172 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_EINVAL);
David Sedlák8985a142019-07-31 16:43:06 +02004173 logbuf_assert("Input data contains submodule which cannot be parsed directly without its main module.");
4174 lys_module_free(mod, NULL);
4175 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004176 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02004177
David Sedlák6d781b62019-08-02 15:22:52 +02004178 mod = calloc(1, sizeof *mod);
4179 mod->ctx = st->ctx;
4180 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
Radek Krejci96e48da2020-09-04 13:18:06 +02004181 "<yang-version value=\"1\"/>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004182 "<namespace uri=\"urn:example:foo\"/>\n"
4183 "<prefix value=\"foo\"/>\n"
4184 "</module>"
4185 "<module>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004186 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
4187 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_EVALID);
David Sedlák6d781b62019-08-02 15:22:52 +02004188 logbuf_assert("Trailing garbage \"<module>\" after module, expected end-of-input. Line number 5.");
4189 lys_module_free(mod, NULL);
4190 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004191 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02004192 mod = NULL;
4193 yin_ctx = NULL;
4194
David Sedlák8985a142019-07-31 16:43:06 +02004195 st->finished_correctly = true;
4196}
4197
4198static void
4199test_yin_parse_submodule(void **state)
4200{
Radek Krejci3a4889a2020-05-19 17:01:58 +02004201 struct test_parser_yin_state *st = *state;
David Sedlák8985a142019-07-31 16:43:06 +02004202 const char *data;
Michal Vaskob36053d2020-03-26 15:49:30 +01004203 struct lys_yin_parser_ctx *yin_ctx = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02004204 struct lysp_submodule *submod = NULL;
Michal Vasko63f3d842020-07-08 10:10:14 +02004205 struct ly_in *in;
David Sedlák8985a142019-07-31 16:43:06 +02004206
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004207 lydict_insert(st->ctx, "a", 0, &st->yin_ctx->parsed_mod->mod->name);
Michal Vaskoc3781c32020-10-06 14:04:08 +02004208
David Sedlák8985a142019-07-31 16:43:06 +02004209 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4210 "<submodule name=\"asub\""
4211 "xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
4212 "xmlns:a=\"urn:a\">"
Radek Krejci96e48da2020-09-04 13:18:06 +02004213 "<yang-version value=\"1\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02004214 "<belongs-to module=\"a\">"
4215 "<prefix value=\"a_pref\"/>"
4216 "</belongs-to>"
4217 "<include module=\"atop\"/>"
4218 "<feature name=\"fox\"/>"
4219 "<notification name=\"bar-notif\">"
4220 "<if-feature name=\"bar\"/>"
4221 "</notification>"
4222 "<notification name=\"fox-notif\">"
4223 "<if-feature name=\"fox\"/>"
4224 "</notification>"
4225 "<augment target-node=\"/a_pref:top\">"
4226 "<if-feature name=\"bar\"/>"
4227 "<container name=\"bar-sub\"/>"
4228 "</augment>"
4229 "<augment target-node=\"/top\">"
4230 "<container name=\"bar-sub2\"/>"
4231 "</augment>"
4232 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004233 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004234 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, (struct lys_parser_ctx *)st->yin_ctx, in, &submod), LY_SUCCESS);
4235 lysp_module_free((struct lysp_module *)submod);
David Sedlák8985a142019-07-31 16:43:06 +02004236 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004237 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02004238 yin_ctx = NULL;
4239 submod = NULL;
4240
4241 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
David Sedlák6d781b62019-08-02 15:22:52 +02004242 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
Radek Krejci96e48da2020-09-04 13:18:06 +02004243 "<yang-version value=\"1\"/>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004244 "<belongs-to module=\"a\">"
4245 "<prefix value=\"a_pref\"/>"
4246 "</belongs-to>"
4247 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004248 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004249 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, (struct lys_parser_ctx *)st->yin_ctx, in, &submod), LY_SUCCESS);
4250 lysp_module_free((struct lysp_module *)submod);
David Sedlák6d781b62019-08-02 15:22:52 +02004251 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004252 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02004253 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>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004259 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004260 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, (struct lys_parser_ctx *)st->yin_ctx, in, &submod), LY_EINVAL);
David Sedlák8985a142019-07-31 16:43:06 +02004261 logbuf_assert("Input data contains module in situation when a submodule is expected.");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004262 lysp_module_free((struct lysp_module *)submod);
David Sedlák8985a142019-07-31 16:43:06 +02004263 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004264 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02004265 yin_ctx = NULL;
4266 submod = NULL;
4267
David Sedlák6d781b62019-08-02 15:22:52 +02004268 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
4269 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
Radek Krejci96e48da2020-09-04 13:18:06 +02004270 "<yang-version value=\"1\"/>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004271 "<belongs-to module=\"a\">"
4272 "<prefix value=\"a_pref\"/>"
4273 "</belongs-to>"
4274 "</submodule>"
4275 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
Radek Krejci96e48da2020-09-04 13:18:06 +02004276 "<yang-version value=\"1\"/>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02004277 "<belongs-to module=\"a\">"
4278 "<prefix value=\"a_pref\"/>"
4279 "</belongs-to>"
4280 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02004281 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004282 assert_int_equal(yin_parse_submodule(&yin_ctx, st->ctx, (struct lys_parser_ctx *)st->yin_ctx, in, &submod), LY_EVALID);
David Sedlák6d781b62019-08-02 15:22:52 +02004283 logbuf_assert("Trailing garbage \"<submodule name...\" after submodule, expected end-of-input. Line number 2.");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004284 lysp_module_free((struct lysp_module *)submod);
David Sedlák6d781b62019-08-02 15:22:52 +02004285 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02004286 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02004287 yin_ctx = NULL;
4288 submod = NULL;
4289
David Sedlák8985a142019-07-31 16:43:06 +02004290 st->finished_correctly = true;
4291}
4292
David Sedlák3b4db242018-10-19 16:11:01 +02004293int
4294main(void)
4295{
4296
4297 const struct CMUnitTest tests[] = {
David Sedlák8f7a1172019-06-20 14:42:18 +02004298 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02004299 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
4300 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák071f7662019-09-12 02:02:51 +02004301 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02004302 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02004303
David Sedlák8e7bda82019-07-16 17:57:50 +02004304 cmocka_unit_test(test_yin_match_argument_name),
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004305 cmocka_unit_test_setup_teardown(test_enum_elem, setup_element_test, teardown_f),
4306 cmocka_unit_test_setup_teardown(test_bit_elem, setup_element_test, teardown_f),
4307 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_f),
4308 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_f),
4309 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_f),
4310 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_f),
4311 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_f),
4312 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_f),
4313 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_f),
4314 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_f),
4315 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_f),
4316 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_f),
4317 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_f),
4318 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_f),
4319 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_f),
4320 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_f),
4321 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_f),
4322 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_f),
4323 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_f),
4324 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_f),
4325 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_f),
4326 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_f),
4327 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_f),
4328 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_f),
4329 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_f),
4330 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_f),
4331 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_f),
4332 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_f),
4333 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_f),
4334 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_f),
4335 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_f),
4336 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_f),
4337 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_f),
4338 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_f),
4339 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_f),
4340 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_f),
4341 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_f),
4342 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_f),
4343 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_f),
4344 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_f),
4345 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_f),
4346 cmocka_unit_test_setup_teardown(test_refine_elem, setup_element_test, teardown_f),
4347 cmocka_unit_test_setup_teardown(test_uses_elem, setup_element_test, teardown_f),
4348 cmocka_unit_test_setup_teardown(test_revision_elem, setup_element_test, teardown_f),
4349 cmocka_unit_test_setup_teardown(test_include_elem, setup_element_test, teardown_f),
4350 cmocka_unit_test_setup_teardown(test_list_elem, setup_element_test, teardown_f),
4351 cmocka_unit_test_setup_teardown(test_notification_elem, setup_element_test, teardown_f),
4352 cmocka_unit_test_setup_teardown(test_grouping_elem, setup_element_test, teardown_f),
4353 cmocka_unit_test_setup_teardown(test_container_elem, setup_element_test, teardown_f),
4354 cmocka_unit_test_setup_teardown(test_case_elem, setup_element_test, teardown_f),
4355 cmocka_unit_test_setup_teardown(test_choice_elem, setup_element_test, teardown_f),
4356 cmocka_unit_test_setup_teardown(test_inout_elem, setup_element_test, teardown_f),
4357 cmocka_unit_test_setup_teardown(test_action_elem, setup_element_test, teardown_f),
4358 cmocka_unit_test_setup_teardown(test_augment_elem, setup_element_test, teardown_f),
4359 cmocka_unit_test_setup_teardown(test_deviate_elem, setup_element_test, teardown_f),
4360 cmocka_unit_test_setup_teardown(test_deviation_elem, setup_element_test, teardown_f),
4361 cmocka_unit_test_setup_teardown(test_module_elem, setup_element_test, teardown_f),
4362 cmocka_unit_test_setup_teardown(test_submodule_elem, setup_element_test, teardown_f),
David Sedlák8985a142019-07-31 16:43:06 +02004363
Michal Vasko5d24f6c2020-10-13 13:49:06 +02004364 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_f, teardown_f),
4365 cmocka_unit_test_setup_teardown(test_yin_parse_submodule, setup_f, teardown_f),
David Sedlák3b4db242018-10-19 16:11:01 +02004366 };
4367
David Sedlák8e7bda82019-07-16 17:57:50 +02004368 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02004369}