diff options
Diffstat (limited to 'tests/it_q/it_q_test.c')
-rw-r--r-- | tests/it_q/it_q_test.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/it_q/it_q_test.c b/tests/it_q/it_q_test.c new file mode 100644 index 00000000..6025e392 --- /dev/null +++ b/tests/it_q/it_q_test.c @@ -0,0 +1,159 @@ +#include <stdio.h> +#include <errno.h> + +#include <osmocom/core/talloc.h> +#include <osmocom/core/utils.h> +#include <osmocom/core/it_q.h> + +struct it_q_test1 { + struct llist_head list; + int *foo; +}; + +struct it_q_test2 { + int foo; + struct llist_head list; +}; + +#define ENTER_TC printf("\n== Entering test case %s\n", __func__) + +static void tc_alloc(void) +{ + struct osmo_it_q *q1, *q2; + + ENTER_TC; + + printf("allocating q1\n"); + q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", 3, NULL, NULL); + OSMO_ASSERT(q1); + + /* ensure that no duplicate allocation for the */ + printf("attempting duplicate allocation of qa\n"); + q2 = osmo_it_q_alloc(OTC_GLOBAL, "q1", 3, NULL, NULL); + OSMO_ASSERT(!q2); + + /* ensure that same name can be re-created after destroying old one */ + osmo_it_q_destroy(q1); + printf("re-allocating q1\n"); + q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", 3, NULL, NULL); + OSMO_ASSERT(q1); + + osmo_it_q_destroy(q1); +} + +static void tc_queue_length(void) +{ + struct osmo_it_q *q1; + unsigned int qlen = 3; + struct it_q_test1 *item; + int i, rc; + + ENTER_TC; + + printf("allocating q1\n"); + q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", qlen, NULL, NULL); + OSMO_ASSERT(q1); + + printf("adding queue entries up to the limit\n"); + for (i = 0; i < qlen; i++) { + item = talloc_zero(OTC_GLOBAL, struct it_q_test1); + rc = osmo_it_q_enqueue(q1, item, list); + OSMO_ASSERT(rc == 0); + } + printf("attempting to add more than the limit\n"); + item = talloc_zero(OTC_GLOBAL, struct it_q_test1); + rc = osmo_it_q_enqueue(q1, item, list); + OSMO_ASSERT(rc == -ENOSPC); + + osmo_it_q_destroy(q1); +} + +static void tc_enqueue_dequeue(void) +{ + const unsigned int qlen = 12; + struct it_q_test1 *item; + struct osmo_it_q *q1; + int rc; + + ENTER_TC; + + printf("allocating q1\n"); + q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", 12, NULL, NULL); + OSMO_ASSERT(q1); + + printf("try dequeueing from an empty queue\n"); + osmo_it_q_dequeue(q1, &item, list); + OSMO_ASSERT(item == NULL); + + printf("adding queue entries up to the limit\n"); + for (unsigned int i = 0; i < qlen; i++) { + item = talloc_zero(OTC_GLOBAL, struct it_q_test1); + rc = osmo_it_q_enqueue(q1, item, list); + OSMO_ASSERT(rc == 0); + } + + printf("removing queue entries up to the limit\n"); + for (unsigned int i = 0; i < qlen; i++) { + osmo_it_q_dequeue(q1, &item, list); + OSMO_ASSERT(item != NULL); + talloc_free(item); + } + + printf("try dequeueing from an empty queue\n"); + osmo_it_q_dequeue(q1, &item, list); + OSMO_ASSERT(item == NULL); + + osmo_it_q_destroy(q1); +} + +static int g_read_cb_count; + +static void q_read_cb(struct osmo_it_q *q, struct llist_head *item) +{ + struct it_q_test1 *it = container_of(item, struct it_q_test1, list); + *it->foo += 1; + talloc_free(item); +} + +static void tc_eventfd(void) +{ + struct osmo_it_q *q1; + unsigned int qlen = 30; + struct it_q_test1 *item; + int i, rc; + + ENTER_TC; + + printf("allocating q1\n"); + q1 = osmo_it_q_alloc(OTC_GLOBAL, "q1", qlen, q_read_cb, NULL); + OSMO_ASSERT(q1); + osmo_fd_register(&q1->event_ofd); + + /* ensure read-cb isn't called unless we enqueue something */ + osmo_select_main(1); + OSMO_ASSERT(g_read_cb_count == 0); + + /* ensure read-cb is called for each enqueued msg once */ + printf("adding %u queue entries up to the limit\n", qlen); + for (i = 0; i < qlen; i++) { + item = talloc_zero(OTC_GLOBAL, struct it_q_test1); + item->foo = &g_read_cb_count; + rc = osmo_it_q_enqueue(q1, item, list); + OSMO_ASSERT(rc == 0); + } + + osmo_select_main(1); + printf("%u entries were dequeued\n", qlen); + OSMO_ASSERT(g_read_cb_count == qlen); + + osmo_it_q_destroy(q1); +} + +int main(int argc, char **argv) +{ + tc_alloc(); + tc_queue_length(); + tc_enqueue_dequeue(); + tc_eventfd(); + return 0; +} |