blob: 29ba61d086ddc4ccf266aa715b1160ce662948e6 [file] [log] [blame]
Radek Krejcidd4e8d42018-10-16 14:55:43 +02001/*
2 * @file test_parser_yang.c
3 * @author: Radek Krejci <rkrejci@cesnet.cz>
4 * @brief unit tests for functions from parser_yang.c
5 *
6 * Copyright (c) 2018 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14
Radek Krejci86d106e2018-10-18 09:53:19 +020015#include "../../src/tree_schema.c"
16#include "../../src/parser_yang.c"
17
Radek Krejcidd4e8d42018-10-16 14:55:43 +020018#include <stdarg.h>
19#include <stddef.h>
20#include <setjmp.h>
21#include <cmocka.h>
22
23#include <stdio.h>
24#include <string.h>
25
26#include "libyang.h"
Radek Krejcidd4e8d42018-10-16 14:55:43 +020027
28#define BUFSIZE 1024
29char logbuf[BUFSIZE] = {0};
30
31/* set to 0 to printing error messages to stderr instead of checking them in code */
32#define ENABLE_LOGGER_CHECKING 1
33
34#if ENABLE_LOGGER_CHECKING
35static void
36logger(LY_LOG_LEVEL level, const char *msg, const char *path)
37{
38 (void) level; /* unused */
39
Radek Krejci87616bb2018-10-31 13:30:52 +010040 if (path && path[0]) {
Radek Krejcidd4e8d42018-10-16 14:55:43 +020041 snprintf(logbuf, BUFSIZE - 1, "%s %s", msg, path);
42 } else {
43 strncpy(logbuf, msg, BUFSIZE - 1);
44 }
45}
46#endif
47
48static int
49logger_setup(void **state)
50{
51 (void) state; /* unused */
52#if ENABLE_LOGGER_CHECKING
53 ly_set_log_clb(logger, 1);
54#endif
55 return 0;
56}
57
58void
59logbuf_clean(void)
60{
61 logbuf[0] = '\0';
62}
63
64#if ENABLE_LOGGER_CHECKING
65# define logbuf_assert(str) assert_string_equal(logbuf, str)
66#else
67# define logbuf_assert(str)
68#endif
69
70static void
71test_module(void **state)
72{
73 (void) state; /* unused */
74
75 const char *str;
Radek Krejci313d9902018-11-08 09:42:58 +010076 struct ly_parser_ctx ctx = {0};
Radek Krejcidd4e8d42018-10-16 14:55:43 +020077 struct lys_module mod = {0};
Radek Krejci151a5b72018-10-19 14:21:44 +020078 struct lysc_feature *f;
79 struct lysc_iffeature *iff;
Radek Krejcidd4e8d42018-10-16 14:55:43 +020080
81 str = "module test {namespace urn:test; prefix t;"
Radek Krejci151a5b72018-10-19 14:21:44 +020082 "feature f1;feature f2 {if-feature f1;}}";
Radek Krejci313d9902018-11-08 09:42:58 +010083 assert_int_equal(LY_SUCCESS, ly_ctx_new(NULL, 0, &ctx.ctx));
Radek Krejcidd4e8d42018-10-16 14:55:43 +020084
Radek Krejcif8f882a2018-10-31 14:51:15 +010085 assert_int_equal(LY_EINVAL, lys_compile(NULL, 0));
86 logbuf_assert("Invalid argument mod (lys_compile()).");
87 assert_int_equal(LY_EINVAL, lys_compile(&mod, 0));
88 logbuf_assert("Invalid argument mod->parsed (lys_compile()).");
Radek Krejci313d9902018-11-08 09:42:58 +010089 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, str, &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +010090 assert_int_equal(LY_SUCCESS, lys_compile(&mod, 0));
Radek Krejcidd4e8d42018-10-16 14:55:43 +020091 assert_non_null(mod.compiled);
92 assert_ptr_equal(mod.parsed->name, mod.compiled->name);
93 assert_ptr_equal(mod.parsed->ns, mod.compiled->ns);
Radek Krejci151a5b72018-10-19 14:21:44 +020094 /* features */
95 assert_non_null(mod.compiled->features);
96 assert_int_equal(2, LY_ARRAY_SIZE(mod.compiled->features));
Radek Krejci2c4e7172018-10-19 15:56:26 +020097 f = &mod.compiled->features[1];
Radek Krejci151a5b72018-10-19 14:21:44 +020098 assert_non_null(f->iffeatures);
99 assert_int_equal(1, LY_ARRAY_SIZE(f->iffeatures));
Radek Krejci2c4e7172018-10-19 15:56:26 +0200100 iff = &f->iffeatures[0];
Radek Krejci151a5b72018-10-19 14:21:44 +0200101 assert_non_null(iff->expr);
102 assert_non_null(iff->features);
103 assert_int_equal(1, LY_ARRAY_SIZE(iff->features));
Radek Krejci2c4e7172018-10-19 15:56:26 +0200104 assert_ptr_equal(&mod.compiled->features[0], iff->features[0]);
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200105
Radek Krejci86d106e2018-10-18 09:53:19 +0200106 lysc_module_free(mod.compiled, NULL);
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200107
Radek Krejcif8f882a2018-10-31 14:51:15 +0100108 assert_int_equal(LY_SUCCESS, lys_compile(&mod, LYSC_OPT_FREE_SP));
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200109 assert_non_null(mod.compiled);
110 assert_string_equal("test", mod.compiled->name);
111 assert_string_equal("urn:test", mod.compiled->ns);
112
Radek Krejci86d106e2018-10-18 09:53:19 +0200113 lysc_module_free(mod.compiled, NULL);
114 mod.compiled = NULL;
115
Radek Krejci151a5b72018-10-19 14:21:44 +0200116 /* submodules cannot be compiled directly */
Radek Krejci86d106e2018-10-18 09:53:19 +0200117 str = "submodule test {belongs-to xxx {prefix x;}}";
Radek Krejci313d9902018-11-08 09:42:58 +0100118 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, str, &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100119 assert_int_equal(LY_EINVAL, lys_compile(&mod, 0));
Radek Krejci86d106e2018-10-18 09:53:19 +0200120 logbuf_assert("Submodules (test) are not supposed to be compiled, compile only the main modules.");
121 assert_null(mod.compiled);
122
123 lysp_module_free(mod.parsed);
Radek Krejci313d9902018-11-08 09:42:58 +0100124 ly_ctx_destroy(ctx.ctx, NULL);
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200125}
126
Radek Krejci151a5b72018-10-19 14:21:44 +0200127static void
128test_feature(void **state)
129{
130 (void) state; /* unused */
131
Radek Krejci313d9902018-11-08 09:42:58 +0100132 struct ly_parser_ctx ctx = {0};
Radek Krejci1aefdf72018-11-01 11:01:39 +0100133 struct lys_module mod = {0}, *modp;
Radek Krejci151a5b72018-10-19 14:21:44 +0200134 const char *str;
135 struct lysc_feature *f, *f1;
136
137 str = "module a {namespace urn:a;prefix a;yang-version 1.1;\n"
138 "feature f1 {description test1;reference test2;status current;} feature f2; feature f3;\n"
Radek Krejci87616bb2018-10-31 13:30:52 +0100139 "feature orfeature {if-feature \"f1 or f2\";}\n"
140 "feature andfeature {if-feature \"f1 and f2\";}\n"
Radek Krejci151a5b72018-10-19 14:21:44 +0200141 "feature f6 {if-feature \"not f1\";}\n"
Radek Krejcidde18c52018-10-24 14:43:04 +0200142 "feature f7 {if-feature \"(f2 and f3) or (not f1)\";}\n"
Radek Krejci87616bb2018-10-31 13:30:52 +0100143 "feature f8 {if-feature \"f1 or f2 or f3 or orfeature or andfeature\";}\n"
144 "feature f9 {if-feature \"not not f1\";}}";
Radek Krejci151a5b72018-10-19 14:21:44 +0200145
Radek Krejci313d9902018-11-08 09:42:58 +0100146 assert_int_equal(LY_SUCCESS, ly_ctx_new(NULL, 0, &ctx.ctx));
147 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, str, &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100148 assert_int_equal(LY_SUCCESS, lys_compile(&mod, 0));
Radek Krejci151a5b72018-10-19 14:21:44 +0200149 assert_non_null(mod.compiled);
150 assert_non_null(mod.compiled->features);
Radek Krejci87616bb2018-10-31 13:30:52 +0100151 assert_int_equal(9, LY_ARRAY_SIZE(mod.compiled->features));
Radek Krejci151a5b72018-10-19 14:21:44 +0200152 /* all features are disabled by default */
153 LY_ARRAY_FOR(mod.compiled->features, struct lysc_feature, f) {
154 assert_int_equal(0, lysc_feature_value(f));
155 }
156 /* enable f1 */
157 assert_int_equal(LY_SUCCESS, lys_feature_enable(&mod, "f1"));
Radek Krejci2c4e7172018-10-19 15:56:26 +0200158 f1 = &mod.compiled->features[0];
Radek Krejci151a5b72018-10-19 14:21:44 +0200159 assert_int_equal(1, lysc_feature_value(f1));
160
Radek Krejci87616bb2018-10-31 13:30:52 +0100161 /* enable orfeature */
Radek Krejci2c4e7172018-10-19 15:56:26 +0200162 f = &mod.compiled->features[3];
Radek Krejci151a5b72018-10-19 14:21:44 +0200163 assert_int_equal(0, lysc_feature_value(f));
Radek Krejci87616bb2018-10-31 13:30:52 +0100164 assert_int_equal(LY_SUCCESS, lys_feature_enable(&mod, "orfeature"));
Radek Krejci151a5b72018-10-19 14:21:44 +0200165 assert_int_equal(1, lysc_feature_value(f));
166
Radek Krejci87616bb2018-10-31 13:30:52 +0100167 /* enable andfeature - no possible since f2 is disabled */
Radek Krejci2c4e7172018-10-19 15:56:26 +0200168 f = &mod.compiled->features[4];
Radek Krejci151a5b72018-10-19 14:21:44 +0200169 assert_int_equal(0, lysc_feature_value(f));
Radek Krejci87616bb2018-10-31 13:30:52 +0100170 assert_int_equal(LY_EDENIED, lys_feature_enable(&mod, "andfeature"));
171 logbuf_assert("Feature \"andfeature\" cannot be enabled since it is disabled by its if-feature condition(s).");
Radek Krejci151a5b72018-10-19 14:21:44 +0200172 assert_int_equal(0, lysc_feature_value(f));
173
174 /* first enable f2, so f5 can be enabled then */
175 assert_int_equal(LY_SUCCESS, lys_feature_enable(&mod, "f2"));
Radek Krejci87616bb2018-10-31 13:30:52 +0100176 assert_int_equal(LY_SUCCESS, lys_feature_enable(&mod, "andfeature"));
Radek Krejci151a5b72018-10-19 14:21:44 +0200177 assert_int_equal(1, lysc_feature_value(f));
178
179 /* f1 is enabled, so f6 cannot be enabled */
Radek Krejci2c4e7172018-10-19 15:56:26 +0200180 f = &mod.compiled->features[5];
Radek Krejci151a5b72018-10-19 14:21:44 +0200181 assert_int_equal(0, lysc_feature_value(f));
182 assert_int_equal(LY_EDENIED, lys_feature_enable(&mod, "f6"));
183 logbuf_assert("Feature \"f6\" cannot be enabled since it is disabled by its if-feature condition(s).");
184 assert_int_equal(0, lysc_feature_value(f));
185
Radek Krejci87616bb2018-10-31 13:30:52 +0100186 /* so disable f1 - andfeature will became also disabled */
Radek Krejci151a5b72018-10-19 14:21:44 +0200187 assert_int_equal(1, lysc_feature_value(f1));
Radek Krejci151a5b72018-10-19 14:21:44 +0200188 assert_int_equal(LY_SUCCESS, lys_feature_disable(&mod, "f1"));
189 assert_int_equal(0, lysc_feature_value(f1));
Radek Krejci2c4e7172018-10-19 15:56:26 +0200190 assert_int_equal(0, lysc_feature_value(&mod.compiled->features[4]));
Radek Krejci87616bb2018-10-31 13:30:52 +0100191 /* while orfeature is stille enabled */
Radek Krejci2c4e7172018-10-19 15:56:26 +0200192 assert_int_equal(1, lysc_feature_value(&mod.compiled->features[3]));
Radek Krejci151a5b72018-10-19 14:21:44 +0200193 /* and finally f6 can be enabled */
Radek Krejci151a5b72018-10-19 14:21:44 +0200194 assert_int_equal(LY_SUCCESS, lys_feature_enable(&mod, "f6"));
Radek Krejci2c4e7172018-10-19 15:56:26 +0200195 assert_int_equal(1, lysc_feature_value(&mod.compiled->features[5]));
Radek Krejci151a5b72018-10-19 14:21:44 +0200196
197 /* complex evaluation of f7: f1 and f3 are disabled, while f2 is enabled */
Radek Krejci2c4e7172018-10-19 15:56:26 +0200198 assert_int_equal(1, lysc_iffeature_value(&mod.compiled->features[6].iffeatures[0]));
Radek Krejcidde18c52018-10-24 14:43:04 +0200199 /* long evaluation of f8 to need to reallocate internal stack for operators */
200 assert_int_equal(1, lysc_iffeature_value(&mod.compiled->features[7].iffeatures[0]));
Radek Krejci151a5b72018-10-19 14:21:44 +0200201
Radek Krejci87616bb2018-10-31 13:30:52 +0100202 /* double negation of disabled f1 -> disabled */
203 assert_int_equal(0, lysc_iffeature_value(&mod.compiled->features[8].iffeatures[0]));
204
Radek Krejci38920282018-11-01 09:24:16 +0100205 /* disable all features */
206 assert_int_equal(LY_SUCCESS, lys_feature_disable(&mod, "*"));
207 LY_ARRAY_FOR(mod.compiled->features, struct lysc_feature, f) {
208 assert_int_equal(0, lys_feature_value(&mod, f->name));
209 }
210 /* re-setting already set feature */
211 assert_int_equal(LY_SUCCESS, lys_feature_disable(&mod, "f1"));
212 assert_int_equal(0, lys_feature_value(&mod, "f1"));
213
214 /* enabling feature that cannot be enabled due to its if-features */
Radek Krejci1aefdf72018-11-01 11:01:39 +0100215 assert_int_equal(LY_SUCCESS, lys_feature_enable(&mod, "f1"));
216 assert_int_equal(LY_EDENIED, lys_feature_enable(&mod, "andfeature"));
217 logbuf_assert("Feature \"andfeature\" cannot be enabled since it is disabled by its if-feature condition(s).");
Radek Krejcica3db002018-11-01 10:31:01 +0100218 assert_int_equal(LY_EDENIED, lys_feature_enable(&mod, "*"));
219 logbuf_assert("Feature \"f6\" cannot be enabled since it is disabled by its if-feature condition(s).");
Radek Krejci1aefdf72018-11-01 11:01:39 +0100220 /* test if not changed */
221 assert_int_equal(1, lys_feature_value(&mod, "f1"));
222 assert_int_equal(0, lys_feature_value(&mod, "f2"));
Radek Krejci38920282018-11-01 09:24:16 +0100223
Radek Krejci1aefdf72018-11-01 11:01:39 +0100224 /* invalid reference */
Radek Krejci38920282018-11-01 09:24:16 +0100225 assert_int_equal(LY_EINVAL, lys_feature_enable(&mod, "xxx"));
226 logbuf_assert("Feature \"xxx\" not found in module \"a\".");
227
Radek Krejci151a5b72018-10-19 14:21:44 +0200228 lysc_module_free(mod.compiled, NULL);
229 lysp_module_free(mod.parsed);
Radek Krejci87616bb2018-10-31 13:30:52 +0100230
231 /* some invalid expressions */
Radek Krejci313d9902018-11-08 09:42:58 +0100232 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{yang-version 1.1;namespace urn:b; prefix b; feature f{if-feature f1;}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100233 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100234 logbuf_assert("Invalid value \"f1\" of if-feature - unable to find feature \"f1\".");
235 lysp_module_free(mod.parsed);
236
Radek Krejci313d9902018-11-08 09:42:58 +0100237 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{yang-version 1.1;namespace urn:b; prefix b; feature f1; feature f2{if-feature 'f and';}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100238 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100239 logbuf_assert("Invalid value \"f and\" of if-feature - unexpected end of expression.");
240 lysp_module_free(mod.parsed);
241
Radek Krejci313d9902018-11-08 09:42:58 +0100242 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{yang-version 1.1;namespace urn:b; prefix b; feature f{if-feature 'or';}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100243 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100244 logbuf_assert("Invalid value \"or\" of if-feature - unexpected end of expression.");
245 lysp_module_free(mod.parsed);
246
Radek Krejci313d9902018-11-08 09:42:58 +0100247 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{yang-version 1.1;namespace urn:b; prefix b; feature f1; feature f2{if-feature '(f1';}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100248 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100249 logbuf_assert("Invalid value \"(f1\" of if-feature - non-matching opening and closing parentheses.");
250 lysp_module_free(mod.parsed);
251
Radek Krejci313d9902018-11-08 09:42:58 +0100252 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{yang-version 1.1;namespace urn:b; prefix b; feature f1; feature f2{if-feature 'f1)';}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100253 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100254 logbuf_assert("Invalid value \"f1)\" of if-feature - non-matching opening and closing parentheses.");
255 lysp_module_free(mod.parsed);
256
Radek Krejci313d9902018-11-08 09:42:58 +0100257 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{yang-version 1.1;namespace urn:b; prefix b; feature f1; feature f2{if-feature ---;}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100258 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100259 logbuf_assert("Invalid value \"---\" of if-feature - unable to find feature \"---\".");
260 lysp_module_free(mod.parsed);
261
Radek Krejci313d9902018-11-08 09:42:58 +0100262 assert_int_equal(LY_SUCCESS, yang_parse(&ctx, "module b{namespace urn:b; prefix b; feature f1; feature f2{if-feature 'not f1';}}", &mod.parsed));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100263 assert_int_equal(LY_EVALID, lys_compile(&mod, 0));
Radek Krejci87616bb2018-10-31 13:30:52 +0100264 logbuf_assert("Invalid value \"not f1\" of if-feature - YANG 1.1 expression in YANG 1.0 module.");
265 lysp_module_free(mod.parsed);
266
Radek Krejci1aefdf72018-11-01 11:01:39 +0100267 /* import reference */
Radek Krejci313d9902018-11-08 09:42:58 +0100268 assert_non_null(modp = lys_parse_mem(ctx.ctx, str, LYS_IN_YANG));
Radek Krejci1aefdf72018-11-01 11:01:39 +0100269 assert_int_equal(LY_SUCCESS, lys_compile(modp, 0));
270 assert_int_equal(LY_SUCCESS, lys_feature_enable(modp, "f1"));
Radek Krejci313d9902018-11-08 09:42:58 +0100271 assert_non_null(modp = lys_parse_mem(ctx.ctx, "module b{namespace urn:b; prefix b; import a {prefix a;} feature f1; feature f2{if-feature 'a:f1';}}", LYS_IN_YANG));
Radek Krejci1aefdf72018-11-01 11:01:39 +0100272 assert_int_equal(LY_SUCCESS, lys_compile(modp, 0));
273 assert_int_equal(LY_SUCCESS, lys_feature_enable(modp, "f2"));
274 assert_int_equal(0, lys_feature_value(modp, "f1"));
275 assert_int_equal(1, lys_feature_value(modp, "f2"));
276
Radek Krejci313d9902018-11-08 09:42:58 +0100277 ly_ctx_destroy(ctx.ctx, NULL);
Radek Krejci151a5b72018-10-19 14:21:44 +0200278}
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200279
Radek Krejci478020e2018-10-30 16:02:14 +0100280static void
281test_identity(void **state)
282{
283 (void) state; /* unused */
284
285 struct ly_ctx *ctx;
Radek Krejci1aefdf72018-11-01 11:01:39 +0100286 struct lys_module *mod1, *mod2;
Radek Krejci478020e2018-10-30 16:02:14 +0100287 const char *mod1_str = "module a {namespace urn:a;prefix a; identity a1;}";
288 const char *mod2_str = "module b {namespace urn:b;prefix b; import a {prefix a;}identity b1; identity b2; identity b3 {base b1; base b:b2; base a:a1;} identity b4 {base b:b1; base b3;}}";
289
290 assert_int_equal(LY_SUCCESS, ly_ctx_new(NULL, LY_CTX_DISABLE_SEARCHDIRS, &ctx));
291 assert_non_null(mod1 = lys_parse_mem(ctx, mod1_str, LYS_IN_YANG));
292 assert_non_null(mod2 = lys_parse_mem(ctx, mod2_str, LYS_IN_YANG));
Radek Krejcif8f882a2018-10-31 14:51:15 +0100293 assert_int_equal(LY_SUCCESS, lys_compile(mod2, 0));
Radek Krejci478020e2018-10-30 16:02:14 +0100294
295 assert_non_null(mod1->compiled);
296 assert_non_null(mod1->compiled->identities);
297 assert_non_null(mod2->compiled);
298 assert_non_null(mod2->compiled->identities);
299
300 assert_non_null(mod1->compiled->identities[0].derived);
301 assert_int_equal(1, LY_ARRAY_SIZE(mod1->compiled->identities[0].derived));
302 assert_ptr_equal(mod1->compiled->identities[0].derived[0], &mod2->compiled->identities[2]);
303 assert_non_null(mod2->compiled->identities[0].derived);
304 assert_int_equal(2, LY_ARRAY_SIZE(mod2->compiled->identities[0].derived));
305 assert_ptr_equal(mod2->compiled->identities[0].derived[0], &mod2->compiled->identities[2]);
306 assert_ptr_equal(mod2->compiled->identities[0].derived[1], &mod2->compiled->identities[3]);
307 assert_non_null(mod2->compiled->identities[1].derived);
308 assert_int_equal(1, LY_ARRAY_SIZE(mod2->compiled->identities[1].derived));
309 assert_ptr_equal(mod2->compiled->identities[1].derived[0], &mod2->compiled->identities[2]);
310 assert_non_null(mod2->compiled->identities[2].derived);
311 assert_int_equal(1, LY_ARRAY_SIZE(mod2->compiled->identities[2].derived));
312 assert_ptr_equal(mod2->compiled->identities[2].derived[0], &mod2->compiled->identities[3]);
313
Radek Krejci478020e2018-10-30 16:02:14 +0100314 ly_ctx_destroy(ctx, NULL);
315}
316
Radek Krejcibd8d9ba2018-11-02 16:06:26 +0100317static void
318test_node_container(void **state)
319{
320 (void) state; /* unused */
321
322 struct ly_ctx *ctx;
323 struct lys_module *mod;
324 struct lysc_node_container *cont;
325
326 assert_int_equal(LY_SUCCESS, ly_ctx_new(NULL, LY_CTX_DISABLE_SEARCHDIRS, &ctx));
327 assert_non_null(mod = lys_parse_mem(ctx, "module a {namespace urn:a;prefix a;container c;}", LYS_IN_YANG));
328 assert_int_equal(LY_SUCCESS, lys_compile(mod, 0));
329 assert_non_null(mod->compiled);
330 assert_non_null((cont = (struct lysc_node_container*)mod->compiled->data));
331 assert_int_equal(LYS_CONTAINER, cont->nodetype);
332 assert_string_equal("c", cont->name);
333 assert_true(cont->flags & LYS_CONFIG_W);
334 assert_true(cont->flags & LYS_STATUS_CURR);
335
Radek Krejci98094b32018-11-02 16:21:47 +0100336 assert_non_null(mod = lys_parse_mem(ctx, "module b {namespace urn:b;prefix b;container c {config false; status deprecated; container child;}}", LYS_IN_YANG));
Radek Krejcibd8d9ba2018-11-02 16:06:26 +0100337 assert_int_equal(LY_SUCCESS, lys_compile(mod, 0));
Radek Krejci98094b32018-11-02 16:21:47 +0100338 logbuf_assert("Missing explicit \"deprecated\" status that was already specified in parent, inheriting.");
Radek Krejcibd8d9ba2018-11-02 16:06:26 +0100339 assert_non_null(mod->compiled);
340 assert_non_null((cont = (struct lysc_node_container*)mod->compiled->data));
341 assert_true(cont->flags & LYS_CONFIG_R);
Radek Krejci98094b32018-11-02 16:21:47 +0100342 assert_true(cont->flags & LYS_STATUS_DEPRC);
Radek Krejcibd8d9ba2018-11-02 16:06:26 +0100343 assert_non_null((cont = (struct lysc_node_container*)cont->child));
344 assert_int_equal(LYS_CONTAINER, cont->nodetype);
345 assert_true(cont->flags & LYS_CONFIG_R);
Radek Krejci98094b32018-11-02 16:21:47 +0100346 assert_true(cont->flags & LYS_STATUS_DEPRC);
Radek Krejcibd8d9ba2018-11-02 16:06:26 +0100347 assert_string_equal("child", cont->name);
348
349 ly_ctx_destroy(ctx, NULL);
350}
351
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200352int main(void)
353{
354 const struct CMUnitTest tests[] = {
355 cmocka_unit_test_setup(test_module, logger_setup),
Radek Krejci151a5b72018-10-19 14:21:44 +0200356 cmocka_unit_test_setup(test_feature, logger_setup),
Radek Krejci478020e2018-10-30 16:02:14 +0100357 cmocka_unit_test_setup(test_identity, logger_setup),
Radek Krejcibd8d9ba2018-11-02 16:06:26 +0100358 cmocka_unit_test_setup(test_node_container, logger_setup),
Radek Krejcidd4e8d42018-10-16 14:55:43 +0200359 };
360
361 return cmocka_run_group_tests(tests, NULL, NULL);
362}