blob: 6f75f6b5ab2c63feab0d9168e163da48e41fdb18 [file] [log] [blame]
David Sedlákb1ce3f82019-06-05 14:37:26 +02001/**
Michal Vasko12ef5362022-09-16 15:13:58 +02002 * @file test_yin.c
David Sedlákb1ce3f82019-06-05 14:37:26 +02003 * @author David Sedlák <xsedla1d@stud.fit.vutbr.cz>
Michal Vasko12ef5362022-09-16 15:13:58 +02004 * @author Michal Vasko <mvasko@cesnet.cz>
5 * @brief unit tests for YIN parser and printer
David Sedlákb1ce3f82019-06-05 14:37:26 +02006 *
Michal Vasko12ef5362022-09-16 15:13:58 +02007 * Copyright (c) 2015 - 2022 CESNET, z.s.p.o.
David Sedlákb1ce3f82019-06-05 14:37:26 +02008 *
9 * This source code is licensed under BSD 3-Clause License (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * https://opensource.org/licenses/BSD-3-Clause
14 */
Radek Iša56ca9e42020-09-08 18:42:00 +020015#define _UTEST_MAIN_
16#include "utests.h"
David Sedlákb1ce3f82019-06-05 14:37:26 +020017
Radek Krejcib4ac5a92020-11-23 17:54:33 +010018#include <stdbool.h>
David Sedlák3b4db242018-10-19 16:11:01 +020019#include <stdio.h>
20#include <string.h>
21
Radek Krejci70593c12020-06-13 20:48:09 +020022#include "common.h"
Michal Vaskoafac7822020-10-20 14:22:26 +020023#include "in.h"
Radek Krejci70593c12020-06-13 20:48:09 +020024#include "parser_internal.h"
Michal Vasko405cc9e2020-12-01 12:01:27 +010025#include "schema_compile.h"
Radek Krejci8df109d2021-04-23 12:19:08 +020026#include "tree.h"
Radek Krejci859a15a2021-03-05 20:56:59 +010027#include "tree_edit.h"
Radek Krejci70593c12020-06-13 20:48:09 +020028#include "tree_schema.h"
29#include "tree_schema_internal.h"
30#include "xml.h"
31#include "xpath.h"
David Sedlák3b4db242018-10-19 16:11:01 +020032
Michal Vaskoafac7822020-10-20 14:22:26 +020033/* copied from parser_yin.c */
34enum yin_argument {
35 YIN_ARG_UNKNOWN = 0, /**< parsed argument can not be matched with any supported yin argument keyword */
36 YIN_ARG_NAME, /**< argument name */
37 YIN_ARG_TARGET_NODE, /**< argument target-node */
38 YIN_ARG_MODULE, /**< argument module */
39 YIN_ARG_VALUE, /**< argument value */
40 YIN_ARG_TEXT, /**< argument text */
41 YIN_ARG_CONDITION, /**< argument condition */
42 YIN_ARG_URI, /**< argument uri */
43 YIN_ARG_DATE, /**< argument data */
44 YIN_ARG_TAG, /**< argument tag */
45 YIN_ARG_NONE /**< empty (special value) */
46};
47
48struct yin_subelement {
49 enum ly_stmt type; /**< type of keyword */
50 void *dest; /**< meta infromation passed to responsible function (mostly information about where parsed subelement should be stored) */
51 uint16_t flags; /**< describes constraints of subelement can be set to YIN_SUBELEM_MANDATORY, YIN_SUBELEM_UNIQUE, YIN_SUBELEM_FIRST, YIN_SUBELEM_VER2, and YIN_SUBELEM_DEFAULT_TEXT */
52};
53
54struct import_meta {
55 const char *prefix; /**< module prefix. */
56 struct lysp_import **imports; /**< imports to add to. */
57};
58
59struct yin_argument_meta {
60 uint16_t *flags; /**< Argument flags */
61 const char **argument; /**< Argument value */
62};
63
64struct tree_node_meta {
65 struct lysp_node *parent; /**< parent node */
66 struct lysp_node **nodes; /**< linked list of siblings */
67};
68
69struct include_meta {
70 const char *name; /**< Module/submodule name. */
71 struct lysp_include **includes; /**< [Sized array](@ref sizedarrays) of parsed includes to add to. */
72};
73
74struct inout_meta {
75 struct lysp_node *parent; /**< Parent node. */
Radek Krejci2a9fc652021-01-22 17:44:34 +010076 struct lysp_node_action_inout *inout_p; /**< inout_p Input/output pointer to write to. */
Michal Vaskoafac7822020-10-20 14:22:26 +020077};
78
79struct minmax_dev_meta {
80 uint32_t *lim; /**< min/max value to write to. */
81 uint16_t *flags; /**< min/max flags to write to. */
82 struct lysp_ext_instance **exts; /**< extension instances to add to. */
83};
84
85#define YIN_SUBELEM_MANDATORY 0x01
86#define YIN_SUBELEM_UNIQUE 0x02
87#define YIN_SUBELEM_FIRST 0x04
88#define YIN_SUBELEM_VER2 0x08
89
90#define YIN_SUBELEM_PARSED 0x80
91
David Sedlák555c7202019-07-04 12:14:12 +020092/* prototypes of static functions */
Michal Vaskoafac7822020-10-20 14:22:26 +020093enum yin_argument yin_match_argument_name(const char *name, size_t len);
94LY_ERR yin_parse_content(struct lys_yin_parser_ctx *ctx, struct yin_subelement *subelem_info, size_t subelem_info_size,
95 enum ly_stmt current_element, const char **text_content, struct lysp_ext_instance **exts);
96LY_ERR yin_validate_value(struct lys_yin_parser_ctx *ctx, enum yang_arg val_type);
97enum ly_stmt yin_match_keyword(struct lys_yin_parser_ctx *ctx, const char *name, size_t name_len,
98 const char *prefix, size_t prefix_len, enum ly_stmt parrent);
Radek Krejcifc596f92021-02-26 22:40:26 +010099LY_ERR yin_parse_extension_instance(struct lys_yin_parser_ctx *ctx, enum ly_stmt subelem, LY_ARRAY_COUNT_TYPE subelem_index,
Michal Vaskoafac7822020-10-20 14:22:26 +0200100 struct lysp_ext_instance **exts);
101LY_ERR yin_parse_element_generic(struct lys_yin_parser_ctx *ctx, enum ly_stmt parent, struct lysp_stmt **element);
102LY_ERR yin_parse_mod(struct lys_yin_parser_ctx *ctx, struct lysp_module *mod);
103LY_ERR yin_parse_submod(struct lys_yin_parser_ctx *ctx, struct lysp_submodule *submod);
104
David Sedláke6cd89e2019-08-07 12:46:02 +0200105/* wrapping element used for mocking has nothing to do with real module structure */
106#define ELEMENT_WRAPPER_START "<status xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
107#define ELEMENT_WRAPPER_END "</status>"
108
Radek Iša56ca9e42020-09-08 18:42:00 +0200109#define TEST_1_CHECK_LYSP_EXT_INSTANCE(NODE, INSUBSTMT)\
Radek Krejci8df109d2021-04-23 12:19:08 +0200110 CHECK_LYSP_EXT_INSTANCE((NODE), NULL, 1, INSUBSTMT, 0, "myext:c-define", LY_VALUE_XML)
David Sedlák872c7b42018-10-26 13:15:20 +0200111
Radek Iša56ca9e42020-09-08 18:42:00 +0200112struct lys_yin_parser_ctx *YCTX;
David Sedlák8e7bda82019-07-16 17:57:50 +0200113
114static int
Radek Iša56ca9e42020-09-08 18:42:00 +0200115setup_ctx(void **state)
David Sedlák8e7bda82019-07-16 17:57:50 +0200116{
Michal Vasko8a67eff2021-12-07 14:04:47 +0100117 struct lysp_module *pmod;
118
David Sedlák619db942019-07-03 14:47:30 +0200119 /* allocate parser context */
Radek Iša56ca9e42020-09-08 18:42:00 +0200120 YCTX = calloc(1, sizeof(*YCTX));
121 YCTX->format = LYS_IN_YIN;
Michal Vasko8a67eff2021-12-07 14:04:47 +0100122 ly_set_new(&YCTX->parsed_mods);
David Sedlák8f5bce02019-06-03 16:41:08 +0200123
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200124 /* allocate new parsed module */
Michal Vasko8a67eff2021-12-07 14:04:47 +0100125 pmod = calloc(1, sizeof *pmod);
126 ly_set_add(YCTX->parsed_mods, pmod, 1, NULL);
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200127
128 /* allocate new module */
Michal Vasko8a67eff2021-12-07 14:04:47 +0100129 pmod->mod = calloc(1, sizeof *pmod->mod);
130 pmod->mod->ctx = UTEST_LYCTX;
131 pmod->mod->parsed = pmod;
Michal Vasko5d24f6c2020-10-13 13:49:06 +0200132
Radek Iša56ca9e42020-09-08 18:42:00 +0200133 return 0;
David Sedlák3b4db242018-10-19 16:11:01 +0200134}
135
136static int
Radek Iša56ca9e42020-09-08 18:42:00 +0200137setup(void **state)
David Sedlák68a1af12019-03-08 13:46:54 +0100138{
Radek Iša56ca9e42020-09-08 18:42:00 +0200139 UTEST_SETUP;
David Sedlák68a1af12019-03-08 13:46:54 +0100140
Radek Iša56ca9e42020-09-08 18:42:00 +0200141 setup_ctx(state);
David Sedlák79e50cb2019-06-05 16:33:09 +0200142
Radek Iša56ca9e42020-09-08 18:42:00 +0200143 return 0;
David Sedlák79e50cb2019-06-05 16:33:09 +0200144}
145
David Sedlák8985a142019-07-31 16:43:06 +0200146static int
Radek Iša56ca9e42020-09-08 18:42:00 +0200147teardown_ctx(void **UNUSED(state))
David Sedlák8985a142019-07-31 16:43:06 +0200148{
Michal Vasko4f9da5e2022-03-14 13:11:26 +0100149 lys_module_free(PARSER_CUR_PMOD(YCTX)->mod, 0);
aPiecek8d4e75d2021-06-24 14:47:06 +0200150 yin_parser_ctx_free(YCTX);
Radek Iša56ca9e42020-09-08 18:42:00 +0200151 YCTX = NULL;
David Sedlák8985a142019-07-31 16:43:06 +0200152
Radek Iša56ca9e42020-09-08 18:42:00 +0200153 return 0;
David Sedlák8985a142019-07-31 16:43:06 +0200154}
155
Radek Iša56ca9e42020-09-08 18:42:00 +0200156static int
157teardown(void **state)
158{
159 teardown_ctx(state);
160
161 UTEST_TEARDOWN;
162
163 return 0;
164}
165
166#define RESET_STATE \
167 ly_in_free(UTEST_IN, 0); \
168 UTEST_IN = NULL; \
169 teardown_ctx(state); \
170 setup_ctx(state)
171
David Sedlák68a1af12019-03-08 13:46:54 +0100172static void
David Sedlák1bccdfa2019-06-17 15:55:27 +0200173test_yin_match_keyword(void **state)
David Sedlák3b4db242018-10-19 16:11:01 +0200174{
Michal Vaskob36053d2020-03-26 15:49:30 +0100175 const char *prefix;
176 size_t prefix_len;
Radek Iša56ca9e42020-09-08 18:42:00 +0200177
David Sedlák8f7a1172019-06-20 14:42:18 +0200178 /* create mock yin namespace in xml context */
Radek Iša56ca9e42020-09-08 18:42:00 +0200179 ly_in_new_memory("<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" />", &UTEST_IN);
180 lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx);
181 prefix = YCTX->xmlctx->prefix;
182 prefix_len = YCTX->xmlctx->prefix_len;
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100183
Radek Iša56ca9e42020-09-08 18:42:00 +0200184 assert_int_equal(yin_match_keyword(YCTX, "anydatax", strlen("anydatax"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
185 assert_int_equal(yin_match_keyword(YCTX, "asdasd", strlen("asdasd"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
186 assert_int_equal(yin_match_keyword(YCTX, "", 0, prefix, prefix_len, LY_STMT_NONE), LY_STMT_NONE);
187 assert_int_equal(yin_match_keyword(YCTX, "anydata", strlen("anydata"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ANYDATA);
188 assert_int_equal(yin_match_keyword(YCTX, "anyxml", strlen("anyxml"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ANYXML);
189 assert_int_equal(yin_match_keyword(YCTX, "argument", strlen("argument"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ARGUMENT);
190 assert_int_equal(yin_match_keyword(YCTX, "augment", strlen("augment"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_AUGMENT);
191 assert_int_equal(yin_match_keyword(YCTX, "base", strlen("base"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BASE);
192 assert_int_equal(yin_match_keyword(YCTX, "belongs-to", strlen("belongs-to"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BELONGS_TO);
193 assert_int_equal(yin_match_keyword(YCTX, "bit", strlen("bit"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_BIT);
194 assert_int_equal(yin_match_keyword(YCTX, "case", strlen("case"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CASE);
195 assert_int_equal(yin_match_keyword(YCTX, "choice", strlen("choice"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CHOICE);
196 assert_int_equal(yin_match_keyword(YCTX, "config", strlen("config"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONFIG);
197 assert_int_equal(yin_match_keyword(YCTX, "contact", strlen("contact"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONTACT);
198 assert_int_equal(yin_match_keyword(YCTX, "container", strlen("container"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_CONTAINER);
199 assert_int_equal(yin_match_keyword(YCTX, "default", strlen("default"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEFAULT);
200 assert_int_equal(yin_match_keyword(YCTX, "description", strlen("description"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DESCRIPTION);
201 assert_int_equal(yin_match_keyword(YCTX, "deviate", strlen("deviate"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEVIATE);
202 assert_int_equal(yin_match_keyword(YCTX, "deviation", strlen("deviation"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_DEVIATION);
203 assert_int_equal(yin_match_keyword(YCTX, "enum", strlen("enum"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ENUM);
204 assert_int_equal(yin_match_keyword(YCTX, "error-app-tag", strlen("error-app-tag"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ERROR_APP_TAG);
205 assert_int_equal(yin_match_keyword(YCTX, "error-message", strlen("error-message"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ERROR_MESSAGE);
206 assert_int_equal(yin_match_keyword(YCTX, "extension", strlen("extension"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_EXTENSION);
207 assert_int_equal(yin_match_keyword(YCTX, "feature", strlen("feature"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_FEATURE);
208 assert_int_equal(yin_match_keyword(YCTX, "fraction-digits", strlen("fraction-digits"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_FRACTION_DIGITS);
209 assert_int_equal(yin_match_keyword(YCTX, "grouping", strlen("grouping"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_GROUPING);
210 assert_int_equal(yin_match_keyword(YCTX, "identity", strlen("identity"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IDENTITY);
211 assert_int_equal(yin_match_keyword(YCTX, "if-feature", strlen("if-feature"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IF_FEATURE);
212 assert_int_equal(yin_match_keyword(YCTX, "import", strlen("import"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_IMPORT);
213 assert_int_equal(yin_match_keyword(YCTX, "include", strlen("include"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_INCLUDE);
214 assert_int_equal(yin_match_keyword(YCTX, "input", strlen("input"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_INPUT);
215 assert_int_equal(yin_match_keyword(YCTX, "key", strlen("key"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_KEY);
216 assert_int_equal(yin_match_keyword(YCTX, "leaf", strlen("leaf"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LEAF);
217 assert_int_equal(yin_match_keyword(YCTX, "leaf-list", strlen("leaf-list"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LEAF_LIST);
218 assert_int_equal(yin_match_keyword(YCTX, "length", strlen("length"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LENGTH);
219 assert_int_equal(yin_match_keyword(YCTX, "list", strlen("list"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_LIST);
220 assert_int_equal(yin_match_keyword(YCTX, "mandatory", strlen("mandatory"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MANDATORY);
221 assert_int_equal(yin_match_keyword(YCTX, "max-elements", strlen("max-elements"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MAX_ELEMENTS);
222 assert_int_equal(yin_match_keyword(YCTX, "min-elements", strlen("min-elements"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MIN_ELEMENTS);
223 assert_int_equal(yin_match_keyword(YCTX, "modifier", strlen("modifier"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MODIFIER);
224 assert_int_equal(yin_match_keyword(YCTX, "module", strlen("module"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MODULE);
225 assert_int_equal(yin_match_keyword(YCTX, "must", strlen("must"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_MUST);
226 assert_int_equal(yin_match_keyword(YCTX, "namespace", strlen("namespace"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NAMESPACE);
227 assert_int_equal(yin_match_keyword(YCTX, "notification", strlen("notification"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_NOTIFICATION);
228 assert_int_equal(yin_match_keyword(YCTX, "ordered-by", strlen("ordered-by"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ORDERED_BY);
229 assert_int_equal(yin_match_keyword(YCTX, "organization", strlen("organization"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_ORGANIZATION);
230 assert_int_equal(yin_match_keyword(YCTX, "output", strlen("output"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_OUTPUT);
231 assert_int_equal(yin_match_keyword(YCTX, "path", strlen("path"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PATH);
232 assert_int_equal(yin_match_keyword(YCTX, "pattern", strlen("pattern"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PATTERN);
233 assert_int_equal(yin_match_keyword(YCTX, "position", strlen("position"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_POSITION);
234 assert_int_equal(yin_match_keyword(YCTX, "prefix", strlen("prefix"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PREFIX);
235 assert_int_equal(yin_match_keyword(YCTX, "presence", strlen("presence"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_PRESENCE);
236 assert_int_equal(yin_match_keyword(YCTX, "range", strlen("range"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_RANGE);
237 assert_int_equal(yin_match_keyword(YCTX, "reference", strlen("reference"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REFERENCE);
238 assert_int_equal(yin_match_keyword(YCTX, "refine", strlen("refine"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REFINE);
239 assert_int_equal(yin_match_keyword(YCTX, "require-instance", strlen("require-instance"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REQUIRE_INSTANCE);
240 assert_int_equal(yin_match_keyword(YCTX, "revision", strlen("revision"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REVISION);
241 assert_int_equal(yin_match_keyword(YCTX, "revision-date", strlen("revision-date"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_REVISION_DATE);
242 assert_int_equal(yin_match_keyword(YCTX, "rpc", strlen("rpc"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_RPC);
243 assert_int_equal(yin_match_keyword(YCTX, "status", strlen("status"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_STATUS);
244 assert_int_equal(yin_match_keyword(YCTX, "submodule", strlen("submodule"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_SUBMODULE);
245 assert_int_equal(yin_match_keyword(YCTX, "type", strlen("type"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_TYPE);
246 assert_int_equal(yin_match_keyword(YCTX, "typedef", strlen("typedef"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_TYPEDEF);
247 assert_int_equal(yin_match_keyword(YCTX, "unique", strlen("unique"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_UNIQUE);
248 assert_int_equal(yin_match_keyword(YCTX, "units", strlen("units"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_UNITS);
249 assert_int_equal(yin_match_keyword(YCTX, "uses", strlen("uses"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_USES);
250 assert_int_equal(yin_match_keyword(YCTX, "value", strlen("value"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_VALUE);
251 assert_int_equal(yin_match_keyword(YCTX, "when", strlen("when"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_WHEN);
252 assert_int_equal(yin_match_keyword(YCTX, "yang-version", strlen("yang-version"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_YANG_VERSION);
253 assert_int_equal(yin_match_keyword(YCTX, "yin-element", strlen("yin-element"), prefix, prefix_len, LY_STMT_NONE), LY_STMT_YIN_ELEMENT);
David Sedlák872c7b42018-10-26 13:15:20 +0200254}
David Sedlák3b4db242018-10-19 16:11:01 +0200255
David Sedlák872c7b42018-10-26 13:15:20 +0200256static void
Radek Iša56ca9e42020-09-08 18:42:00 +0200257test_yin_match_argument_name(void **UNUSED(state))
David Sedlák872c7b42018-10-26 13:15:20 +0200258{
David Sedlák060b00e2019-06-19 11:12:06 +0200259 assert_int_equal(yin_match_argument_name("", 5), YIN_ARG_UNKNOWN);
260 assert_int_equal(yin_match_argument_name("qwertyasd", 5), YIN_ARG_UNKNOWN);
261 assert_int_equal(yin_match_argument_name("conditionasd", 8), YIN_ARG_UNKNOWN);
262 assert_int_equal(yin_match_argument_name("condition", 9), YIN_ARG_CONDITION);
263 assert_int_equal(yin_match_argument_name("date", 4), YIN_ARG_DATE);
264 assert_int_equal(yin_match_argument_name("module", 6), YIN_ARG_MODULE);
265 assert_int_equal(yin_match_argument_name("name", 4), YIN_ARG_NAME);
266 assert_int_equal(yin_match_argument_name("tag", 3), YIN_ARG_TAG);
267 assert_int_equal(yin_match_argument_name("target-node", 11), YIN_ARG_TARGET_NODE);
268 assert_int_equal(yin_match_argument_name("text", 4), YIN_ARG_TEXT);
269 assert_int_equal(yin_match_argument_name("uri", 3), YIN_ARG_URI);
270 assert_int_equal(yin_match_argument_name("value", 5), YIN_ARG_VALUE);
David Sedlák3b4db242018-10-19 16:11:01 +0200271}
272
David Sedlák68a1af12019-03-08 13:46:54 +0100273static void
David Sedlák555c7202019-07-04 12:14:12 +0200274test_yin_parse_content(void **state)
275{
David Sedlák555c7202019-07-04 12:14:12 +0200276 LY_ERR ret = LY_SUCCESS;
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100277 const char *data =
278 "<prefix value=\"a_mod\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
279 " <myext:custom xmlns:myext=\"urn:example:extensions\">totally amazing extension</myext:custom>\n"
280 " <extension name=\"ext\">\n"
281 " <argument name=\"argname\"></argument>\n"
282 " <description><text>desc</text></description>\n"
283 " <reference><text>ref</text></reference>\n"
284 " <status value=\"deprecated\"></status>\n"
285 " </extension>\n"
286 " <text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>\n"
287 " <if-feature name=\"foo\"></if-feature>\n"
288 " <when condition=\"condition...\">\n"
289 " <reference><text>when_ref</text></reference>\n"
290 " <description><text>when_desc</text></description>\n"
291 " </when>\n"
292 " <config value=\"true\"/>\n"
293 " <error-message>\n"
294 " <value>error-msg</value>\n"
295 " </error-message>\n"
296 " <error-app-tag value=\"err-app-tag\"/>\n"
297 " <units name=\"radians\"></units>\n"
298 " <default value=\"default-value\"/>\n"
299 " <position value=\"25\"></position>\n"
300 " <value value=\"-5\"/>\n"
301 " <require-instance value=\"true\"></require-instance>\n"
302 " <range value=\"5..10\" />\n"
303 " <length value=\"baf\"/>\n"
304 " <pattern value='pattern'>\n"
305 " <modifier value='invert-match'/>\n"
306 " </pattern>\n"
307 " <enum name=\"yay\">\n"
308 " </enum>\n"
309 "</prefix>";
David Sedlák555c7202019-07-04 12:14:12 +0200310 struct lysp_ext_instance *exts = NULL;
Michal Vasko12ef5362022-09-16 15:13:58 +0200311 const char *value;
David Sedlák555c7202019-07-04 12:14:12 +0200312
313 /* test unique subelem */
314 const char *prefix_value;
Radek Krejcid6b76452019-09-03 17:03:03 +0200315 struct yin_subelement subelems2[2] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_UNIQUE},
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100316 {LY_STMT_ARG_TEXT, &value, YIN_SUBELEM_UNIQUE}};
317
David Sedláke6cd89e2019-08-07 12:46:02 +0200318 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100319 "<prefix value=\"inv_mod\" />"
320 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
321 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
322 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +0200323 ly_in_new_memory(data, &UTEST_IN);
324 lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx);
325 lyxml_ctx_next(YCTX->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100326
Radek Iša56ca9e42020-09-08 18:42:00 +0200327 ret = yin_parse_content(YCTX, subelems2, 2, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200328 assert_int_equal(ret, LY_EVALID);
Radek Iša56ca9e42020-09-08 18:42:00 +0200329 CHECK_LOG_CTX("Redefinition of \"text\" sub-element in \"status\" element.", "Line number 1.");
330 lydict_remove(UTEST_LYCTX, prefix_value);
331 lydict_remove(UTEST_LYCTX, value);
332 RESET_STATE;
David Sedlák555c7202019-07-04 12:14:12 +0200333
334 /* test first subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200335 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100336 "<prefix value=\"inv_mod\" />"
337 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
338 "<text xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">wsefsdf</text>"
339 ELEMENT_WRAPPER_END;
Radek Krejcid6b76452019-09-03 17:03:03 +0200340 struct yin_subelement subelems3[2] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_UNIQUE},
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100341 {LY_STMT_ARG_TEXT, &value, YIN_SUBELEM_FIRST}};
342
Radek Iša56ca9e42020-09-08 18:42:00 +0200343 ly_in_new_memory(data, &UTEST_IN);
344 lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx);
345 lyxml_ctx_next(YCTX->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100346
Radek Iša56ca9e42020-09-08 18:42:00 +0200347 ret = yin_parse_content(YCTX, subelems3, 2, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200348 assert_int_equal(ret, LY_EVALID);
Radek Iša56ca9e42020-09-08 18:42:00 +0200349 CHECK_LOG_CTX("Sub-element \"text\" of \"status\" element must be defined as it's first sub-element.", "Line number 1.");
350 lydict_remove(UTEST_LYCTX, prefix_value);
351 RESET_STATE;
David Sedlák555c7202019-07-04 12:14:12 +0200352
353 /* test mandatory subelem */
David Sedláke6cd89e2019-08-07 12:46:02 +0200354 data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
Radek Krejcid6b76452019-09-03 17:03:03 +0200355 struct yin_subelement subelems4[1] = {{LY_STMT_PREFIX, &prefix_value, YIN_SUBELEM_MANDATORY | YIN_SUBELEM_UNIQUE}};
Radek Krejcib4ac5a92020-11-23 17:54:33 +0100356
Radek Iša56ca9e42020-09-08 18:42:00 +0200357 ly_in_new_memory(data, &UTEST_IN);
358 lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx);
359 lyxml_ctx_next(YCTX->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +0100360
Radek Iša56ca9e42020-09-08 18:42:00 +0200361 ret = yin_parse_content(YCTX, subelems4, 1, LY_STMT_STATUS, NULL, &exts);
David Sedlák555c7202019-07-04 12:14:12 +0200362 assert_int_equal(ret, LY_EVALID);
Radek Iša56ca9e42020-09-08 18:42:00 +0200363 CHECK_LOG_CTX("Missing mandatory sub-element \"prefix\" of \"status\" element.", "Line number 1.");
David Sedlák555c7202019-07-04 12:14:12 +0200364}
365
David Sedlák92147b02019-07-09 14:01:01 +0200366static void
David Sedlák4a650532019-07-10 11:55:18 +0200367test_validate_value(void **state)
368{
Michal Vaskob36053d2020-03-26 15:49:30 +0100369 const char *data = ELEMENT_WRAPPER_START ELEMENT_WRAPPER_END;
370
371 /* create some XML context */
Radek Iša56ca9e42020-09-08 18:42:00 +0200372 ly_in_new_memory(data, &UTEST_IN);
373 lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx);
374 YCTX->xmlctx->status = LYXML_ELEM_CONTENT;
375 YCTX->xmlctx->dynamic = 0;
Michal Vaskob36053d2020-03-26 15:49:30 +0100376
Radek Iša56ca9e42020-09-08 18:42:00 +0200377 YCTX->xmlctx->value = "#invalid";
378 YCTX->xmlctx->value_len = 8;
379 assert_int_equal(yin_validate_value(YCTX, Y_IDENTIF_ARG), LY_EVALID);
Radek Iša2eac74c2021-03-15 15:53:08 +0100380 CHECK_LOG_CTX("Invalid identifier first character '#' (0x0023).", "Line number 1.");
Michal Vaskob36053d2020-03-26 15:49:30 +0100381
Radek Iša56ca9e42020-09-08 18:42:00 +0200382 YCTX->xmlctx->value = "";
383 YCTX->xmlctx->value_len = 0;
384 assert_int_equal(yin_validate_value(YCTX, Y_STR_ARG), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +0100385
Radek Iša56ca9e42020-09-08 18:42:00 +0200386 YCTX->xmlctx->value = "pre:b";
387 YCTX->xmlctx->value_len = 5;
388 assert_int_equal(yin_validate_value(YCTX, Y_IDENTIF_ARG), LY_EVALID);
389 assert_int_equal(yin_validate_value(YCTX, Y_PREF_IDENTIF_ARG), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +0100390
Radek Iša56ca9e42020-09-08 18:42:00 +0200391 YCTX->xmlctx->value = "pre:pre:b";
392 YCTX->xmlctx->value_len = 9;
393 assert_int_equal(yin_validate_value(YCTX, Y_PREF_IDENTIF_ARG), LY_EVALID);
David Sedlák4a650532019-07-10 11:55:18 +0200394}
395
Michal Vasko12ef5362022-09-16 15:13:58 +0200396static void
397test_valid_module(void **state)
398{
399 struct lys_module *mod;
400 char *printed;
401 const char *links_yin =
402 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
403 "<module name=\"links\"\n"
404 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n"
405 " xmlns:mod2=\"urn:module2\">\n"
406 " <yang-version value=\"1.1\"/>\n"
407 " <namespace uri=\"urn:module2\"/>\n"
408 " <prefix value=\"mod2\"/>\n"
409 " <identity name=\"just-another-identity\"/>\n"
410 " <grouping name=\"rgroup\">\n"
411 " <leaf name=\"rg1\">\n"
412 " <type name=\"string\"/>\n"
413 " </leaf>\n"
414 " <leaf name=\"rg2\">\n"
415 " <type name=\"string\"/>\n"
416 " </leaf>\n"
417 " </grouping>\n"
418 " <leaf name=\"one-leaf\">\n"
419 " <type name=\"string\"/>\n"
420 " </leaf>\n"
421 " <list name=\"list-for-augment\">\n"
422 " <key value=\"keyleaf\"/>\n"
423 " <leaf name=\"keyleaf\">\n"
424 " <type name=\"string\"/>\n"
425 " </leaf>\n"
426 " <leaf name=\"just-leaf\">\n"
427 " <type name=\"int32\"/>\n"
428 " </leaf>\n"
429 " </list>\n"
430 " <leaf name=\"rleaf\">\n"
431 " <type name=\"string\"/>\n"
432 " </leaf>\n"
433 " <leaf-list name=\"llist\">\n"
434 " <type name=\"string\"/>\n"
435 " <min-elements value=\"0\"/>\n"
436 " <max-elements value=\"100\"/>\n"
437 " <ordered-by value=\"user\"/>\n"
438 " </leaf-list>\n"
439 "</module>\n";
440 const char *statements_yin =
441 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
442 "<module name=\"statements\"\n"
443 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n"
444 " xmlns:mod=\"urn:module\"\n"
445 " xmlns:mod2=\"urn:module2\">\n"
446 " <yang-version value=\"1.1\"/>\n"
447 " <namespace uri=\"urn:module\"/>\n"
448 " <prefix value=\"mod\"/>\n"
449 " <import module=\"links\">\n"
450 " <prefix value=\"mod2\"/>\n"
451 " </import>\n"
452 " <extension name=\"ext\"/>\n"
453 " <identity name=\"random-identity\">\n"
454 " <base name=\"mod2:just-another-identity\"/>\n"
455 " <base name=\"another-identity\"/>\n"
456 " </identity>\n"
457 " <identity name=\"another-identity\">\n"
458 " <base name=\"mod2:just-another-identity\"/>\n"
459 " </identity>\n"
460 " <typedef name=\"percent\">\n"
461 " <type name=\"uint8\">\n"
462 " <range value=\"0 .. 100\"/>\n"
463 " </type>\n"
464 " <units name=\"percent\"/>\n"
465 " </typedef>\n"
466 " <list name=\"list1\">\n"
467 " <key value=\"a\"/>\n"
468 " <leaf name=\"a\">\n"
469 " <type name=\"string\"/>\n"
470 " </leaf>\n"
471 " <leaf name=\"x\">\n"
472 " <type name=\"string\"/>\n"
473 " </leaf>\n"
474 " <leaf name=\"y\">\n"
475 " <type name=\"string\"/>\n"
476 " </leaf>\n"
477 " </list>\n"
478 " <container name=\"ice-cream-shop\">\n"
479 " <container name=\"employees\">\n"
480 " <when condition=\"/list1/x\"/>\n"
481 " <list name=\"employee\">\n"
482 " <key value=\"id\"/>\n"
483 " <unique tag=\"name\"/>\n"
484 " <config value=\"true\"/>\n"
485 " <min-elements value=\"0\">\n"
486 " <mod:ext/>\n"
487 " </min-elements>\n"
488 " <max-elements value=\"unbounded\"/>\n"
489 " <leaf name=\"id\">\n"
490 " <type name=\"uint64\"/>\n"
491 " <mandatory value=\"true\"/>\n"
492 " </leaf>\n"
493 " <leaf name=\"name\">\n"
494 " <type name=\"string\"/>\n"
495 " </leaf>\n"
496 " <leaf name=\"age\">\n"
497 " <type name=\"uint32\"/>\n"
498 " </leaf>\n"
499 " </list>\n"
500 " </container>\n"
501 " </container>\n"
502 " <container name=\"random\">\n"
503 " <grouping name=\"group\">\n"
504 " <leaf name=\"g1\">\n"
505 " <type name=\"percent\"/>\n"
506 " <mandatory value=\"false\"/>\n"
507 " </leaf>\n"
508 " <leaf name=\"g2\">\n"
509 " <type name=\"string\"/>\n"
510 " </leaf>\n"
511 " </grouping>\n"
512 " <choice name=\"switch\">\n"
513 " <case name=\"a\">\n"
514 " <leaf name=\"aleaf\">\n"
515 " <type name=\"string\"/>\n"
516 " <default value=\"aaa\"/>\n"
517 " </leaf>\n"
518 " </case>\n"
519 " <case name=\"c\">\n"
520 " <leaf name=\"cleaf\">\n"
521 " <type name=\"string\"/>\n"
522 " </leaf>\n"
523 " </case>\n"
524 " </choice>\n"
525 " <anyxml name=\"xml-data\"/>\n"
526 " <anydata name=\"any-data\"/>\n"
527 " <leaf-list name=\"leaflist\">\n"
528 " <type name=\"string\"/>\n"
529 " <min-elements value=\"0\"/>\n"
530 " <max-elements value=\"20\"/>\n"
531 " </leaf-list>\n"
532 " <uses name=\"group\"/>\n"
533 " <uses name=\"mod2:rgroup\"/>\n"
534 " <leaf name=\"lref\">\n"
535 " <type name=\"leafref\">\n"
536 " <path value=\"/mod2:one-leaf\"/>\n"
537 " </type>\n"
538 " </leaf>\n"
539 " <leaf name=\"iref\">\n"
540 " <type name=\"identityref\">\n"
541 " <base name=\"mod2:just-another-identity\"/>\n"
542 " </type>\n"
543 " </leaf>\n"
544 " </container>\n"
545 " <augment target-node=\"/random\">\n"
546 " <leaf name=\"aug-leaf\">\n"
547 " <type name=\"string\"/>\n"
548 " </leaf>\n"
549 " </augment>\n"
550 " <notification name=\"notif\"/>\n"
551 " <deviation target-node=\"/mod:ice-cream-shop/mod:employees/mod:employee/mod:age\">\n"
552 " <deviate value=\"not-supported\">\n"
553 " <mod:ext/>\n"
554 " </deviate>\n"
555 " </deviation>\n"
556 " <deviation target-node=\"/mod:list1\">\n"
557 " <deviate value=\"add\">\n"
558 " <mod:ext/>\n"
559 " <must condition=\"1\"/>\n"
560 " <must condition=\"2\"/>\n"
561 " <unique tag=\"x\"/>\n"
562 " <unique tag=\"y\"/>\n"
563 " <config value=\"true\"/>\n"
564 " <min-elements value=\"1\"/>\n"
565 " <max-elements value=\"2\"/>\n"
566 " </deviate>\n"
567 " </deviation>\n"
568 " <deviation target-node=\"/mod:ice-cream-shop/mod:employees/mod:employee\">\n"
569 " <deviate value=\"delete\">\n"
570 " <unique tag=\"name\"/>\n"
571 " </deviate>\n"
572 " </deviation>\n"
573 " <deviation target-node=\"/mod:random/mod:leaflist\">\n"
574 " <deviate value=\"replace\">\n"
575 " <type name=\"uint32\"/>\n"
576 " <min-elements value=\"10\"/>\n"
577 " <max-elements value=\"15\"/>\n"
578 " </deviate>\n"
579 " </deviation>\n"
580 "</module>\n";
581
582 UTEST_ADD_MODULE(links_yin, LYS_IN_YIN, NULL, NULL);
583 UTEST_ADD_MODULE(statements_yin, LYS_IN_YIN, NULL, &mod);
584 lys_print_mem(&printed, mod, LYS_OUT_YIN, 0);
585 assert_string_equal(printed, statements_yin);
586 free(printed);
587}
588
589static void
590test_print_module(void **state)
591{
592 struct lys_module *mod;
593
594 char *orig = malloc(8096);
595
596 strcpy(orig,
597 "module all {\n"
598 " yang-version 1.1;\n"
599 " namespace \"urn:all\";\n"
600 " prefix all_mod;\n\n"
601 " import ietf-yang-types {\n"
602 " prefix yt;\n"
603 " revision-date 2013-07-15;\n"
604 " description\n"
605 " \"YANG types\";\n"
606 " reference\n"
607 " \"RFC reference\";\n"
608 " }\n\n"
609 " feature feat1 {\n"
610 " if-feature \"feat2\";\n"
611 " status obsolete;\n"
612 " }\n\n"
613 " feature feat2;\n"
614 " feature feat3;\n\n"
615 " identity ident2 {\n"
616 " base ident1;\n"
617 " }\n\n"
618 " identity ident1;\n\n"
619 " typedef tdef1 {\n"
620 " type tdef2 {\n"
621 " length \"3..9 | 30..40\";\n"
622 " pattern \"[ac]*\";\n"
623 " }\n"
624 " units \"none\";\n"
625 " default \"aaa\";\n"
626 " }\n\n"
627 " typedef tdef2 {\n"
628 " type string {\n"
629 " length \"2..10 | 20..50\";\n"
630 " pattern \"[ab]*\";\n"
631 " }\n"
632 " }\n\n"
633 " grouping group1 {\n"
634 " leaf leaf1 {\n"
635 " type int8;\n"
636 " }\n"
637 " }\n\n"
638 " container cont1 {\n"
639 " leaf leaf2 {\n"
640 " if-feature \"feat1\";\n"
641 " type int16;\n"
642 " status obsolete;\n"
643 " }\n\n"
644 " uses group1 {\n"
645 " if-feature \"feat2\";\n"
646 " refine \"leaf1\" {\n"
647 " if-feature \"feat3\";\n"
648 " must \"24 - 4 = number('20')\";\n"
649 " default \"25\";\n"
650 " config true;\n"
651 " mandatory false;\n"
652 " description\n"
653 " \"dsc\";\n"
654 " reference\n"
655 " \"none\";\n"
656 " }\n"
657 " }\n\n"
658 " leaf leaf3 {\n"
659 " type int32;\n"
660 " }\n\n"
661 " leaf leaf4 {\n"
662 " type int64 {\n"
663 " range \"1000 .. 50000\" {\n"
664 " error-message\n"
665 " \"Special error message.\";\n"
666 " error-app-tag \"special-tag\";\n"
667 " }\n"
668 " }\n"
669 " }\n\n"
670 " leaf leaf5 {\n"
671 " type uint8;\n"
672 " }\n\n"
673 " leaf leaf6 {\n"
674 " type uint16;\n"
675 " }\n\n"
676 " leaf leaf7 {\n"
677 " type uint32;\n"
678 " }\n\n"
679 " leaf leaf8 {\n"
680 " type uint64;\n"
681 " }\n\n"
682 " choice choic1 {\n"
683 " default \"leaf9b\";\n"
684 " leaf leaf9a {\n"
685 " type decimal64 {\n"
686 " fraction-digits 9;\n"
687 " }\n"
688 " }\n\n"
689 " leaf leaf9b {\n"
690 " type boolean;\n"
691 " default \"false\";\n"
692 " }\n"
693 " }\n\n"
694 " leaf leaf10 {\n"
695 " type boolean;\n"
696 " }\n\n");
697 strcpy(orig + strlen(orig),
698 " leaf leaf11 {\n"
699 " type enumeration {\n"
700 " enum \"one\";\n"
701 " enum \"two\";\n"
702 " enum \"five\" {\n"
703 " value 5;\n"
704 " }\n"
705 " }\n"
706 " }\n\n"
707 " leaf leaf12 {\n"
708 " type bits {\n"
709 " bit flag0 {\n"
710 " position 0;\n"
711 " }\n"
712 " bit flag1;\n"
713 " bit flag2 {\n"
714 " position 2;\n"
715 " }\n"
716 " bit flag3 {\n"
717 " position 3;\n"
718 " }\n"
719 " }\n"
720 " default \"flag0 flag3\";\n"
721 " }\n\n"
722 " leaf leaf13 {\n"
723 " type binary;\n"
724 " }\n\n"
725 " leaf leaf14 {\n"
726 " type leafref {\n"
727 " path \"/cont1/leaf17\";\n"
728 " }\n"
729 " }\n\n"
730 " leaf leaf15 {\n"
731 " type empty;\n"
732 " }\n\n"
733 " leaf leaf16 {\n"
734 " type union {\n"
735 " type instance-identifier {\n"
736 " require-instance true;\n"
737 " }\n"
738 " type int8;\n"
739 " }\n"
740 " }\n\n"
741 " list list1 {\n"
742 " key \"leaf18\";\n"
743 " unique \"leaf19\";\n"
744 " min-elements 1;\n"
745 " max-elements 20;\n"
746 " leaf leaf18 {\n"
747 " type string;\n"
748 " }\n\n"
749 " leaf leaf19 {\n"
750 " type uint32;\n"
751 " }\n\n"
752 " anyxml axml1;\n"
753 " anydata adata1;\n\n"
754 " action act1 {\n"
755 " input {\n"
756 " leaf leaf24 {\n"
757 " type string;\n"
758 " }\n"
759 " }\n\n"
760 " output {\n"
761 " leaf leaf25 {\n"
762 " type string;\n"
763 " }\n"
764 " }\n"
765 " }\n\n"
766 " notification notif1 {\n"
767 " leaf leaf26 {\n"
768 " type string;\n"
769 " }\n"
770 " }\n"
771 " }\n\n"
772 " leaf-list llist1 {\n"
773 " type tdef1;\n"
774 " ordered-by user;\n"
775 " }\n\n"
776 " list list2 {\n"
777 " key \"leaf27 leaf28\";\n"
778 " leaf leaf27 {\n"
779 " type uint8;\n"
780 " }\n\n"
781 " leaf leaf28 {\n"
782 " type uint8;\n"
783 " }\n"
784 " }\n\n"
785 " leaf leaf29 {\n"
786 " type instance-identifier;\n"
787 " }\n\n"
788 " container must-deviations-container {\n"
789 " presence \"Allows deviations on the leaf\";\n"
790 " leaf leaf30 {\n"
791 " type string;\n"
792 " }\n"
793 " }\n\n"
794 " leaf leaf23 {\n"
795 " type empty;\n"
796 " }\n"
797 " }\n\n"
798 " augment \"/cont1\" {\n"
799 " leaf leaf17 {\n"
800 " type string;\n"
801 " }\n"
802 " }\n\n"
803 " rpc rpc1 {\n"
804 " input {\n"
805 " leaf leaf20 {\n"
806 " type tdef1;\n"
807 " }\n"
808 " }\n\n"
809 " output {\n"
810 " container cont2 {\n"
811 " leaf leaf21 {\n"
812 " type empty;\n"
813 " }\n"
814 " }\n"
815 " }\n"
816 " }\n\n"
817 " container test-when {\n"
818 " leaf when-check {\n"
819 " type boolean;\n"
820 " }\n\n"
821 " leaf gated-data {\n"
822 " when \"../when-check = 'true'\";\n"
823 " type uint16;\n"
824 " }\n"
825 " }\n\n"
826 " extension c-define {\n"
827 " description\n"
828 " \"Takes as an argument a name string.\n"
829 " Makes the code generator use the given name\n"
830 " in the #define.\";\n"
831 " argument \"name\";\n"
832 " }\n"
833 "}\n");
834
835 char *ori_res = malloc(8096);
836
837 strcpy(ori_res,
838 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
839 "<module name=\"all\"\n"
840 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n"
841 " xmlns:all_mod=\"urn:all\"\n"
842 " xmlns:yt=\"urn:ietf:params:xml:ns:yang:ietf-yang-types\">\n"
843 " <yang-version value=\"1.1\"/>\n"
844 " <namespace uri=\"urn:all\"/>\n"
845 " <prefix value=\"all_mod\"/>\n"
846 " <import module=\"ietf-yang-types\">\n"
847 " <prefix value=\"yt\"/>\n"
848 " <revision-date date=\"2013-07-15\"/>\n"
849 " <description>\n"
850 " <text>YANG types</text>\n"
851 " </description>\n"
852 " <reference>\n"
853 " <text>RFC reference</text>\n"
854 " </reference>\n"
855 " </import>\n"
856 " <extension name=\"c-define\">\n"
857 " <argument name=\"name\"/>\n"
858 " <description>\n"
859 " <text>Takes as an argument a name string.\n"
860 "Makes the code generator use the given name\n"
861 "in the #define.</text>\n"
862 " </description>\n"
863 " </extension>\n"
864 " <feature name=\"feat1\">\n"
865 " <if-feature name=\"feat2\"/>\n"
866 " <status value=\"obsolete\"/>\n"
867 " </feature>\n"
868 " <feature name=\"feat2\"/>\n"
869 " <feature name=\"feat3\"/>\n"
870 " <identity name=\"ident2\">\n"
871 " <base name=\"ident1\"/>\n"
872 " </identity>\n"
873 " <identity name=\"ident1\"/>\n"
874 " <typedef name=\"tdef1\">\n"
875 " <type name=\"tdef2\">\n"
876 " <length value=\"3..9 | 30..40\"/>\n"
877 " <pattern value=\"[ac]*\"/>\n"
878 " </type>\n"
879 " <units name=\"none\"/>\n"
880 " <default value=\"aaa\"/>\n"
881 " </typedef>\n"
882 " <typedef name=\"tdef2\">\n"
883 " <type name=\"string\">\n"
884 " <length value=\"2..10 | 20..50\"/>\n"
885 " <pattern value=\"[ab]*\"/>\n"
886 " </type>\n"
887 " </typedef>\n"
888 " <grouping name=\"group1\">\n"
889 " <leaf name=\"leaf1\">\n"
890 " <type name=\"int8\"/>\n"
891 " </leaf>\n"
892 " </grouping>\n"
893 " <container name=\"cont1\">\n"
894 " <leaf name=\"leaf2\">\n"
895 " <if-feature name=\"feat1\"/>\n"
896 " <type name=\"int16\"/>\n"
897 " <status value=\"obsolete\"/>\n"
898 " </leaf>\n"
899 " <uses name=\"group1\">\n"
900 " <if-feature name=\"feat2\"/>\n"
901 " <refine target-node=\"leaf1\">\n"
902 " <if-feature name=\"feat3\"/>\n"
903 " <must condition=\"24 - 4 = number('20')\"/>\n"
904 " <default value=\"25\"/>\n"
905 " <config value=\"true\"/>\n"
906 " <mandatory value=\"false\"/>\n"
907 " <description>\n"
908 " <text>dsc</text>\n"
909 " </description>\n"
910 " <reference>\n"
911 " <text>none</text>\n"
912 " </reference>\n"
913 " </refine>\n"
914 " </uses>\n"
915 " <leaf name=\"leaf3\">\n"
916 " <type name=\"int32\"/>\n"
917 " </leaf>\n"
918 " <leaf name=\"leaf4\">\n"
919 " <type name=\"int64\">\n"
920 " <range value=\"1000 .. 50000\">\n"
921 " <error-message>\n"
922 " <value>Special error message.</value>\n"
923 " </error-message>\n"
924 " <error-app-tag value=\"special-tag\"/>\n"
925 " </range>\n"
926 " </type>\n"
927 " </leaf>\n"
928 " <leaf name=\"leaf5\">\n"
929 " <type name=\"uint8\"/>\n"
930 " </leaf>\n"
931 " <leaf name=\"leaf6\">\n"
932 " <type name=\"uint16\"/>\n"
933 " </leaf>\n"
934 " <leaf name=\"leaf7\">\n"
935 " <type name=\"uint32\"/>\n"
936 " </leaf>\n"
937 " <leaf name=\"leaf8\">\n"
938 " <type name=\"uint64\"/>\n"
939 " </leaf>\n"
940 " <choice name=\"choic1\">\n"
941 " <default value=\"leaf9b\"/>\n"
942 " <leaf name=\"leaf9a\">\n"
943 " <type name=\"decimal64\">\n"
944 " <fraction-digits value=\"9\"/>\n"
945 " </type>\n"
946 " </leaf>\n"
947 " <leaf name=\"leaf9b\">\n"
948 " <type name=\"boolean\"/>\n"
949 " <default value=\"false\"/>\n"
950 " </leaf>\n"
951 " </choice>\n"
952 " <leaf name=\"leaf10\">\n"
953 " <type name=\"boolean\"/>\n"
954 " </leaf>\n");
955 strcpy(ori_res + strlen(ori_res),
956 " <leaf name=\"leaf11\">\n"
957 " <type name=\"enumeration\">\n"
958 " <enum name=\"one\"/>\n"
959 " <enum name=\"two\"/>\n"
960 " <enum name=\"five\">\n"
961 " <value value=\"5\"/>\n"
962 " </enum>\n"
963 " </type>\n"
964 " </leaf>\n"
965 " <leaf name=\"leaf12\">\n"
966 " <type name=\"bits\">\n"
967 " <bit name=\"flag0\">\n"
968 " <position value=\"0\"/>\n"
969 " </bit>\n"
970 " <bit name=\"flag1\"/>\n"
971 " <bit name=\"flag2\">\n"
972 " <position value=\"2\"/>\n"
973 " </bit>\n"
974 " <bit name=\"flag3\">\n"
975 " <position value=\"3\"/>\n"
976 " </bit>\n"
977 " </type>\n"
978 " <default value=\"flag0 flag3\"/>\n"
979 " </leaf>\n"
980 " <leaf name=\"leaf13\">\n"
981 " <type name=\"binary\"/>\n"
982 " </leaf>\n"
983 " <leaf name=\"leaf14\">\n"
984 " <type name=\"leafref\">\n"
985 " <path value=\"/cont1/leaf17\"/>\n"
986 " </type>\n"
987 " </leaf>\n"
988 " <leaf name=\"leaf15\">\n"
989 " <type name=\"empty\"/>\n"
990 " </leaf>\n"
991 " <leaf name=\"leaf16\">\n"
992 " <type name=\"union\">\n"
993 " <type name=\"instance-identifier\">\n"
994 " <require-instance value=\"true\"/>\n"
995 " </type>\n"
996 " <type name=\"int8\"/>\n"
997 " </type>\n"
998 " </leaf>\n"
999 " <list name=\"list1\">\n"
1000 " <key value=\"leaf18\"/>\n"
1001 " <unique tag=\"leaf19\"/>\n"
1002 " <min-elements value=\"1\"/>\n"
1003 " <max-elements value=\"20\"/>\n"
1004 " <leaf name=\"leaf18\">\n"
1005 " <type name=\"string\"/>\n"
1006 " </leaf>\n"
1007 " <leaf name=\"leaf19\">\n"
1008 " <type name=\"uint32\"/>\n"
1009 " </leaf>\n"
1010 " <anyxml name=\"axml1\"/>\n"
1011 " <anydata name=\"adata1\"/>\n"
1012 " <action name=\"act1\">\n"
1013 " <input>\n"
1014 " <leaf name=\"leaf24\">\n"
1015 " <type name=\"string\"/>\n"
1016 " </leaf>\n"
1017 " </input>\n"
1018 " <output>\n"
1019 " <leaf name=\"leaf25\">\n"
1020 " <type name=\"string\"/>\n"
1021 " </leaf>\n"
1022 " </output>\n"
1023 " </action>\n"
1024 " <notification name=\"notif1\">\n"
1025 " <leaf name=\"leaf26\">\n"
1026 " <type name=\"string\"/>\n"
1027 " </leaf>\n"
1028 " </notification>\n"
1029 " </list>\n"
1030 " <leaf-list name=\"llist1\">\n"
1031 " <type name=\"tdef1\"/>\n"
1032 " <ordered-by value=\"user\"/>\n"
1033 " </leaf-list>\n"
1034 " <list name=\"list2\">\n"
1035 " <key value=\"leaf27 leaf28\"/>\n"
1036 " <leaf name=\"leaf27\">\n"
1037 " <type name=\"uint8\"/>\n"
1038 " </leaf>\n"
1039 " <leaf name=\"leaf28\">\n"
1040 " <type name=\"uint8\"/>\n"
1041 " </leaf>\n"
1042 " </list>\n"
1043 " <leaf name=\"leaf29\">\n"
1044 " <type name=\"instance-identifier\"/>\n"
1045 " </leaf>\n"
1046 " <container name=\"must-deviations-container\">\n"
1047 " <presence value=\"Allows deviations on the leaf\"/>\n"
1048 " <leaf name=\"leaf30\">\n"
1049 " <type name=\"string\"/>\n"
1050 " </leaf>\n"
1051 " </container>\n"
1052 " <leaf name=\"leaf23\">\n"
1053 " <type name=\"empty\"/>\n"
1054 " </leaf>\n"
1055 " </container>\n"
1056 " <container name=\"test-when\">\n"
1057 " <leaf name=\"when-check\">\n"
1058 " <type name=\"boolean\"/>\n"
1059 " </leaf>\n"
1060 " <leaf name=\"gated-data\">\n"
1061 " <when condition=\"../when-check = 'true'\"/>\n"
1062 " <type name=\"uint16\"/>\n"
1063 " </leaf>\n"
1064 " </container>\n"
1065 " <augment target-node=\"/cont1\">\n"
1066 " <leaf name=\"leaf17\">\n"
1067 " <type name=\"string\"/>\n"
1068 " </leaf>\n"
1069 " </augment>\n"
1070 " <rpc name=\"rpc1\">\n"
1071 " <input>\n"
1072 " <leaf name=\"leaf20\">\n"
1073 " <type name=\"tdef1\"/>\n"
1074 " </leaf>\n"
1075 " </input>\n"
1076 " <output>\n"
1077 " <container name=\"cont2\">\n"
1078 " <leaf name=\"leaf21\">\n"
1079 " <type name=\"empty\"/>\n"
1080 " </leaf>\n"
1081 " </container>\n"
1082 " </output>\n"
1083 " </rpc>\n"
1084 "</module>\n");
1085
1086 char *printed;
1087 struct ly_out *out;
1088
1089 assert_int_equal(LY_SUCCESS, ly_out_new_memory(&printed, 0, &out));
1090
1091 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1092 assert_int_equal(LY_SUCCESS, lys_print_module(out, mod, LYS_OUT_YIN, 0, 0));
1093 assert_int_equal(strlen(ori_res), ly_out_printed(out));
1094 assert_string_equal(printed, ori_res);
1095
1096 ly_out_free(out, NULL, 1);
1097 free(orig);
1098 free(ori_res);
1099}
1100
1101static LY_ERR
1102test_imp_clb(const char *UNUSED(mod_name), const char *UNUSED(mod_rev), const char *UNUSED(submod_name),
1103 const char *UNUSED(sub_rev), void *user_data, LYS_INFORMAT *format,
1104 const char **module_data, void (**free_module_data)(void *model_data, void *user_data))
1105{
1106 *module_data = user_data;
1107 *format = LYS_IN_YIN;
1108 *free_module_data = NULL;
1109 return LY_SUCCESS;
1110}
1111
1112static void
1113test_print_submodule(void **state)
1114{
1115 struct lys_module *mod;
1116
1117 const char *mod_yin =
1118 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1119 "<module name=\"a\"\n"
1120 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n"
1121 " xmlns:a_mod=\"urn:a\">\n"
1122 " <yang-version value=\"1.1\"/>\n"
1123 " <namespace uri=\"urn:a\"/>\n"
1124 " <prefix value=\"a_mod\"/>\n"
1125 " <include module=\"a-sub\"/>\n"
1126 "</module>\n";
1127
1128 char *submod_yin =
1129 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1130 "<submodule name=\"a-sub\"\n"
1131 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n"
1132 " xmlns:a_mod=\"urn:a\"\n"
1133 " xmlns:yt=\"urn:ietf:params:xml:ns:yang:ietf-yang-types\">\n"
1134 " <yang-version value=\"1.1\"/>\n"
1135 " <belongs-to module=\"a\">\n"
1136 " <prefix value=\"a_mod\"/>\n"
1137 " </belongs-to>\n"
1138 " <import module=\"ietf-yang-types\">\n"
1139 " <prefix value=\"yt\"/>\n"
1140 " <revision-date date=\"2013-07-15\"/>\n"
1141 " </import>\n\n"
1142 " <description>\n"
1143 " <text>YANG types</text>\n"
1144 " </description>\n"
1145 " <reference>\n"
1146 " <text>RFC reference</text>\n"
1147 " </reference>\n"
1148 "</submodule>\n";
1149
1150 char *printed;
1151 struct ly_out *out;
1152
1153 assert_int_equal(LY_SUCCESS, ly_out_new_memory(&printed, 0, &out));
1154
1155 ly_ctx_set_module_imp_clb(UTEST_LYCTX, test_imp_clb, submod_yin);
1156
1157 UTEST_ADD_MODULE(mod_yin, LYS_IN_YIN, NULL, &mod);
1158 assert_int_equal(LY_SUCCESS, lys_print_submodule(out, mod->parsed->includes[0].submodule, LYS_OUT_YIN, 0, 0));
1159 assert_int_equal(strlen(submod_yin), ly_out_printed(out));
1160 assert_string_equal(printed, submod_yin);
1161
1162 ly_out_free(out, NULL, 1);
1163}
1164
David Sedlák32488102019-07-15 17:44:10 +02001165/* helper function to simplify unit test of each element using parse_content function */
1166LY_ERR
Radek Iša56ca9e42020-09-08 18:42:00 +02001167test_element_helper(void **state, const char *data, void *dest, const char **text, struct lysp_ext_instance **exts)
David Sedlák32488102019-07-15 17:44:10 +02001168{
David Sedlákc5b20842019-08-13 10:18:31 +02001169 const char *name, *prefix;
1170 size_t name_len, prefix_len;
David Sedlák32488102019-07-15 17:44:10 +02001171 LY_ERR ret = LY_SUCCESS;
1172 struct yin_subelement subelems[71] = {
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001173 {LY_STMT_ACTION, dest, 0},
1174 {LY_STMT_ANYDATA, dest, 0},
1175 {LY_STMT_ANYXML, dest, 0},
1176 {LY_STMT_ARGUMENT, dest, 0},
1177 {LY_STMT_AUGMENT, dest, 0},
1178 {LY_STMT_BASE, dest, 0},
1179 {LY_STMT_BELONGS_TO, dest, 0},
1180 {LY_STMT_BIT, dest, 0},
1181 {LY_STMT_CASE, dest, 0},
1182 {LY_STMT_CHOICE, dest, 0},
1183 {LY_STMT_CONFIG, dest, 0},
1184 {LY_STMT_CONTACT, dest, 0},
1185 {LY_STMT_CONTAINER, dest, 0},
1186 {LY_STMT_DEFAULT, dest, YIN_SUBELEM_UNIQUE},
1187 {LY_STMT_DESCRIPTION, dest, 0},
1188 {LY_STMT_DEVIATE, dest, 0},
1189 {LY_STMT_DEVIATION, dest, 0},
1190 {LY_STMT_ENUM, dest, 0},
1191 {LY_STMT_ERROR_APP_TAG, dest, YIN_SUBELEM_UNIQUE},
1192 {LY_STMT_ERROR_MESSAGE, dest, 0},
1193 {LY_STMT_EXTENSION, dest, 0},
1194 {LY_STMT_FEATURE, dest, 0},
1195 {LY_STMT_FRACTION_DIGITS, dest, 0},
1196 {LY_STMT_GROUPING, dest, 0},
1197 {LY_STMT_IDENTITY, dest, 0},
1198 {LY_STMT_IF_FEATURE, dest, 0},
1199 {LY_STMT_IMPORT, dest, 0},
1200 {LY_STMT_INCLUDE, dest, 0},
1201 {LY_STMT_INPUT, dest, 0},
1202 {LY_STMT_KEY, dest, YIN_SUBELEM_UNIQUE},
1203 {LY_STMT_LEAF, dest, 0},
1204 {LY_STMT_LEAF_LIST, dest, 0},
1205 {LY_STMT_LENGTH, dest, 0},
1206 {LY_STMT_LIST, dest, 0},
1207 {LY_STMT_MANDATORY, dest, 0},
1208 {LY_STMT_MAX_ELEMENTS, dest, 0},
1209 {LY_STMT_MIN_ELEMENTS, dest, 0},
1210 {LY_STMT_MODIFIER, dest, 0},
1211 {LY_STMT_MODULE, dest, 0},
1212 {LY_STMT_MUST, dest, 0},
1213 {LY_STMT_NAMESPACE, dest, YIN_SUBELEM_UNIQUE},
1214 {LY_STMT_NOTIFICATION, dest, 0},
1215 {LY_STMT_ORDERED_BY, dest, 0},
1216 {LY_STMT_ORGANIZATION, dest, 0},
1217 {LY_STMT_OUTPUT, dest, 0},
1218 {LY_STMT_PATH, dest, 0},
1219 {LY_STMT_PATTERN, dest, 0},
1220 {LY_STMT_POSITION, dest, 0},
1221 {LY_STMT_PREFIX, dest, YIN_SUBELEM_UNIQUE},
1222 {LY_STMT_PRESENCE, dest, YIN_SUBELEM_UNIQUE},
1223 {LY_STMT_RANGE, dest, 0},
1224 {LY_STMT_REFERENCE, dest, 0},
1225 {LY_STMT_REFINE, dest, 0},
1226 {LY_STMT_REQUIRE_INSTANCE, dest, 0},
1227 {LY_STMT_REVISION, dest, 0},
1228 {LY_STMT_REVISION_DATE, dest, 0},
1229 {LY_STMT_RPC, dest, 0},
1230 {LY_STMT_STATUS, dest, 0},
1231 {LY_STMT_SUBMODULE, dest, 0},
1232 {LY_STMT_TYPE, dest, 0},
1233 {LY_STMT_TYPEDEF, dest, 0},
1234 {LY_STMT_UNIQUE, dest, 0},
1235 {LY_STMT_UNITS, dest, YIN_SUBELEM_UNIQUE},
1236 {LY_STMT_USES, dest, 0},
1237 {LY_STMT_VALUE, dest, 0},
1238 {LY_STMT_WHEN, dest, 0},
1239 {LY_STMT_YANG_VERSION, dest, 0},
1240 {LY_STMT_YIN_ELEMENT, dest, 0},
1241 {LY_STMT_EXTENSION_INSTANCE, dest, 0},
1242 {LY_STMT_ARG_TEXT, dest, 0},
1243 {LY_STMT_ARG_VALUE, dest, 0}
1244 };
1245
aPiecek8d4e75d2021-06-24 14:47:06 +02001246 YCTX->main_ctx = (struct lys_parser_ctx *)YCTX;
Radek Iša56ca9e42020-09-08 18:42:00 +02001247 ly_in_new_memory(data, &UTEST_IN);
1248 lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx);
1249 prefix = YCTX->xmlctx->prefix;
1250 prefix_len = YCTX->xmlctx->prefix_len;
1251 name = YCTX->xmlctx->name;
1252 name_len = YCTX->xmlctx->name_len;
1253 lyxml_ctx_next(YCTX->xmlctx);
Michal Vaskob36053d2020-03-26 15:49:30 +01001254
Radek Iša56ca9e42020-09-08 18:42:00 +02001255 ret = yin_parse_content(YCTX, subelems, 71, yin_match_keyword(YCTX, name, name_len, prefix, prefix_len, LY_STMT_NONE), text, exts);
Michal Vaskob36053d2020-03-26 15:49:30 +01001256
Michal Vasko63f3d842020-07-08 10:10:14 +02001257 /* free parser and input */
Radek Iša56ca9e42020-09-08 18:42:00 +02001258 lyxml_ctx_free(YCTX->xmlctx);
1259 YCTX->xmlctx = NULL;
1260 ly_in_free(UTEST_IN, 0);
1261 UTEST_IN = NULL;
David Sedlák32488102019-07-15 17:44:10 +02001262 return ret;
1263}
1264
David Sedlákd1144562019-08-06 12:36:14 +02001265#define EXT_SUBELEM "<myext:c-define name=\"MY_MTU\" xmlns:myext=\"urn:example:extensions\"/>"
1266
David Sedlák32488102019-07-15 17:44:10 +02001267static void
David Sedlák43801c92019-08-05 15:58:54 +02001268test_enum_elem(void **state)
David Sedlák32488102019-07-15 17:44:10 +02001269{
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001270 struct lysp_type type = {0};
David Sedlák32488102019-07-15 17:44:10 +02001271 const char *data;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001272
David Sedlák32488102019-07-15 17:44:10 +02001273 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001274 "<enum name=\"enum-name\">\n"
1275 " <if-feature name=\"feature\" />\n"
1276 " <value value=\"55\" />\n"
1277 " <status value=\"deprecated\" />\n"
1278 " <description><text>desc...</text></description>\n"
1279 " <reference><text>ref...</text></reference>\n"
1280 " " EXT_SUBELEM "\n"
1281 "</enum>"
1282 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001283 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1284 uint16_t flags = LYS_STATUS_DEPRC | LYS_SET_VALUE;
1285
1286 CHECK_LYSP_TYPE_ENUM(type.enums, "desc...", 1, flags, 1, "enum-name", "ref...", 55);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001287 assert_string_equal(type.enums->iffeatures[0].str, "feature");
Radek Krejci39b7fc22021-02-26 23:29:18 +01001288 TEST_1_CHECK_LYSP_EXT_INSTANCE(type.enums->exts, LY_STMT_ENUM);
Radek Iša56ca9e42020-09-08 18:42:00 +02001289 lysp_type_free(UTEST_LYCTX, &type);
David Sedlákd1144562019-08-06 12:36:14 +02001290 memset(&type, 0, sizeof type);
1291
1292 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001293 "<enum name=\"enum-name\"></enum>"
1294 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001295 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákd1144562019-08-06 12:36:14 +02001296 assert_string_equal(type.enums->name, "enum-name");
Radek Iša56ca9e42020-09-08 18:42:00 +02001297 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák32488102019-07-15 17:44:10 +02001298 memset(&type, 0, sizeof type);
David Sedlák43801c92019-08-05 15:58:54 +02001299}
1300
1301static void
1302test_bit_elem(void **state)
1303{
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001304 struct lysp_type type = {0};
David Sedlák43801c92019-08-05 15:58:54 +02001305 const char *data;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001306
David Sedlák43801c92019-08-05 15:58:54 +02001307 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001308 "<bit name=\"bit-name\">\n"
1309 " <if-feature name=\"feature\" />\n"
1310 " <position value=\"55\" />\n"
1311 " <status value=\"deprecated\" />\n"
1312 " <description><text>desc...</text></description>\n"
1313 " <reference><text>ref...</text></reference>\n"
1314 EXT_SUBELEM
1315 "</bit>"
1316 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001317 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1318 uint16_t flags = LYS_STATUS_DEPRC | LYS_SET_VALUE;
1319
1320 CHECK_LYSP_TYPE_ENUM(type.bits, "desc...", 1, flags, 1, "bit-name", "ref...", 55);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001321 assert_string_equal(type.bits->iffeatures[0].str, "feature");
Radek Krejci39b7fc22021-02-26 23:29:18 +01001322 TEST_1_CHECK_LYSP_EXT_INSTANCE(type.bits->exts, LY_STMT_BIT);
Radek Iša56ca9e42020-09-08 18:42:00 +02001323 lysp_type_free(UTEST_LYCTX, &type);
David Sedlákd1144562019-08-06 12:36:14 +02001324 memset(&type, 0, sizeof type);
1325
1326 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001327 "<bit name=\"bit-name\"> </bit>"
1328 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001329 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1330 CHECK_LYSP_TYPE_ENUM(type.bits, NULL, 0, 0, 0, "bit-name", NULL, 0);
1331 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák43801c92019-08-05 15:58:54 +02001332 memset(&type, 0, sizeof type);
David Sedlák32488102019-07-15 17:44:10 +02001333}
1334
1335static void
David Sedlák32488102019-07-15 17:44:10 +02001336test_status_elem(void **state)
1337{
David Sedlák32488102019-07-15 17:44:10 +02001338 const char *data;
1339 uint16_t flags = 0;
David Sedlák32488102019-07-15 17:44:10 +02001340
1341 /* test invalid value */
1342 data = ELEMENT_WRAPPER_START "<status value=\"invalid\"></status>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001343 assert_int_equal(test_element_helper(state, data, &flags, NULL, NULL), LY_EVALID);
1344 CHECK_LOG_CTX("Invalid value \"invalid\" of \"value\" attribute in \"status\" element. "
1345 "Valid values are \"current\", \"deprecated\" and \"obsolete\".", "Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001346}
1347
1348static void
David Sedlák32488102019-07-15 17:44:10 +02001349test_yin_element_elem(void **state)
1350{
David Sedlák32488102019-07-15 17:44:10 +02001351 const char *data;
1352 uint16_t flags = 0;
David Sedlák32488102019-07-15 17:44:10 +02001353
1354 data = ELEMENT_WRAPPER_START "<yin-element value=\"invalid\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001355 assert_int_equal(test_element_helper(state, data, &flags, NULL, NULL), LY_EVALID);
Radek Iša56ca9e42020-09-08 18:42:00 +02001356 CHECK_LOG_CTX("Invalid value \"invalid\" of \"value\" attribute in \"yin-element\" element. "
1357 "Valid values are \"true\" and \"false\".", "Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001358}
1359
1360static void
1361test_yangversion_elem(void **state)
1362{
David Sedlák32488102019-07-15 17:44:10 +02001363 const char *data;
1364 uint8_t version = 0;
David Sedlák32488102019-07-15 17:44:10 +02001365
1366 /* invalid value */
1367 data = ELEMENT_WRAPPER_START "<yang-version value=\"version\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001368 assert_int_equal(test_element_helper(state, data, &version, NULL, NULL), LY_EVALID);
1369 CHECK_LOG_CTX("Invalid value \"version\" of \"value\" attribute in \"yang-version\" element. "
1370 "Valid values are \"1\" and \"1.1\".", "Line number 1.");
David Sedlák32488102019-07-15 17:44:10 +02001371}
1372
1373static void
David Sedlák8e7bda82019-07-16 17:57:50 +02001374test_argument_elem(void **state)
1375{
David Sedlák8e7bda82019-07-16 17:57:50 +02001376 const char *data;
1377 uint16_t flags = 0;
1378 const char *arg;
1379 struct yin_argument_meta arg_meta = {&flags, &arg};
David Sedlák8e7bda82019-07-16 17:57:50 +02001380
1381 /* min subelems */
1382 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001383 "<argument name=\"arg\">"
1384 "</argument>"
1385 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001386 assert_int_equal(test_element_helper(state, data, &arg_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8e7bda82019-07-16 17:57:50 +02001387 assert_string_equal(arg, "arg");
1388 assert_true(flags == 0);
Michal Vaskoe180ed02021-02-05 16:31:20 +01001389 lydict_remove(UTEST_LYCTX, arg);
David Sedlák8e7bda82019-07-16 17:57:50 +02001390}
1391
1392static void
David Sedlák8e7bda82019-07-16 17:57:50 +02001393test_belongsto_elem(void **state)
1394{
David Sedlák8e7bda82019-07-16 17:57:50 +02001395 const char *data;
1396 struct lysp_submodule submod;
1397
Michal Vasko8a67eff2021-12-07 14:04:47 +01001398 lydict_insert(UTEST_LYCTX, "module-name", 0, &PARSER_CUR_PMOD(YCTX)->mod->name);
Radek Iša56ca9e42020-09-08 18:42:00 +02001399
David Sedlák8e7bda82019-07-16 17:57:50 +02001400 data = ELEMENT_WRAPPER_START "<belongs-to module=\"module-name\"></belongs-to>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001401 assert_int_equal(test_element_helper(state, data, &submod, NULL, NULL), LY_EVALID);
1402 CHECK_LOG_CTX("Missing mandatory sub-element \"prefix\" of \"belongs-to\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001403}
1404
1405static void
1406test_config_elem(void **state)
1407{
David Sedlák8e7bda82019-07-16 17:57:50 +02001408 const char *data;
1409 uint16_t flags = 0;
David Sedlák8e7bda82019-07-16 17:57:50 +02001410
1411 data = ELEMENT_WRAPPER_START "<config value=\"false\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001412 assert_int_equal(test_element_helper(state, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001413 assert_true(flags & LYS_CONFIG_R);
David Sedlák8e7bda82019-07-16 17:57:50 +02001414 flags = 0;
1415
1416 data = ELEMENT_WRAPPER_START "<config value=\"invalid\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001417 assert_int_equal(test_element_helper(state, data, &flags, NULL, NULL), LY_EVALID);
1418 CHECK_LOG_CTX("Invalid value \"invalid\" of \"value\" attribute in \"config\" element. "
1419 "Valid values are \"true\" and \"false\".", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001420}
1421
1422static void
1423test_default_elem(void **state)
1424{
David Sedlák8e7bda82019-07-16 17:57:50 +02001425 const char *data;
Michal Vasko7f45cf22020-10-01 12:49:44 +02001426 struct lysp_qname val = {0};
David Sedlák8e7bda82019-07-16 17:57:50 +02001427
1428 data = ELEMENT_WRAPPER_START "<default/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001429 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_EVALID);
1430 CHECK_LOG_CTX("Missing mandatory attribute value of default element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001431}
1432
1433static void
1434test_err_app_tag_elem(void **state)
1435{
David Sedlák8e7bda82019-07-16 17:57:50 +02001436 const char *data;
1437 const char *val = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001438
1439 data = ELEMENT_WRAPPER_START "<error-app-tag/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001440 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_EVALID);
1441 CHECK_LOG_CTX("Missing mandatory attribute value of error-app-tag element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001442}
1443
1444static void
1445test_err_msg_elem(void **state)
1446{
David Sedlák8e7bda82019-07-16 17:57:50 +02001447 const char *data;
1448 const char *val = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001449
1450 data = ELEMENT_WRAPPER_START "<error-message></error-message>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001451 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_EVALID);
1452 CHECK_LOG_CTX("Missing mandatory sub-element \"value\" of \"error-message\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001453
David Sedlákdf2a9732019-08-07 13:23:16 +02001454 data = ELEMENT_WRAPPER_START "<error-message invalid=\"text\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001455 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_EVALID);
1456 CHECK_LOG_CTX("Unexpected attribute \"invalid\" of \"error-message\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001457}
1458
1459static void
1460test_fracdigits_elem(void **state)
1461{
David Sedlák8e7bda82019-07-16 17:57:50 +02001462 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001463 struct lysp_type type = {0};
David Sedlák8e7bda82019-07-16 17:57:50 +02001464
David Sedlák8e7bda82019-07-16 17:57:50 +02001465 /* invalid values */
1466 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"-1\"></fraction-digits>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001467 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
1468 CHECK_LOG_CTX("Invalid value \"-1\" of \"value\" attribute in \"fraction-digits\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001469
1470 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"02\"></fraction-digits>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001471 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
1472 CHECK_LOG_CTX("Invalid value \"02\" of \"value\" attribute in \"fraction-digits\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001473
1474 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"1p\"></fraction-digits>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001475 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
1476 CHECK_LOG_CTX("Invalid value \"1p\" of \"value\" attribute in \"fraction-digits\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001477
1478 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"19\"></fraction-digits>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001479 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
1480 CHECK_LOG_CTX("Invalid value \"19\" of \"value\" attribute in \"fraction-digits\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001481
1482 data = ELEMENT_WRAPPER_START "<fraction-digits value=\"999999999999999999\"></fraction-digits>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001483 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
1484 CHECK_LOG_CTX("Invalid value \"999999999999999999\" of \"value\" attribute in \"fraction-digits\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001485}
1486
1487static void
1488test_iffeature_elem(void **state)
1489{
David Sedlák8e7bda82019-07-16 17:57:50 +02001490 const char *data;
1491 const char **iffeatures = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001492
1493 data = ELEMENT_WRAPPER_START "<if-feature/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001494 assert_int_equal(test_element_helper(state, data, &iffeatures, NULL, NULL), LY_EVALID);
1495 CHECK_LOG_CTX("Missing mandatory attribute name of if-feature element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001496 LY_ARRAY_FREE(iffeatures);
1497 iffeatures = NULL;
David Sedlák8e7bda82019-07-16 17:57:50 +02001498}
1499
1500static void
1501test_length_elem(void **state)
1502{
David Sedlák8e7bda82019-07-16 17:57:50 +02001503 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001504 struct lysp_type type = {0};
David Sedlák8e7bda82019-07-16 17:57:50 +02001505
1506 /* max subelems */
1507 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001508 "<length value=\"length-str\">\n"
1509 " <error-message><value>err-msg</value></error-message>\n"
1510 " <error-app-tag value=\"err-app-tag\"/>\n"
1511 " <description><text>desc</text></description>\n"
1512 " <reference><text>ref</text></reference>\n"
1513 EXT_SUBELEM
1514 "</length>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001515 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001516 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1517 CHECK_LYSP_RESTR(type.length, "length-str", "desc",
1518 "err-app-tag", "err-msg", 1, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001519 assert_true(type.flags & LYS_SET_LENGTH);
Radek Krejci39b7fc22021-02-26 23:29:18 +01001520 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(type.length->exts[0]), LY_STMT_LENGTH);
Radek Iša56ca9e42020-09-08 18:42:00 +02001521 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák8e7bda82019-07-16 17:57:50 +02001522 memset(&type, 0, sizeof(type));
1523
1524 /* min subelems */
1525 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001526 "<length value=\"length-str\">"
1527 "</length>"
David Sedlák8e7bda82019-07-16 17:57:50 +02001528 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001529 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1530 CHECK_LYSP_RESTR(type.length, "length-str", NULL,
1531 NULL, NULL, 0, NULL);
1532 lysp_type_free(UTEST_LYCTX, &type);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001533 assert_true(type.flags & LYS_SET_LENGTH);
David Sedlák8e7bda82019-07-16 17:57:50 +02001534 memset(&type, 0, sizeof(type));
1535
1536 data = ELEMENT_WRAPPER_START "<length></length>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001537 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
1538 CHECK_LOG_CTX("Missing mandatory attribute value of length element.", "Line number 1.");
1539 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák8e7bda82019-07-16 17:57:50 +02001540 memset(&type, 0, sizeof(type));
David Sedlák8e7bda82019-07-16 17:57:50 +02001541}
1542
1543static void
1544test_modifier_elem(void **state)
1545{
David Sedlák8e7bda82019-07-16 17:57:50 +02001546 const char *data;
Radek Krejci011e4aa2020-09-04 15:22:31 +02001547 const char *pat;
David Sedlák8e7bda82019-07-16 17:57:50 +02001548
Radek Iša56ca9e42020-09-08 18:42:00 +02001549 assert_int_equal(LY_SUCCESS, lydict_insert(UTEST_LYCTX, "\006pattern", 8, &pat));
David Sedlák8e7bda82019-07-16 17:57:50 +02001550 data = ELEMENT_WRAPPER_START "<modifier value=\"invert\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001551 assert_int_equal(test_element_helper(state, data, &pat, NULL, NULL), LY_EVALID);
1552 CHECK_LOG_CTX("Invalid value \"invert\" of \"value\" attribute in \"modifier\" element. "
1553 "Only valid value is \"invert-match\".", "Line number 1.");
Michal Vaskoe180ed02021-02-05 16:31:20 +01001554 lydict_remove(UTEST_LYCTX, pat);
David Sedlák8e7bda82019-07-16 17:57:50 +02001555}
1556
1557static void
1558test_namespace_elem(void **state)
1559{
David Sedlák8e7bda82019-07-16 17:57:50 +02001560 const char *data;
1561 const char *ns;
David Sedlák8e7bda82019-07-16 17:57:50 +02001562
1563 data = ELEMENT_WRAPPER_START "<namespace/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001564 assert_int_equal(test_element_helper(state, data, &ns, NULL, NULL), LY_EVALID);
1565 CHECK_LOG_CTX("Missing mandatory attribute uri of namespace element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001566}
1567
1568static void
David Sedlák8e7bda82019-07-16 17:57:50 +02001569test_pattern_elem(void **state)
1570{
David Sedlák8e7bda82019-07-16 17:57:50 +02001571 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001572 struct lysp_type type = {0};
David Sedlák8e7bda82019-07-16 17:57:50 +02001573
1574 /* max subelems */
1575 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001576 "<pattern value=\"super_pattern\">\n"
1577 " <modifier value=\"invert-match\"/>\n"
1578 " <error-message><value>err-msg-value</value></error-message>\n"
1579 " <error-app-tag value=\"err-app-tag-value\"/>\n"
1580 " <description><text>&quot;pattern-desc&quot;</text></description>\n"
1581 " <reference><text>pattern-ref</text></reference>\n"
1582 EXT_SUBELEM
1583 "</pattern>"
1584 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001585 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001586 assert_true(type.flags & LYS_SET_PATTERN);
Radek Iša56ca9e42020-09-08 18:42:00 +02001587 CHECK_LYSP_RESTR(type.patterns, "\x015super_pattern", "\"pattern-desc\"",
1588 "err-app-tag-value", "err-msg-value", 1, "pattern-ref");
Radek Krejci39b7fc22021-02-26 23:29:18 +01001589 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(type.patterns->exts[0]), LY_STMT_PATTERN);
Radek Iša56ca9e42020-09-08 18:42:00 +02001590 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák8e7bda82019-07-16 17:57:50 +02001591 memset(&type, 0, sizeof(type));
1592
1593 /* min subelems */
1594 data = ELEMENT_WRAPPER_START "<pattern value=\"pattern\"> </pattern>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001595 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1596 CHECK_LYSP_RESTR(type.patterns, "\x006pattern", NULL, NULL, NULL, 0, NULL);
1597 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák8e7bda82019-07-16 17:57:50 +02001598 memset(&type, 0, sizeof(type));
David Sedlák8e7bda82019-07-16 17:57:50 +02001599}
1600
1601static void
1602test_value_position_elem(void **state)
1603{
David Sedlák8e7bda82019-07-16 17:57:50 +02001604 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001605 struct lysp_type_enum en = {0};
David Sedlák8e7bda82019-07-16 17:57:50 +02001606
1607 /* valid values */
David Sedlák8e7bda82019-07-16 17:57:50 +02001608 data = ELEMENT_WRAPPER_START "<value value=\"-55\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001609 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_SUCCESS);
1610 CHECK_LYSP_TYPE_ENUM(&(en), NULL, 0, LYS_SET_VALUE, 0, NULL, NULL, -55);
David Sedlák8e7bda82019-07-16 17:57:50 +02001611 memset(&en, 0, sizeof(en));
1612
1613 data = ELEMENT_WRAPPER_START "<value value=\"0\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001614 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_SUCCESS);
1615 CHECK_LYSP_TYPE_ENUM(&(en), NULL, 0, LYS_SET_VALUE, 0, NULL, NULL, 0);
David Sedlák8e7bda82019-07-16 17:57:50 +02001616 memset(&en, 0, sizeof(en));
1617
1618 data = ELEMENT_WRAPPER_START "<value value=\"-0\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001619 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_SUCCESS);
1620 CHECK_LYSP_TYPE_ENUM(&(en), NULL, 0, LYS_SET_VALUE, 0, NULL, NULL, 0);
David Sedlák8e7bda82019-07-16 17:57:50 +02001621 memset(&en, 0, sizeof(en));
1622
1623 /* valid positions */
David Sedlák8e7bda82019-07-16 17:57:50 +02001624 data = ELEMENT_WRAPPER_START "<position value=\"0\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001625 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_SUCCESS);
1626 CHECK_LYSP_TYPE_ENUM(&(en), NULL, 0, LYS_SET_VALUE, 0, NULL, NULL, 0);
David Sedlák8e7bda82019-07-16 17:57:50 +02001627 memset(&en, 0, sizeof(en));
1628
1629 /* invalid values */
1630 data = ELEMENT_WRAPPER_START "<value value=\"99999999999999999999999\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001631 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1632 CHECK_LOG_CTX("Invalid value \"99999999999999999999999\" of \"value\" attribute in \"value\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001633
1634 data = ELEMENT_WRAPPER_START "<value value=\"1k\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001635 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1636 CHECK_LOG_CTX("Invalid value \"1k\" of \"value\" attribute in \"value\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001637
David Sedlák69f01612019-07-17 11:41:08 +02001638 data = ELEMENT_WRAPPER_START "<value value=\"\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001639 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1640 CHECK_LOG_CTX("Invalid value \"\" of \"value\" attribute in \"value\" element.", "Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001641
David Sedlák8e7bda82019-07-16 17:57:50 +02001642 /*invalid positions */
1643 data = ELEMENT_WRAPPER_START "<position value=\"-5\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001644 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1645 CHECK_LOG_CTX("Invalid value \"-5\" of \"value\" attribute in \"position\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001646
1647 data = ELEMENT_WRAPPER_START "<position value=\"-0\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001648 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1649 CHECK_LOG_CTX("Invalid value \"-0\" of \"value\" attribute in \"position\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001650
1651 data = ELEMENT_WRAPPER_START "<position value=\"99999999999999999999\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001652 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1653 CHECK_LOG_CTX("Invalid value \"99999999999999999999\" of \"value\" attribute in \"position\" element.", "Line number 1.");
David Sedlák8e7bda82019-07-16 17:57:50 +02001654
David Sedlák69f01612019-07-17 11:41:08 +02001655 data = ELEMENT_WRAPPER_START "<position value=\"\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001656 assert_int_equal(test_element_helper(state, data, &en, NULL, NULL), LY_EVALID);
1657 CHECK_LOG_CTX("Invalid value \"\" of \"value\" attribute in \"position\" element.", "Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001658}
1659
1660static void
1661test_prefix_elem(void **state)
1662{
David Sedlák69f01612019-07-17 11:41:08 +02001663 const char *data;
1664 const char *value = NULL;
1665
1666 data = ELEMENT_WRAPPER_START "<prefix value=\"pref\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001667 assert_int_equal(test_element_helper(state, data, &value, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001668 assert_string_equal(value, "pref");
Michal Vaskoe180ed02021-02-05 16:31:20 +01001669 lydict_remove(UTEST_LYCTX, value);
David Sedlák69f01612019-07-17 11:41:08 +02001670}
1671
1672static void
1673test_range_elem(void **state)
1674{
David Sedlák69f01612019-07-17 11:41:08 +02001675 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001676 struct lysp_type type = {0};
David Sedlák69f01612019-07-17 11:41:08 +02001677
1678 /* max subelems */
1679 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001680 "<range value=\"range-str\">\n"
1681 " <error-message><value>err-msg</value></error-message>\n"
1682 " <error-app-tag value=\"err-app-tag\" />\n"
1683 " <description><text>desc</text></description>\n"
1684 " <reference><text>ref</text></reference>\n"
1685 EXT_SUBELEM
1686 "</range>"
1687 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001688 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1689 CHECK_LYSP_RESTR(type.range, "range-str", "desc",
1690 "err-app-tag", "err-msg", 1, "ref");
David Sedlákc3da3ef2019-07-19 12:56:08 +02001691 assert_true(type.flags & LYS_SET_RANGE);
Radek Krejci39b7fc22021-02-26 23:29:18 +01001692 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(type.range->exts[0]), LY_STMT_RANGE);
Radek Iša56ca9e42020-09-08 18:42:00 +02001693 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001694 memset(&type, 0, sizeof(type));
1695
1696 /* min subelems */
1697 data = ELEMENT_WRAPPER_START "<range value=\"range-str\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001698 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1699 CHECK_LYSP_RESTR(type.range, "range-str", NULL,
1700 NULL, NULL, 0, NULL);
1701 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001702 memset(&type, 0, sizeof(type));
David Sedlák69f01612019-07-17 11:41:08 +02001703}
1704
1705static void
1706test_reqinstance_elem(void **state)
1707{
David Sedlák69f01612019-07-17 11:41:08 +02001708 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001709 struct lysp_type type = {0};
David Sedlák69f01612019-07-17 11:41:08 +02001710
David Sedlákd1144562019-08-06 12:36:14 +02001711 data = ELEMENT_WRAPPER_START "<require-instance value=\"true\">" EXT_SUBELEM "</require-instance>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001712 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001713 assert_int_equal(type.require_instance, 1);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001714 assert_true(type.flags & LYS_SET_REQINST);
Radek Krejci5984d222021-02-26 23:01:45 +01001715 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(type.exts[0]), LY_STMT_REQUIRE_INSTANCE);
Radek Iša56ca9e42020-09-08 18:42:00 +02001716 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák69f01612019-07-17 11:41:08 +02001717 memset(&type, 0, sizeof(type));
1718
1719 data = ELEMENT_WRAPPER_START "<require-instance value=\"false\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001720 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001721 assert_int_equal(type.require_instance, 0);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001722 assert_true(type.flags & LYS_SET_REQINST);
David Sedlák69f01612019-07-17 11:41:08 +02001723 memset(&type, 0, sizeof(type));
1724
1725 data = ELEMENT_WRAPPER_START "<require-instance value=\"invalid\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001726 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_EVALID);
David Sedlák69f01612019-07-17 11:41:08 +02001727 memset(&type, 0, sizeof(type));
Radek Iša56ca9e42020-09-08 18:42:00 +02001728 CHECK_LOG_CTX("Invalid value \"invalid\" of \"value\" attribute in \"require-instance\" element. "
1729 "Valid values are \"true\" and \"false\".", "Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001730}
1731
1732static void
1733test_revision_date_elem(void **state)
1734{
David Sedlák69f01612019-07-17 11:41:08 +02001735 const char *data;
1736 char rev[LY_REV_SIZE];
1737
1738 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-01-01\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001739 assert_int_equal(test_element_helper(state, data, rev, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001740 assert_string_equal(rev, "2000-01-01");
1741
1742 data = ELEMENT_WRAPPER_START "<revision-date date=\"2000-50-05\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001743 assert_int_equal(test_element_helper(state, data, rev, NULL, NULL), LY_EVALID);
1744 CHECK_LOG_CTX("Invalid value \"2000-50-05\" of \"revision-date\".", "Line number 1.");
David Sedlák69f01612019-07-17 11:41:08 +02001745}
1746
1747static void
1748test_unique_elem(void **state)
1749{
David Sedlák69f01612019-07-17 11:41:08 +02001750 const char *data;
1751 const char **values = NULL;
1752
1753 data = ELEMENT_WRAPPER_START "<unique tag=\"tag\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001754 assert_int_equal(test_element_helper(state, data, &values, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001755 assert_string_equal(*values, "tag");
Michal Vaskoe180ed02021-02-05 16:31:20 +01001756 lydict_remove(UTEST_LYCTX, *values);
David Sedlák69f01612019-07-17 11:41:08 +02001757 LY_ARRAY_FREE(values);
David Sedlákd1144562019-08-06 12:36:14 +02001758 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001759}
1760
1761static void
1762test_units_elem(void **state)
1763{
David Sedlák69f01612019-07-17 11:41:08 +02001764 const char *data;
1765 const char *values = NULL;
1766
1767 data = ELEMENT_WRAPPER_START "<units name=\"name\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001768 assert_int_equal(test_element_helper(state, data, &values, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001769 assert_string_equal(values, "name");
Michal Vaskoe180ed02021-02-05 16:31:20 +01001770 lydict_remove(UTEST_LYCTX, values);
David Sedlákd1144562019-08-06 12:36:14 +02001771 values = NULL;
David Sedlák69f01612019-07-17 11:41:08 +02001772}
1773
1774static void
David Sedlák69f01612019-07-17 11:41:08 +02001775test_yin_text_value_elem(void **state)
1776{
David Sedlák69f01612019-07-17 11:41:08 +02001777 const char *data;
1778 const char *val;
1779
1780 data = ELEMENT_WRAPPER_START "<text>text</text>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001781 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001782 assert_string_equal(val, "text");
Michal Vaskoe180ed02021-02-05 16:31:20 +01001783 lydict_remove(UTEST_LYCTX, val);
David Sedlák69f01612019-07-17 11:41:08 +02001784
1785 data = "<error-message xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <value>text</value> </error-message>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001786 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001787 assert_string_equal(val, "text");
Michal Vaskoe180ed02021-02-05 16:31:20 +01001788 lydict_remove(UTEST_LYCTX, val);
David Sedlák69f01612019-07-17 11:41:08 +02001789
1790 data = ELEMENT_WRAPPER_START "<text></text>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001791 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák69f01612019-07-17 11:41:08 +02001792 assert_string_equal("", val);
Michal Vaskoe180ed02021-02-05 16:31:20 +01001793 lydict_remove(UTEST_LYCTX, val);
David Sedlák8e7bda82019-07-16 17:57:50 +02001794}
David Sedlák32488102019-07-15 17:44:10 +02001795
David Sedlák374d2b32019-07-17 15:06:55 +02001796static void
1797test_type_elem(void **state)
1798{
David Sedlák374d2b32019-07-17 15:06:55 +02001799 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001800 struct lysp_type type = {0};
David Sedlák374d2b32019-07-17 15:06:55 +02001801
1802 /* max subelems */
1803 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001804 "<type name=\"type-name\">\n"
1805 " <base name=\"base-name\"/>\n"
1806 " <bit name=\"bit\"/>\n"
1807 " <enum name=\"enum\"/>\n"
1808 " <fraction-digits value=\"2\"/>\n"
1809 " <length value=\"length\"/>\n"
1810 " <path value=\"/path\"/>\n"
1811 " <pattern value=\"pattern\"/>\n"
1812 " <range value=\"range\" />\n"
1813 " <require-instance value=\"true\"/>\n"
1814 " <type name=\"sub-type-name\"/>\n"
1815 EXT_SUBELEM
1816 "</type>"
1817 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001818 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
David Sedlák374d2b32019-07-17 15:06:55 +02001819 assert_string_equal(type.name, "type-name");
1820 assert_string_equal(*type.bases, "base-name");
1821 assert_string_equal(type.bits->name, "bit");
1822 assert_string_equal(type.enums->name, "enum");
1823 assert_int_equal(type.fraction_digits, 2);
Radek Iša56ca9e42020-09-08 18:42:00 +02001824 CHECK_LYSP_RESTR(type.length, "length", NULL,
1825 NULL, NULL, 0, NULL);
Michal Vaskocb8c6d42020-10-16 11:58:30 +02001826 assert_string_equal(type.path->expr, "/path");
Radek Iša56ca9e42020-09-08 18:42:00 +02001827 CHECK_LYSP_RESTR(type.patterns, "\006pattern", NULL,
1828 NULL, NULL, 0, NULL);
1829 CHECK_LYSP_RESTR(type.range, "range", NULL,
1830 NULL, NULL, 0, NULL);
David Sedlák374d2b32019-07-17 15:06:55 +02001831 assert_int_equal(type.require_instance, 1);
1832 assert_string_equal(type.types->name, "sub-type-name");
Radek Krejci39b7fc22021-02-26 23:29:18 +01001833 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(type.exts[0]), LY_STMT_TYPE);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001834 assert_true(type.flags & LYS_SET_BASE);
1835 assert_true(type.flags & LYS_SET_BIT);
1836 assert_true(type.flags & LYS_SET_ENUM);
1837 assert_true(type.flags & LYS_SET_FRDIGITS);
1838 assert_true(type.flags & LYS_SET_LENGTH);
1839 assert_true(type.flags & LYS_SET_PATH);
1840 assert_true(type.flags & LYS_SET_PATTERN);
1841 assert_true(type.flags & LYS_SET_RANGE);
1842 assert_true(type.flags & LYS_SET_REQINST);
1843 assert_true(type.flags & LYS_SET_TYPE);
Radek Iša56ca9e42020-09-08 18:42:00 +02001844 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák374d2b32019-07-17 15:06:55 +02001845 memset(&type, 0, sizeof(type));
1846
1847 /* min subelems */
1848 data = ELEMENT_WRAPPER_START "<type name=\"type-name\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001849 assert_int_equal(test_element_helper(state, data, &type, NULL, NULL), LY_SUCCESS);
1850 lysp_type_free(UTEST_LYCTX, &type);
David Sedlák374d2b32019-07-17 15:06:55 +02001851 memset(&type, 0, sizeof(type));
David Sedlák374d2b32019-07-17 15:06:55 +02001852}
1853
David Sedlák1af868e2019-07-17 17:03:14 +02001854static void
1855test_max_elems_elem(void **state)
1856{
David Sedlák1af868e2019-07-17 17:03:14 +02001857 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001858 struct lysp_node_list list = {0};
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001859 struct lysp_refine refine = {0};
David Sedlák1af868e2019-07-17 17:03:14 +02001860
David Sedlák1af868e2019-07-17 17:03:14 +02001861 data = "<refine xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"10\"/> </refine>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001862 assert_int_equal(test_element_helper(state, data, &refine, NULL, NULL), LY_SUCCESS);
David Sedlák1af868e2019-07-17 17:03:14 +02001863 assert_int_equal(refine.max, 10);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001864 assert_true(refine.flags & LYS_SET_MAX);
David Sedlák1af868e2019-07-17 17:03:14 +02001865
1866 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"0\"/> </list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001867 assert_int_equal(test_element_helper(state, data, &list, NULL, NULL), LY_EVALID);
1868 CHECK_LOG_CTX("Invalid value \"0\" of \"value\" attribute in \"max-elements\" element.", "Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02001869
1870 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"-10\"/> </list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001871 assert_int_equal(test_element_helper(state, data, &list, NULL, NULL), LY_EVALID);
1872 CHECK_LOG_CTX("Invalid value \"-10\" of \"value\" attribute in \"max-elements\" element.", "Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02001873
1874 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"k\"/> </list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001875 assert_int_equal(test_element_helper(state, data, &list, NULL, NULL), LY_EVALID);
1876 CHECK_LOG_CTX("Invalid value \"k\" of \"value\" attribute in \"max-elements\" element.", "Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02001877
1878 data = "<list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <max-elements value=\"u12\"/> </list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001879 assert_int_equal(test_element_helper(state, data, &list, NULL, NULL), LY_EVALID);
1880 CHECK_LOG_CTX("Invalid value \"u12\" of \"value\" attribute in \"max-elements\" element.", "Line number 1.");
David Sedlák1af868e2019-07-17 17:03:14 +02001881}
1882
David Sedlák09e18c92019-07-18 11:17:11 +02001883static void
1884test_min_elems_elem(void **state)
1885{
David Sedlák09e18c92019-07-18 11:17:11 +02001886 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02001887 struct lysp_node_leaflist llist = {0};
David Sedlák09e18c92019-07-18 11:17:11 +02001888
1889 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"-5\"/> </leaf-list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001890 assert_int_equal(test_element_helper(state, data, &llist, NULL, NULL), LY_EVALID);
1891 CHECK_LOG_CTX("Value \"-5\" of \"value\" attribute in \"min-elements\" element is out of bounds.", "Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02001892
1893 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"99999999999999999\"/> </leaf-list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001894 assert_int_equal(test_element_helper(state, data, &llist, NULL, NULL), LY_EVALID);
1895 CHECK_LOG_CTX("Value \"99999999999999999\" of \"value\" attribute in \"min-elements\" element is out of bounds.", "Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02001896
1897 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"5k\"/> </leaf-list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001898 assert_int_equal(test_element_helper(state, data, &llist, NULL, NULL), LY_EVALID);
1899 CHECK_LOG_CTX("Invalid value \"5k\" of \"value\" attribute in \"min-elements\" element.", "Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02001900
1901 data = "<leaf-list xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"> <min-elements value=\"05\"/> </leaf-list>";
Radek Iša56ca9e42020-09-08 18:42:00 +02001902 assert_int_equal(test_element_helper(state, data, &llist, NULL, NULL), LY_EVALID);
1903 CHECK_LOG_CTX("Invalid value \"05\" of \"value\" attribute in \"min-elements\" element.", "Line number 1.");
David Sedlák09e18c92019-07-18 11:17:11 +02001904}
1905
David Sedláka2dad212019-07-18 12:45:19 +02001906static void
1907test_ordby_elem(void **state)
1908{
David Sedláka2dad212019-07-18 12:45:19 +02001909 const char *data;
1910 uint16_t flags = 0;
David Sedláka2dad212019-07-18 12:45:19 +02001911
1912 data = ELEMENT_WRAPPER_START "<ordered-by value=\"user\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001913 assert_int_equal(test_element_helper(state, data, &flags, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02001914 assert_true(flags & LYS_ORDBY_USER);
David Sedláka2dad212019-07-18 12:45:19 +02001915
1916 data = ELEMENT_WRAPPER_START "<ordered-by value=\"inv\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001917 assert_int_equal(test_element_helper(state, data, &flags, NULL, NULL), LY_EVALID);
1918 CHECK_LOG_CTX("Invalid value \"inv\" of \"value\" attribute in \"ordered-by\" element. "
1919 "Valid values are \"system\" and \"user\".", "Line number 1.");
David Sedláka2dad212019-07-18 12:45:19 +02001920}
1921
David Sedlák8a83bbb2019-07-18 14:46:00 +02001922static void
1923test_any_elem(void **state)
1924{
David Sedlák8a83bbb2019-07-18 14:46:00 +02001925 const char *data;
1926 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02001927 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlák8a83bbb2019-07-18 14:46:00 +02001928 struct lysp_node_anydata *parsed = NULL;
Radek Iša56ca9e42020-09-08 18:42:00 +02001929 uint16_t flags;
David Sedlák8a83bbb2019-07-18 14:46:00 +02001930
1931 /* anyxml max subelems */
1932 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001933 "<anyxml name=\"any-name\">\n"
1934 " <config value=\"true\" />\n"
1935 " <description><text>desc</text></description>\n"
1936 " <if-feature name=\"feature\" />\n"
1937 " <mandatory value=\"true\" />\n"
1938 " <must condition=\"must-cond\" />\n"
1939 " <reference><text>ref</text></reference>\n"
1940 " <status value=\"deprecated\"/>\n"
1941 " <when condition=\"when-cond\"/>\n"
1942 EXT_SUBELEM
1943 "</anyxml>"
1944 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001945 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001946 parsed = (struct lysp_node_anydata *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02001947 flags = LYS_CONFIG_W | LYS_MAND_TRUE | LYS_STATUS_DEPRC;
1948 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
1949 "any-name", 0, LYS_ANYXML, 0, "ref", 1);
1950 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001951 assert_string_equal(parsed->iffeatures[0].str, "feature");
Radek Krejci39b7fc22021-02-26 23:29:18 +01001952 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_ANYXML);
Radek Iša56ca9e42020-09-08 18:42:00 +02001953 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001954 siblings = NULL;
1955
1956 /* anydata max subelems */
1957 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01001958 "<anydata name=\"any-name\">\n"
1959 " <config value=\"true\" />\n"
1960 " <description><text>desc</text></description>\n"
1961 " <if-feature name=\"feature\" />\n"
1962 " <mandatory value=\"true\" />\n"
1963 " <must condition=\"must-cond\" />\n"
1964 " <reference><text>ref</text></reference>\n"
1965 " <status value=\"deprecated\"/>\n"
1966 " <when condition=\"when-cond\"/>\n"
1967 EXT_SUBELEM
1968 "</anydata>"
1969 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001970 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001971 parsed = (struct lysp_node_anydata *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02001972 flags = LYS_CONFIG_W | LYS_MAND_TRUE | LYS_STATUS_DEPRC;
1973 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
1974 "any-name", 0, LYS_ANYDATA, 0, "ref", 1);
1975 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02001976 assert_string_equal(parsed->iffeatures[0].str, "feature");
Radek Krejci39b7fc22021-02-26 23:29:18 +01001977 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_ANYDATA);
Radek Iša56ca9e42020-09-08 18:42:00 +02001978 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001979 siblings = NULL;
1980
1981 /* min subelems */
1982 node_meta.parent = (void *)0x10;
1983 data = ELEMENT_WRAPPER_START "<anydata name=\"any-name\"> </anydata>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02001984 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001985 parsed = (struct lysp_node_anydata *)siblings;
1986 assert_ptr_equal(parsed->parent, node_meta.parent);
Radek Iša56ca9e42020-09-08 18:42:00 +02001987 CHECK_LYSP_NODE(parsed, NULL, 0, 0, 0,
1988 "any-name", 0, LYS_ANYDATA, 1, NULL, 0);
1989 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák8a83bbb2019-07-18 14:46:00 +02001990}
1991
David Sedlák203ca3a2019-07-18 15:26:25 +02001992static void
1993test_leaf_elem(void **state)
1994{
David Sedlák203ca3a2019-07-18 15:26:25 +02001995 const char *data;
1996 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02001997 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlák203ca3a2019-07-18 15:26:25 +02001998 struct lysp_node_leaf *parsed = NULL;
Radek Iša56ca9e42020-09-08 18:42:00 +02001999 uint16_t flags;
David Sedlák203ca3a2019-07-18 15:26:25 +02002000
2001 /* max elements */
2002 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002003 "<leaf name=\"leaf\">\n"
2004 " <config value=\"true\" />\n"
2005 " <default value=\"def-val\"/>\n"
2006 " <description><text>desc</text></description>\n"
2007 " <if-feature name=\"feature\" />\n"
2008 " <mandatory value=\"true\" />\n"
2009 " <must condition=\"must-cond\" />\n"
2010 " <reference><text>ref</text></reference>\n"
2011 " <status value=\"deprecated\"/>\n"
2012 " <type name=\"type\"/>\n"
2013 " <units name=\"uni\"/>\n"
2014 " <when condition=\"when-cond\"/>\n"
2015 EXT_SUBELEM
2016 "</leaf>"
David Sedlák203ca3a2019-07-18 15:26:25 +02002017 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002018 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák203ca3a2019-07-18 15:26:25 +02002019 parsed = (struct lysp_node_leaf *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002020 flags = LYS_CONFIG_W | LYS_MAND_TRUE | LYS_STATUS_DEPRC;
2021 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2022 "leaf", 0, LYS_LEAF, 0, "ref", 1);
2023 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002024 assert_string_equal(parsed->iffeatures[0].str, "feature");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002025 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_LEAF);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002026 assert_string_equal(parsed->musts->arg.str, "must-cond");
David Sedlák203ca3a2019-07-18 15:26:25 +02002027 assert_string_equal(parsed->type.name, "type");
2028 assert_string_equal(parsed->units, "uni");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002029 assert_string_equal(parsed->dflt.str, "def-val");
Radek Iša56ca9e42020-09-08 18:42:00 +02002030 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák203ca3a2019-07-18 15:26:25 +02002031 siblings = NULL;
2032
2033 /* min elements */
2034 data = ELEMENT_WRAPPER_START "<leaf name=\"leaf\"> <type name=\"type\"/> </leaf>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002035 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák203ca3a2019-07-18 15:26:25 +02002036 parsed = (struct lysp_node_leaf *)siblings;
2037 assert_string_equal(parsed->name, "leaf");
2038 assert_string_equal(parsed->type.name, "type");
Radek Iša56ca9e42020-09-08 18:42:00 +02002039 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák203ca3a2019-07-18 15:26:25 +02002040 siblings = NULL;
David Sedlák203ca3a2019-07-18 15:26:25 +02002041}
2042
David Sedlákc3da3ef2019-07-19 12:56:08 +02002043static void
2044test_leaf_list_elem(void **state)
2045{
David Sedlákc3da3ef2019-07-19 12:56:08 +02002046 const char *data;
2047 struct lysp_node *siblings = NULL;
David Sedlákbf8a2b72019-08-14 16:48:10 +02002048 struct tree_node_meta node_meta = {.parent = NULL, .nodes = &siblings};
David Sedlákc3da3ef2019-07-19 12:56:08 +02002049 struct lysp_node_leaflist *parsed = NULL;
Radek Iša56ca9e42020-09-08 18:42:00 +02002050 uint16_t flags;
David Sedlákc3da3ef2019-07-19 12:56:08 +02002051
2052 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002053 "<leaf-list name=\"llist\">\n"
2054 " <config value=\"true\" />\n"
2055 " <default value=\"def-val0\"/>\n"
2056 " <default value=\"def-val1\"/>\n"
2057 " <description><text>desc</text></description>\n"
2058 " <if-feature name=\"feature\"/>\n"
2059 " <max-elements value=\"5\"/>\n"
2060 " <must condition=\"must-cond\"/>\n"
2061 " <ordered-by value=\"user\" />\n"
2062 " <reference><text>ref</text></reference>\n"
2063 " <status value=\"current\"/>\n"
2064 " <type name=\"type\"/>\n"
2065 " <units name=\"uni\"/>\n"
2066 " <when condition=\"when-cond\"/>\n"
2067 EXT_SUBELEM
2068 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002069 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002070 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002071 parsed = (struct lysp_node_leaflist *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002072 flags = LYS_CONFIG_W | LYS_ORDBY_USER | LYS_STATUS_CURR | LYS_SET_MAX;
2073 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2074 "llist", 0, LYS_LEAFLIST, 0, "ref", 1);
2075 CHECK_LYSP_RESTR(parsed->musts, "must-cond", NULL, NULL, NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002076 assert_string_equal(parsed->dflts[0].str, "def-val0");
2077 assert_string_equal(parsed->dflts[1].str, "def-val1");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002078 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002079 assert_int_equal(parsed->max, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002080 assert_string_equal(parsed->type.name, "type");
2081 assert_string_equal(parsed->units, "uni");
Radek Iša56ca9e42020-09-08 18:42:00 +02002082 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Radek Krejci39b7fc22021-02-26 23:29:18 +01002083 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_LEAF_LIST);
Radek Iša56ca9e42020-09-08 18:42:00 +02002084 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002085 siblings = NULL;
2086
2087 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002088 "<leaf-list name=\"llist\">\n"
2089 " <config value=\"true\" />\n"
2090 " <description><text>desc</text></description>\n"
2091 " <if-feature name=\"feature\"/>\n"
2092 " <min-elements value=\"5\"/>\n"
2093 " <must condition=\"must-cond\"/>\n"
2094 " <ordered-by value=\"user\" />\n"
2095 " <reference><text>ref</text></reference>\n"
2096 " <status value=\"current\"/>\n"
2097 " <type name=\"type\"/>\n"
2098 " <units name=\"uni\"/>\n"
2099 " <when condition=\"when-cond\"/>\n"
2100 EXT_SUBELEM
2101 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002102 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002103 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002104 parsed = (struct lysp_node_leaflist *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002105 flags = LYS_CONFIG_W | LYS_ORDBY_USER | LYS_STATUS_CURR | LYS_SET_MIN;
2106 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2107 "llist", 0, LYS_LEAFLIST, 0, "ref", 1);
2108 CHECK_LYSP_RESTR(parsed->musts, "must-cond", NULL, NULL, NULL, 0, NULL);
2109 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002110 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002111 assert_int_equal(parsed->min, 5);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002112 assert_string_equal(parsed->type.name, "type");
2113 assert_string_equal(parsed->units, "uni");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002114 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_LEAF_LIST);
Radek Iša56ca9e42020-09-08 18:42:00 +02002115 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002116 siblings = NULL;
2117
2118 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002119 "<leaf-list name=\"llist\">\n"
2120 " <config value=\"true\" />\n"
2121 " <description><text>desc</text></description>\n"
2122 " <if-feature name=\"feature\"/>\n"
2123 " <max-elements value=\"15\"/>\n"
2124 " <min-elements value=\"5\"/>\n"
2125 " <must condition=\"must-cond\"/>\n"
2126 " <ordered-by value=\"user\" />\n"
2127 " <reference><text>ref</text></reference>\n"
2128 " <status value=\"current\"/>\n"
2129 " <type name=\"type\"/>\n"
2130 " <units name=\"uni\"/>\n"
2131 " <when condition=\"when-cond\"/>\n"
2132 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002133 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002134 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002135 parsed = (struct lysp_node_leaflist *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002136 flags = LYS_CONFIG_W | LYS_ORDBY_USER | LYS_STATUS_CURR | LYS_SET_MIN | LYS_SET_MAX;
2137 CHECK_LYSP_NODE(parsed, "desc", 0, flags, 1,
2138 "llist", 0, LYS_LEAFLIST, 0, "ref", 1);
2139 CHECK_LYSP_RESTR(parsed->musts, "must-cond", NULL, NULL, NULL, 0, NULL);
2140 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002141 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlákc3da3ef2019-07-19 12:56:08 +02002142 assert_int_equal(parsed->min, 5);
2143 assert_int_equal(parsed->max, 15);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002144 assert_string_equal(parsed->type.name, "type");
2145 assert_string_equal(parsed->units, "uni");
Radek Iša56ca9e42020-09-08 18:42:00 +02002146 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002147 siblings = NULL;
2148
2149 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002150 "<leaf-list name=\"llist\">\n"
2151 " <type name=\"type\"/>\n"
2152 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002153 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002154 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002155 parsed = (struct lysp_node_leaflist *)siblings;
2156 assert_string_equal(parsed->name, "llist");
2157 assert_string_equal(parsed->type.name, "type");
Radek Iša56ca9e42020-09-08 18:42:00 +02002158 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002159 siblings = NULL;
2160
2161 /* invalid combinations */
2162 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002163 "<leaf-list name=\"llist\">\n"
2164 " <max-elements value=\"5\"/>\n"
2165 " <min-elements value=\"15\"/>\n"
2166 " <type name=\"type\"/>"
2167 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002168 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002169 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_EVALID);
2170 CHECK_LOG_CTX("Invalid combination of min-elements and max-elements: min value 15 is bigger than the max value 5.", "Line number 4.");
2171 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002172 siblings = NULL;
2173
2174 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002175 "<leaf-list name=\"llist\">\n"
2176 " <default value=\"def-val1\"/>\n"
2177 " <min-elements value=\"15\"/>\n"
2178 " <type name=\"type\"/>\n"
2179 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002180 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002181 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_EVALID);
2182 CHECK_LOG_CTX("Invalid combination of sub-elemnts \"min-elements\" and \"default\" in \"leaf-list\" element.", "Line number 5.");
2183 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002184 siblings = NULL;
2185
2186 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002187 "<leaf-list name=\"llist\">"
2188 "</leaf-list>"
David Sedlákc3da3ef2019-07-19 12:56:08 +02002189 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002190 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_EVALID);
2191 CHECK_LOG_CTX("Missing mandatory sub-element \"type\" of \"leaf-list\" element.", "Line number 1.");
2192 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákc3da3ef2019-07-19 12:56:08 +02002193 siblings = NULL;
David Sedlákc3da3ef2019-07-19 12:56:08 +02002194}
2195
David Sedlákcb39f642019-07-19 13:19:55 +02002196static void
2197test_presence_elem(void **state)
2198{
David Sedlákcb39f642019-07-19 13:19:55 +02002199 const char *data;
2200 const char *val;
2201
2202 data = ELEMENT_WRAPPER_START "<presence value=\"presence-val\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002203 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlákcb39f642019-07-19 13:19:55 +02002204 assert_string_equal(val, "presence-val");
Michal Vaskoe180ed02021-02-05 16:31:20 +01002205 lydict_remove(UTEST_LYCTX, val);
David Sedlákcb39f642019-07-19 13:19:55 +02002206
2207 data = ELEMENT_WRAPPER_START "<presence/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002208 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_EVALID);
2209 CHECK_LOG_CTX("Missing mandatory attribute value of presence element.", "Line number 1.");
David Sedlákcb39f642019-07-19 13:19:55 +02002210}
2211
David Sedlák12470a82019-07-19 13:44:36 +02002212static void
2213test_key_elem(void **state)
2214{
David Sedlák12470a82019-07-19 13:44:36 +02002215 const char *data;
2216 const char *val;
2217
2218 data = ELEMENT_WRAPPER_START "<key value=\"key-value\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002219 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_SUCCESS);
David Sedlák12470a82019-07-19 13:44:36 +02002220 assert_string_equal(val, "key-value");
Michal Vaskoe180ed02021-02-05 16:31:20 +01002221 lydict_remove(UTEST_LYCTX, val);
David Sedlák12470a82019-07-19 13:44:36 +02002222
2223 data = ELEMENT_WRAPPER_START "<key/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002224 assert_int_equal(test_element_helper(state, data, &val, NULL, NULL), LY_EVALID);
2225 CHECK_LOG_CTX("Missing mandatory attribute value of key element.", "Line number 1.");
David Sedlák12470a82019-07-19 13:44:36 +02002226}
2227
David Sedlák04e17b22019-07-19 15:29:48 +02002228static void
David Sedlák0d6de5a2019-07-22 13:25:44 +02002229test_uses_elem(void **state)
2230{
David Sedlák0d6de5a2019-07-22 13:25:44 +02002231 const char *data;
2232 struct lysp_node *siblings = NULL;
2233 struct tree_node_meta node_meta = {NULL, &siblings};
2234 struct lysp_node_uses *parsed = NULL;
2235
2236 /* max subelems */
2237 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002238 "<uses name=\"uses-name\">\n"
2239 " <when condition=\"cond\" />\n"
2240 " <if-feature name=\"feature\" />\n"
2241 " <status value=\"obsolete\" />\n"
2242 " <description><text>desc</text></description>\n"
2243 " <reference><text>ref</text></reference>\n"
2244 " <refine target-node=\"target\"/>\n"
2245 " <augment target-node=\"target\" />\n"
2246 EXT_SUBELEM
2247 "</uses>"
2248 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002249 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002250 parsed = (struct lysp_node_uses *)&siblings[0];
Radek Iša56ca9e42020-09-08 18:42:00 +02002251 CHECK_LYSP_NODE(parsed, "desc", 1, LYS_STATUS_OBSLT, 1,
2252 "uses-name", 0, LYS_USES, 0, "ref", 1);
2253 CHECK_LYSP_WHEN(parsed->when, "cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002254 assert_string_equal(parsed->iffeatures[0].str, "feature");
David Sedlák0d6de5a2019-07-22 13:25:44 +02002255 assert_string_equal(parsed->refines->nodeid, "target");
David Sedlák992fb7c2019-07-24 16:51:01 +02002256 assert_string_equal(parsed->augments->nodeid, "target");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002257 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_USES);
Radek Iša56ca9e42020-09-08 18:42:00 +02002258 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002259 siblings = NULL;
2260
2261 /* min subelems */
2262 data = ELEMENT_WRAPPER_START "<uses name=\"uses-name\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002263 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002264 assert_string_equal(siblings[0].name, "uses-name");
Radek Iša56ca9e42020-09-08 18:42:00 +02002265 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák0d6de5a2019-07-22 13:25:44 +02002266 siblings = NULL;
David Sedlák0d6de5a2019-07-22 13:25:44 +02002267}
2268
David Sedlákaa854b02019-07-22 14:17:10 +02002269static void
David Sedlákaf536aa2019-07-23 13:42:23 +02002270test_list_elem(void **state)
2271{
David Sedlákaf536aa2019-07-23 13:42:23 +02002272 const char *data;
2273 struct lysp_node *siblings = NULL;
2274 struct tree_node_meta node_meta = {NULL, &siblings};
2275 struct lysp_node_list *parsed = NULL;
2276
2277 /* max subelems */
2278 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002279 "<list name=\"list-name\">\n"
2280 " <when condition=\"when\"/>\n"
2281 " <if-feature name=\"iff\"/>\n"
2282 " <must condition=\"must-cond\"/>\n"
2283 " <key value=\"key\"/>\n"
2284 " <unique tag=\"utag\"/>\n"
2285 " <config value=\"true\"/>\n"
2286 " <min-elements value=\"10\"/>\n"
2287 " <ordered-by value=\"user\"/>\n"
2288 " <status value=\"deprecated\"/>\n"
2289 " <description><text>desc</text></description>\n"
2290 " <reference><text>ref</text></reference>\n"
2291 " <anydata name=\"anyd\"/>\n"
2292 " <anyxml name=\"anyx\"/>\n"
2293 " <container name=\"cont\"/>\n"
2294 " <choice name=\"choice\"/>\n"
2295 " <action name=\"action\"/>\n"
2296 " <grouping name=\"grp\"/>\n"
2297 " <notification name=\"notf\"/>\n"
2298 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2299 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2300 " <list name=\"sub-list\"/>\n"
2301 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2302 " <uses name=\"uses-name\"/>\n"
2303 EXT_SUBELEM
2304 "</list>"
2305 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002306 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákaf536aa2019-07-23 13:42:23 +02002307 parsed = (struct lysp_node_list *)&siblings[0];
David Sedlákaf536aa2019-07-23 13:42:23 +02002308 assert_string_equal(parsed->child->name, "anyd");
2309 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2310 assert_string_equal(parsed->child->next->name, "anyx");
2311 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
David Sedlákf111bcb2019-07-23 17:15:51 +02002312 assert_string_equal(parsed->child->next->next->name, "cont");
2313 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002314 assert_string_equal(parsed->child->next->next->next->name, "choice");
2315 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
David Sedlák85d0eca2019-07-24 15:15:21 +02002316 assert_string_equal(parsed->child->next->next->next->next->name, "leaf");
2317 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAF);
2318 assert_string_equal(parsed->child->next->next->next->next->next->name, "llist");
2319 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2320 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "sub-list");
2321 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LIST);
2322 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "uses-name");
2323 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2324 assert_null(parsed->child->next->next->next->next->next->next->next->next);
Radek Iša56ca9e42020-09-08 18:42:00 +02002325 uint16_t flags = LYS_ORDBY_USER | LYS_STATUS_DEPRC | LYS_CONFIG_W | LYS_SET_MIN;
2326
2327 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2328 "list-name", 0, LYS_LIST, 0, "ref", 1);
2329 CHECK_LYSP_RESTR(parsed->musts, "must-cond", NULL, NULL, NULL, 0, NULL);
2330 CHECK_LYSP_WHEN(parsed->when, "when", NULL, 0, NULL);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002331 assert_string_equal(parsed->groupings->name, "grp");
David Sedlák85d0eca2019-07-24 15:15:21 +02002332 assert_string_equal(parsed->actions->name, "action");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002333 assert_int_equal(parsed->groupings->nodetype, LYS_GROUPING);
David Sedlák031b9e72019-07-23 15:19:37 +02002334 assert_string_equal(parsed->notifs->name, "notf");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002335 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedlákaf536aa2019-07-23 13:42:23 +02002336 assert_string_equal(parsed->key, "key");
2337 assert_int_equal(parsed->min, 10);
David Sedlákaf536aa2019-07-23 13:42:23 +02002338 assert_string_equal(parsed->typedefs->name, "tpdf");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002339 assert_string_equal(parsed->uniques->str, "utag");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002340 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_LIST);
Radek Iša56ca9e42020-09-08 18:42:00 +02002341 lysp_node_free(UTEST_LYCTX, siblings);
2342 ly_set_erase(&YCTX->tpdfs_nodes, NULL);
David Sedlákaf536aa2019-07-23 13:42:23 +02002343 siblings = NULL;
2344
2345 /* min subelems */
2346 data = ELEMENT_WRAPPER_START "<list name=\"list-name\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002347 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákaf536aa2019-07-23 13:42:23 +02002348 parsed = (struct lysp_node_list *)&siblings[0];
Radek Iša56ca9e42020-09-08 18:42:00 +02002349 CHECK_LYSP_NODE(parsed, NULL, 0, 0, 0,
2350 "list-name", 0, LYS_LIST, 0, NULL, 0);
2351 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákaf536aa2019-07-23 13:42:23 +02002352 siblings = NULL;
David Sedlákaf536aa2019-07-23 13:42:23 +02002353}
2354
David Sedlák031b9e72019-07-23 15:19:37 +02002355static void
2356test_notification_elem(void **state)
2357{
David Sedlák031b9e72019-07-23 15:19:37 +02002358 const char *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01002359 struct lysp_node_notif *notifs = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002360 struct tree_node_meta notif_meta = {NULL, (struct lysp_node **)&notifs};
David Sedlák031b9e72019-07-23 15:19:37 +02002361
2362 /* max subelems */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002363 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlák031b9e72019-07-23 15:19:37 +02002364 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002365 "<notification name=\"notif-name\">\n"
2366 " <anydata name=\"anyd\"/>\n"
2367 " <anyxml name=\"anyx\"/>\n"
2368 " <description><text>desc</text></description>\n"
2369 " <if-feature name=\"iff\"/>\n"
2370 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2371 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2372 " <list name=\"sub-list\"/>\n"
2373 " <must condition=\"cond\"/>\n"
2374 " <reference><text>ref</text></reference>\n"
2375 " <status value=\"deprecated\"/>\n"
2376 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2377 " <uses name=\"uses-name\"/>\n"
2378 " <container name=\"cont\"/>\n"
2379 " <choice name=\"choice\"/>\n"
2380 " <grouping name=\"grp\"/>\n"
2381 EXT_SUBELEM
2382 "</notification>"
2383 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002384 assert_int_equal(test_element_helper(state, data, &notif_meta, NULL, NULL), LY_SUCCESS);
David Sedlák031b9e72019-07-23 15:19:37 +02002385 assert_string_equal(notifs->name, "notif-name");
Radek Krejci01180ac2021-01-27 08:48:22 +01002386 assert_string_equal(notifs->child->name, "anyd");
2387 assert_int_equal(notifs->child->nodetype, LYS_ANYDATA);
2388 assert_string_equal(notifs->child->next->name, "anyx");
2389 assert_int_equal(notifs->child->next->nodetype, LYS_ANYXML);
2390 assert_string_equal(notifs->child->next->next->name, "leaf");
2391 assert_int_equal(notifs->child->next->next->nodetype, LYS_LEAF);
2392 assert_string_equal(notifs->child->next->next->next->name, "llist");
2393 assert_int_equal(notifs->child->next->next->next->nodetype, LYS_LEAFLIST);
2394 assert_string_equal(notifs->child->next->next->next->next->name, "sub-list");
2395 assert_int_equal(notifs->child->next->next->next->next->nodetype, LYS_LIST);
David Sedlák031b9e72019-07-23 15:19:37 +02002396 assert_true(notifs->flags & LYS_STATUS_DEPRC);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002397 assert_string_equal(notifs->groupings->name, "grp");
2398 assert_int_equal(notifs->groupings->nodetype, LYS_GROUPING);
Radek Krejci01180ac2021-01-27 08:48:22 +01002399 assert_string_equal(notifs->child->next->next->next->next->next->name, "uses-name");
2400 assert_int_equal(notifs->child->next->next->next->next->next->nodetype, LYS_USES);
2401 assert_string_equal(notifs->child->next->next->next->next->next->next->name, "cont");
2402 assert_int_equal(notifs->child->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
2403 assert_int_equal(notifs->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
2404 assert_string_equal(notifs->child->next->next->next->next->next->next->next->name, "choice");
2405 assert_null(notifs->child->next->next->next->next->next->next->next->next);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002406 assert_string_equal(notifs->iffeatures[0].str, "iff");
2407 assert_string_equal(notifs->musts->arg.str, "cond");
David Sedlák031b9e72019-07-23 15:19:37 +02002408 assert_int_equal(notifs->nodetype, LYS_NOTIF);
2409 assert_null(notifs->parent);
2410 assert_string_equal(notifs->ref, "ref");
2411 assert_string_equal(notifs->typedefs->name, "tpdf");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002412 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(notifs->exts[0]), LY_STMT_NOTIFICATION);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002413 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)notifs);
David Sedlák031b9e72019-07-23 15:19:37 +02002414 notifs = NULL;
2415
2416 /* min subelems */
2417 data = ELEMENT_WRAPPER_START "<notification name=\"notif-name\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002418 assert_int_equal(test_element_helper(state, data, &notif_meta, NULL, NULL), LY_SUCCESS);
David Sedlák031b9e72019-07-23 15:19:37 +02002419 assert_string_equal(notifs->name, "notif-name");
Radek Krejci2a9fc652021-01-22 17:44:34 +01002420 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)notifs);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002421 notifs = NULL;
David Sedláke3ce9ef2019-07-23 16:34:30 +02002422}
2423
2424static void
2425test_grouping_elem(void **state)
2426{
David Sedláke3ce9ef2019-07-23 16:34:30 +02002427 const char *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01002428 struct lysp_node_grp *grps = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002429 struct tree_node_meta grp_meta = {NULL, (struct lysp_node **)&grps};
David Sedláke3ce9ef2019-07-23 16:34:30 +02002430
2431 /* max subelems */
2432 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002433 "<grouping name=\"grp-name\">\n"
2434 " <anydata name=\"anyd\"/>\n"
2435 " <anyxml name=\"anyx\"/>\n"
2436 " <description><text>desc</text></description>\n"
2437 " <grouping name=\"sub-grp\"/>\n"
2438 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2439 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2440 " <list name=\"list\"/>\n"
2441 " <notification name=\"notf\"/>\n"
2442 " <reference><text>ref</text></reference>\n"
2443 " <status value=\"current\"/>\n"
2444 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2445 " <uses name=\"uses-name\"/>\n"
2446 " <action name=\"act\"/>\n"
2447 " <container name=\"cont\"/>\n"
2448 " <choice name=\"choice\"/>\n"
2449 EXT_SUBELEM
2450 "</grouping>"
2451 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002452 assert_int_equal(test_element_helper(state, data, &grp_meta, NULL, NULL), LY_SUCCESS);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002453 assert_string_equal(grps->name, "grp-name");
Radek Krejci01180ac2021-01-27 08:48:22 +01002454 assert_string_equal(grps->child->name, "anyd");
2455 assert_string_equal(grps->child->next->name, "anyx");
2456 assert_string_equal(grps->child->next->next->name, "leaf");
2457 assert_string_equal(grps->child->next->next->next->name, "llist");
2458 assert_string_equal(grps->child->next->next->next->next->name, "list");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002459 assert_string_equal(grps->dsc, "desc");
David Sedláke3ce9ef2019-07-23 16:34:30 +02002460 assert_true(grps->flags & LYS_STATUS_CURR);
2461 assert_string_equal(grps->groupings->name, "sub-grp");
2462 assert_int_equal(grps->nodetype, LYS_GROUPING);
2463 assert_string_equal(grps->notifs->name, "notf");
2464 assert_null(grps->parent);
2465 assert_string_equal(grps->ref, "ref");
2466 assert_string_equal(grps->typedefs->name, "tpdf");
David Sedlák85d0eca2019-07-24 15:15:21 +02002467 assert_string_equal(grps->actions->name, "act");
Radek Krejci01180ac2021-01-27 08:48:22 +01002468 assert_string_equal(grps->child->next->next->next->next->next->name, "uses-name");
2469 assert_int_equal(grps->child->next->next->next->next->next->nodetype, LYS_USES);
2470 assert_string_equal(grps->child->next->next->next->next->next->next->name, "cont");
2471 assert_int_equal(grps->child->next->next->next->next->next->next->nodetype, LYS_CONTAINER);
2472 assert_string_equal(grps->child->next->next->next->next->next->next->next->name, "choice");
2473 assert_int_equal(grps->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
Radek Krejci39b7fc22021-02-26 23:29:18 +01002474 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(grps->exts[0]), LY_STMT_GROUPING);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002475 lysp_node_free(UTEST_LYCTX, &grps->node);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002476 grps = NULL;
2477
2478 /* min subelems */
2479 data = ELEMENT_WRAPPER_START "<grouping name=\"grp-name\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002480 assert_int_equal(test_element_helper(state, data, &grp_meta, NULL, NULL), LY_SUCCESS);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002481 assert_string_equal(grps->name, "grp-name");
Radek Krejci2a9fc652021-01-22 17:44:34 +01002482 lysp_node_free(UTEST_LYCTX, &grps->node);
David Sedláke3ce9ef2019-07-23 16:34:30 +02002483 grps = NULL;
David Sedlák031b9e72019-07-23 15:19:37 +02002484}
2485
David Sedlákf111bcb2019-07-23 17:15:51 +02002486static void
2487test_container_elem(void **state)
2488{
David Sedlákf111bcb2019-07-23 17:15:51 +02002489 const char *data;
2490 struct lysp_node *siblings = NULL;
2491 struct tree_node_meta node_meta = {NULL, &siblings};
2492 struct lysp_node_container *parsed = NULL;
2493
2494 /* max subelems */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002495 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedláke2dc9e92019-07-24 09:59:21 +02002496 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002497 "<container name=\"cont-name\">\n"
2498 " <anydata name=\"anyd\"/>\n"
2499 " <anyxml name=\"anyx\"/>\n"
2500 " <config value=\"true\"/>\n"
2501 " <container name=\"subcont\"/>\n"
2502 " <description><text>desc</text></description>\n"
2503 " <grouping name=\"sub-grp\"/>\n"
2504 " <if-feature name=\"iff\"/>\n"
2505 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2506 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2507 " <list name=\"list\"/>\n"
2508 " <must condition=\"cond\"/>\n"
2509 " <notification name=\"notf\"/>\n"
2510 " <presence value=\"presence\"/>\n"
2511 " <reference><text>ref</text></reference>\n"
2512 " <status value=\"current\"/>\n"
2513 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2514 " <uses name=\"uses-name\"/>\n"
2515 " <when condition=\"when-cond\"/>\n"
2516 " <action name=\"act\"/>\n"
2517 " <choice name=\"choice\"/>\n"
2518 EXT_SUBELEM
2519 "</container>"
2520 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002521 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedláke2dc9e92019-07-24 09:59:21 +02002522 parsed = (struct lysp_node_container *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002523 uint16_t flags = LYS_CONFIG_W | LYS_STATUS_CURR;
2524
2525 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2526 "cont-name", 0, LYS_CONTAINER, 0, "ref", 1);
2527 CHECK_LYSP_RESTR(parsed->musts, "cond", NULL, NULL, NULL, 0, NULL);
2528 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
2529
Michal Vasko7f45cf22020-10-01 12:49:44 +02002530 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedláke2dc9e92019-07-24 09:59:21 +02002531 assert_string_equal(parsed->presence, "presence");
2532 assert_string_equal(parsed->typedefs->name, "tpdf");
2533 assert_string_equal(parsed->groupings->name, "sub-grp");
2534 assert_string_equal(parsed->child->name, "anyd");
2535 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2536 assert_string_equal(parsed->child->next->name, "anyx");
2537 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
2538 assert_string_equal(parsed->child->next->next->name, "subcont");
2539 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
2540 assert_string_equal(parsed->child->next->next->next->name, "leaf");
2541 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
2542 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
2543 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
2544 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
2545 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
2546 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
2547 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002548 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
2549 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
2550 assert_null(parsed->child->next->next->next->next->next->next->next->next);
David Sedláke2dc9e92019-07-24 09:59:21 +02002551 assert_string_equal(parsed->notifs->name, "notf");
David Sedlák85d0eca2019-07-24 15:15:21 +02002552 assert_string_equal(parsed->actions->name, "act");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002553 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_CONTAINER);
Radek Iša56ca9e42020-09-08 18:42:00 +02002554 lysp_node_free(UTEST_LYCTX, siblings);
2555 ly_set_erase(&YCTX->tpdfs_nodes, NULL);
David Sedláke2dc9e92019-07-24 09:59:21 +02002556 siblings = NULL;
David Sedlákf111bcb2019-07-23 17:15:51 +02002557
2558 /* min subelems */
2559 data = ELEMENT_WRAPPER_START "<container name=\"cont-name\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002560 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákf111bcb2019-07-23 17:15:51 +02002561 parsed = (struct lysp_node_container *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002562 CHECK_LYSP_NODE(parsed, NULL, 0, 0, 0,
2563 "cont-name", 0, LYS_CONTAINER, 0, NULL, 0);
2564 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákf111bcb2019-07-23 17:15:51 +02002565 siblings = NULL;
David Sedlákf111bcb2019-07-23 17:15:51 +02002566}
2567
David Sedlák5379d392019-07-24 10:42:03 +02002568static void
2569test_case_elem(void **state)
2570{
David Sedlák5379d392019-07-24 10:42:03 +02002571 const char *data;
2572 struct lysp_node *siblings = NULL;
2573 struct tree_node_meta node_meta = {NULL, &siblings};
2574 struct lysp_node_case *parsed = NULL;
2575
2576 /* max subelems */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002577 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlák5379d392019-07-24 10:42:03 +02002578 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002579 "<case name=\"case-name\">\n"
2580 " <anydata name=\"anyd\"/>\n"
2581 " <anyxml name=\"anyx\"/>\n"
2582 " <container name=\"subcont\"/>\n"
2583 " <description><text>desc</text></description>\n"
2584 " <if-feature name=\"iff\"/>\n"
2585 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2586 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2587 " <list name=\"list\"/>\n"
2588 " <reference><text>ref</text></reference>\n"
2589 " <status value=\"current\"/>\n"
2590 " <uses name=\"uses-name\"/>\n"
2591 " <when condition=\"when-cond\"/>\n"
2592 " <choice name=\"choice\"/>\n"
2593 EXT_SUBELEM
2594 "</case>"
2595 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002596 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák5379d392019-07-24 10:42:03 +02002597 parsed = (struct lysp_node_case *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002598 uint16_t flags = LYS_STATUS_CURR;
2599
2600 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2601 "case-name", 0, LYS_CASE, 0, "ref", 1);
2602 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002603 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedlák5379d392019-07-24 10:42:03 +02002604 assert_string_equal(parsed->child->name, "anyd");
2605 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2606 assert_string_equal(parsed->child->next->name, "anyx");
2607 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
2608 assert_string_equal(parsed->child->next->next->name, "subcont");
2609 assert_int_equal(parsed->child->next->next->nodetype, LYS_CONTAINER);
2610 assert_string_equal(parsed->child->next->next->next->name, "leaf");
2611 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_LEAF);
2612 assert_string_equal(parsed->child->next->next->next->next->name, "llist");
2613 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_LEAFLIST);
2614 assert_string_equal(parsed->child->next->next->next->next->next->name, "list");
2615 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LIST);
2616 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "uses-name");
2617 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_USES);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002618 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "choice");
2619 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_CHOICE);
2620 assert_null(parsed->child->next->next->next->next->next->next->next->next);
Radek Krejci39b7fc22021-02-26 23:29:18 +01002621 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_CASE);
Radek Iša56ca9e42020-09-08 18:42:00 +02002622 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák5379d392019-07-24 10:42:03 +02002623 siblings = NULL;
2624
2625 /* min subelems */
2626 data = ELEMENT_WRAPPER_START "<case name=\"case-name\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002627 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlák5379d392019-07-24 10:42:03 +02002628 parsed = (struct lysp_node_case *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002629 CHECK_LYSP_NODE(parsed, NULL, 0, 0, 0,
2630 "case-name", 0, LYS_CASE, 0, NULL, 0);
2631 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlák5379d392019-07-24 10:42:03 +02002632 siblings = NULL;
David Sedlák5379d392019-07-24 10:42:03 +02002633}
2634
David Sedlákb7abcfa2019-07-24 12:33:35 +02002635static void
2636test_choice_elem(void **state)
2637{
David Sedlákb7abcfa2019-07-24 12:33:35 +02002638 const char *data;
2639 struct lysp_node *siblings = NULL;
2640 struct tree_node_meta node_meta = {NULL, &siblings};
2641 struct lysp_node_choice *parsed = NULL;
2642
2643 /* max subelems */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002644 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlákb7abcfa2019-07-24 12:33:35 +02002645 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002646 "<choice name=\"choice-name\">\n"
2647 " <anydata name=\"anyd\"/>\n"
2648 " <anyxml name=\"anyx\"/>\n"
2649 " <case name=\"sub-case\"/>\n"
2650 " <choice name=\"choice\"/>\n"
2651 " <config value=\"true\"/>\n"
2652 " <container name=\"subcont\"/>\n"
2653 " <default value=\"def\"/>\n"
2654 " <description><text>desc</text></description>\n"
2655 " <if-feature name=\"iff\"/>\n"
2656 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2657 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2658 " <list name=\"list\"/>\n"
2659 " <mandatory value=\"true\" />\n"
2660 " <reference><text>ref</text></reference>\n"
2661 " <status value=\"current\"/>\n"
2662 " <when condition=\"when-cond\"/>\n"
2663 EXT_SUBELEM
2664 "</choice>"
2665 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002666 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002667 parsed = (struct lysp_node_choice *)siblings;
Radek Iša56ca9e42020-09-08 18:42:00 +02002668 uint16_t flags = LYS_CONFIG_W | LYS_MAND_TRUE | LYS_STATUS_CURR;
2669
2670 CHECK_LYSP_NODE(parsed, "desc", 1, flags, 1,
2671 "choice-name", 0, LYS_CHOICE, 0, "ref", 1);
2672 CHECK_LYSP_WHEN(parsed->when, "when-cond", NULL, 0, NULL);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002673 assert_string_equal(parsed->iffeatures[0].str, "iff");
David Sedlákb7abcfa2019-07-24 12:33:35 +02002674 assert_string_equal(parsed->child->name, "anyd");
2675 assert_int_equal(parsed->child->nodetype, LYS_ANYDATA);
2676 assert_string_equal(parsed->child->next->name, "anyx");
2677 assert_int_equal(parsed->child->next->nodetype, LYS_ANYXML);
2678 assert_string_equal(parsed->child->next->next->name, "sub-case");
2679 assert_int_equal(parsed->child->next->next->nodetype, LYS_CASE);
2680 assert_string_equal(parsed->child->next->next->next->name, "choice");
2681 assert_int_equal(parsed->child->next->next->next->nodetype, LYS_CHOICE);
2682 assert_string_equal(parsed->child->next->next->next->next->name, "subcont");
2683 assert_int_equal(parsed->child->next->next->next->next->nodetype, LYS_CONTAINER);
2684 assert_string_equal(parsed->child->next->next->next->next->next->name, "leaf");
2685 assert_int_equal(parsed->child->next->next->next->next->next->nodetype, LYS_LEAF);
2686 assert_string_equal(parsed->child->next->next->next->next->next->next->name, "llist");
2687 assert_int_equal(parsed->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2688 assert_string_equal(parsed->child->next->next->next->next->next->next->next->name, "list");
2689 assert_int_equal(parsed->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
2690 assert_null(parsed->child->next->next->next->next->next->next->next->next);
Radek Krejci39b7fc22021-02-26 23:29:18 +01002691 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(parsed->exts[0]), LY_STMT_CHOICE);
Radek Iša56ca9e42020-09-08 18:42:00 +02002692 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002693 siblings = NULL;
2694
2695 /* min subelems */
2696 data = ELEMENT_WRAPPER_START "<choice name=\"choice-name\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002697 assert_int_equal(test_element_helper(state, data, &node_meta, NULL, NULL), LY_SUCCESS);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002698 parsed = (struct lysp_node_choice *)siblings;
2699 assert_string_equal(parsed->name, "choice-name");
Radek Iša56ca9e42020-09-08 18:42:00 +02002700 CHECK_LYSP_NODE(parsed, NULL, 0, 0, 0,
2701 "choice-name", 0, LYS_CHOICE, 0, NULL, 0);
2702 lysp_node_free(UTEST_LYCTX, siblings);
David Sedlákb7abcfa2019-07-24 12:33:35 +02002703 siblings = NULL;
David Sedlákb7abcfa2019-07-24 12:33:35 +02002704}
2705
David Sedlák05404f62019-07-24 14:11:53 +02002706static void
2707test_inout_elem(void **state)
2708{
David Sedlák05404f62019-07-24 14:11:53 +02002709 const char *data;
Michal Vasko2a6c53f2021-09-22 12:20:05 +02002710 struct lysp_node_action_inout inout = {0};
David Sedlák05404f62019-07-24 14:11:53 +02002711 struct inout_meta inout_meta = {NULL, &inout};
2712
2713 /* max subelements */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002714 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlák05404f62019-07-24 14:11:53 +02002715 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002716 "<input>\n"
2717 " <anydata name=\"anyd\"/>\n"
2718 " <anyxml name=\"anyx\"/>\n"
2719 " <choice name=\"choice\"/>\n"
2720 " <container name=\"subcont\"/>\n"
2721 " <grouping name=\"sub-grp\"/>\n"
2722 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2723 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2724 " <list name=\"list\"/>\n"
2725 " <must condition=\"cond\"/>\n"
2726 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2727 " <uses name=\"uses-name\"/>\n"
2728 EXT_SUBELEM
2729 "</input>"
2730 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002731 assert_int_equal(test_element_helper(state, data, &inout_meta, NULL, NULL), LY_SUCCESS);
2732 CHECK_LYSP_ACTION_INOUT(&(inout), 1, 1, 1, 1, LYS_INPUT, 0, 1);
2733 CHECK_LYSP_RESTR(inout.musts, "cond", NULL, NULL, NULL, 0, NULL);
David Sedlák05404f62019-07-24 14:11:53 +02002734 assert_string_equal(inout.typedefs->name, "tpdf");
2735 assert_string_equal(inout.groupings->name, "sub-grp");
Radek Krejci01180ac2021-01-27 08:48:22 +01002736 assert_string_equal(inout.child->name, "anyd");
2737 assert_int_equal(inout.child->nodetype, LYS_ANYDATA);
2738 assert_string_equal(inout.child->next->name, "anyx");
2739 assert_int_equal(inout.child->next->nodetype, LYS_ANYXML);
2740 assert_string_equal(inout.child->next->next->name, "choice");
2741 assert_int_equal(inout.child->next->next->nodetype, LYS_CHOICE);
2742 assert_string_equal(inout.child->next->next->next->name, "subcont");
2743 assert_int_equal(inout.child->next->next->next->nodetype, LYS_CONTAINER);
2744 assert_string_equal(inout.child->next->next->next->next->name, "leaf");
2745 assert_int_equal(inout.child->next->next->next->next->nodetype, LYS_LEAF);
2746 assert_string_equal(inout.child->next->next->next->next->next->name, "llist");
2747 assert_int_equal(inout.child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2748 assert_string_equal(inout.child->next->next->next->next->next->next->name, "list");
2749 assert_int_equal(inout.child->next->next->next->next->next->next->nodetype, LYS_LIST);
2750 assert_string_equal(inout.child->next->next->next->next->next->next->next->name, "uses-name");
2751 assert_int_equal(inout.child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2752 assert_null(inout.child->next->next->next->next->next->next->next->next);
Radek Krejci39b7fc22021-02-26 23:29:18 +01002753 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(inout.exts[0]), LY_STMT_INPUT);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002754 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)&inout);
David Sedlák05404f62019-07-24 14:11:53 +02002755 memset(&inout, 0, sizeof inout);
2756
2757 /* max subelements */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002758 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlák05404f62019-07-24 14:11:53 +02002759 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002760 "<output>\n"
2761 " <anydata name=\"anyd\"/>\n"
2762 " <anyxml name=\"anyx\"/>\n"
2763 " <choice name=\"choice\"/>\n"
2764 " <container name=\"subcont\"/>\n"
2765 " <grouping name=\"sub-grp\"/>\n"
2766 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2767 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2768 " <list name=\"list\"/>\n"
2769 " <must condition=\"cond\"/>\n"
2770 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2771 " <uses name=\"uses-name\"/>\n"
2772 EXT_SUBELEM
2773 "</output>"
2774 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002775 assert_int_equal(test_element_helper(state, data, &inout_meta, NULL, NULL), LY_SUCCESS);
2776 CHECK_LYSP_ACTION_INOUT(&(inout), 1, 1, 1, 1, LYS_OUTPUT, 0, 1);
Michal Vasko7f45cf22020-10-01 12:49:44 +02002777 assert_string_equal(inout.musts->arg.str, "cond");
David Sedlák05404f62019-07-24 14:11:53 +02002778 assert_string_equal(inout.typedefs->name, "tpdf");
2779 assert_string_equal(inout.groupings->name, "sub-grp");
Radek Krejci01180ac2021-01-27 08:48:22 +01002780 assert_string_equal(inout.child->name, "anyd");
2781 assert_int_equal(inout.child->nodetype, LYS_ANYDATA);
2782 assert_string_equal(inout.child->next->name, "anyx");
2783 assert_int_equal(inout.child->next->nodetype, LYS_ANYXML);
2784 assert_string_equal(inout.child->next->next->name, "choice");
2785 assert_int_equal(inout.child->next->next->nodetype, LYS_CHOICE);
2786 assert_string_equal(inout.child->next->next->next->name, "subcont");
2787 assert_int_equal(inout.child->next->next->next->nodetype, LYS_CONTAINER);
2788 assert_string_equal(inout.child->next->next->next->next->name, "leaf");
2789 assert_int_equal(inout.child->next->next->next->next->nodetype, LYS_LEAF);
2790 assert_string_equal(inout.child->next->next->next->next->next->name, "llist");
2791 assert_int_equal(inout.child->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2792 assert_string_equal(inout.child->next->next->next->next->next->next->name, "list");
2793 assert_int_equal(inout.child->next->next->next->next->next->next->nodetype, LYS_LIST);
2794 assert_string_equal(inout.child->next->next->next->next->next->next->next->name, "uses-name");
2795 assert_int_equal(inout.child->next->next->next->next->next->next->next->nodetype, LYS_USES);
2796 assert_null(inout.child->next->next->next->next->next->next->next->next);
Radek Krejci39b7fc22021-02-26 23:29:18 +01002797 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(inout.exts[0]), LY_STMT_OUTPUT);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002798 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)&inout);
David Sedlák05404f62019-07-24 14:11:53 +02002799 memset(&inout, 0, sizeof inout);
2800
2801 /* min subelems */
Michal Vaskob83af8a2020-01-06 09:49:22 +01002802 data = ELEMENT_WRAPPER_START "<input><leaf name=\"l\"><type name=\"empty\"/></leaf></input>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002803 assert_int_equal(test_element_helper(state, data, &inout_meta, NULL, NULL), LY_SUCCESS);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002804 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)&inout);
David Sedlák05404f62019-07-24 14:11:53 +02002805 memset(&inout, 0, sizeof inout);
2806
Michal Vaskob83af8a2020-01-06 09:49:22 +01002807 data = ELEMENT_WRAPPER_START "<output><leaf name=\"l\"><type name=\"empty\"/></leaf></output>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002808 assert_int_equal(test_element_helper(state, data, &inout_meta, NULL, NULL), LY_SUCCESS);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002809 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)&inout);
David Sedlák05404f62019-07-24 14:11:53 +02002810 memset(&inout, 0, sizeof inout);
2811
2812 /* invalid combinations */
2813 data = ELEMENT_WRAPPER_START "<input name=\"test\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002814 assert_int_equal(test_element_helper(state, data, &inout_meta, NULL, NULL), LY_EVALID);
Radek Krejci9a3823e2021-01-27 20:26:46 +01002815 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)&inout);
Radek Iša56ca9e42020-09-08 18:42:00 +02002816 CHECK_LOG_CTX("Unexpected attribute \"name\" of \"input\" element.", "Line number 1.");
David Sedlák05404f62019-07-24 14:11:53 +02002817 memset(&inout, 0, sizeof inout);
David Sedlák05404f62019-07-24 14:11:53 +02002818}
2819
David Sedlák85d0eca2019-07-24 15:15:21 +02002820static void
2821test_action_elem(void **state)
2822{
David Sedlák85d0eca2019-07-24 15:15:21 +02002823 const char *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01002824 struct lysp_node_action *actions = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002825 struct tree_node_meta act_meta = {NULL, (struct lysp_node **)&actions};
Radek Iša56ca9e42020-09-08 18:42:00 +02002826 uint16_t flags;
David Sedlák85d0eca2019-07-24 15:15:21 +02002827
2828 /* max subelems */
Michal Vasko8a67eff2021-12-07 14:04:47 +01002829 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlák85d0eca2019-07-24 15:15:21 +02002830 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002831 "<action name=\"act\">\n"
2832 " <description><text>desc</text></description>\n"
2833 " <grouping name=\"grouping\"/>\n"
2834 " <if-feature name=\"iff\"/>\n"
2835 " <input><uses name=\"uses-name\"/></input>\n"
2836 " <output><must condition=\"cond\"/><leaf name=\"l\"><type name=\"type\"/></leaf></output>\n"
2837 " <reference><text>ref</text></reference>\n"
2838 " <status value=\"deprecated\"/>\n"
2839 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2840 EXT_SUBELEM
2841 "</action>"
2842 ELEMENT_WRAPPER_END;
Michal Vasko1bf09392020-03-27 12:38:10 +01002843 /* there must be parent for action */
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002844 act_meta.parent = (void *)1;
Radek Iša56ca9e42020-09-08 18:42:00 +02002845 assert_int_equal(test_element_helper(state, data, &act_meta, NULL, NULL), LY_SUCCESS);
Michal Vasko1bf09392020-03-27 12:38:10 +01002846 act_meta.parent = NULL;
Radek Iša56ca9e42020-09-08 18:42:00 +02002847 flags = LYS_STATUS_DEPRC;
2848 CHECK_LYSP_ACTION(actions, "desc", 1, flags, 1, 1,\
2849 1, 0, 0, 0,\
2850 1, 0,\
2851 "act", LYS_ACTION, \
2852 1, 0, 0, 1,\
2853 1, 0,\
2854 1, "ref", 1);
2855
Michal Vasko7f45cf22020-10-01 12:49:44 +02002856 assert_string_equal(actions->iffeatures[0].str, "iff");
David Sedlák85d0eca2019-07-24 15:15:21 +02002857 assert_string_equal(actions->typedefs->name, "tpdf");
2858 assert_string_equal(actions->groupings->name, "grouping");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002859 assert_string_equal(actions->output.musts->arg.str, "cond");
Radek Krejci01180ac2021-01-27 08:48:22 +01002860 assert_string_equal(actions->input.child->name, "uses-name");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002861 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(actions->exts[0]), LY_STMT_ACTION);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002862 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)actions);
David Sedlák85d0eca2019-07-24 15:15:21 +02002863 actions = NULL;
2864
Michal Vasko8a67eff2021-12-07 14:04:47 +01002865 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlákeaa45792019-07-24 15:25:01 +02002866 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002867 "<rpc name=\"act\">\n"
2868 " <description><text>desc</text></description>\n"
2869 " <grouping name=\"grouping\"/>\n"
2870 " <if-feature name=\"iff\"/>\n"
2871 " <input><uses name=\"uses-name\"/></input>\n"
2872 " <output><must condition=\"cond\"/><leaf name=\"l\"><type name=\"type\"/></leaf></output>\n"
2873 " <reference><text>ref</text></reference>\n"
2874 " <status value=\"deprecated\"/>\n"
2875 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
2876 EXT_SUBELEM
2877 "</rpc>"
2878 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002879 assert_int_equal(test_element_helper(state, data, &act_meta, NULL, NULL), LY_SUCCESS);
2880 flags = LYS_STATUS_DEPRC;
2881 CHECK_LYSP_ACTION(actions, "desc", 1, flags, 1, 1,\
2882 1, 0, 0, 0,\
2883 1, 0,\
2884 "act", LYS_RPC, \
2885 1, 0, 0, 1,\
2886 1, 0,\
2887 0, "ref", 1);
2888
Michal Vasko7f45cf22020-10-01 12:49:44 +02002889 assert_string_equal(actions->iffeatures[0].str, "iff");
David Sedlákeaa45792019-07-24 15:25:01 +02002890 assert_string_equal(actions->typedefs->name, "tpdf");
2891 assert_string_equal(actions->groupings->name, "grouping");
Radek Krejci01180ac2021-01-27 08:48:22 +01002892 assert_string_equal(actions->input.child->name, "uses-name");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002893 assert_string_equal(actions->output.musts->arg.str, "cond");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002894 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(actions->exts[0]), LY_STMT_RPC);
Radek Krejci2a9fc652021-01-22 17:44:34 +01002895 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)actions);
David Sedlákeaa45792019-07-24 15:25:01 +02002896 actions = NULL;
2897
David Sedlák85d0eca2019-07-24 15:15:21 +02002898 /* min subelems */
2899 data = ELEMENT_WRAPPER_START "<action name=\"act\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002900 assert_int_equal(test_element_helper(state, data, &act_meta, NULL, NULL), LY_SUCCESS);
David Sedlák85d0eca2019-07-24 15:15:21 +02002901 assert_string_equal(actions->name, "act");
Radek Krejci2a9fc652021-01-22 17:44:34 +01002902 lysp_node_free(UTEST_LYCTX, (struct lysp_node *)actions);
David Sedlák85d0eca2019-07-24 15:15:21 +02002903 actions = NULL;
David Sedlák85d0eca2019-07-24 15:15:21 +02002904}
2905
David Sedlák992fb7c2019-07-24 16:51:01 +02002906static void
2907test_augment_elem(void **state)
2908{
David Sedlák992fb7c2019-07-24 16:51:01 +02002909 const char *data;
Radek Krejci2a9fc652021-01-22 17:44:34 +01002910 struct lysp_node_augment *augments = NULL;
David Sedlák6881b512019-08-13 12:52:00 +02002911 struct tree_node_meta aug_meta = {NULL, (struct lysp_node **)&augments};
David Sedlák992fb7c2019-07-24 16:51:01 +02002912
Michal Vasko8a67eff2021-12-07 14:04:47 +01002913 PARSER_CUR_PMOD(YCTX)->version = LYS_VERSION_1_1;
David Sedlák992fb7c2019-07-24 16:51:01 +02002914 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01002915 "<augment target-node=\"target\">\n"
2916 " <action name=\"action\"/>\n"
2917 " <anydata name=\"anyd\"/>\n"
2918 " <anyxml name=\"anyx\"/>\n"
2919 " <case name=\"case\"/>\n"
2920 " <choice name=\"choice\"/>\n"
2921 " <container name=\"subcont\"/>\n"
2922 " <description><text>desc</text></description>\n"
2923 " <if-feature name=\"iff\"/>\n"
2924 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
2925 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
2926 " <list name=\"list\"/>\n"
2927 " <notification name=\"notif\"/>\n"
2928 " <reference><text>ref</text></reference>\n"
2929 " <status value=\"current\"/>\n"
2930 " <uses name=\"uses\"/>\n"
2931 " <when condition=\"when-cond\"/>\n"
2932 EXT_SUBELEM
2933 "</augment>"
2934 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002935 assert_int_equal(test_element_helper(state, data, &aug_meta, NULL, NULL), LY_SUCCESS);
David Sedlák992fb7c2019-07-24 16:51:01 +02002936 assert_string_equal(augments->nodeid, "target");
2937 assert_null(augments->parent);
2938 assert_int_equal(augments->nodetype, LYS_AUGMENT);
2939 assert_true(augments->flags & LYS_STATUS_CURR);
2940 assert_string_equal(augments->dsc, "desc");
2941 assert_string_equal(augments->ref, "ref");
2942 assert_string_equal(augments->when->cond, "when-cond");
Michal Vasko7f45cf22020-10-01 12:49:44 +02002943 assert_string_equal(augments->iffeatures[0].str, "iff");
David Sedlák992fb7c2019-07-24 16:51:01 +02002944 assert_string_equal(augments->child->name, "anyd");
2945 assert_int_equal(augments->child->nodetype, LYS_ANYDATA);
2946 assert_string_equal(augments->child->next->name, "anyx");
2947 assert_int_equal(augments->child->next->nodetype, LYS_ANYXML);
2948 assert_string_equal(augments->child->next->next->name, "case");
2949 assert_int_equal(augments->child->next->next->nodetype, LYS_CASE);
2950 assert_string_equal(augments->child->next->next->next->name, "choice");
2951 assert_int_equal(augments->child->next->next->next->nodetype, LYS_CHOICE);
2952 assert_string_equal(augments->child->next->next->next->next->name, "subcont");
2953 assert_int_equal(augments->child->next->next->next->next->nodetype, LYS_CONTAINER);
2954 assert_string_equal(augments->child->next->next->next->next->next->name, "leaf");
2955 assert_int_equal(augments->child->next->next->next->next->next->nodetype, LYS_LEAF);
2956 assert_string_equal(augments->child->next->next->next->next->next->next->name, "llist");
2957 assert_int_equal(augments->child->next->next->next->next->next->next->nodetype, LYS_LEAFLIST);
2958 assert_string_equal(augments->child->next->next->next->next->next->next->next->name, "list");
2959 assert_int_equal(augments->child->next->next->next->next->next->next->next->nodetype, LYS_LIST);
2960 assert_string_equal(augments->child->next->next->next->next->next->next->next->next->name, "uses");
2961 assert_int_equal(augments->child->next->next->next->next->next->next->next->next->nodetype, LYS_USES);
2962 assert_null(augments->child->next->next->next->next->next->next->next->next->next);
2963 assert_string_equal(augments->actions->name, "action");
2964 assert_string_equal(augments->notifs->name, "notif");
Radek Krejci39b7fc22021-02-26 23:29:18 +01002965 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(augments->exts[0]), LY_STMT_AUGMENT);
Michal Vasko8a67eff2021-12-07 14:04:47 +01002966 lysp_node_free(PARSER_CUR_PMOD(YCTX)->mod->ctx, (struct lysp_node *)augments);
David Sedlák992fb7c2019-07-24 16:51:01 +02002967 augments = NULL;
2968
2969 data = ELEMENT_WRAPPER_START "<augment target-node=\"target\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002970 assert_int_equal(test_element_helper(state, data, &aug_meta, NULL, NULL), LY_SUCCESS);
David Sedlák992fb7c2019-07-24 16:51:01 +02002971 assert_string_equal(augments->nodeid, "target");
Michal Vasko8a67eff2021-12-07 14:04:47 +01002972 lysp_node_free(PARSER_CUR_PMOD(YCTX)->mod->ctx, (struct lysp_node *)augments);
David Sedlák992fb7c2019-07-24 16:51:01 +02002973 augments = NULL;
David Sedlák992fb7c2019-07-24 16:51:01 +02002974}
2975
David Sedlák4ffcec82019-07-25 15:10:21 +02002976static void
2977test_deviate_elem(void **state)
2978{
David Sedlák4ffcec82019-07-25 15:10:21 +02002979 const char *data;
2980 struct lysp_deviate *deviates = NULL;
David Sedlák4ffcec82019-07-25 15:10:21 +02002981
2982 /* invalid arguments */
2983 data = ELEMENT_WRAPPER_START "<deviate value=\"\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002984 assert_int_equal(test_element_helper(state, data, &deviates, NULL, NULL), LY_EVALID);
2985 CHECK_LOG_CTX("Invalid value \"\" of \"value\" attribute in \"deviate\" element. "
2986 "Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\".", "Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02002987 deviates = NULL;
2988
2989 data = ELEMENT_WRAPPER_START "<deviate value=\"invalid\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002990 assert_int_equal(test_element_helper(state, data, &deviates, NULL, NULL), LY_EVALID);
2991 CHECK_LOG_CTX("Invalid value \"invalid\" of \"value\" attribute in \"deviate\" element. "
2992 "Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\".", "Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02002993 deviates = NULL;
2994
2995 data = ELEMENT_WRAPPER_START "<deviate value=\"ad\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02002996 assert_int_equal(test_element_helper(state, data, &deviates, NULL, NULL), LY_EVALID);
2997 CHECK_LOG_CTX("Invalid value \"ad\" of \"value\" attribute in \"deviate\" element. "
2998 "Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\".", "Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02002999 deviates = NULL;
3000
3001 data = ELEMENT_WRAPPER_START "<deviate value=\"adds\" />" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02003002 assert_int_equal(test_element_helper(state, data, &deviates, NULL, NULL), LY_EVALID);
3003 CHECK_LOG_CTX("Invalid value \"adds\" of \"value\" attribute in \"deviate\" element. "
3004 "Valid values are \"not-supported\", \"add\", \"replace\" and \"delete\".", "Line number 1.");
David Sedlák4ffcec82019-07-25 15:10:21 +02003005 deviates = NULL;
3006
3007 data = ELEMENT_WRAPPER_START
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003008 "<deviate value=\"not-supported\">\n"
3009 " <must condition=\"c\"/>\n"
3010 "</deviate>"
3011 ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02003012 assert_int_equal(test_element_helper(state, data, &deviates, NULL, NULL), LY_EVALID);
3013 CHECK_LOG_CTX("Deviate of this type doesn't allow \"must\" as it's sub-element.", "Line number 2.");
David Sedlák4ffcec82019-07-25 15:10:21 +02003014}
3015
David Sedlák8b754462019-07-25 16:22:13 +02003016static void
3017test_deviation_elem(void **state)
3018{
David Sedlák8b754462019-07-25 16:22:13 +02003019 const char *data;
3020 struct lysp_deviation *deviations = NULL;
3021
David Sedlák8b754462019-07-25 16:22:13 +02003022 /* invalid */
3023 data = ELEMENT_WRAPPER_START "<deviation target-node=\"target\"/>" ELEMENT_WRAPPER_END;
Radek Iša56ca9e42020-09-08 18:42:00 +02003024 assert_int_equal(test_element_helper(state, data, &deviations, NULL, NULL), LY_EVALID);
Radek Iša56ca9e42020-09-08 18:42:00 +02003025 CHECK_LOG_CTX("Missing mandatory sub-element \"deviate\" of \"deviation\" element.", "Line number 1.");
Michal Vasko12ef5362022-09-16 15:13:58 +02003026}
David Sedlák8b754462019-07-25 16:22:13 +02003027
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003028static struct lysp_module *
3029mod_renew(struct lys_yin_parser_ctx *ctx)
3030{
Michal Vasko8a67eff2021-12-07 14:04:47 +01003031 struct ly_ctx *ly_ctx = PARSER_CUR_PMOD(ctx)->mod->ctx;
3032 struct lysp_module *pmod;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003033
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003034 lys_module_free(PARSER_CUR_PMOD(ctx)->mod, 0);
Michal Vasko8a67eff2021-12-07 14:04:47 +01003035 pmod = calloc(1, sizeof *pmod);
3036 ctx->parsed_mods->objs[0] = pmod;
3037 pmod->mod = calloc(1, sizeof *pmod->mod);
3038 pmod->mod->parsed = pmod;
3039 pmod->mod->ctx = ly_ctx;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003040
Michal Vasko8a67eff2021-12-07 14:04:47 +01003041 return pmod;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003042}
3043
David Sedlák4f03b932019-07-26 13:01:47 +02003044static void
3045test_module_elem(void **state)
3046{
Michal Vaskob36053d2020-03-26 15:49:30 +01003047 const char *data;
Radek Iša56ca9e42020-09-08 18:42:00 +02003048 struct lysp_module *lysp_mod = mod_renew(YCTX);
David Sedlák4f03b932019-07-26 13:01:47 +02003049
3050 /* max subelems */
David Sedlák4f03b932019-07-26 13:01:47 +02003051 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003052 " <yang-version value=\"1.1\"/>\n"
3053 " <namespace uri=\"ns\"/>\n"
3054 " <prefix value=\"pref\"/>\n"
3055 " <include module=\"b-mod\"/>\n"
3056 " <import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3057 " <organization><text>org</text></organization>\n"
3058 " <contact><text>contact</text></contact>\n"
3059 " <description><text>desc</text></description>\n"
3060 " <reference><text>ref</text></reference>\n"
3061 " <revision date=\"2019-02-02\"/>\n"
3062 " <anydata name=\"anyd\"/>\n"
3063 " <anyxml name=\"anyx\"/>\n"
3064 " <choice name=\"choice\"/>\n"
3065 " <container name=\"cont\"/>\n"
3066 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3067 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3068 " <list name=\"sub-list\"/>\n"
3069 " <uses name=\"uses-name\"/>\n"
3070 " <augment target-node=\"target\"/>\n"
3071 " <deviation target-node=\"target\">\n"
3072 " <deviate value=\"not-supported\"/>\n"
3073 " </deviation>\n"
3074 " <extension name=\"ext\"/>\n"
3075 " <feature name=\"feature\"/>\n"
3076 " <grouping name=\"grp\"/>\n"
3077 " <identity name=\"ident-name\"/>\n"
3078 " <notification name=\"notf\"/>\n"
3079 " <rpc name=\"rpc-name\"/>\n"
3080 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
3081 EXT_SUBELEM "\n"
3082 "</module>\n";
Radek Iša56ca9e42020-09-08 18:42:00 +02003083 assert_int_equal(ly_in_new_memory(data, &UTEST_IN), LY_SUCCESS);
3084 assert_int_equal(lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx), LY_SUCCESS);
Michal Vaskob36053d2020-03-26 15:49:30 +01003085
Radek Iša56ca9e42020-09-08 18:42:00 +02003086 assert_int_equal(yin_parse_mod(YCTX, lysp_mod), LY_SUCCESS);
David Sedlák4f03b932019-07-26 13:01:47 +02003087 assert_string_equal(lysp_mod->mod->name, "mod");
3088 assert_string_equal(lysp_mod->revs, "2019-02-02");
3089 assert_string_equal(lysp_mod->mod->ns, "ns");
3090 assert_string_equal(lysp_mod->mod->prefix, "pref");
3091 assert_null(lysp_mod->mod->filepath);
3092 assert_string_equal(lysp_mod->mod->org, "org");
3093 assert_string_equal(lysp_mod->mod->contact, "contact");
3094 assert_string_equal(lysp_mod->mod->dsc, "desc");
3095 assert_string_equal(lysp_mod->mod->ref, "ref");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003096 assert_int_equal(lysp_mod->version, LYS_VERSION_1_1);
Radek Iša56ca9e42020-09-08 18:42:00 +02003097 CHECK_LYSP_IMPORT(lysp_mod->imports, NULL, 0, "a-mod",
3098 "imp-pref", NULL, "");
David Sedlák4f03b932019-07-26 13:01:47 +02003099 assert_string_equal(lysp_mod->includes->name, "b-mod");
3100 assert_string_equal(lysp_mod->extensions->name, "ext");
3101 assert_string_equal(lysp_mod->features->name, "feature");
3102 assert_string_equal(lysp_mod->identities->name, "ident-name");
3103 assert_string_equal(lysp_mod->typedefs->name, "tpdf");
3104 assert_string_equal(lysp_mod->groupings->name, "grp");
3105 assert_string_equal(lysp_mod->data->name, "anyd");
3106 assert_int_equal(lysp_mod->data->nodetype, LYS_ANYDATA);
3107 assert_string_equal(lysp_mod->data->next->name, "anyx");
3108 assert_int_equal(lysp_mod->data->next->nodetype, LYS_ANYXML);
3109 assert_string_equal(lysp_mod->data->next->next->name, "choice");
3110 assert_int_equal(lysp_mod->data->next->next->nodetype, LYS_CHOICE);
3111 assert_string_equal(lysp_mod->data->next->next->next->name, "cont");
3112 assert_int_equal(lysp_mod->data->next->next->next->nodetype, LYS_CONTAINER);
3113 assert_string_equal(lysp_mod->data->next->next->next->next->name, "leaf");
3114 assert_int_equal(lysp_mod->data->next->next->next->next->nodetype, LYS_LEAF);
3115 assert_string_equal(lysp_mod->data->next->next->next->next->next->name, "llist");
3116 assert_int_equal(lysp_mod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3117 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->name, "sub-list");
3118 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
3119 assert_string_equal(lysp_mod->data->next->next->next->next->next->next->next->name, "uses-name");
3120 assert_int_equal(lysp_mod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3121 assert_null(lysp_mod->data->next->next->next->next->next->next->next->next);
3122 assert_string_equal(lysp_mod->augments->nodeid, "target");
3123 assert_string_equal(lysp_mod->rpcs->name, "rpc-name");
3124 assert_string_equal(lysp_mod->notifs->name, "notf");
3125 assert_string_equal(lysp_mod->deviations->nodeid, "target");
Radek Krejci39b7fc22021-02-26 23:29:18 +01003126 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(lysp_mod->exts[0]), LY_STMT_MODULE);
David Sedlák4f03b932019-07-26 13:01:47 +02003127
3128 /* min subelems */
Radek Iša56ca9e42020-09-08 18:42:00 +02003129 ly_in_free(UTEST_IN, 0);
3130 lyxml_ctx_free(YCTX->xmlctx);
3131 lysp_mod = mod_renew(YCTX);
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003132 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3133 " <namespace uri=\"ns\"/>\n"
3134 " <prefix value=\"pref\"/>\n"
3135 " <yang-version value=\"1.1\"/>\n"
3136 "</module>";
Radek Iša56ca9e42020-09-08 18:42:00 +02003137 assert_int_equal(ly_in_new_memory(data, &UTEST_IN), LY_SUCCESS);
3138 assert_int_equal(lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx), LY_SUCCESS);
3139 assert_int_equal(yin_parse_mod(YCTX, lysp_mod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003140 assert_string_equal(lysp_mod->mod->name, "mod");
David Sedlák298ff6d2019-07-26 14:29:03 +02003141
David Sedláke6cd89e2019-08-07 12:46:02 +02003142 /* incorrect subelem order */
Radek Iša56ca9e42020-09-08 18:42:00 +02003143 ly_in_free(UTEST_IN, 0);
3144 lyxml_ctx_free(YCTX->xmlctx);
3145 lysp_mod = mod_renew(YCTX);
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003146 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
3147 " <feature name=\"feature\"/>\n"
3148 " <namespace uri=\"ns\"/>\n"
3149 " <prefix value=\"pref\"/>\n"
3150 " <yang-version value=\"1.1\"/>\n"
3151 "</module>";
Radek Iša56ca9e42020-09-08 18:42:00 +02003152 assert_int_equal(ly_in_new_memory(data, &UTEST_IN), LY_SUCCESS);
3153 assert_int_equal(lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx), LY_SUCCESS);
3154 assert_int_equal(yin_parse_mod(YCTX, lysp_mod), LY_EVALID);
3155 CHECK_LOG_CTX("Invalid order of module\'s sub-elements \"namespace\" can\'t appear after \"feature\".", "Line number 3.");
David Sedlák298ff6d2019-07-26 14:29:03 +02003156}
3157
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003158static struct lysp_submodule *
3159submod_renew(struct lys_yin_parser_ctx *ctx, const char *belongs_to)
3160{
Michal Vasko8a67eff2021-12-07 14:04:47 +01003161 struct ly_ctx *ly_ctx = PARSER_CUR_PMOD(ctx)->mod->ctx;
3162 struct lysp_submodule *submod;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003163
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003164 lys_module_free(PARSER_CUR_PMOD(ctx)->mod, 0);
Michal Vasko8a67eff2021-12-07 14:04:47 +01003165 submod = calloc(1, sizeof *submod);
3166 ctx->parsed_mods->objs[0] = submod;
3167 submod->mod = calloc(1, sizeof *submod->mod);
3168 lydict_insert(ly_ctx, belongs_to, 0, &submod->mod->name);
3169 submod->mod->parsed = (struct lysp_module *)submod;
3170 submod->mod->ctx = ly_ctx;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003171
Michal Vasko8a67eff2021-12-07 14:04:47 +01003172 return submod;
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003173}
3174
David Sedlák298ff6d2019-07-26 14:29:03 +02003175static void
3176test_submodule_elem(void **state)
3177{
Michal Vaskob36053d2020-03-26 15:49:30 +01003178 const char *data;
Radek Iša56ca9e42020-09-08 18:42:00 +02003179 struct lysp_submodule *lysp_submod = submod_renew(YCTX, "module-name");
David Sedlák298ff6d2019-07-26 14:29:03 +02003180
3181 /* max subelements */
David Sedlák298ff6d2019-07-26 14:29:03 +02003182 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"mod\">\n"
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003183 " <yang-version value=\"1.1\"/>\n"
3184 " <belongs-to module=\"module-name\">\n"
3185 " <prefix value=\"pref\"/>\n"
3186 " </belongs-to>\n"
3187 " <include module=\"b-mod\"/>\n"
3188 " <import module=\"a-mod\"><prefix value=\"imp-pref\"/></import>\n"
3189 " <organization><text>org</text></organization>\n"
3190 " <contact><text>contact</text></contact>\n"
3191 " <description><text>desc</text></description>\n"
3192 " <reference><text>ref</text></reference>\n"
3193 " <revision date=\"2019-02-02\"/>\n"
3194 " <anydata name=\"anyd\"/>\n"
3195 " <anyxml name=\"anyx\"/>\n"
3196 " <choice name=\"choice\"/>\n"
3197 " <container name=\"cont\"/>\n"
3198 " <leaf name=\"leaf\"> <type name=\"type\"/> </leaf>\n"
3199 " <leaf-list name=\"llist\"> <type name=\"type\"/> </leaf-list>\n"
3200 " <list name=\"sub-list\"/>\n"
3201 " <uses name=\"uses-name\"/>\n"
3202 " <augment target-node=\"target\"/>\n"
3203 " <deviation target-node=\"target\">\n"
3204 " <deviate value=\"not-supported\"/>\n"
3205 " </deviation>\n"
3206 " <extension name=\"ext\"/>\n"
3207 " <feature name=\"feature\"/>\n"
3208 " <grouping name=\"grp\"/>\n"
3209 " <identity name=\"ident-name\"/>\n"
3210 " <notification name=\"notf\"/>\n"
3211 " <rpc name=\"rpc-name\"/>\n"
3212 " <typedef name=\"tpdf\"> <type name=\"type\"/> </typedef>\n"
3213 EXT_SUBELEM "\n"
3214 "</submodule>\n";
Radek Iša56ca9e42020-09-08 18:42:00 +02003215 assert_int_equal(ly_in_new_memory(data, &UTEST_IN), LY_SUCCESS);
3216 assert_int_equal(lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003217
Radek Iša56ca9e42020-09-08 18:42:00 +02003218 assert_int_equal(yin_parse_submod(YCTX, lysp_submod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003219 assert_string_equal(lysp_submod->name, "mod");
3220 assert_string_equal(lysp_submod->revs, "2019-02-02");
David Sedlák298ff6d2019-07-26 14:29:03 +02003221 assert_string_equal(lysp_submod->prefix, "pref");
3222 assert_null(lysp_submod->filepath);
3223 assert_string_equal(lysp_submod->org, "org");
3224 assert_string_equal(lysp_submod->contact, "contact");
3225 assert_string_equal(lysp_submod->dsc, "desc");
3226 assert_string_equal(lysp_submod->ref, "ref");
3227 assert_int_equal(lysp_submod->version, LYS_VERSION_1_1);
Radek Iša56ca9e42020-09-08 18:42:00 +02003228 CHECK_LYSP_IMPORT(lysp_submod->imports, NULL, 0, "a-mod",
3229 "imp-pref", NULL, "");
David Sedlák298ff6d2019-07-26 14:29:03 +02003230 assert_string_equal(lysp_submod->includes->name, "b-mod");
3231 assert_string_equal(lysp_submod->extensions->name, "ext");
3232 assert_string_equal(lysp_submod->features->name, "feature");
3233 assert_string_equal(lysp_submod->identities->name, "ident-name");
3234 assert_string_equal(lysp_submod->typedefs->name, "tpdf");
3235 assert_string_equal(lysp_submod->groupings->name, "grp");
3236 assert_string_equal(lysp_submod->data->name, "anyd");
3237 assert_int_equal(lysp_submod->data->nodetype, LYS_ANYDATA);
3238 assert_string_equal(lysp_submod->data->next->name, "anyx");
3239 assert_int_equal(lysp_submod->data->next->nodetype, LYS_ANYXML);
3240 assert_string_equal(lysp_submod->data->next->next->name, "choice");
3241 assert_int_equal(lysp_submod->data->next->next->nodetype, LYS_CHOICE);
3242 assert_string_equal(lysp_submod->data->next->next->next->name, "cont");
3243 assert_int_equal(lysp_submod->data->next->next->next->nodetype, LYS_CONTAINER);
3244 assert_string_equal(lysp_submod->data->next->next->next->next->name, "leaf");
3245 assert_int_equal(lysp_submod->data->next->next->next->next->nodetype, LYS_LEAF);
3246 assert_string_equal(lysp_submod->data->next->next->next->next->next->name, "llist");
3247 assert_int_equal(lysp_submod->data->next->next->next->next->next->nodetype, LYS_LEAFLIST);
3248 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->name, "sub-list");
3249 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->nodetype, LYS_LIST);
3250 assert_string_equal(lysp_submod->data->next->next->next->next->next->next->next->name, "uses-name");
3251 assert_int_equal(lysp_submod->data->next->next->next->next->next->next->next->nodetype, LYS_USES);
3252 assert_null(lysp_submod->data->next->next->next->next->next->next->next->next);
3253 assert_string_equal(lysp_submod->augments->nodeid, "target");
3254 assert_string_equal(lysp_submod->rpcs->name, "rpc-name");
3255 assert_string_equal(lysp_submod->notifs->name, "notf");
3256 assert_string_equal(lysp_submod->deviations->nodeid, "target");
Radek Krejci39b7fc22021-02-26 23:29:18 +01003257 TEST_1_CHECK_LYSP_EXT_INSTANCE(&(lysp_submod->exts[0]), LY_STMT_SUBMODULE);
David Sedlák298ff6d2019-07-26 14:29:03 +02003258
David Sedlák298ff6d2019-07-26 14:29:03 +02003259 /* min subelemnts */
Radek Iša56ca9e42020-09-08 18:42:00 +02003260 ly_in_free(UTEST_IN, 0);
3261 lyxml_ctx_free(YCTX->xmlctx);
3262 lysp_submod = submod_renew(YCTX, "module-name");
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003263 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">\n"
3264 " <yang-version value=\"1\"/>\n"
3265 " <belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>\n"
3266 "</submodule>";
Radek Iša56ca9e42020-09-08 18:42:00 +02003267 assert_int_equal(ly_in_new_memory(data, &UTEST_IN), LY_SUCCESS);
3268 assert_int_equal(lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx), LY_SUCCESS);
3269 assert_int_equal(yin_parse_submod(YCTX, lysp_submod), LY_SUCCESS);
David Sedlák298ff6d2019-07-26 14:29:03 +02003270 assert_string_equal(lysp_submod->prefix, "pref");
David Sedlák298ff6d2019-07-26 14:29:03 +02003271 assert_int_equal(lysp_submod->version, LYS_VERSION_1_0);
David Sedlák298ff6d2019-07-26 14:29:03 +02003272
David Sedláke6cd89e2019-08-07 12:46:02 +02003273 /* incorrect subelem order */
Radek Iša56ca9e42020-09-08 18:42:00 +02003274 ly_in_free(UTEST_IN, 0);
3275 lyxml_ctx_free(YCTX->xmlctx);
3276 lysp_submod = submod_renew(YCTX, "module-name");
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003277 data = "<submodule xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" name=\"submod\">\n"
3278 " <yang-version value=\"1\"/>\n"
3279 " <reference><text>ref</text></reference>\n"
3280 " <belongs-to module=\"module-name\"><prefix value=\"pref\"/></belongs-to>\n"
3281 "</submodule>";
Radek Iša56ca9e42020-09-08 18:42:00 +02003282 assert_int_equal(ly_in_new_memory(data, &UTEST_IN), LY_SUCCESS);
3283 assert_int_equal(lyxml_ctx_new(UTEST_LYCTX, UTEST_IN, &YCTX->xmlctx), LY_SUCCESS);
3284 assert_int_equal(yin_parse_submod(YCTX, lysp_submod), LY_EVALID);
3285 CHECK_LOG_CTX("Invalid order of submodule's sub-elements \"belongs-to\" can't appear after \"reference\".", "Line number 4.");
David Sedlák4f03b932019-07-26 13:01:47 +02003286}
3287
David Sedlák8985a142019-07-31 16:43:06 +02003288static void
3289test_yin_parse_module(void **state)
3290{
David Sedlák8985a142019-07-31 16:43:06 +02003291 const char *data;
3292 struct lys_module *mod;
Michal Vaskob36053d2020-03-26 15:49:30 +01003293 struct lys_yin_parser_ctx *yin_ctx = NULL;
Michal Vasko63f3d842020-07-08 10:10:14 +02003294 struct ly_in *in = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02003295
3296 mod = calloc(1, sizeof *mod);
Radek Iša56ca9e42020-09-08 18:42:00 +02003297 mod->ctx = UTEST_LYCTX;
David Sedlákd2844882019-09-13 16:01:22 +02003298 data = "<module xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\" xmlns:md=\"urn:ietf:params:xml:ns:yang:ietf-yang-metadata\" name=\"a\"> \n"
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003299 " <yang-version value=\"1.1\"/>\n"
3300 " <namespace uri=\"urn:tests:extensions:metadata:a\"/>\n"
3301 " <prefix value=\"a\"/>\n"
3302 " <import module=\"ietf-yang-metadata\">\n"
3303 " <prefix value=\"md\"/>\n"
3304 " </import>\n"
3305 " <feature name=\"f\"/>\n"
3306 " <md:annotation name=\"x\">\n"
3307 " <description>\n"
3308 " <text>test</text>\n"
3309 " </description>\n"
3310 " <reference>\n"
3311 " <text>test</text>\n"
3312 " </reference>\n"
3313 " <if-feature name=\"f\"/>\n"
3314 " <status value=\"current\"/>\n"
3315 " <type name=\"uint8\"/>\n"
3316 " <units name=\"meters\"/>\n"
3317 " </md:annotation>\n"
3318 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02003319 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
aPiecekc3e26142021-06-22 14:25:49 +02003320 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_SUCCESS);
David Sedlákd2844882019-09-13 16:01:22 +02003321 assert_null(mod->parsed->exts->child->next->child);
3322 assert_string_equal(mod->parsed->exts->child->next->arg, "test");
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003323 lys_module_free(mod, 0);
David Sedlákd2844882019-09-13 16:01:22 +02003324 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003325 ly_in_free(in, 0);
David Sedlákd2844882019-09-13 16:01:22 +02003326 mod = NULL;
3327 yin_ctx = NULL;
3328
3329 mod = calloc(1, sizeof *mod);
Radek Iša56ca9e42020-09-08 18:42:00 +02003330 mod->ctx = UTEST_LYCTX;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003331 data = "<module name=\"example-foo\""
3332 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
3333 " xmlns:foo=\"urn:example:foo\""
3334 " xmlns:myext=\"urn:example:extensions\">\n"
David Sedlák8985a142019-07-31 16:43:06 +02003335
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003336 " <yang-version value=\"1\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003337
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003338 " <namespace uri=\"urn:example:foo\"/>\n"
3339 " <prefix value=\"foo\"/>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003340
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003341 " <import module=\"example-extensions\">\n"
3342 " <prefix value=\"myext\"/>\n"
3343 " </import>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003344
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003345 " <list name=\"interface\">\n"
3346 " <key value=\"name\"/>\n"
3347 " <leaf name=\"name\">\n"
3348 " <type name=\"string\"/>\n"
3349 " </leaf>\n"
3350 " <leaf name=\"mtu\">\n"
3351 " <type name=\"uint32\"/>\n"
3352 " <description>\n"
3353 " <text>The MTU of the interface.</text>\n"
3354 " </description>\n"
3355 " <myext:c-define name=\"MY_MTU\"/>\n"
3356 " </leaf>\n"
3357 " </list>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003358 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02003359 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
aPiecekc3e26142021-06-22 14:25:49 +02003360 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_SUCCESS);
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003361 lys_module_free(mod, 0);
David Sedlák8985a142019-07-31 16:43:06 +02003362 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003363 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02003364 mod = NULL;
3365 yin_ctx = NULL;
3366
3367 mod = calloc(1, sizeof *mod);
Radek Iša56ca9e42020-09-08 18:42:00 +02003368 mod->ctx = UTEST_LYCTX;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003369 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
3370 " <yang-version value=\"1\"/>\n"
3371 " <namespace uri=\"urn:example:foo\"/>\n"
3372 " <prefix value=\"foo\"/>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02003373 "</module>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02003374 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
aPiecekc3e26142021-06-22 14:25:49 +02003375 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_SUCCESS);
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003376 lys_module_free(mod, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02003377 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003378 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02003379 mod = NULL;
3380 yin_ctx = NULL;
3381
David Sedlák6d781b62019-08-02 15:22:52 +02003382 mod = calloc(1, sizeof *mod);
Radek Iša56ca9e42020-09-08 18:42:00 +02003383 mod->ctx = UTEST_LYCTX;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003384 data = "<submodule name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
David Sedlák8985a142019-07-31 16:43:06 +02003385 "</submodule>\n";
Michal Vasko63f3d842020-07-08 10:10:14 +02003386 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
aPiecekc3e26142021-06-22 14:25:49 +02003387 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_EINVAL);
Radek Iša56ca9e42020-09-08 18:42:00 +02003388 CHECK_LOG_CTX("Input data contains submodule which cannot be parsed directly without its main module.", NULL);
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003389 lys_module_free(mod, 0);
David Sedlák8985a142019-07-31 16:43:06 +02003390 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003391 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02003392
David Sedlák6d781b62019-08-02 15:22:52 +02003393 mod = calloc(1, sizeof *mod);
Radek Iša56ca9e42020-09-08 18:42:00 +02003394 mod->ctx = UTEST_LYCTX;
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003395 data = "<module name=\"example-foo\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
3396 " <yang-version value=\"1\"/>\n"
3397 " <namespace uri=\"urn:example:foo\"/>\n"
3398 " <prefix value=\"foo\"/>\n"
3399 "</module>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02003400 "<module>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003401 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
aPiecekc3e26142021-06-22 14:25:49 +02003402 assert_int_equal(yin_parse_module(&yin_ctx, in, mod), LY_EVALID);
Radek Iša56ca9e42020-09-08 18:42:00 +02003403 CHECK_LOG_CTX("Trailing garbage \"<module>\" after module, expected end-of-input.", "Line number 6.");
Michal Vasko4f9da5e2022-03-14 13:11:26 +01003404 lys_module_free(mod, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02003405 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003406 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02003407 mod = NULL;
3408 yin_ctx = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02003409}
3410
3411static void
3412test_yin_parse_submodule(void **state)
3413{
David Sedlák8985a142019-07-31 16:43:06 +02003414 const char *data;
Michal Vaskob36053d2020-03-26 15:49:30 +01003415 struct lys_yin_parser_ctx *yin_ctx = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02003416 struct lysp_submodule *submod = NULL;
Michal Vasko63f3d842020-07-08 10:10:14 +02003417 struct ly_in *in;
David Sedlák8985a142019-07-31 16:43:06 +02003418
Michal Vasko8a67eff2021-12-07 14:04:47 +01003419 lydict_insert(UTEST_LYCTX, "a", 0, &PARSER_CUR_PMOD(YCTX)->mod->name);
Michal Vaskoc3781c32020-10-06 14:04:08 +02003420
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003421 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003422 "<submodule name=\"asub\""
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003423 " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\""
3424 " xmlns:a=\"urn:a\">\n"
3425 " <yang-version value=\"1\"/>\n"
3426 " <belongs-to module=\"a\">\n"
3427 " <prefix value=\"a_pref\"/>\n"
3428 " </belongs-to>\n"
3429 " <include module=\"atop\"/>\n"
3430 " <feature name=\"fox\"/>\n"
3431 " <notification name=\"bar-notif\">\n"
3432 " <if-feature name=\"bar\"/>\n"
3433 " </notification>\n"
3434 " <notification name=\"fox-notif\">\n"
3435 " <if-feature name=\"fox\"/>\n"
3436 " </notification>\n"
3437 " <augment target-node=\"/a_pref:top\">\n"
3438 " <if-feature name=\"bar\"/>\n"
3439 " <container name=\"bar-sub\"/>\n"
3440 " </augment>\n"
3441 " <augment target-node=\"/top\">\n"
3442 " <container name=\"bar-sub2\"/>\n"
3443 " </augment>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003444 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003445 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Radek Iša56ca9e42020-09-08 18:42:00 +02003446 assert_int_equal(yin_parse_submodule(&yin_ctx, UTEST_LYCTX, (struct lys_parser_ctx *)YCTX, in, &submod), LY_SUCCESS);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003447 lysp_module_free((struct lysp_module *)submod);
David Sedlák8985a142019-07-31 16:43:06 +02003448 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003449 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02003450 yin_ctx = NULL;
3451 submod = NULL;
3452
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003453 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3454 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
3455 " <yang-version value=\"1\"/>\n"
3456 " <belongs-to module=\"a\">\n"
3457 " <prefix value=\"a_pref\"/>\n"
3458 " </belongs-to>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02003459 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003460 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Radek Iša56ca9e42020-09-08 18:42:00 +02003461 assert_int_equal(yin_parse_submodule(&yin_ctx, UTEST_LYCTX, (struct lys_parser_ctx *)YCTX, in, &submod), LY_SUCCESS);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003462 lysp_module_free((struct lysp_module *)submod);
David Sedlák6d781b62019-08-02 15:22:52 +02003463 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003464 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02003465 yin_ctx = NULL;
3466 submod = NULL;
3467
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003468 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
David Sedlák8985a142019-07-31 16:43:06 +02003469 "<module name=\"inval\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">"
3470 "</module>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003471 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Radek Iša56ca9e42020-09-08 18:42:00 +02003472 assert_int_equal(yin_parse_submodule(&yin_ctx, UTEST_LYCTX, (struct lys_parser_ctx *)YCTX, in, &submod), LY_EINVAL);
3473 CHECK_LOG_CTX("Input data contains module in situation when a submodule is expected.", NULL);
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003474 lysp_module_free((struct lysp_module *)submod);
David Sedlák8985a142019-07-31 16:43:06 +02003475 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003476 ly_in_free(in, 0);
David Sedlák8985a142019-07-31 16:43:06 +02003477 yin_ctx = NULL;
3478 submod = NULL;
3479
Radek Krejcib4ac5a92020-11-23 17:54:33 +01003480 data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3481 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
3482 " <yang-version value=\"1\"/>\n"
3483 " <belongs-to module=\"a\">\n"
3484 " <prefix value=\"a_pref\"/>\n"
3485 " </belongs-to>\n"
3486 "</submodule>\n"
3487 "<submodule name=\"asub\" xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\">\n"
3488 " <yang-version value=\"1\"/>\n"
3489 " <belongs-to module=\"a\">\n"
3490 " <prefix value=\"a_pref\"/>\n"
3491 " </belongs-to>\n"
David Sedlák6d781b62019-08-02 15:22:52 +02003492 "</submodule>";
Michal Vasko63f3d842020-07-08 10:10:14 +02003493 assert_int_equal(ly_in_new_memory(data, &in), LY_SUCCESS);
Radek Iša56ca9e42020-09-08 18:42:00 +02003494 assert_int_equal(yin_parse_submodule(&yin_ctx, UTEST_LYCTX, (struct lys_parser_ctx *)YCTX, in, &submod), LY_EVALID);
3495 CHECK_LOG_CTX("Trailing garbage \"<submodule name...\" after submodule, expected end-of-input.", "Line number 8.");
Michal Vasko5d24f6c2020-10-13 13:49:06 +02003496 lysp_module_free((struct lysp_module *)submod);
David Sedlák6d781b62019-08-02 15:22:52 +02003497 yin_parser_ctx_free(yin_ctx);
Michal Vasko63f3d842020-07-08 10:10:14 +02003498 ly_in_free(in, 0);
David Sedlák6d781b62019-08-02 15:22:52 +02003499 yin_ctx = NULL;
3500 submod = NULL;
David Sedlák8985a142019-07-31 16:43:06 +02003501}
3502
David Sedlák3b4db242018-10-19 16:11:01 +02003503int
3504main(void)
3505{
3506
3507 const struct CMUnitTest tests[] = {
Radek Iša56ca9e42020-09-08 18:42:00 +02003508 UTEST(test_yin_match_keyword, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003509 UTEST(test_yin_parse_content, setup, teardown),
3510 UTEST(test_validate_value, setup, teardown),
Michal Vasko12ef5362022-09-16 15:13:58 +02003511 UTEST(test_valid_module),
3512 UTEST(test_print_module),
3513 UTEST(test_print_submodule),
David Sedlák32488102019-07-15 17:44:10 +02003514
Radek Iša56ca9e42020-09-08 18:42:00 +02003515 UTEST(test_yin_match_argument_name),
3516 cmocka_unit_test_setup_teardown(test_enum_elem, setup, teardown),
3517 cmocka_unit_test_setup_teardown(test_bit_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003518 cmocka_unit_test_setup_teardown(test_status_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003519 cmocka_unit_test_setup_teardown(test_yin_element_elem, setup, teardown),
3520 cmocka_unit_test_setup_teardown(test_yangversion_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003521 cmocka_unit_test_setup_teardown(test_argument_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003522 cmocka_unit_test_setup_teardown(test_belongsto_elem, setup, teardown),
3523 cmocka_unit_test_setup_teardown(test_config_elem, setup, teardown),
3524 cmocka_unit_test_setup_teardown(test_default_elem, setup, teardown),
3525 cmocka_unit_test_setup_teardown(test_err_app_tag_elem, setup, teardown),
3526 cmocka_unit_test_setup_teardown(test_err_msg_elem, setup, teardown),
3527 cmocka_unit_test_setup_teardown(test_fracdigits_elem, setup, teardown),
3528 cmocka_unit_test_setup_teardown(test_iffeature_elem, setup, teardown),
3529 cmocka_unit_test_setup_teardown(test_length_elem, setup, teardown),
3530 cmocka_unit_test_setup_teardown(test_modifier_elem, setup, teardown),
3531 cmocka_unit_test_setup_teardown(test_namespace_elem, setup, teardown),
3532 cmocka_unit_test_setup_teardown(test_pattern_elem, setup, teardown),
3533 cmocka_unit_test_setup_teardown(test_value_position_elem, setup, teardown),
3534 cmocka_unit_test_setup_teardown(test_prefix_elem, setup, teardown),
3535 cmocka_unit_test_setup_teardown(test_range_elem, setup, teardown),
3536 cmocka_unit_test_setup_teardown(test_reqinstance_elem, setup, teardown),
3537 cmocka_unit_test_setup_teardown(test_revision_date_elem, setup, teardown),
3538 cmocka_unit_test_setup_teardown(test_unique_elem, setup, teardown),
3539 cmocka_unit_test_setup_teardown(test_units_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003540 cmocka_unit_test_setup_teardown(test_yin_text_value_elem, setup, teardown),
3541 cmocka_unit_test_setup_teardown(test_type_elem, setup, teardown),
3542 cmocka_unit_test_setup_teardown(test_max_elems_elem, setup, teardown),
3543 cmocka_unit_test_setup_teardown(test_min_elems_elem, setup, teardown),
3544 cmocka_unit_test_setup_teardown(test_ordby_elem, setup, teardown),
3545 cmocka_unit_test_setup_teardown(test_any_elem, setup, teardown),
3546 cmocka_unit_test_setup_teardown(test_leaf_elem, setup, teardown),
3547 cmocka_unit_test_setup_teardown(test_leaf_list_elem, setup, teardown),
3548 cmocka_unit_test_setup_teardown(test_presence_elem, setup, teardown),
3549 cmocka_unit_test_setup_teardown(test_key_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003550 cmocka_unit_test_setup_teardown(test_uses_elem, setup, teardown),
Radek Iša56ca9e42020-09-08 18:42:00 +02003551 cmocka_unit_test_setup_teardown(test_list_elem, setup, teardown),
3552 cmocka_unit_test_setup_teardown(test_notification_elem, setup, teardown),
3553 cmocka_unit_test_setup_teardown(test_grouping_elem, setup, teardown),
3554 cmocka_unit_test_setup_teardown(test_container_elem, setup, teardown),
3555 cmocka_unit_test_setup_teardown(test_case_elem, setup, teardown),
3556 cmocka_unit_test_setup_teardown(test_choice_elem, setup, teardown),
3557 cmocka_unit_test_setup_teardown(test_inout_elem, setup, teardown),
3558 cmocka_unit_test_setup_teardown(test_action_elem, setup, teardown),
3559 cmocka_unit_test_setup_teardown(test_augment_elem, setup, teardown),
3560 cmocka_unit_test_setup_teardown(test_deviate_elem, setup, teardown),
3561 cmocka_unit_test_setup_teardown(test_deviation_elem, setup, teardown),
3562 cmocka_unit_test_setup_teardown(test_module_elem, setup, teardown),
3563 cmocka_unit_test_setup_teardown(test_submodule_elem, setup, teardown),
David Sedlák8985a142019-07-31 16:43:06 +02003564
Radek Iša56ca9e42020-09-08 18:42:00 +02003565 cmocka_unit_test_setup_teardown(test_yin_parse_module, setup, teardown),
3566 cmocka_unit_test_setup_teardown(test_yin_parse_submodule, setup, teardown),
David Sedlák3b4db242018-10-19 16:11:01 +02003567 };
3568
Radek Iša56ca9e42020-09-08 18:42:00 +02003569 return cmocka_run_group_tests(tests, NULL, NULL);
David Sedlák3b4db242018-10-19 16:11:01 +02003570}