]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-qmp-client: drop QMP_TEST() macro
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 27 May 2026 16:41:48 +0000 (01:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 27 May 2026 16:46:38 +0000 (01:46 +0900)
Similar to the previous commit for test-path.
The macro confuses gcc/gcov/lcov:
```
lcov: ERROR: lcov: ERROR: (inconsistent) mismatched end line for test_qmp_client_basic_body at
/home/runner/work/systemd/systemd/src/test/test-qmp-client.c:204:
204 -> 224 while capturing from build/mkosi.builddir/arch~rolling~x86-64/test-qmp-client.p/src_test_test-qmp-client.c.gcno
```

The macro itself is not bad, but does not reduce lines so much.
Let's stop using the macro.

src/test/test-qmp-client.c

index 948122720eb235e5c3d083c30a8e063c5d56b9ad..9c56df29bc6a9cac14b64332152985b3655aebac 100644 (file)
@@ -151,20 +151,6 @@ static void run_qmp_test(sd_fiber_func_t mock_fn, sd_fiber_func_t client_fn) {
         ASSERT_OK(sd_future_result(mock_f));
 }
 
-/* Define a test whose body runs as the client fiber on an event loop shared with `mock_fn`.
- * The body receives `QmpClient *client` as its argument. */
-#define QMP_TEST(name, mock_fn)                                                \
-        static int test_##name##_body(QmpClient *client);                      \
-        static int test_##name##_fiber(void *userdata) {                       \
-                int r = test_##name##_body(userdata);                          \
-                ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));             \
-                return r;                                                      \
-        }                                                                      \
-        TEST(name) {                                                           \
-                run_qmp_test(mock_fn, test_##name##_fiber);                    \
-        }                                                                      \
-        static int test_##name##_body(QmpClient *client)
-
 static int mock_qmp_basic_fiber(void *userdata) {
         _cleanup_(json_stream_done) JsonStream s = {};
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *stop_event = NULL;
@@ -201,7 +187,8 @@ static int test_event_callback(
         return 0;
 }
 
-QMP_TEST(qmp_client_basic, mock_qmp_basic_fiber) {
+static int qmp_client_basic_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *result = NULL;
         _cleanup_free_ char *error_desc = NULL;
         bool event_received = false;
@@ -220,9 +207,14 @@ QMP_TEST(qmp_client_basic, mock_qmp_basic_fiber) {
         ASSERT_OK_POSITIVE(qmp_client_call(client, "cont", NULL, NULL, NULL));
 
         ASSERT_TRUE(event_received);
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
+TEST(qmp_basic) {
+        run_qmp_test(mock_qmp_basic_fiber, qmp_client_basic_fiber);
+}
+
 static int mock_qmp_eof_fiber(void *userdata) {
         _cleanup_(json_stream_done) JsonStream s = {};
 
@@ -232,12 +224,18 @@ static int mock_qmp_eof_fiber(void *userdata) {
         return 0;
 }
 
-QMP_TEST(qmp_client_eof, mock_qmp_eof_fiber) {
+static int qmp_client_eof_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         int r = qmp_client_call(client, "query-status", NULL, NULL, NULL);
         ASSERT_TRUE(ERRNO_IS_NEG_DISCONNECT(r));
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
+TEST(qmp_eof) {
+        run_qmp_test(mock_qmp_eof_fiber, qmp_client_eof_fiber);
+}
+
 static int mock_qmp_call_fiber(void *userdata) {
         _cleanup_(json_stream_done) JsonStream s = {};
 
@@ -250,7 +248,8 @@ static int mock_qmp_call_fiber(void *userdata) {
         return 0;
 }
 
-QMP_TEST(qmp_client_call, mock_qmp_call_fiber) {
+static int qmp_client_call_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         _cleanup_(sd_future_cancel_wait_unrefp) sd_future *f = NULL;
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *result = NULL;
         _cleanup_free_ char *error_desc = NULL;
@@ -286,9 +285,14 @@ QMP_TEST(qmp_client_call, mock_qmp_call_fiber) {
         /* qmp_client_call() also surfaces QMP errors as -EIO, regardless of whether the caller
          * passed ret_error_desc. */
         ASSERT_ERROR(qmp_client_call(client, "stop", NULL, NULL, NULL), EIO);
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
+TEST(qmp_call) {
+        run_qmp_test(mock_qmp_call_fiber, qmp_client_call_fiber);
+}
+
 static int mock_qmp_call_disconnect_fiber(void *userdata) {
         _cleanup_(json_stream_done) JsonStream s = {};
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *stop_cmd = NULL;
@@ -302,12 +306,18 @@ static int mock_qmp_call_disconnect_fiber(void *userdata) {
         return 0;
 }
 
-QMP_TEST(qmp_client_call_disconnect, mock_qmp_call_disconnect_fiber) {
+static int qmp_client_call_disconnect_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         int r = qmp_client_call(client, "stop", NULL, NULL, NULL);
         ASSERT_TRUE(ERRNO_IS_NEG_DISCONNECT(r));
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
+TEST(qmp_call_disconnect) {
+        run_qmp_test(mock_qmp_call_disconnect_fiber, qmp_client_call_disconnect_fiber);
+}
+
 static int mock_qmp_fd_fiber(void *userdata) {
         _cleanup_(json_stream_done) JsonStream s = {};
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *cap_cmd = NULL, *addfd_cmd = NULL,
@@ -336,7 +346,8 @@ static int mock_qmp_fd_fiber(void *userdata) {
         return 0;
 }
 
-QMP_TEST(qmp_client_invoke_with_fd, mock_qmp_fd_fiber) {
+static int qmp_client_invoke_with_fd_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *args = NULL;
         _cleanup_close_ int fd_to_pass = -EBADF;
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *result = NULL;
@@ -349,9 +360,14 @@ QMP_TEST(qmp_client_invoke_with_fd, mock_qmp_fd_fiber) {
                                            QMP_CLIENT_ARGS_FD(args, TAKE_FD(fd_to_pass)),
                                            &result, NULL));
         ASSERT_NOT_NULL(result);
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
+TEST(qmp_invoke_with_fd) {
+        run_qmp_test(mock_qmp_fd_fiber, qmp_client_invoke_with_fd_fiber);
+}
+
 static int on_dead_peer_reply(
                 QmpClient *client,
                 sd_json_variant *result,
@@ -433,7 +449,8 @@ static int tripwire_callback(
         return 0;
 }
 
-QMP_TEST(qmp_client_invoke_slot_lifecycle, mock_qmp_slot_fiber) {
+static int qmp_client_invoke_slot_lifecycle_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         _cleanup_(qmp_slot_unrefp) QmpSlot *slot = NULL;
 
         ASSERT_OK(qmp_client_invoke(client, &slot, "query-status", NULL, nop_callback, NULL));
@@ -447,10 +464,16 @@ QMP_TEST(qmp_client_invoke_slot_lifecycle, mock_qmp_slot_fiber) {
 
         /* Explicit out-of-order unref exercises the already-disconnected path in qmp_slot_free(). */
         slot = qmp_slot_unref(slot);
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
-QMP_TEST(qmp_client_invoke_slot_cancel, mock_qmp_slot_fiber) {
+TEST(qmp_invoke_slot_lifecycle) {
+        run_qmp_test(mock_qmp_slot_fiber, qmp_client_invoke_slot_lifecycle_fiber);
+}
+
+static int qmp_client_invoke_slot_cancel_fiber(void *userdata) {
+        QmpClient *client = ASSERT_NOT_NULL(userdata);
         QmpSlot *slot = NULL;
         bool fired = false;
 
@@ -463,9 +486,14 @@ QMP_TEST(qmp_client_invoke_slot_cancel, mock_qmp_slot_fiber) {
         ASSERT_OK_POSITIVE(qmp_client_call(client, "stop", NULL, NULL, NULL));
 
         ASSERT_FALSE(fired);
+        ASSERT_OK(sd_event_exit(sd_fiber_get_event(), 0));
         return 0;
 }
 
+TEST(qmp_invoke_slot_cancel) {
+        run_qmp_test(mock_qmp_slot_fiber, qmp_client_invoke_slot_cancel_fiber);
+}
+
 TEST(qmp_schema_has_member) {
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *schema = NULL;