1 #include <gtest/gtest.h>
2
3 #include <climits>
4
5 #include "AllocationTestHarness.h"
6
7 #include "osi/include/data_dispatcher.h"
8
9 #include "osi/include/fixed_queue.h"
10 #include "osi/include/osi.h"
11
12 #define DUMMY_TYPE_0 34
13 #define DUMMY_TYPE_1 42
14 #define TYPE_EDGE_CASE_ZERO 0
15 #define TYPE_EDGE_CASE_MAX INT_MAX
16
17 #define DUMMY_QUEUE_SIZE 10
18
19 class DataDispatcherTest : public AllocationTestHarness {};
20
21 static char dummy_data_0[42] = "please test your code";
22 static char dummy_data_1[42] = "testing is good for your sanity";
23
TEST_F(DataDispatcherTest,test_new_free_simple)24 TEST_F(DataDispatcherTest, test_new_free_simple) {
25 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
26 ASSERT_TRUE(dispatcher != NULL);
27 data_dispatcher_free(dispatcher);
28 }
29
TEST_F(DataDispatcherTest,test_dispatch_single_to_nowhere)30 TEST_F(DataDispatcherTest, test_dispatch_single_to_nowhere) {
31 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
32 EXPECT_FALSE(
33 data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
34 data_dispatcher_free(dispatcher);
35 }
36
TEST_F(DataDispatcherTest,test_dispatch_single_to_single)37 TEST_F(DataDispatcherTest, test_dispatch_single_to_single) {
38 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
39
40 // Register a queue
41 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
42 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
43 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
44
45 // Send data to the queue
46 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
47
48 // Did we get it?
49 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
50 EXPECT_STREQ(dummy_data_0, (char*)fixed_queue_try_dequeue(dummy_queue));
51 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
52
53 fixed_queue_free(dummy_queue, NULL);
54 data_dispatcher_free(dispatcher);
55 }
56
TEST_F(DataDispatcherTest,test_dispatch_single_to_multiple)57 TEST_F(DataDispatcherTest, test_dispatch_single_to_multiple) {
58 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
59
60 // Register two queues
61 fixed_queue_t* dummy_queue0 = fixed_queue_new(DUMMY_QUEUE_SIZE);
62 fixed_queue_t* dummy_queue1 = fixed_queue_new(DUMMY_QUEUE_SIZE);
63 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue0);
64 data_dispatcher_register(dispatcher, DUMMY_TYPE_1, dummy_queue1);
65 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
66 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
67
68 // Send data to one of them
69 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
70
71 // Did we get it?
72 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue0));
73 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
74 EXPECT_STREQ(dummy_data_0, (char*)fixed_queue_try_dequeue(dummy_queue0));
75 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
76
77 fixed_queue_free(dummy_queue0, NULL);
78 fixed_queue_free(dummy_queue1, NULL);
79 data_dispatcher_free(dispatcher);
80 }
81
TEST_F(DataDispatcherTest,test_dispatch_single_to_default)82 TEST_F(DataDispatcherTest, test_dispatch_single_to_default) {
83 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
84
85 // Register two queues, a default and a typed one
86 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
87 fixed_queue_t* default_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
88 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
89 data_dispatcher_register_default(dispatcher, default_queue);
90 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
91 EXPECT_TRUE(fixed_queue_is_empty(default_queue));
92
93 // Send data to nowhere
94 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_1, dummy_data_1));
95
96 // Did we get it?
97 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
98 EXPECT_FALSE(fixed_queue_is_empty(default_queue));
99 EXPECT_STREQ(dummy_data_1, (char*)fixed_queue_try_dequeue(default_queue));
100 EXPECT_TRUE(fixed_queue_is_empty(default_queue));
101
102 fixed_queue_free(dummy_queue, NULL);
103 fixed_queue_free(default_queue, NULL);
104 data_dispatcher_free(dispatcher);
105 }
106
TEST_F(DataDispatcherTest,test_dispatch_multiple_to_single)107 TEST_F(DataDispatcherTest, test_dispatch_multiple_to_single) {
108 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
109
110 // Register a queue
111 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
112 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
113 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
114
115 // Send data to the queue
116 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
117 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_1));
118
119 // Did we get it?
120 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
121 EXPECT_STREQ(dummy_data_0, (char*)fixed_queue_try_dequeue(dummy_queue));
122 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
123 EXPECT_STREQ(dummy_data_1, (char*)fixed_queue_try_dequeue(dummy_queue));
124 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
125
126 fixed_queue_free(dummy_queue, NULL);
127 data_dispatcher_free(dispatcher);
128 }
129
TEST_F(DataDispatcherTest,test_dispatch_multiple_to_multiple)130 TEST_F(DataDispatcherTest, test_dispatch_multiple_to_multiple) {
131 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
132
133 // Register two queues
134 fixed_queue_t* dummy_queue0 = fixed_queue_new(DUMMY_QUEUE_SIZE);
135 fixed_queue_t* dummy_queue1 = fixed_queue_new(DUMMY_QUEUE_SIZE);
136 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue0);
137 data_dispatcher_register(dispatcher, DUMMY_TYPE_1, dummy_queue1);
138 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
139 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
140
141 // Send data to both of them
142 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
143 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_1, dummy_data_1));
144
145 // Did we get it?
146 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue0));
147 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue1));
148 EXPECT_STREQ(dummy_data_0, (char*)fixed_queue_try_dequeue(dummy_queue0));
149 EXPECT_STREQ(dummy_data_1, (char*)fixed_queue_try_dequeue(dummy_queue1));
150 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue0));
151 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue1));
152
153 fixed_queue_free(dummy_queue0, NULL);
154 fixed_queue_free(dummy_queue1, NULL);
155 data_dispatcher_free(dispatcher);
156 }
157
TEST_F(DataDispatcherTest,test_dispatch_single_to_single_reregistered)158 TEST_F(DataDispatcherTest, test_dispatch_single_to_single_reregistered) {
159 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
160
161 // Register a queue, then reregister
162 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
163 fixed_queue_t* dummy_queue_reregistered = fixed_queue_new(DUMMY_QUEUE_SIZE);
164 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
165 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue_reregistered);
166 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
167 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue_reregistered));
168
169 // Send data to the queue
170 EXPECT_TRUE(data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
171
172 // Did we get it?
173 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
174 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue_reregistered));
175 EXPECT_STREQ(dummy_data_0,
176 (char*)fixed_queue_try_dequeue(dummy_queue_reregistered));
177 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue_reregistered));
178
179 fixed_queue_free(dummy_queue, NULL);
180 fixed_queue_free(dummy_queue_reregistered, NULL);
181 data_dispatcher_free(dispatcher);
182 }
183
TEST_F(DataDispatcherTest,test_dispatch_single_to_reregistered_null)184 TEST_F(DataDispatcherTest, test_dispatch_single_to_reregistered_null) {
185 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
186
187 // Register a queue
188 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
189 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, dummy_queue);
190 data_dispatcher_register(dispatcher, DUMMY_TYPE_0, NULL);
191 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
192
193 EXPECT_FALSE(
194 data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
195 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
196
197 fixed_queue_free(dummy_queue, NULL);
198 data_dispatcher_free(dispatcher);
199 }
200
TEST_F(DataDispatcherTest,test_dispatch_single_to_default_reregistered_null)201 TEST_F(DataDispatcherTest, test_dispatch_single_to_default_reregistered_null) {
202 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
203
204 // Register a queue
205 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
206 data_dispatcher_register_default(dispatcher, dummy_queue);
207 data_dispatcher_register_default(dispatcher, NULL);
208 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
209
210 EXPECT_FALSE(
211 data_dispatcher_dispatch(dispatcher, DUMMY_TYPE_0, dummy_data_0));
212 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
213
214 fixed_queue_free(dummy_queue, NULL);
215 data_dispatcher_free(dispatcher);
216 }
217
TEST_F(DataDispatcherTest,test_dispatch_edge_zero)218 TEST_F(DataDispatcherTest, test_dispatch_edge_zero) {
219 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
220
221 // Register a queue
222 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
223 data_dispatcher_register(dispatcher, TYPE_EDGE_CASE_ZERO, dummy_queue);
224 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
225
226 // Send data to the queue
227 EXPECT_TRUE(
228 data_dispatcher_dispatch(dispatcher, TYPE_EDGE_CASE_ZERO, dummy_data_0));
229
230 // Did we get it?
231 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
232 EXPECT_STREQ(dummy_data_0, (char*)fixed_queue_try_dequeue(dummy_queue));
233 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
234
235 fixed_queue_free(dummy_queue, NULL);
236 data_dispatcher_free(dispatcher);
237 }
238
TEST_F(DataDispatcherTest,test_dispatch_edge_max)239 TEST_F(DataDispatcherTest, test_dispatch_edge_max) {
240 data_dispatcher_t* dispatcher = data_dispatcher_new("test_dispatcher");
241
242 // Register a queue
243 fixed_queue_t* dummy_queue = fixed_queue_new(DUMMY_QUEUE_SIZE);
244 data_dispatcher_register(dispatcher, TYPE_EDGE_CASE_MAX, dummy_queue);
245 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
246
247 // Send data to the queue
248 EXPECT_TRUE(
249 data_dispatcher_dispatch(dispatcher, TYPE_EDGE_CASE_MAX, dummy_data_0));
250
251 // Did we get it?
252 EXPECT_FALSE(fixed_queue_is_empty(dummy_queue));
253 EXPECT_STREQ(dummy_data_0, (char*)fixed_queue_try_dequeue(dummy_queue));
254 EXPECT_TRUE(fixed_queue_is_empty(dummy_queue));
255
256 fixed_queue_free(dummy_queue, NULL);
257 data_dispatcher_free(dispatcher);
258 }
259