kdbus: test suite changed to common format
[platform/kernel/linux-rpi.git] / tools / testing / selftests / kdbus / test-message.c
index d9b8fbd..aa12118 100644 (file)
 #include "kdbus-test.h"
 
 /* maximum number of queued messages from the same individual user */
-#define KDBUS_CONN_MAX_MSGS                    256
+#define KDBUS_CONN_MAX_MSGS                    256U
 
 /* maximum number of queued requests waiting for a reply */
-#define KDBUS_CONN_MAX_REQUESTS_PENDING                128
+#define KDBUS_CONN_MAX_REQUESTS_PENDING                1024U
 
 /* maximum message payload size */
 #define KDBUS_MSG_MAX_PAYLOAD_VEC_SIZE         (2 * 1024UL * 1024UL)
 
-int kdbus_test_message_basic(struct kdbus_test_env *env)
+wur int kdbus_test_message_basic(struct kdbus_test_env *env)
 {
        struct kdbus_conn *conn;
        struct kdbus_conn *sender;
        struct kdbus_msg *msg;
        uint64_t cookie = 0x1234abcd5678eeff;
        uint64_t offset;
-       int ret;
 
-       sender = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(sender != NULL);
+       ASSERT_NONZERO(sender = kdbus_hello(env->buspath, 0, NULL, 0));
 
        /* create a 2nd connection */
-       conn = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(conn != NULL);
+       ASSERT_NONZERO(conn = kdbus_hello(env->buspath, 0, NULL, 0));
 
-       ret = kdbus_add_match_empty(conn);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_add_match_empty(conn));
 
-       ret = kdbus_add_match_empty(sender);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_add_match_empty(sender));
 
        /* send over 1st connection */
-       ret = kdbus_msg_send(sender, NULL, cookie, 0, 0, 0,
-                            KDBUS_DST_ID_BROADCAST, 0, NULL);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_msg_send(sender, NULL, cookie, 0, 0, 0, KDBUS_DST_ID_BROADCAST));
 
-       /* Make sure that we do not get our own broadcasts */
-       ret = kdbus_msg_recv(sender, NULL, NULL);
-       ASSERT_RETURN(ret == -EAGAIN);
+       /* Make sure that we do get our own broadcasts */
+       ASSERT_ZERO(kdbus_msg_recv(sender, &msg, &offset));
+       ASSERT_RETURN(msg->cookie,==,cookie);
+       kdbus_msg_free(msg);
 
        /* ... and receive on the 2nd */
-       ret = kdbus_msg_recv_poll(conn, 100, &msg, &offset);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(msg->cookie == cookie);
+       ASSERT_ZERO(kdbus_msg_recv_poll(conn, 100, &msg, &offset));
+       ASSERT_RETURN(msg->cookie,==,cookie);
 
        kdbus_msg_free(msg);
 
        /* Msgs that expect a reply must have timeout and cookie */
-       ret = kdbus_msg_send(sender, NULL, 0, KDBUS_MSG_EXPECT_REPLY,
-                            0, 0, conn->id, 0, NULL);
-       ASSERT_RETURN(ret == -EINVAL);
+       ASSERT_RETURN(-EINVAL,==,kdbus_msg_send(sender, NULL, 0, KDBUS_MSG_EXPECT_REPLY, 1000000000, 0, conn->id)); /* no cookie */
+       ASSERT_RETURN(-EINVAL,==,kdbus_msg_send(sender, NULL, 1, KDBUS_MSG_EXPECT_REPLY, 0, 0, conn->id)); /* no timeout */
+       ASSERT_RETURN(-EINVAL,==,kdbus_msg_send(sender, NULL, 0, KDBUS_MSG_EXPECT_REPLY, 0, 0, conn->id)); /* neither cookie nor timeout */
 
-       /* Faked replies with a valid reply cookie are rejected */
-       ret = kdbus_msg_send_reply(conn, time(NULL) ^ cookie, sender->id);
-       ASSERT_RETURN(ret == -EPERM);
+       /* Faked replies with a valid reply cookie are rejected iff not TIZEN */
+       ASSERT_RETURN(ONTIZEN(0,-EBADSLT),==,kdbus_msg_send_reply(conn, time(NULL) ^ cookie, sender->id));
 
-       ret = kdbus_free(conn, offset);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_free(conn, offset));
 
        kdbus_conn_free(sender);
        kdbus_conn_free(conn);
@@ -83,7 +74,7 @@ int kdbus_test_message_basic(struct kdbus_test_env *env)
        return TEST_OK;
 }
 
