/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "busctl-introspect.h" #include "set.h" #include "strv.h" #include "tests.h" static const char *xml_root = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static const char *xml_org = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static const char *xml_org_freedesktop = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static const char *xml_org_freedesktop_LogControl1 = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static const char *xml_org_freedesktop_network1 = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static const char *xml_org_freedesktop_network1_network = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static const char *xml_org_freedesktop_network1_network_unsigned = "\n" "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "\n"; static int on_path(const char *path, void *userdata) { Set *paths = userdata; assert_se(paths); assert_se(set_put_strdup(&paths, path) >= 0); return 0; } TEST(introspect_on_path) { static const XMLIntrospectOps ops = { .on_path = on_path, }; _cleanup_strv_free_ char **expected = NULL; _cleanup_set_free_ Set *paths = NULL; _cleanup_free_ char **l = NULL; assert_se(set_put_strdup(&paths, "/") > 0); log_debug("/* parse_xml_introspect(\"/\") */"); assert_se(parse_xml_introspect("/", xml_root, &ops, paths) >= 0); log_debug("/* parse_xml_introspect(\"/org\") */"); assert_se(parse_xml_introspect("/org", xml_org, &ops, paths) >= 0); log_debug("/* parse_xml_introspect(\"/org/freedesktop\") */"); assert_se(parse_xml_introspect("/org/freedesktop", xml_org_freedesktop, &ops, paths) >= 0); log_debug("/* parse_xml_introspect(\"/org/freedesktop/LogControl1\") */"); assert_se(parse_xml_introspect("/org/freedesktop/LogControl1", xml_org_freedesktop_LogControl1, &ops, paths) >= 0); log_debug("/* parse_xml_introspect(\"/org/freedesktop/network1\") */"); assert_se(parse_xml_introspect("/org/freedesktop/network1", xml_org_freedesktop_network1, &ops, paths) >= 0); log_debug("/* parse_xml_introspect(\"/org/freedesktop/network1/network\") */"); assert_se(parse_xml_introspect("/org/freedesktop/network1/network", xml_org_freedesktop_network1_network, &ops, paths) >= 0); for (unsigned i = 0; i <= 20; i++) { _cleanup_free_ char *path = NULL; assert_se(asprintf(&path, "/org/freedesktop/network1/network/%u", i) >= 0); log_debug("/* parse_xml_introspect(\"%s\") */", path); assert_se(parse_xml_introspect(path, xml_org_freedesktop_network1_network_unsigned, &ops, paths) >= 0); } assert_se(l = set_get_strv(paths)); strv_sort(l); assert_se(strv_extend(&expected, "/") >= 0); assert_se(strv_extend(&expected, "/org") >= 0); assert_se(strv_extend(&expected, "/org/freedesktop") >= 0); assert_se(strv_extend(&expected, "/org/freedesktop/LogControl1") >= 0); assert_se(strv_extend(&expected, "/org/freedesktop/network1") >= 0); assert_se(strv_extend(&expected, "/org/freedesktop/network1/network") >= 0); for (unsigned i = 0; i <= 20; i++) { assert_se(strv_extendf(&expected, "/org/freedesktop/network1/network/%u", i) >= 0); assert_se(strv_extendf(&expected, "/org/freedesktop/network1/network/%u/hoge", i) >= 0); } strv_sort(expected); assert_se(strv_equal(l, expected)); } DEFINE_TEST_MAIN(LOG_DEBUG);