+ /*
+ * Enqueue/dequeue tests
+ */
+
+ test_n_bytes = f->nitems;
+ vec_validate (test_data, test_n_bytes - 1);
+ vec_validate (data_buf, vec_len (test_data));
+ n_deqs = n_enqs = 6;
+ deq_bytes = enq_bytes = vec_len (test_data) / n_deqs;
+
+ for (i = 0; i < vec_len (test_data); i++)
+ test_data[i] = i;
+
+ /*
+ * Enqueue/deq boundary conditions
+ */
+ svm_fifo_init_pointers (f, 201, 201);
+ SFIFO_TEST (f->tail_chunk->start_byte == 201, "start byte expected %u is "
+ "%u", 201, f->tail_chunk->start_byte);
+
+ svm_fifo_enqueue_nowait (f, 200, test_data);
+ SFIFO_TEST (f->tail_chunk->start_byte == 401, "start byte expected %u is "
+ "%u", 401, f->tail_chunk->start_byte);
+
+ svm_fifo_dequeue_nowait (f, 200, data_buf);
+ SFIFO_TEST (f->head_chunk->start_byte == 401, "start byte expected %u is "
+ "%u", 401, f->head_chunk->start_byte);
+
+ /*
+ * Simple enqueue/deq and data validation (1)
+ */
+ svm_fifo_init_pointers (f, f->nitems / 2, f->nitems / 2);
+ for (i = 0; i < test_n_bytes; i++)
+ {
+ rv = svm_fifo_enqueue_nowait (f, sizeof (u8), &test_data[i]);
+ if (rv < 0)
+ {
+ clib_warning ("enqueue returned %d", rv);
+ goto cleanup;
+ }
+ }
+
+ SFIFO_TEST (svm_fifo_max_dequeue (f) == test_n_bytes, "max deq expected %u "
+ "is %u", test_n_bytes, svm_fifo_max_dequeue (f));
+
+ for (i = 0; i < test_n_bytes; i++)
+ svm_fifo_dequeue_nowait (f, 1, &data_buf[i]);
+
+ rv = compare_data (data_buf, test_data, 0, vec_len (test_data),
+ (u32 *) & j);
+ if (rv)
+ vlib_cli_output (vm, "[%d] dequeued %u expected %u", j, data_buf[j],
+ test_data[j]);
+ SFIFO_TEST ((rv == 0), "dequeued compared to original returned %d", rv);
+
+ /*
+ * Simple enqueue/deq and data validation (2)
+ */
+ for (i = 0; i <= n_enqs; i++)
+ {
+ rv = svm_fifo_enqueue_nowait (f, enq_bytes, test_data + i * enq_bytes);
+ if (rv < 0)
+ {
+ clib_warning ("enqueue returned %d", rv);
+ goto cleanup;
+ }
+ }
+
+ SFIFO_TEST (svm_fifo_max_dequeue (f) == test_n_bytes, "max deq expected %u "
+ "is %u", test_n_bytes, svm_fifo_max_dequeue (f));
+
+ for (i = 0; i <= n_deqs; i++)
+ svm_fifo_dequeue_nowait (f, deq_bytes, data_buf + i * deq_bytes);
+
+ rv = compare_data (data_buf, test_data, 0, vec_len (test_data),
+ (u32 *) & j);
+ if (rv)
+ vlib_cli_output (vm, "[%d] dequeued %u expected %u", j, data_buf[j],
+ test_data[j]);
+ SFIFO_TEST ((rv == 0), "dequeued compared to original returned %d", rv);
+
+ /*
+ * OOO enqueues/dequeues and data validation (1)
+ */
+ for (i = test_n_bytes - 1; i > 0; i--)
+ {
+ rv = svm_fifo_enqueue_with_offset (f, i, sizeof (u8), &test_data[i]);
+ if (verbose)
+ vlib_cli_output (vm, "add [%d] [%d, %d]", i, i, i + sizeof (u8));
+ if (rv)
+ {
+ clib_warning ("enqueue returned %d", rv);
+ goto cleanup;
+ }
+ }
+
+ SFIFO_TEST (svm_fifo_max_dequeue (f) == 0, "max deq expected %u is %u",
+ 0, svm_fifo_max_dequeue (f));
+
+ svm_fifo_enqueue_nowait (f, sizeof (u8), &test_data[0]);
+
+ memset (data_buf, 0, vec_len (data_buf));
+ for (i = 0; i <= n_deqs; i++)
+ svm_fifo_dequeue_nowait (f, deq_bytes, data_buf + i * deq_bytes);
+
+ rv = compare_data (data_buf, test_data, 0, vec_len (test_data),
+ (u32 *) & j);
+ if (rv)
+ vlib_cli_output (vm, "[%d] dequeued %u expected %u", j, data_buf[j],
+ test_data[j]);
+ SFIFO_TEST ((rv == 0), "dequeued compared to original returned %d", rv);
+
+ /*
+ * OOO enqueues/dequeues and data validation (2)
+ */
+
+ for (i = n_enqs; i > 0; i--)
+ {
+ u32 enq_now = clib_min (enq_bytes, vec_len (test_data) - i * enq_bytes);
+ rv = svm_fifo_enqueue_with_offset (f, i * enq_bytes, enq_now,
+ test_data + i * enq_bytes);
+ if (verbose)
+ vlib_cli_output (vm, "add [%d, %d]", i * enq_bytes,
+ i * enq_bytes + enq_now);
+ if (rv)
+ {
+ clib_warning ("enqueue returned %d", rv);
+ goto cleanup;
+ }
+ }
+
+ svm_fifo_enqueue_nowait (f, enq_bytes, &test_data[0]);
+
+ memset (data_buf, 0, vec_len (data_buf));
+ for (i = 0; i <= n_deqs; i++)
+ svm_fifo_dequeue_nowait (f, deq_bytes, data_buf + i * deq_bytes);
+
+ rv = compare_data (data_buf, test_data, 0, vec_len (test_data),
+ (u32 *) & j);
+ if (rv)
+ vlib_cli_output (vm, "[%d] dequeued %u expected %u", j, data_buf[j],
+ test_data[j]);
+ SFIFO_TEST ((rv == 0), "dequeued compared to original returned %d", rv);