diff --git a/.gitignore b/.gitignore index 2fa2e80..46b9586 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ /examples/raw_receiver /examples/raw_sender /tests/test_main +/tests/test_alternatively_push_and_pop_one_frame_messages_with_jump /tests/test_cons_pops_buffer_start /tests/test_cons_reaches_queue_end /tests/test_prod_jumps_to_buffer_start_and_pushes_too_long_message diff --git a/Makefile.am b/Makefile.am index 577294e..0cef341 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,6 +10,7 @@ lib_LIBRARIES = libshmemq.a TESTS = \ tests/test_main \ + tests/test_alternatively_push_and_pop_one_frame_messages_with_jump \ tests/test_cons_pops_buffer_start \ tests/test_cons_reaches_queue_end \ tests/test_prod_jumps_to_buffer_start_and_pushes_too_long_message \ @@ -33,6 +34,10 @@ examples_raw_sender_SOURCES = \ $(libshmemq_a_SOURCES) \ examples/raw_sender.c +tests_test_alternatively_push_and_pop_one_frame_messages_with_jump_SOURCES = \ + $(libshmemq_a_SOURCES) \ + tests/test_alternatively_push_and_pop_one_frame_messages_with_jump.c + tests_test_main_SOURCES = \ $(libshmemq_a_SOURCES) \ tests/test_main.c diff --git a/tests/test_alternatively_push_and_pop_one_frame_messages_with_jump.c b/tests/test_alternatively_push_and_pop_one_frame_messages_with_jump.c new file mode 100644 index 0000000..021952d --- /dev/null +++ b/tests/test_alternatively_push_and_pop_one_frame_messages_with_jump.c @@ -0,0 +1,89 @@ +#include + +#include +#include +#include + +static const char name[] = "/foobar"; + +static ShmemqError error = SHMEMQ_ERROR_NONE; +static Shmemq consumer = NULL; +static Shmemq producer = NULL; + +static void on_exit(); +static void on_signal(int signo); + +int main() +{ + atexit(on_exit); + signal(SIGABRT, on_signal); + + consumer = shmemq_new(name, true, &error); + assert(error == SHMEMQ_ERROR_NONE); + + producer = shmemq_new(name, false, &error); + assert(error == SHMEMQ_ERROR_NONE); + + for (unsigned i = 0; i < 125; ++i) { + { + const ShmemqFrame frame = shmemq_push_start(producer); + assert(frame != NULL); + + *(unsigned*)frame->data = i; + + shmemq_push_end(producer, sizeof(unsigned), &error); + assert(error == SHMEMQ_ERROR_NONE); + } + + { + const ShmemqFrame frame = shmemq_pop_start(consumer); + assert(frame != NULL); + + assert(*(unsigned*)frame->data == i); + + shmemq_pop_end(consumer, &error); + assert(error == SHMEMQ_ERROR_NONE); + } + } + + { + const ShmemqFrame frame = shmemq_pop_start(consumer); + assert(frame == NULL); + } + + { + const ShmemqFrame frame = shmemq_push_start(producer); + assert(frame != NULL); + + shmemq_push_end(producer, 77 * SHMEMQ_FRAME_SIZE, &error); + assert(error == SHMEMQ_ERROR_BUG_PUSH_END_OVERFLOW); + } + + { + const ShmemqFrame frame = shmemq_push_start(producer); + assert(frame != NULL); + + shmemq_push_end(producer, 76 * SHMEMQ_FRAME_SIZE, &error); + assert(error == SHMEMQ_ERROR_NONE); + } + + return 0; +} + +void on_exit() +{ + if (consumer) { + SHMEMQ_DELETE(consumer, &error); + assert(error == SHMEMQ_ERROR_NONE); + } + + if (producer) { + SHMEMQ_DELETE(producer, &error); + assert(error == SHMEMQ_ERROR_NONE); + } +} + +void on_signal(const int signo __attribute__((unused))) +{ + on_exit(); +}