Skip to content

Commit 59a1468

Browse files
committed
Python: extend unit tests
Signed-off-by: Matija Amidzic <[email protected]>
1 parent 6c3a4dd commit 59a1468

File tree

4 files changed

+323
-3
lines changed

4 files changed

+323
-3
lines changed

swig/python/tests/test_libyang.py

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,123 @@ def test_ly_set(self):
445445
except Exception as e:
446446
self.fail(e)
447447

448+
def test_ly_ctx_new_ylpath(self):
449+
yang_folder = config.TESTS_DIR + "/api/files"
450+
path = config.TESTS_DIR + "/api/files/ylpath.xml"
451+
452+
try:
453+
ctx = ly.Context(yang_folder, path, ly.LYD_XML, 0)
454+
self.assertIsNotNone(ctx)
455+
list = ctx.get_searchdirs()
456+
self.assertIsNotNone(list)
457+
self.assertEqual(1, len(list))
458+
459+
except Exception as e:
460+
self.fail(e)
461+
462+
def test_ly_ctx_new_ylmem(self):
463+
yang_folder = config.TESTS_DIR + "/api/files"
464+
465+
try:
466+
ctx = ly.Context(yang_folder)
467+
self.assertIsNotNone(ctx)
468+
info = ctx.info()
469+
self.assertIsNotNone(info)
470+
self.assertEqual(ly.LYD_VAL_OK, info.validity())
471+
472+
mem = info.print_mem(ly.LYD_XML, 0)
473+
self.assertIsNotNone(mem)
474+
475+
new_ctx = ly.Context(yang_folder, ly.LYD_XML, mem, 0)
476+
self.assertIsNotNone(new_ctx)
477+
list = ctx.get_searchdirs()
478+
self.assertIsNotNone(list)
479+
self.assertEqual(1, len(list))
480+
481+
except Exception as e:
482+
self.fail(e)
483+
484+
def test_ly_ctx_get_module_iter(self):
485+
yang_folder = config.TESTS_DIR + "/api/files"
486+
module_name = "a"
487+
488+
try:
489+
ctx = ly.Context(yang_folder)
490+
self.assertIsNotNone(ctx)
491+
492+
module = ctx.load_module(module_name)
493+
self.assertIsNotNone(module)
494+
self.assertEqual(module_name, module.name())
495+
itr = ctx.get_module_iter()
496+
self.assertIsNotNone(itr)
497+
self.assertEqual(7, len(itr))
498+
499+
except Exception as e:
500+
self.fail(e)
501+
502+
503+
def test_ly_ctx_get_disabled_module_iter(self):
504+
yang_folder = config.TESTS_DIR + "/api/files"
505+
module_name = "x"
506+
507+
try:
508+
ctx = ly.Context(yang_folder)
509+
self.assertIsNotNone(ctx)
510+
511+
module = ctx.load_module(module_name)
512+
self.assertIsNotNone(module)
513+
self.assertEqual(module_name, module.name())
514+
# FIXME no way to disable module from here
515+
516+
itr = ctx.get_disabled_module_iter()
517+
self.assertIsNotNone(itr)
518+
self.assertEqual(0, len(itr))
519+
520+
except Exception as e:
521+
self.fail(e)
522+
523+
def test_ly_ctx_data_instantiables(self):
524+
yang_folder = config.TESTS_DIR + "/api/files"
525+
module_name = "b"
526+
527+
try:
528+
ctx = ly.Context(yang_folder)
529+
self.assertIsNotNone(ctx)
530+
531+
module = ctx.load_module(module_name)
532+
self.assertIsNotNone(module)
533+
self.assertEqual(module_name, module.name())
534+
535+
instantiables = ctx.data_instantiables(0)
536+
self.assertIsNotNone(instantiables)
537+
self.assertEqual(5, len(instantiables))
538+
539+
except Exception as e:
540+
self.fail(e)
541+
542+
def test_ly_ctx_get_node(self):
543+
yang_folder = config.TESTS_DIR + "/api/files"
544+
module_name = "b"
545+
546+
try:
547+
ctx = ly.Context(yang_folder)
548+
self.assertIsNotNone(ctx)
549+
550+
module = ctx.load_module(module_name)
551+
self.assertIsNotNone(module)
552+
self.assertEqual(module_name, module.name())
553+
554+
instantiables = ctx.data_instantiables(0)
555+
self.assertIsNotNone(instantiables)
556+
self.assertEqual(5, len(instantiables))
557+
558+
schema = instantiables[0];
559+
self.assertIsNotNone(schema)
560+
node = ctx.get_node(schema, "/b:x/b:bubba", 0)
561+
self.assertIsNotNone(node)
562+
563+
except Exception as e:
564+
self.fail(e)
448565

