Merging upstream version 3.12.2.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
6375ddbe5b
commit
580fa3f55c
66 changed files with 4041 additions and 2142 deletions
|
@ -23,11 +23,11 @@
|
|||
#define CHECK_LYD_STRING(INPUT, TEXT) \
|
||||
CHECK_LYD_STRING_PARAM(INPUT, TEXT, LYD_XML, LYD_PRINT_WITHSIBLINGS)
|
||||
|
||||
#define CHECK_PARSE_LYD_DIFF(INPUT_1, INPUT_2, OUT_DIFF) \
|
||||
assert_int_equal(LY_SUCCESS, lyd_diff_siblings(INPUT_1, INPUT_2, 0, &OUT_DIFF));\
|
||||
#define CHECK_PARSE_LYD_DIFF(INPUT_1, INPUT_2, OPTS, OUT_DIFF) \
|
||||
assert_int_equal(LY_SUCCESS, lyd_diff_siblings(INPUT_1, INPUT_2, OPTS, &OUT_DIFF));\
|
||||
assert_non_null(OUT_DIFF)
|
||||
|
||||
#define TEST_DIFF_3(XML1, XML2, XML3, DIFF1, DIFF2, MERGE) \
|
||||
#define TEST_DIFF_3(XML1, XML2, XML3, OPTS, DIFF1, DIFF2, MERGE) \
|
||||
{ \
|
||||
struct lyd_node *data1;\
|
||||
struct lyd_node *data2;\
|
||||
|
@ -38,13 +38,13 @@
|
|||
CHECK_PARSE_LYD(XML3, data3);\
|
||||
/* diff1 */ \
|
||||
struct lyd_node *diff1;\
|
||||
CHECK_PARSE_LYD_DIFF(data1, data2, diff1); \
|
||||
CHECK_PARSE_LYD_DIFF(data1, data2, OPTS, diff1); \
|
||||
CHECK_LYD_STRING(diff1, DIFF1); \
|
||||
assert_int_equal(lyd_diff_apply_all(&data1, diff1), LY_SUCCESS); \
|
||||
CHECK_LYD(data1, data2); \
|
||||
/* diff2 */ \
|
||||
struct lyd_node *diff2;\
|
||||
CHECK_PARSE_LYD_DIFF(data2, data3, diff2); \
|
||||
CHECK_PARSE_LYD_DIFF(data2, data3, OPTS, diff2); \
|
||||
CHECK_LYD_STRING(diff2, DIFF2); \
|
||||
assert_int_equal(lyd_diff_apply_all(&data2, diff2), LY_SUCCESS);\
|
||||
CHECK_LYD(data2, data3);\
|
||||
|
@ -59,248 +59,104 @@
|
|||
lyd_free_all(diff2);\
|
||||
}
|
||||
|
||||
const char *schema1 =
|
||||
"module defaults {\n"
|
||||
" yang-version 1.1;\n"
|
||||
" namespace \"urn:libyang:tests:defaults\";\n"
|
||||
" prefix df;\n"
|
||||
const char *schema =
|
||||
"module defaults {"
|
||||
"yang-version 1.1;"
|
||||
"namespace \"urn:libyang:tests:defaults\";"
|
||||
"prefix df;"
|
||||
""
|
||||
" feature unhide;\n"
|
||||
"import ietf-yang-metadata {prefix md;}"
|
||||
""
|
||||
" typedef defint32 {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
"feature unhide;"
|
||||
""
|
||||
" leaf hiddenleaf {\n"
|
||||
" if-feature \"unhide\";\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
"md:annotation my-meta {type string;}"
|
||||
"md:annotation my-meta2 {type string;}"
|
||||
""
|
||||
" container df {\n"
|
||||
" leaf foo {\n"
|
||||
" type defint32;\n"
|
||||
" }\n"
|
||||
"typedef defint32 {type int32; default \"42\";}"
|
||||
""
|
||||
" leaf hiddenleaf {\n"
|
||||
" if-feature \"unhide\";\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" container bar {\n"
|
||||
" presence \"\";\n"
|
||||
" leaf hi {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf ho {\n"
|
||||
" type int32;\n"
|
||||
" mandatory true;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf-list llist {\n"
|
||||
" type defint32;\n"
|
||||
" ordered-by user;\n"
|
||||
" }\n"
|
||||
""
|
||||
" list ul {\n"
|
||||
" key \"l1\";\n"
|
||||
" ordered-by user;\n"
|
||||
" leaf l1 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf l2 {\n"
|
||||
" type int32;\n"
|
||||
" }\n"
|
||||
""
|
||||
" container cont {\n"
|
||||
" leaf l3 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf-list dllist {\n"
|
||||
" type uint8;\n"
|
||||
" default \"1\";\n"
|
||||
" default \"2\";\n"
|
||||
" default \"3\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" list list {\n"
|
||||
" key \"name\";\n"
|
||||
" leaf name {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf value {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
" list list2 {\n"
|
||||
" key \"name2\";\n"
|
||||
" leaf name2 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
" leaf value2 {\n"
|
||||
" type int32;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n";
|
||||
const char *schema2 =
|
||||
" choice select {\n"
|
||||
" default \"a\";\n"
|
||||
" case a {\n"
|
||||
" choice a {\n"
|
||||
" leaf a1 {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf a2 {\n"
|
||||
" type int32;\n"
|
||||
" default \"24\";\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf b {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
""
|
||||
" container c {\n"
|
||||
" presence \"\";\n"
|
||||
" leaf x {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" choice select2 {\n"
|
||||
" default \"s2b\";\n"
|
||||
" leaf s2a {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" case s2b {\n"
|
||||
" choice s2b {\n"
|
||||
" default \"b1\";\n"
|
||||
" case b1 {\n"
|
||||
" leaf b1_1 {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf b1_2 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf b1_status {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" config false;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf b2 {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" list kl {\n"
|
||||
" config \"false\";\n"
|
||||
" leaf l1 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf l2 {\n"
|
||||
" type int32;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf-list kll {\n"
|
||||
" config \"false\";\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" container hidden {\n"
|
||||
" leaf foo {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf baz {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf papa {\n"
|
||||
" type int32;\n"
|
||||
" default \"42\";\n"
|
||||
" config false;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" rpc rpc1 {\n"
|
||||
" input {\n"
|
||||
" leaf inleaf1 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf inleaf2 {\n"
|
||||
" type string;\n"
|
||||
" default \"def1\";\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" output {\n"
|
||||
" leaf outleaf1 {\n"
|
||||
" type string;\n"
|
||||
" default \"def2\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf outleaf2 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
""
|
||||
" notification notif {\n"
|
||||
" leaf ntfleaf1 {\n"
|
||||
" type string;\n"
|
||||
" default \"def3\";\n"
|
||||
" }\n"
|
||||
""
|
||||
" leaf ntfleaf2 {\n"
|
||||
" type string;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n";
|
||||
"leaf hiddenleaf {if-feature \"unhide\"; type int32; default \"42\";}"
|
||||
"container df {"
|
||||
" leaf foo {type defint32; }"
|
||||
" leaf hiddenleaf {if-feature \"unhide\"; type int32; default \"42\";}"
|
||||
" container bar { presence \"\";"
|
||||
" leaf hi {type int32; default \"42\";}"
|
||||
" leaf ho {type int32; mandatory true;}"
|
||||
" }"
|
||||
" leaf-list llist {type defint32; ordered-by user;}"
|
||||
" list ul {key \"l1\"; ordered-by user;"
|
||||
" leaf l1 {type string;}"
|
||||
" leaf l2 {type int32;}"
|
||||
" container cont {"
|
||||
" leaf l3 {type string;}"
|
||||
" }"
|
||||
" }"
|
||||
" leaf-list dllist {type uint8; default \"1\"; default \"2\"; default \"3\";}"
|
||||
" list list {key \"name\";"
|
||||
" leaf name {type string;}"
|
||||
" leaf value {type int32; default \"42\";}"
|
||||
" list list2 {key \"name2\";"
|
||||
" leaf name2 {type string;}"
|
||||
" leaf value2 {type int32;}"
|
||||
" }"
|
||||
" }"
|
||||
" choice select {default \"a\";"
|
||||
" case a {"
|
||||
" choice a {"
|
||||
" leaf a1 {type int32; default \"42\";}"
|
||||
" leaf a2 {type int32; default \"24\";}"
|
||||
" }"
|
||||
" }"
|
||||
" leaf b {type string;}"
|
||||
" container c {presence \"\";"
|
||||
" leaf x {type int32; default \"42\";}"
|
||||
" }"
|
||||
" }"
|
||||
" choice select2 {default \"s2b\";"
|
||||
" leaf s2a {type int32; default \"42\";}"
|
||||
" case s2b {"
|
||||
" choice s2b {default \"b1\";"
|
||||
" case b1 {"
|
||||
" leaf b1_1 {type int32; default \"42\";}"
|
||||
" leaf b1_2 {type string;}"
|
||||
" leaf b1_status {type int32; default \"42\"; config false;}"
|
||||
" }"
|
||||
" leaf b2 {type int32; default \"42\";}"
|
||||
" }"
|
||||
" }"
|
||||
" }"
|
||||
" list kl {config \"false\";"
|
||||
" leaf l1 {type string;}"
|
||||
" leaf l2 {type int32;}"
|
||||
" }"
|
||||
" leaf-list kll {config \"false\"; type string;}"
|
||||
"}"
|
||||
"container hidden {"
|
||||
" leaf foo {type int32; default \"42\";}"
|
||||
" leaf baz {type int32; default \"42\";}"
|
||||
" leaf papa {type int32; default \"42\"; config false;}"
|
||||
"}"
|
||||
"rpc rpc1 {"
|
||||
" input {"
|
||||
" leaf inleaf1 {type string;}"
|
||||
" leaf inleaf2 {type string; default \"def1\";}"
|
||||
" }"
|
||||
" output {"
|
||||
" leaf outleaf1 {type string; default \"def2\";}"
|
||||
" leaf outleaf2 {type string;}"
|
||||
" }"
|
||||
"}"
|
||||
"notification notif {"
|
||||
" leaf ntfleaf1 {type string; default \"def3\";}"
|
||||
" leaf ntfleaf2 {type string;}"
|
||||
"}"
|
||||
"}";
|
||||
|
||||
static int
|
||||
setup(void **state)
|
||||
{
|
||||
char *schema;
|
||||
|
||||
UTEST_SETUP;
|
||||
|
||||
/* create one schema, longer than 4095 chars */
|
||||
schema = malloc(strlen(schema1) + strlen(schema2) + 1);
|
||||
strcpy(schema, schema1);
|
||||
strcat(schema, schema2);
|
||||
|
||||
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
|
||||
free(schema);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -384,7 +240,7 @@ test_empty1(void **state)
|
|||
|
||||
struct lyd_node *diff;
|
||||
|
||||
CHECK_PARSE_LYD_DIFF(model_1, model_2, diff);
|
||||
CHECK_PARSE_LYD_DIFF(model_1, model_2, 0, diff);
|
||||
CHECK_LYD_STRING(diff,
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"create\">\n"
|
||||
" <foo>42</foo>\n"
|
||||
|
@ -420,7 +276,7 @@ test_empty2(void **state)
|
|||
|
||||
struct lyd_node *diff;
|
||||
|
||||
CHECK_PARSE_LYD_DIFF(model_1, NULL, diff);
|
||||
CHECK_PARSE_LYD_DIFF(model_1, NULL, 0, diff);
|
||||
CHECK_LYD_STRING(diff,
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"delete\">\n"
|
||||
" <foo>42</foo>\n"
|
||||
|
@ -455,7 +311,7 @@ test_empty_nested(void **state)
|
|||
|
||||
struct lyd_node *diff1;
|
||||
|
||||
CHECK_PARSE_LYD_DIFF(NULL, lyd_child(model_1), diff1);
|
||||
CHECK_PARSE_LYD_DIFF(NULL, lyd_child(model_1), 0, diff1);
|
||||
CHECK_LYD_STRING(diff1,
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"
|
||||
" <foo yang:operation=\"create\">42</foo>\n"
|
||||
|
@ -463,7 +319,7 @@ test_empty_nested(void **state)
|
|||
|
||||
struct lyd_node *diff2;
|
||||
|
||||
CHECK_PARSE_LYD_DIFF(lyd_child(model_1), NULL, diff2);
|
||||
CHECK_PARSE_LYD_DIFF(lyd_child(model_1), NULL, 0, diff2);
|
||||
CHECK_LYD_STRING(diff2,
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"
|
||||
" <foo yang:operation=\"delete\">42</foo>\n"
|
||||
|
@ -565,7 +421,7 @@ test_leaf(void **state)
|
|||
" <baz yang:operation=\"delete\">42</baz>\n"
|
||||
"</hidden>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -641,7 +497,7 @@ test_list(void **state)
|
|||
" </list>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -713,7 +569,7 @@ test_nested_list(void **state)
|
|||
|
||||
CHECK_PARSE_LYD(xml1, data1);
|
||||
CHECK_PARSE_LYD(xml2, data2);
|
||||
CHECK_PARSE_LYD_DIFF(data1, data2, diff);
|
||||
CHECK_PARSE_LYD_DIFF(data1, data2, 0, diff);
|
||||
|
||||
CHECK_LYD_STRING(diff,
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"
|
||||
|
@ -810,7 +666,7 @@ test_userord_llist(void **state)
|
|||
" <llist yang:orig-default=\"false\" yang:orig-value=\"2\" yang:value=\"\" yang:operation=\"replace\">5</llist>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -856,7 +712,7 @@ test_userord_llist2(void **state)
|
|||
" <llist yang:orig-value=\"1\" yang:operation=\"delete\">2</llist>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -899,7 +755,7 @@ test_userord_mix(void **state)
|
|||
" <llist yang:value=\"1\" yang:operation=\"create\">4</llist>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -985,7 +841,7 @@ test_userord_list(void **state)
|
|||
" </ul>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1064,7 +920,7 @@ test_userord_list2(void **state)
|
|||
" </ul>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1176,7 +1032,7 @@ test_userord_list3(void **state)
|
|||
" </ul>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1302,7 +1158,7 @@ test_keyless_list(void **state)
|
|||
" </kl>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1349,7 +1205,7 @@ test_state_llist(void **state)
|
|||
" <kll yang:position=\"1\" yang:operation=\"create\">d</kll>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, out_diff_1, out_diff_2, out_merge);
|
||||
TEST_DIFF_3(xml1, xml2, xml3, 0, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1435,6 +1291,89 @@ test_wd(void **state)
|
|||
lyd_free_all(diff2);
|
||||
}
|
||||
|
||||
static void
|
||||
test_metadata(void **state)
|
||||
{
|
||||
(void) state;
|
||||
const char *xml1 = "<df xmlns=\"urn:libyang:tests:defaults\" xmlns:df=\"urn:libyang:tests:defaults\">\n"
|
||||
" <list df:my-meta=\"val1\">\n"
|
||||
" <name>a</name>\n"
|
||||
" <value df:my-meta2=\"val2\">1</value>\n"
|
||||
" </list>\n"
|
||||
" <list>\n"
|
||||
" <name df:my-meta=\"val10\">b</name>\n"
|
||||
" <value df:my-meta=\"repeated\" df:my-meta=\"repeated\">2</value>\n"
|
||||
" </list>\n"
|
||||
"</df>\n";
|
||||
const char *xml2 = "<df xmlns=\"urn:libyang:tests:defaults\" xmlns:df=\"urn:libyang:tests:defaults\">\n"
|
||||
" <list>\n"
|
||||
" <name>b</name>\n"
|
||||
" <value df:my-meta=\"repeated\">2</value>\n"
|
||||
" </list>\n"
|
||||
" <list>\n"
|
||||
" <name df:my-meta2=\"val22\">c</name>\n"
|
||||
" <value df:my-meta2=\"val23\">3</value>\n"
|
||||
" </list>\n"
|
||||
"</df>\n";
|
||||
const char *xml3 = "<df xmlns=\"urn:libyang:tests:defaults\" xmlns:df=\"urn:libyang:tests:defaults\" df:my-meta=\"top\">\n"
|
||||
" <list>\n"
|
||||
" <name>b</name>\n"
|
||||
" <value df:my-meta=\"repeated\" df:my-meta=\"new\">2</value>\n"
|
||||
" </list>\n"
|
||||
" <list>\n"
|
||||
" <name df:my-meta=\"val22\">c</name>\n"
|
||||
" <value df:my-meta2=\"val23\">3</value>\n"
|
||||
" </list>\n"
|
||||
"</df>\n";
|
||||
|
||||
const char *out_diff_1 =
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\">\n"
|
||||
" <list yang:operation=\"delete\" yang:meta-delete=\"defaults:my-meta=val1\">\n"
|
||||
" <name>a</name>\n"
|
||||
" <value yang:meta-delete=\"defaults:my-meta2=val2\">1</value>\n"
|
||||
" </list>\n"
|
||||
" <list>\n"
|
||||
" <name yang:meta-delete=\"defaults:my-meta=val10\">b</name>\n"
|
||||
" <value yang:orig-default=\"false\" yang:meta-delete=\"defaults:my-meta=repeated\">2</value>\n"
|
||||
" </list>\n"
|
||||
" <list yang:operation=\"create\">\n"
|
||||
" <name yang:meta-create=\"defaults:my-meta2=val22\">c</name>\n"
|
||||
" <value yang:meta-create=\"defaults:my-meta2=val23\">3</value>\n"
|
||||
" </list>\n"
|
||||
"</df>\n";
|
||||
const char *out_diff_2 =
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\" "
|
||||
"yang:meta-create=\"defaults:my-meta=top\">\n"
|
||||
" <list>\n"
|
||||
" <name>b</name>\n"
|
||||
" <value yang:orig-default=\"false\" yang:meta-create=\"defaults:my-meta=new\">2</value>\n"
|
||||
" </list>\n"
|
||||
" <list>\n"
|
||||
" <name yang:meta-delete=\"defaults:my-meta2=val22\" yang:meta-create=\"defaults:my-meta=val22\">c</name>\n"
|
||||
" <value yang:operation=\"none\">3</value>\n"
|
||||
" </list>\n"
|
||||
"</df>\n";
|
||||
const char *out_merge =
|
||||
"<df xmlns=\"urn:libyang:tests:defaults\" xmlns:yang=\"urn:ietf:params:xml:ns:yang:1\" yang:operation=\"none\" "
|
||||
"yang:meta-create=\"defaults:my-meta=top\">\n"
|
||||
" <list yang:operation=\"delete\" yang:meta-delete=\"defaults:my-meta=val1\">\n"
|
||||
" <name>a</name>\n"
|
||||
" <value yang:meta-delete=\"defaults:my-meta2=val2\">1</value>\n"
|
||||
" </list>\n"
|
||||
" <list>\n"
|
||||
" <name yang:meta-delete=\"defaults:my-meta=val10\">b</name>\n"
|
||||
" <value yang:orig-default=\"false\" yang:meta-delete=\"defaults:my-meta=repeated\" "
|
||||
"yang:meta-create=\"defaults:my-meta=new\">2</value>\n"
|
||||
" </list>\n"
|
||||
" <list yang:operation=\"create\">\n"
|
||||
" <name yang:meta-create=\"defaults:my-meta=val22\">c</name>\n"
|
||||
" <value yang:meta-create=\"defaults:my-meta2=val23\">3</value>\n"
|
||||
" </list>\n"
|
||||
"</df>\n";
|
||||
|
||||
TEST_DIFF_3(xml1, xml2, xml3, LYD_DIFF_META, out_diff_1, out_diff_2, out_merge);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
@ -1457,6 +1396,7 @@ main(void)
|
|||
UTEST(test_keyless_list, setup),
|
||||
UTEST(test_state_llist, setup),
|
||||
UTEST(test_wd, setup),
|
||||
UTEST(test_metadata, setup),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
|
|
@ -279,7 +279,7 @@ test_path(void **state)
|
|||
|
||||
lyd_free_tree(root);
|
||||
|
||||
/* try LYD_NEWOPT_OPAQ */
|
||||
/* try LYD_NEW_PATH_OPAQ */
|
||||
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:l1", NULL, 0, 0, 0, NULL, NULL);
|
||||
assert_int_equal(ret, LY_EINVAL);
|
||||
CHECK_LOG_CTX("Predicate missing for list \"l1\" in path \"/a:l1\".", "/a:l1", 0);
|
||||
|
@ -424,7 +424,6 @@ test_path(void **state)
|
|||
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:any", "<elem>val</elem>", 0, LYD_ANYDATA_XML, 0, &root, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
assert_non_null(root);
|
||||
|
||||
lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"<any xmlns=\"urn:tests:a\">\n"
|
||||
|
@ -445,7 +444,6 @@ test_path(void **state)
|
|||
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:anyx", "<a/><b/><c/>", 0, LYD_ANYDATA_XML, 0, &root, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
assert_non_null(root);
|
||||
|
||||
lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"<anyx xmlns=\"urn:tests:a\">\n"
|
||||
|
@ -466,10 +464,44 @@ test_path(void **state)
|
|||
free(str);
|
||||
lyd_free_siblings(root);
|
||||
|
||||
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:anyx", "<a/><b/><c/>", 0, LYD_ANYDATA_XML, 0, &root, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
assert_non_null(root);
|
||||
ret = lyd_new_path2(root, NULL, "/a:anyx", "[10,11,12]", 0, LYD_ANYDATA_JSON, LYD_NEW_PATH_UPDATE, NULL, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"<anyx xmlns=\"urn:tests:a\">[10,11,12]</anyx>\n");
|
||||
free(str);
|
||||
lyd_print_mem(&str, root, LYD_JSON, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"{\n"
|
||||
" \"a:anyx\": [10,11,12]\n"
|
||||
"}\n");
|
||||
free(str);
|
||||
lyd_free_siblings(root);
|
||||
|
||||
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:anyx", "<a/><b/><c/>", 0, LYD_ANYDATA_XML, 0, &root, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
assert_non_null(root);
|
||||
ret = lyd_new_path2(root, NULL, "/a:anyx", strdup("[10,11,12]"), 0, LYD_ANYDATA_JSON,
|
||||
LYD_NEW_PATH_UPDATE | LYD_NEW_ANY_USE_VALUE, NULL, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"<anyx xmlns=\"urn:tests:a\">[10,11,12]</anyx>\n");
|
||||
free(str);
|
||||
lyd_print_mem(&str, root, LYD_JSON, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"{\n"
|
||||
" \"a:anyx\": [10,11,12]\n"
|
||||
"}\n");
|
||||
free(str);
|
||||
lyd_free_siblings(root);
|
||||
|
||||
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:anyx", "{\"a\":[null],\"b\":[null],\"c\":[null]}", 0, LYD_ANYDATA_JSON, 0, &root, NULL);
|
||||
assert_int_equal(ret, LY_SUCCESS);
|
||||
assert_non_null(root);
|
||||
|
||||
lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
|
||||
assert_string_equal(str,
|
||||
"<anyx xmlns=\"urn:tests:a\">\n"
|
||||
|
|
|
@ -168,6 +168,21 @@ test_leaf(void **state)
|
|||
PARSER_CHECK_ERROR(data, 0, LYD_VALIDATE_PRESENT, tree, LY_EVALID, "Invalid non-string-encoded string value \"\".", "/a:foo", 1);
|
||||
CHECK_PARSE_LYD(data, LYD_PARSE_JSON_NULL, LYD_VALIDATE_PRESENT, tree);
|
||||
assert_null(tree);
|
||||
|
||||
/* validate integer in quotes errors out by default */
|
||||
data = "{\"a:foo3\":\"1234\"}";
|
||||
PARSER_CHECK_ERROR(data, LYD_PARSE_STRICT, LYD_VALIDATE_PRESENT, tree, LY_EVALID,
|
||||
"Invalid non-number-encoded uint32 value \"1234\".", "/a:foo3", 1);
|
||||
|
||||
/* validate integers are parsed correctly */
|
||||
data = "{\"a:foo3\":1234}";
|
||||
CHECK_PARSE_LYD(data, 0, LYD_VALIDATE_PRESENT, tree);
|
||||
lyd_free_all(tree);
|
||||
|
||||
/* validate LYD_PARSE_JSON_STRING_DATATYPES parser flag allows integers in quotes */
|
||||
data = "{\"a:foo3\":\"1234\"}";
|
||||
CHECK_PARSE_LYD(data, LYD_PARSE_JSON_STRING_DATATYPES, LYD_VALIDATE_PRESENT, tree);
|
||||
lyd_free_all(tree);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -920,6 +935,25 @@ test_metadata(void **state)
|
|||
CHECK_LOG_CTX("Invalid non-number-encoded int8 value \"value\".", "/a:c/x/@a:hint", 1);
|
||||
}
|
||||
|
||||
static void
|
||||
test_parent(void **state)
|
||||
{
|
||||
const char *data;
|
||||
struct lyd_node *tree;
|
||||
struct ly_in *in;
|
||||
|
||||
/* create the parent */
|
||||
assert_int_equal(LY_SUCCESS, lyd_new_path(NULL, UTEST_LYCTX, "/a:l1[a='vala'][b='valb'][c='25']", NULL, 0, &tree));
|
||||
|
||||
/* parse nested data */
|
||||
data = "{\"cont\":{\"e\":false}}";
|
||||
assert_int_equal(LY_SUCCESS, ly_in_new_memory(data, &in));
|
||||
assert_int_equal(LY_SUCCESS, lyd_parse_data(NULL, tree, in, LYD_JSON, 0, LYD_VALIDATE_PRESENT, NULL));
|
||||
|
||||
ly_in_free(in, 0);
|
||||
lyd_free_tree(tree);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
@ -939,6 +973,7 @@ main(void)
|
|||
UTEST(test_restconf_notification, setup),
|
||||
UTEST(test_restconf_reply, setup),
|
||||
UTEST(test_metadata, setup),
|
||||
UTEST(test_parent, setup),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
|
|
@ -722,6 +722,8 @@ test_netconf_reply_or_notification(void **state)
|
|||
struct ly_in *in;
|
||||
struct lyd_node *action, *tree, *op, *op2;
|
||||
|
||||
assert_non_null((ly_ctx_load_module(UTEST_LYCTX, "ietf-netconf", "2011-06-01", NULL)));
|
||||
|
||||
/* parse the action */
|
||||
data = "<c xmlns=\"urn:tests:a\">\n"
|
||||
" <act>\n"
|
||||
|
@ -817,6 +819,7 @@ test_netconf_reply_or_notification(void **state)
|
|||
" <error-type>rpc</error-type>\n"
|
||||
" <error-tag>missing-attribute</error-tag>\n"
|
||||
" <error-severity>error</error-severity>\n"
|
||||
" <error-path xmlns:a=\"urn:tests:a\">/a:c/a:x</error-path>\n"
|
||||
" <error-info>\n"
|
||||
" <bad-attribute>message-id</bad-attribute>\n"
|
||||
" <bad-element>rpc</bad-element>\n"
|
||||
|
@ -828,8 +831,6 @@ test_netconf_reply_or_notification(void **state)
|
|||
ly_in_free(in, 0);
|
||||
|
||||
CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)tree, 1, 1, LY_VALUE_XML, "rpc-reply", 0, 0, 0, 0, "");
|
||||
CHECK_LYD_NODE_OPAQ((struct lyd_node_opaq *)lyd_child(tree), 0, 1, LY_VALUE_XML, "rpc-error", 0, 0, 0, 0, "");
|
||||
|
||||
CHECK_LYD_STRING(tree, LYD_PRINT_WITHSIBLINGS, data);
|
||||
|
||||
lyd_free_all(tree);
|
||||
|
|
|
@ -277,12 +277,12 @@ test_minmax(void **state)
|
|||
CHECK_PARSE_LYD_PARAM("<l xmlns=\"urn:tests:c\">mate</l>"
|
||||
"<d xmlns=\"urn:tests:c\"/>",
|
||||
LYD_XML, 0, LYD_VALIDATE_PRESENT, LY_EVALID, tree);
|
||||
CHECK_LOG_CTX_APPTAG("Too few \"l\" instances.", "/c:choic/b/l", 0, "too-few-elements");
|
||||
CHECK_LOG_CTX_APPTAG("Too few \"l\" instances.", "/c:l[.='mate']", 0, "too-few-elements");
|
||||
|
||||
CHECK_PARSE_LYD_PARAM("<l xmlns=\"urn:tests:c\">val1</l>"
|
||||
"<l xmlns=\"urn:tests:c\">val2</l>",
|
||||
LYD_XML, 0, LYD_VALIDATE_PRESENT, LY_EVALID, tree);
|
||||
CHECK_LOG_CTX_APPTAG("Too few \"l\" instances.", "/c:choic/b/l", 0, "too-few-elements");
|
||||
CHECK_LOG_CTX_APPTAG("Too few \"l\" instances.", "/c:l[.='val2']", 0, "too-few-elements");
|
||||
|
||||
LYD_TREE_CREATE("<l xmlns=\"urn:tests:c\">val1</l>"
|
||||
"<l xmlns=\"urn:tests:c\">val2</l>"
|
||||
|
@ -1259,7 +1259,7 @@ test_multi_error(void **state)
|
|||
CHECK_PARSE_LYD_PARAM(data, LYD_JSON, LYD_PARSE_ONLY, 0, LY_SUCCESS, tree);
|
||||
assert_int_equal(LY_EVALID, lyd_validate_all(&tree, NULL, LYD_VALIDATE_PRESENT | LYD_VALIDATE_MULTI_ERROR, NULL));
|
||||
lyd_free_tree(tree);
|
||||
CHECK_LOG_CTX_APPTAG("Too few \"ll\" instances.", "/ii:cont/ll", 0, "too-few-elements");
|
||||
CHECK_LOG_CTX_APPTAG("Too few \"ll\" instances.", "/ii:cont/ll[.='25']", 0, "too-few-elements");
|
||||
CHECK_LOG_CTX_APPTAG("l leaf is not left", "/ii:cont/l3", 0, "not-left");
|
||||
CHECK_LOG_CTX_APPTAG("Must condition \"../l = 'right'\" not satisfied.", "/ii:cont/l2", 0, "must-violation");
|
||||
CHECK_LOG_CTX_APPTAG("Duplicate instance of \"l\".", "/ii:cont/l", 0, NULL);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue