update test.c to reflect new transport stuff new-transport
authorTero Marttila <terom@fixme.fi>
Sun, 03 May 2009 17:19:36 +0300
branchnew-transport
changeset 167 0d2d8ca879d8
parent 166 cb8cb023cf06
child 168 a58ad50911fc
update test.c to reflect new transport stuff
src/CMakeLists.txt
src/test.c
--- a/src/CMakeLists.txt	Sun May 03 17:19:05 2009 +0300
+++ b/src/CMakeLists.txt	Sun May 03 17:19:36 2009 +0300
@@ -17,7 +17,7 @@
 set (CONSOLE_SOURCES console.c lua_console.c)
 
 set (NEXUS_SOURCES nexus.c ${CORE_SOURCES} ${IO_SOURCES} ${IRC_SOURCES} ${LUA_SOURCES} ${CONSOLE_SOURCES} signals.c module.c config.c)
-set (TEST_SOURCES test.c ${CORE_SOURCES} ${IO_SOURCES} ${IRC_SOURCES})
+set (TEST_SOURCES test.c ${CORE_SOURCES} ${IO_SOURCES} transport_test.c ${IRC_SOURCES})
 set (IRC_LOG_SOURCES modules/irc_log.c)
 set (LOGWATCH_SOURCES modules/logwatch.c modules/logwatch_source.c modules/logwatch_filter.c modules/logwatch_chan.c)
 
--- a/src/test.c	Sun May 03 17:19:05 2009 +0300
+++ b/src/test.c	Sun May 03 17:19:36 2009 +0300
@@ -1,11 +1,12 @@
 /**
  * The main test code entry point
  */
-#include "sock_test.h"
+#include "transport_test.h"
 #include "line_proto.h"
 #include "irc_queue.h"
 #include "irc_conn.h"
 #include "irc_net.h"
+#include "fifo.h"
 #include "log.h"
 #include "str.h"
 #include "error.h"
@@ -114,50 +115,51 @@
         FATAL("error: <%s> != <%s>", error_msg(is), error_msg(should_be));
 }
 
-void assert_sock_read (struct sock_stream *sock, const char *str)
+void assert_transport_read (transport_t *transport, const char *str)
 {
-    char buf[strlen(str)];
+    size_t len = strlen(str);
+    char buf[len];
+    error_t err;
 
-    log_debug("read: %p: %s", sock, dump_str(str));
+    log_debug("read: %p: %s", transport, dump_str(str));
     
     // read it
-    assert(sock_stream_read(sock, buf, strlen(str)) == (int) strlen(str));
+    assert(transport_read(transport, buf, len, &err) == (int) len);
 
     // cmp
-    assert_strncmp(buf, str, strlen(str));
+    assert_strncmp(buf, str, len);
 }
 
-void assert_sock_write (struct sock_stream *sock, const char *str)
+void assert_transport_write (transport_t *transport, const char *str)
 {
-    log_debug("write: %p: %s", sock, dump_str(str));
+    size_t len = strlen(str);
+    error_t err;
+
+    log_debug("write: %p: %s", transport, dump_str(str));
 
     // write it
-    assert(sock_stream_write(sock, str, strlen(str)) == (int) strlen(str));
+    assert(transport_write(transport, str, len, &err) == (int) len);
 }
 
-void assert_sock_eof (struct sock_stream *sock)
+void assert_transport_eof (transport_t *transport)
 {
     char buf;
+    error_t err;
 
-    log_debug("eof: %p", sock);
+    log_debug("eof: %p", transport);
 
-    assert_err(-sock_stream_read(sock, &buf, 1), ERR_READ_EOF);
+    assert_err(-transport_read(transport, &buf, 1, &err), ERR_EOF);
 }
 
