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 *------------------------------------------------------------------
17 #include <sys/types.h>
21 #include <main_test.h>
23 #include <memif_private.h>
25 #define SOCKET_FILENAME "/run/vpp/memif.sock"
28 #define read_call (1 << 0)
29 #define write_call (1 << 1)
30 #define error_call (1 << 2)
33 read_fn (memif_connection_t * c)
35 ready_called |= read_call;
40 write_fn (memif_connection_t * c)
42 ready_called |= write_call;
47 error_fn (memif_connection_t * c)
49 ready_called |= error_call;
54 register_fd_ready_fn (memif_connection_t * c,
55 memif_fn * read_fn, memif_fn * write_fn,
59 c->write_fn = write_fn;
60 c->error_fn = error_fn;
63 START_TEST (test_init)
68 memif_init (control_fd_update, TEST_APP_NAME, NULL,
69 NULL, NULL)) != MEMIF_ERR_SUCCESS)
70 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
72 libmemif_main_t *lm = &libmemif_main;
74 ck_assert_ptr_ne (lm, NULL);
75 ck_assert_ptr_ne (lm->control_fd_update, NULL);
76 ck_assert_int_gt (lm->timerfd, 2);
84 START_TEST (test_init_epoll)
89 memif_init (NULL, TEST_APP_NAME, NULL, NULL, NULL)) != MEMIF_ERR_SUCCESS)
90 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
92 libmemif_main_t *lm = &libmemif_main;
94 ck_assert_ptr_ne (lm, NULL);
95 ck_assert_ptr_ne (lm->control_fd_update, NULL);
96 ck_assert_int_gt (lm->timerfd, 2);
97 ck_assert_int_gt (memif_epfd, -1);
105 START_TEST (test_create)
108 memif_conn_handle_t conn = NULL;
109 memif_conn_args_t args;
110 memset (&args, 0, sizeof (args));
112 libmemif_main_t *lm = &libmemif_main;
115 memif_init (control_fd_update, TEST_APP_NAME, NULL,
116 NULL, NULL)) != MEMIF_ERR_SUCCESS)
117 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
119 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
121 if ((err = memif_create (&conn, &args, on_connect,
122 on_disconnect, on_interrupt,
123 NULL)) != MEMIF_ERR_SUCCESS)
124 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
126 memif_connection_t *c = (memif_connection_t *) conn;
128 ck_assert_ptr_ne (c, NULL);
130 ck_assert_uint_eq (c->args.interface_id, args.interface_id);
131 ck_assert_uint_eq (c->args.is_master, args.is_master);
132 ck_assert_uint_eq (c->args.mode, args.mode);
134 ck_assert_uint_eq (c->args.num_s2m_rings, MEMIF_DEFAULT_TX_QUEUES);
135 ck_assert_uint_eq (c->args.num_m2s_rings, MEMIF_DEFAULT_RX_QUEUES);
136 ck_assert_uint_eq (c->args.buffer_size, MEMIF_DEFAULT_BUFFER_SIZE);
137 ck_assert_uint_eq (c->args.log2_ring_size, MEMIF_DEFAULT_LOG2_RING_SIZE);
139 ck_assert_ptr_eq (c->msg_queue, NULL);
140 ck_assert_ptr_eq (c->regions, NULL);
141 ck_assert_ptr_eq (c->tx_queues, NULL);
142 ck_assert_ptr_eq (c->rx_queues, NULL);
144 ck_assert_int_eq (c->fd, -1);
146 ck_assert_ptr_ne (c->on_connect, NULL);
147 ck_assert_ptr_ne (c->on_disconnect, NULL);
148 ck_assert_ptr_ne (c->on_interrupt, NULL);
150 ck_assert_str_eq ((char *)c->args.interface_name, (char *)args.interface_name);
151 ck_assert_str_eq ((char *)c->args.socket_filename, SOCKET_FILENAME);
153 struct itimerspec timer;
154 timerfd_gettime (lm->timerfd, &timer);
156 ck_assert_msg (timer.it_interval.tv_sec == lm->arm.it_interval.tv_sec,
157 "timerfd not armed!");
163 memif_delete (&conn);
164 ck_assert_ptr_eq (conn, NULL);
168 START_TEST (test_create_master)
171 memif_conn_handle_t conn = NULL;
172 memif_conn_args_t args;
173 memset (&args, 0, sizeof (args));
177 memif_init (control_fd_update, TEST_APP_NAME, NULL,
178 NULL, NULL)) != MEMIF_ERR_SUCCESS)
179 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
181 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
183 if ((err = memif_create (&conn, &args, on_connect,
184 on_disconnect, on_interrupt,
185 NULL)) != MEMIF_ERR_SUCCESS)
186 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
188 memif_connection_t *c = (memif_connection_t *) conn;
190 ck_assert_ptr_ne (c, NULL);
192 ck_assert_uint_eq (c->args.interface_id, args.interface_id);
193 ck_assert_uint_eq (c->args.is_master, args.is_master);
194 ck_assert_uint_eq (c->args.mode, args.mode);
196 ck_assert_uint_eq (c->args.num_s2m_rings, MEMIF_DEFAULT_TX_QUEUES);
197 ck_assert_uint_eq (c->args.num_m2s_rings, MEMIF_DEFAULT_RX_QUEUES);
198 ck_assert_uint_eq (c->args.buffer_size, MEMIF_DEFAULT_BUFFER_SIZE);
199 ck_assert_uint_eq (c->args.log2_ring_size, MEMIF_DEFAULT_LOG2_RING_SIZE);
201 ck_assert_ptr_eq (c->msg_queue, NULL);
202 ck_assert_ptr_eq (c->regions, NULL);
203 ck_assert_ptr_eq (c->tx_queues, NULL);
204 ck_assert_ptr_eq (c->rx_queues, NULL);
206 ck_assert_int_eq (c->fd, -1);
208 ck_assert_ptr_ne (c->on_connect, NULL);
209 ck_assert_ptr_ne (c->on_disconnect, NULL);
210 ck_assert_ptr_ne (c->on_interrupt, NULL);
212 ck_assert_str_eq ((char *)c->args.interface_name, (char *)args.interface_name);
213 ck_assert_str_eq ((char *)c->args.socket_filename, SOCKET_FILENAME);
215 struct stat file_stat;
217 rv = stat (SOCKET_FILENAME, &file_stat);
218 ck_assert_int_eq (rv, 0);
220 ck_assert (S_ISSOCK (file_stat.st_mode));
222 memif_delete (&conn);
223 ck_assert_ptr_eq (conn, NULL);
227 START_TEST (test_create_mult)
230 memif_conn_handle_t conn = NULL;
231 memif_conn_handle_t conn1 = NULL;
232 memif_conn_args_t args;
233 memset (&args, 0, sizeof (args));
235 libmemif_main_t *lm = &libmemif_main;
238 memif_init (control_fd_update, TEST_APP_NAME, NULL,
239 NULL, NULL)) != MEMIF_ERR_SUCCESS)
240 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
242 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
244 if ((err = memif_create (&conn, &args, on_connect,
245 on_disconnect, on_interrupt,
246 NULL)) != MEMIF_ERR_SUCCESS)
247 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
249 args.interface_id = 1;
251 if ((err = memif_create (&conn1, &args, on_connect,
252 on_disconnect, on_interrupt,
253 NULL)) != MEMIF_ERR_SUCCESS)
254 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
256 memif_connection_t *c = (memif_connection_t *) conn;
257 memif_connection_t *c1 = (memif_connection_t *) conn1;
259 ck_assert_ptr_ne (c, NULL);
260 ck_assert_ptr_ne (c1, NULL);
262 ck_assert_uint_eq (c->args.interface_id, 0);
263 ck_assert_uint_eq (c->args.is_master, args.is_master);
264 ck_assert_uint_eq (c->args.mode, args.mode);
265 ck_assert_uint_eq (c1->args.interface_id, 1);
266 ck_assert_uint_eq (c1->args.is_master, args.is_master);
267 ck_assert_uint_eq (c1->args.mode, args.mode);
269 ck_assert_uint_eq (c->args.num_s2m_rings, MEMIF_DEFAULT_TX_QUEUES);
270 ck_assert_uint_eq (c->args.num_m2s_rings, MEMIF_DEFAULT_RX_QUEUES);
271 ck_assert_uint_eq (c->args.buffer_size, MEMIF_DEFAULT_BUFFER_SIZE);
272 ck_assert_uint_eq (c->args.log2_ring_size, MEMIF_DEFAULT_LOG2_RING_SIZE);
273 ck_assert_uint_eq (c1->args.num_s2m_rings, MEMIF_DEFAULT_TX_QUEUES);
274 ck_assert_uint_eq (c1->args.num_m2s_rings, MEMIF_DEFAULT_RX_QUEUES);
275 ck_assert_uint_eq (c1->args.buffer_size, MEMIF_DEFAULT_BUFFER_SIZE);
276 ck_assert_uint_eq (c1->args.log2_ring_size, MEMIF_DEFAULT_LOG2_RING_SIZE);
278 ck_assert_ptr_eq (c->msg_queue, NULL);
279 ck_assert_ptr_eq (c->regions, NULL);
280 ck_assert_ptr_eq (c->tx_queues, NULL);
281 ck_assert_ptr_eq (c->rx_queues, NULL);
282 ck_assert_ptr_eq (c1->msg_queue, NULL);
283 ck_assert_ptr_eq (c1->regions, NULL);
284 ck_assert_ptr_eq (c1->tx_queues, NULL);
285 ck_assert_ptr_eq (c1->rx_queues, NULL);
287 ck_assert_int_eq (c->fd, -1);
288 ck_assert_int_eq (c1->fd, -1);
290 ck_assert_ptr_ne (c->on_connect, NULL);
291 ck_assert_ptr_ne (c->on_disconnect, NULL);
292 ck_assert_ptr_ne (c->on_interrupt, NULL);
293 ck_assert_ptr_ne (c1->on_connect, NULL);
294 ck_assert_ptr_ne (c1->on_disconnect, NULL);
295 ck_assert_ptr_ne (c1->on_interrupt, NULL);
297 ck_assert_str_eq ((char *)c->args.interface_name, (char *)args.interface_name);
298 ck_assert_str_eq ((char *)c->args.socket_filename, SOCKET_FILENAME);
299 ck_assert_str_eq ((char *)c1->args.interface_name, (char *)args.interface_name);
300 ck_assert_str_eq ((char *)c1->args.socket_filename, SOCKET_FILENAME);
302 struct itimerspec timer;
303 timerfd_gettime (lm->timerfd, &timer);
305 ck_assert_msg (timer.it_interval.tv_sec == lm->arm.it_interval.tv_sec,
306 "timerfd not armed!");
312 memif_delete (&conn);
313 ck_assert_ptr_eq (conn, NULL);
317 START_TEST (test_control_fd_handler)
321 memif_conn_handle_t conn = NULL;
322 memif_conn_args_t args;
323 memset (&args, 0, sizeof (args));
324 args.num_s2m_rings = 2;
325 args.num_m2s_rings = 2;
327 libmemif_main_t *lm = &libmemif_main;
330 memif_init (control_fd_update, TEST_APP_NAME, NULL,
331 NULL, NULL)) != MEMIF_ERR_SUCCESS)
332 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
334 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
336 if ((err = memif_create (&conn, &args, on_connect,
337 on_disconnect, on_interrupt,
338 NULL)) != MEMIF_ERR_SUCCESS)
339 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
341 memif_connection_t *c = (memif_connection_t *) conn;
344 memif_control_fd_handler (lm->timerfd,
345 MEMIF_FD_EVENT_READ)) != MEMIF_ERR_SUCCESS)
346 ck_assert_msg (err == MEMIF_ERR_NO_FILE, "err code: %u, err msg: %s", err,
347 memif_strerror (err));
349 register_fd_ready_fn (c, read_fn, write_fn, error_fn);
351 lm->control_list[0].key = c->fd;
352 lm->control_list[0].data_struct = c;
355 memif_control_fd_handler (c->fd,
356 MEMIF_FD_EVENT_READ)) != MEMIF_ERR_SUCCESS)
357 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
359 ck_assert (ready_called & read_call);
362 memif_control_fd_handler (c->fd,
363 MEMIF_FD_EVENT_WRITE)) != MEMIF_ERR_SUCCESS)
364 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
366 ck_assert (ready_called & write_call);
369 memif_control_fd_handler (c->fd,
370 MEMIF_FD_EVENT_ERROR)) != MEMIF_ERR_SUCCESS)
371 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
373 ck_assert (ready_called & error_call);
379 memif_delete (&conn);
380 ck_assert_ptr_eq (conn, NULL);
384 START_TEST (test_buffer_alloc)
389 memif_buffer_t *bufs;
390 uint16_t max_buf = 10;
392 memif_conn_handle_t conn = NULL;
393 memif_conn_args_t args;
394 memset (&args, 0, sizeof (args));
395 args.num_s2m_rings = 2;
396 args.num_m2s_rings = 2;
398 libmemif_main_t *lm = &libmemif_main;
401 memif_init (control_fd_update, TEST_APP_NAME, NULL,
402 NULL, NULL)) != MEMIF_ERR_SUCCESS)
403 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
405 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
407 if ((err = memif_create (&conn, &args, on_connect,
408 on_disconnect, on_interrupt,
409 NULL)) != MEMIF_ERR_SUCCESS)
410 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
412 memif_connection_t *c = (memif_connection_t *) conn;
414 c->run_args.num_s2m_rings = 2;
415 c->run_args.num_m2s_rings = 2;
416 c->run_args.log2_ring_size = 10;
417 c->run_args.buffer_size = 2048;
419 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
420 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
424 /* test buffer allocation qid 0 (positive) */
426 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
430 memif_buffer_alloc (conn, qid, bufs, max_buf,
432 MEMIF_DEFAULT_BUFFER_SIZE)) != MEMIF_ERR_SUCCESS)
433 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
435 ck_assert_uint_eq (buf, max_buf);
436 for (i = 0; i < max_buf; i++)
437 ck_assert_uint_eq (bufs[i].len, MEMIF_DEFAULT_BUFFER_SIZE);
439 /* test buffer allocation qid 1 (positive) */
441 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
445 memif_buffer_alloc (conn, qid, bufs, max_buf,
447 MEMIF_DEFAULT_BUFFER_SIZE)) != MEMIF_ERR_SUCCESS)
448 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
450 ck_assert_uint_eq (buf, max_buf);
451 for (i = 0; i < max_buf; i++)
452 ck_assert_uint_eq (bufs[i].len, MEMIF_DEFAULT_BUFFER_SIZE);
454 /* test buffer allocation qid 2 (negative) */
457 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
461 memif_buffer_alloc (conn, qid, bufs, max_buf,
463 MEMIF_DEFAULT_BUFFER_SIZE)) != MEMIF_ERR_SUCCESS)
464 ck_assert_msg (err == MEMIF_ERR_QID, "err code: %u, err msg: %s", err,
465 memif_strerror (err));
474 memif_delete (&conn);
475 ck_assert_ptr_eq (conn, NULL);
479 START_TEST (test_tx_burst)
482 uint16_t max_buf = 10, buf, tx;
484 memif_buffer_t *bufs;
486 memif_conn_handle_t conn = NULL;
487 memif_conn_args_t args;
488 memset (&args, 0, sizeof (args));
489 args.num_s2m_rings = 2;
490 args.num_m2s_rings = 2;
492 libmemif_main_t *lm = &libmemif_main;
495 memif_init (control_fd_update, TEST_APP_NAME, NULL,
496 NULL, NULL)) != MEMIF_ERR_SUCCESS)
497 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
499 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
501 if ((err = memif_create (&conn, &args, on_connect,
502 on_disconnect, on_interrupt,
503 NULL)) != MEMIF_ERR_SUCCESS)
504 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
506 memif_connection_t *c = (memif_connection_t *) conn;
508 c->run_args.num_s2m_rings = 2;
509 c->run_args.num_m2s_rings = 2;
510 c->run_args.log2_ring_size = 10;
511 c->run_args.buffer_size = 2048;
513 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
514 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
518 /* test transmit qid 0 (positive) */
520 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
523 memif_buffer_alloc (conn, qid, bufs, max_buf,
525 MEMIF_DEFAULT_BUFFER_SIZE)) != MEMIF_ERR_SUCCESS)
526 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
528 ck_assert_uint_eq (buf, max_buf);
529 for (i = 0; i < max_buf; i++)
530 ck_assert_uint_eq (bufs[i].len, MEMIF_DEFAULT_BUFFER_SIZE);
533 memif_tx_burst (conn, qid, bufs, max_buf, &tx)) != MEMIF_ERR_SUCCESS)
534 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
536 ck_assert_uint_eq (tx, max_buf);
537 for (i = 0; i < max_buf; i++)
538 ck_assert_ptr_eq (bufs[i].data, NULL);
540 /* test transmit qid 1 (positive) */
542 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
545 memif_buffer_alloc (conn, qid, bufs, max_buf,
547 MEMIF_DEFAULT_BUFFER_SIZE)) != MEMIF_ERR_SUCCESS)
548 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
550 ck_assert_uint_eq (buf, max_buf);
551 for (i = 0; i < max_buf; i++)
552 ck_assert_uint_eq (bufs[i].len, MEMIF_DEFAULT_BUFFER_SIZE);
555 memif_tx_burst (conn, qid, bufs, max_buf, &tx)) != MEMIF_ERR_SUCCESS)
556 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
558 ck_assert_uint_eq (tx, max_buf);
559 for (i = 0; i < max_buf; i++)
560 ck_assert_ptr_eq (bufs[i].data, NULL);
562 /* test transmit qid 2 (negative) */
564 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
567 memif_tx_burst (conn, qid, bufs, max_buf, &tx)) != MEMIF_ERR_SUCCESS)
568 ck_assert_msg (err == MEMIF_ERR_QID, "err code: %u, err msg: %s", err,
569 memif_strerror (err));
577 memif_delete (&conn);
578 ck_assert_ptr_eq (conn, NULL);
582 START_TEST (test_rx_burst)
585 uint16_t max_buf = 10, rx;
587 memif_buffer_t *bufs;
591 memif_conn_handle_t conn = NULL;
592 memif_conn_args_t args;
593 memset (&args, 0, sizeof (args));
594 args.num_s2m_rings = 2;
595 args.num_m2s_rings = 2;
597 libmemif_main_t *lm = &libmemif_main;
600 memif_init (control_fd_update, TEST_APP_NAME, NULL,
601 NULL, NULL)) != MEMIF_ERR_SUCCESS)
602 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
604 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
606 if ((err = memif_create (&conn, &args, on_connect,
607 on_disconnect, on_interrupt,
608 NULL)) != MEMIF_ERR_SUCCESS)
609 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
611 memif_connection_t *c = (memif_connection_t *) conn;
613 c->run_args.num_s2m_rings = 2;
614 c->run_args.num_m2s_rings = 2;
615 c->run_args.log2_ring_size = 10;
616 c->run_args.buffer_size = 2048;
618 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
619 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
623 /* test receive qid 0 (positive) */
625 mq = &c->rx_queues[qid];
627 ring->tail += max_buf;
629 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
632 memif_rx_burst (conn, qid, bufs, max_buf, &rx)) != MEMIF_ERR_SUCCESS)
633 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
635 ck_assert_uint_eq (rx, max_buf);
636 for (i = 0; i < max_buf; i++)
637 ck_assert_ptr_ne (bufs[i].data, NULL);
639 /* test receive qid 1 (positive) */
641 mq = &c->rx_queues[qid];
643 ring->tail += max_buf;
646 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
649 memif_rx_burst (conn, qid, bufs, max_buf, &rx)) != MEMIF_ERR_SUCCESS)
650 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
652 ck_assert_uint_eq (rx, max_buf);
653 for (i = 0; i < max_buf; i++)
654 ck_assert_ptr_ne (bufs[i].data, NULL);
656 /* test receive qid 2 (negative) */
658 bufs = malloc (sizeof (memif_buffer_t) * max_buf);
661 memif_rx_burst (conn, qid, bufs, max_buf, &rx)) != MEMIF_ERR_SUCCESS)
662 ck_assert_msg (err == MEMIF_ERR_QID, "err code: %u, err msg: %s", err,
663 memif_strerror (err));
671 memif_delete (&conn);
672 ck_assert_ptr_eq (conn, NULL);
676 START_TEST (test_get_details)
680 memif_conn_handle_t conn = NULL;
681 memif_conn_args_t args;
682 memset (&args, 0, sizeof (args));
683 args.num_s2m_rings = 2;
684 args.num_m2s_rings = 2;
686 libmemif_main_t *lm = &libmemif_main;
689 memif_init (control_fd_update, TEST_APP_NAME, NULL,
690 NULL, NULL)) != MEMIF_ERR_SUCCESS)
691 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
693 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
695 if ((err = memif_create (&conn, &args, on_connect,
696 on_disconnect, on_interrupt,
697 NULL)) != MEMIF_ERR_SUCCESS)
698 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
700 memif_connection_t *c = (memif_connection_t *) conn;
702 c->run_args.num_s2m_rings = 2;
703 c->run_args.num_m2s_rings = 2;
704 c->run_args.log2_ring_size = 10;
705 c->run_args.buffer_size = 2048;
707 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
708 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
711 memset (&md, 0, sizeof (md));
712 ssize_t buflen = 2048;
713 char *buf = malloc (buflen);
714 memset (buf, 0, buflen);
716 if ((err = memif_get_details (conn, &md, buf, buflen)) != MEMIF_ERR_SUCCESS)
717 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
719 ck_assert_str_eq ((char *)md.if_name, (char *)c->args.interface_name);
720 ck_assert_str_eq ((char *)md.remote_if_name, (char *)c->remote_if_name);
721 ck_assert_str_eq ((char *)md.remote_inst_name, (char *)c->remote_name);
722 ck_assert_str_eq ((char *)md.secret, (char *)c->args.secret);
723 ck_assert_str_eq ((char *)md.socket_filename, (char *)c->args.socket_filename);
725 ck_assert_uint_eq (md.id, c->args.interface_id);
726 ck_assert_uint_ne (md.role, c->args.is_master);
727 ck_assert_uint_eq (md.mode, c->args.mode);
728 for (i = 0; i < md.rx_queues_num; i++)
730 ck_assert_uint_eq (md.rx_queues[i].qid, i);
731 ck_assert_uint_eq (md.rx_queues[i].ring_size,
732 (1 << c->args.log2_ring_size));
733 ck_assert_uint_eq (md.rx_queues[i].buffer_size, c->args.buffer_size);
735 for (i = 0; i < md.tx_queues_num; i++)
737 ck_assert_uint_eq (md.tx_queues[i].qid, i);
738 ck_assert_uint_eq (md.tx_queues[i].ring_size,
739 (1 << c->args.log2_ring_size));
740 ck_assert_uint_eq (md.tx_queues[i].buffer_size, c->args.buffer_size);
742 ck_assert_uint_eq (md.link_up_down, 0);
748 memif_delete (&conn);
749 ck_assert_ptr_eq (conn, NULL);
753 START_TEST (test_init_regions_and_queues)
757 memif_conn_handle_t conn = NULL;
758 memif_conn_args_t args;
759 memset (&args, 0, sizeof (args));
760 args.num_s2m_rings = 2;
761 args.num_m2s_rings = 2;
763 libmemif_main_t *lm = &libmemif_main;
766 memif_init (control_fd_update, TEST_APP_NAME, NULL,
767 NULL, NULL)) != MEMIF_ERR_SUCCESS)
768 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
770 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
772 if ((err = memif_create (&conn, &args, on_connect,
773 on_disconnect, on_interrupt,
774 NULL)) != MEMIF_ERR_SUCCESS)
775 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
777 memif_connection_t *c = (memif_connection_t *) conn;
779 c->run_args.num_s2m_rings = 2;
780 c->run_args.num_m2s_rings = 2;
781 c->run_args.log2_ring_size = 10;
782 c->run_args.buffer_size = 2048;
784 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
785 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
787 ck_assert_ptr_ne (c->regions, NULL);
788 ck_assert_ptr_ne (c->tx_queues, NULL);
789 ck_assert_ptr_ne (c->rx_queues, NULL);
791 ck_assert_ptr_ne (c->regions->addr, NULL);
792 ck_assert_ptr_ne (c->tx_queues->ring, NULL);
793 ck_assert_ptr_ne (c->rx_queues->ring, NULL);
795 ck_assert_int_ne (c->regions->fd, -1);
796 ck_assert_uint_eq (c->tx_queues->ring->cookie, MEMIF_COOKIE);
797 ck_assert_uint_eq (c->rx_queues->ring->cookie, MEMIF_COOKIE);
803 memif_delete (&conn);
804 ck_assert_ptr_eq (conn, NULL);
808 START_TEST (test_connect1)
812 memif_conn_handle_t conn = NULL;
813 memif_conn_args_t args;
814 memset (&args, 0, sizeof (args));
815 args.num_s2m_rings = 2;
816 args.num_m2s_rings = 2;
818 libmemif_main_t *lm = &libmemif_main;
821 memif_init (control_fd_update, TEST_APP_NAME, NULL,
822 NULL, NULL)) != MEMIF_ERR_SUCCESS)
823 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
825 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
827 if ((err = memif_create (&conn, &args, on_connect,
828 on_disconnect, on_interrupt,
829 NULL)) != MEMIF_ERR_SUCCESS)
830 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
832 memif_connection_t *c = (memif_connection_t *) conn;
834 c->run_args.num_s2m_rings = 2;
835 c->run_args.num_m2s_rings = 2;
836 c->run_args.log2_ring_size = 10;
837 c->run_args.buffer_size = 2048;
839 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
840 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
842 if ((err = memif_connect1 (c)) != MEMIF_ERR_SUCCESS)
843 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
849 memif_delete (&conn);
850 ck_assert_ptr_eq (conn, NULL);
854 START_TEST (test_disconnect_internal)
858 memif_conn_handle_t conn = NULL;
859 memif_conn_args_t args;
860 memset (&args, 0, sizeof (args));
861 args.num_s2m_rings = 2;
862 args.num_m2s_rings = 2;
864 libmemif_main_t *lm = &libmemif_main;
867 memif_init (control_fd_update, TEST_APP_NAME, NULL,
868 NULL, NULL)) != MEMIF_ERR_SUCCESS)
869 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
871 strncpy ((char *) args.interface_name, TEST_IF_NAME, strlen (TEST_IF_NAME));
873 if ((err = memif_create (&conn, &args, on_connect,
874 on_disconnect, on_interrupt,
875 NULL)) != MEMIF_ERR_SUCCESS)
876 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
878 memif_connection_t *c = (memif_connection_t *) conn;
880 c->run_args.num_s2m_rings = 2;
881 c->run_args.num_m2s_rings = 2;
882 c->run_args.log2_ring_size = 10;
883 c->run_args.buffer_size = 2048;
885 if ((err = memif_init_regions_and_queues (c)) != MEMIF_ERR_SUCCESS)
886 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
888 if ((err = memif_disconnect_internal (c)) != MEMIF_ERR_SUCCESS)
889 ck_abort_msg ("err code: %u, err msg: %s", err, memif_strerror (err));
891 ck_assert_int_eq (c->fd, -1);
893 ck_assert_ptr_eq (c->tx_queues, NULL);
894 ck_assert_ptr_eq (c->rx_queues, NULL);
895 ck_assert_ptr_eq (c->regions, NULL);
896 ck_assert_ptr_eq (c->msg_queue, NULL);
898 struct itimerspec timer;
899 timerfd_gettime (lm->timerfd, &timer);
901 ck_assert_msg (timer.it_interval.tv_sec == lm->arm.it_interval.tv_sec,
902 "timerfd not armed!");
908 memif_delete (&conn);
909 ck_assert_ptr_eq (conn, NULL);
920 /* create main test suite */
921 s = suite_create ("Libmemif main");
923 /* create api test case */
924 tc_api = tcase_create ("Api calls");
925 /* add tests to test case */
926 tcase_add_test (tc_api, test_init);
927 tcase_add_test (tc_api, test_init_epoll);
928 tcase_add_test (tc_api, test_create);
929 tcase_add_test (tc_api, test_create_master);
930 tcase_add_test (tc_api, test_create_mult);
931 tcase_add_test (tc_api, test_control_fd_handler);
932 tcase_add_test (tc_api, test_buffer_alloc);
933 tcase_add_test (tc_api, test_tx_burst);
934 tcase_add_test (tc_api, test_rx_burst);
935 tcase_add_test (tc_api, test_get_details);
937 /* create internal test case */
938 tc_internal = tcase_create ("Internal");
939 /* add tests to test case */
940 tcase_add_test (tc_internal, test_init_regions_and_queues);
941 tcase_add_test (tc_internal, test_connect1);
942 tcase_add_test (tc_internal, test_disconnect_internal);
944 /* add test cases to test suite */
945 suite_add_tcase (s, tc_api);
946 suite_add_tcase (s, tc_internal);
948 /* return main test suite to test runner */