blob: 6f04a7d100efabebe3e18efb9e5416a3b001d2be [file] [log] [blame]
Parker Schuhe4a70d62017-12-27 20:10:20 -08001#include "aos/events/event-loop_param_test.h"
2
3namespace aos {
4namespace testing {
5
6struct TestMessage : public ::aos::Message {
7 enum { kQueueLength = 100, kHash = 0x696c0cdc };
8 int msg_value;
9
10 void Zero() { msg_value = 0; }
11 static size_t Size() { return 1 + ::aos::Message::Size(); }
12 size_t Print(char *buffer, size_t length) const;
13 TestMessage() { Zero(); }
14};
15
16// Tests that watcher and fetcher can fetch from a sender.
17// Also tests that OnRun() works.
18TEST_P(AbstractEventLoopTest, Basic) {
19 auto loop1 = Make();
20 auto loop2 = Make();
21 auto loop3 = Make();
22
23 auto sender = loop1->MakeSender<TestMessage>("/test");
24
25 auto fetcher = loop2->MakeFetcher<TestMessage>("/test");
26
27 auto msg = sender.MakeMessage();
28
29 msg->msg_value = 200;
30
31 msg.Send();
32
33 EXPECT_TRUE(fetcher.Fetch());
34 ASSERT_FALSE(fetcher.get() == nullptr);
35 EXPECT_EQ(fetcher->msg_value, 200);
36
37 bool happened = false;
38
39 loop3->OnRun([&]() { happened = true; });
40
41 loop3->MakeWatcher("/test", [&](const TestMessage &message) {
42 EXPECT_EQ(message.msg_value, 200);
43 loop3->Exit();
44 });
45
46 EXPECT_FALSE(happened);
47 loop3->Run();
48 EXPECT_TRUE(happened);
49}
50
51// Verify that making a fetcher and handler for "/test" dies.
52TEST_P(AbstractEventLoopTest, FetcherAndHandler) {
53 auto loop = Make();
54 auto fetcher = loop->MakeFetcher<TestMessage>("/test");
55 EXPECT_DEATH(loop->MakeWatcher("/test", [&](const TestMessage &) {}), "/test");
56}
57
58// Verify that making 2 fetchers for "/test" fails.
59TEST_P(AbstractEventLoopTest, TwoFetcher) {
60 auto loop = Make();
61 auto fetcher = loop->MakeFetcher<TestMessage>("/test");
62 EXPECT_DEATH(loop->MakeFetcher<TestMessage>("/test"), "/test");
63}
64
65// Verify that registering a handler twice for "/test" fails.
66TEST_P(AbstractEventLoopTest, TwoHandler) {
67 auto loop = Make();
68 loop->MakeWatcher("/test", [&](const TestMessage &) {});
69 EXPECT_DEATH(loop->MakeWatcher("/test", [&](const TestMessage &) {}), "/test");
70}
71
72// Verify that Quit() works when there are multiple watchers.
73TEST_P(AbstractEventLoopTest, MultipleFetcherQuit) {
74 auto loop = Make();
75
76 auto sender = loop->MakeSender<TestMessage>("/test2");
77 {
78 auto msg = sender.MakeMessage();
79 msg->msg_value = 200;
80 msg.Send();
81 }
82
83 loop->MakeWatcher("/test1", [&](const TestMessage &) {});
84 loop->MakeWatcher("/test2", [&](const TestMessage &message) {
85 EXPECT_EQ(message.msg_value, 200);
86 loop->Exit();
87 });
88 loop->Run();
89}
90
91} // namespace testing
92} // namespace aos