-static int msg_recv_prio(struct kdbus_conn *conn,
+static wur int msg_recv_prio(struct kdbus_conn *conn,
                         int64_t requested_prio,
                         int64_t expected_prio)
 {
@@ -93,7 +84,7 @@ static int msg_recv_prio(struct kdbus_conn *conn,
                .priority = requested_prio,
        };
        struct kdbus_msg *msg;
-       int ret;
+       int ret, dumpret;
 
        ret = kdbus_cmd_recv(conn->fd, &recv);
        if (ret < 0) {
@@ -102,7 +93,7 @@ static int msg_recv_prio(struct kdbus_conn *conn,
        }
 
        msg = (struct kdbus_msg *)(conn->buf + recv.msg.offset);
-       kdbus_msg_dump(conn, msg);
+       dumpret = kdbus_msg_dump(msg);
 
        if (msg->priority != expected_prio) {
                kdbus_printf("expected message prio %lld, got %lld\n",
@@ -115,54 +106,42 @@ static int msg_recv_prio(struct kdbus_conn *conn,
        ret = kdbus_free(conn, recv.msg.offset);
        if (ret < 0)
                return ret;
+       if (dumpret)
+               return dumpret;
 
        return 0;
 }
 
-int kdbus_test_message_prio(struct kdbus_test_env *env)
+wur int kdbus_test_message_prio(struct kdbus_test_env *env)
 {
        struct kdbus_conn *a, *b;
        uint64_t cookie = 0;
-       int ret;
 
-       a = kdbus_hello(env->buspath, 0, NULL, 0);
-       b = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(a && b);
-
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,   25, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, -600, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,   10, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,  -35, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, -100, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,   20, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,  -15, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, -800, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, -150, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,   10, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, -800, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0,  -10, a->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
-
-       ASSERT_RETURN(msg_recv_prio(a, -200, -800) == 0);
-       ASSERT_RETURN(msg_recv_prio(a, -100, -800) == 0);
-       ASSERT_RETURN(msg_recv_prio(a, -400, -600) == 0);
-       ASSERT_RETURN(msg_recv_prio(a, -400, -600) == -EAGAIN);
-       ASSERT_RETURN(msg_recv_prio(a, 10, -150) == 0);
-       ASSERT_RETURN(msg_recv_prio(a, 10, -100) == 0);
+       ASSERT_NONZERO(a = kdbus_hello(env->buspath, 0, NULL, 0));
+       ASSERT_NONZERO(b = kdbus_hello(env->buspath, 0, NULL, 0));
+
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,   25, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0, -600, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,   10, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,  -35, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0, -100, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,   20, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,  -15, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0, -800, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0, -150, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,   10, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0, -800, a->id));
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, ++cookie, 0, 0,  -10, a->id));
+
+       ASSERT_ZERO(msg_recv_prio(a, -200, -800));
+       ASSERT_ZERO(msg_recv_prio(a, -100, -800));
+       ASSERT_ZERO(msg_recv_prio(a, -400, -600));
+       ASSERT_RETURN(msg_recv_prio(a, -400, -600),==,-EAGAIN);
+       ASSERT_ZERO(msg_recv_prio(a, 10, -150));
+       ASSERT_ZERO(msg_recv_prio(a, 10, -100));
 
        kdbus_printf("--- get priority (all)\n");
-       ASSERT_RETURN(kdbus_msg_recv(a, NULL, NULL) == 0);
+       ASSERT_ZERO(kdbus_msg_recv(a, NULL, NULL));
 
        kdbus_conn_free(a);
        kdbus_conn_free(b);
@@ -170,37 +149,26 @@ int kdbus_test_message_prio(struct kdbus_test_env *env)
        return TEST_OK;
 }
 
-static int kdbus_test_notify_kernel_quota(struct kdbus_test_env *env)
+static wur int kdbus_test_notify_kernel_quota(struct kdbus_test_env *env)
 {
-       int ret;
        unsigned int i;
        struct kdbus_conn *conn;
        struct kdbus_conn *reader;
        struct kdbus_msg *msg = NULL;
        struct kdbus_cmd_recv recv = { .size = sizeof(recv) };
 
-       reader = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(reader);
-
-       conn = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(conn);
+       ASSERT_NONZERO(reader = kdbus_hello(env->buspath, 0, NULL, 0));
+       ASSERT_NONZERO(conn = kdbus_hello(env->buspath, 0, NULL, 0));
 
        /* Register for ID signals */
-       ret = kdbus_add_match_id(reader, 0x1, KDBUS_ITEM_ID_ADD,
-                                KDBUS_MATCH_ID_ANY);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_add_match_id(reader, 0x1, KDBUS_ITEM_ID_ADD, KDBUS_MATCH_ID_ANY));
 
-       ret = kdbus_add_match_id(reader, 0x2, KDBUS_ITEM_ID_REMOVE,
-                                KDBUS_MATCH_ID_ANY);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_add_match_id(reader, 0x2, KDBUS_ITEM_ID_REMOVE, KDBUS_MATCH_ID_ANY));
 
        /* Each iteration two notifications: add and remove ID */
        for (i = 0; i < KDBUS_CONN_MAX_MSGS / 2; i++) {
                struct kdbus_conn *notifier;
-
-               notifier = kdbus_hello(env->buspath, 0, NULL, 0);
-               ASSERT_RETURN(notifier);
-
+               ASSERT_NONZERO(notifier = kdbus_hello(env->buspath, 0, NULL, 0));
                kdbus_conn_free(notifier);
        }
 
@@ -208,15 +176,12 @@ static int kdbus_test_notify_kernel_quota(struct kdbus_test_env *env)
         * Now the reader queue is full with kernel notfications,
         * but as a user we still have room to push our messages.
         */
-       ret = kdbus_msg_send(conn, NULL, 0xdeadbeef, 0, 0, 0, reader->id,
-                            0, NULL);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_msg_send(conn, NULL, 0xdeadbeef, 0, 0, 0, reader->id));
 
        /* More ID kernel notifications that will be lost */
        kdbus_conn_free(conn);
 
-       conn = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(conn);
+       ASSERT_NONZERO(conn = kdbus_hello(env->buspath, 0, NULL, 0));
 
        kdbus_conn_free(conn);
 
