#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);

#if 0
	printf("try dequeueing from an empty queue\n");
	osmo_it_q_dequeue(q1, &item, list);
	OSMO_ASSERT(item == NULL);
#endif

	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);
	}

#if 0
	printf("try dequeueing from an empty queue\n");
	osmo_it_q_dequeue(q1, &item, list);
	OSMO_ASSERT(item == NULL);
#endif

	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;
}
