Blame swig/python/tests/test_tree_data.py

Packit 8fb591
#!/usr/bin/env python
Packit 8fb591
from __future__ import print_function
Packit 8fb591
Packit 8fb591
__author__ = "Matija Amidzic <matija.amidzic@sartura.hr>"
Packit 8fb591
__copyright__ = "Copyright 2018, Deutsche Telekom AG"
Packit 8fb591
__license__ = "BSD 3-Clause"
Packit 8fb591
Packit 8fb591
# This source code is licensed under BSD 3-Clause License (the "License").
Packit 8fb591
# You may not use this file except in compliance with the License.
Packit 8fb591
# You may obtain a copy of the License at
Packit 8fb591
#
Packit 8fb591
#     https://opensource.org/licenses/BSD-3-Clause
Packit 8fb591
Packit 8fb591
import yang as ly
Packit 8fb591
import unittest
Packit 8fb591
import sys
Packit 8fb591
Packit 8fb591
import config
Packit 8fb591
Packit 8fb591
lys_module_a = \
Packit 8fb591
"           \
Packit 8fb591
Packit 8fb591
        xmlns=\"urn:ietf:params:xml:ns:yang:yin:1\"   \
Packit 8fb591
        xmlns:md=\"urn:ietf:params:xml:ns:yang:ietf-yang-metadata\"\
Packit 8fb591
        xmlns:a=\"urn:a\">                            \
Packit 8fb591
  <namespace uri=\"urn:a\"/>                          \
Packit 8fb591
  <prefix value=\"a_mod\"/>                           \
Packit 8fb591
  <include module=\"asub\"/>                          \
Packit 8fb591
  <include module=\"atop\"/>                          \
Packit 8fb591
  <import module=\"ietf-yang-metadata\">              \
Packit 8fb591
    <prefix value=\"md\"/>                            \
Packit 8fb591
  </import>                                           \
Packit 8fb591
  <feature name=\"foo\"/>                             \
Packit 8fb591
  <grouping name=\"gg\">                              \
Packit 8fb591
    <leaf name=\"bar-gggg\">                          \
Packit 8fb591
      <type name=\"string\"/>                         \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
  </grouping>                                         \
Packit 8fb591
  <md:annotation name=\"test\">                       \
Packit 8fb591
    <type name=\"string\"/>                           \
Packit 8fb591
  </md:annotation>                                    \
Packit 8fb591
  <container name=\"x\">                              \
Packit 8fb591
    <leaf name=\"bar-leaf\">                          \
Packit 8fb591
      <type name=\"string\"/>                         \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <uses name=\"gg\">                                \
Packit 8fb591
    </uses>                                           \
Packit 8fb591
    <leaf name=\"baz\">                               \
Packit 8fb591
      <type name=\"string\"/>                         \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <leaf name=\"bubba\">                             \
Packit 8fb591
      <type name=\"string\"/>                         \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <leaf name=\"number32\">                          \
Packit 8fb591
      <type name=\"int32\"/>                          \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <leaf name=\"number64\">                          \
Packit 8fb591
      <type name=\"int64\"/>                          \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <leaf name=\"def-leaf\">                          \
Packit 8fb591
      <type name=\"string\"/>                         \
Packit 8fb591
      <default value=\"def\"/>                        \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <anydata name=\"any-data\"/>                      \
Packit 8fb591
  </container>                                        \
Packit 8fb591
  <leaf name=\"y\"><type name=\"string\"/></leaf>     \
Packit 8fb591
  <anyxml name=\"any\"/>                              \
Packit 8fb591
  <augment target-node=\"/x\">                        \
Packit 8fb591
    <container name=\"bar-y\"/>                       \
Packit 8fb591
  </augment>                                          \
Packit 8fb591
  <rpc name=\"bar-rpc\">                              \
Packit 8fb591
  </rpc>                                              \
Packit 8fb591
  <rpc name=\"foo-rpc\">                              \
Packit 8fb591
  </rpc>                                              \
Packit 8fb591
  <rpc name=\"rpc1\">                                 \
Packit 8fb591
    <input>                                           \
