LF OS
Hobby operating system for amd64 with high ambitions
Loading...
Searching...
No Matches
test_sd.cxx
Go to the documentation of this file.
1#include <lfostest.h>
2
3namespace LFOS {
4 #define __kernel 1
5
6 extern "C" {
7 #include <message_passing.h>
8 #include "../cstdlib/string.h"
9
10 #include "../sd.c"
11 #include "../mq.c"
12 #include "../tpa.c"
13 #include "../uuid.c"
14 #include "../flexarray.c"
15 }
16
17 void scheduler_waitable_done(enum wait_reason r, union wait_data d, size_t m) {
18 }
19
20 TEST(KernelServiceDiscovery, Basic) {
22
25
26 init_sd();
27
28 uuid_t a = { { 0x1234a27c, 0xdc50, 0x4e38, 0x8c2b, { 0x45, 0x72, 0xd2, 0xe9, 0x2b, 0x80 } } };
29 uuid_t a2 = { { 0x1234a27c, 0xdc50, 0x4e38, 0x8c2b, { 0x45, 0x72, 0xd2, 0xe9, 0x2a, 0x81 } } };
30 uuid_t b = { { 0x8bf252c9, 0x4227, 0x472c, 0x963f, { 0xd7, 0x42, 0xf9, 0x77, 0xac, 0x41 } } };
31
32 ASSERT_EQ(uuid_key(&a), uuid_key(&a2)) << "Collision check UUIDs have same key";
33
34 sd_register(&a, mq0);
35 sd_register(&b, mq0);
36 sd_register(&b, mq1);
37 sd_register(&a2, mq1);
38
39 struct Message msgA = {
40 .size = sizeof(Message),
41 .sender = 0x1337A,
43 };
44
45 EXPECT_EQ(sd_send(&a, &msgA), 1) << "Message sent to registered queue for a";
46
47 struct Message msgB = {
48 .size = sizeof(Message),
49 .sender = 0x1337B,
51 };
52
53 EXPECT_EQ(sd_send(&b, &msgB), 2) << "Message sent to all two reqistered queues for b";
54
55 struct Message msgA2 = {
56 .size = sizeof(Message),
57 .sender = 0x1337A2,
59 };
60
61 EXPECT_EQ(sd_send(&a2, &msgA2), 1) << "Message sent to reqistered queue for a2";
62
63 struct Message msgRecv = {
64 .size = sizeof(Message),
65 };
66
67 EXPECT_EQ(mq_pop(mq0, &msgRecv), 0) << "Received message on queue 0";
68 EXPECT_EQ(msgRecv.sender, 0x1337A) << "Successfully received message for service a on queue 0";
69
70 EXPECT_EQ(mq_pop(mq0, &msgRecv), 0) << "Received message on queue 0";
71 EXPECT_EQ(msgRecv.sender, 0x1337B) << "Successfully received message for service b on queue 0";
72
73 EXPECT_EQ(mq_pop(mq1, &msgRecv), 0) << "Received message on queue 1";
74 EXPECT_EQ(msgRecv.sender, 0x1337B) << "Successfully received message for service b on queue 1";
75
76 EXPECT_EQ(mq_pop(mq1, &msgRecv), 0) << "Received message on queue 1";
77 EXPECT_EQ(msgRecv.sender, 0x1337A2) << "Successfully received message for service a2 on queue 1";
78
79 EXPECT_EQ(mq_pop(mq0, 0), ENOMSG) << "No more messages on queue 0, as expected";
80 EXPECT_EQ(mq_pop(mq1, 0), ENOMSG) << "No more messages on queue 1, as expected";
81
82 mq_destroy(mq0);
83 mq_destroy(mq1);
84 }
85}
allocator_t kernel_alloc
Definition vm.c:737
#define ENOMSG
Definition errno-defs.h:29
pid_t sender
Sender of the message.
size_t size
Size of the message, including metadata.
pid_t sender
Sender of the message.
@ MT_ServiceDiscovery
enum MessageType type
Type of the message.
uint64_t mq_pop(uint64_t mq, struct Message *msg)
Definition mq.c:190
uint64_t mq_create(allocator_t *alloc)
Definition mq.c:69
void init_mq(allocator_t *alloc)
Definition mq.c:65
void mq_destroy(uint64_t mq)
Definition mq.c:93
uint64_t mq_id_t
Definition mq.h:9
TEST(KernelServiceDiscovery, Basic)
Definition test_sd.cxx:20
void scheduler_waitable_done(enum wait_reason r, union wait_data d, size_t m)
Definition test_mq.cxx:12
wait_reason
Definition scheduler.h:13
void init_sd(void)
Definition sd.c:32
int64_t sd_send(uuid_t *uuid, struct Message *msg)
Definition sd.c:109
uint64_t sd_register(uuid_t *uuid, mq_id_t svc_queue)
Definition sd.c:45
uuid_key_t uuid_key(uuid_t *uuid)
Definition uuid.c:4
Definition uuid.h:6