libmemif: added tests
[vpp.git] / extras / libmemif / test / suite_socket / memif_socket_test.c
1 #include <main.c>
2 #include <socket.c>
3
4 #include <unity_fixture.h>
5 #include <libmemif.h>
6 #include <memif_private.h>
7 #include <stdlib.h>
8
9 #define TEST_APP_NAME      "unit_test_app"
10 #define MEMIF_TEST_IF_NAME "unit_test_if"
11 #define MEMIF_TEST_SECRET  "psst"
12 #define TEST_IF_ID         0
13 #define TEST_SOCKET_PATH   "@memif.sock"
14
15 #undef malloc
16 #undef calloc
17 #undef realloc
18 #undef free
19
20 static int err;
21 static memif_socket_handle_t memif_socket;
22 static memif_socket_args_t memif_socket_args;
23 static memif_control_channel_t *cc;
24
25 static void
26 init_socket_args ()
27 {
28   strncpy (memif_socket_args.app_name, MEMIF_DEFAULT_APP_NAME,
29            strlen (MEMIF_DEFAULT_APP_NAME));
30   sprintf (memif_socket_args.path, "%s", MEMIF_DEFAULT_SOCKET_PATH);
31 }
32
33 TEST_GROUP (MemifSocket);
34
35 TEST_SETUP (MemifSocket)
36 {
37   memif_socket = NULL;
38   static int err = 0;
39 }
40
41 TEST_TEAR_DOWN (MemifSocket) {}
42
43 TEST (MemifSocket, CreateSocket)
44 {
45
46   memif_socket_args_t memif_socket_args = {
47     .app_name = TEST_APP_NAME,
48     .path = TEST_SOCKET_PATH,
49   };
50   err = memif_create_socket (&memif_socket, &memif_socket_args, NULL);
51
52   TEST_ASSERT_EQUAL_INT (0, err);
53   TEST_ASSERT_NOT_NULL (memif_socket);
54
55   memif_socket_t *ms = (memif_socket_t *) memif_socket;
56
57   TEST_ASSERT_EQUAL_STRING (ms->args.app_name, TEST_APP_NAME);
58   TEST_ASSERT_EQUAL_STRING (ms->args.path, TEST_SOCKET_PATH);
59   TEST_ASSERT_EQUAL_PTR (ms->args.on_control_fd_update,
60                          memif_control_fd_update);
61   TEST_ASSERT_EQUAL_PTR (ms->args.alloc, malloc);
62   TEST_ASSERT_EQUAL_PTR (ms->args.realloc, realloc);
63   TEST_ASSERT_EQUAL_PTR (ms->args.free, free);
64
65   TEST_ASSERT_NOT_EQUAL_INT (ms->epfd, -1);
66   TEST_ASSERT_NOT_EQUAL_INT (ms->poll_cancel_fd, -1);
67
68   memif_delete_socket (&memif_socket);
69 }
70
71 TEST (MemifSocket, DeleteSocket)
72 {
73
74   memif_socket_args_t memif_socket_args = {
75     .app_name = TEST_APP_NAME,
76     .path = TEST_SOCKET_PATH,
77   };
78   memif_create_socket (&memif_socket, &memif_socket_args, NULL);
79
80   memif_socket_t *ms = (memif_socket_t *) memif_socket;
81   err = memif_delete_socket (&memif_socket);
82   TEST_ASSERT_EQUAL_INT (MEMIF_ERR_SUCCESS, err);
83   TEST_ASSERT_NULL (memif_socket);
84 }
85
86 TEST_GROUP (MemifControlChannel);
87
88 TEST_SETUP (MemifControlChannel)
89 {
90   memif_socket = NULL;
91   static int err = 0;
92   init_socket_args ();
93   memif_create_socket (&memif_socket, &memif_socket_args, NULL);
94   cc = (memif_control_channel_t *) malloc (sizeof (memif_control_channel_t));
95 }
96
97 TEST_TEAR_DOWN (MemifControlChannel) { free (cc); }
98
99 TEST (MemifControlChannel, EnqAck)
100 {
101   memif_connection_t conn;
102   memif_msg_queue_elt_t *e;
103   cc->fd = 5;
104   cc->conn = NULL;
105   cc->sock = memif_socket;
106
107   TAILQ_INIT (&cc->msg_queue);
108   memif_msg_enq_ack (cc);
109
110   e = TAILQ_FIRST (&cc->msg_queue);
111
112   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_ACK, e->msg.type);
113   TEST_ASSERT_EQUAL_INT (-1, e->fd);
114 }
115
116 TEST (MemifControlChannel, EnqHello)
117 {
118   memif_connection_t conn;
119   memif_msg_queue_elt_t *e;
120   cc->fd = 5;
121   cc->conn = NULL;
122   cc->sock = memif_socket;
123   TAILQ_INIT (&cc->msg_queue);
124
125   memif_msg_enq_hello (cc);
126
127   e = TAILQ_FIRST (&cc->msg_queue);
128
129   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_HELLO, e->msg.type);
130   TEST_ASSERT_EQUAL_INT (-1, e->fd);
131   memif_msg_hello_t h = e->msg.hello;
132   TEST_ASSERT_EQUAL_INT (MEMIF_MAX_LOG2_RING_SIZE, h.max_log2_ring_size);
133   TEST_ASSERT_EQUAL_INT (MEMIF_VERSION, h.min_version);
134   TEST_ASSERT_EQUAL_INT (MEMIF_VERSION, h.max_version);
135   TEST_ASSERT_EQUAL_INT (MEMIF_MAX_S2M_RING, h.max_s2m_ring);
136   TEST_ASSERT_EQUAL_INT (MEMIF_MAX_M2S_RING, h.max_m2s_ring);
137   TEST_ASSERT_EQUAL_INT (MEMIF_MAX_REGION, h.max_region);
138 }
139
140 TEST (MemifControlChannel, EnqInit)
141 {
142   memif_msg_queue_elt_t *e;
143   memif_connection_t conn;
144   cc->fd = 5;
145   cc->conn = &conn;
146   cc->sock = memif_socket;
147   TAILQ_INIT (&cc->msg_queue);
148
149   conn.args.interface_id = 11;
150   conn.args.mode = 1;
151   strlcpy ((char *) conn.args.secret, MEMIF_TEST_SECRET,
152            sizeof (MEMIF_TEST_SECRET));
153
154   memif_socket_t *ms = (memif_socket_t *) memif_socket;
155
156   memif_msg_enq_init (cc);
157
158   e = TAILQ_FIRST (&cc->msg_queue);
159
160   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_INIT, e->msg.type);
161   TEST_ASSERT_EQUAL_INT (-1, e->fd);
162   memif_msg_init_t h = e->msg.init;
163
164   TEST_ASSERT_EQUAL_INT (11, h.id);
165   TEST_ASSERT_EQUAL_INT (1, h.mode);
166   TEST_ASSERT_EQUAL_STRING (MEMIF_DEFAULT_APP_NAME, h.name);
167   TEST_ASSERT_EQUAL_STRING (MEMIF_TEST_SECRET, h.secret);
168   TEST_ASSERT_EQUAL_INT (MEMIF_VERSION, h.version);
169 }
170
171 TEST (MemifControlChannel, EnqAddRegion)
172 {
173   memif_msg_queue_elt_t *e;
174   memif_connection_t conn;
175   memset (cc, 0, sizeof (memif_msg_queue_elt_t));
176   memset (&conn, 0, sizeof (memif_connection_t));
177
178   cc->fd = 5;
179   cc->conn = &conn;
180   cc->sock = memif_socket;
181   TAILQ_INIT (&cc->msg_queue);
182
183   conn.args.interface_id = 11;
184   conn.args.mode = 1;
185   conn.args.socket = memif_socket;
186   strlcpy ((char *) conn.args.secret, MEMIF_TEST_SECRET,
187            sizeof (MEMIF_TEST_SECRET));
188
189   memif_socket_t *ms = (memif_socket_t *) memif_socket;
190
191   conn.run_args.num_s2m_rings = 1;
192   conn.run_args.num_m2s_rings = 1;
193   conn.run_args.log2_ring_size = MEMIF_DEFAULT_LOG2_RING_SIZE;
194   conn.run_args.buffer_size = MEMIF_DEFAULT_BUFFER_SIZE;
195
196   memif_add_region (&conn, 1);
197
198   memif_msg_enq_add_region (cc, 0);
199
200   e = TAILQ_FIRST (&cc->msg_queue);
201   memif_msg_add_region_t h = e->msg.add_region;
202
203   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_ADD_REGION, e->msg.type);
204   TEST_ASSERT_EQUAL_INT (conn.regions[0].fd, e->fd);
205
206   TEST_ASSERT_EQUAL_INT (0, h.index);
207   TEST_ASSERT_EQUAL_INT (conn.regions[0].region_size, h.size);
208
209   close (conn.regions[0].fd);
210 }
211
212 TEST (MemifControlChannel, EnqAddRing)
213 {
214   memif_msg_queue_elt_t *e;
215   memif_connection_t conn;
216   memset (cc, 0, sizeof (memif_msg_queue_elt_t));
217   memset (&conn, 0, sizeof (memif_connection_t));
218
219   cc->fd = 5;
220   cc->conn = &conn;
221   cc->sock = memif_socket;
222   TAILQ_INIT (&cc->msg_queue);
223
224   conn.args.interface_id = 11;
225   conn.args.mode = 1;
226   conn.args.socket = memif_socket;
227   strlcpy ((char *) conn.args.secret, MEMIF_TEST_SECRET,
228            sizeof (MEMIF_TEST_SECRET));
229
230   memif_socket_t *ms = (memif_socket_t *) memif_socket;
231
232   conn.run_args.num_s2m_rings = 1;
233   conn.run_args.num_m2s_rings = 1;
234   conn.run_args.log2_ring_size = MEMIF_DEFAULT_LOG2_RING_SIZE;
235   conn.run_args.buffer_size = MEMIF_DEFAULT_BUFFER_SIZE;
236
237   memif_add_region (&conn, 1);
238   memif_init_queues (&conn);
239   memif_msg_enq_add_ring (cc, 0, MEMIF_RING_M2S);
240
241   e = TAILQ_FIRST (&cc->msg_queue);
242   memif_msg_add_ring_t h = e->msg.add_ring;
243
244   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_ADD_RING, e->msg.type);
245   TEST_ASSERT_EQUAL_INT (conn.rx_queues[0].int_fd, e->fd);
246
247   TEST_ASSERT_EQUAL_INT (0, h.flags);
248   TEST_ASSERT_EQUAL_INT (0, h.index);
249   TEST_ASSERT_EQUAL_INT (conn.rx_queues[0].region, h.region);
250   TEST_ASSERT_EQUAL_INT (conn.rx_queues[0].offset, h.offset);
251   TEST_ASSERT_EQUAL_INT (conn.rx_queues[0].log2_ring_size, h.log2_ring_size);
252   TEST_ASSERT_EQUAL_INT (0, h.private_hdr_size);
253
254   close (conn.regions[0].fd);
255 }
256 TEST (MemifControlChannel, EnqConnect)
257 {
258   memif_msg_queue_elt_t *e;
259   memif_connection_t conn;
260   memset (cc, 0, sizeof (memif_msg_queue_elt_t));
261   memset (&conn, 0, sizeof (memif_connection_t));
262
263   cc->fd = 5;
264   cc->conn = &conn;
265   cc->sock = memif_socket;
266   TAILQ_INIT (&cc->msg_queue);
267
268   conn.args.interface_id = 11;
269   conn.args.mode = 1;
270   conn.args.socket = memif_socket;
271   strlcpy ((char *) conn.args.secret, MEMIF_TEST_SECRET,
272            sizeof (MEMIF_TEST_SECRET));
273   strlcpy ((char *) conn.args.interface_name, MEMIF_TEST_IF_NAME,
274            sizeof (MEMIF_TEST_IF_NAME));
275
276   memif_socket_t *ms = (memif_socket_t *) memif_socket;
277
278   conn.run_args.num_s2m_rings = 1;
279   conn.run_args.num_m2s_rings = 1;
280   conn.run_args.log2_ring_size = MEMIF_DEFAULT_LOG2_RING_SIZE;
281   conn.run_args.buffer_size = MEMIF_DEFAULT_BUFFER_SIZE;
282
283   memif_add_region (&conn, 1);
284   memif_init_queues (&conn);
285   memif_msg_enq_connect (cc);
286
287   e = TAILQ_FIRST (&cc->msg_queue);
288   memif_msg_connect_t h = e->msg.connect;
289
290   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_CONNECT, e->msg.type);
291   TEST_ASSERT_EQUAL_INT (-1, e->fd);
292
293   TEST_ASSERT_EQUAL_STRING (MEMIF_TEST_IF_NAME, h.if_name);
294
295   close (conn.regions[0].fd);
296 }
297
298 TEST (MemifControlChannel, EnqConnected)
299 {
300   memif_msg_queue_elt_t *e;
301   memif_connection_t conn;
302   memset (cc, 0, sizeof (memif_msg_queue_elt_t));
303   memset (&conn, 0, sizeof (memif_connection_t));
304
305   cc->fd = 5;
306   cc->conn = &conn;
307   cc->sock = memif_socket;
308   TAILQ_INIT (&cc->msg_queue);
309
310   conn.args.interface_id = 11;
311   conn.args.mode = 1;
312   conn.args.socket = memif_socket;
313   strlcpy ((char *) conn.args.secret, MEMIF_TEST_SECRET,
314            sizeof (MEMIF_TEST_SECRET));
315   strlcpy ((char *) conn.args.interface_name, MEMIF_TEST_IF_NAME,
316            sizeof (MEMIF_TEST_IF_NAME));
317
318   memif_socket_t *ms = (memif_socket_t *) memif_socket;
319
320   conn.run_args.num_s2m_rings = 1;
321   conn.run_args.num_m2s_rings = 1;
322   conn.run_args.log2_ring_size = MEMIF_DEFAULT_LOG2_RING_SIZE;
323   conn.run_args.buffer_size = MEMIF_DEFAULT_BUFFER_SIZE;
324
325   memif_add_region (&conn, 1);
326   memif_init_queues (&conn);
327   memif_msg_enq_connect (cc);
328
329   e = TAILQ_FIRST (&cc->msg_queue);
330   memif_msg_connected_t h = e->msg.connected;
331
332   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_CONNECT, e->msg.type);
333   TEST_ASSERT_EQUAL_INT (-1, e->fd);
334
335   TEST_ASSERT_EQUAL_STRING (MEMIF_TEST_IF_NAME, h.if_name);
336
337   close (conn.regions[0].fd);
338 }
339
340 TEST (MemifControlChannel, EnqDisconnect)
341 {
342   memif_msg_queue_elt_t *e;
343   memif_connection_t conn;
344   memset (cc, 0, sizeof (memif_msg_queue_elt_t));
345   memset (&conn, 0, sizeof (memif_connection_t));
346
347   cc->fd = 5;
348   cc->conn = &conn;
349   cc->sock = memif_socket;
350   TAILQ_INIT (&cc->msg_queue);
351
352   conn.args.interface_id = 11;
353   conn.args.mode = 1;
354   conn.args.socket = memif_socket;
355   strlcpy ((char *) conn.args.secret, MEMIF_TEST_SECRET,
356            sizeof (MEMIF_TEST_SECRET));
357   strlcpy ((char *) conn.args.interface_name, MEMIF_TEST_IF_NAME,
358            sizeof (MEMIF_TEST_IF_NAME));
359
360   memif_socket_t *ms = (memif_socket_t *) memif_socket;
361   memif_msg_enq_disconnect (cc, "TEST", 5);
362
363   e = TAILQ_FIRST (&cc->msg_queue);
364   memif_msg_disconnect_t h = e->msg.disconnect;
365
366   TEST_ASSERT_EQUAL_UINT16 (MEMIF_MSG_TYPE_DISCONNECT, e->msg.type);
367   TEST_ASSERT_EQUAL_INT (-1, e->fd);
368
369   TEST_ASSERT_EQUAL_INT (5, h.code);
370   TEST_ASSERT_EQUAL_STRING ("TEST", h.string);
371 }
372
373 TEST_GROUP_RUNNER (MemifSocket){ RUN_TEST_CASE (MemifSocket, CreateSocket)
374                                    RUN_TEST_CASE (MemifSocket, DeleteSocket)
375
376 }
377
378 TEST_GROUP_RUNNER (MemifControlChannel)
379 {
380   RUN_TEST_CASE (MemifControlChannel, EnqAck)
381   RUN_TEST_CASE (MemifControlChannel, EnqHello)
382   RUN_TEST_CASE (MemifControlChannel, EnqInit)
383   RUN_TEST_CASE (MemifControlChannel, EnqAddRegion)
384   RUN_TEST_CASE (MemifControlChannel, EnqAddRing)
385   RUN_TEST_CASE (MemifControlChannel, EnqConnect)
386   RUN_TEST_CASE (MemifControlChannel, EnqConnected)
387   RUN_TEST_CASE (MemifControlChannel, EnqDisconnect)
388 }
389
390 static void
391 RunAllTests (void)
392 {
393   RUN_TEST_GROUP (MemifSocket);
394   RUN_TEST_GROUP (MemifControlChannel);
395 }
396
397 int
398 main (int argc, const char *argv[])
399 {
400   return UnityMain (argc, argv, RunAllTests);
401 }