@@ -224,10 +189,9 @@ static int kdbus_test_notify_kernel_quota(struct kdbus_test_env *env)
         * We lost only 3 packets since only signal msgs are
         * accounted. The connection ID add/remove notification
         */
-       ret = kdbus_cmd_recv(reader->fd, &recv);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(recv.return_flags & KDBUS_RECV_RETURN_DROPPED_MSGS);
-       ASSERT_RETURN(recv.dropped_msgs == 3);
+       ASSERT_ZERO(kdbus_cmd_recv(reader->fd, &recv));
+       ASSERT_NONZERO(recv.return_flags & KDBUS_RECV_RETURN_DROPPED_MSGS);
+       ASSERT_RETURN(recv.dropped_msgs,==,3U);
 
        msg = (struct kdbus_msg *)(reader->buf + recv.msg.offset);
        kdbus_msg_free(msg);
@@ -237,20 +201,16 @@ static int kdbus_test_notify_kernel_quota(struct kdbus_test_env *env)
                memset(&recv, 0, sizeof(recv));
                recv.size = sizeof(recv);
 
-               ret = kdbus_cmd_recv(reader->fd, &recv);
-               ASSERT_RETURN(ret == 0);
-               ASSERT_RETURN(!(recv.return_flags &
-                               KDBUS_RECV_RETURN_DROPPED_MSGS));
+               ASSERT_ZERO(kdbus_cmd_recv(reader->fd, &recv));
+               ASSERT_ZERO(recv.return_flags & KDBUS_RECV_RETURN_DROPPED_MSGS);
 
                msg = (struct kdbus_msg *)(reader->buf + recv.msg.offset);
                kdbus_msg_free(msg);
        }
 
-       ret = kdbus_msg_recv(reader, NULL, NULL);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_msg_recv(reader, NULL, NULL));
 
-       ret = kdbus_msg_recv(reader, NULL, NULL);
-       ASSERT_RETURN(ret == -EAGAIN);
+       ASSERT_RETURN(-EAGAIN,==,kdbus_msg_recv(reader, NULL, NULL));
 
        kdbus_conn_free(reader);
 
@@ -258,7 +218,7 @@ static int kdbus_test_notify_kernel_quota(struct kdbus_test_env *env)
 }
 
 /* Return the number of message successfully sent */
