1
0
Fork 0

Merging upstream version 3.12.2.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-05-02 04:14:45 +02:00
parent 6375ddbe5b
commit 580fa3f55c
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
66 changed files with 4041 additions and 2142 deletions

View file

@ -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);

View file

@ -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"

View file

@ -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);

View file

@ -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);

View file

@ -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);