From ec0de69f59947abe88cdfd16ab90ec7c0dc0e532 Mon Sep 17 00:00:00 2001 From: William Brown Date: Dec 26 2016 09:47:02 +0000 Subject: Random data tests --- diff --git a/src/sds/queue/queue.c b/src/sds/queue/queue.c index b8389fb..9fb9a4b 100644 --- a/src/sds/queue/queue.c +++ b/src/sds/queue/queue.c @@ -28,9 +28,12 @@ sds_queue_init(sds_queue **q_ptr) { sds_result sds_queue_enqueue(sds_queue *q, void *elem) { +#ifdef DEBUG + sds_log("sds_queue_dequeue", "Queue %p - <== enqueuing", q); +#endif sds_queue_node *node = sds_malloc(sizeof(sds_queue_node)); #ifdef DEBUG - sds_log("sds_queue_enqueue", "Queueing ptr %p to %p", elem, node); + sds_log("sds_queue_enqueue", "Queue %p - Queueing ptr %p to %p", q, elem, node); #endif node->element = elem; node->next = q->tail; @@ -39,13 +42,13 @@ sds_queue_enqueue(sds_queue *q, void *elem) { } else { /* If tail is null, head must ALSO be null. */ #ifdef DEBUG - sds_log("sds_queue_enqueue", "Queue %p is empty, adding %p to head and tail", q, node); + sds_log("sds_queue_enqueue", "Queue %p - empty, adding %p to head and tail", q, node); #endif q->head = node; } q->tail = node; #ifdef DEBUG - sds_log("sds_queue_enqueue", "Complete, Queue %p head: %p tail: %p", q, q->head, q->tail); + sds_log("sds_queue_enqueue", "Queue %p - complete head: %p tail: %p", q, q->head, q->tail); #endif return SDS_SUCCESS; } @@ -54,20 +57,32 @@ sds_queue_enqueue(sds_queue *q, void *elem) { sds_result sds_queue_dequeue(sds_queue *q, void **elem) { +#ifdef DEBUG + sds_log("sds_queue_dequeue", "Queue %p - ==> dequeuing", q); +#endif if (elem == NULL) { +#ifdef DEBUG + sds_log("sds_queue_dequeue", "Queue %p - NULL pointer for **elem", q); +#endif return SDS_NULL_POINTER; } if (q->head == NULL) { +#ifdef DEBUG + sds_log("sds_queue_dequeue", "Queue %p - queue exhausted.", q); +#endif return SDS_LIST_EXHAUSTED; } sds_queue_node *node = q->head; *elem = node->element; - q->head = node->next; + q->head = node->prev; sds_free(node); if (q->head == NULL) { // If we have no head node, we also have no tail. q->tail = NULL; } +#ifdef DEBUG + sds_log("sds_queue_dequeue", "Queue %p - complete head: %p tail: %p", q, q->head, q->tail); +#endif return SDS_SUCCESS; } @@ -80,10 +95,10 @@ sds_queue_dequeue(sds_queue *q, void **elem) { sds_result sds_queue_destroy(sds_queue *q) { +#ifdef DEBUG + sds_log("sds_queue_destroy", "Queue %p - destroying", q); +#endif /* Map over the queue and free the elements. */ - - /* opps! This is a better fix! */ - /* With more lines! */ sds_queue_node *node = q->head; sds_queue_node *prev = NULL; while (node != NULL) { diff --git a/test/test_sds_queue.c b/test/test_sds_queue.c index d462362..576ca28 100644 --- a/test/test_sds_queue.c +++ b/test/test_sds_queue.c @@ -21,6 +21,8 @@ test_2_queue_enqueue(void **state) { sds_result result = SDS_SUCCESS; result = sds_queue_enqueue(q, (void *)1); assert_int_equal(result, SDS_SUCCESS); + assert_ptr_not_equal(q->head, NULL); + assert_ptr_not_equal(q->tail, NULL); } static void @@ -41,8 +43,85 @@ test_3_queue_enqueue_multiple(void **state) { } static void -test_2_queue_invalid_dequeue(void **state) { +test_4_queue_invalid_dequeue(void **state) { sds_queue *q = *state; + sds_result result = SDS_SUCCESS; + void *ptr = NULL; + /* Attempt a dequeue on a list with no elements. */ + result = sds_queue_dequeue(q, &ptr); + assert_int_equal(result, SDS_LIST_EXHAUSTED); + /* Attempt a dequeue on a list with an element, but null ptr */ + result = sds_queue_enqueue(q, (void *)NULL); + assert_int_equal(result, SDS_SUCCESS); + result = sds_queue_dequeue(q, NULL); + assert_int_equal(result, SDS_NULL_POINTER); +} + +static void +test_5_queue_dequeue(void **state) { + sds_queue *q = *state; + sds_result result = SDS_SUCCESS; + void *ptr = NULL; + result = sds_queue_enqueue(q, (void *)NULL); + assert_int_equal(result, SDS_SUCCESS); + /* Attempt a dequeue on a list with 1 element. */ + result = sds_queue_dequeue(q, &ptr); + assert_int_equal(result, SDS_SUCCESS); + assert_ptr_equal(ptr, NULL); + assert_ptr_equal(q->head, NULL); + assert_ptr_equal(q->tail, NULL); + /* Attempt a dequeue on a list with no elements. */ + result = sds_queue_dequeue(q, &ptr); + assert_int_equal(result, SDS_LIST_EXHAUSTED); + assert_ptr_equal(q->head, NULL); + assert_ptr_equal(q->tail, NULL); +} + +static void +test_6_queue_dequeue_multiple(void **state) { + sds_queue *q = *state; + sds_result result = SDS_SUCCESS; + uint64_t ptr = 0; + + for (uint64_t i = 0; i < 100; i++) { + result = sds_queue_enqueue(q, (void *)i); + assert_int_equal(result, SDS_SUCCESS); + } + /* Take a ref to the tail */ + sds_queue_node *tail = q->tail; + for (uint64_t i = 0; i < 99; i++) { + result = sds_queue_dequeue(q, (void **)&ptr); + assert_int_equal(result, SDS_SUCCESS); + assert_int_equal(ptr, i); + assert_ptr_equal(tail, q->tail); + } + /* Attempt a dequeue on a list with 1 element. */ + result = sds_queue_dequeue(q, (void **)&ptr); + assert_int_equal(result, SDS_SUCCESS); + assert_int_equal(ptr, 99); + assert_ptr_equal(q->head, NULL); + assert_ptr_equal(q->tail, NULL); + +} + +static void +test_7_queue_random(void **state) { + sds_queue *q = *state; + sds_result result = SDS_SUCCESS; + uint64_t ptr = 0; + + for (size_t i = 0; i < 200; i++) { + if (fill_pattern[i] % 2 != 0) { + result = sds_queue_dequeue(q, (void **)&ptr); + if (result != SDS_SUCCESS && result != SDS_LIST_EXHAUSTED) { + assert_null(1); + } + } else { + result = sds_queue_enqueue(q, (void *)fill_pattern[i]); + assert_int_equal(result, SDS_SUCCESS); + } + } + } int @@ -55,6 +134,18 @@ run_queue_tests (void) { cmocka_unit_test_setup_teardown(test_3_queue_enqueue_multiple, queue_test_setup, queue_test_teardown), + cmocka_unit_test_setup_teardown(test_4_queue_invalid_dequeue, + queue_test_setup, + queue_test_teardown), + cmocka_unit_test_setup_teardown(test_5_queue_dequeue, + queue_test_setup, + queue_test_teardown), + cmocka_unit_test_setup_teardown(test_6_queue_dequeue_multiple, + queue_test_setup, + queue_test_teardown), + cmocka_unit_test_setup_teardown(test_7_queue_random, + queue_test_setup, + queue_test_teardown), }; return cmocka_run_group_tests(tests, NULL, NULL); }