blob: 1494e642021e0aaa4df484544b5571062f442614 [file] [log] [blame]
David Sedlákb1ce3f82019-06-05 14:37:26 +02001/**
2 * @file test_parser_yin.c
3 * @author David Sedlák <xsedla1d@stud.fit.vutbr.cz>
4 * @brief unit tests for functions from parser_yin.c
5 *
6 * Copyright (c) 2015 - 2019 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
David Sedlák3b4db242018-10-19 16:11:01 +020015#include <stdarg.h>
16#include <stddef.h>
17#include <setjmp.h>
18#include <cmocka.h>
19
20#include <stdio.h>
21#include <string.h>
David Sedlák79e50cb2019-06-05 16:33:09 +020022#include <stdbool.h>
David Sedlák3b4db242018-10-19 16:11:01 +020023
David Sedlákecf5eb82019-06-03 14:12:44 +020024#include "../../src/common.h"
25#include "../../src/tree_schema.h"
26#include "../../src/tree_schema_internal.h"
27#include "../../src/parser_yin.h"
David Sedlák8f5bce02019-06-03 16:41:08 +020028#include "../../src/xml.h"
David Sedlák3b4db242018-10-19 16:11:01 +020029
David Sedlák555c7202019-07-04 12:14:12 +020030/* prototypes of static functions */
31void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
David Sedlák986cb412019-07-04 13:10:11 +020032void lysp_ext_free(struct ly_ctx *ctx, struct lysp_ext *ext);
David Sedlák32eee7b2019-07-09 12:38:44 +020033void lysp_when_free(struct ly_ctx *ctx, struct lysp_when *when);
David Sedlák32488102019-07-15 17:44:10 +020034void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
David Sedlák8a83bbb2019-07-18 14:46:00 +020035void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
David Sedlák04e17b22019-07-19 15:29:48 +020036void lysp_tpdf_free(struct ly_ctx *ctx, struct lysp_tpdf *tpdf);
David Sedlák555c7202019-07-04 12:14:12 +020037
David Sedlák68a1af12019-03-08 13:46:54 +010038struct state {
David Sedlák3b4db242018-10-19 16:11:01 +020039 struct ly_ctx *ctx;
David Sedlák3017da42019-02-15 09:48:04 +010040 struct lys_module *mod;
David Sedlák619db942019-07-03 14:47:30 +020041 struct lysp_module *lysp_mod;
David Sedlákda8ffa32019-07-08 14:17:10 +020042 struct yin_parser_ctx *yin_ctx;
David Sedlák79e50cb2019-06-05 16:33:09 +020043 bool finished_correctly;
David Sedlák68a1af12019-03-08 13:46:54 +010044};
David Sedlák872c7b42018-10-26 13:15:20 +020045
David Sedlák79e50cb2019-06-05 16:33:09 +020046#define BUFSIZE 1024
47char logbuf[BUFSIZE] = {0};
48int store = -1; /* negative for infinite logging, positive for limited logging */
49
50/* set to 0 to printing error messages to stderr instead of checking them in code */
David Sedlák203ca3a2019-07-18 15:26:25 +020051#define ENABLE_LOGGER_CHECKING 1
David Sedlák79e50cb2019-06-05 16:33:09 +020052
53#if ENABLE_LOGGER_CHECKING
54static void
55logger(LY_LOG_LEVEL level, const char *msg, const char *path)
56{
57 (void) level; /* unused */
58 if (store) {
59 if (path && path[0]) {
60 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
61 } else {
62 strncpy(logbuf, msg, BUFSIZE - 1);
63 }
64 if (store > 0) {
65 --store;
66 }
67 }
68}
69#endif
70
71#if ENABLE_LOGGER_CHECKING
72# define logbuf_assert(str) assert_string_equal(logbuf, str)
73#else
74# define logbuf_assert(str)
75#endif
76
77#define TEST_DUP_GENERIC(PREFIX, MEMBER, VALUE1, VALUE2, FUNC, RESULT, LINE, CLEANUP) \
78 str = PREFIX MEMBER" "VALUE1";"MEMBER" "VALUE2";} ..."; \
79 assert_int_equal(LY_EVALID, FUNC(&ctx, &str, RESULT)); \
80 logbuf_assert("Duplicate keyword \""MEMBER"\". Line number "LINE"."); \
81 CLEANUP
82
David Sedlák8e7bda82019-07-16 17:57:50 +020083int
84setup_ly_ctx(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +010085{
86 struct state *st = NULL;
David Sedlák3b4db242018-10-19 16:11:01 +020087
David Sedlák68a1af12019-03-08 13:46:54 +010088 /* allocate state variable */
89 (*state) = st = calloc(1, sizeof(*st));
90 if (!st) {
91 fprintf(stderr, "Memmory allocation failed");
92 return EXIT_FAILURE;
93 }
David Sedlák872c7b42018-10-26 13:15:20 +020094
David Sedlák68a1af12019-03-08 13:46:54 +010095 /* create new libyang context */
96 ly_ctx_new(NULL, 0, &st->ctx);
David Sedlák872c7b42018-10-26 13:15:20 +020097
David Sedlák8e7bda82019-07-16 17:57:50 +020098 return EXIT_SUCCESS;
99}
100
101int
102destroy_ly_ctx(void **state)
103{
104 struct state *st = *state;
105 ly_ctx_destroy(st->ctx, NULL);
106 free(st);
107
108 return EXIT_SUCCESS;
109}
110
111static int
112setup_f(void **state)
113{
114 struct state *st = *state;
115
116#if ENABLE_LOGGER_CHECKING
117 /* setup logger */
118 ly_set_log_clb(logger, 1);
119#endif
120
David Sedlák68a1af12019-03-08 13:46:54 +0100121 /* allocate new module */
122 st->mod = calloc(1, sizeof(*st->mod));
123 st->mod->ctx = st->ctx;
124
David Sedlák619db942019-07-03 14:47:30 +0200125 /* allocate new parsed module */
126 st->lysp_mod = calloc(1, sizeof(*st->lysp_mod));
127 st->lysp_mod->mod = calloc(1, sizeof(*st->lysp_mod->mod));
128 st->lysp_mod->mod->ctx = st->ctx;
129
130 /* allocate parser context */
David Sedlákda8ffa32019-07-08 14:17:10 +0200131 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
132 st->yin_ctx->xml_ctx.ctx = st->ctx;
133 st->yin_ctx->xml_ctx.line = 1;
David Sedlák8f5bce02019-06-03 16:41:08 +0200134
David Sedlák68a1af12019-03-08 13:46:54 +0100135 return EXIT_SUCCESS;
David Sedlák3b4db242018-10-19 16:11:01 +0200136}
137
138static int
David Sedlák68a1af12019-03-08 13:46:54 +0100139teardown_f(void **state)
140{
141 struct state *st = *(struct state **)state;
David Sedlák619db942019-07-03 14:47:30 +0200142 struct lys_module *temp;
David Sedlák68a1af12019-03-08 13:46:54 +0100143
David Sedlák79e50cb2019-06-05 16:33:09 +0200144#if ENABLE_LOGGER_CHECKING
145 /* teardown logger */
146 if (!st->finished_correctly && logbuf[0] != '\0') {
147 fprintf(stderr, "%s\n", logbuf);
148 }
149#endif
150
David Sedlák619db942019-07-03 14:47:30 +0200151 temp = st->lysp_mod->mod;
152
David Sedlákda8ffa32019-07-08 14:17:10 +0200153 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100154 lys_module_free(st->mod, NULL);
David Sedlák619db942019-07-03 14:47:30 +0200155 lysp_module_free(st->lysp_mod);
156 lys_module_free(temp, NULL);
David Sedlákda8ffa32019-07-08 14:17:10 +0200157 free(st->yin_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100158
159 return EXIT_SUCCESS;
160}
161
David Sedlák392af4f2019-06-04 16:02:42 +0200162static struct state*
163reset_state(void **state)
164{
David Sedlák79e50cb2019-06-05 16:33:09 +0200165 ((struct state *)*state)->finished_correctly = true;
David Sedlák555c7202019-07-04 12:14:12 +0200166 logbuf[0] = '\0';
David Sedlák392af4f2019-06-04 16:02:42 +0200167 teardown_f(state);
168 setup_f(state);
169
170 return *state;
171}
172
David Sedlák79e50cb2019-06-05 16:33:09 +0200173void
174logbuf_clean(void)
175{
176 logbuf[0] = '\0';
177}
178
David Sedlák68a1af12019-03-08 13:46:54 +0100179static void
David Sedlák392af4f2019-06-04 16:02:42 +0200180test_yin_parse_module(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100181{
182 LY_ERR ret = LY_SUCCESS;
183 struct state *st = *state;
184
185 ret = yin_parse_module(st->ctx,
David Sedlák2b214ac2019-06-06 16:11:03 +0200186 "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\
187 name=\"example-foo\"\
David Sedlák18730132019-03-15 15:51:34 +0100188 xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\
189 xmlns:foo=\"urn:example:foo\"\
190 xmlns:myext=\"urn:example:extensions\">\
David Sedlákcd0c9512019-03-29 13:23:06 +0100191 <namespace uri=\"urn:example:foo\" xmlns:myext=\"urn:example:extensions\"/>\
David Sedláka7406952019-04-05 10:33:07 +0200192 <prefix xmlns:myxt=\"urn:emple:extensions\" value=\"foo\" xmlns:myext=\"urn:example:extensions\"/>\
David Sedlákd9d3a312019-06-04 09:47:10 +0200193 </module>",
David Sedlák68a1af12019-03-08 13:46:54 +0100194 st->mod);
195
196 assert_int_equal(ret, LY_SUCCESS);
197 assert_string_equal(st->mod->parsed->mod->name, "example-foo");
198 assert_string_equal(st->mod->parsed->mod->prefix, "foo");
David Sedlákcd0c9512019-03-29 13:23:06 +0100199 assert_string_equal(st->mod->parsed->mod->ns, "urn:example:foo");
David Sedlák392af4f2019-06-04 16:02:42 +0200200
201 st = reset_state(state);
202 ret = yin_parse_module(st->ctx,
David Sedlák2b214ac2019-06-06 16:11:03 +0200203 "<module name=\"example-foo\">\
204 <invalid-tag uri=\"urn:example:foo\"\"/>\
205 </module>",
206 st->mod);
David Sedlák392af4f2019-06-04 16:02:42 +0200207 assert_int_equal(ret, LY_EVALID);
208
209 st = reset_state(state);
210 ret = yin_parse_module(st->ctx,
David Sedlák8f7a1172019-06-20 14:42:18 +0200211 "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\
David Sedlák57715b12019-06-17 13:05:22 +0200212 </module>",
David Sedlák2b214ac2019-06-06 16:11:03 +0200213 st->mod);
David Sedlák392af4f2019-06-04 16:02:42 +0200214 assert_int_equal(ret, LY_EVALID);
David Sedlák882a8072019-07-08 17:51:20 +0200215 logbuf_assert("Missing mandatory attribute name of module element. Line number 1.");
David Sedlák392af4f2019-06-04 16:02:42 +0200216
217 st = reset_state(state);
218 ret = yin_parse_module(st->ctx,
219 "",
220 st->mod);
221 assert_int_equal(ret, LY_EVALID);
David Sedlák79e50cb2019-06-05 16:33:09 +0200222 logbuf_assert("Invalid keyword \"(null)\", expected \"module\" or \"submodule\". Line number 1.");
223 st->finished_correctly = true;
David Sedlák3b4db242018-10-19 16:11:01 +0200224}
225
226static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200227test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200228{
David Sedlák8f7a1172019-06-20 14:42:18 +0200229 struct state *st = *state;
David Sedlák3b4db242018-10-19 16:11:01 +0200230
David Sedlák8f7a1172019-06-20 14:42:18 +0200231 const char *prefix, *name;
232 struct yin_arg_record *args = NULL;
233 size_t prefix_len, name_len;
234 /* create mock yin namespace in xml context */
235 const char *data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200236 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
237 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák8f7a1172019-06-20 14:42:18 +0200238 LY_ARRAY_FREE(args);
239
David Sedlákc1771b12019-07-10 15:55:46 +0200240 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydatax", strlen("anydatax"), prefix, prefix_len, YANG_NONE), YANG_NONE);
241 assert_int_equal(yin_match_keyword(st->yin_ctx, "asdasd", strlen("asdasd"), prefix, prefix_len, YANG_NONE), YANG_NONE);
242 assert_int_equal(yin_match_keyword(st->yin_ctx, "", 0, prefix, prefix_len, YANG_NONE), YANG_NONE);
243 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydata", strlen("anydata"), prefix, prefix_len, YANG_NONE), YANG_ANYDATA);
244 assert_int_equal(yin_match_keyword(st->yin_ctx, "anyxml", strlen("anyxml"), prefix, prefix_len, YANG_NONE), YANG_ANYXML);
245 assert_int_equal(yin_match_keyword(st->yin_ctx, "argument", strlen("argument"), prefix, prefix_len, YANG_NONE), YANG_ARGUMENT);
246 assert_int_equal(yin_match_keyword(st->yin_ctx, "augment", strlen("augment"), prefix, prefix_len, YANG_NONE), YANG_AUGMENT);
247 assert_int_equal(yin_match_keyword(st->yin_ctx, "base", strlen("base"), prefix, prefix_len, YANG_NONE), YANG_BASE);
248 assert_int_equal(yin_match_keyword(st->yin_ctx, "belongs-to", strlen("belongs-to"), prefix, prefix_len, YANG_NONE), YANG_BELONGS_TO);
249 assert_int_equal(yin_match_keyword(st->yin_ctx, "bit", strlen("bit"), prefix, prefix_len, YANG_NONE), YANG_BIT);
250 assert_int_equal(yin_match_keyword(st->yin_ctx, "case", strlen("case"), prefix, prefix_len, YANG_NONE), YANG_CASE);
251 assert_int_equal(yin_match_keyword(st->yin_ctx, "choice", strlen("choice"), prefix, prefix_len, YANG_NONE), YANG_CHOICE);
252 assert_int_equal(yin_match_keyword(st->yin_ctx, "config", strlen("config"), prefix, prefix_len, YANG_NONE), YANG_CONFIG);
253 assert_int_equal(yin_match_keyword(st->yin_ctx, "contact", strlen("contact"), prefix, prefix_len, YANG_NONE), YANG_CONTACT);
254 assert_int_equal(yin_match_keyword(st->yin_ctx, "container", strlen("container"), prefix, prefix_len, YANG_NONE), YANG_CONTAINER);
255 assert_int_equal(yin_match_keyword(st->yin_ctx, "default", strlen("default"), prefix, prefix_len, YANG_NONE), YANG_DEFAULT);
256 assert_int_equal(yin_match_keyword(st->yin_ctx, "description", strlen("description"), prefix, prefix_len, YANG_NONE), YANG_DESCRIPTION);
257 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviate", strlen("deviate"), prefix, prefix_len, YANG_NONE), YANG_DEVIATE);
258 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviation", strlen("deviation"), prefix, prefix_len, YANG_NONE), YANG_DEVIATION);
259 assert_int_equal(yin_match_keyword(st->yin_ctx, "enum", strlen("enum"), prefix, prefix_len, YANG_NONE), YANG_ENUM);
260 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-app-tag", strlen("error-app-tag"), prefix, prefix_len, YANG_NONE), YANG_ERROR_APP_TAG);
261 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-message", strlen("error-message"), prefix, prefix_len, YANG_NONE), YANG_ERROR_MESSAGE);
262 assert_int_equal(yin_match_keyword(st->yin_ctx, "extension", strlen("extension"), prefix, prefix_len, YANG_NONE), YANG_EXTENSION);
263 assert_int_equal(yin_match_keyword(st->yin_ctx, "feature", strlen("feature"), prefix, prefix_len, YANG_NONE), YANG_FEATURE);
264 assert_int_equal(yin_match_keyword(st->yin_ctx, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, YANG_NONE), YANG_FRACTION_DIGITS);
265 assert_int_equal(yin_match_keyword(st->yin_ctx, "grouping", strlen("grouping"), prefix, prefix_len, YANG_NONE), YANG_GROUPING);
266 assert_int_equal(yin_match_keyword(st->yin_ctx, "identity", strlen("identity"), prefix, prefix_len, YANG_NONE), YANG_IDENTITY);
267 assert_int_equal(yin_match_keyword(st->yin_ctx, "if-feature", strlen("if-feature"), prefix, prefix_len, YANG_NONE), YANG_IF_FEATURE);
268 assert_int_equal(yin_match_keyword(st->yin_ctx, "import", strlen("import"), prefix, prefix_len, YANG_NONE), YANG_IMPORT);
269 assert_int_equal(yin_match_keyword(st->yin_ctx, "include", strlen("include"), prefix, prefix_len, YANG_NONE), YANG_INCLUDE);
270 assert_int_equal(yin_match_keyword(st->yin_ctx, "input", strlen("input"), prefix, prefix_len, YANG_NONE), YANG_INPUT);
271 assert_int_equal(yin_match_keyword(st->yin_ctx, "key", strlen("key"), prefix, prefix_len, YANG_NONE), YANG_KEY);
272 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf", strlen("leaf"), prefix, prefix_len, YANG_NONE), YANG_LEAF);
273 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf-list", strlen("leaf-list"), prefix, prefix_len, YANG_NONE), YANG_LEAF_LIST);
274 assert_int_equal(yin_match_keyword(st->yin_ctx, "length", strlen("length"), prefix, prefix_len, YANG_NONE), YANG_LENGTH);
275 assert_int_equal(yin_match_keyword(st->yin_ctx, "list", strlen("list"), prefix, prefix_len, YANG_NONE), YANG_LIST);
276 assert_int_equal(yin_match_keyword(st->yin_ctx, "mandatory", strlen("mandatory"), prefix, prefix_len, YANG_NONE), YANG_MANDATORY);
277 assert_int_equal(yin_match_keyword(st->yin_ctx, "max-elements", strlen("max-elements"), prefix, prefix_len, YANG_NONE), YANG_MAX_ELEMENTS);
278 assert_int_equal(yin_match_keyword(st->yin_ctx, "min-elements", strlen("min-elements"), prefix, prefix_len, YANG_NONE), YANG_MIN_ELEMENTS);
279 assert_int_equal(yin_match_keyword(st->yin_ctx, "modifier", strlen("modifier"), prefix, prefix_len, YANG_NONE), YANG_MODIFIER);
280 assert_int_equal(yin_match_keyword(st->yin_ctx, "module", strlen("module"), prefix, prefix_len, YANG_NONE), YANG_MODULE);
281 assert_int_equal(yin_match_keyword(st->yin_ctx, "must", strlen("must"), prefix, prefix_len, YANG_NONE), YANG_MUST);
282 assert_int_equal(yin_match_keyword(st->yin_ctx, "namespace", strlen("namespace"), prefix, prefix_len, YANG_NONE), YANG_NAMESPACE);
283 assert_int_equal(yin_match_keyword(st->yin_ctx, "notification", strlen("notification"), prefix, prefix_len, YANG_NONE), YANG_NOTIFICATION);
284 assert_int_equal(yin_match_keyword(st->yin_ctx, "ordered-by", strlen("ordered-by"), prefix, prefix_len, YANG_NONE), YANG_ORDERED_BY);
285 assert_int_equal(yin_match_keyword(st->yin_ctx, "organization", strlen("organization"), prefix, prefix_len, YANG_NONE), YANG_ORGANIZATION);
286 assert_int_equal(yin_match_keyword(st->yin_ctx, "output", strlen("output"), prefix, prefix_len, YANG_NONE), YANG_OUTPUT);
287 assert_int_equal(yin_match_keyword(st->yin_ctx, "path", strlen("path"), prefix, prefix_len, YANG_NONE), YANG_PATH);
288 assert_int_equal(yin_match_keyword(st->yin_ctx, "pattern", strlen("pattern"), prefix, prefix_len, YANG_NONE), YANG_PATTERN);
289 assert_int_equal(yin_match_keyword(st->yin_ctx, "position", strlen("position"), prefix, prefix_len, YANG_NONE), YANG_POSITION);
290 assert_int_equal(yin_match_keyword(st->yin_ctx, "prefix", strlen("prefix"), prefix, prefix_len, YANG_NONE), YANG_PREFIX);
291 assert_int_equal(yin_match_keyword(st->yin_ctx, "presence", strlen("presence"), prefix, prefix_len, YANG_NONE), YANG_PRESENCE);
292 assert_int_equal(yin_match_keyword(st->yin_ctx, "range", strlen("range"), prefix, prefix_len, YANG_NONE), YANG_RANGE);
293 assert_int_equal(yin_match_keyword(st->yin_ctx, "reference", strlen("reference"), prefix, prefix_len, YANG_NONE), YANG_REFERENCE);
294 assert_int_equal(yin_match_keyword(st->yin_ctx, "refine", strlen("refine"), prefix, prefix_len, YANG_NONE), YANG_REFINE);
295 assert_int_equal(yin_match_keyword(st->yin_ctx, "require-instance", strlen("require-instance"), prefix, prefix_len, YANG_NONE), YANG_REQUIRE_INSTANCE);
296 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision", strlen("revision"), prefix, prefix_len, YANG_NONE), YANG_REVISION);
297 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision-date", strlen("revision-date"), prefix, prefix_len, YANG_NONE), YANG_REVISION_DATE);
298 assert_int_equal(yin_match_keyword(st->yin_ctx, "rpc", strlen("rpc"), prefix, prefix_len, YANG_NONE), YANG_RPC);
299 assert_int_equal(yin_match_keyword(st->yin_ctx, "status", strlen("status"), prefix, prefix_len, YANG_NONE), YANG_STATUS);
300 assert_int_equal(yin_match_keyword(st->yin_ctx, "submodule", strlen("submodule"), prefix, prefix_len, YANG_NONE), YANG_SUBMODULE);
301 assert_int_equal(yin_match_keyword(st->yin_ctx, "type", strlen("type"), prefix, prefix_len, YANG_NONE), YANG_TYPE);
302 assert_int_equal(yin_match_keyword(st->yin_ctx, "typedef", strlen("typedef"), prefix, prefix_len, YANG_NONE), YANG_TYPEDEF);
303 assert_int_equal(yin_match_keyword(st->yin_ctx, "unique", strlen("unique"), prefix, prefix_len, YANG_NONE), YANG_UNIQUE);
304 assert_int_equal(yin_match_keyword(st->yin_ctx, "units", strlen("units"), prefix, prefix_len, YANG_NONE), YANG_UNITS);
305 assert_int_equal(yin_match_keyword(st->yin_ctx, "uses", strlen("uses"), prefix, prefix_len, YANG_NONE), YANG_USES);
306 assert_int_equal(yin_match_keyword(st->yin_ctx, "value", strlen("value"), prefix, prefix_len, YANG_NONE), YANG_VALUE);
307 assert_int_equal(yin_match_keyword(st->yin_ctx, "when", strlen("when"), prefix, prefix_len, YANG_NONE), YANG_WHEN);
308 assert_int_equal(yin_match_keyword(st->yin_ctx, "yang-version", strlen("yang-version"), prefix, prefix_len, YANG_NONE), YANG_YANG_VERSION);
309 assert_int_equal(yin_match_keyword(st->yin_ctx, "yin-element", strlen("yin-element"), prefix, prefix_len, YANG_NONE), YANG_YIN_ELEMENT);
David Sedlák8f7a1172019-06-20 14:42:18 +0200310
311 st->finished_correctly = true;
David Sedlák872c7b42018-10-26 13:15:20 +0200312}
David Sedlák3b4db242018-10-19 16:11:01 +0200313
David Sedlák872c7b42018-10-26 13:15:20 +0200314static void
David Sedlák060b00e2019-06-19 11:12:06 +0200315test_yin_match_argument_name(void **state)
David Sedlák872c7b42018-10-26 13:15:20 +0200316{
David Sedlák68a1af12019-03-08 13:46:54 +0100317 (void)state; /* unused */
David Sedlák872c7b42018-10-26 13:15:20 +0200318
David Sedlák060b00e2019-06-19 11:12:06 +0200319 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
320 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
321 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
322 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
323 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
324 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
325 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
326 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
327 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
328 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
329 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
330 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200331}
332
David Sedlák68a1af12019-03-08 13:46:54 +0100333static void
David Sedlákb1a78352019-06-28 16:16:29 +0200334test_yin_parse_element_generic(void **state)
335{
336 const char *prefix, *name;
337 struct state *st = *state;
338 struct lysp_ext_instance exts;
339 size_t prefix_len, name_len;
340 LY_ERR ret;
341
342 memset(&exts, 0, sizeof(exts));
343
344 const char *data = "<elem attr=\"value\">text_value</elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200345 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
346 ret = yin_parse_element_generic(st->yin_ctx, name, name_len, prefix, prefix_len, &data, &exts.child);
David Sedlákb1a78352019-06-28 16:16:29 +0200347 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200348 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200349 assert_string_equal(exts.child->stmt, "elem");
350 assert_string_equal(exts.child->arg, "text_value");
David Sedlákb1a78352019-06-28 16:16:29 +0200351 assert_string_equal(exts.child->child->stmt, "attr");
352 assert_string_equal(exts.child->child->arg, "value");
353 assert_true(exts.child->child->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200354 lysp_ext_instance_free(st->ctx, &exts);
David Sedlák5392a212019-07-01 09:19:10 +0200355 st = reset_state(state);
356
357 data = "<elem></elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200358 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
359 ret = yin_parse_element_generic(st->yin_ctx, name, name_len, prefix, prefix_len, &data, &exts.child);
David Sedlák5392a212019-07-01 09:19:10 +0200360 assert_int_equal(ret, LY_SUCCESS);
361 assert_string_equal(exts.child->stmt, "elem");
362 assert_null(exts.child->child);
363 assert_null(exts.child->arg);
David Sedlákda8ffa32019-07-08 14:17:10 +0200364 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák5392a212019-07-01 09:19:10 +0200365 lysp_ext_instance_free(st->ctx, &exts);
366
David Sedlákb1a78352019-06-28 16:16:29 +0200367 st->finished_correctly = true;
368}
369
370static void
371test_yin_parse_extension_instance(void **state)
372{
373 LY_ERR ret;
374 struct state *st = *state;
375 const char *prefix, *name;
376 size_t prefix_len, name_len;
377 struct yin_arg_record *args = NULL;
378 struct lysp_ext_instance *exts = NULL;
David Sedlákb1a78352019-06-28 16:16:29 +0200379 const char *data = "<ext value1=\"test\" value=\"test2\"><subelem>text</subelem></ext>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200380 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
381 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200382 ret = yin_parse_extension_instance(st->yin_ctx, args, &data, name2fullname(name, prefix_len),
David Sedlák619db942019-07-03 14:47:30 +0200383 namelen2fulllen(name_len, prefix_len), LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200384 assert_int_equal(ret, LY_SUCCESS);
385 assert_string_equal(exts->name, "ext");
386 assert_int_equal(exts->insubstmt_index, 0);
387 assert_true(exts->insubstmt == LYEXT_SUBSTMT_CONTACT);
388 assert_true(exts->yin & LYS_YIN);
389 assert_string_equal(exts->child->stmt, "value1");
390 assert_string_equal(exts->child->arg, "test");
391 assert_null(exts->child->child);
392 assert_true(exts->child->flags & LYS_YIN_ATTR);
393 assert_string_equal(exts->child->next->stmt, "value");
394 assert_string_equal(exts->child->next->arg, "test2");
395 assert_null(exts->child->next->child);
396 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
397
398 assert_string_equal(exts->child->next->next->stmt, "subelem");
399 assert_string_equal(exts->child->next->next->arg, "text");
400 assert_null(exts->child->next->next->child);
401 assert_null(exts->child->next->next->next);
402 assert_false(exts->child->next->next->flags & LYS_YIN_ATTR);
David Sedlákda8ffa32019-07-08 14:17:10 +0200403 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200404 LY_ARRAY_FREE(args);
405 lysp_ext_instance_free(st->ctx, exts);
406 LY_ARRAY_FREE(exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200407 exts = NULL;
408 args = NULL;
409 st = reset_state(state);
410
411 data = "<extension-elem />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200412 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
413 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200414 ret = yin_parse_extension_instance(st->yin_ctx, args, &data, name, name_len, LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200415 assert_int_equal(ret, LY_SUCCESS);
416 assert_string_equal(exts->name, "extension-elem");
417 assert_null(exts->argument);
418 assert_null(exts->child);
419 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
420 assert_int_equal(exts->insubstmt_index, 0);
421 assert_true(exts->yin & LYS_YIN);
David Sedlákda8ffa32019-07-08 14:17:10 +0200422 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákf250ecf2019-07-01 11:02:05 +0200423 LY_ARRAY_FREE(args);
424 lysp_ext_instance_free(st->ctx, exts);
425 LY_ARRAY_FREE(exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200426 st->finished_correctly = true;
427}
428
David Sedlák555c7202019-07-04 12:14:12 +0200429static void
430test_yin_parse_content(void **state)
431{
432 struct state *st = *state;
433 LY_ERR ret = LY_SUCCESS;
434 struct sized_string name, prefix;
435 const char *data = "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
436 "<custom xmlns=\"my-ext\">"
437 "totally amazing extension"
438 "</custom>"
David Sedlák986cb412019-07-04 13:10:11 +0200439 "<extension name=\"ext\">"
440 "<argument name=\"argname\"></argument>"
441 "<description><text>desc</text></description>"
442 "<reference><text>ref</text></reference>"
443 "<status value=\"deprecated\"></status>"
444 "</extension>"
David Sedlák555c7202019-07-04 12:14:12 +0200445 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedlák32488102019-07-15 17:44:10 +0200446 "<if-feature name=\"foo\"></if-feature>"
David Sedlák32eee7b2019-07-09 12:38:44 +0200447 "<when condition=\"condition...\">"
448 "<reference><text>when_ref</text></reference>"
449 "<description><text>when_desc</text></description>"
450 "</when>"
David Sedláke1a30302019-07-10 13:49:38 +0200451 "<config value=\"true\"/>"
David Sedlákc1771b12019-07-10 15:55:46 +0200452 "<error-message>"
453 "<value>error-msg</value>"
454 "</error-message>"
David Sedlák2ce1be62019-07-10 16:15:09 +0200455 "<error-app-tag value=\"err-app-tag\"/>"
David Sedláka5b1d382019-07-10 16:31:09 +0200456 "<units name=\"radians\"></units>"
David Sedláke7084ce2019-07-10 16:44:15 +0200457 "<default value=\"default-value\"/>"
David Sedlák5545f5d2019-07-11 11:55:16 +0200458 "<position value=\"25\"></position>"
459 "<value value=\"-5\"/>"
David Sedlákcf5569a2019-07-11 13:31:34 +0200460 "<require-instance value=\"true\"></require-instance>"
David Sedlákb7296dd2019-07-11 14:58:38 +0200461 "<range value=\"5..10\" />"
David Sedlák438ae432019-07-11 15:36:54 +0200462 "<length value=\"baf\"/>"
David Sedlákd3983112019-07-12 11:20:56 +0200463 "<pattern value='pattern'>"
464 "<modifier value='invert-match'/>"
465 "</pattern>"
David Sedlákfd5b9c32019-07-12 15:33:13 +0200466 "<enum name=\"yay\">"
467 "</enum>"
David Sedlák555c7202019-07-04 12:14:12 +0200468 "</prefix>";
469 struct lysp_ext_instance *exts = NULL;
David Sedlák5f8191e2019-07-08 16:35:52 +0200470 const char **if_features = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200471 struct yin_arg_record *attrs = NULL;
David Sedláke7084ce2019-07-10 16:44:15 +0200472 const char *value, *err_msg, *app_tag, *units, *def;
David Sedlák986cb412019-07-04 13:10:11 +0200473 struct lysp_ext *ext_def = NULL;
David Sedlák32eee7b2019-07-09 12:38:44 +0200474 struct lysp_when *when_p = NULL;
David Sedlákcf5569a2019-07-11 13:31:34 +0200475 struct lysp_type_enum pos_enum = {}, val_enum = {};
David Sedlákfd5b9c32019-07-12 15:33:13 +0200476 struct lysp_type req_type = {}, range_type = {}, len_type = {}, patter_type = {}, enum_type = {};
David Sedláke1a30302019-07-10 13:49:38 +0200477 uint8_t config = 0;
David Sedlák555c7202019-07-04 12:14:12 +0200478
David Sedlákda8ffa32019-07-08 14:17:10 +0200479 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
480 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedlák555c7202019-07-04 12:14:12 +0200481
David Sedlákfd5b9c32019-07-12 15:33:13 +0200482 struct yin_subelement subelems[17] = {
David Sedlák438ae432019-07-11 15:36:54 +0200483 {YANG_CONFIG, &config, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200484 {YANG_DEFAULT, &def, YIN_SUBELEM_UNIQUE},
David Sedlákfd5b9c32019-07-12 15:33:13 +0200485 {YANG_ENUM, &enum_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200486 {YANG_ERROR_APP_TAG, &app_tag, 0},
487 {YANG_ERROR_MESSAGE, &err_msg, 0},
488 {YANG_EXTENSION, &ext_def, 0},
489 {YANG_IF_FEATURE, &if_features, 0},
490 {YANG_LENGTH, &len_type, 0},
David Sedlákd3983112019-07-12 11:20:56 +0200491 {YANG_PATTERN, &patter_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200492 {YANG_RANGE, &range_type, 0},
493 {YANG_REQUIRE_INSTANCE, &req_type, 0},
494 {YANG_UNITS, &units, 0},
David Sedlák374d2b32019-07-17 15:06:55 +0200495 {YANG_POSITION, &pos_enum, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200496 {YANG_VALUE, &val_enum, 0},
497 {YANG_WHEN, &when_p, 0},
498 {YANG_CUSTOM, NULL, 0},
499 {YIN_TEXT, &value, 0}
David Sedlákd3983112019-07-12 11:20:56 +0200500 };
David Sedlákfd5b9c32019-07-12 15:33:13 +0200501 ret = yin_parse_content(st->yin_ctx, subelems, 17, &data, YANG_PREFIX, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200502 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200503 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák2ce1be62019-07-10 16:15:09 +0200504 /* check parsed values */
David Sedláke7084ce2019-07-10 16:44:15 +0200505 assert_string_equal(def, "default-value");
David Sedlák555c7202019-07-04 12:14:12 +0200506 assert_string_equal(exts->name, "custom");
507 assert_string_equal(exts->argument, "totally amazing extension");
508 assert_string_equal(value, "wsefsdf");
David Sedláka5b1d382019-07-10 16:31:09 +0200509 assert_string_equal(units, "radians");
David Sedlák32eee7b2019-07-09 12:38:44 +0200510 assert_string_equal(when_p->cond, "condition...");
511 assert_string_equal(when_p->dsc, "when_desc");
512 assert_string_equal(when_p->ref, "when_ref");
David Sedláke1a30302019-07-10 13:49:38 +0200513 assert_int_equal(config, LYS_CONFIG_W);
David Sedlák5545f5d2019-07-11 11:55:16 +0200514 assert_int_equal(pos_enum.value, 25);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200515 assert_true(pos_enum.flags & LYS_SET_VALUE);
David Sedlák5545f5d2019-07-11 11:55:16 +0200516 assert_int_equal(val_enum.value, -5);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200517 assert_true(val_enum.flags & LYS_SET_VALUE);
David Sedlákcf5569a2019-07-11 13:31:34 +0200518 assert_int_equal(req_type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200519 assert_true(req_type.flags &= LYS_SET_REQINST);
David Sedlákb7296dd2019-07-11 14:58:38 +0200520 assert_string_equal(range_type.range->arg, "5..10");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200521 assert_true(range_type.flags & LYS_SET_RANGE);
David Sedlákc1771b12019-07-10 15:55:46 +0200522 assert_string_equal(err_msg, "error-msg");
David Sedlák2ce1be62019-07-10 16:15:09 +0200523 assert_string_equal(app_tag, "err-app-tag");
David Sedlákfd5b9c32019-07-12 15:33:13 +0200524 assert_string_equal(enum_type.enums->name, "yay");
David Sedlák438ae432019-07-11 15:36:54 +0200525 assert_string_equal(len_type.length->arg, "baf");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200526 assert_true(len_type.flags & LYS_SET_LENGTH);
David Sedlákd3983112019-07-12 11:20:56 +0200527 assert_string_equal(patter_type.patterns->arg, "\x015pattern");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200528 assert_true(patter_type.flags & LYS_SET_PATTERN);
David Sedlák2ce1be62019-07-10 16:15:09 +0200529 /* cleanup */
David Sedlák555c7202019-07-04 12:14:12 +0200530 lysp_ext_instance_free(st->ctx, exts);
David Sedlák32eee7b2019-07-09 12:38:44 +0200531 lysp_when_free(st->ctx, when_p);
David Sedlák986cb412019-07-04 13:10:11 +0200532 lysp_ext_free(st->ctx, ext_def);
David Sedlák5f8191e2019-07-08 16:35:52 +0200533 FREE_STRING(st->ctx, *if_features);
David Sedlákc1771b12019-07-10 15:55:46 +0200534 FREE_STRING(st->ctx, err_msg);
David Sedlák2ce1be62019-07-10 16:15:09 +0200535 FREE_STRING(st->ctx, app_tag);
David Sedláka5b1d382019-07-10 16:31:09 +0200536 FREE_STRING(st->ctx, units);
David Sedlákd3983112019-07-12 11:20:56 +0200537 FREE_STRING(st->ctx, patter_type.patterns->arg);
David Sedláke7084ce2019-07-10 16:44:15 +0200538 FREE_STRING(st->ctx, def);
David Sedlákb7296dd2019-07-11 14:58:38 +0200539 FREE_STRING(st->ctx, range_type.range->arg);
David Sedlák438ae432019-07-11 15:36:54 +0200540 FREE_STRING(st->ctx, len_type.length->arg);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200541 FREE_STRING(st->ctx, enum_type.enums->name);
David Sedlákb7296dd2019-07-11 14:58:38 +0200542 FREE_STRING(st->ctx, value);
David Sedlák5f8191e2019-07-08 16:35:52 +0200543 LY_ARRAY_FREE(if_features);
David Sedlák555c7202019-07-04 12:14:12 +0200544 LY_ARRAY_FREE(exts);
David Sedlák986cb412019-07-04 13:10:11 +0200545 LY_ARRAY_FREE(ext_def);
David Sedlák555c7202019-07-04 12:14:12 +0200546 LY_ARRAY_FREE(attrs);
David Sedlákd3983112019-07-12 11:20:56 +0200547 LY_ARRAY_FREE(patter_type.patterns);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200548 LY_ARRAY_FREE(enum_type.enums);
David Sedlák32eee7b2019-07-09 12:38:44 +0200549 free(when_p);
David Sedlákb7296dd2019-07-11 14:58:38 +0200550 free(range_type.range);
David Sedlák438ae432019-07-11 15:36:54 +0200551 free(len_type.length);
David Sedlák555c7202019-07-04 12:14:12 +0200552 attrs = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200553 st = reset_state(state);
554
555 /* test unique subelem */
556 const char *prefix_value;
557 struct yin_subelement subelems2[2] = {{YANG_PREFIX, &prefix_value, 0},
558 {YIN_TEXT, &value, YIN_SUBELEM_UNIQUE}};
559 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
560 "<prefix value=\"inv_mod\" />"
561 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
562 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
563 "</module>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200564 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
565 yin_load_attributes(st->yin_ctx, &data, &attrs);
566 ret = yin_parse_content(st->yin_ctx, subelems2, 2, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200567 assert_int_equal(ret, LY_EVALID);
568 logbuf_assert("Redefinition of text element in module element. Line number 1.");
569 lydict_remove(st->ctx, prefix_value);
570 lydict_remove(st->ctx, value);
571 st = reset_state(state);
572 LY_ARRAY_FREE(attrs);
573 attrs = NULL;
574
575 /* test first subelem */
576 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
577 "<prefix value=\"inv_mod\" />"
578 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
579 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
580 "</module>";
581 struct yin_subelement subelems3[2] = {{YANG_PREFIX, &prefix_value, 0},
582 {YIN_TEXT, &value, YIN_SUBELEM_FIRST}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200583 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
584 yin_load_attributes(st->yin_ctx, &data, &attrs);
585 ret = yin_parse_content(st->yin_ctx, subelems3, 2, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200586 assert_int_equal(ret, LY_EVALID);
587 logbuf_assert("Subelement text of module element must be defined as first subelement. Line number 1.");
588 lydict_remove(st->ctx, prefix_value);
589 st = reset_state(state);
590 LY_ARRAY_FREE(attrs);
591 attrs = NULL;
592
593 /* test mandatory subelem */
594 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
595 "</module>";
596 struct yin_subelement subelems4[1] = {{YANG_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200597 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
598 yin_load_attributes(st->yin_ctx, &data, &attrs);
599 ret = yin_parse_content(st->yin_ctx, subelems4, 1, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200600 assert_int_equal(ret, LY_EVALID);
601 logbuf_assert("Missing mandatory subelement prefix of module element. Line number 1.");
602 LY_ARRAY_FREE(attrs);
603
604 st->finished_correctly = true;
605}
606
David Sedlák92147b02019-07-09 14:01:01 +0200607static void
David Sedlák4a650532019-07-10 11:55:18 +0200608test_validate_value(void **state)
609{
610 struct state *st = *state;
611 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "#invalid", 8), LY_EVALID);
612 logbuf_assert("Invalid identifier character '#'. Line number 1.");
613 assert_int_equal(yin_validate_value(st->yin_ctx, Y_STR_ARG, "", 0), LY_SUCCESS);
614 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "pre:b", 5), LY_EVALID);
615 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:b", 5), LY_SUCCESS);
616 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:pre:b", 9), LY_EVALID);
617
618 st->finished_correctly = true;
619}
620
David Sedlák32488102019-07-15 17:44:10 +0200621static int
622setup_element_test(void **state)
623{
David Sedlák8e7bda82019-07-16 17:57:50 +0200624 struct state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200625
626#if ENABLE_LOGGER_CHECKING
627 /* setup logger */
628 ly_set_log_clb(logger, 1);
629#endif
630
631 /* reset logbuf */
632 logbuf[0] = '\0';
David Sedlák32488102019-07-15 17:44:10 +0200633
634 /* allocate parser context */
635 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
636 st->yin_ctx->xml_ctx.ctx = st->ctx;
637 st->yin_ctx->xml_ctx.line = 1;
638
639 return EXIT_SUCCESS;
640}
641
642static int
643teardown_element_test(void **state)
644{
645 struct state *st = *(struct state **)state;
646
647#if ENABLE_LOGGER_CHECKING
648 /* teardown logger */
649 if (!st->finished_correctly && logbuf[0] != '\0') {
650 fprintf(stderr, "%s\n", logbuf);
651 }
652#endif
653
654 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák32488102019-07-15 17:44:10 +0200655 free(st->yin_ctx);
David Sedlák32488102019-07-15 17:44:10 +0200656
657 return EXIT_SUCCESS;
658}
659
660#define ELEMENT_WRAPPER_START "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
661#define ELEMENT_WRAPPER_END "</module>"
662
663/* helper function to simplify unit test of each element using parse_content function */
664LY_ERR
665test_element_helper(struct state *st, const char **data, void *dest, const char **text,
666 struct lysp_ext_instance **exts, bool valid)
667{
668 struct yin_arg_record *attrs = NULL;
669 struct sized_string name, prefix;
670 LY_ERR ret = LY_SUCCESS;
671 struct yin_subelement subelems[71] = {
672 {YANG_ACTION, dest, 0},
673 {YANG_ANYDATA, dest, 0},
674 {YANG_ANYXML, dest, 0},
675 {YANG_ARGUMENT,dest, 0},
676 {YANG_AUGMENT, dest, 0},
677 {YANG_BASE, dest, 0},
678 {YANG_BELONGS_TO, dest, 0},
679 {YANG_BIT, dest, 0},
680 {YANG_CASE, dest, 0},
681 {YANG_CHOICE, dest, 0},
682 {YANG_CONFIG, dest, 0},
683 {YANG_CONTACT, dest, 0},
684 {YANG_CONTAINER, dest, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200685 {YANG_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
David Sedlák32488102019-07-15 17:44:10 +0200686 {YANG_DESCRIPTION, dest, 0},
687 {YANG_DEVIATE, dest, 0},
688 {YANG_DEVIATION, dest, 0},
689 {YANG_ENUM, dest, 0},
690 {YANG_ERROR_APP_TAG, dest, 0},
691 {YANG_ERROR_MESSAGE, dest, 0},
692 {YANG_EXTENSION, dest, 0},
693 {YANG_FEATURE, dest, 0},
694 {YANG_FRACTION_DIGITS, dest, 0},
695 {YANG_GROUPING, dest, 0},
696 {YANG_IDENTITY, dest, 0},
697 {YANG_IF_FEATURE, dest, 0},
698 {YANG_IMPORT, dest, 0},
699 {YANG_INCLUDE, dest, 0},
700 {YANG_INPUT, dest, 0},
701 {YANG_KEY, dest, 0},
702 {YANG_LEAF, dest, 0},
703 {YANG_LEAF_LIST, dest, 0},
704 {YANG_LENGTH, dest, 0},
705 {YANG_LIST, dest, 0},
706 {YANG_MANDATORY, dest, 0},
707 {YANG_MAX_ELEMENTS, dest, 0},
708 {YANG_MIN_ELEMENTS, dest, 0},
709 {YANG_MODIFIER, dest, 0},
710 {YANG_MODULE, dest, 0},
711 {YANG_MUST, dest, 0},
712 {YANG_NAMESPACE, dest, 0},
713 {YANG_NOTIFICATION, dest, 0},
714 {YANG_ORDERED_BY, dest, 0},
715 {YANG_ORGANIZATION, dest, 0},
716 {YANG_OUTPUT, dest, 0},
717 {YANG_PATH, dest, 0},
718 {YANG_PATTERN, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200719 {YANG_PREFIX, dest, 0},
720 {YANG_PRESENCE, dest, 0},
721 {YANG_RANGE, dest, 0},
722 {YANG_REFERENCE, dest, 0},
723 {YANG_REFINE, dest, 0},
724 {YANG_REQUIRE_INSTANCE, dest, 0},
725 {YANG_REVISION, dest, 0},
726 {YANG_REVISION_DATE, dest, 0},
727 {YANG_RPC, dest, 0},
728 {YANG_STATUS, dest, 0},
729 {YANG_SUBMODULE, dest, 0},
730 {YANG_TYPE, dest, 0},
731 {YANG_TYPEDEF, dest, 0},
732 {YANG_UNIQUE, dest, 0},
733 {YANG_UNITS, dest, 0},
734 {YANG_USES, dest, 0},
David Sedlák374d2b32019-07-17 15:06:55 +0200735 {YANG_POSITION, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200736 {YANG_VALUE, dest, 0},
737 {YANG_WHEN, dest, 0},
738 {YANG_YANG_VERSION, dest, 0},
739 {YANG_YIN_ELEMENT, dest, 0},
740 {YANG_CUSTOM, dest, 0},
741 {YIN_TEXT, dest, 0},
742 {YIN_VALUE, dest, 0}
743 };
744 LY_CHECK_RET(lyxml_get_element(&st->yin_ctx->xml_ctx, data, &prefix.value, &prefix.len, &name.value, &name.len));\
745 LY_CHECK_RET(yin_load_attributes(st->yin_ctx, data, &attrs));\
David Sedlák8e7bda82019-07-16 17:57:50 +0200746 ret = yin_parse_content(st->yin_ctx, subelems, 71, data, yin_match_keyword(st->yin_ctx, name.value, name.len, prefix.value, prefix.len, YANG_NONE), text, exts);
David Sedlák32488102019-07-15 17:44:10 +0200747 LY_ARRAY_FREE(attrs);
748 if (valid) {
749 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
750 }
751 /* reset status */
752 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
753 return ret;
754}
755
756static void
757test_enum_bit_elem(void **state)
758{
759 /* yin_parse_enum_bit is function that is being mainly tested by this test */
760 struct state *st = *state;
761 struct lysp_type type = {};
762 const char *data;
763 data = ELEMENT_WRAPPER_START
764 "<enum name=\"enum-name\">"
765 "<if-feature name=\"feature\" />"
766 "<value value=\"55\" />"
767 "<status value=\"deprecated\" />"
768 "<description><text>desc...</text></description>"
769 "<reference><text>ref...</text></reference>"
770 "</enum>"
771 ELEMENT_WRAPPER_END;
772 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
773 assert_string_equal(*type.enums->iffeatures, "feature");
774 assert_int_equal(type.enums->value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200775 assert_true((type.enums->flags & LYS_STATUS_DEPRC) && (type.enums->flags & LYS_SET_VALUE));
David Sedlák32488102019-07-15 17:44:10 +0200776 assert_string_equal(type.enums->dsc, "desc...");
777 assert_string_equal(type.enums->ref, "ref...");
778 lysp_type_free(st->ctx, &type);
779 memset(&type, 0, sizeof type);
780
781 /* todo bit element test */
782 st->finished_correctly = true;
783}
784
785static void
786test_meta_elem(void **state)
787{
788 struct state *st = *state;
789 char *value = NULL;
790 const char *data;
791
792 /* organization element */
793 data = ELEMENT_WRAPPER_START
794 "<organization><text>organization...</text></organization>"
795 ELEMENT_WRAPPER_END;
796 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
797 assert_string_equal(value, "organization...");
798 FREE_STRING(st->ctx, value);
799 value = NULL;
800 /* contact element */
801 data = ELEMENT_WRAPPER_START
802 "<contact><text>contact...</text></contact>"
803 ELEMENT_WRAPPER_END;
804 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
805 assert_string_equal(value, "contact...");
806 FREE_STRING(st->ctx, value);
807 value = NULL;
808 /* description element */
809 data = ELEMENT_WRAPPER_START
810 "<description><text>description...</text></description>"
811 ELEMENT_WRAPPER_END;
812 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
813 assert_string_equal(value, "description...");
814 FREE_STRING(st->ctx, value);
815 value = NULL;
816 /* reference element */
817 data = ELEMENT_WRAPPER_START
818 "<reference><text>reference...</text></reference>"
819 ELEMENT_WRAPPER_END;
820 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
821 assert_string_equal(value, "reference...");
822 FREE_STRING(st->ctx, value);
823 value = NULL;
824
825 /* missing text subelement */
826 data = ELEMENT_WRAPPER_START
827 "<reference>reference...</reference>"
828 ELEMENT_WRAPPER_END;
829 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, false), LY_EVALID);
830 logbuf_assert("Missing mandatory subelement text of reference element. Line number 1.");
831
832 st->finished_correctly = true;
833}
834
835static void
836test_import_elem(void **state)
837{
838 struct state *st = *state;
839 const char *data;
840 struct lys_module *lys_mod = calloc(1, sizeof *lys_mod);
841 struct lysp_module *lysp_mod = calloc(1, sizeof *lysp_mod);
842 lys_mod->ctx = st->ctx;
843 lysp_mod->mod = lys_mod;
844
845 /* max subelems */
846 data = ELEMENT_WRAPPER_START
847 "<import module=\"a\">"
848 "<prefix value=\"a_mod\"/>"
849 "<revision-date date=\"2015-01-01\"></revision-date>"
850 "<description><text>import description</text></description>"
851 "<reference><text>import reference</text></reference>"
852 "</import>"
853 ELEMENT_WRAPPER_END;
854 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, true), LY_SUCCESS);
855 assert_string_equal(lysp_mod->imports->name, "a");
856 assert_string_equal(lysp_mod->imports->prefix, "a_mod");
857 assert_string_equal(lysp_mod->imports->rev, "2015-01-01");
858 assert_string_equal(lysp_mod->imports->dsc, "import description");
859 assert_string_equal(lysp_mod->imports->ref, "import reference");
860 lysp_module_free(lysp_mod);
861 lys_module_free(lys_mod, NULL);
862
863 /* min subelems */
864 lys_mod = calloc(1, sizeof *lys_mod);
865 lysp_mod = calloc(1, sizeof *lysp_mod);
866 lys_mod->ctx = st->ctx;
867 lysp_mod->mod = lys_mod;
868 data = ELEMENT_WRAPPER_START
869 "<import module=\"a\">"
870 "<prefix value=\"a_mod\"/>"
871 "</import>"
872 ELEMENT_WRAPPER_END;
873 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, true), LY_SUCCESS);
874 assert_string_equal(lysp_mod->imports->prefix, "a_mod");
875 lysp_module_free(lysp_mod);
876 lys_module_free(lys_mod, NULL);
877
878 /* invalid (missing prefix) */
879 lys_mod = calloc(1, sizeof *lys_mod);
880 lysp_mod = calloc(1, sizeof *lysp_mod);
881 lys_mod->ctx = st->ctx;
882 lysp_mod->mod = lys_mod;
883 data = ELEMENT_WRAPPER_START "<import module=\"a\">""</import>" ELEMENT_WRAPPER_END;
884 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, false), LY_EVALID);
885 logbuf_assert("Missing mandatory subelement prefix of import element. Line number 1.");
886 lysp_module_free(lysp_mod);
887 lys_module_free(lys_mod, NULL);
888
889 /* invalid reused prefix */
890 lys_mod = calloc(1, sizeof *lys_mod);
891 lysp_mod = calloc(1, sizeof *lysp_mod);
892 lys_mod->ctx = st->ctx;
893 lysp_mod->mod = lys_mod;
894 data = ELEMENT_WRAPPER_START
895 "<import module=\"a\">"
896 "<prefix value=\"a_mod\"/>"
897 "</import>"
898 "<import module=\"a\">"
899 "<prefix value=\"a_mod\"/>"
900 "</import>"
901 ELEMENT_WRAPPER_END;
902 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, false), LY_EVALID);
903 logbuf_assert("Prefix \"a_mod\" already used to import \"a\" module. Line number 1.");
904 lysp_module_free(lysp_mod);
905 lys_module_free(lys_mod, NULL);
906
907 st->finished_correctly = true;
908}
909
910static void
911test_status_elem(void **state)
912{
913 struct state *st = *state;
914 const char *data;
915 uint16_t flags = 0;
916
917 /* test valid values */
918 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
919 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200920 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200921
922 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
923 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200924 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +0200925
926 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\"></status>" ELEMENT_WRAPPER_END;
927 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200928 assert_true(flags & LYS_STATUS_OBSLT);
David Sedlák32488102019-07-15 17:44:10 +0200929
930 /* test invalid value */
931 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
932 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
933 logbuf_assert("Invalid value \"invalid\" of \"status\". Line number 1.");
934 st->finished_correctly = true;
935}
936
937static void
938test_ext_elem(void **state)
939{
940 struct state *st = *state;
941 const char *data;
942 struct lysp_ext *ext = NULL;
943
944 /* max subelems */
945 data = ELEMENT_WRAPPER_START
946 "<extension name=\"ext_name\">"
947 "<argument name=\"arg\"></argument>"
948 "<status value=\"current\"/>"
949 "<description><text>ext_desc</text></description>"
950 "<reference><text>ext_ref</text></reference>"
951 "</extension>"
952 ELEMENT_WRAPPER_END;
953 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
954 assert_string_equal(ext->name, "ext_name");
955 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200956 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200957 assert_string_equal(ext->dsc, "ext_desc");
958 assert_string_equal(ext->ref, "ext_ref");
959 lysp_ext_free(st->ctx, ext);
960 LY_ARRAY_FREE(ext);
961 ext = NULL;
962
963 /* min subelems */
964 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
965 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
966 assert_string_equal(ext->name, "ext_name");
967 lysp_ext_free(st->ctx, ext);
968 LY_ARRAY_FREE(ext);
969 ext = NULL;
970
971 st->finished_correctly = true;
972}
973
974static void
975test_yin_element_elem(void **state)
976{
977 struct state *st = *state;
978 const char *data;
979 uint16_t flags = 0;
980
981 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
982 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200983 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200984
985 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\" />" ELEMENT_WRAPPER_END;
986 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200987 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200988
989 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
990 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200991 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200992 logbuf_assert("Invalid value \"invalid\" of \"yin-element\". Line number 1.");
993 st->finished_correctly = true;
994}
995
996static void
997test_yangversion_elem(void **state)
998{
999 struct state *st = *state;
1000 const char *data;
1001 uint8_t version = 0;
1002
1003 /* valid values */
1004 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.0\" />" ELEMENT_WRAPPER_END;
1005 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001006 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001007 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_0);
1008
1009 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\" />" ELEMENT_WRAPPER_END;
1010 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001011 assert_true(version & LYS_VERSION_1_1);
David Sedlák32488102019-07-15 17:44:10 +02001012 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_1);
1013
1014 /* invalid value */
1015 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
1016 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, false), LY_EVALID);
1017 logbuf_assert("Invalid value \"version\" of \"yang-version\". Line number 1.");
1018
1019 st->finished_correctly = true;
1020}
1021
1022static void
1023test_mandatory_elem(void **state)
1024{
1025 struct state *st = *state;
1026 const char *data;
1027 uint16_t man = 0;
1028
1029 /* valid values */
1030 data = ELEMENT_WRAPPER_START "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
1031 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1032 assert_int_equal(man, LYS_MAND_TRUE);
1033 man = 0;
1034
1035 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\" />" ELEMENT_WRAPPER_END;
1036 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1037 assert_int_equal(man, LYS_MAND_FALSE);
1038
1039 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
1040 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, false), LY_EVALID);
1041 logbuf_assert("Invalid value \"invalid\" of \"mandatory\". Line number 1.");
1042
1043 st->finished_correctly = true;
1044}
1045
David Sedlák8e7bda82019-07-16 17:57:50 +02001046static void
1047test_argument_elem(void **state)
1048{
1049 struct state *st = *state;
1050 const char *data;
1051 uint16_t flags = 0;
1052 const char *arg;
1053 struct yin_argument_meta arg_meta = {&flags, &arg};
1054 /* max subelems */
1055 data = ELEMENT_WRAPPER_START
1056 "<argument name=\"arg-name\">"
1057 "<yin-element value=\"true\" />"
1058 "</argument>"
1059 ELEMENT_WRAPPER_END;
1060 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1061 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001062 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001063 flags = 0;
1064 FREE_STRING(st->ctx, arg);
1065 arg = NULL;
1066
1067 /* min subelems */
1068 data = ELEMENT_WRAPPER_START
1069 "<argument name=\"arg\">"
1070 "</argument>"
1071 ELEMENT_WRAPPER_END;
1072 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1073 assert_string_equal(arg, "arg");
1074 assert_true(flags == 0);
1075 FREE_STRING(st->ctx, arg);
1076
1077 st->finished_correctly = true;
1078}
1079
1080static void
1081test_base_elem(void **state)
1082{
1083 struct state *st = *state;
1084 const char *data;
1085 const char **bases = NULL;
1086 struct lysp_type type = {};
1087
1088 /* as identity subelement */
1089 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
1090 "<base name=\"base-name\"/>"
1091 "</identity>";
1092 assert_int_equal(test_element_helper(st, &data, &bases, NULL, NULL, true), LY_SUCCESS);
1093 assert_string_equal(*bases, "base-name");
1094 FREE_STRING(st->ctx, *bases);
1095 LY_ARRAY_FREE(bases);
1096
1097 /* as type subelement */
1098 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
1099 "<base name=\"base-name\"/>"
1100 "</type>";
1101 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1102 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001103 assert_true(type.flags & LYS_SET_BASE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001104 FREE_STRING(st->ctx, *type.bases);
1105 LY_ARRAY_FREE(type.bases);
1106
1107 st->finished_correctly = true;
1108}
1109
1110static void
1111test_belongsto_elem(void **state)
1112{
1113 struct state *st = *state;
1114 const char *data;
1115 struct lysp_submodule submod;
1116
1117 data = ELEMENT_WRAPPER_START
1118 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>"
1119 ELEMENT_WRAPPER_END;
1120 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, true), LY_SUCCESS);
1121 assert_string_equal(submod.belongsto, "module-name");
1122 assert_string_equal(submod.prefix, "pref");
1123 FREE_STRING(st->ctx, submod.belongsto);
1124 FREE_STRING(st->ctx, submod.prefix);
1125
1126 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
1127 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, false), LY_EVALID);
1128 logbuf_assert("Missing mandatory subelement prefix of belongs-to element. Line number 1.");
1129 FREE_STRING(st->ctx, submod.belongsto);
1130
1131 st->finished_correctly = true;
1132}
1133
1134static void
1135test_config_elem(void **state)
1136{
1137 struct state *st = *state;
1138 const char *data;
1139 uint16_t flags = 0;
1140
1141 data = ELEMENT_WRAPPER_START "<config value=\"true\"/>" ELEMENT_WRAPPER_END;
1142 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001143 assert_true(flags & LYS_CONFIG_W);
David Sedlák8e7bda82019-07-16 17:57:50 +02001144 flags = 0;
1145
1146 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
1147 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001148 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001149 flags = 0;
1150
1151 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1152 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1153 logbuf_assert("Invalid value \"invalid\" of \"config\". Line number 1.");
1154
1155 st->finished_correctly = true;
1156}
1157
1158static void
1159test_default_elem(void **state)
1160{
1161 struct state *st = *state;
1162 const char *data;
1163 const char *val = NULL;
1164
1165 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\"/>" ELEMENT_WRAPPER_END;
1166 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1167 assert_string_equal(val, "defaul-value");
1168 FREE_STRING(st->ctx, val);
1169 val = NULL;
1170
1171 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
1172 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1173 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1174
1175 st->finished_correctly = true;
1176}
1177
1178static void
1179test_err_app_tag_elem(void **state)
1180{
1181 struct state *st = *state;
1182 const char *data;
1183 const char *val = NULL;
1184
1185 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\"/>" ELEMENT_WRAPPER_END;
1186 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1187 assert_string_equal(val, "val");
1188 FREE_STRING(st->ctx, val);
1189 val = NULL;
1190
1191 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
1192 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1193 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1194
1195 st->finished_correctly = true;
1196}
1197
1198static void
1199test_err_msg_elem(void **state)
1200{
1201 struct state *st = *state;
1202 const char *data;
1203 const char *val = NULL;
1204
1205 data = ELEMENT_WRAPPER_START "<error-message><value>val</value></error-message>" ELEMENT_WRAPPER_END;
1206 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1207 assert_string_equal(val, "val");
1208 FREE_STRING(st->ctx, val);
1209
1210 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
1211 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1212 logbuf_assert("Missing mandatory subelement value of error-message element. Line number 1.");
1213
1214 st->finished_correctly = true;
1215}
1216
1217static void
1218test_fracdigits_elem(void **state)
1219{
1220 struct state *st = *state;
1221 const char *data;
1222 struct lysp_type type = {};
1223
1224 /* valid value */
1225 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\"></fraction-digits>" ELEMENT_WRAPPER_END;
1226 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1227 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001228 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001229
1230 /* invalid values */
1231 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
1232 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1233 logbuf_assert("Invalid value \"-1\" of \"fraction-digits\". Line number 1.");
1234
1235 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
1236 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1237 logbuf_assert("Invalid value \"02\" of \"fraction-digits\". Line number 1.");
1238
1239 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
1240 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1241 logbuf_assert("Invalid value \"1p\" of \"fraction-digits\". Line number 1.");
1242
1243 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
1244 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1245 logbuf_assert("Invalid value \"19\" of \"fraction-digits\". Line number 1.");
1246
1247 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
1248 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1249 logbuf_assert("Invalid value \"999999999999999999\" of \"fraction-digits\". Line number 1.");
1250
1251 st->finished_correctly = true;
1252}
1253
1254static void
1255test_iffeature_elem(void **state)
1256{
1257 struct state *st = *state;
1258 const char *data;
1259 const char **iffeatures = NULL;
1260
1261 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\"></if-feature>" ELEMENT_WRAPPER_END;
1262 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, true), LY_SUCCESS);
1263 assert_string_equal(*iffeatures, "local-storage");
1264 FREE_STRING(st->ctx, *iffeatures);
1265 LY_ARRAY_FREE(iffeatures);
1266 iffeatures = NULL;
1267
1268 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
1269 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, false), LY_EVALID);
1270 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1271 LY_ARRAY_FREE(iffeatures);
1272 iffeatures = NULL;
1273
1274 st->finished_correctly = true;
1275}
1276
1277static void
1278test_length_elem(void **state)
1279{
1280 struct state *st = *state;
1281 const char *data;
1282 struct lysp_type type = {};
1283
1284 /* max subelems */
1285 data = ELEMENT_WRAPPER_START
1286 "<length value=\"length-str\">"
1287 "<error-message><value>err-msg</value></error-message>"
1288 "<error-app-tag value=\"err-app-tag\"/>"
1289 "<description><text>desc</text></description>"
1290 "<reference><text>ref</text></reference>"
1291 "</length>"
1292 ELEMENT_WRAPPER_END;
1293 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1294 assert_string_equal(type.length->arg, "length-str");
1295 assert_string_equal(type.length->emsg, "err-msg");
1296 assert_string_equal(type.length->eapptag, "err-app-tag");
1297 assert_string_equal(type.length->dsc, "desc");
1298 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001299 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001300 lysp_type_free(st->ctx, &type);
1301 memset(&type, 0, sizeof(type));
1302
1303 /* min subelems */
1304 data = ELEMENT_WRAPPER_START
1305 "<length value=\"length-str\">"
1306 "</length>"
1307 ELEMENT_WRAPPER_END;
1308 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1309 assert_string_equal(type.length->arg, "length-str");
1310 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001311 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001312 memset(&type, 0, sizeof(type));
1313
1314 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
1315 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1316 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1317 lysp_type_free(st->ctx, &type);
1318 memset(&type, 0, sizeof(type));
1319
1320 st->finished_correctly = true;
1321}
1322
1323static void
1324test_modifier_elem(void **state)
1325{
1326 struct state *st = *state;
1327 const char *data;
1328 const char *pat = lydict_insert(st->ctx, "\006pattern", 8);
1329
1330 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\" />" ELEMENT_WRAPPER_END;
1331 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, true), LY_SUCCESS);
1332 assert_string_equal(pat, "\x015pattern");
1333 FREE_STRING(st->ctx, pat);
1334
1335 pat = lydict_insert(st->ctx, "\006pattern", 8);
1336 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
1337 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, false), LY_EVALID);
1338 logbuf_assert("Invalid value \"invert\" of \"modifier\". Line number 1.");
1339 FREE_STRING(st->ctx, pat);
1340
1341 st->finished_correctly = true;
1342}
1343
1344static void
1345test_namespace_elem(void **state)
1346{
1347 struct state *st = *state;
1348 const char *data;
1349 const char *ns;
1350
1351 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\"/>" ELEMENT_WRAPPER_END;
1352 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, true), LY_SUCCESS);
1353 assert_string_equal(ns, "ns");
1354 FREE_STRING(st->ctx, ns);
1355
1356 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
1357 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, false), LY_EVALID);
1358 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1359
1360 st->finished_correctly = true;
1361}
1362
1363static void
1364test_path_elem(void **state)
1365{
1366 struct state *st = *state;
1367 const char *data;
1368 struct lysp_type type = {};
1369
1370 data = ELEMENT_WRAPPER_START "<path value=\"path-val\"/>" ELEMENT_WRAPPER_END;
1371 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1372 assert_string_equal("path-val", type.path);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001373 assert_true(type.flags & LYS_SET_PATH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001374 lysp_type_free(st->ctx, &type);
1375
1376 st->finished_correctly = true;
1377}
1378
1379static void
1380test_pattern_elem(void **state)
1381{
1382 struct state *st = *state;
1383 const char *data;
1384 struct lysp_type type = {};
1385
1386 /* max subelems */
1387 data = ELEMENT_WRAPPER_START
1388 "<pattern value=\"super_pattern\">"
1389 "<modifier value=\"invert-match\"/>"
1390 "<error-message><value>err-msg-value</value></error-message>"
1391 "<error-app-tag value=\"err-app-tag-value\"/>"
1392 "<description><text>pattern-desc</text></description>"
1393 "<reference><text>pattern-ref</text></reference>"
1394 "</pattern>"
1395 ELEMENT_WRAPPER_END;
1396 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001397 assert_true(type.flags & LYS_SET_PATTERN);
David Sedlák8e7bda82019-07-16 17:57:50 +02001398 assert_string_equal(type.patterns->arg, "\x015super_pattern");
1399 assert_string_equal(type.patterns->dsc, "pattern-desc");
1400 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1401 assert_string_equal(type.patterns->emsg, "err-msg-value");
1402 assert_string_equal(type.patterns->dsc, "pattern-desc");
1403 assert_string_equal(type.patterns->ref, "pattern-ref");
1404 lysp_type_free(st->ctx, &type);
1405 memset(&type, 0, sizeof(type));
1406
1407 /* min subelems */
1408 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
1409 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1410 assert_string_equal(type.patterns->arg, "\x006pattern");
1411 lysp_type_free(st->ctx, &type);
1412 memset(&type, 0, sizeof(type));
1413
1414 st->finished_correctly = true;
1415}
1416
1417static void
1418test_value_position_elem(void **state)
1419{
1420 struct state *st = *state;
1421 const char *data;
1422 struct lysp_type_enum en = {};
1423
1424 /* valid values */
1425 data = ELEMENT_WRAPPER_START "<value value=\"55\" />" ELEMENT_WRAPPER_END;
1426 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1427 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001428 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001429 memset(&en, 0, sizeof(en));
1430
1431 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
1432 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1433 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001434 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001435 memset(&en, 0, sizeof(en));
1436
1437 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
1438 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1439 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001440 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001441 memset(&en, 0, sizeof(en));
1442
1443 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
1444 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1445 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001446 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001447 memset(&en, 0, sizeof(en));
1448
1449 /* valid positions */
1450 data = ELEMENT_WRAPPER_START "<position value=\"55\" />" ELEMENT_WRAPPER_END;
1451 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1452 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001453 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001454 memset(&en, 0, sizeof(en));
1455
1456 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
1457 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1458 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001459 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001460 memset(&en, 0, sizeof(en));
1461
1462 /* invalid values */
1463 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
1464 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1465 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\". Line number 1.");
1466
1467 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
1468 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1469 logbuf_assert("Invalid value \"1k\" of \"value\". Line number 1.");
1470
David Sedlák69f01612019-07-17 11:41:08 +02001471 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
1472 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1473 logbuf_assert("Invalid value \"\" of \"value\". Line number 1.");
1474
David Sedlák8e7bda82019-07-16 17:57:50 +02001475 /*invalid positions */
1476 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
1477 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1478 logbuf_assert("Invalid value \"-5\" of \"position\". Line number 1.");
1479
1480 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
1481 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1482 logbuf_assert("Invalid value \"-0\" of \"position\". Line number 1.");
1483
1484 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
1485 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1486 logbuf_assert("Invalid value \"99999999999999999999\" of \"position\". Line number 1.");
1487
David Sedlák69f01612019-07-17 11:41:08 +02001488 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
1489 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1490 logbuf_assert("Invalid value \"\" of \"position\". Line number 1.");
1491
1492 st->finished_correctly = true;
1493}
1494
1495static void
1496test_prefix_elem(void **state)
1497{
1498 struct state *st = *state;
1499 const char *data;
1500 const char *value = NULL;
1501
1502 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
1503 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
1504 assert_string_equal(value, "pref");
1505 FREE_STRING(st->ctx, value);
1506
1507 st->finished_correctly = true;
1508}
1509
1510static void
1511test_range_elem(void **state)
1512{
1513 struct state *st = *state;
1514 const char *data;
1515 struct lysp_type type = {};
1516
1517 /* max subelems */
1518 data = ELEMENT_WRAPPER_START
1519 "<range value=\"range-str\">"
1520 "<error-message><value>err-msg</value></error-message>"
1521 "<error-app-tag value=\"err-app-tag\" />"
1522 "<description><text>desc</text></description>"
1523 "<reference><text>ref</text></reference>"
1524 "</range>"
1525 ELEMENT_WRAPPER_END;
1526 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1527 assert_string_equal(type.range->arg, "range-str");
1528 assert_string_equal(type.range->dsc, "desc");
1529 assert_string_equal(type.range->eapptag, "err-app-tag");
1530 assert_string_equal(type.range->emsg, "err-msg");
1531 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001532 assert_true(type.flags & LYS_SET_RANGE);
David Sedlák69f01612019-07-17 11:41:08 +02001533 lysp_type_free(st->ctx, &type);
1534 memset(&type, 0, sizeof(type));
1535
1536 /* min subelems */
1537 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
1538 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1539 assert_string_equal(type.range->arg, "range-str");
1540 lysp_type_free(st->ctx, &type);
1541 memset(&type, 0, sizeof(type));
1542
1543 st->finished_correctly = true;
1544}
1545
1546static void
1547test_reqinstance_elem(void **state)
1548{
1549 struct state *st = *state;
1550 const char *data;
1551 struct lysp_type type = {};
1552
1553 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\"/>" ELEMENT_WRAPPER_END;
1554 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1555 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001556 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001557 memset(&type, 0, sizeof(type));
1558
1559 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
1560 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1561 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001562 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001563 memset(&type, 0, sizeof(type));
1564
1565 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1566 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1567 memset(&type, 0, sizeof(type));
1568 logbuf_assert("Invalid value \"invalid\" of \"require-instance\". Line number 1.");
1569
1570 st->finished_correctly = true;
1571}
1572
1573static void
1574test_revision_date_elem(void **state)
1575{
1576 struct state *st = *state;
1577 const char *data;
1578 char rev[LY_REV_SIZE];
1579
1580 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
1581 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, true), LY_SUCCESS);
1582 assert_string_equal(rev, "2000-01-01");
1583
1584 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
1585 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, false), LY_EVALID);
1586 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1587
1588 st->finished_correctly = true;
1589}
1590
1591static void
1592test_unique_elem(void **state)
1593{
1594 struct state *st = *state;
1595 const char *data;
1596 const char **values = NULL;
1597
1598 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
1599 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1600 assert_string_equal(*values, "tag");
1601 FREE_STRING(st->ctx, *values);
1602 LY_ARRAY_FREE(values);
1603
1604 st->finished_correctly = true;
1605}
1606
1607static void
1608test_units_elem(void **state)
1609{
1610 struct state *st = *state;
1611 const char *data;
1612 const char *values = NULL;
1613
1614 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
1615 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1616 assert_string_equal(values, "name");
1617 FREE_STRING(st->ctx, values);
1618
1619 st->finished_correctly = true;
1620}
1621
1622static void
1623test_when_elem(void **state)
1624{
1625 struct state *st = *state;
1626 const char *data;
1627 struct lysp_when *when = NULL;
1628
1629 data = ELEMENT_WRAPPER_START
1630 "<when condition=\"cond\">"
1631 "<description><text>desc</text></description>"
1632 "<reference><text>ref</text></reference>"
1633 "</when>"
1634 ELEMENT_WRAPPER_END;
1635 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1636 assert_string_equal(when->cond, "cond");
1637 assert_string_equal(when->dsc, "desc");
1638 assert_string_equal(when->ref, "ref");
1639 lysp_when_free(st->ctx, when);
1640 free(when);
1641 when = NULL;
1642
1643 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
1644 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1645 assert_string_equal(when->cond, "cond");
1646 lysp_when_free(st->ctx, when);
1647 free(when);
1648 when = NULL;
1649
1650 st->finished_correctly = true;
1651}
1652
1653static void
1654test_yin_text_value_elem(void **state)
1655{
1656 struct state *st = *state;
1657 const char *data;
1658 const char *val;
1659
1660 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
1661 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1662 assert_string_equal(val, "text");
1663 FREE_STRING(st->ctx, val);
1664
1665 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
1666 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1667 assert_string_equal(val, "text");
1668 FREE_STRING(st->ctx, val);
1669
1670 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
1671 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1672 assert_string_equal("", val);
1673 FREE_STRING(st->ctx, val);
1674
David Sedlák8e7bda82019-07-16 17:57:50 +02001675 st->finished_correctly = true;
1676}
David Sedlák32488102019-07-15 17:44:10 +02001677
David Sedlák374d2b32019-07-17 15:06:55 +02001678static void
1679test_type_elem(void **state)
1680{
1681 struct state *st = *state;
1682 const char *data;
1683 struct lysp_type type = {};
1684
1685 /* max subelems */
1686 data = ELEMENT_WRAPPER_START
1687 "<type name=\"type-name\">"
1688 "<base name=\"base-name\"/>"
1689 "<bit name=\"bit\"/>"
1690 "<enum name=\"enum\"/>"
1691 "<fraction-digits value=\"2\"/>"
1692 "<length value=\"length\"/>"
1693 "<path value=\"path\"/>"
1694 "<pattern value=\"pattern\"/>"
1695 "<range value=\"range\" />"
1696 "<require-instance value=\"true\"/>"
1697 "<type name=\"sub-type-name\"/>"
1698 "</type>"
1699 ELEMENT_WRAPPER_END;
1700 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1701 assert_string_equal(type.name, "type-name");
1702 assert_string_equal(*type.bases, "base-name");
1703 assert_string_equal(type.bits->name, "bit");
1704 assert_string_equal(type.enums->name, "enum");
1705 assert_int_equal(type.fraction_digits, 2);
1706 assert_string_equal(type.length->arg, "length");
1707 assert_string_equal(type.path, "path");
1708 assert_string_equal(type.patterns->arg, "\006pattern");
1709 assert_string_equal(type.range->arg, "range");
1710 assert_int_equal(type.require_instance, 1);
1711 assert_string_equal(type.types->name, "sub-type-name");
1712 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001713 assert_true(type.flags & LYS_SET_BASE);
1714 assert_true(type.flags & LYS_SET_BIT);
1715 assert_true(type.flags & LYS_SET_ENUM);
1716 assert_true(type.flags & LYS_SET_FRDIGITS);
1717 assert_true(type.flags & LYS_SET_LENGTH);
1718 assert_true(type.flags & LYS_SET_PATH);
1719 assert_true(type.flags & LYS_SET_PATTERN);
1720 assert_true(type.flags & LYS_SET_RANGE);
1721 assert_true(type.flags & LYS_SET_REQINST);
1722 assert_true(type.flags & LYS_SET_TYPE);
David Sedlák374d2b32019-07-17 15:06:55 +02001723 memset(&type, 0, sizeof(type));
1724
1725 /* min subelems */
1726 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
1727 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1728 lysp_type_free(st->ctx, &type);
1729 memset(&type, 0, sizeof(type));
1730
1731 st->finished_correctly = true;
1732}
1733
David Sedlák1af868e2019-07-17 17:03:14 +02001734static void
1735test_max_elems_elem(void **state)
1736{
1737 struct state *st = *state;
1738 const char *data;
1739 struct lysp_node_list list = {};
1740 struct lysp_node_leaflist llist = {};
1741 struct lysp_refine refine = {};
1742
1743 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"unbounded\"/> </refine>";
1744 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1745 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001746 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001747
1748 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"5\"/> </list>";
1749 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
1750 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001751 assert_true(list.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001752
1753 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"85\"/> </leaf-list>";
1754 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
1755 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001756 assert_true(llist.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001757
1758 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
1759 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1760 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001761 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001762
1763 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
1764 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1765 logbuf_assert("Invalid value \"0\" of \"max-elements\". Line number 1.");
1766
1767 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
1768 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1769 logbuf_assert("Invalid value \"-10\" of \"max-elements\". Line number 1.");
1770
1771 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
1772 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1773 logbuf_assert("Invalid value \"k\" of \"max-elements\". Line number 1.");
1774
1775 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
1776 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1777 logbuf_assert("Invalid value \"u12\" of \"max-elements\". Line number 1.");
1778
1779 st->finished_correctly = true;
1780}
1781
David Sedlák09e18c92019-07-18 11:17:11 +02001782static void
1783test_min_elems_elem(void **state)
1784{
1785 struct state *st = *state;
1786 const char *data;
1787 struct lysp_node_list list = {};
1788 struct lysp_node_leaflist llist = {};
1789 struct lysp_refine refine = {};
1790
1791 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"0\"/> </refine>";
1792 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1793 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001794 assert_true(refine.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001795
1796 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"41\"/> </list>";
1797 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
1798 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001799 assert_true(list.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001800
1801 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"50\"/> </leaf-list>";
1802 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
1803 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001804 assert_true(llist.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001805
1806 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
1807 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1808 logbuf_assert("Value \"-5\" is out of \"min-elements\" bounds. Line number 1.");
1809
1810 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
1811 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1812 logbuf_assert("Value \"99999999999999999\" is out of \"min-elements\" bounds. Line number 1.");
1813
1814 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
1815 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1816 logbuf_assert("Invalid value \"5k\" of \"min-elements\". Line number 1.");
1817
1818 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
1819 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1820 logbuf_assert("Invalid value \"05\" of \"min-elements\". Line number 1.");
1821
1822 st->finished_correctly = true;
1823}
1824
David Sedláka2dad212019-07-18 12:45:19 +02001825static void
1826test_ordby_elem(void **state)
1827{
1828 struct state *st = *state;
1829 const char *data;
1830 uint16_t flags = 0;
1831
1832 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\"/>" ELEMENT_WRAPPER_END;
1833 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001834 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedláka2dad212019-07-18 12:45:19 +02001835
1836 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
1837 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001838 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02001839
1840 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
1841 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1842 logbuf_assert("Invalid value \"inv\" of \"ordered-by\". Line number 1.");
1843
1844 st->finished_correctly = true;
1845}
1846
David Sedlák8a83bbb2019-07-18 14:46:00 +02001847static void
1848test_any_elem(void **state)
1849{
1850 struct state *st = *state;
1851 const char *data;
1852 struct lysp_node *siblings = NULL;
1853 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1854 struct lysp_node_anydata *parsed = NULL;
1855
1856 /* anyxml max subelems */
1857 data = ELEMENT_WRAPPER_START
1858 "<anyxml name=\"any-name\">"
1859 "<config value=\"true\" />"
1860 "<description><text>desc</text></description>"
1861 "<if-feature name=\"feature\" />"
1862 "<mandatory value=\"true\" />"
1863 "<must condition=\"must-cond\" />"
1864 "<reference><text>ref</text></reference>"
1865 "<status value=\"deprecated\"/>"
1866 "<when condition=\"when-cond\"/>"
1867 "</anyxml>"
1868 ELEMENT_WRAPPER_END;
1869 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1870 parsed = (struct lysp_node_anydata *)siblings;
1871 assert_null(parsed->parent);
1872 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001873 assert_true(parsed->flags & LYS_CONFIG_W);
1874 assert_true(parsed->flags & LYS_MAND_TRUE);
1875 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001876 assert_null(parsed->next);
1877 assert_string_equal(parsed->name, "any-name");
1878 assert_string_equal(parsed->dsc, "desc");
1879 assert_string_equal(parsed->ref, "ref");
1880 assert_string_equal(parsed->when->cond, "when-cond");
1881 assert_string_equal(*parsed->iffeatures, "feature");
1882 assert_null(parsed->exts);
1883 lysp_node_free(st->ctx, siblings);
1884 siblings = NULL;
1885
1886 /* anydata max subelems */
1887 data = ELEMENT_WRAPPER_START
1888 "<anydata name=\"any-name\">"
1889 "<config value=\"true\" />"
1890 "<description><text>desc</text></description>"
1891 "<if-feature name=\"feature\" />"
1892 "<mandatory value=\"true\" />"
1893 "<must condition=\"must-cond\" />"
1894 "<reference><text>ref</text></reference>"
1895 "<status value=\"deprecated\"/>"
1896 "<when condition=\"when-cond\"/>"
1897 "</anydata>"
1898 ELEMENT_WRAPPER_END;
1899 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1900 parsed = (struct lysp_node_anydata *)siblings;
1901 assert_null(parsed->parent);
1902 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001903 assert_true(parsed->flags & LYS_CONFIG_W);
1904 assert_true(parsed->flags & LYS_MAND_TRUE);
1905 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001906 assert_null(parsed->next);
1907 assert_string_equal(parsed->name, "any-name");
1908 assert_string_equal(parsed->dsc, "desc");
1909 assert_string_equal(parsed->ref, "ref");
1910 assert_string_equal(parsed->when->cond, "when-cond");
1911 assert_string_equal(*parsed->iffeatures, "feature");
1912 assert_null(parsed->exts);
1913 lysp_node_free(st->ctx, siblings);
1914 siblings = NULL;
1915
1916 /* min subelems */
1917 node_meta.parent = (void *)0x10;
1918 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
1919 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1920 parsed = (struct lysp_node_anydata *)siblings;
1921 assert_ptr_equal(parsed->parent, node_meta.parent);
1922 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
1923 assert_null(parsed->next);
1924 assert_null(parsed->exts);
1925 lysp_node_free(st->ctx, siblings);
1926
1927 st->finished_correctly = true;
1928}
1929
David Sedlák203ca3a2019-07-18 15:26:25 +02001930static void
1931test_leaf_elem(void **state)
1932{
1933 struct state *st = *state;
1934 const char *data;
1935 struct lysp_node *siblings = NULL;
1936 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1937 struct lysp_node_leaf *parsed = NULL;
1938
1939 /* max elements */
1940 data = ELEMENT_WRAPPER_START
1941 "<leaf name=\"leaf\">"
1942 "<config value=\"true\" />"
1943 "<default value=\"def-val\"/>"
1944 "<description><text>desc</text></description>"
1945 "<if-feature name=\"feature\" />"
1946 "<mandatory value=\"true\" />"
1947 "<must condition=\"must-cond\" />"
1948 "<reference><text>ref</text></reference>"
1949 "<status value=\"deprecated\"/>"
1950 "<type name=\"type\"/>"
1951 "<units name=\"uni\"/>"
1952 "<when condition=\"when-cond\"/>"
1953 "</leaf>"
1954 ELEMENT_WRAPPER_END;
1955 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1956 parsed = (struct lysp_node_leaf *)siblings;
1957 assert_null(parsed->parent);
1958 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001959 assert_true(parsed->flags & LYS_CONFIG_W);
1960 assert_true(parsed->flags & LYS_MAND_TRUE);
1961 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02001962 assert_null(parsed->next);
1963 assert_string_equal(parsed->name, "leaf");
1964 assert_string_equal(parsed->dsc, "desc");
1965 assert_string_equal(parsed->ref, "ref");
1966 assert_string_equal(parsed->when->cond, "when-cond");
1967 assert_string_equal(*parsed->iffeatures, "feature");
1968 assert_null(parsed->exts);
1969 assert_string_equal(parsed->musts->arg, "must-cond");
1970 assert_string_equal(parsed->type.name, "type");
1971 assert_string_equal(parsed->units, "uni");
1972 assert_string_equal(parsed->dflt, "def-val");
1973 lysp_node_free(st->ctx, siblings);
1974 siblings = NULL;
1975
1976 /* min elements */
1977 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
1978 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1979 parsed = (struct lysp_node_leaf *)siblings;
1980 assert_string_equal(parsed->name, "leaf");
1981 assert_string_equal(parsed->type.name, "type");
1982 lysp_node_free(st->ctx, siblings);
1983 siblings = NULL;
1984
1985 st->finished_correctly = true;
1986}
1987
David Sedlákc3da3ef2019-07-19 12:56:08 +02001988static void
1989test_leaf_list_elem(void **state)
1990{
1991 struct state *st = *state;
1992 const char *data;
1993 struct lysp_node *siblings = NULL;
1994 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1995 struct lysp_node_leaflist *parsed = NULL;
1996
1997 data = ELEMENT_WRAPPER_START
1998 "<leaf-list name=\"llist\">"
1999 "<config value=\"true\" />"
2000 "<default value=\"def-val0\"/>"
2001 "<default value=\"def-val1\"/>"
2002 "<description><text>desc</text></description>"
2003 "<if-feature name=\"feature\"/>"
2004 "<max-elements value=\"5\"/>"
2005 "<must condition=\"must-cond\"/>"
2006 "<ordered-by value=\"user\" />"
2007 "<reference><text>ref</text></reference>"
2008 "<status value=\"current\"/>"
2009 "<type name=\"type\"/>"
2010 "<units name=\"uni\"/>"
2011 "<when condition=\"when-cond\"/>"
2012 "</leaf-list>"
2013 ELEMENT_WRAPPER_END;
2014 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2015 parsed = (struct lysp_node_leaflist *)siblings;
2016 assert_string_equal(parsed->dflts[0], "def-val0");
2017 assert_string_equal(parsed->dflts[1], "def-val1");
2018 assert_string_equal(parsed->dsc, "desc");
2019 assert_string_equal(*parsed->iffeatures, "feature");
2020 assert_int_equal(parsed->max, 5);
2021 assert_string_equal(parsed->musts->arg, "must-cond");
2022 assert_string_equal(parsed->name, "llist");
2023 assert_null(parsed->next);
2024 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2025 assert_null(parsed->parent);
2026 assert_string_equal(parsed->ref, "ref");
2027 assert_string_equal(parsed->type.name, "type");
2028 assert_string_equal(parsed->units, "uni");
2029 assert_string_equal(parsed->when->cond, "when-cond");
2030 assert_true(parsed->flags & LYS_CONFIG_W);
2031 assert_true(parsed->flags & LYS_ORDBY_USER);
2032 assert_true(parsed->flags & LYS_STATUS_CURR);
2033 lysp_node_free(st->ctx, siblings);
2034 siblings = NULL;
2035
2036 data = ELEMENT_WRAPPER_START
2037 "<leaf-list name=\"llist\">"
2038 "<config value=\"true\" />"
2039 "<description><text>desc</text></description>"
2040 "<if-feature name=\"feature\"/>"
2041 "<min-elements value=\"5\"/>"
2042 "<must condition=\"must-cond\"/>"
2043 "<ordered-by value=\"user\" />"
2044 "<reference><text>ref</text></reference>"
2045 "<status value=\"current\"/>"
2046 "<type name=\"type\"/>"
2047 "<units name=\"uni\"/>"
2048 "<when condition=\"when-cond\"/>"
2049 "</leaf-list>"
2050 ELEMENT_WRAPPER_END;
2051 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2052 parsed = (struct lysp_node_leaflist *)siblings;
2053 assert_string_equal(parsed->dsc, "desc");
2054 assert_string_equal(*parsed->iffeatures, "feature");
2055 assert_int_equal(parsed->min, 5);
2056 assert_string_equal(parsed->musts->arg, "must-cond");
2057 assert_string_equal(parsed->name, "llist");
2058 assert_null(parsed->next);
2059 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2060 assert_null(parsed->parent);
2061 assert_string_equal(parsed->ref, "ref");
2062 assert_string_equal(parsed->type.name, "type");
2063 assert_string_equal(parsed->units, "uni");
2064 assert_string_equal(parsed->when->cond, "when-cond");
2065 assert_true(parsed->flags & LYS_CONFIG_W);
2066 assert_true(parsed->flags & LYS_ORDBY_USER);
2067 assert_true(parsed->flags & LYS_STATUS_CURR);
2068 lysp_node_free(st->ctx, siblings);
2069 siblings = NULL;
2070
2071 data = ELEMENT_WRAPPER_START
2072 "<leaf-list name=\"llist\">"
2073 "<config value=\"true\" />"
2074 "<description><text>desc</text></description>"
2075 "<if-feature name=\"feature\"/>"
2076 "<max-elements value=\"15\"/>"
2077 "<min-elements value=\"5\"/>"
2078 "<must condition=\"must-cond\"/>"
2079 "<ordered-by value=\"user\" />"
2080 "<reference><text>ref</text></reference>"
2081 "<status value=\"current\"/>"
2082 "<type name=\"type\"/>"
2083 "<units name=\"uni\"/>"
2084 "<when condition=\"when-cond\"/>"
2085 "</leaf-list>"
2086 ELEMENT_WRAPPER_END;
2087 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2088 parsed = (struct lysp_node_leaflist *)siblings;
2089 assert_string_equal(parsed->dsc, "desc");
2090 assert_string_equal(*parsed->iffeatures, "feature");
2091 assert_int_equal(parsed->min, 5);
2092 assert_int_equal(parsed->max, 15);
2093 assert_string_equal(parsed->musts->arg, "must-cond");
2094 assert_string_equal(parsed->name, "llist");
2095 assert_null(parsed->next);
2096 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2097 assert_null(parsed->parent);
2098 assert_string_equal(parsed->ref, "ref");
2099 assert_string_equal(parsed->type.name, "type");
2100 assert_string_equal(parsed->units, "uni");
2101 assert_string_equal(parsed->when->cond, "when-cond");
2102 assert_true(parsed->flags & LYS_CONFIG_W);
2103 assert_true(parsed->flags & LYS_ORDBY_USER);
2104 assert_true(parsed->flags & LYS_STATUS_CURR);
2105 lysp_node_free(st->ctx, siblings);
2106 siblings = NULL;
2107
2108 data = ELEMENT_WRAPPER_START
2109 "<leaf-list name=\"llist\">"
2110 "<type name=\"type\"/>"
2111 "</leaf-list>"
2112 ELEMENT_WRAPPER_END;
2113 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2114 parsed = (struct lysp_node_leaflist *)siblings;
2115 assert_string_equal(parsed->name, "llist");
2116 assert_string_equal(parsed->type.name, "type");
2117 lysp_node_free(st->ctx, siblings);
2118 siblings = NULL;
2119
2120 /* invalid combinations */
2121 data = ELEMENT_WRAPPER_START
2122 "<leaf-list name=\"llist\">"
2123 "<max-elements value=\"5\"/>"
2124 "<min-elements value=\"15\"/>"
2125 "<type name=\"type\"/>"
2126 "</leaf-list>"
2127 ELEMENT_WRAPPER_END;
2128 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2129 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2130 lysp_node_free(st->ctx, siblings);
2131 siblings = NULL;
2132
2133 data = ELEMENT_WRAPPER_START
2134 "<leaf-list name=\"llist\">"
2135 "<default value=\"def-val1\"/>"
2136 "<min-elements value=\"15\"/>"
2137 "<type name=\"type\"/>"
2138 "</leaf-list>"
2139 ELEMENT_WRAPPER_END;
2140 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2141 logbuf_assert("Invalid combination of keywords \"min-elements\" and \"default\" as substatements of \"leaf-list\". Line number 1.");
2142 lysp_node_free(st->ctx, siblings);
2143 siblings = NULL;
2144
2145 data = ELEMENT_WRAPPER_START
2146 "<leaf-list name=\"llist\">"
2147 "</leaf-list>"
2148 ELEMENT_WRAPPER_END;
2149 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2150 logbuf_assert("Missing mandatory subelement type of leaf-list element. Line number 1.");
2151 lysp_node_free(st->ctx, siblings);
2152 siblings = NULL;
2153
2154 st->finished_correctly = true;
2155}
2156
David Sedlákcb39f642019-07-19 13:19:55 +02002157static void
2158test_presence_elem(void **state)
2159{
2160 struct state *st = *state;
2161 const char *data;
2162 const char *val;
2163
2164 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
2165 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2166 assert_string_equal(val, "presence-val");
2167 FREE_STRING(st->ctx, val);
2168
2169 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
2170 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2171 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2172
2173 st->finished_correctly = true;
2174}
2175
David Sedlák12470a82019-07-19 13:44:36 +02002176static void
2177test_key_elem(void **state)
2178{
2179 struct state *st = *state;
2180 const char *data;
2181 const char *val;
2182
2183 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
2184 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2185 assert_string_equal(val, "key-value");
2186 FREE_STRING(st->ctx, val);
2187
2188 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
2189 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2190 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2191
2192 st->finished_correctly = true;
2193}
2194
David Sedlák04e17b22019-07-19 15:29:48 +02002195static void
2196test_typedef_elem(void **state)
2197{
2198 struct state *st = *state;
2199 const char *data;
2200 struct lysp_tpdf *tpdfs = NULL;
2201 struct typedef_meta typdef_meta = {NULL, &tpdfs};
2202
2203 data = ELEMENT_WRAPPER_START
2204 "<typedef name=\"tpdf-name\">"
2205 "<default value=\"def-val\"/>"
2206 "<description><text>desc-text</text></description>"
2207 "<reference><text>ref-text</text></reference>"
2208 "<status value=\"current\"/>"
2209 "<type name=\"type\"/>"
2210 "<units name=\"uni\"/>"
2211 "</typedef>"
2212 ELEMENT_WRAPPER_END;
2213 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2214 assert_string_equal(tpdfs[0].dflt, "def-val");
2215 assert_string_equal(tpdfs[0].dsc, "desc-text");
2216 assert_null(tpdfs[0].exts);
2217 assert_string_equal(tpdfs[0].name, "tpdf-name");
2218 assert_string_equal(tpdfs[0].ref, "ref-text");
2219 assert_string_equal(tpdfs[0].type.name, "type");
2220 assert_string_equal(tpdfs[0].units, "uni");
2221 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
2222 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2223 tpdfs = NULL;
2224
2225 data = ELEMENT_WRAPPER_START
2226 "<typedef name=\"tpdf-name\">"
2227 "<type name=\"type\"/>"
2228 "</typedef>"
2229 ELEMENT_WRAPPER_END;
2230 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2231 assert_string_equal(tpdfs[0].name, "tpdf-name");
2232 assert_string_equal(tpdfs[0].type.name, "type");
2233 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2234 tpdfs = NULL;
2235
2236 st->finished_correctly = true;
2237}
2238
David Sedlák3b4db242018-10-19 16:11:01 +02002239int
2240main(void)
2241{
2242
2243 const struct CMUnitTest tests[] = {
David Sedlák392af4f2019-06-04 16:02:42 +02002244 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_f, teardown_f),
David Sedlák8f7a1172019-06-20 14:42:18 +02002245 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02002246 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
2247 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák555c7202019-07-04 12:14:12 +02002248 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02002249 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02002250
David Sedlák8e7bda82019-07-16 17:57:50 +02002251 cmocka_unit_test(test_yin_match_argument_name),
David Sedlák32488102019-07-15 17:44:10 +02002252 cmocka_unit_test_setup_teardown(test_enum_bit_elem, setup_element_test, teardown_element_test),
2253 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_element_test),
2254 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_element_test),
2255 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_element_test),
2256 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_element_test),
2257 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_element_test),
2258 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_element_test),
2259 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02002260 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_element_test),
2261 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_element_test),
2262 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_element_test),
2263 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_element_test),
2264 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_element_test),
2265 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_element_test),
2266 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_element_test),
2267 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_element_test),
2268 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_element_test),
2269 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_element_test),
2270 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_element_test),
2271 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_element_test),
2272 cmocka_unit_test_setup_teardown(test_path_elem, setup_element_test, teardown_element_test),
2273 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_element_test),
2274 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_element_test),
David Sedlák69f01612019-07-17 11:41:08 +02002275 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_element_test),
2276 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_element_test),
2277 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_element_test),
2278 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_element_test),
2279 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_element_test),
2280 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_element_test),
2281 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_element_test),
2282 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_element_test),
David Sedlák374d2b32019-07-17 15:06:55 +02002283 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_element_test),
David Sedlák1af868e2019-07-17 17:03:14 +02002284 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_element_test),
David Sedlák09e18c92019-07-18 11:17:11 +02002285 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_element_test),
David Sedláka2dad212019-07-18 12:45:19 +02002286 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_element_test),
David Sedlák8a83bbb2019-07-18 14:46:00 +02002287 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02002288 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_element_test),
David Sedlákc3da3ef2019-07-19 12:56:08 +02002289 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_element_test),
David Sedlákcb39f642019-07-19 13:19:55 +02002290 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_element_test),
David Sedlák12470a82019-07-19 13:44:36 +02002291 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_element_test),
David Sedlák04e17b22019-07-19 15:29:48 +02002292 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02002293
David Sedlák3b4db242018-10-19 16:11:01 +02002294 };
2295
David Sedlák8e7bda82019-07-16 17:57:50 +02002296 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02002297}