• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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