@@ -1887,6 +1887,225 @@ test_lysc_path(void **state)
1887
1887
free (path );
1888
1888
}
1889
1889
1890
+ /* TEST */
1891
+ static ly_bool
1892
+ compare_str_nodeset (struct ly_set * expected , struct ly_set * received )
1893
+ {
1894
+ ly_bool is_error = 0 ;
1895
+ size_t r ;
1896
+ size_t e ;
1897
+
1898
+ for (e = 0 ; expected && e < expected -> count ; e ++ ) {
1899
+ const char * epath = expected -> objs [e ];
1900
+ ly_bool found = 0 ;
1901
+
1902
+ for (r = 0 ; received && (r < received -> count ); r ++ ) {
1903
+ const char * rpath = received -> objs [r ];
1904
+
1905
+ if (!strcmp (epath , rpath )) {
1906
+ found = 1 ;
1907
+ break ;
1908
+ }
1909
+ }
1910
+
1911
+ if (!found ) {
1912
+ fprintf (stderr , "< %s\n" , epath );
1913
+ is_error = 1 ;
1914
+ }
1915
+ }
1916
+
1917
+ /* If the count was equal and there was no error, no need to scan again */
1918
+ if (expected && received && (expected -> count == received -> count ) && !is_error ) {
1919
+ return 1 ;
1920
+ }
1921
+
1922
+ for (r = 0 ; received && (r < received -> count ); r ++ ) {
1923
+ ly_bool found = 0 ;
1924
+ const char * rpath = received -> objs [r ];
1925
+
1926
+ for (e = 0 ; expected && (e < expected -> count ) && !found ; e ++ ) {
1927
+ char * epath = expected -> objs [e ];
1928
+
1929
+ if (!strcmp (epath , rpath )) {
1930
+ found = 1 ;
1931
+ break ;
1932
+ }
1933
+ }
1934
+ if (!found ) {
1935
+ fprintf (stderr , "> %s\n" , rpath );
1936
+ }
1937
+ }
1938
+
1939
+ return 0 ;
1940
+ }
1941
+
1942
+ static struct ly_set *
1943
+ strlist_to_pathset (const char * * pathlist )
1944
+ {
1945
+ struct ly_set * set = NULL ;
1946
+ uint32_t i ;
1947
+
1948
+ if (!pathlist || !pathlist [0 ]) {
1949
+ return NULL ;
1950
+ }
1951
+
1952
+ ly_set_new (& set );
1953
+
1954
+ for (i = 0 ; pathlist [i ]; i ++ ) {
1955
+ ly_set_add (set , pathlist [i ], 0 , NULL );
1956
+ }
1957
+
1958
+ return set ;
1959
+ }
1960
+
1961
+ static struct ly_set *
1962
+ lysc_nodeset_to_pathset (struct ly_set * nodeset )
1963
+ {
1964
+ struct ly_set * set = NULL ;
1965
+ uint32_t i ;
1966
+
1967
+ if (!nodeset || !nodeset -> count ) {
1968
+ return NULL ;
1969
+ }
1970
+
1971
+ ly_set_new (& set );
1972
+
1973
+ for (i = 0 ; i < nodeset -> count ; i ++ ) {
1974
+ char * path = lysc_path (nodeset -> snodes [i ], LYSC_PATH_DATA , NULL , 0 );
1975
+
1976
+ ly_set_add (set , path , 0 , NULL );
1977
+ }
1978
+
1979
+ return set ;
1980
+ }
1981
+
1982
+ static void
1983
+ test_lysc_backlinks (void * * state )
1984
+ {
1985
+ const char * expect1 [] = {
1986
+ /* Built-ins, not sure how to exclude those when not limiting by
1987
+ * path */
1988
+ "/ietf-yang-library:yang-library/module-set/module/deviation" ,
1989
+ "/ietf-yang-library:yang-library/schema/module-set" ,
1990
+ "/ietf-yang-library:yang-library/datastore/schema" ,
1991
+ "/ietf-yang-library:yang-library-update/content-id" ,
1992
+ "/ietf-yang-library:yang-library-change/module-set-id" ,
1993
+ /* Normal expected */
1994
+ "/b:my_extref_list/my_extref" ,
1995
+ "/a:refstr" ,
1996
+ "/a:refnum" ,
1997
+ "/b:my_extref_union" ,
1998
+ NULL
1999
+ };
2000
+
2001
+ const char * expect2 [] = {
2002
+ "/b:my_extref_list/my_extref" ,
2003
+ "/a:refstr" ,
2004
+ "/b:my_extref_union" ,
2005
+ NULL
2006
+ };
2007
+
2008
+ const char * expect3 [] = {
2009
+ "/b:my_extref_list/my_extref" ,
2010
+ "/a:refstr" ,
2011
+ "/a:refnum" ,
2012
+ "/b:my_extref_union" ,
2013
+ NULL
2014
+ };
2015
+
2016
+ struct {
2017
+ const char * match_path ;
2018
+ ly_bool match_ancestors ;
2019
+ const char * * expected_paths ;
2020
+ } tests [] = {
2021
+ {NULL , 0 , expect1 },
2022
+ {"/a:my_list/my_leaf_string" , 0 , expect2 },
2023
+ {"/a:my_list" , 1 , expect3 }
2024
+ };
2025
+ const char * str ;
2026
+ uint32_t i ;
2027
+
2028
+ str = "module a {\n"
2029
+ " namespace urn:a;\n"
2030
+ " prefix a;\n"
2031
+ " list my_list {\n"
2032
+ " key my_leaf_string;\n"
2033
+ " leaf my_leaf_string {\n"
2034
+ " type string;\n"
2035
+ " }\n"
2036
+ " leaf my_leaf_number {\n"
2037
+ " type uint32;\n"
2038
+ " }\n"
2039
+ " }\n"
2040
+ " leaf refstr {\n"
2041
+ " type leafref {\n"
2042
+ " path \"../my_list/my_leaf_string\";\n"
2043
+ " }\n"
2044
+ " }\n"
2045
+ " leaf refnum {\n"
2046
+ " type leafref {\n"
2047
+ " path \"../my_list/my_leaf_number\";\n"
2048
+ " }\n"
2049
+ " }\n"
2050
+ "}\n" ;
2051
+
2052
+ assert_int_equal (lys_parse_mem (UTEST_LYCTX , str , LYS_IN_YANG , NULL ), LY_SUCCESS );
2053
+ CHECK_LOG_CTX (NULL , NULL , 0 );
2054
+
2055
+ str = "module b {\n"
2056
+ " namespace urn:b;\n"
2057
+ " prefix b;\n"
2058
+ " import a {\n"
2059
+ " prefix a;\n"
2060
+ " }\n"
2061
+ " list my_extref_list {\n"
2062
+ " key my_leaf_string;\n"
2063
+ " leaf my_leaf_string {\n"
2064
+ " type string;\n"
2065
+ " }\n"
2066
+ " leaf my_extref {\n"
2067
+ " type leafref {\n"
2068
+ " path \"/a:my_list/a:my_leaf_string\";\n"
2069
+ " }\n"
2070
+ " }\n"
2071
+ " }\n"
2072
+ " leaf my_extref_union {\n"
2073
+ " type union {\n"
2074
+ " type leafref {\n"
2075
+ " path \"/a:my_list/a:my_leaf_string\";\n"
2076
+ " }\n"
2077
+ " type leafref {\n"
2078
+ " path \"/a:my_list/a:my_leaf_number\";\n"
2079
+ " }\n"
2080
+ " type uint32;\n"
2081
+ " }\n"
2082
+ " }\n"
2083
+ "}\n" ;
2084
+
2085
+ assert_int_equal (lys_parse_mem (UTEST_LYCTX , str , LYS_IN_YANG , NULL ), LY_SUCCESS );
2086
+ CHECK_LOG_CTX (NULL , NULL , 0 );
2087
+
2088
+ for (i = 0 ; i < sizeof tests / sizeof * tests ; i ++ ) {
2089
+ const struct lysc_node * node = NULL ;
2090
+ struct ly_set * set = NULL , * expected = NULL , * received = NULL ;
2091
+
2092
+ if (tests [i ].match_path ) {
2093
+ node = lys_find_path (UTEST_LYCTX , NULL , tests [i ].match_path , 0 );
2094
+ assert_non_null (node );
2095
+ }
2096
+
2097
+ assert_int_equal (LY_SUCCESS , lysc_node_lref_backlinks (UTEST_LYCTX , node , tests [i ].match_ancestors , & set ));
2098
+
2099
+ expected = strlist_to_pathset (tests [i ].expected_paths );
2100
+ received = lysc_nodeset_to_pathset (set );
2101
+ assert_int_equal (1 , compare_str_nodeset (expected , received ));
2102
+
2103
+ ly_set_free (expected , NULL );
2104
+ ly_set_free (received , free );
2105
+ ly_set_free (set , NULL );
2106
+ }
2107
+ }
2108
+
1890
2109
int
1891
2110
main (void )
1892
2111
{
@@ -1909,6 +2128,7 @@ main(void)
1909
2128
UTEST (test_extension_compile ),
1910
2129
UTEST (test_ext_recursive ),
1911
2130
UTEST (test_lysc_path ),
2131
+ UTEST (test_lysc_backlinks ),
1912
2132
};
1913
2133
1914
2134
return cmocka_run_group_tests (tests , NULL , NULL );
0 commit comments