-static int kdbus_fill_conn_queue(struct kdbus_conn *conn_src,
+static wur int kdbus_fill_conn_queue(struct kdbus_conn *conn_src,
                                 uint64_t dst_id,
                                 unsigned int max_msgs)
 {
@@ -271,7 +231,7 @@ static int kdbus_fill_conn_queue(struct kdbus_conn *conn_src,
 
        size = sizeof(struct kdbus_msg);
        msg = malloc(size);
-       ASSERT_RETURN_VAL(msg, -ENOMEM);
+       ASSERT_RETURN_VAL(msg,!=,NULL, -ENOMEM);
 
        memset(msg, 0, size);
        msg->size = size;
@@ -283,10 +243,12 @@ static int kdbus_fill_conn_queue(struct kdbus_conn *conn_src,
        cmd.msg_address = (uintptr_t)msg;
 
        for (i = 0; i < max_msgs; i++) {
-               msg->cookie = cookie++;
+               msg->cookie = ++cookie;
                ret = kdbus_cmd_send(conn_src->fd, &cmd);
-               if (ret < 0)
+               if (ret < 0) {
+                       /*print("fill_conn_queue_senderr(%d)", ret);*/
                        break;
+               }
        }
 
        free(msg);
@@ -294,17 +256,15 @@ static int kdbus_fill_conn_queue(struct kdbus_conn *conn_src,
        return i;
 }
 
-static int kdbus_test_activator_quota(struct kdbus_test_env *env)
+wur int kdbus_test_activator_quota(struct kdbus_test_env *env)
 {
-       int ret;
-       unsigned int i;
-       unsigned int activator_msgs_count = 0;
+       unsigned i, activator_msgs_count=0;
        uint64_t cookie = time(NULL);
+       uint64_t flags = KDBUS_NAME_REPLACE_EXISTING;
        struct kdbus_conn *conn;
        struct kdbus_conn *sender;
        struct kdbus_conn *activator;
        struct kdbus_msg *msg;
-       uint64_t flags = KDBUS_NAME_REPLACE_EXISTING;
        struct kdbus_cmd_recv recv = { .size = sizeof(recv) };
        struct kdbus_policy_access access = {
                .type = KDBUS_POLICY_ACCESS_USER,
@@ -312,140 +272,110 @@ static int kdbus_test_activator_quota(struct kdbus_test_env *env)
                .access = KDBUS_POLICY_OWN,
        };
 
-       activator = kdbus_hello_activator(env->buspath, "foo.test.activator",
-                                         &access, 1);
-       ASSERT_RETURN(activator);
-
-       conn = kdbus_hello(env->buspath, 0, NULL, 0);
-       sender = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(conn || sender);
-
-       ret = kdbus_list(sender, KDBUS_LIST_NAMES |
-                                KDBUS_LIST_UNIQUE |
-                                KDBUS_LIST_ACTIVATORS |
-                                KDBUS_LIST_QUEUED);
-       ASSERT_RETURN(ret == 0);
-
-       for (i = 0; i < KDBUS_CONN_MAX_MSGS; i++) {
-               ret = kdbus_msg_send(sender, "foo.test.activator",
-                                    cookie++, 0, 0, 0,
-                                    KDBUS_DST_ID_NAME,
-                                    0, NULL);
-               if (ret < 0)
-                       break;
-               activator_msgs_count++;
-       }
+       ASSERT_NONZERO(activator = kdbus_hello_activator(env->buspath, "foo.test.activator", &access, 1));
+
+       ASSERT_NONZERO(conn = kdbus_hello(env->buspath, 0, NULL, 0));
+       ASSERT_NONZERO(sender = kdbus_hello(env->buspath, 0, NULL, 0));
+
+       ASSERT_ZERO(kdbus_list(sender, KDBUS_LIST_NAMES | KDBUS_LIST_UNIQUE | KDBUS_LIST_ACTIVATORS | KDBUS_LIST_QUEUED));
+
+#define EXHAUST(EXPECTERR,SENDOP) do {\
+       for (i = 0;; ++i) {\
+               int ret = (SENDOP);\
+               ASSERT_RETURN(i,<=,KDBUS_CONN_MAX_MSGS);\
+               if (0 > ret) {\
+                       ASSERT_RETURN((EXPECTERR),==,ret);\
+                       ASSERT_RETURN(i,<,KDBUS_CONN_MAX_MSGS);\
+                       break;\
+               }\
+       }\
+} while (0)
+       EXHAUST(-ENOBUFS,kdbus_msg_send(sender, "foo.test.activator", ++cookie, 0, 0, 0, KDBUS_DST_ID_NAME));
+       activator_msgs_count = i;
 
        /* we must have at least sent one message */
-       ASSERT_RETURN_VAL(i > 0, -errno);
-       ASSERT_RETURN(ret == -ENOBUFS);
+       ASSERT_RETURN_VAL(i,>,0U, -errno);
 
        /* Good, activator queue is full now */
 
        /* ENXIO on direct send (activators can never be addressed by ID) */
-       ret = kdbus_msg_send(conn, NULL, cookie++, 0, 0, 0, activator->id,
-                            0, NULL);
-       ASSERT_RETURN(ret == -ENXIO);
+       ASSERT_RETURN(-ENXIO,==,kdbus_msg_send(conn, NULL, ++cookie, 0, 0, 0, activator->id));
 
        /* can't queue more */
-       ret = kdbus_msg_send(conn, "foo.test.activator", cookie++,
-                            0, 0, 0, KDBUS_DST_ID_NAME, 0, NULL);
-       ASSERT_RETURN(ret == -ENOBUFS);
+       ASSERT_RETURN(-ENOBUFS,==,kdbus_msg_send(conn, "foo.test.activator", ++cookie, 0, 0, 0, KDBUS_DST_ID_NAME));
 
        /* no match installed, so the broadcast will not inc dropped_msgs */
-       ret = kdbus_msg_send(sender, NULL, cookie++, 0, 0, 0,
-                            KDBUS_DST_ID_BROADCAST, 0, NULL);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_msg_send(conn, NULL, ++cookie, 0, 0, 0, KDBUS_DST_ID_BROADCAST));
 
        /* Check activator queue */
-       ret = kdbus_cmd_recv(activator->fd, &recv);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(recv.dropped_msgs == 0);
-
-       activator_msgs_count--;
+       ASSERT_ZERO(kdbus_cmd_recv(activator->fd, &recv));
+       ASSERT_ZERO(recv.dropped_msgs);
 
        msg = (struct kdbus_msg *)(activator->buf + recv.msg.offset);
+       ASSERT_RETURN(msg->src_id,==,sender->id);
+       ASSERT_RETURN(msg->dst_id,==,(typeof(msg->dst_id))KDBUS_DST_ID_NAME);
+       --activator_msgs_count;
        kdbus_msg_free(msg);
 
 
        /* Stage 1) of test check the pool memory quota */
 
        /* Consume the connection pool memory */
-       for (i = 0; i < KDBUS_CONN_MAX_MSGS; i++) {
-               ret = kdbus_msg_send(sender, NULL,
-                                    cookie++, 0, 0, 0, conn->id, 0, NULL);
-               if (ret < 0)
-                       break;
-       }
+       EXHAUST(-ENOBUFS,kdbus_msg_send(conn, NULL, ++cookie, 0, 0, 0, conn->id));
 
        /* consume one message, so later at least one can be moved */
        memset(&recv, 0, sizeof(recv));
        recv.size = sizeof(recv);
-       ret = kdbus_cmd_recv(conn->fd, &recv);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(recv.dropped_msgs == 0);
+       ASSERT_ZERO(kdbus_cmd_recv(conn->fd, &recv));
+       ASSERT_ZERO(recv.dropped_msgs);
        msg = (struct kdbus_msg *)(conn->buf + recv.msg.offset);
        kdbus_msg_free(msg);
 
        /* Try to acquire the name now */
-       ret = kdbus_name_acquire(conn, "foo.test.activator", &flags);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_name_acquire(conn, "foo.test.activator", &flags));
 
        /* try to read messages and see if we have lost some */
        memset(&recv, 0, sizeof(recv));
        recv.size = sizeof(recv);
-       ret = kdbus_cmd_recv(conn->fd, &recv);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(recv.dropped_msgs != 0);
+       ASSERT_ZERO(kdbus_cmd_recv(conn->fd, &recv));
+       ASSERT_NONZERO(recv.dropped_msgs);
 
        /* number of dropped msgs < received ones (at least one was moved) */
-       ASSERT_RETURN(recv.dropped_msgs < activator_msgs_count);
+       ASSERT_RETURN(recv.dropped_msgs,<,activator_msgs_count);
 
        /* Deduct the number of dropped msgs from the activator msgs */
        activator_msgs_count -= recv.dropped_msgs;
 
        msg = (struct kdbus_msg *)(activator->buf + recv.msg.offset);
        kdbus_msg_free(msg);
-
        /*
         * Release the name and hand it back to activator, now
         * we should have 'activator_msgs_count' msgs again in
         * the activator queue
         */
-       ret = kdbus_name_release(conn, "foo.test.activator");
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_name_release(conn, "foo.test.activator"));
 
        /* make sure that we got our previous activator msgs */
-       ret = kdbus_msg_recv(activator, &msg, NULL);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(msg->src_id == sender->id);
-
-       activator_msgs_count--;
-
+       ASSERT_ZERO(kdbus_msg_recv(activator, &msg, NULL));
+       ASSERT_RETURN(msg->src_id,==,sender->id);
+       ASSERT_RETURN(msg->dst_id,==,(typeof(msg->dst_id))KDBUS_DST_ID_NAME);
+       --activator_msgs_count;
        kdbus_msg_free(msg);
 
 
        /* Stage 2) of test check max message quota */
 
-       /* Empty conn queue */
-       for (i = 0; i < KDBUS_CONN_MAX_MSGS; i++) {
-               ret = kdbus_msg_recv(conn, NULL, NULL);
-               if (ret == -EAGAIN)
-                       break;
-       }
-
-       /* fill queue with max msgs quota */
-       ret = kdbus_fill_conn_queue(sender, conn->id, KDBUS_CONN_MAX_MSGS);
-       ASSERT_RETURN(ret == KDBUS_CONN_MAX_MSGS);
+       /* Empty conn queue and refill it to the brink anew */
+       EXHAUST(-EAGAIN,kdbus_msg_recv(conn, NULL, NULL));
+       EXHAUST(-ENOBUFS,kdbus_msg_send(sender, NULL, ++cookie, 0, 0, 0, conn->id));
+#undef EXHAUST
 
-       /* This one is lost but it is not accounted */
-       ret = kdbus_msg_send(sender, NULL,
-                            cookie++, 0, 0, 0, conn->id, 0, NULL);
-       ASSERT_RETURN(ret == -ENOBUFS);
+       if (!activator_msgs_count)
+               ASSERT_RETURN(-EAGAIN,==,kdbus_msg_recv(activator, NULL, NULL));
 
        /* Acquire the name again */
-       ret = kdbus_name_acquire(conn, "foo.test.activator", &flags);
-       ASSERT_RETURN(ret == 0);
+       flags = KDBUS_NAME_REPLACE_EXISTING;
+       ASSERT_ZERO(kdbus_name_acquire(conn, "foo.test.activator", &flags));
 
        memset(&recv, 0, sizeof(recv));
        recv.size = sizeof(recv);
@@ -455,9 +385,8 @@ static int kdbus_test_activator_quota(struct kdbus_test_env *env)
         * the activator messages due to quota checks. Our queue is
         * already full.
         */
-       ret = kdbus_cmd_recv(conn->fd, &recv);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(recv.dropped_msgs == activator_msgs_count);
+       ASSERT_ZERO(kdbus_cmd_recv(conn->fd, &recv));
+       ASSERT_RETURN(recv.dropped_msgs,==,activator_msgs_count);
 
        msg = (struct kdbus_msg *)(activator->buf + recv.msg.offset);
        kdbus_msg_free(msg);
@@ -466,66 +395,114 @@ static int kdbus_test_activator_quota(struct kdbus_test_env *env)
        kdbus_conn_free(conn);
        kdbus_conn_free(activator);
 
+       return TEST_OK;
+}
+
+#define TIMEOUT_CONNECTION_COUNT 8
+#define TIMEOUTS_PER_CONNECTION (MIN(KDBUS_CONN_MAX_REQUESTS_PENDING,KDBUS_CONN_MAX_MSGS)/TIMEOUT_CONNECTION_COUNT)
+
+static wur int kdbus_test_expected_reply_validate_timeouts(struct kdbus_conn *conn, uint64_t first_cookie, uint64_t type)
+{
+       uint64_t cookie_reply, seqnum, monotonic_ns, realtime_ns, prev_seqnum=0, prev_monotonic_ns=0, prev_realtime_ns=0;
+       unsigned i, next_cookie[TIMEOUT_CONNECTION_COUNT];
+       memset(next_cookie, 0, sizeof(next_cookie));
+       for (i=0; i < MIN(KDBUS_CONN_MAX_REQUESTS_PENDING,KDBUS_CONN_MAX_MSGS); i++) {
+               unsigned n, r;
+               ASSERT_ZERO(timeout_msg_recv(conn, type, &cookie_reply, &seqnum, &monotonic_ns, &realtime_ns));
+               #define A(W,R) do { ASSERT_RETURN(prev_##W,R,W); prev_##W = W; } while (0);
+                       A(seqnum,<)
+                       A(monotonic_ns,<=)
+                       A(realtime_ns,<=)
+               #undef A
+               ASSERT_RETURN(first_cookie,<=,cookie_reply);
+               cookie_reply -= first_cookie;
+               n = cookie_reply % TIMEOUT_CONNECTION_COUNT;
+               r = cookie_reply / TIMEOUT_CONNECTION_COUNT;
+               ASSERT_RETURN(r,==,next_cookie[n]);
+               ++next_cookie[n];
+       }
+       ASSERT_NO_PENDING(conn);
        return 0;
 }
 