Packit 8fb591
      <leaf name=\"input-leaf1\">                     \
Packit 8fb591
        <type name=\"string\"/>                       \
Packit 8fb591
      </leaf>                                         \
Packit 8fb591
      <container name=\"x\">                          \
Packit 8fb591
        <leaf name=\"input-leaf2\">                   \
Packit 8fb591
          <type name=\"string\"/>                     \
Packit 8fb591
        </leaf>                                       \
Packit 8fb591
      </container>                                    \
Packit 8fb591
    </input>                                          \
Packit 8fb591
    <output>                                          \
Packit 8fb591
      <leaf name=\"output-leaf1\">                    \
Packit 8fb591
        <type name=\"string\"/>                       \
Packit 8fb591
      </leaf>                                         \
Packit 8fb591
      <leaf name=\"output-leaf2\">                    \
Packit 8fb591
        <type name=\"string\"/>                       \
Packit 8fb591
      </leaf>                                         \
Packit 8fb591
      <container name=\"rpc-container\">              \
Packit 8fb591
        <leaf name=\"output-leaf3\">                  \
Packit 8fb591
          <type name=\"string\"/>                     \
Packit 8fb591
        </leaf>                                       \
Packit 8fb591
      </container>                                    \
Packit 8fb591
    </output>                                         \
Packit 8fb591
  </rpc>                                              \
Packit 8fb591
  <list name=\"l\">                                   \
Packit 8fb591
    <key value=\"key1 key2\"/>                        \
Packit 8fb591
    <leaf name=\"key1\">                              \
Packit 8fb591
      <type name=\"uint8\"/>                          \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <leaf name=\"key2\">                              \
Packit 8fb591
      <type name=\"uint8\"/>                          \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
    <leaf name=\"value\">                             \
Packit 8fb591
      <type name=\"string\"/>                         \
Packit 8fb591
    </leaf>                                           \
Packit 8fb591
  </list>                                             \
Packit 8fb591
</module>                                             \
Packit 8fb591
"
Packit 8fb591
Packit 8fb591
a_data_xml = "\
Packit 8fb591
<x xmlns=\"urn:a\">\n\
Packit 8fb591
  <bubba>test</bubba>\n\
Packit 8fb591
  </x>\n"
Packit 8fb591
Packit 8fb591
result_xml = "<x xmlns=\"urn:a\"><bubba>test</bubba></x>"
Packit 8fb591
Packit 8fb591
result_xml_format ="\
Packit 8fb591
<x xmlns=\"urn:a\">\n\
Packit 8fb591
  <bubba>test</bubba>\n\
Packit 8fb591
</x>\n\
Packit 8fb591
"
Packit 8fb591
Packit 8fb591
result_json = "\
Packit 8fb591
{\n\
Packit 8fb591
  \"a:x\": {\n\
Packit 8fb591
    \"bubba\": \"test\"\n\
Packit 8fb591
  }\n\
Packit 8fb591
}\n\
Packit 8fb591
"
Packit 8fb591
Packit 8fb591
class UnexpectedError(Exception):
Packit 8fb591
    """Exception raised for errors that are not expected.
Packit 8fb591
Packit 8fb591
    Attributes:
Packit 8fb591
        message -- explanation of the error
Packit 8fb591
    """
Packit 8fb591
Packit 8fb591
    def __init__(self, message):
Packit 8fb591
        self.message = message
