]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-bus-object: check if enumerated objects are sorted 36507/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 25 Feb 2025 14:40:45 +0000 (23:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 25 Feb 2025 14:41:20 +0000 (23:41 +0900)
src/libsystemd/sd-bus/test-bus-objects.c

index 2847ba84f5b13381573236a5d0897beb3c04b434..c9ec474856d74debe827f8bd1628e2b8f3a722b9 100644 (file)
@@ -213,7 +213,7 @@ static const sd_bus_vtable vtable2[] = {
 static int enumerator_callback(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
 
         if (object_path_startswith("/value", path))
-                assert_se(*nodes = strv_new("/value/a", "/value/b", "/value/c"));
+                assert_se(*nodes = strv_new("/value/c", "/value/b", "/value/a"));
 
         return 1;
 }
@@ -221,7 +221,7 @@ static int enumerator_callback(sd_bus *bus, const char *path, void *userdata, ch
 static int enumerator2_callback(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
 
         if (object_path_startswith("/value/a", path))
-                assert_se(*nodes = strv_new("/value/a/x", "/value/a/y", "/value/a/z"));
+                assert_se(*nodes = strv_new("/value/a/z", "/value/a/x", "/value/a/y"));
 
         return 1;
 }
@@ -232,7 +232,9 @@ static int enumerator3_callback(sd_bus *bus, const char *path, void *userdata, c
         if (!object_path_startswith("/value/b", path))
                 return 1;
 
-        for (unsigned i = 0; i < 30; i++)
+        for (unsigned i = 10; i < 20; i++)
+                assert_se(strv_extendf(&v, "/value/b/%u", i) >= 0);
+        for (unsigned i = 29; i >= 20; i--)
                 assert_se(strv_extendf(&v, "/value/b/%u", i) >= 0);
 
         *nodes = TAKE_PTR(v);
@@ -438,7 +440,7 @@ static int client(struct context *c) {
         fputs(s, stdout);
 
         assert_se(lines = strv_split_newlines(s));
-        for (unsigned i = 0; i < 30; i++) {
+        for (unsigned i = 10; i < 30; i++) {
                 _cleanup_free_ char *n = NULL;
 
                 assert_se(asprintf(&n, " <node name=\"%u\"/>", i) >= 0);
@@ -473,33 +475,46 @@ static int client(struct context *c) {
         /* Check that /value/b does not have ObjectManager interface but /value/a does */
         assert_se(sd_bus_message_rewind(reply, 1) > 0);
         assert_se(sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{oa{sa{sv}}}") > 0);
+        unsigned path_count = 0;
         while (ASSERT_SE_NONNEG(sd_bus_message_enter_container(reply, SD_BUS_TYPE_DICT_ENTRY, "oa{sa{sv}}")) > 0) {
                 const char *path = NULL;
                 assert_se(sd_bus_message_read_basic(reply, 'o', &path) > 0);
-                if (STR_IN_SET(path, "/value/b", "/value/a")) {
-                        /* Check that there is no object manager interface here */
-                        bool found_object_manager_interface = false;
-                        assert_se(sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{sa{sv}}") > 0);
-                        while (ASSERT_SE_NONNEG(sd_bus_message_enter_container(reply, SD_BUS_TYPE_DICT_ENTRY, "sa{sv}")) > 0) {
-                                const char *interface_name = NULL;
-                                assert_se(sd_bus_message_read_basic(reply, 's', &interface_name) > 0);
-
-                                if (streq(interface_name, "org.freedesktop.DBus.ObjectManager")) {
-                                        assert_se(!streq(path, "/value/b"));
-                                        found_object_manager_interface = true;
-                                }
-
-                                assert_se(sd_bus_message_skip(reply, "a{sv}") >= 0);
-                                assert_se(sd_bus_message_exit_container(reply) >= 0);
-                        }
-                        assert_se(sd_bus_message_exit_container(reply) >= 0);
 
-                        if (streq(path, "/value/a"))
-                                /* ObjectManager must be here */
-                                assert_se(found_object_manager_interface);
+                /* Check if the enumerated path is sorted. */
+                switch (path_count) {
+                case 0:
+                        ASSERT_STREQ(path, "/value/a");
+                        break;
+                case 1:
+                        ASSERT_STREQ(path, "/value/b");
+                        break;
+                case 2:
+                        ASSERT_STREQ(path, "/value/c");
+                        break;
+                default: {
+                        unsigned u = path_count - 3 + 10;
+                        _cleanup_free_ char *path_expected = NULL;
+                        ASSERT_OK(asprintf(&path_expected, "/value/b/%u", u));
+                        ASSERT_STREQ(path, path_expected);
+                }}
+                path_count++;
+
+                /* Check that there is no object manager interface here */
+                bool found_object_manager_interface = false;
+                assert_se(sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{sa{sv}}") > 0);
+                while (ASSERT_SE_NONNEG(sd_bus_message_enter_container(reply, SD_BUS_TYPE_DICT_ENTRY, "sa{sv}")) > 0) {
+                        const char *interface_name = NULL;
+                        assert_se(sd_bus_message_read_basic(reply, 's', &interface_name) > 0);
+
+                        if (streq(interface_name, "org.freedesktop.DBus.ObjectManager"))
+                                found_object_manager_interface = true;
+
+                        assert_se(sd_bus_message_skip(reply, "a{sv}") >= 0);
+                        assert_se(sd_bus_message_exit_container(reply) >= 0);
+                }
+                assert_se(sd_bus_message_exit_container(reply) >= 0);
 
-                } else
-                        assert_se(sd_bus_message_skip(reply, "a{sa{sv}}") >= 0);
+                assert_se(found_object_manager_interface == streq(path, "/value/a"));
 
                 assert_se(sd_bus_message_exit_container(reply) >= 0);
         }