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)
51 memif_init (control_fd_update, TEST_APP_NAME, NULL,
52 NULL, NULL)) != MEMIF_ERR_SUCCESS)
53 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
55 memif_connection_t conn;
56 conn.msg_queue = NULL;
62 for (i = 0; i < len; i++)
65 memif_msg_enq_ack (&conn);
67 memif_msg_enq_init (&conn);
70 ck_assert_int_eq (len, get_queue_len (conn.msg_queue));
74 for (i = 0; i < pop; i++)
78 ck_assert_uint_eq (conn.msg_queue->msg.type, MEMIF_MSG_TYPE_ACK);
82 ck_assert_uint_eq (conn.msg_queue->msg.type, MEMIF_MSG_TYPE_INIT);
84 conn.flags |= MEMIF_CONNECTION_FLAG_WRITE;
85 /* function will return -1 because no socket is created */
86 memif_conn_fd_write_ready (&conn);
89 ck_assert_int_eq ((len - pop), get_queue_len (conn.msg_queue));
91 queue_free (&conn.msg_queue);
95 START_TEST (test_enq_ack)
99 memif_init (control_fd_update, TEST_APP_NAME, NULL,
100 NULL, NULL)) != MEMIF_ERR_SUCCESS)
101 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
102 memif_connection_t conn;
103 conn.msg_queue = NULL;
105 if ((err = memif_msg_enq_ack (&conn)) != MEMIF_ERR_SUCCESS)
106 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
107 memif_msg_queue_elt_t *e = conn.msg_queue;
109 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_ACK);
110 ck_assert_int_eq (e->fd, -1);
111 queue_free (&conn.msg_queue);
115 START_TEST (test_enq_init)
119 memif_init (control_fd_update, TEST_APP_NAME, NULL,
120 NULL, NULL)) != MEMIF_ERR_SUCCESS)
121 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
122 memif_connection_t conn;
123 conn.msg_queue = NULL;
125 conn.args.interface_id = 69;
128 strncpy ((char *) conn.args.secret, TEST_SECRET, strlen (TEST_SECRET));
130 if ((err = memif_msg_enq_init (&conn)) != MEMIF_ERR_SUCCESS)
131 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
133 memif_msg_queue_elt_t *e = conn.msg_queue;
135 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_INIT);
136 ck_assert_int_eq (e->fd, -1);
138 memif_msg_init_t *i = &e->msg.init;
140 ck_assert_uint_eq (i->version, MEMIF_VERSION);
141 ck_assert_uint_eq (i->id, conn.args.interface_id);
142 ck_assert_uint_eq (i->mode, conn.args.mode);
143 ck_assert_str_eq ((char *)i->secret, (char *)conn.args.secret);
144 queue_free (&conn.msg_queue);
148 START_TEST (test_enq_add_region)
152 memif_init (control_fd_update, TEST_APP_NAME, NULL,
153 NULL, NULL)) != MEMIF_ERR_SUCCESS)
154 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
155 memif_connection_t conn;
156 conn.msg_queue = NULL;
157 conn.regions = (memif_region_t *) malloc (sizeof (memif_region_t));
158 memif_region_t *mr = conn.regions;
160 mr->region_size = 2048;
161 uint8_t region_index = 0;
164 memif_msg_enq_add_region (&conn, region_index)) != MEMIF_ERR_SUCCESS)
165 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
167 memif_msg_queue_elt_t *e = conn.msg_queue;
169 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_ADD_REGION);
170 ck_assert_int_eq (e->fd, mr->fd);
172 memif_msg_add_region_t *ar = &e->msg.add_region;
174 ck_assert_uint_eq (ar->index, region_index);
175 ck_assert_uint_eq (ar->size, mr->region_size);
180 queue_free (&conn.msg_queue);
184 START_TEST (test_enq_add_ring)
188 memif_init (control_fd_update, TEST_APP_NAME, NULL,
189 NULL, NULL)) != MEMIF_ERR_SUCCESS)
190 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
192 memif_connection_t conn;
193 conn.msg_queue = NULL;
194 conn.rx_queues = (memif_queue_t *) malloc (sizeof (memif_queue_t));
195 conn.tx_queues = (memif_queue_t *) malloc (sizeof (memif_queue_t));
197 memif_queue_t *mq = conn.tx_queues;
198 uint8_t dir = MEMIF_RING_S2M;
201 mq->log2_ring_size = 10;
203 if ((err = memif_msg_enq_add_ring (&conn, 0, dir)) != MEMIF_ERR_SUCCESS)
204 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
206 memif_msg_queue_elt_t *e = conn.msg_queue;
208 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_ADD_RING);
209 ck_assert_int_eq (e->fd, mq->int_fd);
211 memif_msg_add_ring_t *ar = &e->msg.add_ring;
213 ck_assert_uint_eq (ar->index, 0);
214 ck_assert_uint_eq (ar->offset, mq->offset);
215 ck_assert_uint_eq (ar->log2_ring_size, mq->log2_ring_size);
216 ck_assert (ar->flags & MEMIF_MSG_ADD_RING_FLAG_S2M);
218 dir = MEMIF_RING_M2S;
219 if ((err = memif_msg_enq_add_ring (&conn, 0, dir)) != MEMIF_ERR_SUCCESS)
220 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
221 queue_free (&conn.msg_queue);
225 START_TEST (test_enq_connect)
229 memif_init (control_fd_update, TEST_APP_NAME, NULL,
230 NULL, NULL)) != MEMIF_ERR_SUCCESS)
231 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
232 memif_connection_t conn;
233 conn.msg_queue = NULL;
234 memset (conn.args.interface_name, 0, sizeof (conn.args.interface_name));
235 strncpy ((char *) conn.args.interface_name, TEST_IF_NAME,
236 strlen (TEST_IF_NAME));
238 if ((err = memif_msg_enq_connect (&conn)) != MEMIF_ERR_SUCCESS)
239 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
241 memif_msg_queue_elt_t *e = conn.msg_queue;
243 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_CONNECT);
244 ck_assert_int_eq (e->fd, -1);
245 ck_assert_str_eq ((char *)e->msg.connect.if_name, TEST_IF_NAME);
246 queue_free (&conn.msg_queue);
250 START_TEST (test_enq_connected)
254 memif_init (control_fd_update, TEST_APP_NAME, NULL,
255 NULL, NULL)) != MEMIF_ERR_SUCCESS)
256 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
257 memif_connection_t conn;
258 conn.msg_queue = NULL;
259 memset (conn.args.interface_name, 0, sizeof (conn.args.interface_name));
260 strncpy ((char *) conn.args.interface_name, TEST_IF_NAME,
261 strlen (TEST_IF_NAME));
263 if ((err = memif_msg_enq_connected (&conn)) != MEMIF_ERR_SUCCESS)
264 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
266 memif_msg_queue_elt_t *e = conn.msg_queue;
268 ck_assert_uint_eq (e->msg.type, MEMIF_MSG_TYPE_CONNECTED);
269 ck_assert_int_eq (e->fd, -1);
270 ck_assert_str_eq ((char *)e->msg.connect.if_name, TEST_IF_NAME);
271 queue_free (&conn.msg_queue);
275 START_TEST (test_send)
278 int fd = -1, afd = 5;
280 memset (&msg, 0, sizeof (msg));
282 if ((err = memif_msg_send (fd, &msg, afd)) != MEMIF_ERR_SUCCESS)
283 ck_assert_msg (err == MEMIF_ERR_BAD_FD,
284 "err code: %u, err msg: %s", err, memif_strerror (err));
288 START_TEST (test_send_hello)
291 memif_connection_t conn;
295 memif_init (control_fd_update, TEST_APP_NAME, NULL,
296 NULL, NULL)) != MEMIF_ERR_SUCCESS)
297 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
299 conn.args.socket = libmemif_main.default_socket;
301 if ((err = memif_msg_send_hello (get_libmemif_main (conn.args.socket), conn.fd)) != MEMIF_ERR_SUCCESS)
302 ck_assert_msg (err == MEMIF_ERR_BAD_FD,
303 "err code: %u, err msg: %s", err, memif_strerror (err));
307 START_TEST (test_send_disconnect)
310 memif_connection_t conn;
313 /* only possible fail if memif_msg_send fails... */
314 /* obsolete without socket */
316 memif_msg_send_disconnect (conn.fd, (uint8_t *)"unit_test_dc",
317 0)) != MEMIF_ERR_SUCCESS)
318 ck_assert_msg (err == MEMIF_ERR_BAD_FD, "err code: %u, err msg: %s", err,
319 memif_strerror (err));
323 START_TEST (test_recv_hello)
326 memif_connection_t conn;
329 memif_msg_hello_t *h = &msg.hello;
331 msg.type = MEMIF_MSG_TYPE_HELLO;
333 h->min_version = MEMIF_VERSION;
334 h->max_version = MEMIF_VERSION;
337 h->max_log2_ring_size = 14;
338 strncpy ((char *) h->name, TEST_IF_NAME, strlen (TEST_IF_NAME));
339 memset (conn.remote_name, 0, sizeof (conn.remote_name));
341 conn.args.num_s2m_rings = 4;
342 conn.args.num_m2s_rings = 6;
343 conn.args.log2_ring_size = 10;
345 if ((err = memif_msg_receive_hello (&conn, &msg)) != MEMIF_ERR_SUCCESS)
346 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
348 ck_assert_uint_eq (conn.run_args.num_s2m_rings, 2);
349 ck_assert_uint_eq (conn.run_args.num_m2s_rings, 2);
350 ck_assert_uint_eq (conn.run_args.log2_ring_size, 10);
351 ck_assert_str_eq ((char *)conn.remote_name, TEST_IF_NAME);
354 if ((err = memif_msg_receive_hello (&conn, &msg)) != MEMIF_ERR_SUCCESS)
355 ck_assert_msg (err == MEMIF_ERR_PROTO,
356 "err code: %u, err msg: %s", err, memif_strerror (err));
360 START_TEST (test_recv_init)
363 memif_connection_t conn;
365 conn.args.interface_id = 69;
366 conn.args.is_master = 1;
369 memset (conn.args.secret, '\0', 24);
370 strncpy ((char *) conn.args.secret, TEST_SECRET, strlen (TEST_SECRET));
374 memif_msg_init_t *i = &msg.init;
376 msg.type = MEMIF_MSG_TYPE_INIT;
378 i->version = MEMIF_VERSION;
381 memset (i->name, '\0', 32);
382 memset (i->secret, '\0', 24);
383 strncpy ((char *) i->name, TEST_IF_NAME, strlen (TEST_IF_NAME));
384 strncpy ((char *) i->secret, TEST_SECRET, strlen (TEST_SECRET));
387 ms.interface_list_len = 1;
388 ms.interface_list = malloc (sizeof (memif_list_elt_t));
389 memif_list_elt_t elt;
391 elt.data_struct = &conn;
392 add_list_elt (get_libmemif_main (conn.args.socket), &elt, &ms.interface_list, &ms.interface_list_len);
395 memif_init (control_fd_update, TEST_APP_NAME, NULL,
396 NULL, NULL)) != MEMIF_ERR_SUCCESS)
397 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
399 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
400 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
403 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
404 ck_assert_msg (err == MEMIF_ERR_PROTO,
405 "err code: %u, err msg: %s", err, memif_strerror (err));
406 i->version = MEMIF_VERSION;
409 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
410 ck_assert_msg (err == MEMIF_ERR_ID,
411 "err code: %u, err msg: %s", err, memif_strerror (err));
415 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
416 ck_assert_msg (err == MEMIF_ERR_MODE,
417 "err code: %u, err msg: %s", err, memif_strerror (err));
421 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
422 ck_assert_msg (err == MEMIF_ERR_SECRET,
423 "err code: %u, err msg: %s", err, memif_strerror (err));
424 strncpy ((char *) i->secret, TEST_SECRET, strlen (TEST_SECRET));
426 conn.args.is_master = 0;
427 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
428 ck_assert_msg (err == MEMIF_ERR_ACCSLAVE,
429 "err code: %u, err msg: %s", err, memif_strerror (err));
430 conn.args.is_master = 1;
433 if ((err = memif_msg_receive_init (&ms, -1, &msg)) != MEMIF_ERR_SUCCESS)
434 ck_assert_msg ((err == MEMIF_ERR_ALRCONN) || (err == MEMIF_ERR_BAD_FD),
435 "err code: %u, err msg: %s", err, memif_strerror (err));
439 START_TEST (test_recv_add_region)
442 memif_connection_t conn;
445 msg.type = MEMIF_MSG_TYPE_ADD_REGION;
446 msg.add_region.size = 2048;
447 msg.add_region.index = 0;
452 memif_msg_receive_add_region (&conn, &msg, fd)) != MEMIF_ERR_SUCCESS)
453 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
455 memif_region_t *mr = conn.regions;
457 ck_assert_uint_eq (mr->fd, fd);
458 ck_assert_uint_eq (mr->region_size, 2048);
459 ck_assert_ptr_eq (mr->addr, NULL);
463 START_TEST (test_recv_add_ring)
466 memif_connection_t conn;
469 conn.args.num_s2m_rings = 2;
470 conn.args.num_m2s_rings = 2;
471 conn.rx_queues = NULL;
472 conn.tx_queues = NULL;
474 msg.type = MEMIF_MSG_TYPE_ADD_RING;
475 memif_msg_add_ring_t *ar = &msg.add_ring;
477 ar->log2_ring_size = 10;
481 ar->flags |= MEMIF_MSG_ADD_RING_FLAG_S2M;
485 memif_msg_receive_add_ring (&conn, &msg, fd)) != MEMIF_ERR_SUCCESS)
486 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
490 ar->flags &= ~MEMIF_MSG_ADD_RING_FLAG_S2M;
493 memif_msg_receive_add_ring (&conn, &msg, fd)) != MEMIF_ERR_SUCCESS)
494 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
499 START_TEST (test_recv_connect)
502 memif_conn_handle_t c = NULL;
503 memif_conn_args_t args;
504 memset (&args, 0, sizeof (args));
506 args.interface_id = 0;
511 memif_init (control_fd_update, TEST_APP_NAME, NULL,
512 NULL, NULL)) != MEMIF_ERR_SUCCESS)
513 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
515 if ((err = memif_create (&c, &args, on_connect,
516 on_disconnect, on_interrupt,
517 NULL)) != MEMIF_ERR_SUCCESS)
518 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
520 memif_connection_t *conn = (memif_connection_t *) c;
522 conn->run_args.num_s2m_rings = 1;
523 conn->run_args.num_m2s_rings = 1;
524 conn->run_args.log2_ring_size = 10;
525 conn->run_args.buffer_size = 2048;
527 if ((err = memif_init_regions_and_queues (conn)) != MEMIF_ERR_SUCCESS)
528 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
531 memset (&msg, 0, sizeof (msg));
532 msg.type = MEMIF_MSG_TYPE_CONNECT;
534 memset (msg.connect.if_name, 0, sizeof (msg.connect.if_name));
535 strncpy ((char *) msg.connect.if_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
537 if ((err = memif_msg_receive_connect (conn, &msg)) != MEMIF_ERR_SUCCESS)
538 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
540 ck_assert_str_eq ((char *)conn->remote_if_name, TEST_IF_NAME);
544 START_TEST (test_recv_connected)
547 memif_conn_handle_t c = NULL;
548 memif_conn_args_t args;
549 memset (&args, 0, sizeof (args));
551 args.interface_id = 0;
556 memif_init (control_fd_update, TEST_APP_NAME, NULL,
557 NULL, NULL)) != MEMIF_ERR_SUCCESS)
558 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
560 if ((err = memif_create (&c, &args, on_connect,
561 on_disconnect, on_interrupt,
562 NULL)) != MEMIF_ERR_SUCCESS)
563 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
565 memif_connection_t *conn = (memif_connection_t *) c;
567 conn->run_args.num_s2m_rings = 1;
568 conn->run_args.num_m2s_rings = 1;
569 conn->run_args.log2_ring_size = 10;
570 conn->run_args.buffer_size = 2048;
572 if ((err = memif_init_regions_and_queues (conn)) != MEMIF_ERR_SUCCESS)
573 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
576 memset (&msg, 0, sizeof (msg));
577 msg.type = MEMIF_MSG_TYPE_CONNECT;
579 memset (msg.connect.if_name, 0, sizeof (msg.connect.if_name));
580 strncpy ((char *) msg.connect.if_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
582 if ((err = memif_msg_receive_connected (conn, &msg)) != MEMIF_ERR_SUCCESS)
583 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
585 ck_assert_str_eq ((char *)conn->remote_if_name, TEST_IF_NAME);
589 START_TEST (test_recv_disconnect)
592 memif_connection_t conn;
594 msg.type = MEMIF_MSG_TYPE_DISCONNECT;
595 memset (msg.disconnect.string, 0, sizeof (msg.disconnect.string));
596 strncpy ((char *) msg.disconnect.string, "unit_test_dc", 12);
598 if ((err = memif_msg_receive_disconnect (&conn, &msg)) != MEMIF_ERR_SUCCESS)
599 ck_assert_msg (err == MEMIF_ERR_DISCONNECT,
600 "err code: %u, err msg: %s", err, memif_strerror (err));
602 ck_assert_str_eq ((char *)conn.remote_disconnect_string, "unit_test_dc");
614 /* create socket test suite */
615 s = suite_create ("Socket messaging");
617 /* create msg queue test case */
618 tc_msg_queue = tcase_create ("Message queue");
619 /* add tests to test case */
620 tcase_add_test (tc_msg_queue, test_msg_queue);
622 /* create msg enq test case */
623 tc_msg_enq = tcase_create ("Message enqueue");
624 /* add tests to test case */
625 tcase_add_test (tc_msg_enq, test_enq_ack);
626 tcase_add_test (tc_msg_enq, test_enq_init);
627 tcase_add_test (tc_msg_enq, test_enq_add_region);
628 tcase_add_test (tc_msg_enq, test_enq_add_ring);
629 tcase_add_test (tc_msg_enq, test_enq_connect);
630 tcase_add_test (tc_msg_enq, test_enq_connected);
632 /* create msg send test case */
633 tc_msg_send = tcase_create ("Message send");
634 /* add tests to test case */
635 tcase_add_test (tc_msg_send, test_send);
636 tcase_add_test (tc_msg_send, test_send_hello);
637 tcase_add_test (tc_msg_send, test_send_disconnect);
639 /* create msg recv test case */
640 tc_msg_recv = tcase_create ("Message receive");
641 /* add tests to test case */
642 tcase_add_test (tc_msg_recv, test_recv_hello);
643 tcase_add_test (tc_msg_recv, test_recv_init);
644 tcase_add_test (tc_msg_recv, test_recv_add_region);
645 tcase_add_test (tc_msg_recv, test_recv_add_ring);
646 tcase_add_test (tc_msg_recv, test_recv_connect);
647 tcase_add_test (tc_msg_recv, test_recv_connected);
648 tcase_add_test (tc_msg_recv, test_recv_disconnect);
650 /* add test cases to test suite */
651 suite_add_tcase (s, tc_msg_queue);
652 suite_add_tcase (s, tc_msg_enq);
653 suite_add_tcase (s, tc_msg_send);
654 suite_add_tcase (s, tc_msg_recv);
656 /* return socket test suite to test runner */