| /** |
| * \file test_extensions.c |
| * \author Radek Krejci <rkrejci@cesnet.cz> |
| * \brief libyang tests - extensions |
| * |
| * Copyright (c) 2016 CESNET, z.s.p.o. |
| * |
| * This source code is licensed under BSD 3-Clause License (the "License"). |
| * You may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * https://opensource.org/licenses/BSD-3-Clause |
| */ |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <pthread.h> |
| #include <setjmp.h> |
| #include <stdarg.h> |
| #include <stddef.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| |
| #include <cmocka.h> |
| |
| #include "libyang.h" |
| #include "tests/config.h" |
| |
| #define SCHEMA_FOLDER_YIN TESTS_DIR"/schema/yin/files" |
| #define SCHEMA_FOLDER_YANG TESTS_DIR"/schema/yang/files" |
| |
| struct state { |
| struct ly_ctx *ctx; |
| int fd; |
| char *str1; |
| char *str2; |
| }; |
| |
| static int |
| setup_ctx(void **state, const char *searchdir) |
| { |
| struct state *st; |
| |
| (*state) = st = calloc(1, sizeof *st); |
| if (!st) { |
| fprintf(stderr, "Memory allocation error"); |
| return -1; |
| } |
| |
| /* libyang context */ |
| st->ctx = ly_ctx_new(searchdir, 0); |
| if (!st->ctx) { |
| fprintf(stderr, "Failed to create context.\n"); |
| goto error; |
| } |
| |
| st->fd = -1; |
| |
| return 0; |
| |
| error: |
| ly_ctx_destroy(st->ctx, NULL); |
| free(st); |
| (*state) = NULL; |
| |
| return -1; |
| } |
| |
| static int |
| setup_ctx_yin(void **state) |
| { |
| return setup_ctx(state, SCHEMA_FOLDER_YIN); |
| } |
| |
| static int |
| setup_ctx_yang(void **state) |
| { |
| return setup_ctx(state, SCHEMA_FOLDER_YANG); |
| } |
| |
| static int |
| teardown_ctx(void **state) |
| { |
| struct state *st = (*state); |
| |
| ly_ctx_destroy(st->ctx, NULL); |
| if (st->fd >= 0) { |
| close(st->fd); |
| } |
| free(st->str1); |
| free(st->str2); |
| free(st); |
| (*state) = NULL; |
| |
| return 0; |
| } |
| |
| static void |
| test_module_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </yang-version>\n <namespace uri=\"urn:ext\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </namespace>\n <prefix value=\"x\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </prefix>\n" |
| " <import module=\"ext-def\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <prefix value=\"e\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </prefix>\n <revision-date date=\"2017-01-18\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </revision-date>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </import>\n" |
| " <include module=\"ext-inc\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <revision-date date=\"2017-01-18\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </revision-date>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </include>\n" |
| " <revision date=\"2017-01-20\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </revision>\n <revision date=\"2017-01-18\">\n" |
| " <e:a/>\n" |
| " </revision>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| "</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_module_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n namespace \"urn:ext\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n prefix x {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n\n" |
| " import ext-def {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " prefix e {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n revision-date 2017-01-18 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " include ext-inc {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " revision-date 2017-01-18 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " revision 2017-01-20 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " revision 2017-01-18 {\n" |
| " e:a;\n" |
| " }\n\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_container_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <container name=\"c\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <presence value=\"test\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </presence>\n" |
| " <config value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </container>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_container_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " namespace \"urn:ext\";\n prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " container c {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " presence \"test\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n config false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_leaf_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <typedef name=\"length\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <type name=\"int32\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </type>\n" |
| " <units name=\"meter\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </units>\n" |
| " <default value=\"10\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </typedef>\n" |
| " <leaf name=\"l\">\n" |
| " <type name=\"string\">\n" |
| " <pattern value=\"[a-z]\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <modifier value=\"invert-match\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </modifier>\n <error-message>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value>emsg</value>\n" |
| " </error-message>\n <error-app-tag value=\"eapptag\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </error-app-tag>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </pattern>\n" |
| " </type>\n" |
| " <units name=\"petipivo\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </units>\n" |
| " <must condition=\"true()\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <error-message>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value>emsg</value>\n" |
| " </error-message>\n <error-app-tag value=\"eapptag\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </error-app-tag>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </must>\n" |
| " <config value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <mandatory value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </mandatory>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </leaf>\n <leaf name=\"d\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <type name=\"length\"/>\n" |
| " <default value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " </leaf>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_leaf_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " typedef length {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " type int32 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n units \"meter\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n default \"10\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " leaf l {\n type string {\n" |
| " pattern \"[a-z]\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " modifier invert-match {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-message\n \"emsg\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-app-tag \"eapptag\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n" |
| " units \"petipivo\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n must \"true()\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " error-message\n \"emsg\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-app-tag \"eapptag\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n config false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n mandatory true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " leaf d {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " type int8;\n default \"1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_leaflist_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <feature name=\"f1\"/>\n <feature name=\"f\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <if-feature name=\"f1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </if-feature>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </feature>\n" |
| " <leaf-list name=\"l1\">\n" |
| " <when condition=\"true()\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </when>\n <if-feature name=\"f\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </if-feature>\n <type name=\"string\">\n" |
| " <length value=\"5\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <error-message>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value>emsg</value>\n" |
| " </error-message>\n <error-app-tag value=\"eapptag\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </error-app-tag>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </length>\n" |
| " </type>\n" |
| " <units name=\"petipivo\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </units>\n" |
| " <must condition=\"true()\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <error-message>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value>emsg</value>\n" |
| " </error-message>\n <error-app-tag value=\"eapptag\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </error-app-tag>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </must>\n" |
| " <config value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <min-elements value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </min-elements>\n" |
| " <max-elements value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </max-elements>\n" |
| " <ordered-by value=\"user\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </ordered-by>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </leaf-list>\n" |
| " <leaf-list name=\"l2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <type name=\"int8\">\n" |
| " <range value=\"1..10\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <error-message>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value>emsg</value>\n" |
| " </error-message>\n <error-app-tag value=\"eapptag\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </error-app-tag>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </range>\n" |
| " </type>\n" |
| " <default value=\"1\"/>\n <default value=\"2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " </leaf-list>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_leaflist_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " feature f1;\n\n feature f {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " if-feature \"f1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " leaf-list l1 {\n" |
| " when \"true()\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n if-feature \"f\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n type string {\n length \"5\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " error-message\n \"emsg\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-app-tag \"eapptag\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n" |
| " units \"petipivo\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n must \"true()\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " error-message\n \"emsg\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-app-tag \"eapptag\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n config true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n min-elements 1 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n max-elements 1 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n ordered-by user {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " leaf-list l2 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " type int8 {\n range \"1..10\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " error-message\n \"emsg\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-app-tag \"eapptag\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n" |
| " default \"1\";\n" |
| " default \"2\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_list_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <list name=\"l\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <key value=\"id\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </key>\n" |
| " <unique tag=\"val1\"/>\n <unique tag=\"val2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </unique>\n" |
| " <config value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <min-elements value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </min-elements>\n" |
| " <max-elements value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </max-elements>\n" |
| " <ordered-by value=\"user\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </ordered-by>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <leaf name=\"id\">\n" |
| " <type name=\"instance-identifier\">\n" |
| " <e:a/>\n" |
| " <require-instance value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </require-instance>\n" |
| " </type>\n" |
| " </leaf>\n" |
| " <leaf name=\"val1\">\n" |
| " <type name=\"decimal64\">\n" |
| " <e:a/>\n" |
| " <fraction-digits value=\"2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </fraction-digits>\n" |
| " </type>\n" |
| " </leaf>\n" |
| " <leaf name=\"val2\">\n" |
| " <type name=\"leafref\">\n" |
| " <e:a/>\n" |
| " <path value=\"../val1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </path>\n" |
| " <require-instance value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </require-instance>\n" |
| " </type>\n" |
| " </leaf>\n" |
| " </list>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_list_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " list l {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " key \"id\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n unique \"val1\";\n unique \"val2\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n config true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n min-elements 1 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n max-elements 1 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n ordered-by user {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n leaf id {\n" |
| " type instance-identifier {\n" |
| " e:a;\n" |
| " require-instance true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " }\n\n leaf val1 {\n" |
| " type decimal64 {\n" |
| " e:a;\n" |
| " fraction-digits 2 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " }\n\n leaf val2 {\n" |
| " type leafref {\n" |
| " e:a;\n" |
| " path \"../val1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n require-instance true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_anydata_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <feature name=\"f\"/>\n" |
| " <anyxml name=\"a\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <when condition=\"true()\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </when>\n <if-feature name=\"f\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </if-feature>\n" |
| " <must condition=\"true()\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <error-message>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value>emsg</value>\n" |
| " </error-message>\n <error-app-tag value=\"eapptag\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </error-app-tag>\n <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </must>\n" |
| " <config value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <mandatory value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </mandatory>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </anyxml>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_anydata_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " feature f;\n\n" |
| " anyxml l {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " when \"true()\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n if-feature \"f\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n must \"true()\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " error-message\n \"emsg\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n error-app-tag \"eapptag\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n config true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n mandatory true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_choice_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <choice name=\"ch\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <default value=\"a\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " <config value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <mandatory value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </mandatory>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <case name=\"a\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <leaf name=\"c\">\n" |
| " <type name=\"bits\">\n" |
| " <bit name=\"zero\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <position value=\"0\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </position>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </bit>\n" |
| " <bit name=\"one\">\n <e:a/>\n </bit>\n" |
| " </type>\n" |
| " </leaf>\n" |
| " </case>\n" |
| " <leaf name=\"b\">\n" |
| " <type name=\"enumeration\">\n" |
| " <enum name=\"one\">\n <e:a/>\n </enum>\n" |
| " <enum name=\"two\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <value value=\"2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </value>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </enum>\n" |
| " </type>\n" |
| " </leaf>\n" |
| " </choice>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_choice_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " choice ch {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " default \"a\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n config true {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n mandatory false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n case a {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n leaf c {\n" |
| " type bits {\n" |
| " bit zero {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " position 0 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " bit one {\n" |
| " e:a;\n" |
| " }\n" |
| " }\n" |
| " }\n\n leaf b {\n" |
| " type enumeration {\n" |
| " enum \"one\" {\n" |
| " e:a;\n" |
| " }\n" |
| " enum \"two\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " value 2 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n }\n }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_uses_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <identity name=\"zero\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </identity>\n" |
| " <identity name=\"one\">\n" |
| " <base name=\"zero\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </base>\n" |
| " </identity>\n" |
| " <identity name=\"two\">\n" |
| " <base name=\"zero\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </base>\n" |
| " <base name=\"one\">\n" |
| " <e:a/>\n" |
| " </base>\n" |
| " </identity>\n" |
| " <grouping name=\"grp\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <container name=\"c\">\n <e:a/>\n </container>\n" |
| " <leaf name=\"l\">\n" |
| " <type name=\"identityref\">\n" |
| " <base name=\"two\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </base>\n" |
| " </type>\n" |
| " <mandatory value=\"true\">\n <e:a/>\n </mandatory>\n" |
| " </leaf>\n" |
| " <leaf-list name=\"ll1\">\n" |
| " <type name=\"int8\"/>\n" |
| " <min-elements value=\"2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </min-elements>\n" |
| " </leaf-list>\n" |
| " <leaf-list name=\"ll2\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf-list>\n" |
| " </grouping>\n" |
| " <uses name=\"grp\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <refine target-node=\"c\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <presence value=\"true\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </presence>\n" |
| " <config value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </refine>\n" |
| " <refine target-node=\"l\">\n" |
| " <mandatory value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </mandatory>\n" |
| " </refine>\n" |
| " <refine target-node=\"ll1\">\n" |
| " <min-elements value=\"1\">\n" |
| " <e:a/>\n" |
| " </min-elements>\n" |
| " <max-elements value=\"2\">\n" |
| " <e:b x=\"one\"/>\n" |
| " </max-elements>\n" |
| " </refine>\n" |
| " <refine target-node=\"ll2\">\n" |
| " <e:a/>\n" |
| " <default value=\"1\"/>\n" |
| " <default value=\"2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " </refine>\n" |
| " <augment target-node=\"c\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <leaf name=\"a\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </augment>\n" |
| " </uses>\n" |
| "</module>\n"; |
| struct lys_node *uses; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| |
| /* check applied refine's substatements' extensions */ |
| uses = mod->data->prev; |
| assert_int_equal(uses->nodetype, LYS_USES); |
| |
| assert_int_equal(uses->child->ext_size, 15); /* number of extensions in c */ |
| assert_int_equal(uses->child->next->ext_size, 3); /* number of extensions in l */ |
| assert_int_equal(uses->child->next->next->ext_size, 2); /* number of extensions in ll1 */ |
| assert_int_equal(uses->child->prev->ext_size, 4); /* number of extensions in ll2 */ |
| } |
| |
| static void |
| test_uses_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " identity zero {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " identity one {\n" |
| " base zero {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " identity two {\n" |
| " base zero {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n base one {\n" |
| " e:a;\n" |
| " }\n }\n\n" |
| " grouping grp {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n container c;\n\n" |
| " leaf l {\n" |
| " type identityref {\n" |
| " base two {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " mandatory true {\n" |
| " e:a;\n" |
| " }\n }\n\n" |
| " leaf-list ll1 {\n" |
| " type int8;\n" |
| " }\n\n" |
| " leaf-list ll2 {\n" |
| " type int8;\n" |
| " }\n }\n\n" |
| " uses grp {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n refine \"c\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " presence \"true\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n config false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n refine \"l\" {\n" |
| " mandatory false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n refine \"ll1\" {\n" |
| " min-elements 1 {\n" |
| " e:a;\n" |
| " }\n max-elements 2 {\n" |
| " e:b \"one\";\n" |
| " }\n" |
| " }\n refine \"ll2\" {\n" |
| " e:a;\n" |
| " default \"1\";\n" |
| " default \"2\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n" |
| " }\n augment \"c\" {\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n leaf a {\n" |
| " type int8;\n" |
| " }\n }\n }\n}\n"; |
| struct lys_node *uses; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| |
| /* check applied refine's substatements' extensions */ |
| uses = mod->data->prev; |
| assert_int_equal(uses->nodetype, LYS_USES); |
| |
| assert_int_equal(uses->child->ext_size, 15); /* number of extensions in c */ |
| assert_int_equal(uses->child->next->ext_size, 3); /* number of extensions in l */ |
| assert_int_equal(uses->child->next->next->ext_size, 2); /* number of extensions in ll1 */ |
| assert_int_equal(uses->child->prev->ext_size, 4); /* number of extensions in ll2 */ |
| } |
| |
| static void |
| test_extension_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"x\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <argument name=\"y\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <yin-element value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </yin-element>\n" |
| " </argument>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " </extension>\n" |
| " <e:a>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </e:a>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_extension_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension x {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " argument y {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " yin-element false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " e:a {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_rpc_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <container name=\"c\">\n" |
| " <action name=\"a\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <input>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <leaf name=\"in\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </input>\n" |
| " <output>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <leaf name=\"in\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </output>\n" |
| " </action>\n" |
| " </container>\n" |
| " <rpc name=\"r\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <input>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <leaf name=\"in\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </input>\n" |
| " <output>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <leaf name=\"in\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </output>\n" |
| " </rpc>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_rpc_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " container c {\n" |
| " action a {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n input {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " leaf in {\n" |
| " type int8;\n" |
| " }\n }\n\n" |
| " output {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " leaf out {\n" |
| " type int8;\n" |
| " }\n }\n }\n }\n\n" |
| " rpc r {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n input {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " leaf in {\n" |
| " type int8;\n" |
| " }\n }\n\n" |
| " output {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " leaf out {\n" |
| " type int8;\n" |
| " }\n }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_notif_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <container name=\"c\">\n" |
| " <notification name=\"n-in-c\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <leaf name=\"info\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </notification>\n" |
| " </container>\n" |
| " <notification name=\"n\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <status value=\"current\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </status>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <leaf name=\"info\">\n" |
| " <type name=\"int8\"/>\n" |
| " </leaf>\n" |
| " </notification>\n</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_notif_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " container c {\n" |
| " notification n-in-c {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n leaf out {\n" |
| " type int8;\n" |
| " }\n }\n }\n\n" |
| " notification n {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " status current {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n leaf in {\n" |
| " type int8;\n" |
| " }\n }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_deviation_sub_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod, *dev; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <deviation target-node=\"/e:l1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <description>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>desc</text>\n" |
| " </description>\n" |
| " <reference>\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <text>ref</text>\n" |
| " </reference>\n" |
| " <deviate value=\"not-supported\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </deviate>\n" |
| " </deviation>\n" |
| " <deviation target-node=\"/e:ll1\">\n" |
| " <deviate value=\"add\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " <units name=\"meter\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </units>\n" |
| " <default value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " <default value=\"2\">\n" |
| " <e:a/>\n" |
| " </default>\n" |
| " <config value=\"false\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </config>\n" |
| " </deviate>\n" |
| " </deviation>\n" |
| " <deviation target-node=\"/e:lst1\">\n" |
| " <deviate value=\"add\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n" |
| " <unique tag=\"val1\"/>\n <unique tag=\"val2\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </unique>\n" |
| " <min-elements value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </min-elements>\n" |
| " <max-elements value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </max-elements>\n" |
| " </deviate>\n" |
| " </deviation>\n" |
| " <deviation target-node=\"/e:l2\">\n" |
| " <deviate value=\"replace\">\n" |
| " <e:b x=\"ten\"/>\n" |
| " <mandatory value=\"false\">\n" |
| " <e:a/>\n" |
| " </mandatory>\n" |
| " </deviate>\n" |
| " </deviation>\n" |
| " <deviation target-node=\"/e:lst1/e:val2\">\n" |
| " <deviate value=\"delete\">\n" |
| " <e:a/>\n" |
| " <units name=\"meter\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </units>\n" |
| " <default value=\"1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </default>\n" |
| " </deviate>\n" |
| " </deviation>\n" |
| " <deviation target-node=\"/e:lst2\">\n" |
| " <deviate value=\"delete\">\n" |
| " <e:a/>\n <e:b x=\"two\"/>\n" |
| " <unique tag=\"val1\">\n" |
| " <e:a/>\n <e:b x=\"one\"/>\n <e:c>\n <e:y>one</e:y>\n </e:c>\n" |
| " </unique>\n" |
| " </deviate>\n" |
| " </deviation>\n" |
| "</module>\n"; |
| struct lys_node *node; |
| |
| mod = ly_ctx_load_module(st->ctx, "ext-def", NULL); |
| assert_ptr_not_equal(mod, NULL); |
| |
| dev = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(dev, NULL); |
| |
| lys_print_mem(&st->str1, dev, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| |
| /* check extensions in the deviated data */ |
| /* l1 is removed */ |
| assert_string_not_equal(mod->data->name, "l1"); |
| assert_string_not_equal(mod->data->prev->name, "l1"); |
| assert_string_not_equal(mod->data->next->name, "l1"); |
| |
| /* l2 is now first and instead of 5 extensions it now has only 3 */ |
| node = mod->data; |
| assert_string_equal(node->name, "l2"); |
| assert_int_equal(node->flags & LYS_MAND_MASK, LYS_MAND_FALSE); |
| assert_int_equal(node->ext_size, 3); |
| |
| /* ll1 has 13 extensions (10 from substatements) */ |
| node = mod->data->next; |
| assert_string_equal(node->name, "ll1"); |
| assert_int_equal(node->ext_size, 13); |
| |
| /* lst1 has 12 extensions (2 added, 9 added from substatements) */ |
| node = mod->data->next->next; |
| assert_string_equal(node->name, "lst1"); |
| assert_int_equal(node->ext_size, 12); |
| |
| /* lst2 has 1 ext, since the deviation removes unique with all its extensions and 3 of the 4 node's extensions */ |
| node = mod->data->prev; |
| assert_string_equal(node->name, "lst2"); |
| assert_int_equal(node->ext_size, 1); |
| |
| /* val2 has no extension, all were deleted */ |
| node = mod->data->next->next->child->prev; |
| assert_string_equal(node->name, "val2"); |
| assert_string_equal(node->parent->name, "lst1"); |
| assert_int_equal(node->ext_size, 0); |
| |
| /* revert deviations */ |
| ly_ctx_remove_module(dev, NULL); |
| |
| /* l1 is reconnected at the end of data nodes */ |
| assert_string_equal(mod->data->prev->name, "l1"); |
| |
| /* l2 is back true and contains again the 5 extensions */ |
| node = mod->data; |
| assert_string_equal(node->name, "l2"); |
| assert_int_equal(node->flags & LYS_MAND_MASK, LYS_MAND_TRUE); |
| assert_int_equal(node->ext_size, 5); |
| |
| /* ll1 has no extension again */ |
| node = mod->data->next; |
| assert_string_equal(node->name, "ll1"); |
| assert_int_equal(node->ext_size, 0); |
| |
| /* lst1 has back 1 extension */ |
| node = mod->data->next->next; |
| assert_string_equal(node->name, "lst1"); |
| assert_int_equal(node->ext_size, 1); |
| |
| /* lst2 has back all the 5 original extensions */ |
| node = mod->data->prev->prev; /* lst2 is not last, there is added l1 */ |
| assert_string_equal(node->name, "lst2"); |
| assert_int_equal(node->ext_size, 5); |
| |
| /* val2 has back all its 2 extensions */ |
| node = mod->data->next->next->child->prev; |
| assert_string_equal(node->name, "val2"); |
| assert_string_equal(node->parent->name, "lst1"); |
| assert_int_equal(node->ext_size, 2); |
| } |
| |
| static void |
| test_deviation_sub_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod, *dev; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " deviation \"/e:l1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " description\n \"desc\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n reference\n \"ref\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n deviate not-supported {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n\n" |
| " deviation \"/e:ll1\" {\n" |
| " deviate add {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " units \"meter\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n default \"1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n default \"2\" {\n" |
| " e:a;\n" |
| " }\n config false {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n\n" |
| " deviation \"/e:lst1\" {\n" |
| " deviate add {\n" |
| " e:a;\n e:b \"one\";\n" |
| " unique \"val1\";\n" |
| " unique \"val2\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n min-elements 1 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n max-elements 2 {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n\n" |
| " deviation \"/e:l2\" {\n" |
| " deviate replace {\n" |
| " e:b \"ten\";\n" |
| " mandatory false {\n" |
| " e:a;\n" |
| " }\n }\n }\n\n" |
| " deviation \"/e:lst1/e:val2\" {\n" |
| " deviate delete {\n" |
| " e:a;\n" |
| " units \"meter\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n default \"1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n\n" |
| " deviation \"/e:lst2\" {\n" |
| " deviate delete {\n" |
| " e:a;\n e:b \"two\";\n" |
| " unique \"val1\" {\n" |
| " e:a;\n e:b \"one\";\n e:c \"one\";\n" |
| " }\n }\n }\n}\n"; |
| struct lys_node *node; |
| |
| mod = ly_ctx_load_module(st->ctx, "ext-def", NULL); |
| assert_ptr_not_equal(mod, NULL); |
| |
| dev = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(dev, NULL); |
| |
| lys_print_mem(&st->str1, dev, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| |
| /* check extensions in the deviated data */ |
| /* l1 is removed */ |
| assert_string_not_equal(mod->data->name, "l1"); |
| assert_string_not_equal(mod->data->prev->name, "l1"); |
| assert_string_not_equal(mod->data->next->name, "l1"); |
| |
| /* l2 is now first and instead of 5 extensions it now has only 3 */ |
| node = mod->data; |
| assert_string_equal(node->name, "l2"); |
| assert_int_equal(node->flags & LYS_MAND_MASK, LYS_MAND_FALSE); |
| assert_int_equal(node->ext_size, 3); |
| |
| /* ll1 has 13 extensions (10 from substatements) */ |
| node = mod->data->next; |
| assert_string_equal(node->name, "ll1"); |
| assert_int_equal(node->ext_size, 13); |
| |
| /* lst1 has 12 extensions (2 added, 9 added from substatements) */ |
| node = mod->data->next->next; |
| assert_string_equal(node->name, "lst1"); |
| assert_int_equal(node->ext_size, 12); |
| |
| /* lst2 has 1 ext, since the deviation removes unique with all its extensions and 3 of the 4 node's extensions */ |
| node = mod->data->prev; |
| assert_string_equal(node->name, "lst2"); |
| assert_int_equal(node->ext_size, 1); |
| |
| /* val2 has no extension, all were deleted */ |
| node = mod->data->next->next->child->prev; |
| assert_string_equal(node->name, "val2"); |
| assert_string_equal(node->parent->name, "lst1"); |
| assert_int_equal(node->ext_size, 0); |
| |
| /* revert deviations */ |
| ly_ctx_remove_module(dev, NULL); |
| |
| /* l1 is reconnected at the end of data nodes */ |
| assert_string_equal(mod->data->prev->name, "l1"); |
| |
| /* l2 is back true and contains again the 5 extensions */ |
| node = mod->data; |
| assert_string_equal(node->name, "l2"); |
| assert_int_equal(node->flags & LYS_MAND_MASK, LYS_MAND_TRUE); |
| assert_int_equal(node->ext_size, 5); |
| |
| /* ll1 has no extension again */ |
| node = mod->data->next; |
| assert_string_equal(node->name, "ll1"); |
| assert_int_equal(node->ext_size, 0); |
| |
| /* lst1 has back 1 extension */ |
| node = mod->data->next->next; |
| assert_string_equal(node->name, "lst1"); |
| assert_int_equal(node->ext_size, 1); |
| |
| /* lst2 has back all the 5 original extensions */ |
| node = mod->data->prev->prev; /* lst2 is not last, there is added l1 */ |
| assert_string_equal(node->name, "lst2"); |
| assert_int_equal(node->ext_size, 5); |
| |
| /* val2 has back all its 2 extensions */ |
| node = mod->data->next->next->child->prev; |
| assert_string_equal(node->name, "val2"); |
| assert_string_equal(node->parent->name, "lst1"); |
| assert_int_equal(node->ext_size, 2); |
| } |
| |
| static void |
| test_complex_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <argument name=\"a\"/>\n" |
| " <base name=\"b\"/>\n" |
| " <belongs-to module=\"test\">\n <prefix value=\"t\"/>\n </belongs-to>\n" |
| " <contact>\n <text>contact</text>\n </contact>\n" |
| " <default value=\"c\"/>\n" |
| " <description>\n <text>description</text>\n </description>\n" |
| " <error-app-tag value=\"d\"/>\n" |
| " <error-message>\n <value>errmsg</value>\n </error-message>\n" |
| " <key value=\"e\"/>\n" |
| " <namespace uri=\"urn\"/>\n" |
| " <organization>\n <text>org</text>\n </organization>\n" |
| " <path value=\"f\"/>\n" |
| " <prefix value=\"g\"/>\n" |
| " <presence value=\"h\"/>\n" |
| " <reference>\n <text>reference</text>\n </reference>\n" |
| " <revision-date date=\"i\"/>\n" |
| " <units name=\"j\"/>\n" |
| " <modifier value=\"invert-match\"/>\n" |
| " <require-instance value=\"true\"/>\n" |
| " <config value=\"true\"/>\n" |
| " <mandatory value=\"true\"/>\n" |
| " <ordered-by value=\"user\"/>\n" |
| " <status value=\"obsolete\"/>\n" |
| " <fraction-digits value=\"5\"/>\n" |
| " <max-elements value=\"2\"/>\n" |
| " <min-elements value=\"4\"/>\n" |
| " <position value=\"11\"/>\n" |
| " <value value=\"355\"/>\n" |
| " <unique tag=\"e\"/>\n" |
| " <module name=\"inmod\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:i=\"urn:inmod\">\n" |
| " <namespace uri=\"urn:inmod\"/>\n" |
| " <prefix value=\"i\"/>\n" |
| " </module>\n" |
| " <action name=\"action\"/>\n" |
| " <anydata name=\"anydata\"/>\n" |
| " <anyxml name=\"anyxml\"/>\n" |
| " <case name=\"case\"/>\n" |
| " <choice name=\"choice\">\n" |
| " <anydata name=\"a\"/>\n" |
| " <anydata name=\"b\"/>\n" |
| " </choice>\n" |
| " <container name=\"container\">\n" |
| " <presence value=\"presence\"/>\n" |
| " </container>\n" |
| " <grouping name=\"grp\">\n" |
| " <anydata name=\"c\"/>\n" |
| " </grouping>\n" |
| " <input>\n" |
| " <anydata name=\"d\"/>\n" |
| " </input>\n" |
| " <leaf name=\"e\">\n" |
| " <type name=\"string\"/>\n" |
| " </leaf>\n" |
| " <leaf-list name=\"f\">\n" |
| " <type name=\"string\"/>\n" |
| " </leaf-list>\n" |
| " <list name=\"g\">\n" |
| " <key value=\"k\"/>\n" |
| " <leaf name=\"k\">\n" |
| " <type name=\"string\"/>\n" |
| " </leaf>\n" |
| " </list>\n" |
| " <notification name=\"h\">\n" |
| " <anydata name=\"i\"/>\n" |
| " </notification>\n" |
| " <output>\n" |
| " <anydata name=\"i\"/>\n" |
| " </output>\n" |
| " <uses name=\"grp\"/>\n" |
| " <typedef name=\"mytype\">\n <type name=\"string\"/>\n </typedef>\n" |
| " <type name=\"string\"/>\n" |
| " <if-feature name=\"f\"/>\n" |
| " <length value=\"10..20\"/>\n" |
| " <must condition=\"1\"/>\n" |
| " <pattern value=\"[a-z]*\"/>\n" |
| " <range value=\"0..10\"/>\n" |
| " <when condition=\"1\"/>\n" |
| " <revision date=\"2016-02-16\"/>\n" |
| " </e:complex>\n" |
| " <feature name=\"f\"/>\n" |
| "</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_complex_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " argument a;\n" |
| " base b;\n" |
| " belongs-to test {\n prefix t;\n }\n" |
| " contact\n \"contact\";\n" |
| " default \"c\";\n" |
| " description\n \"description\";\n" |
| " error-app-tag \"d\";\n" |
| " error-message\n \"errmsg\";\n" |
| " key \"e\";\n" |
| " namespace \"urn\";\n" |
| " organization\n \"org\";\n" |
| " path \"f\";\n" |
| " prefix g;\n" |
| " presence \"h\";\n" |
| " reference\n \"reference\";\n" |
| " revision-date 2017-02-21;\n" |
| " units \"j\";\n" |
| " modifier invert-match;\n" |
| " require-instance true;\n" |
| " config true;\n" |
| " mandatory true;\n" |
| " ordered-by user;\n" |
| " status obsolete;\n" |
| " fraction-digits 5;\n" |
| " max-elements 2;\n" |
| " min-elements 4;\n" |
| " position 11;\n" |
| " value 355;\n" |
| " unique \"e\";\n" |
| " module inmod {\n" |
| " namespace \"urn:inmod\";\n" |
| " prefix i;\n }\n" |
| " action action;\n\n" |
| " anydata anydata;\n\n" |
| " anyxml anyxml;\n\n" |
| " case case;\n\n" |
| " choice choice {\n anydata a;\n\n anydata b;\n }\n\n" |
| " container container {\n presence \"presence\";\n }\n\n" |
| " grouping grp {\n anydata c;\n }\n\n" |
| " input {\n anydata d;\n }\n\n" |
| " leaf e {\n type string;\n }\n\n" |
| " leaf-list f {\n type string;\n }\n\n" |
| " list g {\n key \"k\";\n" |
| " leaf k {\n type string;\n }\n }\n\n" |
| " notification h {\n anydata i;\n }\n\n" |
| " output {\n anydata i;\n }\n\n" |
| " uses grp;\n" |
| " typedef mytype {\n type string;\n }\n" |
| " type string;\n" |
| " if-feature \"f\";\n" |
| " length \"10..20\";\n" |
| " must \"1\";\n" |
| " pattern \"[a-z]*\";\n" |
| " range \"0..10\";\n" |
| " when \"1\";\n" |
| " revision 2016-02-16;\n }\n\n" |
| " feature f;\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_complex_arrays_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-arrays>\n" |
| " <argument name=\"a\">\n" |
| " <yin-element value=\"true\"/>\n" |
| " </argument>\n" |
| " <argument name=\"b\"/>\n" |
| " <base name=\"a\"/>\n" |
| " <base name=\"b\"/>\n" |
| " <belongs-to module=\"test1\">\n <prefix value=\"t1\"/>\n </belongs-to>\n" |
| " <belongs-to module=\"test2\">\n <prefix value=\"t2\"/>\n </belongs-to>\n" |
| " <contact>\n <text>contact1</text>\n </contact>\n" |
| " <contact>\n <text>contact2</text>\n </contact>\n" |
| " <default value=\"a\"/>\n" |
| " <default value=\"b\"/>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <description>\n <text>description2</text>\n </description>\n" |
| " <error-app-tag value=\"a\"/>\n" |
| " <error-app-tag value=\"b\"/>\n" |
| " <error-message>\n <value>errmsg1</value>\n </error-message>\n" |
| " <error-message>\n <value>errmsg2</value>\n </error-message>\n" |
| " <key value=\"a\"/>\n" |
| " <key value=\"b\"/>\n" |
| " <namespace uri=\"urn1\"/>\n" |
| " <namespace uri=\"urn2\"/>\n" |
| " <organization>\n <text>org1</text>\n </organization>\n" |
| " <organization>\n <text>org2</text>\n </organization>\n" |
| " <path value=\"a\"/>\n" |
| " <path value=\"b\"/>\n" |
| " <prefix value=\"a\"/>\n" |
| " <prefix value=\"b\"/>\n" |
| " <presence value=\"a\"/>\n" |
| " <presence value=\"b\"/>\n" |
| " <reference>\n <text>reference1</text>\n </reference>\n" |
| " <reference>\n <text>reference2</text>\n </reference>\n" |
| " <units name=\"a\"/>\n" |
| " <units name=\"b\"/>\n" |
| " <fraction-digits value=\"5\"/>\n" |
| " <fraction-digits value=\"10\"/>\n" |
| " <max-elements value=\"2\"/>\n" |
| " <max-elements value=\"3\"/>\n" |
| " <min-elements value=\"4\"/>\n" |
| " <min-elements value=\"5\"/>\n" |
| " <position value=\"11\"/>\n" |
| " <position value=\"12\"/>\n" |
| " <value value=\"42\"/>\n" |
| " <value value=\"-55\"/>\n" |
| " <unique tag=\"l1 l2\"/>\n" |
| " <unique tag=\"l2\"/>\n" |
| " <module name=\"inmod1\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:i=\"urn:inmod1\">\n" |
| " <namespace uri=\"urn:inmod1\"/>\n" |
| " <prefix value=\"i\"/>\n" |
| " </module>\n" |
| " <module name=\"inmod2\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:i=\"urn:inmod2\">\n" |
| " <namespace uri=\"urn:inmod2\"/>\n" |
| " <prefix value=\"i\"/>\n" |
| " </module>\n" |
| " <anydata name=\"anydata1\"/>\n" |
| " <anydata name=\"anydata2\"/>\n" |
| " <anyxml name=\"anyxml1\"/>\n" |
| " <anyxml name=\"anyxml2\"/>\n" |
| " <leaf name=\"l1\">\n <type name=\"string\"/>\n </leaf>\n" |
| " <leaf name=\"l2\">\n <type name=\"string\"/>\n </leaf>\n" |
| " <typedef name=\"mytype1\">\n <type name=\"string\"/>\n </typedef>\n" |
| " <typedef name=\"mytype2\">\n <type name=\"string\"/>\n </typedef>\n" |
| " <type name=\"string\"/>\n" |
| " <type name=\"uint8\"/>\n" |
| " <if-feature name=\"f1\"/>\n" |
| " <if-feature name=\"f2\"/>\n" |
| " <length value=\"10\"/>\n" |
| " <length value=\"20\"/>\n" |
| " <must condition=\"1\"/>\n" |
| " <must condition=\"2\"/>\n" |
| " <pattern value=\"[a-z]*\"/>\n" |
| " <pattern value=\"[A-Z]*\"/>\n" |
| " <range value=\"0..10\"/>\n" |
| " <range value=\"100..110\"/>\n" |
| " <when condition=\"1\"/>\n" |
| " <when condition=\"2\"/>\n" |
| " <revision date=\"2016-02-16\"/>\n" |
| " <revision date=\"2016-02-17\"/>\n" |
| " </e:complex-arrays>\n" |
| " <feature name=\"f1\"/>\n" |
| " <feature name=\"f2\"/>\n" |
| "</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin); |
| } |
| |
| static void |
| test_complex_arrays_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-arrays {\n" |
| " argument b;\n" |
| " argument a {\n yin-element true;\n }\n" |
| " base a;\n" |
| " base b;\n" |
| " belongs-to test1 {\n prefix t1;\n }\n" |
| " belongs-to test2 {\n prefix t2;\n }\n" |
| " contact\n \"contact1\";\n" |
| " contact\n \"contact2\";\n" |
| " default \"a\";\n" |
| " default \"b\";\n" |
| " description\n \"description1\";\n" |
| " description\n \"description2\";\n" |
| " error-app-tag \"a\";\n" |
| " error-app-tag \"b\";\n" |
| " error-message\n \"errmsg1\";\n" |
| " error-message\n \"errmsg2\";\n" |
| " key \"a\";\n" |
| " key \"b\";\n" |
| " namespace \"urn1\";\n" |
| " namespace \"urn2\";\n" |
| " organization\n \"org1\";\n" |
| " organization\n \"org2\";\n" |
| " path \"a\";\n" |
| " path \"b\";\n" |
| " prefix a;\n" |
| " prefix b;\n" |
| " presence \"a\";\n" |
| " presence \"b\";\n" |
| " reference\n \"reference1\";\n" |
| " reference\n \"reference2\";\n" |
| " units \"a\";\n" |
| " units \"b\";\n" |
| " fraction-digits 5;\n" |
| " fraction-digits 10;\n" |
| " max-elements 2;\n" |
| " max-elements 3;\n" |
| " min-elements 4;\n" |
| " min-elements 5;\n" |
| " position 11;\n" |
| " position 12;\n" |
| " value 42;\n" |
| " value -55;\n" |
| " unique \"l1 l2\";\n" |
| " unique \"l2\";\n" |
| " module inmod1 {\n" |
| " namespace \"urn:inmod1\";\n" |
| " prefix i;\n }\n" |
| " module inmod2 {\n" |
| " namespace \"urn:inmod2\";\n" |
| " prefix i;\n }\n" |
| " anydata anydata1;\n\n" |
| " anydata anydata2;\n\n" |
| " anyxml anyxml1;\n\n" |
| " anyxml anyxml2;\n\n" |
| " leaf l1 {\n type string;\n }\n\n" |
| " leaf l2 {\n type string;\n }\n" |
| " typedef mytype1 {\n type string;\n }\n" |
| " typedef mytype2 {\n type string;\n }\n" |
| " type string;\n" |
| " type uint8;\n" |
| " if-feature \"f1\";\n" |
| " if-feature \"f2\";\n" |
| " length \"10\";\n" |
| " length \"20\";\n" |
| " must \"1\";\n" |
| " must \"2\";\n" |
| " pattern \"[a-z]*\";\n" |
| " pattern \"[A-Z]*\";\n" |
| " range \"0..10\";\n" |
| " range \"100..110\";\n" |
| " when \"1\";\n" |
| " when \"2\";\n" |
| " revision 2016-02-16;\n" |
| " revision 2016-02-17;\n }\n\n" |
| " feature f1;\n\n" |
| " feature f2;\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang); |
| } |
| |
| static void |
| test_complex_mand_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin4 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n <config value=\"true\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin5 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n <config value=\"true\"/>\n <mandatory value=\"true\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin6 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n <config value=\"true\"/>\n <mandatory value=\"true\"/>\n" |
| " <status value=\"obsolete\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin7 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n <config value=\"true\"/>\n <mandatory value=\"true\"/>\n" |
| " <status value=\"obsolete\"/>\n <fraction-digits value=\"5\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin8 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n <config value=\"true\"/>\n <mandatory value=\"true\"/>\n" |
| " <status value=\"obsolete\"/>\n <fraction-digits value=\"5\"/>\n" |
| " <min-elements value=\"4\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin9 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n <config value=\"true\"/>\n <mandatory value=\"true\"/>\n" |
| " <status value=\"obsolete\"/>\n <fraction-digits value=\"5\"/>\n" |
| " <min-elements value=\"4\"/>\n" |
| " <leaf name=\"l1\">\n <type name=\"string\"/>\n </leaf>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| const char *yin_correct = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex-mand>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <default value=\"b\"/>\n" |
| " <config value=\"true\"/>\n" |
| " <mandatory value=\"true\"/>\n" |
| " <status value=\"obsolete\"/>\n" |
| " <fraction-digits value=\"5\"/>\n" |
| " <min-elements value=\"4\"/>\n" |
| " <leaf name=\"l1\">\n <type name=\"string\"/>\n </leaf>\n" |
| " <must condition=\"1\"/>\n" |
| " </e:complex-mand>\n" |
| "</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin1, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin2, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin3, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin4, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin5, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin6, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin7, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin8, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yin9, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| |
| mod = lys_parse_mem(st->ctx, yin_correct, LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin_correct); |
| } |
| |
| static void |
| test_complex_mand_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang1 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand;\n}\n"; |
| const char *yang2 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " }\n}\n"; |
| const char *yang3 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n" |
| " }\n}\n"; |
| const char *yang4 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n" |
| " }\n}\n"; |
| const char *yang5 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n mandatory true;\n" |
| " }\n}\n"; |
| const char *yang6 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n mandatory true;\n" |
| " status obsolete;\n" |
| " }\n}\n"; |
| const char *yang7 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n mandatory true;\n" |
| " status obsolete;\n fraction-digits 5;\n" |
| " }\n}\n"; |
| const char *yang8 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n mandatory true;\n" |
| " status obsolete;\n fraction-digits 5;\n min-elements 4;\n" |
| " }\n}\n"; |
| const char *yang9 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n mandatory true;\n" |
| " status obsolete;\n fraction-digits 5;\n min-elements 4;\n" |
| " leaf l1 {\n type string;\n }\n" |
| " }\n}\n"; |
| const char *yang_correct = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex-mand {\n" |
| " description\n \"description1\";\n" |
| " default \"b\";\n config true;\n mandatory true;\n" |
| " status obsolete;\n fraction-digits 5;\n min-elements 4;\n" |
| " leaf l1 {\n type string;\n }\n" |
| " must \"1\";\n" |
| " }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang1, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang2, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang3, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang4, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang5, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang6, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang7, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang8, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| mod = lys_parse_mem(st->ctx, yang9, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| |
| mod = lys_parse_mem(st->ctx, yang_correct, LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang_correct); |
| } |
| |
| static void |
| test_complex_many_instace_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <description>\n <text>description2</text>\n </description>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <reference>\n <text>reference1</text>\n </reference>\n" |
| " <reference>\n <text>reference1</text>\n </reference>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <argument name=\"b\">\n <yin-element value=\"true\"/> </argument>\n" |
| " <argument name=\"a\">\n <yin-element value=\"false\"/> </argument>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin4 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <belongs-to module=\"test1\">\n <prefix value=\"t1\"/>\n </belongs-to>\n" |
| " <belongs-to module=\"test2\">\n <prefix value=\"t2\"/>\n </belongs-to>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin5 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <contact>\n <text>contact1</text>\n </contact>\n" |
| " <contact>\n <text>contact2</text>\n </contact>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin6 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <default value=\"b\"/>\n" |
| " <default value=\"a\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin7 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <error-message>\n <value>error-message1</value>\n </error-message>\n" |
| " <error-message>\n <value>error-message2</value>\n </error-message>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin8 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <error-app-tag value=\"a\"/>\n" |
| " <error-app-tag value=\"b\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin9 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <namespace uri=\"urn:namespace1\"/>\n" |
| " <namespace uri=\"urn:namespace2\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin10 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <organization>\n <text>organization1</text>\n </organization>\n" |
| " <organization>\n <text>organization1</text>\n </organization>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin11 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <path value=\"leaf\"/>\n" |
| " <path value=\"leaf1\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin12 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <presence value=\"presence1\"/>\n" |
| " <presence value=\"presence2\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin13 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <prefix value=\"a\"/>\n" |
| " <prefix value=\"b\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin14 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <revision-date date=\"2017-02-22\"/>" |
| " <revision-date date=\"2015-02-22\"/>" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin15 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <units name=\"meter\"/>\n" |
| " <units name=\"kilogram\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin16 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <modifier value=\"invert-match\"/>\n" |
| " <modifier value=\"invert-match\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin17 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <value value=\"142\"/>" |
| " <value value=\"1456\"/>" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin18 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <require-instance value=\"true\"/>" |
| " <require-instance value=\"true\"/>" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin19 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <length value=\"5..20\"/>" |
| " <length value=\"5..10\"/>" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin20 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <pattern value=\"A-Za-z]+\"/>" |
| " <pattern value=\"[A-Za-z]+[0-9]*\"/>" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin21 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <must condition=\"leaf = true\"/>" |
| " <must condition=\"leaf = false\"/>" |
| " <leaf name=\"leaf\">\n <type name=\"boolean\"/>\n </leaf>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin22 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <range value=\"1..25\"/>" |
| " <range value=\"25 | 40 .. 100\"/>" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin23 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <when condition=\"leaf = true\"/>" |
| " <when condition=\"leaf = false\"/>" |
| " <leaf name=\"leaf\">\n <type name=\"boolean\"/>\n </leaf>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| const char *yin24 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <e:complex>\n" |
| " <revision date=\"2016-02-16\"/>\n" |
| " <revision date=\"2016-02-17\"/>\n" |
| " </e:complex>\n" |
| "</module>\n"; |
| |
| mod = lys_parse_mem(st->ctx, yin1, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin2, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin3, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin4, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin5, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin6, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin7, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin8, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin9, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin9, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin10, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin11, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin12, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin13, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin14, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin15, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin16, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin17, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin18, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin19, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin20, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin21, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin22, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin23, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yin24, LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| } |
| |
| static void |
| test_complex_many_instace_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang1 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " description\n \"description1\";\n" |
| " description\n \"description2\";\n" |
| " }\n}\n"; |
| const char *yang2 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " reference\n \"reference1\";\n" |
| " reference\n \"reference2\";\n" |
| " }\n}\n"; |
| const char *yang3 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " argument a {\n yin-element true;\n }\n" |
| " argument b {\n yin-element true;\n }\n" |
| " }\n}\n"; |
| const char *yang4 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " belongs-to test1 {\n prefix t1;\n }\n" |
| " belongs-to test2 {\n prefix t2;\n }\n" |
| " }\n}\n"; |
| const char *yang5 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " contact\n \"contact1\";\n" |
| " contact\n \"contact2\";\n" |
| " }\n}\n"; |
| const char *yang6 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " default \"default1\";\n" |
| " default \"default2\";\n" |
| " }\n}\n"; |
| const char *yang7 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " error-message \"err-msg1\";\n" |
| " error-message \"err-msg2\";\n" |
| " }\n}\n"; |
| const char *yang8 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " key \"key1\";\n" |
| " key \"key2\";\n" |
| " }\n}\n"; |
| const char *yang9 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " namespace \"namespace1\";\n" |
| " namespace \"namespace2\";\n" |
| " }\n}\n"; |
| const char *yang10 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " organization \"organization1\";\n" |
| " organization \"organization2\";\n" |
| " }\n}\n"; |
| const char *yang11 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " path \"leaf\";\n" |
| " path \"leaf\";\n" |
| " leaf leaf {\n type string;\n }\n" |
| " }\n}\n"; |
| const char *yang12 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " presence \"presence1\";\n" |
| " presence \"presence2\";\n" |
| " }\n}\n"; |
| const char *yang13 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " prefix \"prefix1\";\n" |
| " prefix \"prefix2\";\n" |
| " }\n}\n"; |
| const char *yang14 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " revision-date 2017-02-22;\n" |
| " revision-date 2017-02-25;\n" |
| " }\n}\n"; |
| const char *yang15 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " units \"units1\";\n" |
| " units \"units2\";\n" |
| " }\n}\n"; |
| const char *yang16 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " modifier invert-match;\n" |
| " modifier invert-match;\n" |
| " }\n}\n"; |
| const char *yang17 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " value 142;\n" |
| " value 1456;\n" |
| " }\n}\n"; |
| const char *yang18 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " require-instance \"true\";\n" |
| " require-instance \"true\";\n" |
| " }\n}\n"; |
| const char *yang19 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " length \"5..20\";\n" |
| " length \"5..10\";\n" |
| " }\n}\n"; |
| const char *yang20 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " pattern \"[A-Za-z]+\";\n" |
| " pattern \"[A-Za-z]+[0-9]*\";\n" |
| " }\n}\n"; |
| const char *yang21 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " must \"leaf = true\";\n" |
| " must \"leaf = false\";\n" |
| " leaf leaf {\n type string;\n }\n" |
| " }\n}\n"; |
| const char *yang22 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " range \"1..25\";\n" |
| " range \"25 | 40 .. 100\";\n" |
| " }\n}\n"; |
| const char *yang23 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " when \"leaf = true\";\n" |
| " when \"leaf = false\";\n" |
| " leaf leaf {\n type string;\n }\n" |
| " }\n}\n"; |
| const char *yang24 = "module ext {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " e:complex {\n" |
| " revision 2017-03-30;\n" |
| " revision 2016-03-30;\n" |
| " }\n}\n"; |
| |
| mod = lys_parse_mem(st->ctx, yang1, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang2, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang3, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang4, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang5, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang6, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang7, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang8, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang9, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang9, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang10, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang11, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang12, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang13, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang14, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang15, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang16, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang17, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang18, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang19, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang20, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang21, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang22, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang23, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| mod = lys_parse_mem(st->ctx, yang24, LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| assert_int_equal(ly_vecode(st->ctx), LYVE_TOOMANY); |
| } |
| |
| static void |
| test_complex_arrays_str_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin[17]; |
| int i; |
| |
| yin[0] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext1\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext1\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext1\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <description>\n <text>description1</text>\n </description>\n" |
| " <description>\n" |
| " <x:a y=\"ok\"/>\n" |
| " <text>description1</text>\n" |
| " </description>\n" |
| " <description>\n <text>description3</text>\n </description>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[1] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext2\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext2\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext2\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <reference>\n <text>reference1</text>\n </reference>\n" |
| " <reference>\n" |
| " <x:a y=\"ok\"/>\n" |
| " <text>reference1</text>\n" |
| " </reference>\n" |
| " <reference>\n <text>reference3</text>\n </reference>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[2] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext3\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext3\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext3\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <contact>\n <text>contact1</text>\n </contact>\n" |
| " <contact>\n" |
| " <x:a y=\"ok\"/>\n" |
| " <text>contact1</text>\n" |
| " </contact>\n" |
| " <contact>\n <text>contact3</text>\n </contact>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[3] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext4\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext4\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext4\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <default value=\"default1\"/>\n" |
| " <default value=\"default2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </default>\n" |
| " <default value=\"default3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[4] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext5\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext5\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext5\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <error-message>\n <value>error-message1</value>\n </error-message>\n" |
| " <error-message>\n" |
| " <x:a y=\"ok\"/>\n" |
| " <value>error-message1</value>\n" |
| " </error-message>\n" |
| " <error-message>\n <value>error-message3</value>\n </error-message>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[5] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext6\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext6\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext6\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <error-app-tag value=\"error-app-tag1\"/>\n" |
| " <error-app-tag value=\"error-app-tag2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </error-app-tag>\n" |
| " <error-app-tag value=\"error-app-tag3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[6] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext7\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext7\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext7\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <namespace uri=\"urn:namespace1\"/>\n" |
| " <namespace uri=\"urn:namespace2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </namespace>\n" |
| " <namespace uri=\"urn:namespace3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[7] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext8\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext8\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext8\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <organization>\n <text>organization1</text>\n </organization>\n" |
| " <organization>\n" |
| " <x:a y=\"ok\"/>\n" |
| " <text>organization1</text>\n" |
| " </organization>\n" |
| " <organization>\n <text>organization3</text>\n </organization>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[8] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext9\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext9\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext9\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <path value=\"path1\"/>\n" |
| " <path value=\"path2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </path>\n" |
| " <path value=\"path3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[9] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext10\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext10\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext10\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <prefix value=\"prefix1\"/>\n" |
| " <prefix value=\"prefix2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </prefix>\n" |
| " <prefix value=\"prefix3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[10] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext11\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext11\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext11\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <presence value=\"presence1\"/>\n" |
| " <presence value=\"presence2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </presence>\n" |
| " <presence value=\"presence3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[11] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext12\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext12\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext12\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <units name=\"units1\"/>\n" |
| " <units name=\"units2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </units>\n" |
| " <units name=\"units3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[12] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext13\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext13\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext13\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <revision-date date=\"2017-02-20\"/>\n" |
| " <revision-date date=\"2017-02-25\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </revision-date>\n" |
| " <revision-date date=\"2017-02-28\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[13] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext14\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext14\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext14\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <base name=\"base1\"/>\n" |
| " <base name=\"base2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </base>\n" |
| " <base name=\"base3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[14] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext15\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext15\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext15\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <extension name=\"b\"/>\n" |
| " <e:complex-arrays>\n" |
| " <argument name=\"argument1\"/>\n" |
| " <argument name=\"argument2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </argument>\n" |
| " <argument name=\"argument3\">\n" |
| " <yin-element value=\"true\">\n" |
| " <x:b/>\n" |
| " </yin-element>\n" |
| " </argument>\n" |
| " <argument name=\"argument4\">\n" |
| " <yin-element value=\"false\">\n" |
| " <x:a y=\"value\"/>\n" |
| " </yin-element>\n" |
| " </argument>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[15] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext16\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext16\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext16\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <belongs-to module=\"mod1\">\n <prefix value=\"prefix1\"/>\n </belongs-to>\n" |
| " <belongs-to module=\"mod2\">\n" |
| " <prefix value=\"prefix2\">\n <x:a y=\"value\"/>\n </prefix>\n" |
| " </belongs-to>\n" |
| " <belongs-to module=\"mod3\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " <prefix value=\"prefix3\"/>\n" |
| " </belongs-to>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| yin[16] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext17\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:x=\"urn:ext17\"\n" |
| " xmlns:e=\"urn:ext-def\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext17\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ext-def\">\n <prefix value=\"e\"/>\n </import>\n" |
| " <extension name=\"a\">\n <argument name=\"y\"/>\n </extension>\n" |
| " <e:complex-arrays>\n" |
| " <key value=\"key1\"/>\n" |
| " <key value=\"key2\">\n" |
| " <x:a y=\"ok\"/>\n" |
| " </key>\n" |
| " <key value=\"key3\"/>\n" |
| " </e:complex-arrays>\n" |
| "</module>\n"; |
| |
| for (i = 0; i < 17; ++i) { |
| printf("module ext%d ... ", i + 1); |
| mod = lys_parse_mem(st->ctx, yin[i], LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YIN, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yin[i]); |
| free(st->str1); |
| st->str1 = NULL; |
| printf("OK\n"); |
| } |
| } |
| |
| static void |
| test_complex_arrays_str_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang[17]; |
| int i; |
| |
| yang[0] = "module ext1 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext1\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " description\n \"description1\";\n" |
| " description\n \"description2\" {\n x:a \"ok\";\n }\n" |
| " description\n \"description3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[1] = "module ext2 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext2\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " reference\n \"reference1\";\n" |
| " reference\n \"reference2\" {\n x:a \"ok\";\n }\n" |
| " reference\n \"reference3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[2] = "module ext3 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext3\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " contact\n \"contact1\";\n" |
| " contact\n \"contact2\" {\n x:a \"ok\";\n }\n" |
| " contact\n \"contact3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[3] = "module ext4 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext4\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " default \"default1\";\n" |
| " default \"default2\" {\n x:a \"ok\";\n }\n" |
| " default \"default3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[4] = "module ext5 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext5\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " error-message\n \"error-message1\";\n" |
| " error-message\n \"error-message2\" {\n x:a \"ok\";\n }\n" |
| " error-message\n \"error-message3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[5] = "module ext6 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext6\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " error-app-tag \"error-app-tag1\";\n" |
| " error-app-tag \"error-app-tag2\" {\n x:a \"ok\";\n }\n" |
| " error-app-tag \"error-app-tag3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[6] = "module ext7 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext7\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " namespace \"urn:namespace1\";\n" |
| " namespace \"urn:namespace2\" {\n x:a \"ok\";\n }\n" |
| " namespace \"urn:namespace3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[7] = "module ext8 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext8\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " organization\n \"organization1\";\n" |
| " organization\n \"organization2\" {\n x:a \"ok\";\n }\n" |
| " organization\n \"organization3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[8] = "module ext9 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext9\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " path \"path1\";\n" |
| " path \"path2\" {\n x:a \"ok\";\n }\n" |
| " path \"path3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[9] = "module ext10 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext10\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " prefix prefix1;\n" |
| " prefix prefix2 {\n x:a \"ok\";\n }\n" |
| " prefix prefix3;\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[10] = "module ext11 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext11\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " presence \"presence1\";\n" |
| " presence \"presence2\" {\n x:a \"ok\";\n }\n" |
| " presence \"presence3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[11] = "module ext12 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext12\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " units \"units1\";\n" |
| " units \"units2\" {\n x:a \"ok\";\n }\n" |
| " units \"units3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[12] = "module ext13 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext13\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " revision-date 2017-02-20;\n" |
| " revision-date 2017-02-25 {\n x:a \"ok\";\n }\n" |
| " revision-date 2017-02-28;\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[13] = "module ext14 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext14\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " base base1;\n" |
| " base base2 {\n x:a \"ok\";\n }\n" |
| " base base3;\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[14] = "module ext15 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext15\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension b;\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " argument argument1;\n" |
| " argument argument2 {\n x:a \"ok\";\n }\n" |
| " argument argument3 {\n" |
| " yin-element true {\n x:b;\n }\n }\n" |
| " argument argument4 {\n" |
| " yin-element false {\n x:a \"value\";\n }\n }\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[15] = "module ext16 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext16\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension b;\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " belongs-to mod1 {\n" |
| " prefix prefix1;\n }\n" |
| " belongs-to mod2 {\n" |
| " prefix prefix2 {\n x:a \"ok\";\n }\n }\n" |
| " belongs-to mod3 {\n x:b;\n" |
| " prefix prefix3;\n }\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| yang[16] = "module ext17 {\n" |
| " yang-version 1.1;\n" |
| " namespace \"urn:ext17\";\n" |
| " prefix x;\n\n" |
| " import ext-def {\n prefix e;\n }\n\n" |
| " extension a {\n" |
| " e:complex-arrays {\n" |
| " key \"key1\";\n" |
| " key \"key2\" {\n x:a \"ok\";\n }\n" |
| " key \"key3\";\n" |
| " }\n argument value;\n" |
| " }\n}\n"; |
| |
| for (i = 0; i < 17; ++i) { |
| printf("module ext%d ... ", i + 1); |
| mod = lys_parse_mem(st->ctx, yang[i], LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| |
| lys_print_mem(&st->str1, mod, LYS_OUT_YANG, NULL, 0, 0); |
| assert_ptr_not_equal(st->str1, NULL); |
| assert_string_equal(st->str1, yang[i]); |
| free(st->str1); |
| st->str1 = NULL; |
| printf("OK\n"); |
| } |
| } |
| |
| void |
| test_extension_yang_data_yin(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yin[8]; |
| int i; |
| |
| yin[0] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext1\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext1\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <choice name=\"hh\"/>\n" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| yin[1] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext2\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext2\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <choice name=\"hh\">\n" |
| " <leaf name=\"str\">" |
| " <type name=\"string\"/>\n" |
| " </leaf>\n" |
| " </choice>\n" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| yin[2] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext3\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext3\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <leaf name=\"str\">" |
| " <type name=\"string\"/>\n" |
| " </leaf>\n" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| yin[3] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext4\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext4\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <container name=\"abc\"/>" |
| " <container name=\"str\">" |
| " <presence value=\"enable\"/>\n" |
| " </container>\n" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| yin[4] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext5\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext5\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <container name=\"abc\">\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <container name=\"str\">" |
| " <presence value=\"enable\"/>\n" |
| " </container>\n" |
| " </rc:yang-data>\n" |
| " </container>\n" |
| "</module>\n"; |
| yin[5] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext6\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext6\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <container name=\"str\">" |
| " <presence value=\"enable\"/>\n" |
| " <leaf name=\"str\">" |
| " <type name=\"string\"/>\n" |
| " </leaf>\n" |
| " </container>\n" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| yin[6] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext7\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext7\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <uses name=\"rc:restconf\"/>" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| yin[7] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
| "<module name=\"ext8\"\n" |
| " xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"\n" |
| " xmlns:rc=\"urn:ietf:params:xml:ns:yang:ietf-restconf\">\n" |
| " <yang-version value=\"1.1\"/>\n" |
| " <namespace uri=\"urn:ext8\"/>\n" |
| " <prefix value=\"x\"/>\n" |
| " <import module=\"ietf-restconf\">\n <prefix value=\"rc\"/>\n </import>\n" |
| " <rc:yang-data>\n" |
| " <rc:name>gg</rc:name>\n" |
| " <choice name=\"hh\">\n" |
| " <case name=\"cs\">" |
| " <uses name=\"rc:restconf\"/>" |
| " </case>" |
| " <container name=\"enableSSH\">" |
| " <presence value=\"enable ssh\"/>\n" |
| " </container>\n" |
| " </choice>\n" |
| " </rc:yang-data>\n" |
| "</module>\n"; |
| |
| for(i = 0; i < 5; ++i) { |
| printf("module ext%d ... ", i + 1); |
| mod = lys_parse_mem(st->ctx, yin[i], LYS_IN_YIN); |
| assert_ptr_equal(mod, NULL); |
| printf("OK\n"); |
| } |
| |
| for(i = 5; i < 8; ++i) { |
| printf("module ext%d ... ", i + 1); |
| mod = lys_parse_mem(st->ctx, yin[i], LYS_IN_YIN); |
| assert_ptr_not_equal(mod, NULL); |
| printf("OK\n"); |
| } |
| } |
| |
| void |
| test_extension_yang_data_yang(void **state) |
| { |
| struct state *st = (*state); |
| const struct lys_module *mod; |
| const char *yang[8]; |
| int i; |
| |
| yang[0] = "module ext1 {\n" |
| " prefix f;\n" |
| " namespace \"urn:cesnet\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " choice hh {\n" |
| " }\n" |
| " }\n" |
| "}"; |
| yang[1] = "module ext2 {\n" |
| " prefix f;\n" |
| " namespace \"urn:cesnet\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " choice hh {\n" |
| " leaf str {\n" |
| " type string;\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| "}"; |
| yang[2] = "module ext3 {\n" |
| " prefix f;\n" |
| " namespace \"urn:cesnet\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " leaf str {\n" |
| " type string;\n" |
| " }\n" |
| " }\n" |
| "}"; |
| yang[3] = "module ext4 {\n" |
| " prefix f;\n" |
| " namespace \"urn:cesnet\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " container abc;\n" |
| " container str {\n" |
| " presence \"enable\";\n" |
| " }\n" |
| " }\n" |
| "}"; |
| yang[4] = "module ext5 {\n" |
| " prefix f;\n" |
| " namespace \"urn:cesnet\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " container abc {\n" |
| " rc:yang-data data {\n" |
| " container str {\n" |
| " presence \"enable\";\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| "}"; |
| yang[5] = "module ext6 {\n" |
| " prefix f6;\n" |
| " namespace \"urn:cesnet:ext5\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " container str {\n" |
| " presence \"enable\";\n" |
| " leaf str {\n" |
| " type string;\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| "}"; |
| yang[6] = "module ext7 {\n" |
| " prefix f7;\n" |
| " namespace \"urn:cesnet:ext6\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " uses rc:restconf;\n" |
| " }\n" |
| "}"; |
| yang[7] = "module ext8 {\n" |
| " prefix f8;\n" |
| " namespace \"urn:cesnet:ext8\";\n" |
| " import ietf-restconf {\n" |
| " prefix rc;\n" |
| " }" |
| " rc:yang-data data {\n" |
| " choice hh {\n" |
| " case cs {\n" |
| " uses rc:errors;\n" |
| " }\n" |
| " container enableSSH {\n" |
| " presence \"enable ssh\";" |
| " }\n" |
| " }\n" |
| " }\n" |
| "}"; |
| |
| for(i = 0; i < 5; ++i) { |
| printf("module ext%d ... ", i + 1); |
| mod = lys_parse_mem(st->ctx, yang[i], LYS_IN_YANG); |
| assert_ptr_equal(mod, NULL); |
| printf("OK\n"); |
| } |
| |
| for(; i < 8; ++i) { |
| printf("module ext%d ... ", i + 1); |
| mod = lys_parse_mem(st->ctx, yang[i], LYS_IN_YANG); |
| assert_ptr_not_equal(mod, NULL); |
| printf("OK\n"); |
| } |
| } |
| |
| int |
| main(void) |
| { |
| const struct CMUnitTest cmut[] = { |
| cmocka_unit_test_setup_teardown(test_module_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_container_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_leaf_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_leaflist_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_list_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_anydata_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_choice_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_uses_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_extension_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_rpc_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_notif_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_deviation_sub_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_arrays_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_mand_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_many_instace_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_arrays_str_yin, setup_ctx_yin, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_extension_yang_data_yin, setup_ctx_yin, teardown_ctx), |
| |
| cmocka_unit_test_setup_teardown(test_module_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_container_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_leaf_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_leaflist_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_list_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_anydata_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_choice_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_uses_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_extension_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_rpc_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_notif_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_deviation_sub_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_arrays_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_mand_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_many_instace_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_complex_arrays_str_yang, setup_ctx_yang, teardown_ctx), |
| cmocka_unit_test_setup_teardown(test_extension_yang_data_yang, setup_ctx_yang, teardown_ctx) |
| }; |
| |
| return cmocka_run_group_tests(cmut, NULL, NULL); |
| } |