14 #include "kdbus-api.h"
15 #include "kdbus-test.h"
16 #include "kdbus-util.h"
17 #include "kdbus-enum.h"
19 int timeout_msg_recv(struct kdbus_conn *conn, uint64_t *expected)
21 struct kdbus_cmd_recv recv = { .size = sizeof(recv) };
22 struct kdbus_msg *msg;
25 ret = kdbus_cmd_recv(conn->fd, &recv);
27 kdbus_printf("error receiving message: %d (%m)\n", ret);
31 msg = (struct kdbus_msg *)(conn->buf + recv.msg.offset);
33 ASSERT_RETURN_VAL(msg->payload_type == KDBUS_PAYLOAD_KERNEL, -EINVAL);
34 ASSERT_RETURN_VAL(msg->src_id == KDBUS_SRC_ID_KERNEL, -EINVAL);
35 ASSERT_RETURN_VAL(msg->dst_id == conn->id, -EINVAL);
37 *expected &= ~(1ULL << msg->cookie_reply);
38 kdbus_printf("Got message timeout for cookie %llu\n",
41 ret = kdbus_free(conn, recv.msg.offset);
48 int kdbus_test_timeout(struct kdbus_test_env *env)
50 struct kdbus_conn *conn_a, *conn_b;
52 int ret, i, n_msgs = 4;
53 uint64_t expected = 0;
54 uint64_t cookie = 0xdeadbeef;
56 conn_a = kdbus_hello(env->buspath, 0, NULL, 0);
57 conn_b = kdbus_hello(env->buspath, 0, NULL, 0);
58 ASSERT_RETURN(conn_a && conn_b);
63 * send messages that expect a reply (within 100 msec),
64 * but never answer it.
66 for (i = 0; i < n_msgs; i++, cookie++) {
67 kdbus_printf("Sending message with cookie %llu ...\n",
68 (unsigned long long)cookie);
69 ASSERT_RETURN(kdbus_msg_send(conn_b, NULL, cookie,
70 KDBUS_MSG_EXPECT_REPLY,
71 (i + 1) * 100ULL * 1000000ULL, 0,
72 conn_a->id, 0, NULL) == 0);
73 expected |= 1ULL << cookie;
77 fd.events = POLLIN | POLLPRI | POLLHUP;
80 ret = poll(&fd, 1, (n_msgs + 1) * 100);
82 kdbus_printf("--- timeout\n");
86 if (fd.revents & POLLIN)
87 ASSERT_RETURN(!timeout_msg_recv(conn_b, &expected));
93 ASSERT_RETURN(expected == 0);
95 kdbus_conn_free(conn_a);
96 kdbus_conn_free(conn_b);