Packit 8fb591
Packit 8fb591
class TestUM(unittest.TestCase):
Packit 8fb591
    def test_ly_ctx_parse_data_mem(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        yin_file = config.TESTS_DIR + "/api/files/a.yin"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_path(yin_file, ly.LYS_IN_YIN)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            root = ctx.parse_data_mem(a_data_xml, ly.LYD_XML, ly.LYD_OPT_NOSIBLINGS | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
            self.assertEqual("x", root.schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_ctx_parse_data_fd(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        yin_file = config.TESTS_DIR + "/api/files/a.yin"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_path(yin_file, ly.LYS_IN_YIN)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            f = open(config_file, 'r')
Packit 8fb591
            fd = f.fileno()
Packit 8fb591
            root = ctx.parse_data_fd(fd, ly.LYD_XML, ly.LYD_OPT_NOSIBLINGS | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
            self.assertEqual("x", root.schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
        finally:
Packit 8fb591
            f.close()
Packit 8fb591
Packit 8fb591
    def test_ly_ctx_parse_data_path(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        yin_file = config.TESTS_DIR + "/api/files/a.yin"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        module_name = "a"
Packit 8fb591
        schema_name = "x"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            module = ctx.parse_module_path(yin_file, ly.LYS_IN_YIN)
Packit 8fb591
            self.assertIsNotNone(module)
Packit 8fb591
            self.assertEqual(module_name, module.name(), "Module names don't match")
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
            self.assertEqual(schema_name, root.schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_ctx_parse_data_path_invalid(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            root = ctx.parse_data_path("INVALID_PATH", ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            raise UnexpectedError("exception not thrown")
Packit 8fb591
Packit 8fb591
        except UnexpectedError as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
        except RuntimeError as e:
Packit 8fb591
            return
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            new_node = ly.Data_Node(root, root.schema().module(), "number32", "100")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_new_path(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            mod = ctx.get_module("a", None, 1)
Packit 8fb591
            self.assertIsNotNone(mod)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            root = ly.Data_Node(ctx, "/a:x/bar-gggg", "a", 0, 0)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
            self.assertEqual("x", root.schema().name())
Packit 8fb591
            self.assertEqual("bar-gggg", root.child().schema().name())
Packit 8fb591
Packit 8fb591
            node = root.new_path(ctx, "def-leaf", "def", 0, ly.LYD_PATH_OPT_DFLT)
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            self.assertEqual("def-leaf", node.schema().name())
Packit 8fb591
            self.assertEqual(1, node.dflt())
Packit 8fb591
Packit 8fb591
            node = root.new_path(ctx, "def-leaf", "def", 0, 0)
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            self.assertEqual("def-leaf", node.schema().name())
Packit 8fb591
            self.assertEqual(0, node.dflt())
Packit 8fb591
Packit 8fb591
            node = root.new_path(ctx, "bubba", "b", 0, 0)
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            self.assertEqual("bubba", node.schema().name())
Packit 8fb591
Packit 8fb591
            node = root.new_path(ctx, "/a:x/number32", "3", 0, 0)
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            self.assertEqual("number32", node.schema().name())
Packit 8fb591
Packit 8fb591
            node = root.new_path(ctx, "/a:l[key1='1'][key2='2']/value", None, 0, 0)
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            self.assertEqual("l", node.schema().name())
Packit 8fb591
            self.assertEqual("key1", node.child().schema().name())
Packit 8fb591
            self.assertEqual("key2", node.child().next().schema().name())
Packit 8fb591
            self.assertEqual("value", node.child().next().next().schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_insert(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            new_node = ly.Data_Node(root, root.schema().module(), "number32", "200")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            rc = root.insert(new_node)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            self.assertEqual("number32", root.child().prev().schema().name())
Packit 8fb591
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_insert_sibling(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            last = root.prev()
Packit 8fb591
            new_node = ly.Data_Node(None, root.schema().module(), "y", "test")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            rc = root.insert_sibling(new_node)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            self.assertNotEqual(last.schema().name(), root.prev().schema().name())
Packit 8fb591
            self.assertEqual("y", root.prev().schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_insert_before(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            last = root.prev()
Packit 8fb591
            new_node = ly.Data_Node(None, root.schema().module(), "y", "test")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            rc = root.insert_before(new_node)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            self.assertNotEqual(last.schema().name(), root.prev().schema().name())
Packit 8fb591
            self.assertEqual("y", root.prev().schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_insert_after(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            last = root.next()
Packit 8fb591
            new_node = ly.Data_Node(None, root.schema().module(), "y", "test")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            rc = root.insert_after(new_node)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            self.assertNotEqual(last.schema().name(), root.next().schema().name())
Packit 8fb591
            self.assertEqual("y", root.next().schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_schema_sort(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            mod = ctx.get_module("a", None, 1)
Packit 8fb591
            self.assertIsNotNone(mod)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            root = ly.Data_Node(None, mod, "l")
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
            node = ly.Data_Node(root, mod, "key1", "1")
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            node = ly.Data_Node(root, mod, "key2", "2")
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
Packit 8fb591
            node = ly.Data_Node(None, mod, "x")
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            rc = root.insert_after(node)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            node = root.next()
Packit 8fb591
Packit 8fb591
            node2 = ly.Data_Node(node, mod, "bubba", "a")
Packit 8fb591
            self.assertIsNotNone(node2)
Packit 8fb591
            node2 = ly.Data_Node(node, mod, "bar-gggg", "b")
Packit 8fb591
            self.assertIsNotNone(node2)
Packit 8fb591
            node2 = ly.Data_Node(node, mod, "number64", "64")
Packit 8fb591
            self.assertIsNotNone(node2)
Packit 8fb591
            node2 = ly.Data_Node(node, mod, "number32", "32")
Packit 8fb591
            self.assertIsNotNone(node2)
Packit 8fb591
Packit 8fb591
            rc = root.schema_sort(1)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
Packit 8fb591
            root = node
Packit 8fb591
            self.assertEqual("x", root.schema().name())
Packit 8fb591
            self.assertEqual("l", root.next().schema().name())
Packit 8fb591
Packit 8fb591
            self.assertEqual("bar-gggg", root.child().schema().name())
Packit 8fb591
            self.assertEqual("bubba", root.child().next().schema().name())
Packit 8fb591
            self.assertEqual("number32", root.child().next().next().schema().name())
Packit 8fb591
            self.assertEqual("number64", root.child().next().next().next().schema().name())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_find_path(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            node = root.child()
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            set = node.find_path("/a:x/bubba")
Packit 8fb591
            self.assertIsNotNone(set)
Packit 8fb591
            self.assertEqual(1, set.number())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_find_instance(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            node = root.child()
Packit 8fb591
            self.assertIsNotNone(node)
Packit 8fb591
            set = node.find_instance(node.schema())
Packit 8fb591
            self.assertIsNotNone(set)
Packit 8fb591
            self.assertEqual(1, set.number())
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_validate(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            rc = root.validate(ly.LYD_OPT_CONFIG, ctx)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            new = ly.Data_Node(root, root.schema().module(), "number32", "1")
Packit 8fb591
            self.assertIsNotNone(new)
Packit 8fb591
            rc = root.insert(new)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            rc = root.validate(ly.LYD_OPT_CONFIG, ctx)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_unlink(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            node = root.child()
Packit 8fb591
            new = ly.Data_Node(root, node.schema().module(), "number32", "1")
Packit 8fb591
            self.assertIsNotNone(new)
Packit 8fb591
            rc = root.insert(new)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
Packit 8fb591
            schema = node.prev().schema()
Packit 8fb591
            if (ly.LYS_LEAF == schema.nodetype() or ly.LYS_LEAFLIST == schema.nodetype()):
Packit 8fb591
                casted = node.prev().subtype()
Packit 8fb591
                self.assertEqual("1", casted.value_str())
Packit 8fb591
            else:
Packit 8fb591
                self.fail()
Packit 8fb591
Packit 8fb591
            rc = node.prev().unlink()
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            schema = node.prev().schema()
Packit 8fb591
            if (ly.LYS_LEAF == schema.nodetype() or ly.LYS_LEAFLIST == schema.nodetype()):
Packit 8fb591
                self.fail()
Packit 8fb591
            else:
Packit 8fb591
                return
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_print_mem_xml(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            result = root.print_mem(ly.LYD_XML, 0)
Packit 8fb591
            self.assertEqual(result_xml, result)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_print_mem_xml_format(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            result = root.print_mem(ly.LYD_XML, ly.LYP_FORMAT)
Packit 8fb591
            self.assertEqual(result_xml_format, result)
Packit 8fb591
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_print_mem_json(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            result = root.print_mem(ly.LYD_JSON, ly.LYP_FORMAT)
Packit 8fb591
            self.assertEqual(result_json, result)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_path(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
        try:
Packit 8fb591
            # Setup
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            # Tests
Packit 8fb591
            str = root.path()
Packit 8fb591
            self.assertIsNotNone(str)
Packit 8fb591
            self.assertEqual("/a:x", str)
Packit 8fb591
            str = root.child().path()
Packit 8fb591
            self.assertIsNotNone(str)
Packit 8fb591
            self.assertEqual("/a:x/bubba", str)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_leaf(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            new_node = ly.Data_Node(root, root.schema().module(), "number32", "100")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_anydata(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files"
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
            mod = ctx.get_module("a", None, 1)
Packit 8fb591
Packit 8fb591
            new_node = ly.Data_Node(root, mod, "any-data", "100", ly.LYD_ANYDATA_CONSTSTRING)
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_dup(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files";
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml";
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            new_node = ly.Data_Node(root, root.child().schema().module(), "bar-y")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            dup_node = new_node.dup(0);
Packit 8fb591
            self.assertIsNotNone(dup_node)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_dup_to_ctx(self):
Packit 8fb591
        sch = "module x {\
Packit 8fb591
              namespace urn:x;\
Packit 8fb591
              prefix x;\
Packit 8fb591
              leaf x { type string; }}"
Packit 8fb591
        data = "<x xmlns=\"urn:x\">hello</x>"
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            ctx1 = ly.Context(None)
Packit 8fb591
            self.assertIsNotNone(ctx1);
Packit 8fb591
            ctx1.parse_module_mem(sch, ly.LYS_IN_YANG)
Packit 8fb591
            data1 = ctx1.parse_data_mem(data, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(data1)
Packit 8fb591
Packit 8fb591
            ctx2 = ly.Context(None)
Packit 8fb591
            self.assertIsNotNone(ctx2)
Packit 8fb591
            # we expect NULL due to missing schema in the second ctx
Packit 8fb591
            dup_node = data1.dup_to_ctx(1, ctx2)
Packit 8fb591
            self.assertIsNone(dup_node)
Packit 8fb591
Packit 8fb591
            ctx2.parse_module_mem(sch, ly.LYS_IN_YANG)
Packit 8fb591
            # now we expect success due to schema being added to the second ctx
Packit 8fb591
            dup_node = data1.dup_to_ctx(1, ctx2)
Packit 8fb591
            self.assertIsNotNone(dup_node)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_validate_node(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files";
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml";
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            rc = root.validate(ly.LYD_OPT_CONFIG, ctx)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            new_node = ly.Data_Node(root, root.schema().module(), "number32", "1")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            rc = root.validate(ly.LYD_OPT_CONFIG, new_node)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
    def test_ly_data_node_validate_value(self):
Packit 8fb591
        yang_folder = config.TESTS_DIR + "/api/files";
Packit 8fb591
        config_file = config.TESTS_DIR + "/api/files/a.xml";
Packit 8fb591
Packit 8fb591
        try:
Packit 8fb591
            ctx = ly.Context(yang_folder)
Packit 8fb591
            self.assertIsNotNone(ctx)
Packit 8fb591
            ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
Packit 8fb591
            root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
Packit 8fb591
            self.assertIsNotNone(root)
Packit 8fb591
Packit 8fb591
            rc = root.validate(ly.LYD_OPT_CONFIG, ctx)
Packit 8fb591
            self.assertEqual(0, rc)
Packit 8fb591
            new_node = ly.Data_Node(root, root.schema().module(), "number32", "1")
Packit 8fb591
            self.assertIsNotNone(new_node)
Packit 8fb591
            self.assertEqual(0, new_node.validate_value("1"))
Packit 8fb591
            self.assertEqual(0, new_node.validate_value("100"))
Packit 8fb591
            self.assertEqual(0, new_node.validate_value("110000000"))
Packit 8fb591
Packit 8fb591
        except Exception as e:
Packit 8fb591
            self.fail(e)
Packit 8fb591
Packit 8fb591
if __name__ == '__main__':
Packit 8fb591
    unittest.main()