-/**
- * Maximum amount that can be pushed using test_sock_push
- */
-#define TEST_SOCK_FMT_MAX 1024
-
-void assert_sock_data (struct sock_test *sock, const char *fmt, ...)
+void assert_transport_data (struct transport_test *tp, const char *fmt, ...)
 {
-    char buf[TEST_SOCK_FMT_MAX];
+    char buf[TRANSPORT_TEST_FMT_MAX];
     va_list vargs;
     size_t len;
     
     va_start(vargs, fmt);
 
-    if ((len = vsnprintf(buf, TEST_SOCK_FMT_MAX, fmt, vargs)) >= TEST_SOCK_FMT_MAX)
+    if ((len = vsnprintf(buf, TRANSPORT_TEST_FMT_MAX, fmt, vargs)) >= TRANSPORT_TEST_FMT_MAX)
         FATAL("input too long: %zu bytes", len);
 
     va_end(vargs);
@@ -165,9 +167,9 @@
     // get the data out
     char *out;
     
-    sock_test_get_send_data(sock, &out, &len);
+    transport_test_pull_buf(tp, &out, &len);
     
-    log_debug("get_send_data: %s", dump_strn(out, len));
+    log_debug("pull_buf: %s", dump_strn(out, len));
     
     // should be the same
     assert_strncmp(out, buf, len);
@@ -178,27 +180,6 @@
 }
 
 /**
- * Nicer name for test_sock_add_recv_str, also supports formatted data.
- *
- * The formatted result is limited to TEST_SOCK_PUSH_MAX bytes
- */
-void test_sock_push (struct sock_test *sock, const char *fmt, ...)
-{
-    char buf[TEST_SOCK_FMT_MAX];
-    va_list vargs;
-    size_t len;
-    
-    va_start(vargs, fmt);
-
-    if ((len = vsnprintf(buf, TEST_SOCK_FMT_MAX, fmt, vargs)) >= TEST_SOCK_FMT_MAX)
-        FATAL("output too long: %zu bytes", len);
-
-    va_end(vargs);
-
-    return sock_test_add_recv_str(sock, buf);
-}
-
-/**
  * Setup the global sock_stream state
  */
 struct event_base* setup_sock (void)
@@ -213,15 +194,15 @@
 }
 
 /**
- * Create an empty sock_test
+ * Create an empty transport_test
  */
-struct sock_test* setup_sock_test (void)
+struct transport_test* setup_transport_test ()
 {
-    struct sock_test *sock;
+    struct transport_test *tp;
    
-    assert ((sock = sock_test_create()) != NULL);
+    assert ((tp = transport_test_create(NULL)) != NULL);
 
-    return sock;
+    return tp;
 }
 
 void assert_str_quote (size_t buf_size, const char *data, ssize_t len, const char *target, size_t out)
@@ -300,41 +281,42 @@
     log_debug("quote: %s", dump_str("foo\\bar'quux"));
 }
 
