--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/irc_queue.c Mon May 04 20:55:04 2009 +0300
@@ -0,0 +1,76 @@
+/**
+ * @file
+ *
+ * Test functions for the irc_queue module
+ */
+#include "test.h"
+#include "transport.h"
+
+#include "../irc_queue.h"
+
+static struct line_proto_callbacks _lp_callbacks = {
+ .on_line = NULL,
+ .on_error = NULL
+};
+
+void test_irc_queue (void)
+{
+ struct transport_test *tp = transport_test_create(NULL);
+ transport_t *transport = transport_test_cast(tp);
+ struct line_proto *lp;
+ struct irc_queue *queue;
+ struct irc_queue_entry *queue_entry;
+ struct error_info err;
+
+ // create the lp
+ assert_success(line_proto_create(&lp, transport, 128, &_lp_callbacks, NULL, &err));
+
+ // create the queue
+ assert_success(irc_queue_create(&queue, _test_ctx.ev_base, lp, &err));
+
+ struct irc_line line = {
+ NULL, "TEST", { "fooX" }
+ };
+
+ // then test simple writes, we should be able to push five lines directly
+ log_info("test irc_queue_process (irc_queue_send_direct)");
+ line.args[0] = "foo0"; assert_success(irc_queue_process(queue, &line));
+ line.args[0] = "foo1"; assert_success(irc_queue_process(queue, &line));
+ line.args[0] = "foo2"; assert_success(irc_queue_process(queue, &line));
+ line.args[0] = "foo3"; assert_success(irc_queue_process(queue, &line));
+ line.args[0] = "foo4"; assert_success(irc_queue_process(queue, &line));
+
+ // they should all be output
+ assert_transport_data(tp,
+ "TEST foo0\r\n"
+ "TEST foo1\r\n"
+ "TEST foo2\r\n"
+ "TEST foo3\r\n"
+ "TEST foo4\r\n"
+ );
+
+ // then enqueue
+ log_info("test irc_queue_process (irc_queue_put)");
+ line.args[0] = "foo5"; assert_success(irc_queue_process(queue, &line));
+
+ // ensure it was enqueued
+ assert((queue_entry = TAILQ_FIRST(&queue->list)) != NULL);
+ assert_strcmp(queue_entry->line_buf, "TEST foo5\r\n");
+
+ // ensure timer is set
+ assert(event_pending(queue->ev, EV_TIMEOUT, NULL));
+
+ // run the event loop to let the timer run
+ log_info("running the event loop once...");
+ assert(event_base_loop(_test_ctx.ev_base, EVLOOP_ONCE) == 0);
+
+ // test to check that the line was now sent
+ log_info("checking that the delayed line was sent...");
+ assert_transport_data(tp, "TEST foo5\r\n");
+ assert(TAILQ_EMPTY(&queue->list));
+ assert(!event_pending(queue->ev, EV_TIMEOUT, NULL));
+
+ // cleanup
+ irc_queue_destroy(queue);
+}
+