2 *------------------------------------------------------------------
3 * Copyright (c) 2017 Cisco and/or its affiliates.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *------------------------------------------------------------------
18 #include <socket_test.h>
20 #include <memif_private.h>
24 get_queue_len (memif_msg_queue_elt_t * q)
27 memif_msg_queue_elt_t *c = q;
37 queue_free (memif_msg_queue_elt_t ** e)
41 queue_free (&(*e)->next);
47 START_TEST (test_msg_queue)
49 memif_connection_t conn;
50 conn.msg_queue = NULL;
55 for (i = 0; i < len; i++)
58 memif_msg_enq_ack (&conn);
60 memif_msg_enq_init (&conn);
63 ck_assert_int_eq (len, get_queue_len (conn.msg_queue));
67 for (i = 0; i < pop; i++)
71 ck_assert_uint_eq (conn.msg_queue->msg.type, MEMIF_MSG_TYPE_ACK);
75 ck_assert_uint_eq (conn.msg_queue->msg.type, MEMIF_MSG_TYPE_INIT);
77 conn.flags |= MEMIF_CONNECTION_FLAG_WRITE;
78 /* function will return -1 because no socket is created */
79 memif_conn_fd_write_ready (&conn);
82 ck_assert_int_eq ((len - pop), get_queue_len (conn.msg_queue));
84 queue_free (&conn.msg_queue);
88 START_TEST (test_enq_ack)
91 memif_connection_t conn;
92 conn.msg_queue = NULL;
94 if ((err = memif_msg_enq_ack (&conn)) != MEMIF_ERR_SUCCESS)
95 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
96 memif_msg_queue_elt_t *e = conn.msg_queue;
98 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_ACK);
99 ck_assert_int_eq (e->fd, -1);
100 queue_free (&conn.msg_queue);
104 START_TEST (test_enq_init)
107 memif_connection_t conn;
108 conn.msg_queue = NULL;
110 conn.args.interface_id = 69;
113 strncpy ((char *) conn.args.instance_name, TEST_APP_NAME,
114 strlen (TEST_APP_NAME));
115 strncpy ((char *) conn.args.secret, TEST_SECRET, strlen (TEST_SECRET));
117 if ((err = memif_msg_enq_init (&conn)) != MEMIF_ERR_SUCCESS)
118 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
120 memif_msg_queue_elt_t *e = conn.msg_queue;
122 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_INIT);
123 ck_assert_int_eq (e->fd, -1);
125 memif_msg_init_t *i = &e->msg.init;
127 ck_assert_uint_eq (i->version, MEMIF_VERSION);
128 ck_assert_uint_eq (i->id, conn.args.interface_id);
129 ck_assert_uint_eq (i->mode, conn.args.mode);
130 ck_assert_str_eq (i->name, conn.args.instance_name);
131 ck_assert_str_eq (i->secret, conn.args.secret);
132 queue_free (&conn.msg_queue);
136 START_TEST (test_enq_add_region)
139 memif_connection_t conn;
140 conn.msg_queue = NULL;
141 conn.regions = (memif_region_t *) malloc (sizeof (memif_region_t));
142 memif_region_t *mr = conn.regions;
144 mr->region_size = 2048;
145 uint8_t region_index = 0;
148 memif_msg_enq_add_region (&conn, region_index)) != MEMIF_ERR_SUCCESS)
149 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
151 memif_msg_queue_elt_t *e = conn.msg_queue;
153 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_ADD_REGION);
154 ck_assert_int_eq (e->fd, mr->fd);
156 memif_msg_add_region_t *ar = &e->msg.add_region;
158 ck_assert_uint_eq (ar->index, region_index);
159 ck_assert_uint_eq (ar->size, mr->region_size);
164 queue_free (&conn.msg_queue);
168 START_TEST (test_enq_add_ring)
171 memif_connection_t conn;
172 conn.msg_queue = NULL;
173 conn.rx_queues = (memif_queue_t *) malloc (sizeof (memif_queue_t));
174 conn.tx_queues = (memif_queue_t *) malloc (sizeof (memif_queue_t));
176 memif_queue_t *mq = conn.tx_queues;
177 uint8_t dir = MEMIF_RING_S2M;
180 mq->log2_ring_size = 10;
182 if ((err = memif_msg_enq_add_ring (&conn, 0, dir)) != MEMIF_ERR_SUCCESS)
183 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
185 memif_msg_queue_elt_t *e = conn.msg_queue;
187 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_ADD_RING);
188 ck_assert_int_eq (e->fd, mq->int_fd);
190 memif_msg_add_ring_t *ar = &e->msg.add_ring;
192 ck_assert_uint_eq (ar->index, 0);
193 ck_assert_uint_eq (ar->offset, mq->offset);
194 ck_assert_uint_eq (ar->log2_ring_size, mq->log2_ring_size);
195 ck_assert (ar->flags & MEMIF_MSG_ADD_RING_FLAG_S2M);
197 dir = MEMIF_RING_M2S;
198 if ((err = memif_msg_enq_add_ring (&conn, 0, dir)) != MEMIF_ERR_SUCCESS)
199 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
200 queue_free (&conn.msg_queue);
204 START_TEST (test_enq_connect)
207 memif_connection_t conn;
208 conn.msg_queue = NULL;
209 memset (conn.args.interface_name, 0, sizeof (conn.args.interface_name));
210 strncpy ((char *) conn.args.interface_name, TEST_IF_NAME,
211 strlen (TEST_IF_NAME));
213 if ((err = memif_msg_enq_connect (&conn)) != MEMIF_ERR_SUCCESS)
214 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
216 memif_msg_queue_elt_t *e = conn.msg_queue;
218 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_CONNECT);
219 ck_assert_int_eq (e->fd, -1);
220 ck_assert_str_eq (e->msg.connect.if_name, TEST_IF_NAME);
221 queue_free (&conn.msg_queue);
225 START_TEST (test_enq_connected)
228 memif_connection_t conn;
229 conn.msg_queue = NULL;
230 memset (conn.args.interface_name, 0, sizeof (conn.args.interface_name));
231 strncpy ((char *) conn.args.interface_name, TEST_IF_NAME,
232 strlen (TEST_IF_NAME));
234 if ((err = memif_msg_enq_connected (&conn)) != MEMIF_ERR_SUCCESS)
235 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
237 memif_msg_queue_elt_t *e = conn.msg_queue;
239 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_CONNECTED);
240 ck_assert_int_eq (e->fd, -1);
241 ck_assert_str_eq (e->msg.connect.if_name, TEST_IF_NAME);
242 queue_free (&conn.msg_queue);
246 START_TEST (test_send)
249 int fd = -1, afd = 5;
251 memset (&msg, 0, sizeof (msg));
253 if ((err = memif_msg_send (fd, &msg, afd)) != MEMIF_ERR_SUCCESS)
254 ck_assert_msg (err == MEMIF_ERR_BAD_FD,
255 "err code: %u, err msg: %s", err, memif_strerror (err));
259 START_TEST (test_send_hello)
262 memif_connection_t conn;
264 memset (conn.args.instance_name, 0, sizeof (conn.args.instance_name));
265 strncpy ((char *) conn.args.instance_name, TEST_APP_NAME,
266 strlen (TEST_APP_NAME));
269 memif_init (control_fd_update, TEST_APP_NAME)) != MEMIF_ERR_SUCCESS)
270 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
272 if ((err = memif_msg_send_hello (conn.fd)) != MEMIF_ERR_SUCCESS)
273 ck_assert_msg (err == MEMIF_ERR_BAD_FD,
274 "err code: %u, err msg: %s", err, memif_strerror (err));
278 START_TEST (test_send_disconnect)
281 memif_connection_t conn;
284 /* only possible fail if memif_msg_send fails... */
285 /* obsolete without socket */
287 memif_msg_send_disconnect (conn.fd, "unit_test_dc",
288 0)) != MEMIF_ERR_SUCCESS)
289 ck_assert_msg (err == MEMIF_ERR_BAD_FD, "err code: %u, err msg: %s", err,
290 memif_strerror (err));
294 START_TEST (test_recv_hello)
297 memif_connection_t conn;
300 memif_msg_hello_t *h = &msg.hello;
302 msg.type = MEMIF_MSG_TYPE_HELLO;
304 h->min_version = MEMIF_VERSION;
305 h->max_version = MEMIF_VERSION;
308 h->max_log2_ring_size = 14;
309 strncpy ((char *) h->name, TEST_IF_NAME, strlen (TEST_IF_NAME));
310 memset (conn.remote_name, 0, sizeof (conn.remote_name));
312 conn.args.num_s2m_rings = 4;
313 conn.args.num_m2s_rings = 6;
314 conn.args.log2_ring_size = 10;
316 if ((err = memif_msg_receive_hello (&conn, &msg)) != MEMIF_ERR_SUCCESS)
317 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
319 ck_assert_uint_eq (conn.run_args.num_s2m_rings, 2);
320 ck_assert_uint_eq (conn.run_args.num_m2s_rings, 2);
321 ck_assert_uint_eq (conn.run_args.log2_ring_size, 10);
322 ck_assert_str_eq (conn.remote_name, TEST_IF_NAME);
325 if ((err = memif_msg_receive_hello (&conn, &msg)) != MEMIF_ERR_SUCCESS)
326 ck_assert_msg (err == MEMIF_ERR_PROTO,
327 "err code: %u, err msg: %s", err, memif_strerror (err));
331 START_TEST (test_recv_init)
334 memif_connection_t conn;
336 conn.args.interface_id = 69;
337 conn.args.is_master = 1;
340 memset (conn.args.secret, '\0', 24);
341 strncpy ((char *) conn.args.secret, TEST_SECRET, strlen (TEST_SECRET));
345 memif_msg_init_t *i = &msg.init;
347 msg.type = MEMIF_MSG_TYPE_INIT;
349 i->version = MEMIF_VERSION;
352 memset (i->name, '\0', 32);
353 memset (i->secret, '\0', 24);
354 strncpy ((char *) i->name, TEST_IF_NAME, strlen (TEST_IF_NAME));
355 strncpy ((char *) i->secret, TEST_SECRET, strlen (TEST_SECRET));
358 ms.interface_list_len = 1;
359 ms.interface_list = malloc (sizeof (memif_list_elt_t));
360 memif_list_elt_t elt;
362 elt.data_struct = &conn;
363 add_list_elt (&elt, &ms.interface_list, &ms.interface_list_len);
366 memif_init (control_fd_update, TEST_APP_NAME)) != MEMIF_ERR_SUCCESS)
367 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
369 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
370 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
373 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
374 ck_assert_msg (err == MEMIF_ERR_PROTO,
375 "err code: %u, err msg: %s", err, memif_strerror (err));
376 i->version = MEMIF_VERSION;
379 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
380 ck_assert_msg (err == MEMIF_ERR_ID,
381 "err code: %u, err msg: %s", err, memif_strerror (err));
385 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
386 ck_assert_msg (err == MEMIF_ERR_MODE,
387 "err code: %u, err msg: %s", err, memif_strerror (err));
391 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
392 ck_assert_msg (err == MEMIF_ERR_SECRET,
393 "err code: %u, err msg: %s", err, memif_strerror (err));
394 strncpy ((char *) i->secret, TEST_SECRET, strlen (TEST_SECRET));
396 conn.args.is_master = 0;
397 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
398 ck_assert_msg (err == MEMIF_ERR_ACCSLAVE,
399 "err code: %u, err msg: %s", err, memif_strerror (err));
400 conn.args.is_master = 1;
403 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
404 ck_assert_msg ((err == MEMIF_ERR_ALRCONN) || (err == MEMIF_ERR_BAD_FD),
405 "err code: %u, err msg: %s", err, memif_strerror (err));
409 START_TEST (test_recv_add_region)
412 memif_connection_t conn;
415 msg.type = MEMIF_MSG_TYPE_ADD_REGION;
416 msg.add_region.size = 2048;
417 msg.add_region.index = 0;
422 memif_msg_receive_add_region (&conn, &msg, fd)) != MEMIF_ERR_SUCCESS)
423 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
425 memif_region_t *mr = conn.regions;
427 ck_assert_uint_eq (mr->fd, fd);
428 ck_assert_uint_eq (mr->region_size, 2048);
429 ck_assert_ptr_eq (mr->shm, NULL);
433 START_TEST (test_recv_add_ring)
436 memif_connection_t conn;
439 conn.args.num_s2m_rings = 2;
440 conn.args.num_m2s_rings = 2;
441 conn.rx_queues = NULL;
442 conn.tx_queues = NULL;
444 msg.type = MEMIF_MSG_TYPE_ADD_RING;
445 memif_msg_add_ring_t *ar = &msg.add_ring;
447 ar->log2_ring_size = 10;
451 ar->flags |= MEMIF_MSG_ADD_RING_FLAG_S2M;
455 memif_msg_receive_add_ring (&conn, &msg, fd)) != MEMIF_ERR_SUCCESS)
456 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
460 ar->flags &= ~MEMIF_MSG_ADD_RING_FLAG_S2M;
463 memif_msg_receive_add_ring (&conn, &msg, fd)) != MEMIF_ERR_SUCCESS)
464 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
469 START_TEST (test_recv_connect)
472 memif_conn_handle_t c = NULL;
473 memif_conn_args_t args;
474 memset (&args, 0, sizeof (args));
476 args.interface_id = 0;
481 memif_init (control_fd_update, TEST_APP_NAME)) != MEMIF_ERR_SUCCESS)
482 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
484 if ((err = memif_create (&c, &args, on_connect,
485 on_disconnect, on_interrupt,
486 NULL)) != MEMIF_ERR_SUCCESS)
487 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
489 memif_connection_t *conn = (memif_connection_t *) c;
491 conn->run_args.num_s2m_rings = 1;
492 conn->run_args.num_m2s_rings = 1;
493 conn->run_args.log2_ring_size = 10;
494 conn->run_args.buffer_size = 2048;
496 if ((err = memif_init_regions_and_queues (conn)) != MEMIF_ERR_SUCCESS)
497 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
500 memset (&msg, 0, sizeof (msg));
501 msg.type = MEMIF_MSG_TYPE_CONNECT;
503 memset (msg.connect.if_name, 0, sizeof (msg.connect.if_name));
504 strncpy ((char *) msg.connect.if_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
506 if ((err = memif_msg_receive_connect (conn, &msg)) != MEMIF_ERR_SUCCESS)
507 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
509 ck_assert_str_eq (conn->remote_if_name, TEST_IF_NAME);
513 START_TEST (test_recv_connected)
516 memif_conn_handle_t c = NULL;
517 memif_conn_args_t args;
518 memset (&args, 0, sizeof (args));
520 args.interface_id = 0;
525 memif_init (control_fd_update, TEST_APP_NAME)) != MEMIF_ERR_SUCCESS)
526 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
528 if ((err = memif_create (&c, &args, on_connect,
529 on_disconnect, on_interrupt,
530 NULL)) != MEMIF_ERR_SUCCESS)
531 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
533 memif_connection_t *conn = (memif_connection_t *) c;
535 conn->run_args.num_s2m_rings = 1;
536 conn->run_args.num_m2s_rings = 1;
537 conn->run_args.log2_ring_size = 10;
538 conn->run_args.buffer_size = 2048;
540 if ((err = memif_init_regions_and_queues (conn)) != MEMIF_ERR_SUCCESS)
541 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
544 memset (&msg, 0, sizeof (msg));
545 msg.type = MEMIF_MSG_TYPE_CONNECT;
547 memset (msg.connect.if_name, 0, sizeof (msg.connect.if_name));
548 strncpy ((char *) msg.connect.if_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
550 if ((err = memif_msg_receive_connected (conn, &msg)) != MEMIF_ERR_SUCCESS)
551 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
553 ck_assert_str_eq (conn->remote_if_name, TEST_IF_NAME);
557 START_TEST (test_recv_disconnect)
560 memif_connection_t conn;
562 msg.type = MEMIF_MSG_TYPE_DISCONNECT;
563 memset (msg.disconnect.string, 0, sizeof (msg.disconnect.string));
564 strncpy ((char *) msg.disconnect.string, "unit_test_dc", 12);
566 if ((err = memif_msg_receive_disconnect (&conn, &msg)) != MEMIF_ERR_SUCCESS)
567 ck_assert_msg (err == MEMIF_ERR_DISCONNECT,
568 "err code: %u, err msg: %s", err, memif_strerror (err));
570 ck_assert_str_eq (conn.remote_disconnect_string, "unit_test_dc");
573 END_TEST Suite * socket_suite ()
581 /* create socket test suite */
582 s = suite_create ("Socket messaging");
584 /* create msg queue test case */
585 tc_msg_queue = tcase_create ("Message queue");
586 /* add tests to test case */
587 tcase_add_test (tc_msg_queue, test_msg_queue);
589 /* create msg enq test case */
590 tc_msg_enq = tcase_create ("Message enqueue");
591 /* add tests to test case */
592 tcase_add_test (tc_msg_enq, test_enq_ack);
593 tcase_add_test (tc_msg_enq, test_enq_init);
594 tcase_add_test (tc_msg_enq, test_enq_add_region);
595 tcase_add_test (tc_msg_enq, test_enq_add_ring);
596 tcase_add_test (tc_msg_enq, test_enq_connect);
597 tcase_add_test (tc_msg_enq, test_enq_connected);
599 /* create msg send test case */
600 tc_msg_send = tcase_create ("Message send");
601 /* add tests to test case */
602 tcase_add_test (tc_msg_send, test_send);
603 tcase_add_test (tc_msg_send, test_send_hello);
604 tcase_add_test (tc_msg_send, test_send_disconnect);
606 /* create msg recv test case */
607 tc_msg_recv = tcase_create ("Message receive");
608 /* add tests to test case */
609 tcase_add_test (tc_msg_recv, test_recv_hello);
610 tcase_add_test (tc_msg_recv, test_recv_init);
611 tcase_add_test (tc_msg_recv, test_recv_add_region);
612 tcase_add_test (tc_msg_recv, test_recv_add_ring);
613 tcase_add_test (tc_msg_recv, test_recv_connect);
614 tcase_add_test (tc_msg_recv, test_recv_connected);
615 tcase_add_test (tc_msg_recv, test_recv_disconnect);
617 /* add test cases to test suite */
618 suite_add_tcase (s, tc_msg_queue);
619 suite_add_tcase (s, tc_msg_enq);
620 suite_add_tcase (s, tc_msg_send);
621 suite_add_tcase (s, tc_msg_recv);
623 /* return socket test suite to test runner */