-void test_sock_test (void)
+void test_transport_test (void)
 {
-    struct sock_test *sock = sock_test_create();
-    struct io_vec _read_data[] = {
-        {   "foo",      3   },
-        {   "barx",     4   }
-    };
-    const char *_write_data = "test data";
-    
+    struct transport_info info = { NULL, NULL, 0 };
+    struct transport_test *tp = transport_test_create(&info);
+    transport_t *transport = transport_test_cast(tp);
+
     // put the read data
-    log_debug("set_recv_buffer: %p, %d", _read_data, 2);
-    sock_test_set_recv_buffer(sock, _read_data, 2, true);
+    log_info("test transport_test_push_*");
+    transport_test_push_buf(tp, "foo", 3);
+    transport_test_push_str(tp, "barx");
+    transport_test_push_fmt(tp, "xx %s xx", "quux");
+    transport_test_push_eof(tp);
     
     // read it out
-    log_info("test sock_test_read");
+    log_info("test transport_test_read");
 
-    assert_sock_read(SOCK_TEST_BASE(sock), "foo");
-    assert_sock_read(SOCK_TEST_BASE(sock), "ba");
-    assert_sock_read(SOCK_TEST_BASE(sock), "rx");
-    assert_sock_eof(SOCK_TEST_BASE(sock));
+    assert_transport_read(transport, "foo");
+    assert_transport_read(transport, "ba");
+    assert_transport_read(transport, "rx");
+    assert_transport_read(transport, "xx quux xx");
+    assert_transport_eof(transport);
 
-    // write the data in
-    log_info("test sock_test_write");
+    // write some data in
+    log_info("test transport_test_write");
 
-    assert_sock_write(SOCK_TEST_BASE(sock), "test ");
-    assert_sock_write(SOCK_TEST_BASE(sock), "data");
+    assert_transport_write(transport, "test ");
+    assert_transport_write(transport, "data");
     
     // check output
-    assert_sock_data(sock, _write_data);
+    log_info("test transport_test_pull_*");
 
-    // check output
-    assert_sock_data(sock, "");
+    assert_transport_data(tp, "test data");
+    assert_transport_data(tp, "");
 
     // cleanup
-    sock_test_destroy(sock);
+    transport_test_destroy(tp);
 }
 
 void assert_read_line (struct line_proto *lp, const char *line_str)
@@ -390,24 +372,22 @@
 
 void test_line_proto (void)
 {
-    struct sock_test *sock = sock_test_create();
-    struct io_vec _read_data[] = {
-        {   "hello\r\n",    7   },
-        {   "world\n",      6   },
-        {   "this ",        5   },
-        {   "is a line\r",  10  },
-        {   "\nfragment",   9   },
-    }, _trailing_data = {   "\r\n",     2 };
+    struct transport_test *tp = transport_test_create(NULL);
+    transport_t *transport = transport_test_cast(tp);
     struct line_proto *lp;
     struct _lp_test_ctx ctx;
     struct error_info err;
     
     // put the read data
-    log_debug("set_recv_buffer: %p, %d", _read_data, 5);
-    sock_test_set_recv_buffer(sock, _read_data, 5, false);
-    
+    log_debug("transport_test_push_*");
+    transport_test_push_str(tp, "hello\r\n");
+    transport_test_push_str(tp, "world\n");
+    transport_test_push_str(tp, "this ");
+    transport_test_push_str(tp, "is a line\r");
+    transport_test_push_str(tp, "\nfragment");
+
     // create the lp
-    assert_success(line_proto_create(&lp, SOCK_TEST_BASE(sock), 128, &_lp_callbacks, &ctx, &err));
+    assert_success(line_proto_create(&lp, transport, 128, &_lp_callbacks, &ctx, &err));
     
     log_info("test line_proto_recv");
 
@@ -421,34 +401,35 @@
     log_info("test on_line");
 
     ctx.line = "fragment";
-    sock_test_add_recv_vec(sock, _trailing_data);
+    transport_test_push_str(tp, "\r\n");
     assert_strnull(ctx.line);
 
     // test writing
     log_info("test line_proto_send");
     assert_success(-line_proto_send(lp, "foobar\r\n"));
     assert_success(-line_proto_send(lp, "quux\r\n"));
-    assert_sock_data(sock, "foobar\r\nquux\r\n");
+    assert_transport_data(tp, "foobar\r\nquux\r\n");
 
     // XXX: test partial writes
 
     // cleanup
-    line_proto_release(lp);
+    line_proto_destroy(lp);
 }
 
 void test_irc_queue (void)
 {
-    struct sock_test *sock = sock_test_create();
+    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, SOCK_TEST_BASE(sock), 128, &_lp_callbacks, NULL, &err));
+    assert_success(line_proto_create(&lp, transport, 128, &_lp_callbacks, NULL, &err));
 
     // create the queue