-static int kdbus_test_expected_reply_quota(struct kdbus_test_env *env)
+static wur int kdbus_test_expected_reply_timeouts_or_quota(struct kdbus_test_env *env)
 {
-       int ret;
-       unsigned int i, n;
-       unsigned int count;
-       uint64_t cookie = 0x1234abcd5678eeff;
+       unsigned i, n;
+       uint64_t first_cookie = 0x1234abcd5678eeff;
        struct kdbus_conn *conn;
-       struct kdbus_conn *connections[9];
+       struct kdbus_conn *connections[1+TIMEOUT_CONNECTION_COUNT];
 
-       conn = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(conn);
+       ASSERT_NONZERO(conn = kdbus_hello(env->buspath, 0, NULL, 0));
 
-       for (i = 0; i < 9; i++) {
-               connections[i] = kdbus_hello(env->buspath, 0, NULL, 0);
-               ASSERT_RETURN(connections[i]);
-       }
+       for (i = 0; i < 1+TIMEOUT_CONNECTION_COUNT; i++)
+               ASSERT_NONZERO(connections[i] = kdbus_hello(env->buspath, 0, NULL, 0));
 
-       count = 0;
-       /* Send 16 messages to 8 different connections */
-       for (i = 0; i < 8; i++) {
-               for (n = 0; n < 16; n++) {
-                       ret = kdbus_msg_send(conn, NULL, cookie++,
-                                            KDBUS_MSG_EXPECT_REPLY,
-                                            100000000ULL, 0,
-                                            connections[i]->id,
-                                            0, NULL);
-                       if (ret < 0)
-                               break;
+       _Static_assert(!(KDBUS_CONN_MAX_REQUESTS_PENDING%TIMEOUT_CONNECTION_COUNT), "KDBUS_CONN_MAX_REQUESTS_PENDING) not a multitude of TIMEOUT_CONNECTION_COUNT - quota test needs to be modified to reflect that");
 
-                       count++;
+       /* Send messages to TIMEOUT_CONNECTION_COUNT different connections */
+       for (i = 0; i < TIMEOUT_CONNECTION_COUNT; i++)
+               for (n = 0; n < TIMEOUTS_PER_CONNECTION; n++) {
+                       ASSERT_ZERO(kdbus_msg_send(conn, NULL, first_cookie + i + n*TIMEOUT_CONNECTION_COUNT,
+                                            KDBUS_MSG_EXPECT_REPLY,
+                                            200000000ULL /* 0.2s */, 0,
+                                            connections[i]->id));
+                       /* drain queue to avoid hitting KDBUS_CONN_MAX_MSGS */
+                       ASSERT_ZERO(kdbus_msg_recv(connections[i], NULL, NULL));
                }
-       }
 
-       /*
-        * We should have queued at least
-        * KDBUS_CONN_MAX_REQUESTS_PENDING method call
-        */
-       ASSERT_RETURN(count == KDBUS_CONN_MAX_REQUESTS_PENDING);
+       sleep(1); /* just to wait and see if timeout logic somehow destabilizes the system */
+
+       ASSERT_ZERO(kdbus_test_expected_reply_validate_timeouts(conn, first_cookie, KDBUS_ITEM_REPLY_TIMEOUT));
+
+       for (i = 0; i < 1+TIMEOUT_CONNECTION_COUNT; i++)
+               kdbus_conn_free(connections[i]);
+
+       kdbus_conn_free(conn);
+
+       return 0;
+}
+
+static wur int kdbus_test_expected_reply_quota(struct kdbus_test_env *env)
+{
+       unsigned i, n;
+       uint64_t first_cookie = 0x5678eeff1234abcd;
+       struct kdbus_conn *conn;
+       struct kdbus_conn *connections[1+TIMEOUT_CONNECTION_COUNT];
+
+       ASSERT_NONZERO(conn = kdbus_hello(env->buspath, 0, NULL, 0));
+
+       for (i = 0; i < 1+TIMEOUT_CONNECTION_COUNT; i++)
+               ASSERT_NONZERO(connections[i] = kdbus_hello(env->buspath, 0, NULL, 0));
+
+       /* Send messages to TIMEOUT_CONNECTION_COUNT different connections */
+       for (i = 0; i < TIMEOUT_CONNECTION_COUNT; i++)
+               for (n = 0; n < KDBUS_CONN_MAX_REQUESTS_PENDING/TIMEOUT_CONNECTION_COUNT; n++) {
+                       ASSERT_ZERO(kdbus_msg_send(conn, NULL, first_cookie + i + n*TIMEOUT_CONNECTION_COUNT,
+                                            KDBUS_MSG_EXPECT_REPLY,
+                                            KDBUS_TIMEOUT_INFINITE, 0, /* massive timeout to make sure all pending replies do not timeout before quota check below */
+                                            connections[i]->id));
+                       /* drain queue to avoid hitting KDBUS_CONN_MAX_MSGS */
+                       ASSERT_ZERO(kdbus_msg_recv(connections[i], NULL, NULL));
+               }
 
        /*
         * Now try to send a message to the last connection,
         * if we have reached KDBUS_CONN_MAX_REQUESTS_PENDING
         * no further requests are allowed
         */
-       ret = kdbus_msg_send(conn, NULL, cookie++, KDBUS_MSG_EXPECT_REPLY,
-                            1000000000ULL, 0, connections[8]->id, 0, NULL);
-       ASSERT_RETURN(ret == -EMLINK);
+       ASSERT_RETURN(-EMLINK,==,kdbus_msg_send(conn, NULL, first_cookie + TIMEOUT_CONNECTION_COUNT*TIMEOUTS_PER_CONNECTION, KDBUS_MSG_EXPECT_REPLY, 1000000000ULL, 0, connections[TIMEOUT_CONNECTION_COUNT]->id));
 
-       for (i = 0; i < 9; i++)
+       for (i = 0; i < 1+TIMEOUT_CONNECTION_COUNT; i++)
                kdbus_conn_free(connections[i]);
 
+       ASSERT_ZERO(kdbus_test_expected_reply_validate_timeouts(conn, first_cookie, KDBUS_ITEM_REPLY_DEAD));
+
        kdbus_conn_free(conn);
 
        return 0;
 }
 
-int kdbus_test_pool_quota(struct kdbus_test_env *env)
+wur int kdbus_test_pool_quota(struct kdbus_test_env *env)
 {
        struct kdbus_conn *a, *b, *c;
        struct kdbus_cmd_send cmd = {};
@@ -544,18 +521,17 @@ int kdbus_test_pool_quota(struct kdbus_test_env *env)
                return 0;
 
        payload = calloc(KDBUS_MSG_MAX_PAYLOAD_VEC_SIZE, sizeof(char));
-       ASSERT_RETURN_VAL(payload, -ENOMEM);
+       ASSERT_RETURN_VAL(payload,!=,NULL, -ENOMEM);
 
-       a = kdbus_hello(env->buspath, 0, NULL, 0);
-       b = kdbus_hello(env->buspath, 0, NULL, 0);
-       c = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(a && b && c);
+       ASSERT_NONZERO(a = kdbus_hello(env->buspath, 0, NULL, 0));
+       ASSERT_NONZERO(b = kdbus_hello(env->buspath, 0, NULL, 0));
+       ASSERT_NONZERO(c = kdbus_hello(env->buspath, 0, NULL, 0));
 
        size = sizeof(struct kdbus_msg);
        size += KDBUS_ITEM_SIZE(sizeof(struct kdbus_vec));
 
        msg = malloc(size);
-       ASSERT_RETURN_VAL(msg, -ENOMEM);
+       ASSERT_RETURN_VAL(msg,!=,NULL, -ENOMEM);
 
        memset(msg, 0, size);
        msg->size = size;
@@ -583,34 +559,29 @@ int kdbus_test_pool_quota(struct kdbus_test_env *env)
                msg->cookie = cookie++;
 
                ret = kdbus_cmd_send(a->fd, &cmd);
-               ASSERT_RETURN_VAL(ret == 0, ret);
+               ASSERT_RETURN_VAL(ret,==,0, ret);
        }
 
        /* Try to get more than 33% */
        msg->cookie = cookie++;
-       ret = kdbus_cmd_send(a->fd, &cmd);
-       ASSERT_RETURN(ret == -ENOBUFS);
+       ASSERT_RETURN(-ENOBUFS,==,kdbus_cmd_send(a->fd, &cmd));
 
        /* We still can pass small messages */
-       ret = kdbus_msg_send(b, NULL, cookie++, 0, 0, 0, c->id, 0, NULL);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_msg_send(b, NULL, cookie++, 0, 0, 0, c->id));
 
        for (i = size; i < (POOL_SIZE / 2 / 3); i += size) {
-               ret = kdbus_msg_recv(c, &recv_msg, NULL);
-               ASSERT_RETURN(ret == 0);
-               ASSERT_RETURN(recv_msg->src_id == a->id);
+               ASSERT_ZERO(kdbus_msg_recv(c, &recv_msg, NULL));
+               ASSERT_RETURN(recv_msg->src_id,==,a->id);
 
                kdbus_msg_free(recv_msg);
        }
 
