blob: 03d145c1e2ee635f5c4fbaffda7c23d47db7b97a [file] [log] [blame]
David Sedlákb1ce3f82019-06-05 14:37:26 +02001/**
2 * @file test_parser_yin.c
3 * @author David Sedlák <xsedla1d@stud.fit.vutbr.cz>
4 * @brief unit tests for functions from parser_yin.c
5 *
6 * Copyright (c) 2015 - 2019 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
David Sedlák3b4db242018-10-19 16:11:01 +020015#include <stdarg.h>
16#include <stddef.h>
17#include <setjmp.h>
18#include <cmocka.h>
19
20#include <stdio.h>
21#include <string.h>
David Sedlák79e50cb2019-06-05 16:33:09 +020022#include <stdbool.h>
David Sedlák3b4db242018-10-19 16:11:01 +020023
David Sedlákecf5eb82019-06-03 14:12:44 +020024#include "../../src/common.h"
25#include "../../src/tree_schema.h"
26#include "../../src/tree_schema_internal.h"
27#include "../../src/parser_yin.h"
David Sedlák8f5bce02019-06-03 16:41:08 +020028#include "../../src/xml.h"
David Sedlák3b4db242018-10-19 16:11:01 +020029
David Sedlák555c7202019-07-04 12:14:12 +020030/* prototypes of static functions */
31void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
David Sedlák986cb412019-07-04 13:10:11 +020032void lysp_ext_free(struct ly_ctx *ctx, struct lysp_ext *ext);
David Sedlák32eee7b2019-07-09 12:38:44 +020033void lysp_when_free(struct ly_ctx *ctx, struct lysp_when *when);
David Sedlák32488102019-07-15 17:44:10 +020034void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
David Sedlák8a83bbb2019-07-18 14:46:00 +020035void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
David Sedlák04e17b22019-07-19 15:29:48 +020036void lysp_tpdf_free(struct ly_ctx *ctx, struct lysp_tpdf *tpdf);
David Sedlákd2d676a2019-07-22 11:28:19 +020037void lysp_refine_free(struct ly_ctx *ctx, struct lysp_refine *ref);
David Sedlákaa854b02019-07-22 14:17:10 +020038void lysp_revision_free(struct ly_ctx *ctx, struct lysp_revision *rev);
David Sedlák555c7202019-07-04 12:14:12 +020039
David Sedlák68a1af12019-03-08 13:46:54 +010040struct state {
David Sedlák3b4db242018-10-19 16:11:01 +020041 struct ly_ctx *ctx;
David Sedlák3017da42019-02-15 09:48:04 +010042 struct lys_module *mod;
David Sedlák619db942019-07-03 14:47:30 +020043 struct lysp_module *lysp_mod;
David Sedlákda8ffa32019-07-08 14:17:10 +020044 struct yin_parser_ctx *yin_ctx;
David Sedlák79e50cb2019-06-05 16:33:09 +020045 bool finished_correctly;
David Sedlák68a1af12019-03-08 13:46:54 +010046};
David Sedlák872c7b42018-10-26 13:15:20 +020047
David Sedlák79e50cb2019-06-05 16:33:09 +020048#define BUFSIZE 1024
49char logbuf[BUFSIZE] = {0};
50int store = -1; /* negative for infinite logging, positive for limited logging */
51
52/* set to 0 to printing error messages to stderr instead of checking them in code */
David Sedlák203ca3a2019-07-18 15:26:25 +020053#define ENABLE_LOGGER_CHECKING 1
David Sedlák79e50cb2019-06-05 16:33:09 +020054
55#if ENABLE_LOGGER_CHECKING
56static void
57logger(LY_LOG_LEVEL level, const char *msg, const char *path)
58{
59 (void) level; /* unused */
60 if (store) {
61 if (path && path[0]) {
62 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
63 } else {
64 strncpy(logbuf, msg, BUFSIZE - 1);
65 }
66 if (store > 0) {
67 --store;
68 }
69 }
70}
71#endif
72
73#if ENABLE_LOGGER_CHECKING
74# define logbuf_assert(str) assert_string_equal(logbuf, str)
75#else
76# define logbuf_assert(str)
77#endif
78
79#define TEST_DUP_GENERIC(PREFIX, MEMBER, VALUE1, VALUE2, FUNC, RESULT, LINE, CLEANUP) \
80 str = PREFIX MEMBER" "VALUE1";"MEMBER" "VALUE2";} ..."; \
81 assert_int_equal(LY_EVALID, FUNC(&ctx, &str, RESULT)); \
82 logbuf_assert("Duplicate keyword \""MEMBER"\". Line number "LINE"."); \
83 CLEANUP
84
David Sedlák8e7bda82019-07-16 17:57:50 +020085int
86setup_ly_ctx(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +010087{
88 struct state *st = NULL;
David Sedlák3b4db242018-10-19 16:11:01 +020089
David Sedlák68a1af12019-03-08 13:46:54 +010090 /* allocate state variable */
91 (*state) = st = calloc(1, sizeof(*st));
92 if (!st) {
93 fprintf(stderr, "Memmory allocation failed");
94 return EXIT_FAILURE;
95 }
David Sedlák872c7b42018-10-26 13:15:20 +020096
David Sedlák68a1af12019-03-08 13:46:54 +010097 /* create new libyang context */
98 ly_ctx_new(NULL, 0, &st->ctx);
David Sedlák872c7b42018-10-26 13:15:20 +020099
David Sedlák8e7bda82019-07-16 17:57:50 +0200100 return EXIT_SUCCESS;
101}
102
103int
104destroy_ly_ctx(void **state)
105{
106 struct state *st = *state;
107 ly_ctx_destroy(st->ctx, NULL);
108 free(st);
109
110 return EXIT_SUCCESS;
111}
112
113static int
114setup_f(void **state)
115{
116 struct state *st = *state;
117
118#if ENABLE_LOGGER_CHECKING
119 /* setup logger */
120 ly_set_log_clb(logger, 1);
121#endif
122
David Sedlák68a1af12019-03-08 13:46:54 +0100123 /* allocate new module */
124 st->mod = calloc(1, sizeof(*st->mod));
125 st->mod->ctx = st->ctx;
126
David Sedlák619db942019-07-03 14:47:30 +0200127 /* allocate new parsed module */
128 st->lysp_mod = calloc(1, sizeof(*st->lysp_mod));
129 st->lysp_mod->mod = calloc(1, sizeof(*st->lysp_mod->mod));
130 st->lysp_mod->mod->ctx = st->ctx;
131
132 /* allocate parser context */
David Sedlákda8ffa32019-07-08 14:17:10 +0200133 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
134 st->yin_ctx->xml_ctx.ctx = st->ctx;
135 st->yin_ctx->xml_ctx.line = 1;
David Sedlák8f5bce02019-06-03 16:41:08 +0200136
David Sedlák68a1af12019-03-08 13:46:54 +0100137 return EXIT_SUCCESS;
David Sedlák3b4db242018-10-19 16:11:01 +0200138}
139
140static int
David Sedlák68a1af12019-03-08 13:46:54 +0100141teardown_f(void **state)
142{
143 struct state *st = *(struct state **)state;
David Sedlák619db942019-07-03 14:47:30 +0200144 struct lys_module *temp;
David Sedlák68a1af12019-03-08 13:46:54 +0100145
David Sedlák79e50cb2019-06-05 16:33:09 +0200146#if ENABLE_LOGGER_CHECKING
147 /* teardown logger */
148 if (!st->finished_correctly && logbuf[0] != '\0') {
149 fprintf(stderr, "%s\n", logbuf);
150 }
151#endif
152
David Sedlák619db942019-07-03 14:47:30 +0200153 temp = st->lysp_mod->mod;
154
David Sedlákda8ffa32019-07-08 14:17:10 +0200155 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100156 lys_module_free(st->mod, NULL);
David Sedlák619db942019-07-03 14:47:30 +0200157 lysp_module_free(st->lysp_mod);
158 lys_module_free(temp, NULL);
David Sedlákda8ffa32019-07-08 14:17:10 +0200159 free(st->yin_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100160
161 return EXIT_SUCCESS;
162}
163
David Sedlák392af4f2019-06-04 16:02:42 +0200164static struct state*
165reset_state(void **state)
166{
David Sedlák79e50cb2019-06-05 16:33:09 +0200167 ((struct state *)*state)->finished_correctly = true;
David Sedlák555c7202019-07-04 12:14:12 +0200168 logbuf[0] = '\0';
David Sedlák392af4f2019-06-04 16:02:42 +0200169 teardown_f(state);
170 setup_f(state);
171
172 return *state;
173}
174
David Sedlák79e50cb2019-06-05 16:33:09 +0200175void
176logbuf_clean(void)
177{
178 logbuf[0] = '\0';
179}
180
David Sedlák68a1af12019-03-08 13:46:54 +0100181static void
David Sedlák392af4f2019-06-04 16:02:42 +0200182test_yin_parse_module(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100183{
184 LY_ERR ret = LY_SUCCESS;
185 struct state *st = *state;
186
187 ret = yin_parse_module(st->ctx,
David Sedlák2b214ac2019-06-06 16:11:03 +0200188 "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\
189 name=\"example-foo\"\
David Sedlák18730132019-03-15 15:51:34 +0100190 xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\
191 xmlns:foo=\"urn:example:foo\"\
192 xmlns:myext=\"urn:example:extensions\">\
David Sedlákcd0c9512019-03-29 13:23:06 +0100193 <namespace uri=\"urn:example:foo\" xmlns:myext=\"urn:example:extensions\"/>\
David Sedláka7406952019-04-05 10:33:07 +0200194 <prefix xmlns:myxt=\"urn:emple:extensions\" value=\"foo\" xmlns:myext=\"urn:example:extensions\"/>\
David Sedlákd9d3a312019-06-04 09:47:10 +0200195 </module>",
David Sedlák68a1af12019-03-08 13:46:54 +0100196 st->mod);
197
198 assert_int_equal(ret, LY_SUCCESS);
199 assert_string_equal(st->mod->parsed->mod->name, "example-foo");
200 assert_string_equal(st->mod->parsed->mod->prefix, "foo");
David Sedlákcd0c9512019-03-29 13:23:06 +0100201 assert_string_equal(st->mod->parsed->mod->ns, "urn:example:foo");
David Sedlák392af4f2019-06-04 16:02:42 +0200202
203 st = reset_state(state);
204 ret = yin_parse_module(st->ctx,
David Sedlák2b214ac2019-06-06 16:11:03 +0200205 "<module name=\"example-foo\">\
206 <invalid-tag uri=\"urn:example:foo\"\"/>\
207 </module>",
208 st->mod);
David Sedlák392af4f2019-06-04 16:02:42 +0200209 assert_int_equal(ret, LY_EVALID);
210
211 st = reset_state(state);
212 ret = yin_parse_module(st->ctx,
David Sedlák8f7a1172019-06-20 14:42:18 +0200213 "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\
David Sedlák57715b12019-06-17 13:05:22 +0200214 </module>",
David Sedlák2b214ac2019-06-06 16:11:03 +0200215 st->mod);
David Sedlák392af4f2019-06-04 16:02:42 +0200216 assert_int_equal(ret, LY_EVALID);
David Sedlák882a8072019-07-08 17:51:20 +0200217 logbuf_assert("Missing mandatory attribute name of module element. Line number 1.");
David Sedlák392af4f2019-06-04 16:02:42 +0200218
219 st = reset_state(state);
220 ret = yin_parse_module(st->ctx,
221 "",
222 st->mod);
223 assert_int_equal(ret, LY_EVALID);
David Sedlák79e50cb2019-06-05 16:33:09 +0200224 logbuf_assert("Invalid keyword \"(null)\", expected \"module\" or \"submodule\". Line number 1.");
225 st->finished_correctly = true;
David Sedlák3b4db242018-10-19 16:11:01 +0200226}
227
228static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200229test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200230{
David Sedlák8f7a1172019-06-20 14:42:18 +0200231 struct state *st = *state;
David Sedlák3b4db242018-10-19 16:11:01 +0200232
David Sedlák8f7a1172019-06-20 14:42:18 +0200233 const char *prefix, *name;
234 struct yin_arg_record *args = NULL;
235 size_t prefix_len, name_len;
236 /* create mock yin namespace in xml context */
237 const char *data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200238 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
239 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák8f7a1172019-06-20 14:42:18 +0200240 LY_ARRAY_FREE(args);
241
David Sedlákc1771b12019-07-10 15:55:46 +0200242 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydatax", strlen("anydatax"), prefix, prefix_len, YANG_NONE), YANG_NONE);
243 assert_int_equal(yin_match_keyword(st->yin_ctx, "asdasd", strlen("asdasd"), prefix, prefix_len, YANG_NONE), YANG_NONE);
244 assert_int_equal(yin_match_keyword(st->yin_ctx, "", 0, prefix, prefix_len, YANG_NONE), YANG_NONE);
245 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydata", strlen("anydata"), prefix, prefix_len, YANG_NONE), YANG_ANYDATA);
246 assert_int_equal(yin_match_keyword(st->yin_ctx, "anyxml", strlen("anyxml"), prefix, prefix_len, YANG_NONE), YANG_ANYXML);
247 assert_int_equal(yin_match_keyword(st->yin_ctx, "argument", strlen("argument"), prefix, prefix_len, YANG_NONE), YANG_ARGUMENT);
248 assert_int_equal(yin_match_keyword(st->yin_ctx, "augment", strlen("augment"), prefix, prefix_len, YANG_NONE), YANG_AUGMENT);
249 assert_int_equal(yin_match_keyword(st->yin_ctx, "base", strlen("base"), prefix, prefix_len, YANG_NONE), YANG_BASE);
250 assert_int_equal(yin_match_keyword(st->yin_ctx, "belongs-to", strlen("belongs-to"), prefix, prefix_len, YANG_NONE), YANG_BELONGS_TO);
251 assert_int_equal(yin_match_keyword(st->yin_ctx, "bit", strlen("bit"), prefix, prefix_len, YANG_NONE), YANG_BIT);
252 assert_int_equal(yin_match_keyword(st->yin_ctx, "case", strlen("case"), prefix, prefix_len, YANG_NONE), YANG_CASE);
253 assert_int_equal(yin_match_keyword(st->yin_ctx, "choice", strlen("choice"), prefix, prefix_len, YANG_NONE), YANG_CHOICE);
254 assert_int_equal(yin_match_keyword(st->yin_ctx, "config", strlen("config"), prefix, prefix_len, YANG_NONE), YANG_CONFIG);
255 assert_int_equal(yin_match_keyword(st->yin_ctx, "contact", strlen("contact"), prefix, prefix_len, YANG_NONE), YANG_CONTACT);
256 assert_int_equal(yin_match_keyword(st->yin_ctx, "container", strlen("container"), prefix, prefix_len, YANG_NONE), YANG_CONTAINER);
257 assert_int_equal(yin_match_keyword(st->yin_ctx, "default", strlen("default"), prefix, prefix_len, YANG_NONE), YANG_DEFAULT);
258 assert_int_equal(yin_match_keyword(st->yin_ctx, "description", strlen("description"), prefix, prefix_len, YANG_NONE), YANG_DESCRIPTION);
259 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviate", strlen("deviate"), prefix, prefix_len, YANG_NONE), YANG_DEVIATE);
260 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviation", strlen("deviation"), prefix, prefix_len, YANG_NONE), YANG_DEVIATION);
261 assert_int_equal(yin_match_keyword(st->yin_ctx, "enum", strlen("enum"), prefix, prefix_len, YANG_NONE), YANG_ENUM);
262 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);
263 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-message", strlen("error-message"), prefix, prefix_len, YANG_NONE), YANG_ERROR_MESSAGE);
264 assert_int_equal(yin_match_keyword(st->yin_ctx, "extension", strlen("extension"), prefix, prefix_len, YANG_NONE), YANG_EXTENSION);
265 assert_int_equal(yin_match_keyword(st->yin_ctx, "feature", strlen("feature"), prefix, prefix_len, YANG_NONE), YANG_FEATURE);
266 assert_int_equal(yin_match_keyword(st->yin_ctx, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, YANG_NONE), YANG_FRACTION_DIGITS);
267 assert_int_equal(yin_match_keyword(st->yin_ctx, "grouping", strlen("grouping"), prefix, prefix_len, YANG_NONE), YANG_GROUPING);
268 assert_int_equal(yin_match_keyword(st->yin_ctx, "identity", strlen("identity"), prefix, prefix_len, YANG_NONE), YANG_IDENTITY);
269 assert_int_equal(yin_match_keyword(st->yin_ctx, "if-feature", strlen("if-feature"), prefix, prefix_len, YANG_NONE), YANG_IF_FEATURE);
270 assert_int_equal(yin_match_keyword(st->yin_ctx, "import", strlen("import"), prefix, prefix_len, YANG_NONE), YANG_IMPORT);
271 assert_int_equal(yin_match_keyword(st->yin_ctx, "include", strlen("include"), prefix, prefix_len, YANG_NONE), YANG_INCLUDE);
272 assert_int_equal(yin_match_keyword(st->yin_ctx, "input", strlen("input"), prefix, prefix_len, YANG_NONE), YANG_INPUT);
273 assert_int_equal(yin_match_keyword(st->yin_ctx, "key", strlen("key"), prefix, prefix_len, YANG_NONE), YANG_KEY);
274 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf", strlen("leaf"), prefix, prefix_len, YANG_NONE), YANG_LEAF);
275 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf-list", strlen("leaf-list"), prefix, prefix_len, YANG_NONE), YANG_LEAF_LIST);
276 assert_int_equal(yin_match_keyword(st->yin_ctx, "length", strlen("length"), prefix, prefix_len, YANG_NONE), YANG_LENGTH);
277 assert_int_equal(yin_match_keyword(st->yin_ctx, "list", strlen("list"), prefix, prefix_len, YANG_NONE), YANG_LIST);
278 assert_int_equal(yin_match_keyword(st->yin_ctx, "mandatory", strlen("mandatory"), prefix, prefix_len, YANG_NONE), YANG_MANDATORY);
279 assert_int_equal(yin_match_keyword(st->yin_ctx, "max-elements", strlen("max-elements"), prefix, prefix_len, YANG_NONE), YANG_MAX_ELEMENTS);
280 assert_int_equal(yin_match_keyword(st->yin_ctx, "min-elements", strlen("min-elements"), prefix, prefix_len, YANG_NONE), YANG_MIN_ELEMENTS);
281 assert_int_equal(yin_match_keyword(st->yin_ctx, "modifier", strlen("modifier"), prefix, prefix_len, YANG_NONE), YANG_MODIFIER);
282 assert_int_equal(yin_match_keyword(st->yin_ctx, "module", strlen("module"), prefix, prefix_len, YANG_NONE), YANG_MODULE);
283 assert_int_equal(yin_match_keyword(st->yin_ctx, "must", strlen("must"), prefix, prefix_len, YANG_NONE), YANG_MUST);
284 assert_int_equal(yin_match_keyword(st->yin_ctx, "namespace", strlen("namespace"), prefix, prefix_len, YANG_NONE), YANG_NAMESPACE);
285 assert_int_equal(yin_match_keyword(st->yin_ctx, "notification", strlen("notification"), prefix, prefix_len, YANG_NONE), YANG_NOTIFICATION);
286 assert_int_equal(yin_match_keyword(st->yin_ctx, "ordered-by", strlen("ordered-by"), prefix, prefix_len, YANG_NONE), YANG_ORDERED_BY);
287 assert_int_equal(yin_match_keyword(st->yin_ctx, "organization", strlen("organization"), prefix, prefix_len, YANG_NONE), YANG_ORGANIZATION);
288 assert_int_equal(yin_match_keyword(st->yin_ctx, "output", strlen("output"), prefix, prefix_len, YANG_NONE), YANG_OUTPUT);
289 assert_int_equal(yin_match_keyword(st->yin_ctx, "path", strlen("path"), prefix, prefix_len, YANG_NONE), YANG_PATH);
290 assert_int_equal(yin_match_keyword(st->yin_ctx, "pattern", strlen("pattern"), prefix, prefix_len, YANG_NONE), YANG_PATTERN);
291 assert_int_equal(yin_match_keyword(st->yin_ctx, "position", strlen("position"), prefix, prefix_len, YANG_NONE), YANG_POSITION);
292 assert_int_equal(yin_match_keyword(st->yin_ctx, "prefix", strlen("prefix"), prefix, prefix_len, YANG_NONE), YANG_PREFIX);
293 assert_int_equal(yin_match_keyword(st->yin_ctx, "presence", strlen("presence"), prefix, prefix_len, YANG_NONE), YANG_PRESENCE);
294 assert_int_equal(yin_match_keyword(st->yin_ctx, "range", strlen("range"), prefix, prefix_len, YANG_NONE), YANG_RANGE);
295 assert_int_equal(yin_match_keyword(st->yin_ctx, "reference", strlen("reference"), prefix, prefix_len, YANG_NONE), YANG_REFERENCE);
296 assert_int_equal(yin_match_keyword(st->yin_ctx, "refine", strlen("refine"), prefix, prefix_len, YANG_NONE), YANG_REFINE);
297 assert_int_equal(yin_match_keyword(st->yin_ctx, "require-instance", strlen("require-instance"), prefix, prefix_len, YANG_NONE), YANG_REQUIRE_INSTANCE);
298 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision", strlen("revision"), prefix, prefix_len, YANG_NONE), YANG_REVISION);
299 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision-date", strlen("revision-date"), prefix, prefix_len, YANG_NONE), YANG_REVISION_DATE);
300 assert_int_equal(yin_match_keyword(st->yin_ctx, "rpc", strlen("rpc"), prefix, prefix_len, YANG_NONE), YANG_RPC);
301 assert_int_equal(yin_match_keyword(st->yin_ctx, "status", strlen("status"), prefix, prefix_len, YANG_NONE), YANG_STATUS);
302 assert_int_equal(yin_match_keyword(st->yin_ctx, "submodule", strlen("submodule"), prefix, prefix_len, YANG_NONE), YANG_SUBMODULE);
303 assert_int_equal(yin_match_keyword(st->yin_ctx, "type", strlen("type"), prefix, prefix_len, YANG_NONE), YANG_TYPE);
304 assert_int_equal(yin_match_keyword(st->yin_ctx, "typedef", strlen("typedef"), prefix, prefix_len, YANG_NONE), YANG_TYPEDEF);
305 assert_int_equal(yin_match_keyword(st->yin_ctx, "unique", strlen("unique"), prefix, prefix_len, YANG_NONE), YANG_UNIQUE);
306 assert_int_equal(yin_match_keyword(st->yin_ctx, "units", strlen("units"), prefix, prefix_len, YANG_NONE), YANG_UNITS);
307 assert_int_equal(yin_match_keyword(st->yin_ctx, "uses", strlen("uses"), prefix, prefix_len, YANG_NONE), YANG_USES);
308 assert_int_equal(yin_match_keyword(st->yin_ctx, "value", strlen("value"), prefix, prefix_len, YANG_NONE), YANG_VALUE);
309 assert_int_equal(yin_match_keyword(st->yin_ctx, "when", strlen("when"), prefix, prefix_len, YANG_NONE), YANG_WHEN);
310 assert_int_equal(yin_match_keyword(st->yin_ctx, "yang-version", strlen("yang-version"), prefix, prefix_len, YANG_NONE), YANG_YANG_VERSION);
311 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 +0200312
313 st->finished_correctly = true;
David Sedlák872c7b42018-10-26 13:15:20 +0200314}
David Sedlák3b4db242018-10-19 16:11:01 +0200315
David Sedlák872c7b42018-10-26 13:15:20 +0200316static void
David Sedlák060b00e2019-06-19 11:12:06 +0200317test_yin_match_argument_name(void **state)
David Sedlák872c7b42018-10-26 13:15:20 +0200318{
David Sedlák68a1af12019-03-08 13:46:54 +0100319 (void)state; /* unused */
David Sedlák872c7b42018-10-26 13:15:20 +0200320
David Sedlák060b00e2019-06-19 11:12:06 +0200321 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
322 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
323 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
324 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
325 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
326 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
327 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
328 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
329 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
330 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
331 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
332 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200333}
334
David Sedlák68a1af12019-03-08 13:46:54 +0100335static void
David Sedlákb1a78352019-06-28 16:16:29 +0200336test_yin_parse_element_generic(void **state)
337{
338 const char *prefix, *name;
339 struct state *st = *state;
340 struct lysp_ext_instance exts;
341 size_t prefix_len, name_len;
342 LY_ERR ret;
343
344 memset(&exts, 0, sizeof(exts));
345
346 const char *data = "<elem attr=\"value\">text_value</elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200347 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
348 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 +0200349 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200350 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200351 assert_string_equal(exts.child->stmt, "elem");
352 assert_string_equal(exts.child->arg, "text_value");
David Sedlákb1a78352019-06-28 16:16:29 +0200353 assert_string_equal(exts.child->child->stmt, "attr");
354 assert_string_equal(exts.child->child->arg, "value");
355 assert_true(exts.child->child->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200356 lysp_ext_instance_free(st->ctx, &exts);
David Sedlák5392a212019-07-01 09:19:10 +0200357 st = reset_state(state);
358
359 data = "<elem></elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200360 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
361 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 +0200362 assert_int_equal(ret, LY_SUCCESS);
363 assert_string_equal(exts.child->stmt, "elem");
364 assert_null(exts.child->child);
365 assert_null(exts.child->arg);
David Sedlákda8ffa32019-07-08 14:17:10 +0200366 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák5392a212019-07-01 09:19:10 +0200367 lysp_ext_instance_free(st->ctx, &exts);
368
David Sedlákb1a78352019-06-28 16:16:29 +0200369 st->finished_correctly = true;
370}
371
372static void
373test_yin_parse_extension_instance(void **state)
374{
375 LY_ERR ret;
376 struct state *st = *state;
377 const char *prefix, *name;
378 size_t prefix_len, name_len;
379 struct yin_arg_record *args = NULL;
380 struct lysp_ext_instance *exts = NULL;
David Sedlákb1a78352019-06-28 16:16:29 +0200381 const char *data = "<ext value1=\"test\" value=\"test2\"><subelem>text</subelem></ext>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200382 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
383 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200384 ret = yin_parse_extension_instance(st->yin_ctx, args, &data, name2fullname(name, prefix_len),
David Sedlák619db942019-07-03 14:47:30 +0200385 namelen2fulllen(name_len, prefix_len), LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200386 assert_int_equal(ret, LY_SUCCESS);
387 assert_string_equal(exts->name, "ext");
388 assert_int_equal(exts->insubstmt_index, 0);
389 assert_true(exts->insubstmt == LYEXT_SUBSTMT_CONTACT);
390 assert_true(exts->yin & LYS_YIN);
391 assert_string_equal(exts->child->stmt, "value1");
392 assert_string_equal(exts->child->arg, "test");
393 assert_null(exts->child->child);
394 assert_true(exts->child->flags & LYS_YIN_ATTR);
395 assert_string_equal(exts->child->next->stmt, "value");
396 assert_string_equal(exts->child->next->arg, "test2");
397 assert_null(exts->child->next->child);
398 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
399
400 assert_string_equal(exts->child->next->next->stmt, "subelem");
401 assert_string_equal(exts->child->next->next->arg, "text");
402 assert_null(exts->child->next->next->child);
403 assert_null(exts->child->next->next->next);
404 assert_false(exts->child->next->next->flags & LYS_YIN_ATTR);
David Sedlákda8ffa32019-07-08 14:17:10 +0200405 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200406 LY_ARRAY_FREE(args);
407 lysp_ext_instance_free(st->ctx, exts);
408 LY_ARRAY_FREE(exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200409 exts = NULL;
410 args = NULL;
411 st = reset_state(state);
412
413 data = "<extension-elem />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200414 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
415 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200416 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 +0200417 assert_int_equal(ret, LY_SUCCESS);
418 assert_string_equal(exts->name, "extension-elem");
419 assert_null(exts->argument);
420 assert_null(exts->child);
421 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
422 assert_int_equal(exts->insubstmt_index, 0);
423 assert_true(exts->yin & LYS_YIN);
David Sedlákda8ffa32019-07-08 14:17:10 +0200424 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákf250ecf2019-07-01 11:02:05 +0200425 LY_ARRAY_FREE(args);
426 lysp_ext_instance_free(st->ctx, exts);
427 LY_ARRAY_FREE(exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200428 st->finished_correctly = true;
429}
430
David Sedlák555c7202019-07-04 12:14:12 +0200431static void
432test_yin_parse_content(void **state)
433{
434 struct state *st = *state;
435 LY_ERR ret = LY_SUCCESS;
436 struct sized_string name, prefix;
437 const char *data = "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
438 "<custom xmlns=\"my-ext\">"
439 "totally amazing extension"
440 "</custom>"
David Sedlák986cb412019-07-04 13:10:11 +0200441 "<extension name=\"ext\">"
442 "<argument name=\"argname\"></argument>"
443 "<description><text>desc</text></description>"
444 "<reference><text>ref</text></reference>"
445 "<status value=\"deprecated\"></status>"
446 "</extension>"
David Sedlák555c7202019-07-04 12:14:12 +0200447 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedlák32488102019-07-15 17:44:10 +0200448 "<if-feature name=\"foo\"></if-feature>"
David Sedlák32eee7b2019-07-09 12:38:44 +0200449 "<when condition=\"condition...\">"
450 "<reference><text>when_ref</text></reference>"
451 "<description><text>when_desc</text></description>"
452 "</when>"
David Sedláke1a30302019-07-10 13:49:38 +0200453 "<config value=\"true\"/>"
David Sedlákc1771b12019-07-10 15:55:46 +0200454 "<error-message>"
455 "<value>error-msg</value>"
456 "</error-message>"
David Sedlák2ce1be62019-07-10 16:15:09 +0200457 "<error-app-tag value=\"err-app-tag\"/>"
David Sedláka5b1d382019-07-10 16:31:09 +0200458 "<units name=\"radians\"></units>"
David Sedláke7084ce2019-07-10 16:44:15 +0200459 "<default value=\"default-value\"/>"
David Sedlák5545f5d2019-07-11 11:55:16 +0200460 "<position value=\"25\"></position>"
461 "<value value=\"-5\"/>"
David Sedlákcf5569a2019-07-11 13:31:34 +0200462 "<require-instance value=\"true\"></require-instance>"
David Sedlákb7296dd2019-07-11 14:58:38 +0200463 "<range value=\"5..10\" />"
David Sedlák438ae432019-07-11 15:36:54 +0200464 "<length value=\"baf\"/>"
David Sedlákd3983112019-07-12 11:20:56 +0200465 "<pattern value='pattern'>"
466 "<modifier value='invert-match'/>"
467 "</pattern>"
David Sedlákfd5b9c32019-07-12 15:33:13 +0200468 "<enum name=\"yay\">"
469 "</enum>"
David Sedlák555c7202019-07-04 12:14:12 +0200470 "</prefix>";
471 struct lysp_ext_instance *exts = NULL;
David Sedlák5f8191e2019-07-08 16:35:52 +0200472 const char **if_features = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200473 struct yin_arg_record *attrs = NULL;
David Sedláke7084ce2019-07-10 16:44:15 +0200474 const char *value, *err_msg, *app_tag, *units, *def;
David Sedlák986cb412019-07-04 13:10:11 +0200475 struct lysp_ext *ext_def = NULL;
David Sedlák32eee7b2019-07-09 12:38:44 +0200476 struct lysp_when *when_p = NULL;
David Sedlákcf5569a2019-07-11 13:31:34 +0200477 struct lysp_type_enum pos_enum = {}, val_enum = {};
David Sedlákfd5b9c32019-07-12 15:33:13 +0200478 struct lysp_type req_type = {}, range_type = {}, len_type = {}, patter_type = {}, enum_type = {};
David Sedláke1a30302019-07-10 13:49:38 +0200479 uint8_t config = 0;
David Sedlák555c7202019-07-04 12:14:12 +0200480
David Sedlákda8ffa32019-07-08 14:17:10 +0200481 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
482 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedlák555c7202019-07-04 12:14:12 +0200483
David Sedlákfd5b9c32019-07-12 15:33:13 +0200484 struct yin_subelement subelems[17] = {
David Sedlák438ae432019-07-11 15:36:54 +0200485 {YANG_CONFIG, &config, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200486 {YANG_DEFAULT, &def, YIN_SUBELEM_UNIQUE},
David Sedlákfd5b9c32019-07-12 15:33:13 +0200487 {YANG_ENUM, &enum_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200488 {YANG_ERROR_APP_TAG, &app_tag, 0},
489 {YANG_ERROR_MESSAGE, &err_msg, 0},
490 {YANG_EXTENSION, &ext_def, 0},
491 {YANG_IF_FEATURE, &if_features, 0},
492 {YANG_LENGTH, &len_type, 0},
David Sedlákd3983112019-07-12 11:20:56 +0200493 {YANG_PATTERN, &patter_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200494 {YANG_RANGE, &range_type, 0},
495 {YANG_REQUIRE_INSTANCE, &req_type, 0},
496 {YANG_UNITS, &units, 0},
David Sedlák374d2b32019-07-17 15:06:55 +0200497 {YANG_POSITION, &pos_enum, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200498 {YANG_VALUE, &val_enum, 0},
499 {YANG_WHEN, &when_p, 0},
500 {YANG_CUSTOM, NULL, 0},
501 {YIN_TEXT, &value, 0}
David Sedlákd3983112019-07-12 11:20:56 +0200502 };
David Sedlákfd5b9c32019-07-12 15:33:13 +0200503 ret = yin_parse_content(st->yin_ctx, subelems, 17, &data, YANG_PREFIX, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200504 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200505 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák2ce1be62019-07-10 16:15:09 +0200506 /* check parsed values */
David Sedláke7084ce2019-07-10 16:44:15 +0200507 assert_string_equal(def, "default-value");
David Sedlák555c7202019-07-04 12:14:12 +0200508 assert_string_equal(exts->name, "custom");
509 assert_string_equal(exts->argument, "totally amazing extension");
510 assert_string_equal(value, "wsefsdf");
David Sedláka5b1d382019-07-10 16:31:09 +0200511 assert_string_equal(units, "radians");
David Sedlák32eee7b2019-07-09 12:38:44 +0200512 assert_string_equal(when_p->cond, "condition...");
513 assert_string_equal(when_p->dsc, "when_desc");
514 assert_string_equal(when_p->ref, "when_ref");
David Sedláke1a30302019-07-10 13:49:38 +0200515 assert_int_equal(config, LYS_CONFIG_W);
David Sedlák5545f5d2019-07-11 11:55:16 +0200516 assert_int_equal(pos_enum.value, 25);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200517 assert_true(pos_enum.flags & LYS_SET_VALUE);
David Sedlák5545f5d2019-07-11 11:55:16 +0200518 assert_int_equal(val_enum.value, -5);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200519 assert_true(val_enum.flags & LYS_SET_VALUE);
David Sedlákcf5569a2019-07-11 13:31:34 +0200520 assert_int_equal(req_type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200521 assert_true(req_type.flags &= LYS_SET_REQINST);
David Sedlákb7296dd2019-07-11 14:58:38 +0200522 assert_string_equal(range_type.range->arg, "5..10");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200523 assert_true(range_type.flags & LYS_SET_RANGE);
David Sedlákc1771b12019-07-10 15:55:46 +0200524 assert_string_equal(err_msg, "error-msg");
David Sedlák2ce1be62019-07-10 16:15:09 +0200525 assert_string_equal(app_tag, "err-app-tag");
David Sedlákfd5b9c32019-07-12 15:33:13 +0200526 assert_string_equal(enum_type.enums->name, "yay");
David Sedlák438ae432019-07-11 15:36:54 +0200527 assert_string_equal(len_type.length->arg, "baf");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200528 assert_true(len_type.flags & LYS_SET_LENGTH);
David Sedlákd3983112019-07-12 11:20:56 +0200529 assert_string_equal(patter_type.patterns->arg, "\x015pattern");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200530 assert_true(patter_type.flags & LYS_SET_PATTERN);
David Sedlák2ce1be62019-07-10 16:15:09 +0200531 /* cleanup */
David Sedlák555c7202019-07-04 12:14:12 +0200532 lysp_ext_instance_free(st->ctx, exts);
David Sedlák32eee7b2019-07-09 12:38:44 +0200533 lysp_when_free(st->ctx, when_p);
David Sedlák986cb412019-07-04 13:10:11 +0200534 lysp_ext_free(st->ctx, ext_def);
David Sedlák5f8191e2019-07-08 16:35:52 +0200535 FREE_STRING(st->ctx, *if_features);
David Sedlákc1771b12019-07-10 15:55:46 +0200536 FREE_STRING(st->ctx, err_msg);
David Sedlák2ce1be62019-07-10 16:15:09 +0200537 FREE_STRING(st->ctx, app_tag);
David Sedláka5b1d382019-07-10 16:31:09 +0200538 FREE_STRING(st->ctx, units);
David Sedlákd3983112019-07-12 11:20:56 +0200539 FREE_STRING(st->ctx, patter_type.patterns->arg);
David Sedláke7084ce2019-07-10 16:44:15 +0200540 FREE_STRING(st->ctx, def);
David Sedlákb7296dd2019-07-11 14:58:38 +0200541 FREE_STRING(st->ctx, range_type.range->arg);
David Sedlák438ae432019-07-11 15:36:54 +0200542 FREE_STRING(st->ctx, len_type.length->arg);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200543 FREE_STRING(st->ctx, enum_type.enums->name);
David Sedlákb7296dd2019-07-11 14:58:38 +0200544 FREE_STRING(st->ctx, value);
David Sedlák5f8191e2019-07-08 16:35:52 +0200545 LY_ARRAY_FREE(if_features);
David Sedlák555c7202019-07-04 12:14:12 +0200546 LY_ARRAY_FREE(exts);
David Sedlák986cb412019-07-04 13:10:11 +0200547 LY_ARRAY_FREE(ext_def);
David Sedlák555c7202019-07-04 12:14:12 +0200548 LY_ARRAY_FREE(attrs);
David Sedlákd3983112019-07-12 11:20:56 +0200549 LY_ARRAY_FREE(patter_type.patterns);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200550 LY_ARRAY_FREE(enum_type.enums);
David Sedlák32eee7b2019-07-09 12:38:44 +0200551 free(when_p);
David Sedlákb7296dd2019-07-11 14:58:38 +0200552 free(range_type.range);
David Sedlák438ae432019-07-11 15:36:54 +0200553 free(len_type.length);
David Sedlák555c7202019-07-04 12:14:12 +0200554 attrs = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200555 st = reset_state(state);
556
557 /* test unique subelem */
558 const char *prefix_value;
559 struct yin_subelement subelems2[2] = {{YANG_PREFIX, &prefix_value, 0},
560 {YIN_TEXT, &value, YIN_SUBELEM_UNIQUE}};
561 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
562 "<prefix value=\"inv_mod\" />"
563 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
564 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
565 "</module>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200566 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
567 yin_load_attributes(st->yin_ctx, &data, &attrs);
568 ret = yin_parse_content(st->yin_ctx, subelems2, 2, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200569 assert_int_equal(ret, LY_EVALID);
570 logbuf_assert("Redefinition of text element in module element. Line number 1.");
571 lydict_remove(st->ctx, prefix_value);
572 lydict_remove(st->ctx, value);
573 st = reset_state(state);
574 LY_ARRAY_FREE(attrs);
575 attrs = NULL;
576
577 /* test first subelem */
578 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
579 "<prefix value=\"inv_mod\" />"
580 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
581 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
582 "</module>";
583 struct yin_subelement subelems3[2] = {{YANG_PREFIX, &prefix_value, 0},
584 {YIN_TEXT, &value, YIN_SUBELEM_FIRST}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200585 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
586 yin_load_attributes(st->yin_ctx, &data, &attrs);
587 ret = yin_parse_content(st->yin_ctx, subelems3, 2, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200588 assert_int_equal(ret, LY_EVALID);
589 logbuf_assert("Subelement text of module element must be defined as first subelement. Line number 1.");
590 lydict_remove(st->ctx, prefix_value);
591 st = reset_state(state);
592 LY_ARRAY_FREE(attrs);
593 attrs = NULL;
594
595 /* test mandatory subelem */
596 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
597 "</module>";
598 struct yin_subelement subelems4[1] = {{YANG_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200599 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
600 yin_load_attributes(st->yin_ctx, &data, &attrs);
601 ret = yin_parse_content(st->yin_ctx, subelems4, 1, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200602 assert_int_equal(ret, LY_EVALID);
603 logbuf_assert("Missing mandatory subelement prefix of module element. Line number 1.");
604 LY_ARRAY_FREE(attrs);
605
606 st->finished_correctly = true;
607}
608
David Sedlák92147b02019-07-09 14:01:01 +0200609static void
David Sedlák4a650532019-07-10 11:55:18 +0200610test_validate_value(void **state)
611{
612 struct state *st = *state;
613 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "#invalid", 8), LY_EVALID);
614 logbuf_assert("Invalid identifier character '#'. Line number 1.");
615 assert_int_equal(yin_validate_value(st->yin_ctx, Y_STR_ARG, "", 0), LY_SUCCESS);
616 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "pre:b", 5), LY_EVALID);
617 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:b", 5), LY_SUCCESS);
618 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:pre:b", 9), LY_EVALID);
619
620 st->finished_correctly = true;
621}
622
David Sedlák32488102019-07-15 17:44:10 +0200623static int
624setup_element_test(void **state)
625{
David Sedlák8e7bda82019-07-16 17:57:50 +0200626 struct state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200627
628#if ENABLE_LOGGER_CHECKING
629 /* setup logger */
630 ly_set_log_clb(logger, 1);
631#endif
632
633 /* reset logbuf */
634 logbuf[0] = '\0';
David Sedlák32488102019-07-15 17:44:10 +0200635
636 /* allocate parser context */
637 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
638 st->yin_ctx->xml_ctx.ctx = st->ctx;
639 st->yin_ctx->xml_ctx.line = 1;
640
641 return EXIT_SUCCESS;
642}
643
644static int
645teardown_element_test(void **state)
646{
647 struct state *st = *(struct state **)state;
648
649#if ENABLE_LOGGER_CHECKING
650 /* teardown logger */
651 if (!st->finished_correctly && logbuf[0] != '\0') {
652 fprintf(stderr, "%s\n", logbuf);
653 }
654#endif
655
656 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák32488102019-07-15 17:44:10 +0200657 free(st->yin_ctx);
David Sedlák32488102019-07-15 17:44:10 +0200658
659 return EXIT_SUCCESS;
660}
661
662#define ELEMENT_WRAPPER_START "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
663#define ELEMENT_WRAPPER_END "</module>"
664
665/* helper function to simplify unit test of each element using parse_content function */
666LY_ERR
667test_element_helper(struct state *st, const char **data, void *dest, const char **text,
668 struct lysp_ext_instance **exts, bool valid)
669{
670 struct yin_arg_record *attrs = NULL;
671 struct sized_string name, prefix;
672 LY_ERR ret = LY_SUCCESS;
673 struct yin_subelement subelems[71] = {
674 {YANG_ACTION, dest, 0},
675 {YANG_ANYDATA, dest, 0},
676 {YANG_ANYXML, dest, 0},
677 {YANG_ARGUMENT,dest, 0},
678 {YANG_AUGMENT, dest, 0},
679 {YANG_BASE, dest, 0},
680 {YANG_BELONGS_TO, dest, 0},
681 {YANG_BIT, dest, 0},
682 {YANG_CASE, dest, 0},
683 {YANG_CHOICE, dest, 0},
684 {YANG_CONFIG, dest, 0},
685 {YANG_CONTACT, dest, 0},
686 {YANG_CONTAINER, dest, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200687 {YANG_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
David Sedlák32488102019-07-15 17:44:10 +0200688 {YANG_DESCRIPTION, dest, 0},
689 {YANG_DEVIATE, dest, 0},
690 {YANG_DEVIATION, dest, 0},
691 {YANG_ENUM, dest, 0},
692 {YANG_ERROR_APP_TAG, dest, 0},
693 {YANG_ERROR_MESSAGE, dest, 0},
694 {YANG_EXTENSION, dest, 0},
695 {YANG_FEATURE, dest, 0},
696 {YANG_FRACTION_DIGITS, dest, 0},
697 {YANG_GROUPING, dest, 0},
698 {YANG_IDENTITY, dest, 0},
699 {YANG_IF_FEATURE, dest, 0},
700 {YANG_IMPORT, dest, 0},
701 {YANG_INCLUDE, dest, 0},
702 {YANG_INPUT, dest, 0},
703 {YANG_KEY, dest, 0},
704 {YANG_LEAF, dest, 0},
705 {YANG_LEAF_LIST, dest, 0},
706 {YANG_LENGTH, dest, 0},
707 {YANG_LIST, dest, 0},
708 {YANG_MANDATORY, dest, 0},
709 {YANG_MAX_ELEMENTS, dest, 0},
710 {YANG_MIN_ELEMENTS, dest, 0},
711 {YANG_MODIFIER, dest, 0},
712 {YANG_MODULE, dest, 0},
713 {YANG_MUST, dest, 0},
714 {YANG_NAMESPACE, dest, 0},
715 {YANG_NOTIFICATION, dest, 0},
716 {YANG_ORDERED_BY, dest, 0},
717 {YANG_ORGANIZATION, dest, 0},
718 {YANG_OUTPUT, dest, 0},
719 {YANG_PATH, dest, 0},
720 {YANG_PATTERN, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200721 {YANG_PREFIX, dest, 0},
722 {YANG_PRESENCE, dest, 0},
723 {YANG_RANGE, dest, 0},
724 {YANG_REFERENCE, dest, 0},
725 {YANG_REFINE, dest, 0},
726 {YANG_REQUIRE_INSTANCE, dest, 0},
727 {YANG_REVISION, dest, 0},
728 {YANG_REVISION_DATE, dest, 0},
729 {YANG_RPC, dest, 0},
730 {YANG_STATUS, dest, 0},
731 {YANG_SUBMODULE, dest, 0},
732 {YANG_TYPE, dest, 0},
733 {YANG_TYPEDEF, dest, 0},
734 {YANG_UNIQUE, dest, 0},
735 {YANG_UNITS, dest, 0},
736 {YANG_USES, dest, 0},
David Sedlák374d2b32019-07-17 15:06:55 +0200737 {YANG_POSITION, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200738 {YANG_VALUE, dest, 0},
739 {YANG_WHEN, dest, 0},
740 {YANG_YANG_VERSION, dest, 0},
741 {YANG_YIN_ELEMENT, dest, 0},
742 {YANG_CUSTOM, dest, 0},
743 {YIN_TEXT, dest, 0},
744 {YIN_VALUE, dest, 0}
745 };
746 LY_CHECK_RET(lyxml_get_element(&st->yin_ctx->xml_ctx, data, &prefix.value, &prefix.len, &name.value, &name.len));\
747 LY_CHECK_RET(yin_load_attributes(st->yin_ctx, data, &attrs));\
David Sedlák8e7bda82019-07-16 17:57:50 +0200748 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 +0200749 LY_ARRAY_FREE(attrs);
750 if (valid) {
751 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
752 }
753 /* reset status */
754 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
755 return ret;
756}
757
758static void
759test_enum_bit_elem(void **state)
760{
761 /* yin_parse_enum_bit is function that is being mainly tested by this test */
762 struct state *st = *state;
763 struct lysp_type type = {};
764 const char *data;
765 data = ELEMENT_WRAPPER_START
766 "<enum name=\"enum-name\">"
767 "<if-feature name=\"feature\" />"
768 "<value value=\"55\" />"
769 "<status value=\"deprecated\" />"
770 "<description><text>desc...</text></description>"
771 "<reference><text>ref...</text></reference>"
772 "</enum>"
773 ELEMENT_WRAPPER_END;
774 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
775 assert_string_equal(*type.enums->iffeatures, "feature");
776 assert_int_equal(type.enums->value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200777 assert_true((type.enums->flags & LYS_STATUS_DEPRC) && (type.enums->flags & LYS_SET_VALUE));
David Sedlák32488102019-07-15 17:44:10 +0200778 assert_string_equal(type.enums->dsc, "desc...");
779 assert_string_equal(type.enums->ref, "ref...");
780 lysp_type_free(st->ctx, &type);
781 memset(&type, 0, sizeof type);
782
783 /* todo bit element test */
784 st->finished_correctly = true;
785}
786
787static void
788test_meta_elem(void **state)
789{
790 struct state *st = *state;
791 char *value = NULL;
792 const char *data;
793
794 /* organization element */
795 data = ELEMENT_WRAPPER_START
796 "<organization><text>organization...</text></organization>"
797 ELEMENT_WRAPPER_END;
798 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
799 assert_string_equal(value, "organization...");
800 FREE_STRING(st->ctx, value);
801 value = NULL;
802 /* contact element */
803 data = ELEMENT_WRAPPER_START
804 "<contact><text>contact...</text></contact>"
805 ELEMENT_WRAPPER_END;
806 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
807 assert_string_equal(value, "contact...");
808 FREE_STRING(st->ctx, value);
809 value = NULL;
810 /* description element */
811 data = ELEMENT_WRAPPER_START
812 "<description><text>description...</text></description>"
813 ELEMENT_WRAPPER_END;
814 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
815 assert_string_equal(value, "description...");
816 FREE_STRING(st->ctx, value);
817 value = NULL;
818 /* reference element */
819 data = ELEMENT_WRAPPER_START
820 "<reference><text>reference...</text></reference>"
821 ELEMENT_WRAPPER_END;
822 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
823 assert_string_equal(value, "reference...");
824 FREE_STRING(st->ctx, value);
825 value = NULL;
826
827 /* missing text subelement */
828 data = ELEMENT_WRAPPER_START
829 "<reference>reference...</reference>"
830 ELEMENT_WRAPPER_END;
831 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, false), LY_EVALID);
832 logbuf_assert("Missing mandatory subelement text of reference element. Line number 1.");
833
834 st->finished_correctly = true;
835}
836
837static void
838test_import_elem(void **state)
839{
840 struct state *st = *state;
841 const char *data;
842 struct lys_module *lys_mod = calloc(1, sizeof *lys_mod);
843 struct lysp_module *lysp_mod = calloc(1, sizeof *lysp_mod);
844 lys_mod->ctx = st->ctx;
845 lysp_mod->mod = lys_mod;
846
847 /* max subelems */
848 data = ELEMENT_WRAPPER_START
849 "<import module=\"a\">"
850 "<prefix value=\"a_mod\"/>"
851 "<revision-date date=\"2015-01-01\"></revision-date>"
852 "<description><text>import description</text></description>"
853 "<reference><text>import reference</text></reference>"
854 "</import>"
855 ELEMENT_WRAPPER_END;
856 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, true), LY_SUCCESS);
857 assert_string_equal(lysp_mod->imports->name, "a");
858 assert_string_equal(lysp_mod->imports->prefix, "a_mod");
859 assert_string_equal(lysp_mod->imports->rev, "2015-01-01");
860 assert_string_equal(lysp_mod->imports->dsc, "import description");
861 assert_string_equal(lysp_mod->imports->ref, "import reference");
862 lysp_module_free(lysp_mod);
863 lys_module_free(lys_mod, NULL);
864
865 /* min subelems */
866 lys_mod = calloc(1, sizeof *lys_mod);
867 lysp_mod = calloc(1, sizeof *lysp_mod);
868 lys_mod->ctx = st->ctx;
869 lysp_mod->mod = lys_mod;
870 data = ELEMENT_WRAPPER_START
871 "<import module=\"a\">"
872 "<prefix value=\"a_mod\"/>"
873 "</import>"
874 ELEMENT_WRAPPER_END;
875 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, true), LY_SUCCESS);
876 assert_string_equal(lysp_mod->imports->prefix, "a_mod");
877 lysp_module_free(lysp_mod);
878 lys_module_free(lys_mod, NULL);
879
880 /* invalid (missing prefix) */
881 lys_mod = calloc(1, sizeof *lys_mod);
882 lysp_mod = calloc(1, sizeof *lysp_mod);
883 lys_mod->ctx = st->ctx;
884 lysp_mod->mod = lys_mod;
885 data = ELEMENT_WRAPPER_START "<import module=\"a\">""</import>" ELEMENT_WRAPPER_END;
886 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, false), LY_EVALID);
887 logbuf_assert("Missing mandatory subelement prefix of import element. Line number 1.");
888 lysp_module_free(lysp_mod);
889 lys_module_free(lys_mod, NULL);
890
891 /* invalid reused prefix */
892 lys_mod = calloc(1, sizeof *lys_mod);
893 lysp_mod = calloc(1, sizeof *lysp_mod);
894 lys_mod->ctx = st->ctx;
895 lysp_mod->mod = lys_mod;
896 data = ELEMENT_WRAPPER_START
897 "<import module=\"a\">"
898 "<prefix value=\"a_mod\"/>"
899 "</import>"
900 "<import module=\"a\">"
901 "<prefix value=\"a_mod\"/>"
902 "</import>"
903 ELEMENT_WRAPPER_END;
904 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, false), LY_EVALID);
905 logbuf_assert("Prefix \"a_mod\" already used to import \"a\" module. Line number 1.");
906 lysp_module_free(lysp_mod);
907 lys_module_free(lys_mod, NULL);
908
909 st->finished_correctly = true;
910}
911
912static void
913test_status_elem(void **state)
914{
915 struct state *st = *state;
916 const char *data;
917 uint16_t flags = 0;
918
919 /* test valid values */
920 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
921 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200922 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200923
924 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
925 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200926 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +0200927
928 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\"></status>" ELEMENT_WRAPPER_END;
929 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200930 assert_true(flags & LYS_STATUS_OBSLT);
David Sedlák32488102019-07-15 17:44:10 +0200931
932 /* test invalid value */
933 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
934 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
935 logbuf_assert("Invalid value \"invalid\" of \"status\". Line number 1.");
936 st->finished_correctly = true;
937}
938
939static void
940test_ext_elem(void **state)
941{
942 struct state *st = *state;
943 const char *data;
944 struct lysp_ext *ext = NULL;
945
946 /* max subelems */
947 data = ELEMENT_WRAPPER_START
948 "<extension name=\"ext_name\">"
949 "<argument name=\"arg\"></argument>"
950 "<status value=\"current\"/>"
951 "<description><text>ext_desc</text></description>"
952 "<reference><text>ext_ref</text></reference>"
953 "</extension>"
954 ELEMENT_WRAPPER_END;
955 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
956 assert_string_equal(ext->name, "ext_name");
957 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200958 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200959 assert_string_equal(ext->dsc, "ext_desc");
960 assert_string_equal(ext->ref, "ext_ref");
961 lysp_ext_free(st->ctx, ext);
962 LY_ARRAY_FREE(ext);
963 ext = NULL;
964
965 /* min subelems */
966 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
967 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
968 assert_string_equal(ext->name, "ext_name");
969 lysp_ext_free(st->ctx, ext);
970 LY_ARRAY_FREE(ext);
971 ext = NULL;
972
973 st->finished_correctly = true;
974}
975
976static void
977test_yin_element_elem(void **state)
978{
979 struct state *st = *state;
980 const char *data;
981 uint16_t flags = 0;
982
983 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
984 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200985 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200986
987 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\" />" ELEMENT_WRAPPER_END;
988 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200989 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200990
991 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
992 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200993 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200994 logbuf_assert("Invalid value \"invalid\" of \"yin-element\". Line number 1.");
995 st->finished_correctly = true;
996}
997
998static void
999test_yangversion_elem(void **state)
1000{
1001 struct state *st = *state;
1002 const char *data;
1003 uint8_t version = 0;
1004
1005 /* valid values */
1006 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.0\" />" ELEMENT_WRAPPER_END;
1007 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001008 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001009 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_0);
1010
1011 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\" />" ELEMENT_WRAPPER_END;
1012 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001013 assert_true(version & LYS_VERSION_1_1);
David Sedlák32488102019-07-15 17:44:10 +02001014 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_1);
1015
1016 /* invalid value */
1017 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
1018 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, false), LY_EVALID);
1019 logbuf_assert("Invalid value \"version\" of \"yang-version\". Line number 1.");
1020
1021 st->finished_correctly = true;
1022}
1023
1024static void
1025test_mandatory_elem(void **state)
1026{
1027 struct state *st = *state;
1028 const char *data;
1029 uint16_t man = 0;
1030
1031 /* valid values */
1032 data = ELEMENT_WRAPPER_START "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
1033 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1034 assert_int_equal(man, LYS_MAND_TRUE);
1035 man = 0;
1036
1037 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\" />" ELEMENT_WRAPPER_END;
1038 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1039 assert_int_equal(man, LYS_MAND_FALSE);
1040
1041 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
1042 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, false), LY_EVALID);
1043 logbuf_assert("Invalid value \"invalid\" of \"mandatory\". Line number 1.");
1044
1045 st->finished_correctly = true;
1046}
1047
David Sedlák8e7bda82019-07-16 17:57:50 +02001048static void
1049test_argument_elem(void **state)
1050{
1051 struct state *st = *state;
1052 const char *data;
1053 uint16_t flags = 0;
1054 const char *arg;
1055 struct yin_argument_meta arg_meta = {&flags, &arg};
1056 /* max subelems */
1057 data = ELEMENT_WRAPPER_START
1058 "<argument name=\"arg-name\">"
1059 "<yin-element value=\"true\" />"
1060 "</argument>"
1061 ELEMENT_WRAPPER_END;
1062 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1063 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001064 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001065 flags = 0;
1066 FREE_STRING(st->ctx, arg);
1067 arg = NULL;
1068
1069 /* min subelems */
1070 data = ELEMENT_WRAPPER_START
1071 "<argument name=\"arg\">"
1072 "</argument>"
1073 ELEMENT_WRAPPER_END;
1074 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1075 assert_string_equal(arg, "arg");
1076 assert_true(flags == 0);
1077 FREE_STRING(st->ctx, arg);
1078
1079 st->finished_correctly = true;
1080}
1081
1082static void
1083test_base_elem(void **state)
1084{
1085 struct state *st = *state;
1086 const char *data;
1087 const char **bases = NULL;
1088 struct lysp_type type = {};
1089
1090 /* as identity subelement */
1091 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
1092 "<base name=\"base-name\"/>"
1093 "</identity>";
1094 assert_int_equal(test_element_helper(st, &data, &bases, NULL, NULL, true), LY_SUCCESS);
1095 assert_string_equal(*bases, "base-name");
1096 FREE_STRING(st->ctx, *bases);
1097 LY_ARRAY_FREE(bases);
1098
1099 /* as type subelement */
1100 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
1101 "<base name=\"base-name\"/>"
1102 "</type>";
1103 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1104 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001105 assert_true(type.flags & LYS_SET_BASE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001106 FREE_STRING(st->ctx, *type.bases);
1107 LY_ARRAY_FREE(type.bases);
1108
1109 st->finished_correctly = true;
1110}
1111
1112static void
1113test_belongsto_elem(void **state)
1114{
1115 struct state *st = *state;
1116 const char *data;
1117 struct lysp_submodule submod;
1118
1119 data = ELEMENT_WRAPPER_START
1120 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>"
1121 ELEMENT_WRAPPER_END;
1122 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, true), LY_SUCCESS);
1123 assert_string_equal(submod.belongsto, "module-name");
1124 assert_string_equal(submod.prefix, "pref");
1125 FREE_STRING(st->ctx, submod.belongsto);
1126 FREE_STRING(st->ctx, submod.prefix);
1127
1128 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
1129 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, false), LY_EVALID);
1130 logbuf_assert("Missing mandatory subelement prefix of belongs-to element. Line number 1.");
1131 FREE_STRING(st->ctx, submod.belongsto);
1132
1133 st->finished_correctly = true;
1134}
1135
1136static void
1137test_config_elem(void **state)
1138{
1139 struct state *st = *state;
1140 const char *data;
1141 uint16_t flags = 0;
1142
1143 data = ELEMENT_WRAPPER_START "<config value=\"true\"/>" ELEMENT_WRAPPER_END;
1144 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001145 assert_true(flags & LYS_CONFIG_W);
David Sedlák8e7bda82019-07-16 17:57:50 +02001146 flags = 0;
1147
1148 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
1149 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001150 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001151 flags = 0;
1152
1153 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1154 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1155 logbuf_assert("Invalid value \"invalid\" of \"config\". Line number 1.");
1156
1157 st->finished_correctly = true;
1158}
1159
1160static void
1161test_default_elem(void **state)
1162{
1163 struct state *st = *state;
1164 const char *data;
1165 const char *val = NULL;
1166
1167 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\"/>" ELEMENT_WRAPPER_END;
1168 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1169 assert_string_equal(val, "defaul-value");
1170 FREE_STRING(st->ctx, val);
1171 val = NULL;
1172
1173 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
1174 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1175 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1176
1177 st->finished_correctly = true;
1178}
1179
1180static void
1181test_err_app_tag_elem(void **state)
1182{
1183 struct state *st = *state;
1184 const char *data;
1185 const char *val = NULL;
1186
1187 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\"/>" ELEMENT_WRAPPER_END;
1188 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1189 assert_string_equal(val, "val");
1190 FREE_STRING(st->ctx, val);
1191 val = NULL;
1192
1193 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
1194 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1195 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1196
1197 st->finished_correctly = true;
1198}
1199
1200static void
1201test_err_msg_elem(void **state)
1202{
1203 struct state *st = *state;
1204 const char *data;
1205 const char *val = NULL;
1206
1207 data = ELEMENT_WRAPPER_START "<error-message><value>val</value></error-message>" ELEMENT_WRAPPER_END;
1208 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1209 assert_string_equal(val, "val");
1210 FREE_STRING(st->ctx, val);
1211
1212 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
1213 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1214 logbuf_assert("Missing mandatory subelement value of error-message element. Line number 1.");
1215
1216 st->finished_correctly = true;
1217}
1218
1219static void
1220test_fracdigits_elem(void **state)
1221{
1222 struct state *st = *state;
1223 const char *data;
1224 struct lysp_type type = {};
1225
1226 /* valid value */
1227 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\"></fraction-digits>" ELEMENT_WRAPPER_END;
1228 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1229 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001230 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001231
1232 /* invalid values */
1233 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
1234 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1235 logbuf_assert("Invalid value \"-1\" of \"fraction-digits\". Line number 1.");
1236
1237 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
1238 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1239 logbuf_assert("Invalid value \"02\" of \"fraction-digits\". Line number 1.");
1240
1241 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
1242 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1243 logbuf_assert("Invalid value \"1p\" of \"fraction-digits\". Line number 1.");
1244
1245 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
1246 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1247 logbuf_assert("Invalid value \"19\" of \"fraction-digits\". Line number 1.");
1248
1249 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
1250 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1251 logbuf_assert("Invalid value \"999999999999999999\" of \"fraction-digits\". Line number 1.");
1252
1253 st->finished_correctly = true;
1254}
1255
1256static void
1257test_iffeature_elem(void **state)
1258{
1259 struct state *st = *state;
1260 const char *data;
1261 const char **iffeatures = NULL;
1262
1263 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\"></if-feature>" ELEMENT_WRAPPER_END;
1264 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, true), LY_SUCCESS);
1265 assert_string_equal(*iffeatures, "local-storage");
1266 FREE_STRING(st->ctx, *iffeatures);
1267 LY_ARRAY_FREE(iffeatures);
1268 iffeatures = NULL;
1269
1270 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
1271 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, false), LY_EVALID);
1272 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1273 LY_ARRAY_FREE(iffeatures);
1274 iffeatures = NULL;
1275
1276 st->finished_correctly = true;
1277}
1278
1279static void
1280test_length_elem(void **state)
1281{
1282 struct state *st = *state;
1283 const char *data;
1284 struct lysp_type type = {};
1285
1286 /* max subelems */
1287 data = ELEMENT_WRAPPER_START
1288 "<length value=\"length-str\">"
1289 "<error-message><value>err-msg</value></error-message>"
1290 "<error-app-tag value=\"err-app-tag\"/>"
1291 "<description><text>desc</text></description>"
1292 "<reference><text>ref</text></reference>"
1293 "</length>"
1294 ELEMENT_WRAPPER_END;
1295 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1296 assert_string_equal(type.length->arg, "length-str");
1297 assert_string_equal(type.length->emsg, "err-msg");
1298 assert_string_equal(type.length->eapptag, "err-app-tag");
1299 assert_string_equal(type.length->dsc, "desc");
1300 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001301 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001302 lysp_type_free(st->ctx, &type);
1303 memset(&type, 0, sizeof(type));
1304
1305 /* min subelems */
1306 data = ELEMENT_WRAPPER_START
1307 "<length value=\"length-str\">"
1308 "</length>"
1309 ELEMENT_WRAPPER_END;
1310 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1311 assert_string_equal(type.length->arg, "length-str");
1312 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001313 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001314 memset(&type, 0, sizeof(type));
1315
1316 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
1317 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1318 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1319 lysp_type_free(st->ctx, &type);
1320 memset(&type, 0, sizeof(type));
1321
1322 st->finished_correctly = true;
1323}
1324
1325static void
1326test_modifier_elem(void **state)
1327{
1328 struct state *st = *state;
1329 const char *data;
1330 const char *pat = lydict_insert(st->ctx, "\006pattern", 8);
1331
1332 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\" />" ELEMENT_WRAPPER_END;
1333 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, true), LY_SUCCESS);
1334 assert_string_equal(pat, "\x015pattern");
1335 FREE_STRING(st->ctx, pat);
1336
1337 pat = lydict_insert(st->ctx, "\006pattern", 8);
1338 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
1339 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, false), LY_EVALID);
1340 logbuf_assert("Invalid value \"invert\" of \"modifier\". Line number 1.");
1341 FREE_STRING(st->ctx, pat);
1342
1343 st->finished_correctly = true;
1344}
1345
1346static void
1347test_namespace_elem(void **state)
1348{
1349 struct state *st = *state;
1350 const char *data;
1351 const char *ns;
1352
1353 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\"/>" ELEMENT_WRAPPER_END;
1354 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, true), LY_SUCCESS);
1355 assert_string_equal(ns, "ns");
1356 FREE_STRING(st->ctx, ns);
1357
1358 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
1359 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, false), LY_EVALID);
1360 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1361
1362 st->finished_correctly = true;
1363}
1364
1365static void
1366test_path_elem(void **state)
1367{
1368 struct state *st = *state;
1369 const char *data;
1370 struct lysp_type type = {};
1371
1372 data = ELEMENT_WRAPPER_START "<path value=\"path-val\"/>" ELEMENT_WRAPPER_END;
1373 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1374 assert_string_equal("path-val", type.path);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001375 assert_true(type.flags & LYS_SET_PATH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001376 lysp_type_free(st->ctx, &type);
1377
1378 st->finished_correctly = true;
1379}
1380
1381static void
1382test_pattern_elem(void **state)
1383{
1384 struct state *st = *state;
1385 const char *data;
1386 struct lysp_type type = {};
1387
1388 /* max subelems */
1389 data = ELEMENT_WRAPPER_START
1390 "<pattern value=\"super_pattern\">"
1391 "<modifier value=\"invert-match\"/>"
1392 "<error-message><value>err-msg-value</value></error-message>"
1393 "<error-app-tag value=\"err-app-tag-value\"/>"
1394 "<description><text>pattern-desc</text></description>"
1395 "<reference><text>pattern-ref</text></reference>"
1396 "</pattern>"
1397 ELEMENT_WRAPPER_END;
1398 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001399 assert_true(type.flags & LYS_SET_PATTERN);
David Sedlák8e7bda82019-07-16 17:57:50 +02001400 assert_string_equal(type.patterns->arg, "\x015super_pattern");
1401 assert_string_equal(type.patterns->dsc, "pattern-desc");
1402 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1403 assert_string_equal(type.patterns->emsg, "err-msg-value");
1404 assert_string_equal(type.patterns->dsc, "pattern-desc");
1405 assert_string_equal(type.patterns->ref, "pattern-ref");
1406 lysp_type_free(st->ctx, &type);
1407 memset(&type, 0, sizeof(type));
1408
1409 /* min subelems */
1410 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
1411 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1412 assert_string_equal(type.patterns->arg, "\x006pattern");
1413 lysp_type_free(st->ctx, &type);
1414 memset(&type, 0, sizeof(type));
1415
1416 st->finished_correctly = true;
1417}
1418
1419static void
1420test_value_position_elem(void **state)
1421{
1422 struct state *st = *state;
1423 const char *data;
1424 struct lysp_type_enum en = {};
1425
1426 /* valid values */
1427 data = ELEMENT_WRAPPER_START "<value value=\"55\" />" ELEMENT_WRAPPER_END;
1428 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1429 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001430 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001431 memset(&en, 0, sizeof(en));
1432
1433 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
1434 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1435 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001436 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001437 memset(&en, 0, sizeof(en));
1438
1439 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
1440 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1441 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001442 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001443 memset(&en, 0, sizeof(en));
1444
1445 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
1446 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1447 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001448 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001449 memset(&en, 0, sizeof(en));
1450
1451 /* valid positions */
1452 data = ELEMENT_WRAPPER_START "<position value=\"55\" />" ELEMENT_WRAPPER_END;
1453 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1454 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001455 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001456 memset(&en, 0, sizeof(en));
1457
1458 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
1459 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1460 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001461 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001462 memset(&en, 0, sizeof(en));
1463
1464 /* invalid values */
1465 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
1466 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1467 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\". Line number 1.");
1468
1469 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
1470 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1471 logbuf_assert("Invalid value \"1k\" of \"value\". Line number 1.");
1472
David Sedlák69f01612019-07-17 11:41:08 +02001473 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
1474 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1475 logbuf_assert("Invalid value \"\" of \"value\". Line number 1.");
1476
David Sedlák8e7bda82019-07-16 17:57:50 +02001477 /*invalid positions */
1478 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
1479 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1480 logbuf_assert("Invalid value \"-5\" of \"position\". Line number 1.");
1481
1482 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
1483 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1484 logbuf_assert("Invalid value \"-0\" of \"position\". Line number 1.");
1485
1486 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
1487 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1488 logbuf_assert("Invalid value \"99999999999999999999\" of \"position\". Line number 1.");
1489
David Sedlák69f01612019-07-17 11:41:08 +02001490 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
1491 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1492 logbuf_assert("Invalid value \"\" of \"position\". Line number 1.");
1493
1494 st->finished_correctly = true;
1495}
1496
1497static void
1498test_prefix_elem(void **state)
1499{
1500 struct state *st = *state;
1501 const char *data;
1502 const char *value = NULL;
1503
1504 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
1505 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
1506 assert_string_equal(value, "pref");
1507 FREE_STRING(st->ctx, value);
1508
1509 st->finished_correctly = true;
1510}
1511
1512static void
1513test_range_elem(void **state)
1514{
1515 struct state *st = *state;
1516 const char *data;
1517 struct lysp_type type = {};
1518
1519 /* max subelems */
1520 data = ELEMENT_WRAPPER_START
1521 "<range value=\"range-str\">"
1522 "<error-message><value>err-msg</value></error-message>"
1523 "<error-app-tag value=\"err-app-tag\" />"
1524 "<description><text>desc</text></description>"
1525 "<reference><text>ref</text></reference>"
1526 "</range>"
1527 ELEMENT_WRAPPER_END;
1528 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1529 assert_string_equal(type.range->arg, "range-str");
1530 assert_string_equal(type.range->dsc, "desc");
1531 assert_string_equal(type.range->eapptag, "err-app-tag");
1532 assert_string_equal(type.range->emsg, "err-msg");
1533 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001534 assert_true(type.flags & LYS_SET_RANGE);
David Sedlák69f01612019-07-17 11:41:08 +02001535 lysp_type_free(st->ctx, &type);
1536 memset(&type, 0, sizeof(type));
1537
1538 /* min subelems */
1539 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
1540 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1541 assert_string_equal(type.range->arg, "range-str");
1542 lysp_type_free(st->ctx, &type);
1543 memset(&type, 0, sizeof(type));
1544
1545 st->finished_correctly = true;
1546}
1547
1548static void
1549test_reqinstance_elem(void **state)
1550{
1551 struct state *st = *state;
1552 const char *data;
1553 struct lysp_type type = {};
1554
1555 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\"/>" ELEMENT_WRAPPER_END;
1556 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1557 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001558 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001559 memset(&type, 0, sizeof(type));
1560
1561 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
1562 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1563 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001564 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001565 memset(&type, 0, sizeof(type));
1566
1567 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1568 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1569 memset(&type, 0, sizeof(type));
1570 logbuf_assert("Invalid value \"invalid\" of \"require-instance\". Line number 1.");
1571
1572 st->finished_correctly = true;
1573}
1574
1575static void
1576test_revision_date_elem(void **state)
1577{
1578 struct state *st = *state;
1579 const char *data;
1580 char rev[LY_REV_SIZE];
1581
1582 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
1583 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, true), LY_SUCCESS);
1584 assert_string_equal(rev, "2000-01-01");
1585
1586 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
1587 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, false), LY_EVALID);
1588 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1589
1590 st->finished_correctly = true;
1591}
1592
1593static void
1594test_unique_elem(void **state)
1595{
1596 struct state *st = *state;
1597 const char *data;
1598 const char **values = NULL;
1599
1600 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
1601 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1602 assert_string_equal(*values, "tag");
1603 FREE_STRING(st->ctx, *values);
1604 LY_ARRAY_FREE(values);
1605
1606 st->finished_correctly = true;
1607}
1608
1609static void
1610test_units_elem(void **state)
1611{
1612 struct state *st = *state;
1613 const char *data;
1614 const char *values = NULL;
1615
1616 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
1617 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1618 assert_string_equal(values, "name");
1619 FREE_STRING(st->ctx, values);
1620
1621 st->finished_correctly = true;
1622}
1623
1624static void
1625test_when_elem(void **state)
1626{
1627 struct state *st = *state;
1628 const char *data;
1629 struct lysp_when *when = NULL;
1630
1631 data = ELEMENT_WRAPPER_START
1632 "<when condition=\"cond\">"
1633 "<description><text>desc</text></description>"
1634 "<reference><text>ref</text></reference>"
1635 "</when>"
1636 ELEMENT_WRAPPER_END;
1637 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1638 assert_string_equal(when->cond, "cond");
1639 assert_string_equal(when->dsc, "desc");
1640 assert_string_equal(when->ref, "ref");
1641 lysp_when_free(st->ctx, when);
1642 free(when);
1643 when = NULL;
1644
1645 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
1646 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1647 assert_string_equal(when->cond, "cond");
1648 lysp_when_free(st->ctx, when);
1649 free(when);
1650 when = NULL;
1651
1652 st->finished_correctly = true;
1653}
1654
1655static void
1656test_yin_text_value_elem(void **state)
1657{
1658 struct state *st = *state;
1659 const char *data;
1660 const char *val;
1661
1662 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
1663 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1664 assert_string_equal(val, "text");
1665 FREE_STRING(st->ctx, val);
1666
1667 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
1668 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1669 assert_string_equal(val, "text");
1670 FREE_STRING(st->ctx, val);
1671
1672 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
1673 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1674 assert_string_equal("", val);
1675 FREE_STRING(st->ctx, val);
1676
David Sedlák8e7bda82019-07-16 17:57:50 +02001677 st->finished_correctly = true;
1678}
David Sedlák32488102019-07-15 17:44:10 +02001679
David Sedlák374d2b32019-07-17 15:06:55 +02001680static void
1681test_type_elem(void **state)
1682{
1683 struct state *st = *state;
1684 const char *data;
1685 struct lysp_type type = {};
1686
1687 /* max subelems */
1688 data = ELEMENT_WRAPPER_START
1689 "<type name=\"type-name\">"
1690 "<base name=\"base-name\"/>"
1691 "<bit name=\"bit\"/>"
1692 "<enum name=\"enum\"/>"
1693 "<fraction-digits value=\"2\"/>"
1694 "<length value=\"length\"/>"
1695 "<path value=\"path\"/>"
1696 "<pattern value=\"pattern\"/>"
1697 "<range value=\"range\" />"
1698 "<require-instance value=\"true\"/>"
1699 "<type name=\"sub-type-name\"/>"
1700 "</type>"
1701 ELEMENT_WRAPPER_END;
1702 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1703 assert_string_equal(type.name, "type-name");
1704 assert_string_equal(*type.bases, "base-name");
1705 assert_string_equal(type.bits->name, "bit");
1706 assert_string_equal(type.enums->name, "enum");
1707 assert_int_equal(type.fraction_digits, 2);
1708 assert_string_equal(type.length->arg, "length");
1709 assert_string_equal(type.path, "path");
1710 assert_string_equal(type.patterns->arg, "\006pattern");
1711 assert_string_equal(type.range->arg, "range");
1712 assert_int_equal(type.require_instance, 1);
1713 assert_string_equal(type.types->name, "sub-type-name");
1714 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001715 assert_true(type.flags & LYS_SET_BASE);
1716 assert_true(type.flags & LYS_SET_BIT);
1717 assert_true(type.flags & LYS_SET_ENUM);
1718 assert_true(type.flags & LYS_SET_FRDIGITS);
1719 assert_true(type.flags & LYS_SET_LENGTH);
1720 assert_true(type.flags & LYS_SET_PATH);
1721 assert_true(type.flags & LYS_SET_PATTERN);
1722 assert_true(type.flags & LYS_SET_RANGE);
1723 assert_true(type.flags & LYS_SET_REQINST);
1724 assert_true(type.flags & LYS_SET_TYPE);
David Sedlák374d2b32019-07-17 15:06:55 +02001725 memset(&type, 0, sizeof(type));
1726
1727 /* min subelems */
1728 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
1729 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1730 lysp_type_free(st->ctx, &type);
1731 memset(&type, 0, sizeof(type));
1732
1733 st->finished_correctly = true;
1734}
1735
David Sedlák1af868e2019-07-17 17:03:14 +02001736static void
1737test_max_elems_elem(void **state)
1738{
1739 struct state *st = *state;
1740 const char *data;
1741 struct lysp_node_list list = {};
1742 struct lysp_node_leaflist llist = {};
1743 struct lysp_refine refine = {};
1744
1745 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"unbounded\"/> </refine>";
1746 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1747 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001748 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001749
1750 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"5\"/> </list>";
1751 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
1752 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001753 assert_true(list.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001754
1755 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"85\"/> </leaf-list>";
1756 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
1757 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001758 assert_true(llist.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001759
1760 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
1761 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1762 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001763 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001764
1765 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
1766 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1767 logbuf_assert("Invalid value \"0\" of \"max-elements\". Line number 1.");
1768
1769 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
1770 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1771 logbuf_assert("Invalid value \"-10\" of \"max-elements\". Line number 1.");
1772
1773 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
1774 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1775 logbuf_assert("Invalid value \"k\" of \"max-elements\". Line number 1.");
1776
1777 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
1778 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1779 logbuf_assert("Invalid value \"u12\" of \"max-elements\". Line number 1.");
1780
1781 st->finished_correctly = true;
1782}
1783
David Sedlák09e18c92019-07-18 11:17:11 +02001784static void
1785test_min_elems_elem(void **state)
1786{
1787 struct state *st = *state;
1788 const char *data;
1789 struct lysp_node_list list = {};
1790 struct lysp_node_leaflist llist = {};
1791 struct lysp_refine refine = {};
1792
1793 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"0\"/> </refine>";
1794 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1795 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001796 assert_true(refine.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001797
1798 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"41\"/> </list>";
1799 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
1800 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001801 assert_true(list.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001802
1803 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"50\"/> </leaf-list>";
1804 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
1805 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001806 assert_true(llist.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001807
1808 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
1809 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1810 logbuf_assert("Value \"-5\" is out of \"min-elements\" bounds. Line number 1.");
1811
1812 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
1813 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1814 logbuf_assert("Value \"99999999999999999\" is out of \"min-elements\" bounds. Line number 1.");
1815
1816 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
1817 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1818 logbuf_assert("Invalid value \"5k\" of \"min-elements\". Line number 1.");
1819
1820 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
1821 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1822 logbuf_assert("Invalid value \"05\" of \"min-elements\". Line number 1.");
1823
1824 st->finished_correctly = true;
1825}
1826
David Sedláka2dad212019-07-18 12:45:19 +02001827static void
1828test_ordby_elem(void **state)
1829{
1830 struct state *st = *state;
1831 const char *data;
1832 uint16_t flags = 0;
1833
1834 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\"/>" ELEMENT_WRAPPER_END;
1835 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001836 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedláka2dad212019-07-18 12:45:19 +02001837
1838 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
1839 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001840 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02001841
1842 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
1843 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1844 logbuf_assert("Invalid value \"inv\" of \"ordered-by\". Line number 1.");
1845
1846 st->finished_correctly = true;
1847}
1848
David Sedlák8a83bbb2019-07-18 14:46:00 +02001849static void
1850test_any_elem(void **state)
1851{
1852 struct state *st = *state;
1853 const char *data;
1854 struct lysp_node *siblings = NULL;
1855 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1856 struct lysp_node_anydata *parsed = NULL;
1857
1858 /* anyxml max subelems */
1859 data = ELEMENT_WRAPPER_START
1860 "<anyxml name=\"any-name\">"
1861 "<config value=\"true\" />"
1862 "<description><text>desc</text></description>"
1863 "<if-feature name=\"feature\" />"
1864 "<mandatory value=\"true\" />"
1865 "<must condition=\"must-cond\" />"
1866 "<reference><text>ref</text></reference>"
1867 "<status value=\"deprecated\"/>"
1868 "<when condition=\"when-cond\"/>"
1869 "</anyxml>"
1870 ELEMENT_WRAPPER_END;
1871 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1872 parsed = (struct lysp_node_anydata *)siblings;
1873 assert_null(parsed->parent);
1874 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001875 assert_true(parsed->flags & LYS_CONFIG_W);
1876 assert_true(parsed->flags & LYS_MAND_TRUE);
1877 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001878 assert_null(parsed->next);
1879 assert_string_equal(parsed->name, "any-name");
1880 assert_string_equal(parsed->dsc, "desc");
1881 assert_string_equal(parsed->ref, "ref");
1882 assert_string_equal(parsed->when->cond, "when-cond");
1883 assert_string_equal(*parsed->iffeatures, "feature");
1884 assert_null(parsed->exts);
1885 lysp_node_free(st->ctx, siblings);
1886 siblings = NULL;
1887
1888 /* anydata max subelems */
1889 data = ELEMENT_WRAPPER_START
1890 "<anydata name=\"any-name\">"
1891 "<config value=\"true\" />"
1892 "<description><text>desc</text></description>"
1893 "<if-feature name=\"feature\" />"
1894 "<mandatory value=\"true\" />"
1895 "<must condition=\"must-cond\" />"
1896 "<reference><text>ref</text></reference>"
1897 "<status value=\"deprecated\"/>"
1898 "<when condition=\"when-cond\"/>"
1899 "</anydata>"
1900 ELEMENT_WRAPPER_END;
1901 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1902 parsed = (struct lysp_node_anydata *)siblings;
1903 assert_null(parsed->parent);
1904 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001905 assert_true(parsed->flags & LYS_CONFIG_W);
1906 assert_true(parsed->flags & LYS_MAND_TRUE);
1907 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001908 assert_null(parsed->next);
1909 assert_string_equal(parsed->name, "any-name");
1910 assert_string_equal(parsed->dsc, "desc");
1911 assert_string_equal(parsed->ref, "ref");
1912 assert_string_equal(parsed->when->cond, "when-cond");
1913 assert_string_equal(*parsed->iffeatures, "feature");
1914 assert_null(parsed->exts);
1915 lysp_node_free(st->ctx, siblings);
1916 siblings = NULL;
1917
1918 /* min subelems */
1919 node_meta.parent = (void *)0x10;
1920 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
1921 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1922 parsed = (struct lysp_node_anydata *)siblings;
1923 assert_ptr_equal(parsed->parent, node_meta.parent);
1924 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
1925 assert_null(parsed->next);
1926 assert_null(parsed->exts);
1927 lysp_node_free(st->ctx, siblings);
1928
1929 st->finished_correctly = true;
1930}
1931
David Sedlák203ca3a2019-07-18 15:26:25 +02001932static void
1933test_leaf_elem(void **state)
1934{
1935 struct state *st = *state;
1936 const char *data;
1937 struct lysp_node *siblings = NULL;
1938 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1939 struct lysp_node_leaf *parsed = NULL;
1940
1941 /* max elements */
1942 data = ELEMENT_WRAPPER_START
1943 "<leaf name=\"leaf\">"
1944 "<config value=\"true\" />"
1945 "<default value=\"def-val\"/>"
1946 "<description><text>desc</text></description>"
1947 "<if-feature name=\"feature\" />"
1948 "<mandatory value=\"true\" />"
1949 "<must condition=\"must-cond\" />"
1950 "<reference><text>ref</text></reference>"
1951 "<status value=\"deprecated\"/>"
1952 "<type name=\"type\"/>"
1953 "<units name=\"uni\"/>"
1954 "<when condition=\"when-cond\"/>"
1955 "</leaf>"
1956 ELEMENT_WRAPPER_END;
1957 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1958 parsed = (struct lysp_node_leaf *)siblings;
1959 assert_null(parsed->parent);
1960 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001961 assert_true(parsed->flags & LYS_CONFIG_W);
1962 assert_true(parsed->flags & LYS_MAND_TRUE);
1963 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02001964 assert_null(parsed->next);
1965 assert_string_equal(parsed->name, "leaf");
1966 assert_string_equal(parsed->dsc, "desc");
1967 assert_string_equal(parsed->ref, "ref");
1968 assert_string_equal(parsed->when->cond, "when-cond");
1969 assert_string_equal(*parsed->iffeatures, "feature");
1970 assert_null(parsed->exts);
1971 assert_string_equal(parsed->musts->arg, "must-cond");
1972 assert_string_equal(parsed->type.name, "type");
1973 assert_string_equal(parsed->units, "uni");
1974 assert_string_equal(parsed->dflt, "def-val");
1975 lysp_node_free(st->ctx, siblings);
1976 siblings = NULL;
1977
1978 /* min elements */
1979 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
1980 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1981 parsed = (struct lysp_node_leaf *)siblings;
1982 assert_string_equal(parsed->name, "leaf");
1983 assert_string_equal(parsed->type.name, "type");
1984 lysp_node_free(st->ctx, siblings);
1985 siblings = NULL;
1986
1987 st->finished_correctly = true;
1988}
1989
David Sedlákc3da3ef2019-07-19 12:56:08 +02001990static void
1991test_leaf_list_elem(void **state)
1992{
1993 struct state *st = *state;
1994 const char *data;
1995 struct lysp_node *siblings = NULL;
1996 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1997 struct lysp_node_leaflist *parsed = NULL;
1998
1999 data = ELEMENT_WRAPPER_START
2000 "<leaf-list name=\"llist\">"
2001 "<config value=\"true\" />"
2002 "<default value=\"def-val0\"/>"
2003 "<default value=\"def-val1\"/>"
2004 "<description><text>desc</text></description>"
2005 "<if-feature name=\"feature\"/>"
2006 "<max-elements value=\"5\"/>"
2007 "<must condition=\"must-cond\"/>"
2008 "<ordered-by value=\"user\" />"
2009 "<reference><text>ref</text></reference>"
2010 "<status value=\"current\"/>"
2011 "<type name=\"type\"/>"
2012 "<units name=\"uni\"/>"
2013 "<when condition=\"when-cond\"/>"
2014 "</leaf-list>"
2015 ELEMENT_WRAPPER_END;
2016 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2017 parsed = (struct lysp_node_leaflist *)siblings;
2018 assert_string_equal(parsed->dflts[0], "def-val0");
2019 assert_string_equal(parsed->dflts[1], "def-val1");
2020 assert_string_equal(parsed->dsc, "desc");
2021 assert_string_equal(*parsed->iffeatures, "feature");
2022 assert_int_equal(parsed->max, 5);
2023 assert_string_equal(parsed->musts->arg, "must-cond");
2024 assert_string_equal(parsed->name, "llist");
2025 assert_null(parsed->next);
2026 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2027 assert_null(parsed->parent);
2028 assert_string_equal(parsed->ref, "ref");
2029 assert_string_equal(parsed->type.name, "type");
2030 assert_string_equal(parsed->units, "uni");
2031 assert_string_equal(parsed->when->cond, "when-cond");
2032 assert_true(parsed->flags & LYS_CONFIG_W);
2033 assert_true(parsed->flags & LYS_ORDBY_USER);
2034 assert_true(parsed->flags & LYS_STATUS_CURR);
2035 lysp_node_free(st->ctx, siblings);
2036 siblings = NULL;
2037
2038 data = ELEMENT_WRAPPER_START
2039 "<leaf-list name=\"llist\">"
2040 "<config value=\"true\" />"
2041 "<description><text>desc</text></description>"
2042 "<if-feature name=\"feature\"/>"
2043 "<min-elements value=\"5\"/>"
2044 "<must condition=\"must-cond\"/>"
2045 "<ordered-by value=\"user\" />"
2046 "<reference><text>ref</text></reference>"
2047 "<status value=\"current\"/>"
2048 "<type name=\"type\"/>"
2049 "<units name=\"uni\"/>"
2050 "<when condition=\"when-cond\"/>"
2051 "</leaf-list>"
2052 ELEMENT_WRAPPER_END;
2053 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2054 parsed = (struct lysp_node_leaflist *)siblings;
2055 assert_string_equal(parsed->dsc, "desc");
2056 assert_string_equal(*parsed->iffeatures, "feature");
2057 assert_int_equal(parsed->min, 5);
2058 assert_string_equal(parsed->musts->arg, "must-cond");
2059 assert_string_equal(parsed->name, "llist");
2060 assert_null(parsed->next);
2061 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2062 assert_null(parsed->parent);
2063 assert_string_equal(parsed->ref, "ref");
2064 assert_string_equal(parsed->type.name, "type");
2065 assert_string_equal(parsed->units, "uni");
2066 assert_string_equal(parsed->when->cond, "when-cond");
2067 assert_true(parsed->flags & LYS_CONFIG_W);
2068 assert_true(parsed->flags & LYS_ORDBY_USER);
2069 assert_true(parsed->flags & LYS_STATUS_CURR);
2070 lysp_node_free(st->ctx, siblings);
2071 siblings = NULL;
2072
2073 data = ELEMENT_WRAPPER_START
2074 "<leaf-list name=\"llist\">"
2075 "<config value=\"true\" />"
2076 "<description><text>desc</text></description>"
2077 "<if-feature name=\"feature\"/>"
2078 "<max-elements value=\"15\"/>"
2079 "<min-elements value=\"5\"/>"
2080 "<must condition=\"must-cond\"/>"
2081 "<ordered-by value=\"user\" />"
2082 "<reference><text>ref</text></reference>"
2083 "<status value=\"current\"/>"
2084 "<type name=\"type\"/>"
2085 "<units name=\"uni\"/>"
2086 "<when condition=\"when-cond\"/>"
2087 "</leaf-list>"
2088 ELEMENT_WRAPPER_END;
2089 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2090 parsed = (struct lysp_node_leaflist *)siblings;
2091 assert_string_equal(parsed->dsc, "desc");
2092 assert_string_equal(*parsed->iffeatures, "feature");
2093 assert_int_equal(parsed->min, 5);
2094 assert_int_equal(parsed->max, 15);
2095 assert_string_equal(parsed->musts->arg, "must-cond");
2096 assert_string_equal(parsed->name, "llist");
2097 assert_null(parsed->next);
2098 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2099 assert_null(parsed->parent);
2100 assert_string_equal(parsed->ref, "ref");
2101 assert_string_equal(parsed->type.name, "type");
2102 assert_string_equal(parsed->units, "uni");
2103 assert_string_equal(parsed->when->cond, "when-cond");
2104 assert_true(parsed->flags & LYS_CONFIG_W);
2105 assert_true(parsed->flags & LYS_ORDBY_USER);
2106 assert_true(parsed->flags & LYS_STATUS_CURR);
2107 lysp_node_free(st->ctx, siblings);
2108 siblings = NULL;
2109
2110 data = ELEMENT_WRAPPER_START
2111 "<leaf-list name=\"llist\">"
2112 "<type name=\"type\"/>"
2113 "</leaf-list>"
2114 ELEMENT_WRAPPER_END;
2115 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2116 parsed = (struct lysp_node_leaflist *)siblings;
2117 assert_string_equal(parsed->name, "llist");
2118 assert_string_equal(parsed->type.name, "type");
2119 lysp_node_free(st->ctx, siblings);
2120 siblings = NULL;
2121
2122 /* invalid combinations */
2123 data = ELEMENT_WRAPPER_START
2124 "<leaf-list name=\"llist\">"
2125 "<max-elements value=\"5\"/>"
2126 "<min-elements value=\"15\"/>"
2127 "<type name=\"type\"/>"
2128 "</leaf-list>"
2129 ELEMENT_WRAPPER_END;
2130 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2131 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2132 lysp_node_free(st->ctx, siblings);
2133 siblings = NULL;
2134
2135 data = ELEMENT_WRAPPER_START
2136 "<leaf-list name=\"llist\">"
2137 "<default value=\"def-val1\"/>"
2138 "<min-elements value=\"15\"/>"
2139 "<type name=\"type\"/>"
2140 "</leaf-list>"
2141 ELEMENT_WRAPPER_END;
2142 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2143 logbuf_assert("Invalid combination of keywords \"min-elements\" and \"default\" as substatements of \"leaf-list\". Line number 1.");
2144 lysp_node_free(st->ctx, siblings);
2145 siblings = NULL;
2146
2147 data = ELEMENT_WRAPPER_START
2148 "<leaf-list name=\"llist\">"
2149 "</leaf-list>"
2150 ELEMENT_WRAPPER_END;
2151 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2152 logbuf_assert("Missing mandatory subelement type of leaf-list element. Line number 1.");
2153 lysp_node_free(st->ctx, siblings);
2154 siblings = NULL;
2155
2156 st->finished_correctly = true;
2157}
2158
David Sedlákcb39f642019-07-19 13:19:55 +02002159static void
2160test_presence_elem(void **state)
2161{
2162 struct state *st = *state;
2163 const char *data;
2164 const char *val;
2165
2166 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
2167 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2168 assert_string_equal(val, "presence-val");
2169 FREE_STRING(st->ctx, val);
2170
2171 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
2172 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2173 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2174
2175 st->finished_correctly = true;
2176}
2177
David Sedlák12470a82019-07-19 13:44:36 +02002178static void
2179test_key_elem(void **state)
2180{
2181 struct state *st = *state;
2182 const char *data;
2183 const char *val;
2184
2185 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
2186 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2187 assert_string_equal(val, "key-value");
2188 FREE_STRING(st->ctx, val);
2189
2190 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
2191 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2192 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2193
2194 st->finished_correctly = true;
2195}
2196
David Sedlák04e17b22019-07-19 15:29:48 +02002197static void
2198test_typedef_elem(void **state)
2199{
2200 struct state *st = *state;
2201 const char *data;
2202 struct lysp_tpdf *tpdfs = NULL;
2203 struct typedef_meta typdef_meta = {NULL, &tpdfs};
2204
2205 data = ELEMENT_WRAPPER_START
2206 "<typedef name=\"tpdf-name\">"
2207 "<default value=\"def-val\"/>"
2208 "<description><text>desc-text</text></description>"
2209 "<reference><text>ref-text</text></reference>"
2210 "<status value=\"current\"/>"
2211 "<type name=\"type\"/>"
2212 "<units name=\"uni\"/>"
2213 "</typedef>"
2214 ELEMENT_WRAPPER_END;
2215 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2216 assert_string_equal(tpdfs[0].dflt, "def-val");
2217 assert_string_equal(tpdfs[0].dsc, "desc-text");
2218 assert_null(tpdfs[0].exts);
2219 assert_string_equal(tpdfs[0].name, "tpdf-name");
2220 assert_string_equal(tpdfs[0].ref, "ref-text");
2221 assert_string_equal(tpdfs[0].type.name, "type");
2222 assert_string_equal(tpdfs[0].units, "uni");
2223 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
2224 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2225 tpdfs = NULL;
2226
2227 data = ELEMENT_WRAPPER_START
2228 "<typedef name=\"tpdf-name\">"
2229 "<type name=\"type\"/>"
2230 "</typedef>"
2231 ELEMENT_WRAPPER_END;
2232 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2233 assert_string_equal(tpdfs[0].name, "tpdf-name");
2234 assert_string_equal(tpdfs[0].type.name, "type");
2235 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2236 tpdfs = NULL;
2237
2238 st->finished_correctly = true;
2239}
2240
David Sedlákd2d676a2019-07-22 11:28:19 +02002241static void
2242test_refine_elem(void **state)
2243{
2244 struct state *st = *state;
2245 const char *data;
2246 struct lysp_refine *refines = NULL;
2247
2248 /* max subelems */
2249 data = ELEMENT_WRAPPER_START
2250 "<refine target-node=\"target\">"
2251 "<if-feature name=\"feature\" />"
2252 "<must condition=\"cond\" />"
2253 "<presence value=\"presence\" />"
2254 "<default value=\"def\" />"
2255 "<config value=\"true\" />"
2256 "<mandatory value=\"true\" />"
2257 "<min-elements value=\"10\" />"
2258 "<max-elements value=\"20\" />"
2259 "<description><text>desc</text></description>"
2260 "<reference><text>ref</text></reference>"
2261 "</refine>"
2262 ELEMENT_WRAPPER_END;
2263 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2264 assert_string_equal(refines->nodeid, "target");
2265 assert_string_equal(*refines->dflts, "def");
2266 assert_string_equal(refines->dsc, "desc");
2267 assert_null(refines->exts);
2268 assert_true(refines->flags & LYS_CONFIG_W);
2269 assert_true(refines->flags & LYS_MAND_TRUE);
2270 assert_string_equal(*refines->iffeatures, "feature");
2271 assert_int_equal(refines->max, 20);
2272 assert_int_equal(refines->min, 10);
2273 assert_string_equal(refines->musts->arg, "cond");
2274 assert_string_equal(refines->presence, "presence");
2275 assert_string_equal(refines->ref, "ref");
2276 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2277 refines = NULL;
2278
2279 /* min subelems */
2280 data = ELEMENT_WRAPPER_START "<refine target-node=\"target\" />" ELEMENT_WRAPPER_END;
2281 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2282 assert_string_equal(refines->nodeid, "target");
2283 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2284 refines = NULL;
2285
2286 st->finished_correctly = true;
2287}
2288
David Sedlák0d6de5a2019-07-22 13:25:44 +02002289static void
2290test_uses_elem(void **state)
2291{
2292 struct state *st = *state;
2293 const char *data;
2294 struct lysp_node *siblings = NULL;
2295 struct tree_node_meta node_meta = {NULL, &siblings};
2296 struct lysp_node_uses *parsed = NULL;
2297
2298 /* max subelems */
2299 data = ELEMENT_WRAPPER_START
2300 "<uses name=\"uses-name\">"
2301 "<when condition=\"cond\" />"
2302 "<if-feature name=\"feature\" />"
2303 "<status value=\"obsolete\" />"
2304 "<description><text>desc</text></description>"
2305 "<reference><text>ref</text></reference>"
2306 "<refine target-node=\"target\"/>"
2307 /* TODO add uses-augment-stmt instance */
2308 "</uses>"
2309 ELEMENT_WRAPPER_END;
2310 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2311 parsed = (struct lysp_node_uses *)&siblings[0];
2312 assert_string_equal(parsed->name, "uses-name");
2313 assert_string_equal(parsed->dsc, "desc");
2314 assert_null(parsed->exts);
2315 assert_true(parsed->flags & LYS_STATUS_OBSLT);
2316 assert_string_equal(*parsed->iffeatures, "feature");
2317 assert_null(parsed->next);
2318 assert_int_equal(parsed->nodetype, LYS_USES);
2319 assert_null(parsed->parent);
2320 assert_string_equal(parsed->ref, "ref");
2321 assert_string_equal(parsed->refines->nodeid, "target");
2322 assert_string_equal(parsed->when->cond, "cond");
2323 lysp_node_free(st->ctx, siblings);
2324 siblings = NULL;
2325
2326 /* min subelems */
2327 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
2328 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2329 assert_string_equal(siblings[0].name, "uses-name");
2330 lysp_node_free(st->ctx, siblings);
2331 siblings = NULL;
2332
2333 st->finished_correctly = true;
2334}
2335
David Sedlákaa854b02019-07-22 14:17:10 +02002336static void
2337test_revision_elem(void **state)
2338{
2339 struct state *st = *state;
2340 const char *data;
2341 struct lysp_revision *revs = NULL;
2342
2343 /* max subelems */
2344 data = ELEMENT_WRAPPER_START
2345 "<revision date=\"2018-12-25\">"
2346 "<description><text>desc</text></description>"
2347 "<reference><text>ref</text></reference>"
2348 "</revision>"
2349 ELEMENT_WRAPPER_END;
2350 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2351 assert_string_equal(revs->date, "2018-12-25");
2352 assert_string_equal(revs->dsc, "desc");
2353 assert_string_equal(revs->ref, "ref");
2354 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2355 revs = NULL;
2356
2357 /* min subelems */
2358 data = ELEMENT_WRAPPER_START "<revision date=\"2005-05-05\" />" ELEMENT_WRAPPER_END;
2359 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2360 assert_string_equal(revs->date, "2005-05-05");
2361 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2362 revs = NULL;
2363
2364 /* invalid value */
2365 data = ELEMENT_WRAPPER_START "<revision date=\"05-05-2005\" />" ELEMENT_WRAPPER_END;
2366 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, false), LY_EVALID);
2367 logbuf_assert("Invalid value \"05-05-2005\" of \"revision\". Line number 1.");
2368 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2369 revs = NULL;
2370
2371 st->finished_correctly = true;
2372}
2373
David Sedlák3b4db242018-10-19 16:11:01 +02002374int
2375main(void)
2376{
2377
2378 const struct CMUnitTest tests[] = {
David Sedlák392af4f2019-06-04 16:02:42 +02002379 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_f, teardown_f),
David Sedlák8f7a1172019-06-20 14:42:18 +02002380 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02002381 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
2382 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák555c7202019-07-04 12:14:12 +02002383 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02002384 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02002385
David Sedlák8e7bda82019-07-16 17:57:50 +02002386 cmocka_unit_test(test_yin_match_argument_name),
David Sedlák32488102019-07-15 17:44:10 +02002387 cmocka_unit_test_setup_teardown(test_enum_bit_elem, setup_element_test, teardown_element_test),
2388 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_element_test),
2389 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_element_test),
2390 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_element_test),
2391 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_element_test),
2392 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_element_test),
2393 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_element_test),
2394 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02002395 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_element_test),
2396 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_element_test),
2397 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_element_test),
2398 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_element_test),
2399 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_element_test),
2400 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_element_test),
2401 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_element_test),
2402 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_element_test),
2403 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_element_test),
2404 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_element_test),
2405 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_element_test),
2406 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_element_test),
2407 cmocka_unit_test_setup_teardown(test_path_elem, setup_element_test, teardown_element_test),
2408 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_element_test),
2409 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_element_test),
David Sedlák69f01612019-07-17 11:41:08 +02002410 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_element_test),
2411 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_element_test),
2412 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_element_test),
2413 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_element_test),
2414 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_element_test),
2415 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_element_test),
2416 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_element_test),
2417 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_element_test),
David Sedlák374d2b32019-07-17 15:06:55 +02002418 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_element_test),
David Sedlák1af868e2019-07-17 17:03:14 +02002419 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_element_test),
David Sedlák09e18c92019-07-18 11:17:11 +02002420 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_element_test),
David Sedláka2dad212019-07-18 12:45:19 +02002421 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_element_test),
David Sedlák8a83bbb2019-07-18 14:46:00 +02002422 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02002423 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_element_test),
David Sedlákc3da3ef2019-07-19 12:56:08 +02002424 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_element_test),
David Sedlákcb39f642019-07-19 13:19:55 +02002425 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_element_test),
David Sedlák12470a82019-07-19 13:44:36 +02002426 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_element_test),
David Sedlák04e17b22019-07-19 15:29:48 +02002427 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_element_test),
David Sedlákd2d676a2019-07-22 11:28:19 +02002428 cmocka_unit_test_setup_teardown(test_refine_elem, setup_element_test, teardown_element_test),
David Sedlák0d6de5a2019-07-22 13:25:44 +02002429 cmocka_unit_test_setup_teardown(test_uses_elem, setup_element_test, teardown_element_test),
David Sedlákaa854b02019-07-22 14:17:10 +02002430 cmocka_unit_test_setup_teardown(test_revision_elem, setup_element_test, teardown_element_test),
David Sedlák3b4db242018-10-19 16:11:01 +02002431 };
2432
David Sedlák8e7bda82019-07-16 17:57:50 +02002433 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02002434}