449566
if __name__ == '__main__':
450567
unittest.main()

swig/python/tests/test_tree_data.py

Lines changed: 127 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
<type name=\"string\"/> \
6868
<default value=\"def\"/> \
6969
</leaf> \
70+
<anydata name=\"any-data\"/> \
7071
</container> \
7172
<leaf name=\"y\"><type name=\"string\"/></leaf> \
7273
<anyxml name=\"any\"/> \
@@ -247,8 +248,6 @@ def test_ly_data_node(self):
247248
# Tests
248249
new_node = ly.Data_Node(root, root.schema().module(), "number32", "100")
249250
self.assertIsNotNone(new_node)
250-
dup_node = new_node.dup(0)
251-
self.assertIsNotNone(dup_node)
252251

253252
except Exception as e:
254253
self.fail(e)
@@ -624,5 +623,131 @@ def test_ly_data_node_path(self):
624623
except Exception as e:
625624
self.fail(e)
626625

626+
def test_ly_data_node_leaf(self):
627+
yang_folder = config.TESTS_DIR + "/api/files"
628+
config_file = config.TESTS_DIR + "/api/files/a.xml"
629+
630+
try:
631+
ctx = ly.Context(yang_folder)
632+
self.assertIsNotNone(ctx)
633+
ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
634+
root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
635+
self.assertIsNotNone(root)
636+
637+
new_node = ly.Data_Node(root, root.schema().module(), "number32", "100")
638+
self.assertIsNotNone(new_node)
639+
640+
except Exception as e:
641+
self.fail(e)
642+
643+
def test_ly_data_node_anydata(self):
644+
yang_folder = config.TESTS_DIR + "/api/files"
645+
config_file = config.TESTS_DIR + "/api/files/a.xml"
646+
647+
try:
648+
ctx = ly.Context(yang_folder)
649+
self.assertIsNotNone(ctx)
650+
ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
651+
root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
652+
self.assertIsNotNone(root)
653+
mod = ctx.get_module("a", None, 1)
654+
655+
new_node = ly.Data_Node(root, mod, "any-data", "100", ly.LYD_ANYDATA_CONSTSTRING)
656+
self.assertIsNotNone(new_node)
657+
658+
except Exception as e:
659+
self.fail(e)
660+
661+
def test_ly_data_node_dup(self):
662+
yang_folder = config.TESTS_DIR + "/api/files";
663+
config_file = config.TESTS_DIR + "/api/files/a.xml";
664+
665+
try:
666+
ctx = ly.Context(yang_folder)
667+
self.assertIsNotNone(ctx)
668+
ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
669+
root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
670+
self.assertIsNotNone(root)
671+
672+
new_node = ly.Data_Node(root, root.child().schema().module(), "bar-y")
673+
self.assertIsNotNone(new_node)
674+
dup_node = new_node.dup(0);
675+
self.assertIsNotNone(dup_node)
676+
677+
except Exception as e:
678+
self.fail(e)
679+
680+
681+
def test_ly_data_node_dup_to_ctx(self):
682+
sch = "module x {\
683+
namespace urn:x;\
684+
prefix x;\
685+
leaf x { type string; }}"
686+
data = "<x xmlns=\"urn:x\">hello</x>"
687+
688+
try:
689+
ctx1 = ly.Context(None)
690+
self.assertIsNotNone(ctx1);
691+
ctx1.parse_module_mem(sch, ly.LYS_IN_YANG)
692+
data1 = ctx1.parse_data_mem(data, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
693+
self.assertIsNotNone(data1)
694+
695+
ctx2 = ly.Context(None)
696+
self.assertIsNotNone(ctx2)
697+
# we expect NULL due to missing schema in the second ctx
698+
dup_node = data1.dup_to_ctx(1, ctx2)
699+
self.assertIsNone(dup_node)
700+
701+
ctx2.parse_module_mem(sch, ly.LYS_IN_YANG)
702+
# now we expect success due to schema being added to the second ctx
703+
dup_node = data1.dup_to_ctx(1, ctx2)
704+
self.assertIsNotNone(dup_node)
705+
706+
except Exception as e:
707+
self.fail(e)
708+
709+
def test_ly_data_node_validate_node(self):
710+
yang_folder = config.TESTS_DIR + "/api/files";
711+
config_file = config.TESTS_DIR + "/api/files/a.xml";
712+
713+
try:
714+
ctx = ly.Context(yang_folder)
715+
self.assertIsNotNone(ctx)
716+
ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
717+
root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
718+
self.assertIsNotNone(root)
719+
720+
rc = root.validate(ly.LYD_OPT_CONFIG, ctx)
721+
self.assertEqual(0, rc)
722+
new_node = ly.Data_Node(root, root.schema().module(), "number32", "1")
723+
self.assertIsNotNone(new_node)
724+
rc = root.validate(ly.LYD_OPT_CONFIG, new_node)
725+
self.assertEqual(0, rc)
726+
727+
except Exception as e:
728+
self.fail(e)
729+
730+
def test_ly_data_node_validate_value(self):
731+
yang_folder = config.TESTS_DIR + "/api/files";
732+
config_file = config.TESTS_DIR + "/api/files/a.xml";
733+
734+
try:
735+
ctx = ly.Context(yang_folder)
736+
self.assertIsNotNone(ctx)
737+
ctx.parse_module_mem(lys_module_a, ly.LYS_IN_YIN)
738+
root = ctx.parse_data_path(config_file, ly.LYD_XML, ly.LYD_OPT_CONFIG | ly.LYD_OPT_STRICT)
739+
self.assertIsNotNone(root)
740+
741+
rc = root.validate(ly.LYD_OPT_CONFIG, ctx)
742+
self.assertEqual(0, rc)
743+
new_node = ly.Data_Node(root, root.schema().module(), "number32", "1")
744+
self.assertIsNotNone(new_node)
745+
self.assertEqual(0, new_node.validate_value("1"))
746+
self.assertEqual(0, new_node.validate_value("100"))
747+
self.assertEqual(0, new_node.validate_value("110000000"))
748+
749+
except Exception as e:
750+
self.fail(e)
751+
627752
if __name__ == '__main__':
628753
unittest.main()

swig/python/tests/test_tree_schema.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,5 +552,46 @@ def test_ly_schema_node_path(self):
552552
except Exception as e:
553553
self.fail(e)
554554

555+
def test_ly_module_data_instatiables(self):
556+
yang_folder = config.TESTS_DIR + "/api/files"
557+
module_name = "b"
558+
559+
try:
560+
ctx = ly.Context(yang_folder)
561+
self.assertIsNotNone(ctx)
562+
563+
module = ctx.load_module(module_name)
564+
self.assertIsNotNone(module)
565+
self.assertEqual(module_name, module.name())
566+
567+
instantiables = module.data_instantiables(0)
568+
self.assertIsNotNone(instantiables)
569+
self.assertEqual(1, len(instantiables))
570+
571+
except Exception as e:
572+
self.fail(e)
573+
574+
def test_ly_schema_child_instatiables(self):
575+
yang_folder = config.TESTS_DIR + "/api/files"
576+
module_name = "b"
577+
578+
try:
579+
ctx = ly.Context(yang_folder)
580+
self.assertIsNotNone(ctx)
581+
582+
module = ctx.load_module(module_name)
583+
self.assertIsNotNone(module)
584+
self.assertEqual(module_name, module.name())
585+
586+
instantiables = module.data_instantiables(0)
587+
self.assertIsNotNone(instantiables)
588+
self.assertEqual(1, len(instantiables))
589+
child_instantiables = instantiables[0].child_instantiables(0)
590+
self.assertIsNotNone(child_instantiables)
591+
self.assertEqual(3, len(child_instantiables))
592+
593+
except Exception as e:
594+
self.fail(e)
595+
555596
if __name__ == '__main__':
556-
unittest.main()
597+
unittest.main()

tests/api/files/ylpath.xml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<yang-library xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library">
2+
<module-set>
3+
<name>complete</name>
4+
<checksum>7</checksum>
5+
<import-only-module>
6+
<name>ietf-yang-metadata</name>
7+
<revision>2016-08-05</revision>
8+
<namespace>urn:ietf:params:xml:ns:yang:ietf-yang-metadata</namespace>
9+
</import-only-module>
10+
<module>
11+
<name>yang</name>
12+
<revision>2017-02-20</revision>
13+
<namespace>urn:ietf:params:xml:ns:yang:1</namespace>
14+
</module>
15+
<import-only-module>
16+
<name>ietf-inet-types</name>
17+
<revision>2013-07-15</revision>
18+
<namespace>urn:ietf:params:xml:ns:yang:ietf-inet-types</namespace>
19+
</import-only-module>
20+
<import-only-module>
21+
<name>ietf-yang-types</name>
22+
<revision>2013-07-15</revision>
23+
<namespace>urn:ietf:params:xml:ns:yang:ietf-yang-types</namespace>
24+
</import-only-module>
25+
<import-only-module>
26+
<name>ietf-datastores</name>
27+
<revision>2017-08-17</revision>
28+
<namespace>urn:ietf:params:xml:ns:yang:ietf-datastores</namespace>
29+
</import-only-module>
30+
<module>
31+
<name>ietf-yang-library</name>
32+
<revision>2018-01-17</revision>
33+
<namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace>
34+
</module>
35+
</module-set>
36+
<checksum>7</checksum>
37+
</yang-library>

0 commit comments

Comments
 (0)