-    assert_success(irc_queue_create(&queue, lp, &err));
+    assert_success(irc_queue_create(&queue, _test_ctx.ev_base, lp, &err));
 
     struct irc_line line = {
         NULL, "TEST", { "fooX" }
@@ -463,7 +444,7 @@
     line.args[0] = "foo4"; assert_success(irc_queue_process(queue, &line));
 
     // they should all be output
-    assert_sock_data(sock, 
+    assert_transport_data(tp,
             "TEST foo0\r\n"
             "TEST foo1\r\n"
             "TEST foo2\r\n"
@@ -488,7 +469,7 @@
 
     // test to check that the line was now sent
     log_info("checking that the delayed line was sent...");
-    assert_sock_data(sock, "TEST foo5\r\n");
+    assert_transport_data(tp, "TEST foo5\r\n");
     assert(TAILQ_EMPTY(&queue->list));
     assert(!event_pending(queue->ev, EV_TIMEOUT, NULL));
 
@@ -539,7 +520,8 @@
 {
     struct test_conn_ctx *ctx = arg;
 
-    assert_null(line->source);
+    assert(line->source);
+    assert(!line->source->nickname && !line->source->username && line->source->hostname);
     assert_strcmp(line->command, "TEST");
     assert_strcmp(line->args[0], "arg0");
     assert_strnull(line->args[1]);
@@ -563,7 +545,7 @@
 /**
  * Create and return a new irc_conn with the given ctx (will be initialized to zero).
  */
-struct irc_conn* setup_irc_conn (struct sock_test *sock, bool noisy, struct test_conn_ctx *ctx)
+struct irc_conn* setup_irc_conn (struct transport_test *tp, bool noisy, struct test_conn_ctx *ctx)
 {
     struct irc_conn *conn;
     struct error_info err;
@@ -575,16 +557,16 @@
     memset(ctx, 0, sizeof(*ctx));
 
     // create the irc_conn
-    assert_success(irc_conn_create(&conn, SOCK_TEST_BASE(sock), &_conn_callbacks, ctx, &err));
+    assert_success(irc_conn_create(&conn, transport_test_cast(tp), &_conn_callbacks, ctx, &err));
 
     // test register
     if (noisy) log_info("test irc_conn_register");
     assert_success(irc_conn_register(conn, &register_info));
-    assert_sock_data(sock, "NICK nick\r\nUSER user 0 * realname\r\n");
+    assert_transport_data(tp, "NICK nick\r\nUSER user 0 * realname\r\n");
  
     // test on_register callback    
     if (noisy) log_info("test irc_conn_callbacks.on_register");
-    test_sock_push(sock, "001 mynick :Blaa blaa blaa\r\n");
+    transport_test_push_str(tp, "001 mynick :Blaa blaa blaa\r\n");
     if (ctx) assert(ctx->on_registered);
     assert_strcmp(conn->nickname, "mynick");
    
@@ -595,8 +577,8 @@
 void test_irc_conn (void)
 {
     struct test_conn_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_conn *conn = setup_irc_conn(sock, true, &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_conn *conn = setup_irc_conn(tp, true, &ctx);
 
     // add our test handlers
     assert_success(irc_conn_add_cmd_handlers(conn, _conn_handlers, &ctx));
@@ -604,22 +586,22 @@
     // test on_TEST handler
     // XXX: come up with a better prefix
     log_info("test irc_conn.handlers");
-    test_sock_push(sock, ":foobar-prefix TEST arg0\r\n");
+    transport_test_push_str(tp, ":foobar-prefix TEST arg0\r\n");
     assert(ctx.on_TEST);
 
     // test PING/PONG
     log_info("test PING/PONG");
-    test_sock_push(sock, "PING foo\r\n");
-    assert_sock_data(sock, "PONG foo\r\n");
+    transport_test_push_str(tp, "PING foo\r\n");
+    assert_transport_data(tp, "PONG foo\r\n");
 
     // quit nicely
     log_info("test QUIT");
     assert_success(irc_conn_QUIT(conn, "bye now"));
-    assert_sock_data(sock, "QUIT :bye now\r\n");
+    assert_transport_data(tp, "QUIT :bye now\r\n");
     assert(conn->quitting);
 
-    test_sock_push(sock, "ERROR :Closing Link: Quit\r\n");
-    sock_test_set_recv_eof(sock);
+    transport_test_push_str(tp, "ERROR :Closing Link: Quit\r\n");
+    transport_test_push_eof(tp);
     assert(conn->quit && !conn->quitting && !conn->registered);
     assert(ctx.on_quit);
     assert(!ctx.on_error);
@@ -631,11 +613,11 @@
 void test_irc_conn_self_nick (void)
 {
     struct test_conn_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_conn *conn = setup_irc_conn(sock, false, &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_conn *conn = setup_irc_conn(tp, false, &ctx);
     
     log_info("test irc_conn_on_NICK");
-    test_sock_push(sock, ":mynick!user@somehost NICK mynick2\r\n");
+    transport_test_push_fmt(tp, ":mynick!user@somehost NICK mynick2\r\n");
     assert_strcmp(conn->nickname, "mynick2");
 
     // cleanup
@@ -702,7 +684,7 @@
 /**
  * Setup an irc_net using the given socket, and consume the register request output, but do not push the RPL_WELCOME
  */
-struct irc_net* setup_irc_net_unregistered (struct sock_test *sock)
+struct irc_net* setup_irc_net_unregistered (struct transport_test *tp)
 {
     struct irc_net *net;
     struct irc_net_info net_info = {
@@ -713,11 +695,11 @@
     struct error_info err;
 
     // create the irc_net
-    net_info.raw_sock = SOCK_TEST_BASE(sock);
+    net_info.transport = transport_test_cast(tp);
     assert_success(irc_net_create(&net, &net_info, &err));
 
     // test register output
-    assert_sock_data(sock, "NICK nick\r\nUSER user 0 * realname\r\n");
+    assert_transport_data(tp, "NICK nick\r\nUSER user 0 * realname\r\n");
     
     // ok
     return net; 
@@ -726,10 +708,10 @@
 /**
  * Push to RPL_WELCOME reply, and test state
  */
-void do_irc_net_welcome (struct sock_test *sock, struct irc_net *net)
+void do_irc_net_welcome (struct transport_test *tp, struct irc_net *net)
 {
     // registration reply
-    test_sock_push(sock, "001 mynick :Blaa blaa blaa\r\n");
+    transport_test_push_fmt(tp, "001 mynick :Blaa blaa blaa\r\n");
     assert(net->conn->registered);
     assert_strcmp(net->conn->nickname, "mynick");
 
@@ -738,12 +720,12 @@
 /**
  * Creates an irc_net and puts it into the registered state
  */
-struct irc_net* setup_irc_net (struct sock_test *sock)
+struct irc_net* setup_irc_net (struct transport_test *tp)
 {
     struct irc_net *net;   
 
-    net = setup_irc_net_unregistered(sock);
-    do_irc_net_welcome(sock, net);
+    net = setup_irc_net_unregistered(tp);
+    do_irc_net_welcome(tp, net);
     
     // ok
     return net;
@@ -754,19 +736,19 @@
  */
 void test_irc_net (void)
 {
-    struct sock_test *sock = setup_sock_test();
+    struct transport_test *tp = setup_transport_test();
     
     // create the network
     log_info("test irc_net_create");
-    struct irc_net *net = setup_irc_net_unregistered(sock);
+    struct irc_net *net = setup_irc_net_unregistered(tp);
 
     // send the registration reply
     log_info("test irc_conn_on_RPL_WELCOME");
-    do_irc_net_welcome(sock, net);
+    do_irc_net_welcome(tp, net);
 
     // test errors by setting EOF
     log_info("test irc_net_error");
-    sock_test_set_recv_eof(sock);
+    transport_test_push_eof(tp);
     assert(net->conn == NULL);
 
     // cleanup
@@ -825,14 +807,14 @@
 /**
  * Checks that the JOIN request for a channel was sent, and sends the basic JOIN reply
  */
-void do_irc_chan_join (struct sock_test *sock, struct test_chan_ctx *ctx)
+void do_irc_chan_join (struct transport_test *tp, struct test_chan_ctx *ctx)
 {
     // JOIN request
     assert(ctx->chan->joining);
-    assert_sock_data(sock, "JOIN %s\r\n", ctx->channel);
+    assert_transport_data(tp, "JOIN %s\r\n", ctx->channel);
 
     // JOIN reply
-    test_sock_push(sock, ":mynick!user@host JOIN %s\r\n", ctx->channel);
+    transport_test_push_fmt(tp, ":mynick!user@host JOIN %s\r\n", ctx->channel);
     assert(!ctx->chan->joining && ctx->chan->joined);
     assert(ctx->on_chan_self_join);
 }
@@ -840,12 +822,12 @@
 /**
  * Sends a short RPL_NAMREPLY/RPL_ENDOFNAMES reply and checks that the users list matches
  */
-void do_irc_chan_namreply (struct sock_test *sock, struct test_chan_ctx *ctx)
+void do_irc_chan_namreply (struct transport_test *tp, struct test_chan_ctx *ctx)
 {
     // RPL_NAMREPLY
-    test_sock_push(sock, "353 mynick = %s :mynick userA +userB @userC\r\n", ctx->channel);
-    test_sock_push(sock, "353 mynick = %s :trailingspace \r\n", ctx->channel);
-    test_sock_push(sock, "366 mynick %s :End of NAMES\r\n", ctx->channel);
+    transport_test_push_fmt(tp, "353 mynick = %s :mynick userA +userB @userC\r\n", ctx->channel);
+    transport_test_push_fmt(tp, "353 mynick = %s :trailingspace \r\n", ctx->channel);
+    transport_test_push_fmt(tp, "366 mynick %s :End of NAMES\r\n", ctx->channel);
     
     // XXX: this should be an exclusive test, i.e. these should be the only ones...
     check_chan_user(ctx->chan, "mynick", true);
@@ -857,10 +839,10 @@
 /**
  * Creates an irc_chan on the given irc_net, and checks up to the JOIN reply
  */
-struct irc_chan* setup_irc_chan_join (struct sock_test *sock, struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
+struct irc_chan* setup_irc_chan_join (struct transport_test *tp, struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
 {
     setup_irc_chan_raw(net, channel, ctx);
-    do_irc_chan_join(sock, ctx);
+    do_irc_chan_join(tp, ctx);
 
     // ok
     return ctx->chan;
@@ -869,11 +851,11 @@
 /**
  * Creates an irc_chan on the given irc_net, sends the JOIN stuff plus RPL_NAMREPLY
  */
-struct irc_chan* setup_irc_chan (struct sock_test *sock, struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
+struct irc_chan* setup_irc_chan (struct transport_test *tp, struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
 {
     setup_irc_chan_raw(net, channel, ctx);
-    do_irc_chan_join(sock, ctx);
-    do_irc_chan_namreply(sock, ctx);
+    do_irc_chan_join(tp, ctx);
+    do_irc_chan_namreply(tp, ctx);
 
     // ok
     return ctx->chan;
@@ -888,10 +870,10 @@
 {
     struct test_chan_ctx ctx;
 
-    struct sock_test *sock = setup_sock_test();
+    struct transport_test *tp = setup_transport_test();
 
     log_info("test irc_net_create");
-    struct irc_net *net = setup_irc_net_unregistered(sock);
+    struct irc_net *net = setup_irc_net_unregistered(tp);
 
     // add an offline channel
     log_info("test offline irc_net_add_chan");
@@ -900,11 +882,11 @@
 
     // send the registration reply
     log_info("test irc_conn_on_RPL_WELCOME");
-    do_irc_net_welcome(sock, net);
+    do_irc_net_welcome(tp, net);
     
     // test the join sequence
     log_info("test irc_chan_join/irc_chan_on_JOIN");
-    do_irc_chan_join(sock, &ctx);
+    do_irc_chan_join(tp, &ctx);
     
     // cleanup
     irc_net_destroy(net);
@@ -913,12 +895,12 @@
 void test_irc_chan_namreply (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    setup_irc_chan_join(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    setup_irc_chan_join(tp, net, "#test", &ctx);
 
     log_info("test irc_chan_on_RPL_NAMREPLY");
-    do_irc_chan_namreply(sock, &ctx);
+    do_irc_chan_namreply(tp, &ctx);
 
     // cleanup
     irc_net_destroy(net);
@@ -927,13 +909,13 @@
 void test_irc_chan_user_join (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // have a user join
     log_info("test irc_chan_on_JOIN");
-    test_sock_push(sock, ":newuser!someone@somewhere JOIN %s\r\n", "#test");
+    transport_test_push_fmt(tp, ":newuser!someone@somewhere JOIN %s\r\n", "#test");
     assert(ctx.on_chan_join);
     check_chan_user(chan, "newuser", true);
 
@@ -944,13 +926,13 @@
 void test_irc_chan_user_part (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // have a user join
     log_info("test irc_chan_on_PART");
-    test_sock_push(sock, ":userA!someone@somewhere PART %s\r\n", "#test");
+    transport_test_push_fmt(tp, ":userA!someone@somewhere PART %s\r\n", "#test");
     assert(ctx.on_chan_part); ctx.on_chan_part = NULL;
     check_chan_user(chan, "userA", false);
 
@@ -961,13 +943,13 @@
 void test_irc_chan_user_kick (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // kick a user
     log_info("test irc_chan_on_KICK (other)");
-    test_sock_push(sock, ":userA!someone@somewhere KICK %s userB\r\n", "#test");
+    transport_test_push_fmt(tp, ":userA!someone@somewhere KICK %s userB\r\n", "#test");
     check_chan_user(chan, "userA", true);
     check_chan_user(chan, "userB", false);
 
@@ -978,13 +960,13 @@
 void test_irc_chan_self_kick (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // kick a user
     log_info("test irc_chan_on_KICK (self)");
-    test_sock_push(sock, ":userA!someone@somewhere KICK %s mynick foobar\r\n", "#test");
+    transport_test_push_fmt(tp, ":userA!someone@somewhere KICK %s mynick foobar\r\n", "#test");
     assert(!chan->joined);
     assert(chan->kicked);
 
@@ -995,13 +977,13 @@
 void test_irc_chan_user_nick (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // rename one of the users
     log_info("test irc_net_on_chanuser");
-    test_sock_push(sock, ":userA!someone@somewhere NICK userA2\r\n");
+    transport_test_push_fmt(tp, ":userA!someone@somewhere NICK userA2\r\n");
     check_chan_user(chan, "userA", false);
     check_chan_user(chan, "userB", true);
 
@@ -1012,13 +994,13 @@
 void test_irc_chan_user_quit (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // rename one of the users
     log_info("test irc_net_on_chanuser");
-    test_sock_push(sock, ":userA!someone@somewhere QUIT foo\r\n");
+    transport_test_push_fmt(tp, ":userA!someone@somewhere QUIT foo\r\n");
     check_chan_user(chan, "userA", false);
 
     // cleanup
@@ -1042,9 +1024,9 @@
 void test_irc_chan_CTCP_ACTION (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
     bool cb_ok = false;
 
     // add our handler
@@ -1052,7 +1034,7 @@
 
     // rename one of the users
     log_info("test irc_conn_on_CTCP_ACTION");
-    test_sock_push(sock, ":userA!someone@somewhere PRIVMSG #test \001ACTION hello  world\001\r\n");
+    transport_test_push_fmt(tp, ":userA!someone@somewhere PRIVMSG #test \001ACTION hello  world\001\r\n");
     assert(cb_ok);
 
     // cleanup
@@ -1062,14 +1044,14 @@
 void test_irc_chan_privmsg (void)
 {
     struct test_chan_ctx ctx;
-    struct sock_test *sock = setup_sock_test();
-    struct irc_net *net = setup_irc_net(sock);
-    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
+    struct transport_test *tp = setup_transport_test();
+    struct irc_net *net = setup_irc_net(tp);
+    struct irc_chan *chan = setup_irc_chan(tp, net, "#test", &ctx);
 
     // rename one of the users
     log_info("test irc_chan_PRIVMSG");
     assert_success(irc_chan_PRIVMSG(chan, "foobar quux"));
-    assert_sock_data(sock, "PRIVMSG #test :foobar quux\r\n");
+    assert_transport_data(tp, "PRIVMSG #test :foobar quux\r\n");
 
     // cleanup
     irc_net_destroy(net);
@@ -1115,15 +1097,16 @@
     ctx->fd = -1;
 }
 
-static void test_fifo_on_read (struct sock_stream *fifo, void *arg)
+static void test_fifo_on_read (transport_t *fifo, void *arg)
 {
     int ret;
     char buf[16];
     struct test_fifo_ctx *ctx = arg;
+    error_t err;
 
     // read it back out
     log_info("test fifo_read");
-    if ((ret = sock_stream_read(fifo, buf, 16)) < 0)
+    if ((ret = transport_read(fifo, buf, 16, &err)) < 0)
         assert_success(-ret);
 
     assert(ret == 4);
@@ -1140,20 +1123,19 @@
     test_fifo_close(ctx);
     test_fifo_open_write(ctx);
 
-    assert_success(sock_stream_event_enable(fifo, EV_READ));
-        
     ctx->on_read = true;
 }
 
-static struct sock_stream_callbacks test_fifo_callbacks = {
+static struct transport_callbacks test_fifo_callbacks = {
     .on_read = test_fifo_on_read,
 };
 
 void test_fifo (void)
 {
-    struct sock_stream *fifo;
+    transport_t *fifo;
     struct error_info err;
     struct test_fifo_ctx _ctx, *ctx = &_ctx; memset(ctx, 0, sizeof(*ctx));
+    struct transport_info info = { &test_fifo_callbacks, ctx, TRANSPORT_READ };
 
     // XXX: requires that this be run in a suitable CWD
     ctx->path = "test.fifo";
@@ -1164,9 +1146,7 @@
 
     // open it
     log_info("test fifo_open_read");
-    assert_success(fifo_open_read(&fifo, ctx->path, &err));
-    assert_success(sock_stream_event_init(fifo, &test_fifo_callbacks, ctx));
-    assert_success(sock_stream_event_enable(fifo, EV_READ));
+    assert_success(fifo_open_read(&info, &fifo, _test_ctx.ev_base, ctx->path, &err));
     
     // put some data into it
     test_fifo_open_write(ctx);
@@ -1182,7 +1162,7 @@
     assert(ctx->fd < 0);
     
     // cleanup
-    sock_stream_release(fifo);
+    transport_destroy(fifo);
 }
 
 /**
@@ -1206,7 +1186,7 @@
     DEF_TEST(           str_quote                   ),
     DEF_TEST(           str_format                  ),
     DEF_TEST(           dump_str                    ),
-    DEF_TEST(           sock_test                   ),
+    DEF_TEST(           transport_test              ),
     DEF_TEST(           line_proto                  ),
     DEF_TEST(           irc_queue                   ),
     // XXX: irc_line_parse_invalid_prefix