-       ret = kdbus_msg_recv(c, &recv_msg, NULL);
-       ASSERT_RETURN(ret == 0);
-       ASSERT_RETURN(recv_msg->src_id == b->id);
+       ASSERT_ZERO(kdbus_msg_recv(c, &recv_msg, NULL));
+       ASSERT_RETURN(recv_msg->src_id,==,b->id);
 
        kdbus_msg_free(recv_msg);
 
-       ret = kdbus_msg_recv(c, NULL, NULL);
-       ASSERT_RETURN(ret == -EAGAIN);
+       ASSERT_RETURN(-EAGAIN,==,kdbus_msg_recv(c, NULL, NULL));
 
        free(msg);
        free(payload);
@@ -622,47 +593,35 @@ int kdbus_test_pool_quota(struct kdbus_test_env *env)
        return 0;
 }
 
-int kdbus_test_message_quota(struct kdbus_test_env *env)
+wur int kdbus_test_message_quota(struct kdbus_test_env *env)
 {
        struct kdbus_conn *a, *b;
        uint64_t cookie = 0;
-       int ret;
-       int i;
+       unsigned i;
 
-       ret = kdbus_test_activator_quota(env);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_test_notify_kernel_quota(env));
 
-       ret = kdbus_test_notify_kernel_quota(env);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_test_pool_quota(env));
 
