blob: 65a1c25a6bffaef70695b37d53b47bb6f8f60af0 [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include <unistd.h>
2
3#include <memory>
4
5#include "gtest/gtest.h"
6#include "aos/common/test_queue.q.h"
7#include "aos/common/queue_testutils.h"
Brian Silverman798c7782013-03-28 16:48:02 -07008#include "aos/common/util/thread.h"
brians343bc112013-02-10 01:53:46 +00009
10using ::aos::time::Time;
11
12namespace aos {
13namespace common {
brians343bc112013-02-10 01:53:46 +000014namespace testing {
15
16class QueueTest : public ::testing::Test {
17 protected:
18 GlobalCoreInstance my_core;
19 // Create a new instance of the test queue so that it invalidates the queue
20 // that it points to. Otherwise, we will have a pointer to shared memory that
21 // is no longer valid.
22 ::aos::Queue<TestingMessage> my_test_queue;
23
24 QueueTest() : my_test_queue(".aos.common.testing.test_queue") {}
25};
26
Brian Silverman798c7782013-03-28 16:48:02 -070027class MyThread : public util::Thread {
brians343bc112013-02-10 01:53:46 +000028 public:
29 MyThread() : threaded_test_queue(".aos.common.testing.test_queue") {}
30
31 virtual void Run() {
32 ASSERT_TRUE(threaded_test_queue.FetchNextBlocking());
33 EXPECT_TRUE(threaded_test_queue->test_bool);
34 EXPECT_EQ(0x971, threaded_test_queue->test_int);
35 }
36
37 ::aos::Queue<TestingMessage> threaded_test_queue;
38 private:
39 DISALLOW_COPY_AND_ASSIGN(MyThread);
40};
41
42
43// Tests that we can send a message to another thread and it blocking receives
44// it at the correct time.
45TEST_F(QueueTest, FetchBlocking) {
46 MyThread t;
47 t.Start();
48 usleep(50000);
49 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
50 t.Join();
51 EXPECT_EQ(true, t.threaded_test_queue.IsNewerThanMS(20));
52}
53
54// Tests that we can send a message with the message pointer and get it back.
55TEST_F(QueueTest, SendMessage) {
56 ScopedMessagePtr<TestingMessage> msg = my_test_queue.MakeMessage();
57 msg->test_bool = true;
58 msg->test_int = 0x971;
59 msg.Send();
60
61 ASSERT_TRUE(my_test_queue.FetchLatest());
62 EXPECT_TRUE(my_test_queue->test_bool);
63 EXPECT_EQ(0x971, my_test_queue->test_int);
64}
65
66// Tests that we can send a message with the message pointer and get it back.
67TEST_F(QueueTest, SendMessageBlockingSafe) {
68 SafeScopedMessagePtr<TestingMessage> msg = my_test_queue.SafeMakeMessage();
69 msg->test_bool = true;
70 msg->test_int = 0x971;
71 ASSERT_TRUE(msg.SendBlocking());
72
73 ASSERT_TRUE(my_test_queue.FetchLatest());
74 EXPECT_TRUE(my_test_queue->test_bool);
75 EXPECT_EQ(0x971, my_test_queue->test_int);
76}
77
78// Tests that we can send a message with the message pointer and get it back.
79TEST_F(QueueTest, SendMessageSafe) {
80 SafeScopedMessagePtr<TestingMessage> msg = my_test_queue.SafeMakeMessage();
81 msg->test_bool = true;
82 msg->test_int = 0x971;
83 msg.Send();
84
85 ASSERT_TRUE(my_test_queue.FetchLatest());
86 EXPECT_TRUE(my_test_queue->test_bool);
87 EXPECT_EQ(0x971, my_test_queue->test_int);
88}
89
90// Tests that we can send a message with the builder and get it back.
91TEST_F(QueueTest, SendWithBuilder) {
92 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
93
94 ASSERT_TRUE(my_test_queue.FetchLatest());
95 EXPECT_EQ(true, my_test_queue->test_bool);
96 EXPECT_EQ(0x971, my_test_queue->test_int);
97 EXPECT_EQ(true, my_test_queue.IsNewerThanMS(10000));
98}
99
100// Tests that various pointer deref functions at least seem to work.
101TEST_F(QueueTest, PointerDeref) {
102 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
103
104 ASSERT_TRUE(my_test_queue.FetchLatest());
105 const TestingMessage *msg_ptr = my_test_queue.get();
106 ASSERT_NE(static_cast<TestingMessage*>(NULL), msg_ptr);
107 EXPECT_EQ(0x971, msg_ptr->test_int);
108 EXPECT_EQ(msg_ptr, &(*my_test_queue));
109}
110
111// Tests that FetchNext doesn't miss any messages.
112TEST_F(QueueTest, FetchNext) {
113 for (int i = 0; i < 10; ++i) {
114 my_test_queue.MakeWithBuilder().test_bool(true).test_int(i).Send();
115 }
116
117 for (int i = 0; i < 10; ++i) {
118 ASSERT_TRUE(my_test_queue.FetchNext());
119 EXPECT_EQ(i, my_test_queue->test_int);
120 }
121}
122
123// Tests that FetchLatest skips a missing message.
124TEST_F(QueueTest, FetchLatest) {
125 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x254).Send();
126 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
127
128 ASSERT_TRUE(my_test_queue.FetchLatest());
129 EXPECT_EQ(0x971, my_test_queue->test_int);
130}
131
132// Tests that FetchLatest works with multiple readers.
133TEST_F(QueueTest, FetchLatestMultiple) {
134 ::aos::Queue<TestingMessage> my_second_test_queue(
135 ".aos.common.testing.test_queue");
136 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x254).Send();
137 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
138
139 ASSERT_TRUE(my_test_queue.FetchLatest());
140 EXPECT_EQ(0x971, my_test_queue->test_int);
141 ASSERT_TRUE(my_second_test_queue.FetchLatest());
142 ASSERT_TRUE(my_second_test_queue.get() != NULL);
143 EXPECT_EQ(0x971, my_second_test_queue->test_int);
144}
145
146
147// Tests that fetching without a new message returns false.
148TEST_F(QueueTest, FetchLatestWithoutMessage) {
149 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x254).Send();
150 EXPECT_TRUE(my_test_queue.FetchLatest());
151 EXPECT_FALSE(my_test_queue.FetchLatest());
152 EXPECT_FALSE(my_test_queue.FetchLatest());
153 EXPECT_EQ(0x254, my_test_queue->test_int);
154}
155
156// Tests that fetching without a message returns false.
157TEST_F(QueueTest, FetchOnFreshQueue) {
158 EXPECT_FALSE(my_test_queue.FetchLatest());
159 EXPECT_EQ(static_cast<TestingMessage*>(NULL), my_test_queue.get());
160}
161
162// Tests that fetch next without a message returns false.
163TEST_F(QueueTest, FetchNextOnFreshQueue) {
164 EXPECT_FALSE(my_test_queue.FetchNext());
165 EXPECT_EQ(static_cast<TestingMessage*>(NULL), my_test_queue.get());
166}
167
168// Tests that fetch next without a new message returns false.
169TEST_F(QueueTest, FetchNextWithoutMessage) {
170 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x254).Send();
171 EXPECT_TRUE(my_test_queue.FetchNext());
172 EXPECT_FALSE(my_test_queue.FetchNext());
173 EXPECT_NE(static_cast<TestingMessage*>(NULL), my_test_queue.get());
174}
175
176// Tests that age makes some sense.
177TEST_F(QueueTest, Age) {
178 my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
179
180 ASSERT_TRUE(my_test_queue.FetchLatest());
181 EXPECT_TRUE(my_test_queue.IsNewerThanMS(100));
182 const Time age = my_test_queue.Age();
183 EXPECT_EQ(0, age.sec());
184 EXPECT_GE(100000000, age.nsec());
185}
186
187
188class GroupTest : public ::testing::Test {
189 protected:
190 GlobalCoreInstance my_core;
191 // Create a new instance of the test group so that it invalidates the queue
192 // that it points to. Otherwise, we will have a pointer to shared memory that
193 // is no longer valid.
194 TwoQueues my_test_queuegroup;
195
196 GroupTest()
197 : my_test_queuegroup(".aos.common.testing.test_queuegroup",
198 0x20561114,
199 ".aos.common.testing.test_queuegroup.first",
200 ".aos.common.testing.test_queuegroup.second") {}
201};
202
203// Tests that the hash gets preserved.
204TEST_F(GroupTest, Hash) {
205 EXPECT_EQ(static_cast<uint32_t>(0x20561114), my_test_queuegroup.hash());
206}
207
208// Tests that the hash works.
209TEST_F(GroupTest, RealHash) {
210 EXPECT_EQ(static_cast<uint32_t>(0x5b25097f), test_queuegroup.hash());
211}
212
213// Tests that name works.
214TEST_F(GroupTest, Name) {
215 EXPECT_EQ(std::string(".aos.common.testing.test_queuegroup"),
216 std::string(my_test_queuegroup.name()));
217}
218
219
220class MessageTest : public ::testing::Test {
221 public:
222 TestingMessage msg;
223};
224
225TEST_F(MessageTest, Zeroing) {
226 msg.test_bool = true;
227 msg.test_int = 0x254;
228 msg.SetTimeToNow();
229
230 msg.Zero();
231
232 EXPECT_FALSE(msg.test_bool);
233 EXPECT_EQ(0, msg.test_int);
234 EXPECT_EQ(0, msg.sent_time.sec());
235 EXPECT_EQ(0, msg.sent_time.nsec());
236}
237
238TEST_F(MessageTest, Size) {
239 EXPECT_EQ(static_cast<size_t>(13), msg.Size());
240}
241
242TEST_F(MessageTest, Serialize) {
243 char serialized_data[msg.Size()];
244 msg.test_bool = true;
245 msg.test_int = 0x254;
246 msg.SetTimeToNow();
247
248 msg.Serialize(serialized_data);
249
250 TestingMessage new_msg;
251 new_msg.Deserialize(serialized_data);
252
253 EXPECT_EQ(msg.test_bool, new_msg.test_bool);
254 EXPECT_EQ(msg.test_int, new_msg.test_int);
255 EXPECT_EQ(msg.sent_time, new_msg.sent_time);
256}
257
258// Tests that Print prints out a message nicely.
259TEST_F(MessageTest, Print) {
260 char printdata[1024];
261 msg.test_bool = true;
262 msg.test_int = 2056;
263 msg.sent_time = Time(971, 254);
264
265 std::string golden("971.000000254s, t, 2056");
266 EXPECT_EQ(golden.size(), msg.Print(printdata, sizeof(printdata)));
267
268 EXPECT_EQ(golden, std::string(printdata));
269}
270
271// Tests that the hash never changes. If it changes, then someone broke the
272// hash routine or changed the message declaration. Both changes need to be
273// validated by hand.
274TEST_F(MessageTest, Hash) {
275 EXPECT_EQ(static_cast<uint32_t>(0xcf740cc1),
276 static_cast<uint32_t>(TestingMessage::kHash));
277}
278
279TEST_F(MessageTest, SetNow) {
280 msg.SetTimeToNow();
281 EXPECT_LE(msg.sent_time - Time::Now(), Time::InMS(20));
282}
283
284} // namespace testing
285} // namespace common
286} // namespace aos