blob: ce30903b06571d1c2b4c262d0604b6eaf78fbca0 [file] [log] [blame]
David Sedlákb1ce3f82019-06-05 14:37:26 +02001/**
2 * @file test_parser_yin.c
3 * @author David Sedlák <xsedla1d@stud.fit.vutbr.cz>
4 * @brief unit tests for functions from parser_yin.c
5 *
6 * Copyright (c) 2015 - 2019 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
David Sedlák3b4db242018-10-19 16:11:01 +020015#include <stdarg.h>
16#include <stddef.h>
17#include <setjmp.h>
18#include <cmocka.h>
19
20#include <stdio.h>
21#include <string.h>
David Sedlák79e50cb2019-06-05 16:33:09 +020022#include <stdbool.h>
David Sedlák3b4db242018-10-19 16:11:01 +020023
David Sedlákecf5eb82019-06-03 14:12:44 +020024#include "../../src/common.h"
25#include "../../src/tree_schema.h"
26#include "../../src/tree_schema_internal.h"
27#include "../../src/parser_yin.h"
David Sedlák8f5bce02019-06-03 16:41:08 +020028#include "../../src/xml.h"
David Sedlák3b4db242018-10-19 16:11:01 +020029
David Sedlák555c7202019-07-04 12:14:12 +020030/* prototypes of static functions */
31void lysp_ext_instance_free(struct ly_ctx *ctx, struct lysp_ext_instance *ext);
David Sedlák986cb412019-07-04 13:10:11 +020032void lysp_ext_free(struct ly_ctx *ctx, struct lysp_ext *ext);
David Sedlák32eee7b2019-07-09 12:38:44 +020033void lysp_when_free(struct ly_ctx *ctx, struct lysp_when *when);
David Sedlák32488102019-07-15 17:44:10 +020034void lysp_type_free(struct ly_ctx *ctx, struct lysp_type *type);
David Sedlák8a83bbb2019-07-18 14:46:00 +020035void lysp_node_free(struct ly_ctx *ctx, struct lysp_node *node);
David Sedlák04e17b22019-07-19 15:29:48 +020036void lysp_tpdf_free(struct ly_ctx *ctx, struct lysp_tpdf *tpdf);
David Sedlákd2d676a2019-07-22 11:28:19 +020037void lysp_refine_free(struct ly_ctx *ctx, struct lysp_refine *ref);
David Sedlákaa854b02019-07-22 14:17:10 +020038void lysp_revision_free(struct ly_ctx *ctx, struct lysp_revision *rev);
David Sedlák0c2bab92019-07-22 15:33:19 +020039void lysp_include_free(struct ly_ctx *ctx, struct lysp_include *include);
David Sedlák5e13dea2019-07-22 16:06:45 +020040void lysp_feature_free(struct ly_ctx *ctx, struct lysp_feature *feat);
David Sedlák555c7202019-07-04 12:14:12 +020041
David Sedlák68a1af12019-03-08 13:46:54 +010042struct state {
David Sedlák3b4db242018-10-19 16:11:01 +020043 struct ly_ctx *ctx;
David Sedlák3017da42019-02-15 09:48:04 +010044 struct lys_module *mod;
David Sedlák619db942019-07-03 14:47:30 +020045 struct lysp_module *lysp_mod;
David Sedlákda8ffa32019-07-08 14:17:10 +020046 struct yin_parser_ctx *yin_ctx;
David Sedlák79e50cb2019-06-05 16:33:09 +020047 bool finished_correctly;
David Sedlák68a1af12019-03-08 13:46:54 +010048};
David Sedlák872c7b42018-10-26 13:15:20 +020049
David Sedlák79e50cb2019-06-05 16:33:09 +020050#define BUFSIZE 1024
51char logbuf[BUFSIZE] = {0};
52int store = -1; /* negative for infinite logging, positive for limited logging */
53
54/* set to 0 to printing error messages to stderr instead of checking them in code */
David Sedlák203ca3a2019-07-18 15:26:25 +020055#define ENABLE_LOGGER_CHECKING 1
David Sedlák79e50cb2019-06-05 16:33:09 +020056
57#if ENABLE_LOGGER_CHECKING
58static void
59logger(LY_LOG_LEVEL level, const char *msg, const char *path)
60{
61 (void) level; /* unused */
62 if (store) {
63 if (path && path[0]) {
64 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
65 } else {
66 strncpy(logbuf, msg, BUFSIZE - 1);
67 }
68 if (store > 0) {
69 --store;
70 }
71 }
72}
73#endif
74
75#if ENABLE_LOGGER_CHECKING
76# define logbuf_assert(str) assert_string_equal(logbuf, str)
77#else
78# define logbuf_assert(str)
79#endif
80
81#define TEST_DUP_GENERIC(PREFIX, MEMBER, VALUE1, VALUE2, FUNC, RESULT, LINE, CLEANUP) \
82 str = PREFIX MEMBER" "VALUE1";"MEMBER" "VALUE2";} ..."; \
83 assert_int_equal(LY_EVALID, FUNC(&ctx, &str, RESULT)); \
84 logbuf_assert("Duplicate keyword \""MEMBER"\". Line number "LINE"."); \
85 CLEANUP
86
David Sedlák8e7bda82019-07-16 17:57:50 +020087int
88setup_ly_ctx(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +010089{
90 struct state *st = NULL;
David Sedlák3b4db242018-10-19 16:11:01 +020091
David Sedlák68a1af12019-03-08 13:46:54 +010092 /* allocate state variable */
93 (*state) = st = calloc(1, sizeof(*st));
94 if (!st) {
95 fprintf(stderr, "Memmory allocation failed");
96 return EXIT_FAILURE;
97 }
David Sedlák872c7b42018-10-26 13:15:20 +020098
David Sedlák68a1af12019-03-08 13:46:54 +010099 /* create new libyang context */
100 ly_ctx_new(NULL, 0, &st->ctx);
David Sedlák872c7b42018-10-26 13:15:20 +0200101
David Sedlák8e7bda82019-07-16 17:57:50 +0200102 return EXIT_SUCCESS;
103}
104
105int
106destroy_ly_ctx(void **state)
107{
108 struct state *st = *state;
109 ly_ctx_destroy(st->ctx, NULL);
110 free(st);
111
112 return EXIT_SUCCESS;
113}
114
115static int
116setup_f(void **state)
117{
118 struct state *st = *state;
119
120#if ENABLE_LOGGER_CHECKING
121 /* setup logger */
122 ly_set_log_clb(logger, 1);
123#endif
124
David Sedlák68a1af12019-03-08 13:46:54 +0100125 /* allocate new module */
126 st->mod = calloc(1, sizeof(*st->mod));
127 st->mod->ctx = st->ctx;
128
David Sedlák619db942019-07-03 14:47:30 +0200129 /* allocate new parsed module */
130 st->lysp_mod = calloc(1, sizeof(*st->lysp_mod));
131 st->lysp_mod->mod = calloc(1, sizeof(*st->lysp_mod->mod));
132 st->lysp_mod->mod->ctx = st->ctx;
133
134 /* allocate parser context */
David Sedlákda8ffa32019-07-08 14:17:10 +0200135 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
136 st->yin_ctx->xml_ctx.ctx = st->ctx;
137 st->yin_ctx->xml_ctx.line = 1;
David Sedlák8f5bce02019-06-03 16:41:08 +0200138
David Sedlák68a1af12019-03-08 13:46:54 +0100139 return EXIT_SUCCESS;
David Sedlák3b4db242018-10-19 16:11:01 +0200140}
141
142static int
David Sedlák68a1af12019-03-08 13:46:54 +0100143teardown_f(void **state)
144{
145 struct state *st = *(struct state **)state;
David Sedlák619db942019-07-03 14:47:30 +0200146 struct lys_module *temp;
David Sedlák68a1af12019-03-08 13:46:54 +0100147
David Sedlák79e50cb2019-06-05 16:33:09 +0200148#if ENABLE_LOGGER_CHECKING
149 /* teardown logger */
150 if (!st->finished_correctly && logbuf[0] != '\0') {
151 fprintf(stderr, "%s\n", logbuf);
152 }
153#endif
154
David Sedlák619db942019-07-03 14:47:30 +0200155 temp = st->lysp_mod->mod;
156
David Sedlákda8ffa32019-07-08 14:17:10 +0200157 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100158 lys_module_free(st->mod, NULL);
David Sedlák619db942019-07-03 14:47:30 +0200159 lysp_module_free(st->lysp_mod);
160 lys_module_free(temp, NULL);
David Sedlákda8ffa32019-07-08 14:17:10 +0200161 free(st->yin_ctx);
David Sedlák68a1af12019-03-08 13:46:54 +0100162
163 return EXIT_SUCCESS;
164}
165
David Sedlák392af4f2019-06-04 16:02:42 +0200166static struct state*
167reset_state(void **state)
168{
David Sedlák79e50cb2019-06-05 16:33:09 +0200169 ((struct state *)*state)->finished_correctly = true;
David Sedlák555c7202019-07-04 12:14:12 +0200170 logbuf[0] = '\0';
David Sedlák392af4f2019-06-04 16:02:42 +0200171 teardown_f(state);
172 setup_f(state);
173
174 return *state;
175}
176
David Sedlák79e50cb2019-06-05 16:33:09 +0200177void
178logbuf_clean(void)
179{
180 logbuf[0] = '\0';
181}
182
David Sedlák68a1af12019-03-08 13:46:54 +0100183static void
David Sedlák392af4f2019-06-04 16:02:42 +0200184test_yin_parse_module(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100185{
186 LY_ERR ret = LY_SUCCESS;
187 struct state *st = *state;
188
189 ret = yin_parse_module(st->ctx,
David Sedlák2b214ac2019-06-06 16:11:03 +0200190 "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\
191 name=\"example-foo\"\
David Sedlák18730132019-03-15 15:51:34 +0100192 xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\
193 xmlns:foo=\"urn:example:foo\"\
194 xmlns:myext=\"urn:example:extensions\">\
David Sedlákcd0c9512019-03-29 13:23:06 +0100195 <namespace uri=\"urn:example:foo\" xmlns:myext=\"urn:example:extensions\"/>\
David Sedláka7406952019-04-05 10:33:07 +0200196 <prefix xmlns:myxt=\"urn:emple:extensions\" value=\"foo\" xmlns:myext=\"urn:example:extensions\"/>\
David Sedlákd9d3a312019-06-04 09:47:10 +0200197 </module>",
David Sedlák68a1af12019-03-08 13:46:54 +0100198 st->mod);
199
200 assert_int_equal(ret, LY_SUCCESS);
201 assert_string_equal(st->mod->parsed->mod->name, "example-foo");
202 assert_string_equal(st->mod->parsed->mod->prefix, "foo");
David Sedlákcd0c9512019-03-29 13:23:06 +0100203 assert_string_equal(st->mod->parsed->mod->ns, "urn:example:foo");
David Sedlák392af4f2019-06-04 16:02:42 +0200204
205 st = reset_state(state);
206 ret = yin_parse_module(st->ctx,
David Sedlák2b214ac2019-06-06 16:11:03 +0200207 "<module name=\"example-foo\">\
208 <invalid-tag uri=\"urn:example:foo\"\"/>\
209 </module>",
210 st->mod);
David Sedlák392af4f2019-06-04 16:02:42 +0200211 assert_int_equal(ret, LY_EVALID);
212
213 st = reset_state(state);
214 ret = yin_parse_module(st->ctx,
David Sedlák8f7a1172019-06-20 14:42:18 +0200215 "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\
David Sedlák57715b12019-06-17 13:05:22 +0200216 </module>",
David Sedlák2b214ac2019-06-06 16:11:03 +0200217 st->mod);
David Sedlák392af4f2019-06-04 16:02:42 +0200218 assert_int_equal(ret, LY_EVALID);
David Sedlák882a8072019-07-08 17:51:20 +0200219 logbuf_assert("Missing mandatory attribute name of module element. Line number 1.");
David Sedlák392af4f2019-06-04 16:02:42 +0200220
221 st = reset_state(state);
222 ret = yin_parse_module(st->ctx,
223 "",
224 st->mod);
225 assert_int_equal(ret, LY_EVALID);
David Sedlák79e50cb2019-06-05 16:33:09 +0200226 logbuf_assert("Invalid keyword \"(null)\", expected \"module\" or \"submodule\". Line number 1.");
227 st->finished_correctly = true;
David Sedlák3b4db242018-10-19 16:11:01 +0200228}
229
230static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200231test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200232{
David Sedlák8f7a1172019-06-20 14:42:18 +0200233 struct state *st = *state;
David Sedlák3b4db242018-10-19 16:11:01 +0200234
David Sedlák8f7a1172019-06-20 14:42:18 +0200235 const char *prefix, *name;
236 struct yin_arg_record *args = NULL;
237 size_t prefix_len, name_len;
238 /* create mock yin namespace in xml context */
239 const char *data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200240 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
241 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák8f7a1172019-06-20 14:42:18 +0200242 LY_ARRAY_FREE(args);
243
David Sedlákc1771b12019-07-10 15:55:46 +0200244 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydatax", strlen("anydatax"), prefix, prefix_len, YANG_NONE), YANG_NONE);
245 assert_int_equal(yin_match_keyword(st->yin_ctx, "asdasd", strlen("asdasd"), prefix, prefix_len, YANG_NONE), YANG_NONE);
246 assert_int_equal(yin_match_keyword(st->yin_ctx, "", 0, prefix, prefix_len, YANG_NONE), YANG_NONE);
247 assert_int_equal(yin_match_keyword(st->yin_ctx, "anydata", strlen("anydata"), prefix, prefix_len, YANG_NONE), YANG_ANYDATA);
248 assert_int_equal(yin_match_keyword(st->yin_ctx, "anyxml", strlen("anyxml"), prefix, prefix_len, YANG_NONE), YANG_ANYXML);
249 assert_int_equal(yin_match_keyword(st->yin_ctx, "argument", strlen("argument"), prefix, prefix_len, YANG_NONE), YANG_ARGUMENT);
250 assert_int_equal(yin_match_keyword(st->yin_ctx, "augment", strlen("augment"), prefix, prefix_len, YANG_NONE), YANG_AUGMENT);
251 assert_int_equal(yin_match_keyword(st->yin_ctx, "base", strlen("base"), prefix, prefix_len, YANG_NONE), YANG_BASE);
252 assert_int_equal(yin_match_keyword(st->yin_ctx, "belongs-to", strlen("belongs-to"), prefix, prefix_len, YANG_NONE), YANG_BELONGS_TO);
253 assert_int_equal(yin_match_keyword(st->yin_ctx, "bit", strlen("bit"), prefix, prefix_len, YANG_NONE), YANG_BIT);
254 assert_int_equal(yin_match_keyword(st->yin_ctx, "case", strlen("case"), prefix, prefix_len, YANG_NONE), YANG_CASE);
255 assert_int_equal(yin_match_keyword(st->yin_ctx, "choice", strlen("choice"), prefix, prefix_len, YANG_NONE), YANG_CHOICE);
256 assert_int_equal(yin_match_keyword(st->yin_ctx, "config", strlen("config"), prefix, prefix_len, YANG_NONE), YANG_CONFIG);
257 assert_int_equal(yin_match_keyword(st->yin_ctx, "contact", strlen("contact"), prefix, prefix_len, YANG_NONE), YANG_CONTACT);
258 assert_int_equal(yin_match_keyword(st->yin_ctx, "container", strlen("container"), prefix, prefix_len, YANG_NONE), YANG_CONTAINER);
259 assert_int_equal(yin_match_keyword(st->yin_ctx, "default", strlen("default"), prefix, prefix_len, YANG_NONE), YANG_DEFAULT);
260 assert_int_equal(yin_match_keyword(st->yin_ctx, "description", strlen("description"), prefix, prefix_len, YANG_NONE), YANG_DESCRIPTION);
261 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviate", strlen("deviate"), prefix, prefix_len, YANG_NONE), YANG_DEVIATE);
262 assert_int_equal(yin_match_keyword(st->yin_ctx, "deviation", strlen("deviation"), prefix, prefix_len, YANG_NONE), YANG_DEVIATION);
263 assert_int_equal(yin_match_keyword(st->yin_ctx, "enum", strlen("enum"), prefix, prefix_len, YANG_NONE), YANG_ENUM);
264 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);
265 assert_int_equal(yin_match_keyword(st->yin_ctx, "error-message", strlen("error-message"), prefix, prefix_len, YANG_NONE), YANG_ERROR_MESSAGE);
266 assert_int_equal(yin_match_keyword(st->yin_ctx, "extension", strlen("extension"), prefix, prefix_len, YANG_NONE), YANG_EXTENSION);
267 assert_int_equal(yin_match_keyword(st->yin_ctx, "feature", strlen("feature"), prefix, prefix_len, YANG_NONE), YANG_FEATURE);
268 assert_int_equal(yin_match_keyword(st->yin_ctx, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, YANG_NONE), YANG_FRACTION_DIGITS);
269 assert_int_equal(yin_match_keyword(st->yin_ctx, "grouping", strlen("grouping"), prefix, prefix_len, YANG_NONE), YANG_GROUPING);
270 assert_int_equal(yin_match_keyword(st->yin_ctx, "identity", strlen("identity"), prefix, prefix_len, YANG_NONE), YANG_IDENTITY);
271 assert_int_equal(yin_match_keyword(st->yin_ctx, "if-feature", strlen("if-feature"), prefix, prefix_len, YANG_NONE), YANG_IF_FEATURE);
272 assert_int_equal(yin_match_keyword(st->yin_ctx, "import", strlen("import"), prefix, prefix_len, YANG_NONE), YANG_IMPORT);
273 assert_int_equal(yin_match_keyword(st->yin_ctx, "include", strlen("include"), prefix, prefix_len, YANG_NONE), YANG_INCLUDE);
274 assert_int_equal(yin_match_keyword(st->yin_ctx, "input", strlen("input"), prefix, prefix_len, YANG_NONE), YANG_INPUT);
275 assert_int_equal(yin_match_keyword(st->yin_ctx, "key", strlen("key"), prefix, prefix_len, YANG_NONE), YANG_KEY);
276 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf", strlen("leaf"), prefix, prefix_len, YANG_NONE), YANG_LEAF);
277 assert_int_equal(yin_match_keyword(st->yin_ctx, "leaf-list", strlen("leaf-list"), prefix, prefix_len, YANG_NONE), YANG_LEAF_LIST);
278 assert_int_equal(yin_match_keyword(st->yin_ctx, "length", strlen("length"), prefix, prefix_len, YANG_NONE), YANG_LENGTH);
279 assert_int_equal(yin_match_keyword(st->yin_ctx, "list", strlen("list"), prefix, prefix_len, YANG_NONE), YANG_LIST);
280 assert_int_equal(yin_match_keyword(st->yin_ctx, "mandatory", strlen("mandatory"), prefix, prefix_len, YANG_NONE), YANG_MANDATORY);
281 assert_int_equal(yin_match_keyword(st->yin_ctx, "max-elements", strlen("max-elements"), prefix, prefix_len, YANG_NONE), YANG_MAX_ELEMENTS);
282 assert_int_equal(yin_match_keyword(st->yin_ctx, "min-elements", strlen("min-elements"), prefix, prefix_len, YANG_NONE), YANG_MIN_ELEMENTS);
283 assert_int_equal(yin_match_keyword(st->yin_ctx, "modifier", strlen("modifier"), prefix, prefix_len, YANG_NONE), YANG_MODIFIER);
284 assert_int_equal(yin_match_keyword(st->yin_ctx, "module", strlen("module"), prefix, prefix_len, YANG_NONE), YANG_MODULE);
285 assert_int_equal(yin_match_keyword(st->yin_ctx, "must", strlen("must"), prefix, prefix_len, YANG_NONE), YANG_MUST);
286 assert_int_equal(yin_match_keyword(st->yin_ctx, "namespace", strlen("namespace"), prefix, prefix_len, YANG_NONE), YANG_NAMESPACE);
287 assert_int_equal(yin_match_keyword(st->yin_ctx, "notification", strlen("notification"), prefix, prefix_len, YANG_NONE), YANG_NOTIFICATION);
288 assert_int_equal(yin_match_keyword(st->yin_ctx, "ordered-by", strlen("ordered-by"), prefix, prefix_len, YANG_NONE), YANG_ORDERED_BY);
289 assert_int_equal(yin_match_keyword(st->yin_ctx, "organization", strlen("organization"), prefix, prefix_len, YANG_NONE), YANG_ORGANIZATION);
290 assert_int_equal(yin_match_keyword(st->yin_ctx, "output", strlen("output"), prefix, prefix_len, YANG_NONE), YANG_OUTPUT);
291 assert_int_equal(yin_match_keyword(st->yin_ctx, "path", strlen("path"), prefix, prefix_len, YANG_NONE), YANG_PATH);
292 assert_int_equal(yin_match_keyword(st->yin_ctx, "pattern", strlen("pattern"), prefix, prefix_len, YANG_NONE), YANG_PATTERN);
293 assert_int_equal(yin_match_keyword(st->yin_ctx, "position", strlen("position"), prefix, prefix_len, YANG_NONE), YANG_POSITION);
294 assert_int_equal(yin_match_keyword(st->yin_ctx, "prefix", strlen("prefix"), prefix, prefix_len, YANG_NONE), YANG_PREFIX);
295 assert_int_equal(yin_match_keyword(st->yin_ctx, "presence", strlen("presence"), prefix, prefix_len, YANG_NONE), YANG_PRESENCE);
296 assert_int_equal(yin_match_keyword(st->yin_ctx, "range", strlen("range"), prefix, prefix_len, YANG_NONE), YANG_RANGE);
297 assert_int_equal(yin_match_keyword(st->yin_ctx, "reference", strlen("reference"), prefix, prefix_len, YANG_NONE), YANG_REFERENCE);
298 assert_int_equal(yin_match_keyword(st->yin_ctx, "refine", strlen("refine"), prefix, prefix_len, YANG_NONE), YANG_REFINE);
299 assert_int_equal(yin_match_keyword(st->yin_ctx, "require-instance", strlen("require-instance"), prefix, prefix_len, YANG_NONE), YANG_REQUIRE_INSTANCE);
300 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision", strlen("revision"), prefix, prefix_len, YANG_NONE), YANG_REVISION);
301 assert_int_equal(yin_match_keyword(st->yin_ctx, "revision-date", strlen("revision-date"), prefix, prefix_len, YANG_NONE), YANG_REVISION_DATE);
302 assert_int_equal(yin_match_keyword(st->yin_ctx, "rpc", strlen("rpc"), prefix, prefix_len, YANG_NONE), YANG_RPC);
303 assert_int_equal(yin_match_keyword(st->yin_ctx, "status", strlen("status"), prefix, prefix_len, YANG_NONE), YANG_STATUS);
304 assert_int_equal(yin_match_keyword(st->yin_ctx, "submodule", strlen("submodule"), prefix, prefix_len, YANG_NONE), YANG_SUBMODULE);
305 assert_int_equal(yin_match_keyword(st->yin_ctx, "type", strlen("type"), prefix, prefix_len, YANG_NONE), YANG_TYPE);
306 assert_int_equal(yin_match_keyword(st->yin_ctx, "typedef", strlen("typedef"), prefix, prefix_len, YANG_NONE), YANG_TYPEDEF);
307 assert_int_equal(yin_match_keyword(st->yin_ctx, "unique", strlen("unique"), prefix, prefix_len, YANG_NONE), YANG_UNIQUE);
308 assert_int_equal(yin_match_keyword(st->yin_ctx, "units", strlen("units"), prefix, prefix_len, YANG_NONE), YANG_UNITS);
309 assert_int_equal(yin_match_keyword(st->yin_ctx, "uses", strlen("uses"), prefix, prefix_len, YANG_NONE), YANG_USES);
310 assert_int_equal(yin_match_keyword(st->yin_ctx, "value", strlen("value"), prefix, prefix_len, YANG_NONE), YANG_VALUE);
311 assert_int_equal(yin_match_keyword(st->yin_ctx, "when", strlen("when"), prefix, prefix_len, YANG_NONE), YANG_WHEN);
312 assert_int_equal(yin_match_keyword(st->yin_ctx, "yang-version", strlen("yang-version"), prefix, prefix_len, YANG_NONE), YANG_YANG_VERSION);
313 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 +0200314
315 st->finished_correctly = true;
David Sedlák872c7b42018-10-26 13:15:20 +0200316}
David Sedlák3b4db242018-10-19 16:11:01 +0200317
David Sedlák872c7b42018-10-26 13:15:20 +0200318static void
David Sedlák060b00e2019-06-19 11:12:06 +0200319test_yin_match_argument_name(void **state)
David Sedlák872c7b42018-10-26 13:15:20 +0200320{
David Sedlák68a1af12019-03-08 13:46:54 +0100321 (void)state; /* unused */
David Sedlák872c7b42018-10-26 13:15:20 +0200322
David Sedlák060b00e2019-06-19 11:12:06 +0200323 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
324 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
325 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
326 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
327 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
328 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
329 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
330 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
331 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
332 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
333 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
334 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200335}
336
David Sedlák68a1af12019-03-08 13:46:54 +0100337static void
David Sedlákb1a78352019-06-28 16:16:29 +0200338test_yin_parse_element_generic(void **state)
339{
340 const char *prefix, *name;
341 struct state *st = *state;
342 struct lysp_ext_instance exts;
343 size_t prefix_len, name_len;
344 LY_ERR ret;
345
346 memset(&exts, 0, sizeof(exts));
347
348 const char *data = "<elem attr=\"value\">text_value</elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200349 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
350 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 +0200351 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200352 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200353 assert_string_equal(exts.child->stmt, "elem");
354 assert_string_equal(exts.child->arg, "text_value");
David Sedlákb1a78352019-06-28 16:16:29 +0200355 assert_string_equal(exts.child->child->stmt, "attr");
356 assert_string_equal(exts.child->child->arg, "value");
357 assert_true(exts.child->child->flags & LYS_YIN_ATTR);
David Sedlákb1a78352019-06-28 16:16:29 +0200358 lysp_ext_instance_free(st->ctx, &exts);
David Sedlák5392a212019-07-01 09:19:10 +0200359 st = reset_state(state);
360
361 data = "<elem></elem>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200362 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
363 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 +0200364 assert_int_equal(ret, LY_SUCCESS);
365 assert_string_equal(exts.child->stmt, "elem");
366 assert_null(exts.child->child);
367 assert_null(exts.child->arg);
David Sedlákda8ffa32019-07-08 14:17:10 +0200368 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák5392a212019-07-01 09:19:10 +0200369 lysp_ext_instance_free(st->ctx, &exts);
370
David Sedlákb1a78352019-06-28 16:16:29 +0200371 st->finished_correctly = true;
372}
373
374static void
375test_yin_parse_extension_instance(void **state)
376{
377 LY_ERR ret;
378 struct state *st = *state;
379 const char *prefix, *name;
380 size_t prefix_len, name_len;
381 struct yin_arg_record *args = NULL;
382 struct lysp_ext_instance *exts = NULL;
David Sedlákb1a78352019-06-28 16:16:29 +0200383 const char *data = "<ext value1=\"test\" value=\"test2\"><subelem>text</subelem></ext>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200384 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
385 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200386 ret = yin_parse_extension_instance(st->yin_ctx, args, &data, name2fullname(name, prefix_len),
David Sedlák619db942019-07-03 14:47:30 +0200387 namelen2fulllen(name_len, prefix_len), LYEXT_SUBSTMT_CONTACT, 0, &exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200388 assert_int_equal(ret, LY_SUCCESS);
389 assert_string_equal(exts->name, "ext");
390 assert_int_equal(exts->insubstmt_index, 0);
391 assert_true(exts->insubstmt == LYEXT_SUBSTMT_CONTACT);
392 assert_true(exts->yin & LYS_YIN);
393 assert_string_equal(exts->child->stmt, "value1");
394 assert_string_equal(exts->child->arg, "test");
395 assert_null(exts->child->child);
396 assert_true(exts->child->flags & LYS_YIN_ATTR);
397 assert_string_equal(exts->child->next->stmt, "value");
398 assert_string_equal(exts->child->next->arg, "test2");
399 assert_null(exts->child->next->child);
400 assert_true(exts->child->next->flags & LYS_YIN_ATTR);
401
402 assert_string_equal(exts->child->next->next->stmt, "subelem");
403 assert_string_equal(exts->child->next->next->arg, "text");
404 assert_null(exts->child->next->next->child);
405 assert_null(exts->child->next->next->next);
406 assert_false(exts->child->next->next->flags & LYS_YIN_ATTR);
David Sedlákda8ffa32019-07-08 14:17:10 +0200407 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákb1a78352019-06-28 16:16:29 +0200408 LY_ARRAY_FREE(args);
409 lysp_ext_instance_free(st->ctx, exts);
410 LY_ARRAY_FREE(exts);
David Sedlákf250ecf2019-07-01 11:02:05 +0200411 exts = NULL;
412 args = NULL;
413 st = reset_state(state);
414
415 data = "<extension-elem />";
David Sedlákda8ffa32019-07-08 14:17:10 +0200416 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix, &prefix_len, &name, &name_len);
417 yin_load_attributes(st->yin_ctx, &data, &args);
David Sedlák1f90d252019-07-10 17:09:32 +0200418 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 +0200419 assert_int_equal(ret, LY_SUCCESS);
420 assert_string_equal(exts->name, "extension-elem");
421 assert_null(exts->argument);
422 assert_null(exts->child);
423 assert_int_equal(exts->insubstmt, LYEXT_SUBSTMT_CONTACT);
424 assert_int_equal(exts->insubstmt_index, 0);
425 assert_true(exts->yin & LYS_YIN);
David Sedlákda8ffa32019-07-08 14:17:10 +0200426 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlákf250ecf2019-07-01 11:02:05 +0200427 LY_ARRAY_FREE(args);
428 lysp_ext_instance_free(st->ctx, exts);
429 LY_ARRAY_FREE(exts);
David Sedlákb1a78352019-06-28 16:16:29 +0200430 st->finished_correctly = true;
431}
432
David Sedlák555c7202019-07-04 12:14:12 +0200433static void
434test_yin_parse_content(void **state)
435{
436 struct state *st = *state;
437 LY_ERR ret = LY_SUCCESS;
438 struct sized_string name, prefix;
439 const char *data = "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
440 "<custom xmlns=\"my-ext\">"
441 "totally amazing extension"
442 "</custom>"
David Sedlák986cb412019-07-04 13:10:11 +0200443 "<extension name=\"ext\">"
444 "<argument name=\"argname\"></argument>"
445 "<description><text>desc</text></description>"
446 "<reference><text>ref</text></reference>"
447 "<status value=\"deprecated\"></status>"
448 "</extension>"
David Sedlák555c7202019-07-04 12:14:12 +0200449 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
David Sedlák32488102019-07-15 17:44:10 +0200450 "<if-feature name=\"foo\"></if-feature>"
David Sedlák32eee7b2019-07-09 12:38:44 +0200451 "<when condition=\"condition...\">"
452 "<reference><text>when_ref</text></reference>"
453 "<description><text>when_desc</text></description>"
454 "</when>"
David Sedláke1a30302019-07-10 13:49:38 +0200455 "<config value=\"true\"/>"
David Sedlákc1771b12019-07-10 15:55:46 +0200456 "<error-message>"
457 "<value>error-msg</value>"
458 "</error-message>"
David Sedlák2ce1be62019-07-10 16:15:09 +0200459 "<error-app-tag value=\"err-app-tag\"/>"
David Sedláka5b1d382019-07-10 16:31:09 +0200460 "<units name=\"radians\"></units>"
David Sedláke7084ce2019-07-10 16:44:15 +0200461 "<default value=\"default-value\"/>"
David Sedlák5545f5d2019-07-11 11:55:16 +0200462 "<position value=\"25\"></position>"
463 "<value value=\"-5\"/>"
David Sedlákcf5569a2019-07-11 13:31:34 +0200464 "<require-instance value=\"true\"></require-instance>"
David Sedlákb7296dd2019-07-11 14:58:38 +0200465 "<range value=\"5..10\" />"
David Sedlák438ae432019-07-11 15:36:54 +0200466 "<length value=\"baf\"/>"
David Sedlákd3983112019-07-12 11:20:56 +0200467 "<pattern value='pattern'>"
468 "<modifier value='invert-match'/>"
469 "</pattern>"
David Sedlákfd5b9c32019-07-12 15:33:13 +0200470 "<enum name=\"yay\">"
471 "</enum>"
David Sedlák555c7202019-07-04 12:14:12 +0200472 "</prefix>";
473 struct lysp_ext_instance *exts = NULL;
David Sedlák5f8191e2019-07-08 16:35:52 +0200474 const char **if_features = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200475 struct yin_arg_record *attrs = NULL;
David Sedláke7084ce2019-07-10 16:44:15 +0200476 const char *value, *err_msg, *app_tag, *units, *def;
David Sedlák986cb412019-07-04 13:10:11 +0200477 struct lysp_ext *ext_def = NULL;
David Sedlák32eee7b2019-07-09 12:38:44 +0200478 struct lysp_when *when_p = NULL;
David Sedlákcf5569a2019-07-11 13:31:34 +0200479 struct lysp_type_enum pos_enum = {}, val_enum = {};
David Sedlákfd5b9c32019-07-12 15:33:13 +0200480 struct lysp_type req_type = {}, range_type = {}, len_type = {}, patter_type = {}, enum_type = {};
David Sedláke1a30302019-07-10 13:49:38 +0200481 uint8_t config = 0;
David Sedlák555c7202019-07-04 12:14:12 +0200482
David Sedlákda8ffa32019-07-08 14:17:10 +0200483 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
484 yin_load_attributes(st->yin_ctx, &data, &attrs);
David Sedlák555c7202019-07-04 12:14:12 +0200485
David Sedlákfd5b9c32019-07-12 15:33:13 +0200486 struct yin_subelement subelems[17] = {
David Sedlák438ae432019-07-11 15:36:54 +0200487 {YANG_CONFIG, &config, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200488 {YANG_DEFAULT, &def, YIN_SUBELEM_UNIQUE},
David Sedlákfd5b9c32019-07-12 15:33:13 +0200489 {YANG_ENUM, &enum_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200490 {YANG_ERROR_APP_TAG, &app_tag, 0},
491 {YANG_ERROR_MESSAGE, &err_msg, 0},
492 {YANG_EXTENSION, &ext_def, 0},
493 {YANG_IF_FEATURE, &if_features, 0},
494 {YANG_LENGTH, &len_type, 0},
David Sedlákd3983112019-07-12 11:20:56 +0200495 {YANG_PATTERN, &patter_type, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200496 {YANG_RANGE, &range_type, 0},
497 {YANG_REQUIRE_INSTANCE, &req_type, 0},
498 {YANG_UNITS, &units, 0},
David Sedlák374d2b32019-07-17 15:06:55 +0200499 {YANG_POSITION, &pos_enum, 0},
David Sedlák438ae432019-07-11 15:36:54 +0200500 {YANG_VALUE, &val_enum, 0},
501 {YANG_WHEN, &when_p, 0},
502 {YANG_CUSTOM, NULL, 0},
503 {YIN_TEXT, &value, 0}
David Sedlákd3983112019-07-12 11:20:56 +0200504 };
David Sedlákfd5b9c32019-07-12 15:33:13 +0200505 ret = yin_parse_content(st->yin_ctx, subelems, 17, &data, YANG_PREFIX, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200506 assert_int_equal(ret, LY_SUCCESS);
David Sedlák1fdb2522019-07-09 16:22:57 +0200507 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
David Sedlák2ce1be62019-07-10 16:15:09 +0200508 /* check parsed values */
David Sedláke7084ce2019-07-10 16:44:15 +0200509 assert_string_equal(def, "default-value");
David Sedlák555c7202019-07-04 12:14:12 +0200510 assert_string_equal(exts->name, "custom");
511 assert_string_equal(exts->argument, "totally amazing extension");
512 assert_string_equal(value, "wsefsdf");
David Sedláka5b1d382019-07-10 16:31:09 +0200513 assert_string_equal(units, "radians");
David Sedlák32eee7b2019-07-09 12:38:44 +0200514 assert_string_equal(when_p->cond, "condition...");
515 assert_string_equal(when_p->dsc, "when_desc");
516 assert_string_equal(when_p->ref, "when_ref");
David Sedláke1a30302019-07-10 13:49:38 +0200517 assert_int_equal(config, LYS_CONFIG_W);
David Sedlák5545f5d2019-07-11 11:55:16 +0200518 assert_int_equal(pos_enum.value, 25);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200519 assert_true(pos_enum.flags & LYS_SET_VALUE);
David Sedlák5545f5d2019-07-11 11:55:16 +0200520 assert_int_equal(val_enum.value, -5);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200521 assert_true(val_enum.flags & LYS_SET_VALUE);
David Sedlákcf5569a2019-07-11 13:31:34 +0200522 assert_int_equal(req_type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200523 assert_true(req_type.flags &= LYS_SET_REQINST);
David Sedlákb7296dd2019-07-11 14:58:38 +0200524 assert_string_equal(range_type.range->arg, "5..10");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200525 assert_true(range_type.flags & LYS_SET_RANGE);
David Sedlákc1771b12019-07-10 15:55:46 +0200526 assert_string_equal(err_msg, "error-msg");
David Sedlák2ce1be62019-07-10 16:15:09 +0200527 assert_string_equal(app_tag, "err-app-tag");
David Sedlákfd5b9c32019-07-12 15:33:13 +0200528 assert_string_equal(enum_type.enums->name, "yay");
David Sedlák438ae432019-07-11 15:36:54 +0200529 assert_string_equal(len_type.length->arg, "baf");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200530 assert_true(len_type.flags & LYS_SET_LENGTH);
David Sedlákd3983112019-07-12 11:20:56 +0200531 assert_string_equal(patter_type.patterns->arg, "\x015pattern");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200532 assert_true(patter_type.flags & LYS_SET_PATTERN);
David Sedlák2ce1be62019-07-10 16:15:09 +0200533 /* cleanup */
David Sedlák555c7202019-07-04 12:14:12 +0200534 lysp_ext_instance_free(st->ctx, exts);
David Sedlák32eee7b2019-07-09 12:38:44 +0200535 lysp_when_free(st->ctx, when_p);
David Sedlák986cb412019-07-04 13:10:11 +0200536 lysp_ext_free(st->ctx, ext_def);
David Sedlák5f8191e2019-07-08 16:35:52 +0200537 FREE_STRING(st->ctx, *if_features);
David Sedlákc1771b12019-07-10 15:55:46 +0200538 FREE_STRING(st->ctx, err_msg);
David Sedlák2ce1be62019-07-10 16:15:09 +0200539 FREE_STRING(st->ctx, app_tag);
David Sedláka5b1d382019-07-10 16:31:09 +0200540 FREE_STRING(st->ctx, units);
David Sedlákd3983112019-07-12 11:20:56 +0200541 FREE_STRING(st->ctx, patter_type.patterns->arg);
David Sedláke7084ce2019-07-10 16:44:15 +0200542 FREE_STRING(st->ctx, def);
David Sedlákb7296dd2019-07-11 14:58:38 +0200543 FREE_STRING(st->ctx, range_type.range->arg);
David Sedlák438ae432019-07-11 15:36:54 +0200544 FREE_STRING(st->ctx, len_type.length->arg);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200545 FREE_STRING(st->ctx, enum_type.enums->name);
David Sedlákb7296dd2019-07-11 14:58:38 +0200546 FREE_STRING(st->ctx, value);
David Sedlák5f8191e2019-07-08 16:35:52 +0200547 LY_ARRAY_FREE(if_features);
David Sedlák555c7202019-07-04 12:14:12 +0200548 LY_ARRAY_FREE(exts);
David Sedlák986cb412019-07-04 13:10:11 +0200549 LY_ARRAY_FREE(ext_def);
David Sedlák555c7202019-07-04 12:14:12 +0200550 LY_ARRAY_FREE(attrs);
David Sedlákd3983112019-07-12 11:20:56 +0200551 LY_ARRAY_FREE(patter_type.patterns);
David Sedlákfd5b9c32019-07-12 15:33:13 +0200552 LY_ARRAY_FREE(enum_type.enums);
David Sedlák32eee7b2019-07-09 12:38:44 +0200553 free(when_p);
David Sedlákb7296dd2019-07-11 14:58:38 +0200554 free(range_type.range);
David Sedlák438ae432019-07-11 15:36:54 +0200555 free(len_type.length);
David Sedlák555c7202019-07-04 12:14:12 +0200556 attrs = NULL;
David Sedlák555c7202019-07-04 12:14:12 +0200557 st = reset_state(state);
558
559 /* test unique subelem */
560 const char *prefix_value;
561 struct yin_subelement subelems2[2] = {{YANG_PREFIX, &prefix_value, 0},
562 {YIN_TEXT, &value, YIN_SUBELEM_UNIQUE}};
563 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
564 "<prefix value=\"inv_mod\" />"
565 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
566 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
567 "</module>";
David Sedlákda8ffa32019-07-08 14:17:10 +0200568 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
569 yin_load_attributes(st->yin_ctx, &data, &attrs);
570 ret = yin_parse_content(st->yin_ctx, subelems2, 2, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200571 assert_int_equal(ret, LY_EVALID);
572 logbuf_assert("Redefinition of text element in module element. Line number 1.");
573 lydict_remove(st->ctx, prefix_value);
574 lydict_remove(st->ctx, value);
575 st = reset_state(state);
576 LY_ARRAY_FREE(attrs);
577 attrs = NULL;
578
579 /* test first subelem */
580 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
581 "<prefix value=\"inv_mod\" />"
582 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
583 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
584 "</module>";
585 struct yin_subelement subelems3[2] = {{YANG_PREFIX, &prefix_value, 0},
586 {YIN_TEXT, &value, YIN_SUBELEM_FIRST}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200587 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
588 yin_load_attributes(st->yin_ctx, &data, &attrs);
589 ret = yin_parse_content(st->yin_ctx, subelems3, 2, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200590 assert_int_equal(ret, LY_EVALID);
591 logbuf_assert("Subelement text of module element must be defined as first subelement. Line number 1.");
592 lydict_remove(st->ctx, prefix_value);
593 st = reset_state(state);
594 LY_ARRAY_FREE(attrs);
595 attrs = NULL;
596
597 /* test mandatory subelem */
598 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
599 "</module>";
600 struct yin_subelement subelems4[1] = {{YANG_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY}};
David Sedlákda8ffa32019-07-08 14:17:10 +0200601 lyxml_get_element(&st->yin_ctx->xml_ctx, &data, &prefix.value, &prefix.len, &name.value, &name.len);
602 yin_load_attributes(st->yin_ctx, &data, &attrs);
603 ret = yin_parse_content(st->yin_ctx, subelems4, 1, &data, YANG_MODULE, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200604 assert_int_equal(ret, LY_EVALID);
605 logbuf_assert("Missing mandatory subelement prefix of module element. Line number 1.");
606 LY_ARRAY_FREE(attrs);
607
608 st->finished_correctly = true;
609}
610
David Sedlák92147b02019-07-09 14:01:01 +0200611static void
David Sedlák4a650532019-07-10 11:55:18 +0200612test_validate_value(void **state)
613{
614 struct state *st = *state;
615 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "#invalid", 8), LY_EVALID);
616 logbuf_assert("Invalid identifier character '#'. Line number 1.");
617 assert_int_equal(yin_validate_value(st->yin_ctx, Y_STR_ARG, "", 0), LY_SUCCESS);
618 assert_int_equal(yin_validate_value(st->yin_ctx, Y_IDENTIF_ARG, "pre:b", 5), LY_EVALID);
619 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:b", 5), LY_SUCCESS);
620 assert_int_equal(yin_validate_value(st->yin_ctx, Y_PREF_IDENTIF_ARG, "pre:pre:b", 9), LY_EVALID);
621
622 st->finished_correctly = true;
623}
624
David Sedlák32488102019-07-15 17:44:10 +0200625static int
626setup_element_test(void **state)
627{
David Sedlák8e7bda82019-07-16 17:57:50 +0200628 struct state *st = *state;
David Sedlák32488102019-07-15 17:44:10 +0200629
630#if ENABLE_LOGGER_CHECKING
631 /* setup logger */
632 ly_set_log_clb(logger, 1);
633#endif
634
635 /* reset logbuf */
636 logbuf[0] = '\0';
David Sedlák32488102019-07-15 17:44:10 +0200637
638 /* allocate parser context */
639 st->yin_ctx = calloc(1, sizeof(*st->yin_ctx));
640 st->yin_ctx->xml_ctx.ctx = st->ctx;
641 st->yin_ctx->xml_ctx.line = 1;
642
643 return EXIT_SUCCESS;
644}
645
646static int
647teardown_element_test(void **state)
648{
649 struct state *st = *(struct state **)state;
650
651#if ENABLE_LOGGER_CHECKING
652 /* teardown logger */
653 if (!st->finished_correctly && logbuf[0] != '\0') {
654 fprintf(stderr, "%s\n", logbuf);
655 }
656#endif
657
658 lyxml_context_clear(&st->yin_ctx->xml_ctx);
David Sedlák32488102019-07-15 17:44:10 +0200659 free(st->yin_ctx);
David Sedlák32488102019-07-15 17:44:10 +0200660
661 return EXIT_SUCCESS;
662}
663
664#define ELEMENT_WRAPPER_START "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
665#define ELEMENT_WRAPPER_END "</module>"
666
667/* helper function to simplify unit test of each element using parse_content function */
668LY_ERR
669test_element_helper(struct state *st, const char **data, void *dest, const char **text,
670 struct lysp_ext_instance **exts, bool valid)
671{
672 struct yin_arg_record *attrs = NULL;
673 struct sized_string name, prefix;
674 LY_ERR ret = LY_SUCCESS;
675 struct yin_subelement subelems[71] = {
676 {YANG_ACTION, dest, 0},
677 {YANG_ANYDATA, dest, 0},
678 {YANG_ANYXML, dest, 0},
679 {YANG_ARGUMENT,dest, 0},
680 {YANG_AUGMENT, dest, 0},
681 {YANG_BASE, dest, 0},
682 {YANG_BELONGS_TO, dest, 0},
683 {YANG_BIT, dest, 0},
684 {YANG_CASE, dest, 0},
685 {YANG_CHOICE, dest, 0},
686 {YANG_CONFIG, dest, 0},
687 {YANG_CONTACT, dest, 0},
688 {YANG_CONTAINER, dest, 0},
David Sedlákc3da3ef2019-07-19 12:56:08 +0200689 {YANG_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
David Sedlák32488102019-07-15 17:44:10 +0200690 {YANG_DESCRIPTION, dest, 0},
691 {YANG_DEVIATE, dest, 0},
692 {YANG_DEVIATION, dest, 0},
693 {YANG_ENUM, dest, 0},
694 {YANG_ERROR_APP_TAG, dest, 0},
695 {YANG_ERROR_MESSAGE, dest, 0},
696 {YANG_EXTENSION, dest, 0},
697 {YANG_FEATURE, dest, 0},
698 {YANG_FRACTION_DIGITS, dest, 0},
699 {YANG_GROUPING, dest, 0},
700 {YANG_IDENTITY, dest, 0},
701 {YANG_IF_FEATURE, dest, 0},
702 {YANG_IMPORT, dest, 0},
703 {YANG_INCLUDE, dest, 0},
704 {YANG_INPUT, dest, 0},
705 {YANG_KEY, dest, 0},
706 {YANG_LEAF, dest, 0},
707 {YANG_LEAF_LIST, dest, 0},
708 {YANG_LENGTH, dest, 0},
709 {YANG_LIST, dest, 0},
710 {YANG_MANDATORY, dest, 0},
711 {YANG_MAX_ELEMENTS, dest, 0},
712 {YANG_MIN_ELEMENTS, dest, 0},
713 {YANG_MODIFIER, dest, 0},
714 {YANG_MODULE, dest, 0},
715 {YANG_MUST, dest, 0},
716 {YANG_NAMESPACE, dest, 0},
717 {YANG_NOTIFICATION, dest, 0},
718 {YANG_ORDERED_BY, dest, 0},
719 {YANG_ORGANIZATION, dest, 0},
720 {YANG_OUTPUT, dest, 0},
721 {YANG_PATH, dest, 0},
722 {YANG_PATTERN, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200723 {YANG_PREFIX, dest, 0},
724 {YANG_PRESENCE, dest, 0},
725 {YANG_RANGE, dest, 0},
726 {YANG_REFERENCE, dest, 0},
727 {YANG_REFINE, dest, 0},
728 {YANG_REQUIRE_INSTANCE, dest, 0},
729 {YANG_REVISION, dest, 0},
730 {YANG_REVISION_DATE, dest, 0},
731 {YANG_RPC, dest, 0},
732 {YANG_STATUS, dest, 0},
733 {YANG_SUBMODULE, dest, 0},
734 {YANG_TYPE, dest, 0},
735 {YANG_TYPEDEF, dest, 0},
736 {YANG_UNIQUE, dest, 0},
737 {YANG_UNITS, dest, 0},
738 {YANG_USES, dest, 0},
David Sedlák374d2b32019-07-17 15:06:55 +0200739 {YANG_POSITION, dest, 0},
David Sedlák32488102019-07-15 17:44:10 +0200740 {YANG_VALUE, dest, 0},
741 {YANG_WHEN, dest, 0},
742 {YANG_YANG_VERSION, dest, 0},
743 {YANG_YIN_ELEMENT, dest, 0},
744 {YANG_CUSTOM, dest, 0},
745 {YIN_TEXT, dest, 0},
746 {YIN_VALUE, dest, 0}
747 };
748 LY_CHECK_RET(lyxml_get_element(&st->yin_ctx->xml_ctx, data, &prefix.value, &prefix.len, &name.value, &name.len));\
749 LY_CHECK_RET(yin_load_attributes(st->yin_ctx, data, &attrs));\
David Sedlák8e7bda82019-07-16 17:57:50 +0200750 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 +0200751 LY_ARRAY_FREE(attrs);
752 if (valid) {
753 assert_int_equal(st->yin_ctx->xml_ctx.status, LYXML_END);
754 }
755 /* reset status */
756 st->yin_ctx->xml_ctx.status = LYXML_ELEMENT;
757 return ret;
758}
759
760static void
761test_enum_bit_elem(void **state)
762{
763 /* yin_parse_enum_bit is function that is being mainly tested by this test */
764 struct state *st = *state;
765 struct lysp_type type = {};
766 const char *data;
767 data = ELEMENT_WRAPPER_START
768 "<enum name=\"enum-name\">"
769 "<if-feature name=\"feature\" />"
770 "<value value=\"55\" />"
771 "<status value=\"deprecated\" />"
772 "<description><text>desc...</text></description>"
773 "<reference><text>ref...</text></reference>"
774 "</enum>"
775 ELEMENT_WRAPPER_END;
776 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
777 assert_string_equal(*type.enums->iffeatures, "feature");
778 assert_int_equal(type.enums->value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200779 assert_true((type.enums->flags & LYS_STATUS_DEPRC) && (type.enums->flags & LYS_SET_VALUE));
David Sedlák32488102019-07-15 17:44:10 +0200780 assert_string_equal(type.enums->dsc, "desc...");
781 assert_string_equal(type.enums->ref, "ref...");
782 lysp_type_free(st->ctx, &type);
783 memset(&type, 0, sizeof type);
784
785 /* todo bit element test */
786 st->finished_correctly = true;
787}
788
789static void
790test_meta_elem(void **state)
791{
792 struct state *st = *state;
793 char *value = NULL;
794 const char *data;
795
796 /* organization element */
797 data = ELEMENT_WRAPPER_START
798 "<organization><text>organization...</text></organization>"
799 ELEMENT_WRAPPER_END;
800 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
801 assert_string_equal(value, "organization...");
802 FREE_STRING(st->ctx, value);
803 value = NULL;
804 /* contact element */
805 data = ELEMENT_WRAPPER_START
806 "<contact><text>contact...</text></contact>"
807 ELEMENT_WRAPPER_END;
808 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
809 assert_string_equal(value, "contact...");
810 FREE_STRING(st->ctx, value);
811 value = NULL;
812 /* description element */
813 data = ELEMENT_WRAPPER_START
814 "<description><text>description...</text></description>"
815 ELEMENT_WRAPPER_END;
816 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
817 assert_string_equal(value, "description...");
818 FREE_STRING(st->ctx, value);
819 value = NULL;
820 /* reference element */
821 data = ELEMENT_WRAPPER_START
822 "<reference><text>reference...</text></reference>"
823 ELEMENT_WRAPPER_END;
824 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
825 assert_string_equal(value, "reference...");
826 FREE_STRING(st->ctx, value);
827 value = NULL;
828
829 /* missing text subelement */
830 data = ELEMENT_WRAPPER_START
831 "<reference>reference...</reference>"
832 ELEMENT_WRAPPER_END;
833 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, false), LY_EVALID);
834 logbuf_assert("Missing mandatory subelement text of reference element. Line number 1.");
835
836 st->finished_correctly = true;
837}
838
839static void
840test_import_elem(void **state)
841{
842 struct state *st = *state;
843 const char *data;
844 struct lys_module *lys_mod = calloc(1, sizeof *lys_mod);
845 struct lysp_module *lysp_mod = calloc(1, sizeof *lysp_mod);
846 lys_mod->ctx = st->ctx;
847 lysp_mod->mod = lys_mod;
848
849 /* max subelems */
850 data = ELEMENT_WRAPPER_START
851 "<import module=\"a\">"
852 "<prefix value=\"a_mod\"/>"
853 "<revision-date date=\"2015-01-01\"></revision-date>"
854 "<description><text>import description</text></description>"
855 "<reference><text>import reference</text></reference>"
856 "</import>"
857 ELEMENT_WRAPPER_END;
858 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, true), LY_SUCCESS);
859 assert_string_equal(lysp_mod->imports->name, "a");
860 assert_string_equal(lysp_mod->imports->prefix, "a_mod");
861 assert_string_equal(lysp_mod->imports->rev, "2015-01-01");
862 assert_string_equal(lysp_mod->imports->dsc, "import description");
863 assert_string_equal(lysp_mod->imports->ref, "import reference");
864 lysp_module_free(lysp_mod);
865 lys_module_free(lys_mod, NULL);
866
867 /* min subelems */
868 lys_mod = calloc(1, sizeof *lys_mod);
869 lysp_mod = calloc(1, sizeof *lysp_mod);
870 lys_mod->ctx = st->ctx;
871 lysp_mod->mod = lys_mod;
872 data = ELEMENT_WRAPPER_START
873 "<import module=\"a\">"
874 "<prefix value=\"a_mod\"/>"
875 "</import>"
876 ELEMENT_WRAPPER_END;
877 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, true), LY_SUCCESS);
878 assert_string_equal(lysp_mod->imports->prefix, "a_mod");
879 lysp_module_free(lysp_mod);
880 lys_module_free(lys_mod, NULL);
881
882 /* invalid (missing prefix) */
883 lys_mod = calloc(1, sizeof *lys_mod);
884 lysp_mod = calloc(1, sizeof *lysp_mod);
885 lys_mod->ctx = st->ctx;
886 lysp_mod->mod = lys_mod;
887 data = ELEMENT_WRAPPER_START "<import module=\"a\">""</import>" ELEMENT_WRAPPER_END;
888 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, false), LY_EVALID);
889 logbuf_assert("Missing mandatory subelement prefix of import element. Line number 1.");
890 lysp_module_free(lysp_mod);
891 lys_module_free(lys_mod, NULL);
892
893 /* invalid reused prefix */
894 lys_mod = calloc(1, sizeof *lys_mod);
895 lysp_mod = calloc(1, sizeof *lysp_mod);
896 lys_mod->ctx = st->ctx;
897 lysp_mod->mod = lys_mod;
898 data = ELEMENT_WRAPPER_START
899 "<import module=\"a\">"
900 "<prefix value=\"a_mod\"/>"
901 "</import>"
902 "<import module=\"a\">"
903 "<prefix value=\"a_mod\"/>"
904 "</import>"
905 ELEMENT_WRAPPER_END;
906 assert_int_equal(test_element_helper(st, &data, lysp_mod, NULL, NULL, false), LY_EVALID);
907 logbuf_assert("Prefix \"a_mod\" already used to import \"a\" module. Line number 1.");
908 lysp_module_free(lysp_mod);
909 lys_module_free(lys_mod, NULL);
910
911 st->finished_correctly = true;
912}
913
914static void
915test_status_elem(void **state)
916{
917 struct state *st = *state;
918 const char *data;
919 uint16_t flags = 0;
920
921 /* test valid values */
922 data = ELEMENT_WRAPPER_START "<status value=\"current\" />" ELEMENT_WRAPPER_END;
923 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200924 assert_true(flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200925
926 data = ELEMENT_WRAPPER_START "<status value=\"deprecated\" />" ELEMENT_WRAPPER_END;
927 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200928 assert_true(flags & LYS_STATUS_DEPRC);
David Sedlák32488102019-07-15 17:44:10 +0200929
930 data = ELEMENT_WRAPPER_START "<status value=\"obsolete\"></status>" ELEMENT_WRAPPER_END;
931 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200932 assert_true(flags & LYS_STATUS_OBSLT);
David Sedlák32488102019-07-15 17:44:10 +0200933
934 /* test invalid value */
935 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
936 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
937 logbuf_assert("Invalid value \"invalid\" of \"status\". Line number 1.");
938 st->finished_correctly = true;
939}
940
941static void
942test_ext_elem(void **state)
943{
944 struct state *st = *state;
945 const char *data;
946 struct lysp_ext *ext = NULL;
947
948 /* max subelems */
949 data = ELEMENT_WRAPPER_START
950 "<extension name=\"ext_name\">"
951 "<argument name=\"arg\"></argument>"
952 "<status value=\"current\"/>"
953 "<description><text>ext_desc</text></description>"
954 "<reference><text>ext_ref</text></reference>"
955 "</extension>"
956 ELEMENT_WRAPPER_END;
957 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
958 assert_string_equal(ext->name, "ext_name");
959 assert_string_equal(ext->argument, "arg");
David Sedlákc3da3ef2019-07-19 12:56:08 +0200960 assert_true(ext->flags & LYS_STATUS_CURR);
David Sedlák32488102019-07-15 17:44:10 +0200961 assert_string_equal(ext->dsc, "ext_desc");
962 assert_string_equal(ext->ref, "ext_ref");
963 lysp_ext_free(st->ctx, ext);
964 LY_ARRAY_FREE(ext);
965 ext = NULL;
966
967 /* min subelems */
968 data = ELEMENT_WRAPPER_START "<extension name=\"ext_name\"></extension>" ELEMENT_WRAPPER_END;
969 assert_int_equal(test_element_helper(st, &data, &ext, NULL, NULL, true), LY_SUCCESS);
970 assert_string_equal(ext->name, "ext_name");
971 lysp_ext_free(st->ctx, ext);
972 LY_ARRAY_FREE(ext);
973 ext = NULL;
974
975 st->finished_correctly = true;
976}
977
978static void
979test_yin_element_elem(void **state)
980{
981 struct state *st = *state;
982 const char *data;
983 uint16_t flags = 0;
984
985 data = ELEMENT_WRAPPER_START "<yin-element value=\"true\" />" ELEMENT_WRAPPER_END;
986 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200987 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200988
989 data = ELEMENT_WRAPPER_START "<yin-element value=\"false\" />" ELEMENT_WRAPPER_END;
990 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200991 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200992
993 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
994 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
David Sedlákc3da3ef2019-07-19 12:56:08 +0200995 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák32488102019-07-15 17:44:10 +0200996 logbuf_assert("Invalid value \"invalid\" of \"yin-element\". Line number 1.");
997 st->finished_correctly = true;
998}
999
1000static void
1001test_yangversion_elem(void **state)
1002{
1003 struct state *st = *state;
1004 const char *data;
1005 uint8_t version = 0;
1006
1007 /* valid values */
1008 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.0\" />" ELEMENT_WRAPPER_END;
1009 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001010 assert_true(version & LYS_VERSION_1_0);
David Sedlák32488102019-07-15 17:44:10 +02001011 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_0);
1012
1013 data = ELEMENT_WRAPPER_START "<yang-version value=\"1.1\" />" ELEMENT_WRAPPER_END;
1014 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001015 assert_true(version & LYS_VERSION_1_1);
David Sedlák32488102019-07-15 17:44:10 +02001016 assert_int_equal(st->yin_ctx->mod_version, LYS_VERSION_1_1);
1017
1018 /* invalid value */
1019 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
1020 assert_int_equal(test_element_helper(st, &data, &version, NULL, NULL, false), LY_EVALID);
1021 logbuf_assert("Invalid value \"version\" of \"yang-version\". Line number 1.");
1022
1023 st->finished_correctly = true;
1024}
1025
1026static void
1027test_mandatory_elem(void **state)
1028{
1029 struct state *st = *state;
1030 const char *data;
1031 uint16_t man = 0;
1032
1033 /* valid values */
1034 data = ELEMENT_WRAPPER_START "<mandatory value=\"true\" />" ELEMENT_WRAPPER_END;
1035 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1036 assert_int_equal(man, LYS_MAND_TRUE);
1037 man = 0;
1038
1039 data = ELEMENT_WRAPPER_START "<mandatory value=\"false\" />" ELEMENT_WRAPPER_END;
1040 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, true), LY_SUCCESS);
1041 assert_int_equal(man, LYS_MAND_FALSE);
1042
1043 data = ELEMENT_WRAPPER_START "<mandatory value=\"invalid\" />" ELEMENT_WRAPPER_END;
1044 assert_int_equal(test_element_helper(st, &data, &man, NULL, NULL, false), LY_EVALID);
1045 logbuf_assert("Invalid value \"invalid\" of \"mandatory\". Line number 1.");
1046
1047 st->finished_correctly = true;
1048}
1049
David Sedlák8e7bda82019-07-16 17:57:50 +02001050static void
1051test_argument_elem(void **state)
1052{
1053 struct state *st = *state;
1054 const char *data;
1055 uint16_t flags = 0;
1056 const char *arg;
1057 struct yin_argument_meta arg_meta = {&flags, &arg};
1058 /* max subelems */
1059 data = ELEMENT_WRAPPER_START
1060 "<argument name=\"arg-name\">"
1061 "<yin-element value=\"true\" />"
1062 "</argument>"
1063 ELEMENT_WRAPPER_END;
1064 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1065 assert_string_equal(arg, "arg-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001066 assert_true(flags & LYS_YINELEM_TRUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001067 flags = 0;
1068 FREE_STRING(st->ctx, arg);
1069 arg = NULL;
1070
1071 /* min subelems */
1072 data = ELEMENT_WRAPPER_START
1073 "<argument name=\"arg\">"
1074 "</argument>"
1075 ELEMENT_WRAPPER_END;
1076 assert_int_equal(test_element_helper(st, &data, &arg_meta, NULL, NULL, true), LY_SUCCESS);
1077 assert_string_equal(arg, "arg");
1078 assert_true(flags == 0);
1079 FREE_STRING(st->ctx, arg);
1080
1081 st->finished_correctly = true;
1082}
1083
1084static void
1085test_base_elem(void **state)
1086{
1087 struct state *st = *state;
1088 const char *data;
1089 const char **bases = NULL;
1090 struct lysp_type type = {};
1091
1092 /* as identity subelement */
1093 data = "<identity xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
1094 "<base name=\"base-name\"/>"
1095 "</identity>";
1096 assert_int_equal(test_element_helper(st, &data, &bases, NULL, NULL, true), LY_SUCCESS);
1097 assert_string_equal(*bases, "base-name");
1098 FREE_STRING(st->ctx, *bases);
1099 LY_ARRAY_FREE(bases);
1100
1101 /* as type subelement */
1102 data = "<type xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
1103 "<base name=\"base-name\"/>"
1104 "</type>";
1105 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1106 assert_string_equal(*type.bases, "base-name");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001107 assert_true(type.flags & LYS_SET_BASE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001108 FREE_STRING(st->ctx, *type.bases);
1109 LY_ARRAY_FREE(type.bases);
1110
1111 st->finished_correctly = true;
1112}
1113
1114static void
1115test_belongsto_elem(void **state)
1116{
1117 struct state *st = *state;
1118 const char *data;
1119 struct lysp_submodule submod;
1120
1121 data = ELEMENT_WRAPPER_START
1122 "<belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>"
1123 ELEMENT_WRAPPER_END;
1124 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, true), LY_SUCCESS);
1125 assert_string_equal(submod.belongsto, "module-name");
1126 assert_string_equal(submod.prefix, "pref");
1127 FREE_STRING(st->ctx, submod.belongsto);
1128 FREE_STRING(st->ctx, submod.prefix);
1129
1130 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
1131 assert_int_equal(test_element_helper(st, &data, &submod, NULL, NULL, false), LY_EVALID);
1132 logbuf_assert("Missing mandatory subelement prefix of belongs-to element. Line number 1.");
1133 FREE_STRING(st->ctx, submod.belongsto);
1134
1135 st->finished_correctly = true;
1136}
1137
1138static void
1139test_config_elem(void **state)
1140{
1141 struct state *st = *state;
1142 const char *data;
1143 uint16_t flags = 0;
1144
1145 data = ELEMENT_WRAPPER_START "<config value=\"true\"/>" ELEMENT_WRAPPER_END;
1146 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001147 assert_true(flags & LYS_CONFIG_W);
David Sedlák8e7bda82019-07-16 17:57:50 +02001148 flags = 0;
1149
1150 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
1151 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001152 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001153 flags = 0;
1154
1155 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1156 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1157 logbuf_assert("Invalid value \"invalid\" of \"config\". Line number 1.");
1158
1159 st->finished_correctly = true;
1160}
1161
1162static void
1163test_default_elem(void **state)
1164{
1165 struct state *st = *state;
1166 const char *data;
1167 const char *val = NULL;
1168
1169 data = ELEMENT_WRAPPER_START "<default value=\"defaul-value\"/>" ELEMENT_WRAPPER_END;
1170 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1171 assert_string_equal(val, "defaul-value");
1172 FREE_STRING(st->ctx, val);
1173 val = NULL;
1174
1175 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
1176 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1177 logbuf_assert("Missing mandatory attribute value of default element. Line number 1.");
1178
1179 st->finished_correctly = true;
1180}
1181
1182static void
1183test_err_app_tag_elem(void **state)
1184{
1185 struct state *st = *state;
1186 const char *data;
1187 const char *val = NULL;
1188
1189 data = ELEMENT_WRAPPER_START "<error-app-tag value=\"val\"/>" ELEMENT_WRAPPER_END;
1190 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1191 assert_string_equal(val, "val");
1192 FREE_STRING(st->ctx, val);
1193 val = NULL;
1194
1195 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
1196 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1197 logbuf_assert("Missing mandatory attribute value of error-app-tag element. Line number 1.");
1198
1199 st->finished_correctly = true;
1200}
1201
1202static void
1203test_err_msg_elem(void **state)
1204{
1205 struct state *st = *state;
1206 const char *data;
1207 const char *val = NULL;
1208
1209 data = ELEMENT_WRAPPER_START "<error-message><value>val</value></error-message>" ELEMENT_WRAPPER_END;
1210 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1211 assert_string_equal(val, "val");
1212 FREE_STRING(st->ctx, val);
1213
1214 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
1215 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
1216 logbuf_assert("Missing mandatory subelement value of error-message element. Line number 1.");
1217
1218 st->finished_correctly = true;
1219}
1220
1221static void
1222test_fracdigits_elem(void **state)
1223{
1224 struct state *st = *state;
1225 const char *data;
1226 struct lysp_type type = {};
1227
1228 /* valid value */
1229 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"10\"></fraction-digits>" ELEMENT_WRAPPER_END;
1230 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1231 assert_int_equal(type.fraction_digits, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001232 assert_true(type.flags & LYS_SET_FRDIGITS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001233
1234 /* invalid values */
1235 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
1236 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1237 logbuf_assert("Invalid value \"-1\" of \"fraction-digits\". Line number 1.");
1238
1239 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
1240 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1241 logbuf_assert("Invalid value \"02\" of \"fraction-digits\". Line number 1.");
1242
1243 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
1244 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1245 logbuf_assert("Invalid value \"1p\" of \"fraction-digits\". Line number 1.");
1246
1247 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
1248 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1249 logbuf_assert("Invalid value \"19\" of \"fraction-digits\". Line number 1.");
1250
1251 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
1252 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1253 logbuf_assert("Invalid value \"999999999999999999\" of \"fraction-digits\". Line number 1.");
1254
1255 st->finished_correctly = true;
1256}
1257
1258static void
1259test_iffeature_elem(void **state)
1260{
1261 struct state *st = *state;
1262 const char *data;
1263 const char **iffeatures = NULL;
1264
1265 data = ELEMENT_WRAPPER_START "<if-feature name=\"local-storage\"></if-feature>" ELEMENT_WRAPPER_END;
1266 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, true), LY_SUCCESS);
1267 assert_string_equal(*iffeatures, "local-storage");
1268 FREE_STRING(st->ctx, *iffeatures);
1269 LY_ARRAY_FREE(iffeatures);
1270 iffeatures = NULL;
1271
1272 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
1273 assert_int_equal(test_element_helper(st, &data, &iffeatures, NULL, NULL, false), LY_EVALID);
1274 logbuf_assert("Missing mandatory attribute name of if-feature element. Line number 1.");
1275 LY_ARRAY_FREE(iffeatures);
1276 iffeatures = NULL;
1277
1278 st->finished_correctly = true;
1279}
1280
1281static void
1282test_length_elem(void **state)
1283{
1284 struct state *st = *state;
1285 const char *data;
1286 struct lysp_type type = {};
1287
1288 /* max subelems */
1289 data = ELEMENT_WRAPPER_START
1290 "<length value=\"length-str\">"
1291 "<error-message><value>err-msg</value></error-message>"
1292 "<error-app-tag value=\"err-app-tag\"/>"
1293 "<description><text>desc</text></description>"
1294 "<reference><text>ref</text></reference>"
1295 "</length>"
1296 ELEMENT_WRAPPER_END;
1297 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1298 assert_string_equal(type.length->arg, "length-str");
1299 assert_string_equal(type.length->emsg, "err-msg");
1300 assert_string_equal(type.length->eapptag, "err-app-tag");
1301 assert_string_equal(type.length->dsc, "desc");
1302 assert_string_equal(type.length->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001303 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001304 lysp_type_free(st->ctx, &type);
1305 memset(&type, 0, sizeof(type));
1306
1307 /* min subelems */
1308 data = ELEMENT_WRAPPER_START
1309 "<length value=\"length-str\">"
1310 "</length>"
1311 ELEMENT_WRAPPER_END;
1312 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1313 assert_string_equal(type.length->arg, "length-str");
1314 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001315 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001316 memset(&type, 0, sizeof(type));
1317
1318 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
1319 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1320 logbuf_assert("Missing mandatory attribute value of length element. Line number 1.");
1321 lysp_type_free(st->ctx, &type);
1322 memset(&type, 0, sizeof(type));
1323
1324 st->finished_correctly = true;
1325}
1326
1327static void
1328test_modifier_elem(void **state)
1329{
1330 struct state *st = *state;
1331 const char *data;
1332 const char *pat = lydict_insert(st->ctx, "\006pattern", 8);
1333
1334 data = ELEMENT_WRAPPER_START "<modifier value=\"invert-match\" />" ELEMENT_WRAPPER_END;
1335 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, true), LY_SUCCESS);
1336 assert_string_equal(pat, "\x015pattern");
1337 FREE_STRING(st->ctx, pat);
1338
1339 pat = lydict_insert(st->ctx, "\006pattern", 8);
1340 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
1341 assert_int_equal(test_element_helper(st, &data, &pat, NULL, NULL, false), LY_EVALID);
1342 logbuf_assert("Invalid value \"invert\" of \"modifier\". Line number 1.");
1343 FREE_STRING(st->ctx, pat);
1344
1345 st->finished_correctly = true;
1346}
1347
1348static void
1349test_namespace_elem(void **state)
1350{
1351 struct state *st = *state;
1352 const char *data;
1353 const char *ns;
1354
1355 data = ELEMENT_WRAPPER_START "<namespace uri=\"ns\"/>" ELEMENT_WRAPPER_END;
1356 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, true), LY_SUCCESS);
1357 assert_string_equal(ns, "ns");
1358 FREE_STRING(st->ctx, ns);
1359
1360 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
1361 assert_int_equal(test_element_helper(st, &data, &ns, NULL, NULL, false), LY_EVALID);
1362 logbuf_assert("Missing mandatory attribute uri of namespace element. Line number 1.");
1363
1364 st->finished_correctly = true;
1365}
1366
1367static void
1368test_path_elem(void **state)
1369{
1370 struct state *st = *state;
1371 const char *data;
1372 struct lysp_type type = {};
1373
1374 data = ELEMENT_WRAPPER_START "<path value=\"path-val\"/>" ELEMENT_WRAPPER_END;
1375 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1376 assert_string_equal("path-val", type.path);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001377 assert_true(type.flags & LYS_SET_PATH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001378 lysp_type_free(st->ctx, &type);
1379
1380 st->finished_correctly = true;
1381}
1382
1383static void
1384test_pattern_elem(void **state)
1385{
1386 struct state *st = *state;
1387 const char *data;
1388 struct lysp_type type = {};
1389
1390 /* max subelems */
1391 data = ELEMENT_WRAPPER_START
1392 "<pattern value=\"super_pattern\">"
1393 "<modifier value=\"invert-match\"/>"
1394 "<error-message><value>err-msg-value</value></error-message>"
1395 "<error-app-tag value=\"err-app-tag-value\"/>"
1396 "<description><text>pattern-desc</text></description>"
1397 "<reference><text>pattern-ref</text></reference>"
1398 "</pattern>"
1399 ELEMENT_WRAPPER_END;
1400 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001401 assert_true(type.flags & LYS_SET_PATTERN);
David Sedlák8e7bda82019-07-16 17:57:50 +02001402 assert_string_equal(type.patterns->arg, "\x015super_pattern");
1403 assert_string_equal(type.patterns->dsc, "pattern-desc");
1404 assert_string_equal(type.patterns->eapptag, "err-app-tag-value");
1405 assert_string_equal(type.patterns->emsg, "err-msg-value");
1406 assert_string_equal(type.patterns->dsc, "pattern-desc");
1407 assert_string_equal(type.patterns->ref, "pattern-ref");
1408 lysp_type_free(st->ctx, &type);
1409 memset(&type, 0, sizeof(type));
1410
1411 /* min subelems */
1412 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
1413 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1414 assert_string_equal(type.patterns->arg, "\x006pattern");
1415 lysp_type_free(st->ctx, &type);
1416 memset(&type, 0, sizeof(type));
1417
1418 st->finished_correctly = true;
1419}
1420
1421static void
1422test_value_position_elem(void **state)
1423{
1424 struct state *st = *state;
1425 const char *data;
1426 struct lysp_type_enum en = {};
1427
1428 /* valid values */
1429 data = ELEMENT_WRAPPER_START "<value value=\"55\" />" ELEMENT_WRAPPER_END;
1430 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1431 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001432 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001433 memset(&en, 0, sizeof(en));
1434
1435 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
1436 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1437 assert_int_equal(en.value, -55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001438 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001439 memset(&en, 0, sizeof(en));
1440
1441 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
1442 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1443 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001444 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001445 memset(&en, 0, sizeof(en));
1446
1447 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
1448 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1449 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001450 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001451 memset(&en, 0, sizeof(en));
1452
1453 /* valid positions */
1454 data = ELEMENT_WRAPPER_START "<position value=\"55\" />" ELEMENT_WRAPPER_END;
1455 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1456 assert_int_equal(en.value, 55);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001457 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001458 memset(&en, 0, sizeof(en));
1459
1460 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
1461 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, true), LY_SUCCESS);
1462 assert_int_equal(en.value, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001463 assert_true(en.flags & LYS_SET_VALUE);
David Sedlák8e7bda82019-07-16 17:57:50 +02001464 memset(&en, 0, sizeof(en));
1465
1466 /* invalid values */
1467 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
1468 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1469 logbuf_assert("Invalid value \"99999999999999999999999\" of \"value\". Line number 1.");
1470
1471 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
1472 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1473 logbuf_assert("Invalid value \"1k\" of \"value\". Line number 1.");
1474
David Sedlák69f01612019-07-17 11:41:08 +02001475 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
1476 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1477 logbuf_assert("Invalid value \"\" of \"value\". Line number 1.");
1478
David Sedlák8e7bda82019-07-16 17:57:50 +02001479 /*invalid positions */
1480 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
1481 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1482 logbuf_assert("Invalid value \"-5\" of \"position\". Line number 1.");
1483
1484 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
1485 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1486 logbuf_assert("Invalid value \"-0\" of \"position\". Line number 1.");
1487
1488 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
1489 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1490 logbuf_assert("Invalid value \"99999999999999999999\" of \"position\". Line number 1.");
1491
David Sedlák69f01612019-07-17 11:41:08 +02001492 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
1493 assert_int_equal(test_element_helper(st, &data, &en, NULL, NULL, false), LY_EVALID);
1494 logbuf_assert("Invalid value \"\" of \"position\". Line number 1.");
1495
1496 st->finished_correctly = true;
1497}
1498
1499static void
1500test_prefix_elem(void **state)
1501{
1502 struct state *st = *state;
1503 const char *data;
1504 const char *value = NULL;
1505
1506 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
1507 assert_int_equal(test_element_helper(st, &data, &value, NULL, NULL, true), LY_SUCCESS);
1508 assert_string_equal(value, "pref");
1509 FREE_STRING(st->ctx, value);
1510
1511 st->finished_correctly = true;
1512}
1513
1514static void
1515test_range_elem(void **state)
1516{
1517 struct state *st = *state;
1518 const char *data;
1519 struct lysp_type type = {};
1520
1521 /* max subelems */
1522 data = ELEMENT_WRAPPER_START
1523 "<range value=\"range-str\">"
1524 "<error-message><value>err-msg</value></error-message>"
1525 "<error-app-tag value=\"err-app-tag\" />"
1526 "<description><text>desc</text></description>"
1527 "<reference><text>ref</text></reference>"
1528 "</range>"
1529 ELEMENT_WRAPPER_END;
1530 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1531 assert_string_equal(type.range->arg, "range-str");
1532 assert_string_equal(type.range->dsc, "desc");
1533 assert_string_equal(type.range->eapptag, "err-app-tag");
1534 assert_string_equal(type.range->emsg, "err-msg");
1535 assert_string_equal(type.range->ref, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001536 assert_true(type.flags & LYS_SET_RANGE);
David Sedlák69f01612019-07-17 11:41:08 +02001537 lysp_type_free(st->ctx, &type);
1538 memset(&type, 0, sizeof(type));
1539
1540 /* min subelems */
1541 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
1542 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1543 assert_string_equal(type.range->arg, "range-str");
1544 lysp_type_free(st->ctx, &type);
1545 memset(&type, 0, sizeof(type));
1546
1547 st->finished_correctly = true;
1548}
1549
1550static void
1551test_reqinstance_elem(void **state)
1552{
1553 struct state *st = *state;
1554 const char *data;
1555 struct lysp_type type = {};
1556
1557 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\"/>" ELEMENT_WRAPPER_END;
1558 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1559 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001560 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001561 memset(&type, 0, sizeof(type));
1562
1563 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
1564 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1565 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001566 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001567 memset(&type, 0, sizeof(type));
1568
1569 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
1570 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, false), LY_EVALID);
1571 memset(&type, 0, sizeof(type));
1572 logbuf_assert("Invalid value \"invalid\" of \"require-instance\". Line number 1.");
1573
1574 st->finished_correctly = true;
1575}
1576
1577static void
1578test_revision_date_elem(void **state)
1579{
1580 struct state *st = *state;
1581 const char *data;
1582 char rev[LY_REV_SIZE];
1583
1584 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
1585 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, true), LY_SUCCESS);
1586 assert_string_equal(rev, "2000-01-01");
1587
1588 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
1589 assert_int_equal(test_element_helper(st, &data, rev, NULL, NULL, false), LY_EVALID);
1590 logbuf_assert("Invalid value \"2000-50-05\" of \"revision-date\". Line number 1.");
1591
1592 st->finished_correctly = true;
1593}
1594
1595static void
1596test_unique_elem(void **state)
1597{
1598 struct state *st = *state;
1599 const char *data;
1600 const char **values = NULL;
1601
1602 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
1603 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1604 assert_string_equal(*values, "tag");
1605 FREE_STRING(st->ctx, *values);
1606 LY_ARRAY_FREE(values);
1607
1608 st->finished_correctly = true;
1609}
1610
1611static void
1612test_units_elem(void **state)
1613{
1614 struct state *st = *state;
1615 const char *data;
1616 const char *values = NULL;
1617
1618 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
1619 assert_int_equal(test_element_helper(st, &data, &values, NULL, NULL, true), LY_SUCCESS);
1620 assert_string_equal(values, "name");
1621 FREE_STRING(st->ctx, values);
1622
1623 st->finished_correctly = true;
1624}
1625
1626static void
1627test_when_elem(void **state)
1628{
1629 struct state *st = *state;
1630 const char *data;
1631 struct lysp_when *when = NULL;
1632
1633 data = ELEMENT_WRAPPER_START
1634 "<when condition=\"cond\">"
1635 "<description><text>desc</text></description>"
1636 "<reference><text>ref</text></reference>"
1637 "</when>"
1638 ELEMENT_WRAPPER_END;
1639 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1640 assert_string_equal(when->cond, "cond");
1641 assert_string_equal(when->dsc, "desc");
1642 assert_string_equal(when->ref, "ref");
1643 lysp_when_free(st->ctx, when);
1644 free(when);
1645 when = NULL;
1646
1647 data = ELEMENT_WRAPPER_START "<when condition=\"cond\" />" ELEMENT_WRAPPER_END;
1648 assert_int_equal(test_element_helper(st, &data, &when, NULL, NULL, true), LY_SUCCESS);
1649 assert_string_equal(when->cond, "cond");
1650 lysp_when_free(st->ctx, when);
1651 free(when);
1652 when = NULL;
1653
1654 st->finished_correctly = true;
1655}
1656
1657static void
1658test_yin_text_value_elem(void **state)
1659{
1660 struct state *st = *state;
1661 const char *data;
1662 const char *val;
1663
1664 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
1665 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1666 assert_string_equal(val, "text");
1667 FREE_STRING(st->ctx, val);
1668
1669 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
1670 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1671 assert_string_equal(val, "text");
1672 FREE_STRING(st->ctx, val);
1673
1674 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
1675 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
1676 assert_string_equal("", val);
1677 FREE_STRING(st->ctx, val);
1678
David Sedlák8e7bda82019-07-16 17:57:50 +02001679 st->finished_correctly = true;
1680}
David Sedlák32488102019-07-15 17:44:10 +02001681
David Sedlák374d2b32019-07-17 15:06:55 +02001682static void
1683test_type_elem(void **state)
1684{
1685 struct state *st = *state;
1686 const char *data;
1687 struct lysp_type type = {};
1688
1689 /* max subelems */
1690 data = ELEMENT_WRAPPER_START
1691 "<type name=\"type-name\">"
1692 "<base name=\"base-name\"/>"
1693 "<bit name=\"bit\"/>"
1694 "<enum name=\"enum\"/>"
1695 "<fraction-digits value=\"2\"/>"
1696 "<length value=\"length\"/>"
1697 "<path value=\"path\"/>"
1698 "<pattern value=\"pattern\"/>"
1699 "<range value=\"range\" />"
1700 "<require-instance value=\"true\"/>"
1701 "<type name=\"sub-type-name\"/>"
1702 "</type>"
1703 ELEMENT_WRAPPER_END;
1704 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1705 assert_string_equal(type.name, "type-name");
1706 assert_string_equal(*type.bases, "base-name");
1707 assert_string_equal(type.bits->name, "bit");
1708 assert_string_equal(type.enums->name, "enum");
1709 assert_int_equal(type.fraction_digits, 2);
1710 assert_string_equal(type.length->arg, "length");
1711 assert_string_equal(type.path, "path");
1712 assert_string_equal(type.patterns->arg, "\006pattern");
1713 assert_string_equal(type.range->arg, "range");
1714 assert_int_equal(type.require_instance, 1);
1715 assert_string_equal(type.types->name, "sub-type-name");
1716 lysp_type_free(st->ctx, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001717 assert_true(type.flags & LYS_SET_BASE);
1718 assert_true(type.flags & LYS_SET_BIT);
1719 assert_true(type.flags & LYS_SET_ENUM);
1720 assert_true(type.flags & LYS_SET_FRDIGITS);
1721 assert_true(type.flags & LYS_SET_LENGTH);
1722 assert_true(type.flags & LYS_SET_PATH);
1723 assert_true(type.flags & LYS_SET_PATTERN);
1724 assert_true(type.flags & LYS_SET_RANGE);
1725 assert_true(type.flags & LYS_SET_REQINST);
1726 assert_true(type.flags & LYS_SET_TYPE);
David Sedlák374d2b32019-07-17 15:06:55 +02001727 memset(&type, 0, sizeof(type));
1728
1729 /* min subelems */
1730 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
1731 assert_int_equal(test_element_helper(st, &data, &type, NULL, NULL, true), LY_SUCCESS);
1732 lysp_type_free(st->ctx, &type);
1733 memset(&type, 0, sizeof(type));
1734
1735 st->finished_correctly = true;
1736}
1737
David Sedlák1af868e2019-07-17 17:03:14 +02001738static void
1739test_max_elems_elem(void **state)
1740{
1741 struct state *st = *state;
1742 const char *data;
1743 struct lysp_node_list list = {};
1744 struct lysp_node_leaflist llist = {};
1745 struct lysp_refine refine = {};
1746
1747 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"unbounded\"/> </refine>";
1748 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1749 assert_int_equal(refine.max, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001750 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001751
1752 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"5\"/> </list>";
1753 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
1754 assert_int_equal(list.max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001755 assert_true(list.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001756
1757 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"85\"/> </leaf-list>";
1758 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
1759 assert_int_equal(llist.max, 85);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001760 assert_true(llist.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001761
1762 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
1763 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1764 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001765 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001766
1767 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
1768 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1769 logbuf_assert("Invalid value \"0\" of \"max-elements\". Line number 1.");
1770
1771 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
1772 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1773 logbuf_assert("Invalid value \"-10\" of \"max-elements\". Line number 1.");
1774
1775 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
1776 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1777 logbuf_assert("Invalid value \"k\" of \"max-elements\". Line number 1.");
1778
1779 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
1780 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, false), LY_EVALID);
1781 logbuf_assert("Invalid value \"u12\" of \"max-elements\". Line number 1.");
1782
1783 st->finished_correctly = true;
1784}
1785
David Sedlák09e18c92019-07-18 11:17:11 +02001786static void
1787test_min_elems_elem(void **state)
1788{
1789 struct state *st = *state;
1790 const char *data;
1791 struct lysp_node_list list = {};
1792 struct lysp_node_leaflist llist = {};
1793 struct lysp_refine refine = {};
1794
1795 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"0\"/> </refine>";
1796 assert_int_equal(test_element_helper(st, &data, &refine, NULL, NULL, true), LY_SUCCESS);
1797 assert_int_equal(refine.min, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001798 assert_true(refine.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001799
1800 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"41\"/> </list>";
1801 assert_int_equal(test_element_helper(st, &data, &list, NULL, NULL, true), LY_SUCCESS);
1802 assert_int_equal(list.min, 41);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001803 assert_true(list.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001804
1805 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"50\"/> </leaf-list>";
1806 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, true), LY_SUCCESS);
1807 assert_int_equal(llist.min, 50);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001808 assert_true(llist.flags & LYS_SET_MIN);
David Sedlák09e18c92019-07-18 11:17:11 +02001809
1810 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
1811 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1812 logbuf_assert("Value \"-5\" is out of \"min-elements\" bounds. Line number 1.");
1813
1814 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
1815 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1816 logbuf_assert("Value \"99999999999999999\" is out of \"min-elements\" bounds. Line number 1.");
1817
1818 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
1819 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1820 logbuf_assert("Invalid value \"5k\" of \"min-elements\". Line number 1.");
1821
1822 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
1823 assert_int_equal(test_element_helper(st, &data, &llist, NULL, NULL, false), LY_EVALID);
1824 logbuf_assert("Invalid value \"05\" of \"min-elements\". Line number 1.");
1825
1826 st->finished_correctly = true;
1827}
1828
David Sedláka2dad212019-07-18 12:45:19 +02001829static void
1830test_ordby_elem(void **state)
1831{
1832 struct state *st = *state;
1833 const char *data;
1834 uint16_t flags = 0;
1835
1836 data = ELEMENT_WRAPPER_START "<ordered-by value=\"system\"/>" ELEMENT_WRAPPER_END;
1837 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001838 assert_true(flags & LYS_ORDBY_SYSTEM);
David Sedláka2dad212019-07-18 12:45:19 +02001839
1840 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
1841 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, true), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001842 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02001843
1844 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
1845 assert_int_equal(test_element_helper(st, &data, &flags, NULL, NULL, false), LY_EVALID);
1846 logbuf_assert("Invalid value \"inv\" of \"ordered-by\". Line number 1.");
1847
1848 st->finished_correctly = true;
1849}
1850
David Sedlák8a83bbb2019-07-18 14:46:00 +02001851static void
1852test_any_elem(void **state)
1853{
1854 struct state *st = *state;
1855 const char *data;
1856 struct lysp_node *siblings = NULL;
1857 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1858 struct lysp_node_anydata *parsed = NULL;
1859
1860 /* anyxml max subelems */
1861 data = ELEMENT_WRAPPER_START
1862 "<anyxml name=\"any-name\">"
1863 "<config value=\"true\" />"
1864 "<description><text>desc</text></description>"
1865 "<if-feature name=\"feature\" />"
1866 "<mandatory value=\"true\" />"
1867 "<must condition=\"must-cond\" />"
1868 "<reference><text>ref</text></reference>"
1869 "<status value=\"deprecated\"/>"
1870 "<when condition=\"when-cond\"/>"
1871 "</anyxml>"
1872 ELEMENT_WRAPPER_END;
1873 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1874 parsed = (struct lysp_node_anydata *)siblings;
1875 assert_null(parsed->parent);
1876 assert_int_equal(parsed->nodetype, LYS_ANYXML);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001877 assert_true(parsed->flags & LYS_CONFIG_W);
1878 assert_true(parsed->flags & LYS_MAND_TRUE);
1879 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001880 assert_null(parsed->next);
1881 assert_string_equal(parsed->name, "any-name");
1882 assert_string_equal(parsed->dsc, "desc");
1883 assert_string_equal(parsed->ref, "ref");
1884 assert_string_equal(parsed->when->cond, "when-cond");
1885 assert_string_equal(*parsed->iffeatures, "feature");
1886 assert_null(parsed->exts);
1887 lysp_node_free(st->ctx, siblings);
1888 siblings = NULL;
1889
1890 /* anydata max subelems */
1891 data = ELEMENT_WRAPPER_START
1892 "<anydata name=\"any-name\">"
1893 "<config value=\"true\" />"
1894 "<description><text>desc</text></description>"
1895 "<if-feature name=\"feature\" />"
1896 "<mandatory value=\"true\" />"
1897 "<must condition=\"must-cond\" />"
1898 "<reference><text>ref</text></reference>"
1899 "<status value=\"deprecated\"/>"
1900 "<when condition=\"when-cond\"/>"
1901 "</anydata>"
1902 ELEMENT_WRAPPER_END;
1903 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1904 parsed = (struct lysp_node_anydata *)siblings;
1905 assert_null(parsed->parent);
1906 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001907 assert_true(parsed->flags & LYS_CONFIG_W);
1908 assert_true(parsed->flags & LYS_MAND_TRUE);
1909 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001910 assert_null(parsed->next);
1911 assert_string_equal(parsed->name, "any-name");
1912 assert_string_equal(parsed->dsc, "desc");
1913 assert_string_equal(parsed->ref, "ref");
1914 assert_string_equal(parsed->when->cond, "when-cond");
1915 assert_string_equal(*parsed->iffeatures, "feature");
1916 assert_null(parsed->exts);
1917 lysp_node_free(st->ctx, siblings);
1918 siblings = NULL;
1919
1920 /* min subelems */
1921 node_meta.parent = (void *)0x10;
1922 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
1923 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1924 parsed = (struct lysp_node_anydata *)siblings;
1925 assert_ptr_equal(parsed->parent, node_meta.parent);
1926 assert_int_equal(parsed->nodetype, LYS_ANYDATA);
1927 assert_null(parsed->next);
1928 assert_null(parsed->exts);
1929 lysp_node_free(st->ctx, siblings);
1930
1931 st->finished_correctly = true;
1932}
1933
David Sedlák203ca3a2019-07-18 15:26:25 +02001934static void
1935test_leaf_elem(void **state)
1936{
1937 struct state *st = *state;
1938 const char *data;
1939 struct lysp_node *siblings = NULL;
1940 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1941 struct lysp_node_leaf *parsed = NULL;
1942
1943 /* max elements */
1944 data = ELEMENT_WRAPPER_START
1945 "<leaf name=\"leaf\">"
1946 "<config value=\"true\" />"
1947 "<default value=\"def-val\"/>"
1948 "<description><text>desc</text></description>"
1949 "<if-feature name=\"feature\" />"
1950 "<mandatory value=\"true\" />"
1951 "<must condition=\"must-cond\" />"
1952 "<reference><text>ref</text></reference>"
1953 "<status value=\"deprecated\"/>"
1954 "<type name=\"type\"/>"
1955 "<units name=\"uni\"/>"
1956 "<when condition=\"when-cond\"/>"
1957 "</leaf>"
1958 ELEMENT_WRAPPER_END;
1959 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1960 parsed = (struct lysp_node_leaf *)siblings;
1961 assert_null(parsed->parent);
1962 assert_int_equal(parsed->nodetype, LYS_LEAF);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001963 assert_true(parsed->flags & LYS_CONFIG_W);
1964 assert_true(parsed->flags & LYS_MAND_TRUE);
1965 assert_true(parsed->flags & LYS_STATUS_DEPRC);
David Sedlák203ca3a2019-07-18 15:26:25 +02001966 assert_null(parsed->next);
1967 assert_string_equal(parsed->name, "leaf");
1968 assert_string_equal(parsed->dsc, "desc");
1969 assert_string_equal(parsed->ref, "ref");
1970 assert_string_equal(parsed->when->cond, "when-cond");
1971 assert_string_equal(*parsed->iffeatures, "feature");
1972 assert_null(parsed->exts);
1973 assert_string_equal(parsed->musts->arg, "must-cond");
1974 assert_string_equal(parsed->type.name, "type");
1975 assert_string_equal(parsed->units, "uni");
1976 assert_string_equal(parsed->dflt, "def-val");
1977 lysp_node_free(st->ctx, siblings);
1978 siblings = NULL;
1979
1980 /* min elements */
1981 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
1982 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
1983 parsed = (struct lysp_node_leaf *)siblings;
1984 assert_string_equal(parsed->name, "leaf");
1985 assert_string_equal(parsed->type.name, "type");
1986 lysp_node_free(st->ctx, siblings);
1987 siblings = NULL;
1988
1989 st->finished_correctly = true;
1990}
1991
David Sedlákc3da3ef2019-07-19 12:56:08 +02001992static void
1993test_leaf_list_elem(void **state)
1994{
1995 struct state *st = *state;
1996 const char *data;
1997 struct lysp_node *siblings = NULL;
1998 struct tree_node_meta node_meta = {.parent = NULL, .siblings = &siblings};
1999 struct lysp_node_leaflist *parsed = NULL;
2000
2001 data = ELEMENT_WRAPPER_START
2002 "<leaf-list name=\"llist\">"
2003 "<config value=\"true\" />"
2004 "<default value=\"def-val0\"/>"
2005 "<default value=\"def-val1\"/>"
2006 "<description><text>desc</text></description>"
2007 "<if-feature name=\"feature\"/>"
2008 "<max-elements value=\"5\"/>"
2009 "<must condition=\"must-cond\"/>"
2010 "<ordered-by value=\"user\" />"
2011 "<reference><text>ref</text></reference>"
2012 "<status value=\"current\"/>"
2013 "<type name=\"type\"/>"
2014 "<units name=\"uni\"/>"
2015 "<when condition=\"when-cond\"/>"
2016 "</leaf-list>"
2017 ELEMENT_WRAPPER_END;
2018 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2019 parsed = (struct lysp_node_leaflist *)siblings;
2020 assert_string_equal(parsed->dflts[0], "def-val0");
2021 assert_string_equal(parsed->dflts[1], "def-val1");
2022 assert_string_equal(parsed->dsc, "desc");
2023 assert_string_equal(*parsed->iffeatures, "feature");
2024 assert_int_equal(parsed->max, 5);
2025 assert_string_equal(parsed->musts->arg, "must-cond");
2026 assert_string_equal(parsed->name, "llist");
2027 assert_null(parsed->next);
2028 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2029 assert_null(parsed->parent);
2030 assert_string_equal(parsed->ref, "ref");
2031 assert_string_equal(parsed->type.name, "type");
2032 assert_string_equal(parsed->units, "uni");
2033 assert_string_equal(parsed->when->cond, "when-cond");
2034 assert_true(parsed->flags & LYS_CONFIG_W);
2035 assert_true(parsed->flags & LYS_ORDBY_USER);
2036 assert_true(parsed->flags & LYS_STATUS_CURR);
2037 lysp_node_free(st->ctx, siblings);
2038 siblings = NULL;
2039
2040 data = ELEMENT_WRAPPER_START
2041 "<leaf-list name=\"llist\">"
2042 "<config value=\"true\" />"
2043 "<description><text>desc</text></description>"
2044 "<if-feature name=\"feature\"/>"
2045 "<min-elements value=\"5\"/>"
2046 "<must condition=\"must-cond\"/>"
2047 "<ordered-by value=\"user\" />"
2048 "<reference><text>ref</text></reference>"
2049 "<status value=\"current\"/>"
2050 "<type name=\"type\"/>"
2051 "<units name=\"uni\"/>"
2052 "<when condition=\"when-cond\"/>"
2053 "</leaf-list>"
2054 ELEMENT_WRAPPER_END;
2055 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2056 parsed = (struct lysp_node_leaflist *)siblings;
2057 assert_string_equal(parsed->dsc, "desc");
2058 assert_string_equal(*parsed->iffeatures, "feature");
2059 assert_int_equal(parsed->min, 5);
2060 assert_string_equal(parsed->musts->arg, "must-cond");
2061 assert_string_equal(parsed->name, "llist");
2062 assert_null(parsed->next);
2063 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2064 assert_null(parsed->parent);
2065 assert_string_equal(parsed->ref, "ref");
2066 assert_string_equal(parsed->type.name, "type");
2067 assert_string_equal(parsed->units, "uni");
2068 assert_string_equal(parsed->when->cond, "when-cond");
2069 assert_true(parsed->flags & LYS_CONFIG_W);
2070 assert_true(parsed->flags & LYS_ORDBY_USER);
2071 assert_true(parsed->flags & LYS_STATUS_CURR);
2072 lysp_node_free(st->ctx, siblings);
2073 siblings = NULL;
2074
2075 data = ELEMENT_WRAPPER_START
2076 "<leaf-list name=\"llist\">"
2077 "<config value=\"true\" />"
2078 "<description><text>desc</text></description>"
2079 "<if-feature name=\"feature\"/>"
2080 "<max-elements value=\"15\"/>"
2081 "<min-elements value=\"5\"/>"
2082 "<must condition=\"must-cond\"/>"
2083 "<ordered-by value=\"user\" />"
2084 "<reference><text>ref</text></reference>"
2085 "<status value=\"current\"/>"
2086 "<type name=\"type\"/>"
2087 "<units name=\"uni\"/>"
2088 "<when condition=\"when-cond\"/>"
2089 "</leaf-list>"
2090 ELEMENT_WRAPPER_END;
2091 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2092 parsed = (struct lysp_node_leaflist *)siblings;
2093 assert_string_equal(parsed->dsc, "desc");
2094 assert_string_equal(*parsed->iffeatures, "feature");
2095 assert_int_equal(parsed->min, 5);
2096 assert_int_equal(parsed->max, 15);
2097 assert_string_equal(parsed->musts->arg, "must-cond");
2098 assert_string_equal(parsed->name, "llist");
2099 assert_null(parsed->next);
2100 assert_int_equal(parsed->nodetype, LYS_LEAFLIST);
2101 assert_null(parsed->parent);
2102 assert_string_equal(parsed->ref, "ref");
2103 assert_string_equal(parsed->type.name, "type");
2104 assert_string_equal(parsed->units, "uni");
2105 assert_string_equal(parsed->when->cond, "when-cond");
2106 assert_true(parsed->flags & LYS_CONFIG_W);
2107 assert_true(parsed->flags & LYS_ORDBY_USER);
2108 assert_true(parsed->flags & LYS_STATUS_CURR);
2109 lysp_node_free(st->ctx, siblings);
2110 siblings = NULL;
2111
2112 data = ELEMENT_WRAPPER_START
2113 "<leaf-list name=\"llist\">"
2114 "<type name=\"type\"/>"
2115 "</leaf-list>"
2116 ELEMENT_WRAPPER_END;
2117 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2118 parsed = (struct lysp_node_leaflist *)siblings;
2119 assert_string_equal(parsed->name, "llist");
2120 assert_string_equal(parsed->type.name, "type");
2121 lysp_node_free(st->ctx, siblings);
2122 siblings = NULL;
2123
2124 /* invalid combinations */
2125 data = ELEMENT_WRAPPER_START
2126 "<leaf-list name=\"llist\">"
2127 "<max-elements value=\"5\"/>"
2128 "<min-elements value=\"15\"/>"
2129 "<type name=\"type\"/>"
2130 "</leaf-list>"
2131 ELEMENT_WRAPPER_END;
2132 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2133 logbuf_assert("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5. Line number 1.");
2134 lysp_node_free(st->ctx, siblings);
2135 siblings = NULL;
2136
2137 data = ELEMENT_WRAPPER_START
2138 "<leaf-list name=\"llist\">"
2139 "<default value=\"def-val1\"/>"
2140 "<min-elements value=\"15\"/>"
2141 "<type name=\"type\"/>"
2142 "</leaf-list>"
2143 ELEMENT_WRAPPER_END;
2144 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2145 logbuf_assert("Invalid combination of keywords \"min-elements\" and \"default\" as substatements of \"leaf-list\". Line number 1.");
2146 lysp_node_free(st->ctx, siblings);
2147 siblings = NULL;
2148
2149 data = ELEMENT_WRAPPER_START
2150 "<leaf-list name=\"llist\">"
2151 "</leaf-list>"
2152 ELEMENT_WRAPPER_END;
2153 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, false), LY_EVALID);
2154 logbuf_assert("Missing mandatory subelement type of leaf-list element. Line number 1.");
2155 lysp_node_free(st->ctx, siblings);
2156 siblings = NULL;
2157
2158 st->finished_correctly = true;
2159}
2160
David Sedlákcb39f642019-07-19 13:19:55 +02002161static void
2162test_presence_elem(void **state)
2163{
2164 struct state *st = *state;
2165 const char *data;
2166 const char *val;
2167
2168 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
2169 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2170 assert_string_equal(val, "presence-val");
2171 FREE_STRING(st->ctx, val);
2172
2173 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
2174 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2175 logbuf_assert("Missing mandatory attribute value of presence element. Line number 1.");
2176
2177 st->finished_correctly = true;
2178}
2179
David Sedlák12470a82019-07-19 13:44:36 +02002180static void
2181test_key_elem(void **state)
2182{
2183 struct state *st = *state;
2184 const char *data;
2185 const char *val;
2186
2187 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
2188 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, true), LY_SUCCESS);
2189 assert_string_equal(val, "key-value");
2190 FREE_STRING(st->ctx, val);
2191
2192 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
2193 assert_int_equal(test_element_helper(st, &data, &val, NULL, NULL, false), LY_EVALID);
2194 logbuf_assert("Missing mandatory attribute value of key element. Line number 1.");
2195
2196 st->finished_correctly = true;
2197}
2198
David Sedlák04e17b22019-07-19 15:29:48 +02002199static void
2200test_typedef_elem(void **state)
2201{
2202 struct state *st = *state;
2203 const char *data;
2204 struct lysp_tpdf *tpdfs = NULL;
2205 struct typedef_meta typdef_meta = {NULL, &tpdfs};
2206
2207 data = ELEMENT_WRAPPER_START
2208 "<typedef name=\"tpdf-name\">"
2209 "<default value=\"def-val\"/>"
2210 "<description><text>desc-text</text></description>"
2211 "<reference><text>ref-text</text></reference>"
2212 "<status value=\"current\"/>"
2213 "<type name=\"type\"/>"
2214 "<units name=\"uni\"/>"
2215 "</typedef>"
2216 ELEMENT_WRAPPER_END;
2217 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2218 assert_string_equal(tpdfs[0].dflt, "def-val");
2219 assert_string_equal(tpdfs[0].dsc, "desc-text");
2220 assert_null(tpdfs[0].exts);
2221 assert_string_equal(tpdfs[0].name, "tpdf-name");
2222 assert_string_equal(tpdfs[0].ref, "ref-text");
2223 assert_string_equal(tpdfs[0].type.name, "type");
2224 assert_string_equal(tpdfs[0].units, "uni");
2225 assert_true(tpdfs[0].flags & LYS_STATUS_CURR);
2226 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2227 tpdfs = NULL;
2228
2229 data = ELEMENT_WRAPPER_START
2230 "<typedef name=\"tpdf-name\">"
2231 "<type name=\"type\"/>"
2232 "</typedef>"
2233 ELEMENT_WRAPPER_END;
2234 assert_int_equal(test_element_helper(st, &data, &typdef_meta, NULL, NULL, true), LY_SUCCESS);
2235 assert_string_equal(tpdfs[0].name, "tpdf-name");
2236 assert_string_equal(tpdfs[0].type.name, "type");
2237 FREE_ARRAY(st->ctx, tpdfs, lysp_tpdf_free);
2238 tpdfs = NULL;
2239
2240 st->finished_correctly = true;
2241}
2242
David Sedlákd2d676a2019-07-22 11:28:19 +02002243static void
2244test_refine_elem(void **state)
2245{
2246 struct state *st = *state;
2247 const char *data;
2248 struct lysp_refine *refines = NULL;
2249
2250 /* max subelems */
2251 data = ELEMENT_WRAPPER_START
2252 "<refine target-node=\"target\">"
2253 "<if-feature name=\"feature\" />"
2254 "<must condition=\"cond\" />"
2255 "<presence value=\"presence\" />"
2256 "<default value=\"def\" />"
2257 "<config value=\"true\" />"
2258 "<mandatory value=\"true\" />"
2259 "<min-elements value=\"10\" />"
2260 "<max-elements value=\"20\" />"
2261 "<description><text>desc</text></description>"
2262 "<reference><text>ref</text></reference>"
2263 "</refine>"
2264 ELEMENT_WRAPPER_END;
2265 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2266 assert_string_equal(refines->nodeid, "target");
2267 assert_string_equal(*refines->dflts, "def");
2268 assert_string_equal(refines->dsc, "desc");
2269 assert_null(refines->exts);
2270 assert_true(refines->flags & LYS_CONFIG_W);
2271 assert_true(refines->flags & LYS_MAND_TRUE);
2272 assert_string_equal(*refines->iffeatures, "feature");
2273 assert_int_equal(refines->max, 20);
2274 assert_int_equal(refines->min, 10);
2275 assert_string_equal(refines->musts->arg, "cond");
2276 assert_string_equal(refines->presence, "presence");
2277 assert_string_equal(refines->ref, "ref");
2278 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2279 refines = NULL;
2280
2281 /* min subelems */
2282 data = ELEMENT_WRAPPER_START "<refine target-node=\"target\" />" ELEMENT_WRAPPER_END;
2283 assert_int_equal(test_element_helper(st, &data, &refines, NULL, NULL, true), LY_SUCCESS);
2284 assert_string_equal(refines->nodeid, "target");
2285 FREE_ARRAY(st->ctx, refines, lysp_refine_free);
2286 refines = NULL;
2287
2288 st->finished_correctly = true;
2289}
2290
David Sedlák0d6de5a2019-07-22 13:25:44 +02002291static void
2292test_uses_elem(void **state)
2293{
2294 struct state *st = *state;
2295 const char *data;
2296 struct lysp_node *siblings = NULL;
2297 struct tree_node_meta node_meta = {NULL, &siblings};
2298 struct lysp_node_uses *parsed = NULL;
2299
2300 /* max subelems */
2301 data = ELEMENT_WRAPPER_START
2302 "<uses name=\"uses-name\">"
2303 "<when condition=\"cond\" />"
2304 "<if-feature name=\"feature\" />"
2305 "<status value=\"obsolete\" />"
2306 "<description><text>desc</text></description>"
2307 "<reference><text>ref</text></reference>"
2308 "<refine target-node=\"target\"/>"
2309 /* TODO add uses-augment-stmt instance */
2310 "</uses>"
2311 ELEMENT_WRAPPER_END;
2312 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2313 parsed = (struct lysp_node_uses *)&siblings[0];
2314 assert_string_equal(parsed->name, "uses-name");
2315 assert_string_equal(parsed->dsc, "desc");
2316 assert_null(parsed->exts);
2317 assert_true(parsed->flags & LYS_STATUS_OBSLT);
2318 assert_string_equal(*parsed->iffeatures, "feature");
2319 assert_null(parsed->next);
2320 assert_int_equal(parsed->nodetype, LYS_USES);
2321 assert_null(parsed->parent);
2322 assert_string_equal(parsed->ref, "ref");
2323 assert_string_equal(parsed->refines->nodeid, "target");
2324 assert_string_equal(parsed->when->cond, "cond");
2325 lysp_node_free(st->ctx, siblings);
2326 siblings = NULL;
2327
2328 /* min subelems */
2329 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
2330 assert_int_equal(test_element_helper(st, &data, &node_meta, NULL, NULL, true), LY_SUCCESS);
2331 assert_string_equal(siblings[0].name, "uses-name");
2332 lysp_node_free(st->ctx, siblings);
2333 siblings = NULL;
2334
2335 st->finished_correctly = true;
2336}
2337
David Sedlákaa854b02019-07-22 14:17:10 +02002338static void
2339test_revision_elem(void **state)
2340{
2341 struct state *st = *state;
2342 const char *data;
2343 struct lysp_revision *revs = NULL;
2344
2345 /* max subelems */
2346 data = ELEMENT_WRAPPER_START
2347 "<revision date=\"2018-12-25\">"
2348 "<description><text>desc</text></description>"
2349 "<reference><text>ref</text></reference>"
2350 "</revision>"
2351 ELEMENT_WRAPPER_END;
2352 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2353 assert_string_equal(revs->date, "2018-12-25");
2354 assert_string_equal(revs->dsc, "desc");
2355 assert_string_equal(revs->ref, "ref");
2356 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2357 revs = NULL;
2358
2359 /* min subelems */
2360 data = ELEMENT_WRAPPER_START "<revision date=\"2005-05-05\" />" ELEMENT_WRAPPER_END;
2361 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, true), LY_SUCCESS);
2362 assert_string_equal(revs->date, "2005-05-05");
2363 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2364 revs = NULL;
2365
2366 /* invalid value */
2367 data = ELEMENT_WRAPPER_START "<revision date=\"05-05-2005\" />" ELEMENT_WRAPPER_END;
2368 assert_int_equal(test_element_helper(st, &data, &revs, NULL, NULL, false), LY_EVALID);
2369 logbuf_assert("Invalid value \"05-05-2005\" of \"revision\". Line number 1.");
2370 FREE_ARRAY(st->ctx, revs, lysp_revision_free);
2371 revs = NULL;
2372
2373 st->finished_correctly = true;
2374}
2375
David Sedlák0c2bab92019-07-22 15:33:19 +02002376static void
2377test_include_elem(void **state)
2378{
2379 struct state *st = *state;
2380 const char *data;
2381 struct lysp_include *includes = NULL;
2382 struct include_meta inc_meta = {"module-name", &includes};
2383
2384 /* max subelems */
2385 st->yin_ctx->mod_version = LYS_VERSION_1_1;
2386 data = ELEMENT_WRAPPER_START
2387 "<include module=\"mod\">"
2388 "<description><text>desc</text></description>"
2389 "<reference><text>ref</text></reference>"
2390 "<revision-date date=\"1999-09-09\"/>"
2391 "</include>"
2392 ELEMENT_WRAPPER_END;
2393 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, true), LY_SUCCESS);
2394 assert_string_equal(includes->name, "mod");
2395 assert_string_equal(includes->dsc, "desc");
2396 assert_string_equal(includes->ref, "ref");
2397 assert_null(includes->exts);
2398 assert_string_equal(includes->rev, "1999-09-09");
2399 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2400 includes = NULL;
2401
2402 /* min subelems */
2403 data = ELEMENT_WRAPPER_START "<include module=\"mod\"/>" ELEMENT_WRAPPER_END;
2404 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, true), LY_SUCCESS);
2405 assert_string_equal(includes->name, "mod");
2406 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2407 includes = NULL;
2408
2409 /* invalid combinations */
2410 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2411 data = ELEMENT_WRAPPER_START
2412 "<include module=\"mod\">"
2413 "<description><text>desc</text></description>"
2414 "<revision-date date=\"1999-09-09\"/>"
2415 "</include>"
2416 ELEMENT_WRAPPER_END;
2417 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, false), LY_EVALID);
2418 logbuf_assert("Invalid sub-elemnt \"description\" of \"include\" element - this sub-element is allowed only in modules with version 1.1 or newer. Line number 1.");
2419 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2420 includes = NULL;
2421
2422 st->yin_ctx->mod_version = LYS_VERSION_1_0;
2423 data = ELEMENT_WRAPPER_START
2424 "<include module=\"mod\">"
2425 "<reference><text>ref</text></reference>"
2426 "<revision-date date=\"1999-09-09\"/>"
2427 "</include>"
2428 ELEMENT_WRAPPER_END;
2429 assert_int_equal(test_element_helper(st, &data, &inc_meta, NULL, NULL, false), LY_EVALID);
2430 logbuf_assert("Invalid sub-elemnt \"reference\" of \"include\" element - this sub-element is allowed only in modules with version 1.1 or newer. Line number 1.");
2431 FREE_ARRAY(st->ctx, includes, lysp_include_free);
2432 includes = NULL;
2433
2434 st->finished_correctly = true;
2435}
2436
David Sedlák5e13dea2019-07-22 16:06:45 +02002437static void
2438test_feature_elem(void **state)
2439{
2440 struct state *st = *state;
2441 const char *data;
2442 struct lysp_feature *features = NULL;
2443
2444 /* max subelems */
2445 data = ELEMENT_WRAPPER_START
2446 "<feature name=\"feature-name\">"
2447 "<if-feature name=\"iff\"/>"
2448 "<status value=\"deprecated\"/>"
2449 "<description><text>desc</text></description>"
2450 "<reference><text>ref</text></reference>"
2451 "</feature>"
2452 ELEMENT_WRAPPER_END;
2453 assert_int_equal(test_element_helper(st, &data, &features, NULL, NULL, true), LY_SUCCESS);
2454 assert_string_equal(features->name, "feature-name");
2455 assert_string_equal(features->dsc, "desc");
2456 assert_null(features->exts);
2457 assert_true(features->flags & LYS_STATUS_DEPRC);
2458 assert_string_equal(*features->iffeatures, "iff");
2459 assert_string_equal(features->ref, "ref");
2460 FREE_ARRAY(st->ctx, features, lysp_feature_free);
2461 features = NULL;
2462
2463 /* min subelems */
2464 data = ELEMENT_WRAPPER_START "<feature name=\"feature-name\"/>" ELEMENT_WRAPPER_END;
2465 assert_int_equal(test_element_helper(st, &data, &features, NULL, NULL, true), LY_SUCCESS);
2466 assert_string_equal(features->name, "feature-name");
2467 FREE_ARRAY(st->ctx, features, lysp_feature_free);
2468 features = NULL;
2469
2470 st->finished_correctly = true;
2471}
2472
David Sedlák3b4db242018-10-19 16:11:01 +02002473int
2474main(void)
2475{
2476
2477 const struct CMUnitTest tests[] = {
David Sedlák392af4f2019-06-04 16:02:42 +02002478 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup_f, teardown_f),
David Sedlák8f7a1172019-06-20 14:42:18 +02002479 cmocka_unit_test_setup_teardown(test_yin_match_keyword, setup_f, teardown_f),
David Sedlákb1a78352019-06-28 16:16:29 +02002480 cmocka_unit_test_setup_teardown(test_yin_parse_element_generic, setup_f, teardown_f),
2481 cmocka_unit_test_setup_teardown(test_yin_parse_extension_instance, setup_f, teardown_f),
David Sedlák555c7202019-07-04 12:14:12 +02002482 cmocka_unit_test_setup_teardown(test_yin_parse_content, setup_f, teardown_f),
David Sedlák4a650532019-07-10 11:55:18 +02002483 cmocka_unit_test_setup_teardown(test_validate_value, setup_f, teardown_f),
David Sedlák32488102019-07-15 17:44:10 +02002484
David Sedlák8e7bda82019-07-16 17:57:50 +02002485 cmocka_unit_test(test_yin_match_argument_name),
David Sedlák32488102019-07-15 17:44:10 +02002486 cmocka_unit_test_setup_teardown(test_enum_bit_elem, setup_element_test, teardown_element_test),
2487 cmocka_unit_test_setup_teardown(test_meta_elem, setup_element_test, teardown_element_test),
2488 cmocka_unit_test_setup_teardown(test_import_elem, setup_element_test, teardown_element_test),
2489 cmocka_unit_test_setup_teardown(test_status_elem, setup_element_test, teardown_element_test),
2490 cmocka_unit_test_setup_teardown(test_ext_elem, setup_element_test, teardown_element_test),
2491 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup_element_test, teardown_element_test),
2492 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup_element_test, teardown_element_test),
2493 cmocka_unit_test_setup_teardown(test_mandatory_elem, setup_element_test, teardown_element_test),
David Sedlák8e7bda82019-07-16 17:57:50 +02002494 cmocka_unit_test_setup_teardown(test_argument_elem, setup_element_test, teardown_element_test),
2495 cmocka_unit_test_setup_teardown(test_base_elem, setup_element_test, teardown_element_test),
2496 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup_element_test, teardown_element_test),
2497 cmocka_unit_test_setup_teardown(test_config_elem, setup_element_test, teardown_element_test),
2498 cmocka_unit_test_setup_teardown(test_default_elem, setup_element_test, teardown_element_test),
2499 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup_element_test, teardown_element_test),
2500 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup_element_test, teardown_element_test),
2501 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup_element_test, teardown_element_test),
2502 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup_element_test, teardown_element_test),
2503 cmocka_unit_test_setup_teardown(test_length_elem, setup_element_test, teardown_element_test),
2504 cmocka_unit_test_setup_teardown(test_modifier_elem, setup_element_test, teardown_element_test),
2505 cmocka_unit_test_setup_teardown(test_namespace_elem, setup_element_test, teardown_element_test),
2506 cmocka_unit_test_setup_teardown(test_path_elem, setup_element_test, teardown_element_test),
2507 cmocka_unit_test_setup_teardown(test_pattern_elem, setup_element_test, teardown_element_test),
2508 cmocka_unit_test_setup_teardown(test_value_position_elem, setup_element_test, teardown_element_test),
David Sedlák69f01612019-07-17 11:41:08 +02002509 cmocka_unit_test_setup_teardown(test_prefix_elem, setup_element_test, teardown_element_test),
2510 cmocka_unit_test_setup_teardown(test_range_elem, setup_element_test, teardown_element_test),
2511 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup_element_test, teardown_element_test),
2512 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup_element_test, teardown_element_test),
2513 cmocka_unit_test_setup_teardown(test_unique_elem, setup_element_test, teardown_element_test),
2514 cmocka_unit_test_setup_teardown(test_units_elem, setup_element_test, teardown_element_test),
2515 cmocka_unit_test_setup_teardown(test_when_elem, setup_element_test, teardown_element_test),
2516 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup_element_test, teardown_element_test),
David Sedlák374d2b32019-07-17 15:06:55 +02002517 cmocka_unit_test_setup_teardown(test_type_elem, setup_element_test, teardown_element_test),
David Sedlák1af868e2019-07-17 17:03:14 +02002518 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup_element_test, teardown_element_test),
David Sedlák09e18c92019-07-18 11:17:11 +02002519 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup_element_test, teardown_element_test),
David Sedláka2dad212019-07-18 12:45:19 +02002520 cmocka_unit_test_setup_teardown(test_ordby_elem, setup_element_test, teardown_element_test),
David Sedlák8a83bbb2019-07-18 14:46:00 +02002521 cmocka_unit_test_setup_teardown(test_any_elem, setup_element_test, teardown_element_test),
David Sedlák203ca3a2019-07-18 15:26:25 +02002522 cmocka_unit_test_setup_teardown(test_leaf_elem, setup_element_test, teardown_element_test),
David Sedlákc3da3ef2019-07-19 12:56:08 +02002523 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup_element_test, teardown_element_test),
David Sedlákcb39f642019-07-19 13:19:55 +02002524 cmocka_unit_test_setup_teardown(test_presence_elem, setup_element_test, teardown_element_test),
David Sedlák12470a82019-07-19 13:44:36 +02002525 cmocka_unit_test_setup_teardown(test_key_elem, setup_element_test, teardown_element_test),
David Sedlák04e17b22019-07-19 15:29:48 +02002526 cmocka_unit_test_setup_teardown(test_typedef_elem, setup_element_test, teardown_element_test),
David Sedlákd2d676a2019-07-22 11:28:19 +02002527 cmocka_unit_test_setup_teardown(test_refine_elem, setup_element_test, teardown_element_test),
David Sedlák0d6de5a2019-07-22 13:25:44 +02002528 cmocka_unit_test_setup_teardown(test_uses_elem, setup_element_test, teardown_element_test),
David Sedlákaa854b02019-07-22 14:17:10 +02002529 cmocka_unit_test_setup_teardown(test_revision_elem, setup_element_test, teardown_element_test),
David Sedlák0c2bab92019-07-22 15:33:19 +02002530 cmocka_unit_test_setup_teardown(test_include_elem, setup_element_test, teardown_element_test),
David Sedlák5e13dea2019-07-22 16:06:45 +02002531 cmocka_unit_test_setup_teardown(test_feature_elem, setup_element_test, teardown_element_test),
David Sedlák0c2bab92019-07-22 15:33:19 +02002532
David Sedlák3b4db242018-10-19 16:11:01 +02002533 };
2534
David Sedlák8e7bda82019-07-16 17:57:50 +02002535 return cmocka_run_group_tests(tests, setup_ly_ctx, destroy_ly_ctx);
David Sedlák3b4db242018-10-19 16:11:01 +02002536}