-       ret = kdbus_test_pool_quota(env);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_test_expected_reply_timeouts_or_quota(env));
 
-       ret = kdbus_test_expected_reply_quota(env);
-       ASSERT_RETURN(ret == 0);
+       ASSERT_ZERO(kdbus_test_expected_reply_quota(env));
 
        a = kdbus_hello(env->buspath, 0, NULL, 0);
        b = kdbus_hello(env->buspath, 0, NULL, 0);
 
-       ret = kdbus_fill_conn_queue(b, a->id, KDBUS_CONN_MAX_MSGS);
-       ASSERT_RETURN(ret == KDBUS_CONN_MAX_MSGS);
+       ASSERT_RETURN((typeof(kdbus_fill_conn_queue(b, a->id, KDBUS_CONN_MAX_MSGS)))KDBUS_CONN_MAX_MSGS,==,kdbus_fill_conn_queue(b, a->id, KDBUS_CONN_MAX_MSGS));
 
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, 0, a->id, 0, NULL);
-       ASSERT_RETURN(ret == -ENOBUFS);
+       ASSERT_RETURN(-ENOBUFS,==,kdbus_msg_send(b, NULL, ++cookie, 0, 0, 0, a->id));
 
-       for (i = 0; i < KDBUS_CONN_MAX_MSGS; ++i) {
-               ret = kdbus_msg_recv(a, NULL, NULL);
-               ASSERT_RETURN(ret == 0);
-       }
+       for (i = 0; i < KDBUS_CONN_MAX_MSGS; ++i)
+               ASSERT_ZERO(kdbus_msg_recv(a, NULL, NULL));
 
-       ret = kdbus_msg_recv(a, NULL, NULL);
-       ASSERT_RETURN(ret == -EAGAIN);
+       ASSERT_RETURN(-EAGAIN,==,kdbus_msg_recv(a, NULL, NULL));
 
-       ret = kdbus_fill_conn_queue(b, a->id, KDBUS_CONN_MAX_MSGS + 1);
-       ASSERT_RETURN(ret == KDBUS_CONN_MAX_MSGS);
+       ASSERT_RETURN((typeof(kdbus_fill_conn_queue(b, a->id, KDBUS_CONN_MAX_MSGS + 1)))KDBUS_CONN_MAX_MSGS,==,kdbus_fill_conn_queue(b, a->id, KDBUS_CONN_MAX_MSGS + 1));
 
-       ret = kdbus_msg_send(b, NULL, ++cookie, 0, 0, 0, a->id, 0, NULL);
-       ASSERT_RETURN(ret == -ENOBUFS);
+       ASSERT_RETURN(-ENOBUFS,==,kdbus_msg_send(b, NULL, ++cookie, 0, 0, 0, a->id));
 
        kdbus_conn_free(a);
        kdbus_conn_free(b);
@@ -670,7 +629,7 @@ int kdbus_test_message_quota(struct kdbus_test_env *env)
        return TEST_OK;
 }
 
-int kdbus_test_memory_access(struct kdbus_test_env *env)
+wur int kdbus_test_memory_access(struct kdbus_test_env *env)
 {
        struct kdbus_conn *a, *b;
        struct kdbus_cmd_send cmd = {};
@@ -680,7 +639,6 @@ int kdbus_test_memory_access(struct kdbus_test_env *env)
        char line[256];
        uint64_t size;
        FILE *f;
-       int ret;
 
        /*
         * Search in /proc/kallsyms for the address of a kernel symbol that
@@ -712,15 +670,14 @@ int kdbus_test_memory_access(struct kdbus_test_env *env)
        if (!test_addr)
                return TEST_SKIP;
 
-       a = kdbus_hello(env->buspath, 0, NULL, 0);
-       b = kdbus_hello(env->buspath, 0, NULL, 0);
-       ASSERT_RETURN(a && b);
+       ASSERT_NONZERO(a = kdbus_hello(env->buspath, 0, NULL, 0));
+       ASSERT_NONZERO(b = kdbus_hello(env->buspath, 0, NULL, 0));
 
        size = sizeof(struct kdbus_msg);
        size += KDBUS_ITEM_SIZE(sizeof(struct kdbus_vec));
 
        msg = alloca(size);
-       ASSERT_RETURN_VAL(msg, -ENOMEM);
+       ASSERT_RETURN_VAL(msg,!=,NULL, -ENOMEM);
 
        memset(msg, 0, size);
        msg->size = size;
@@ -738,8 +695,7 @@ int kdbus_test_memory_access(struct kdbus_test_env *env)
        cmd.size = sizeof(cmd);
        cmd.msg_address = (uintptr_t)msg;
 
-       ret = kdbus_cmd_send(a->fd, &cmd);
-       ASSERT_RETURN(ret == -EFAULT);
+       ASSERT_RETURN(-EFAULT,==,kdbus_cmd_send(a->fd, &cmd));
 
        kdbus_conn_free(b);
        kdbus_conn_free(a);