use vsnprintf in assert_sock_data/test_sock_push
authorTero Marttila <terom@fixme.fi>
Thu, 26 Mar 2009 23:37:31 +0200
changeset 77 5478ade62546
parent 76 b3672e3d9665
child 78 941bb8379d3d
use vsnprintf in assert_sock_data/test_sock_push
src/test.c
--- a/src/test.c	Thu Mar 26 23:29:06 2009 +0200
+++ b/src/test.c	Thu Mar 26 23:37:31 2009 +0200
@@ -201,30 +201,58 @@
     assert_err(-sock_stream_read(sock, &buf, 1), ERR_READ_EOF);
 }
 
-void assert_sock_data (struct sock_test *sock, const char *data)
+/**
+ * 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, ...)
 {
-    // get the data out
-    char *buf;
+    char buf[TEST_SOCK_FMT_MAX];
+    va_list vargs;
     size_t len;
     
-    sock_test_get_send_data(sock, &buf, &len);
+    va_start(vargs, fmt);
+
+    if ((len = vsnprintf(buf, TEST_SOCK_FMT_MAX, fmt, vargs)) >= TEST_SOCK_FMT_MAX)
+        FATAL("input too long: %zu bytes", len);
+
+    va_end(vargs);
+
+    // get the data out
+    char *out;
     
-    log_debug("get_send_data: %s", dump_strn(buf, len));
+    sock_test_get_send_data(sock, &out, &len);
+    
+    log_debug("get_send_data: %s", dump_strn(out, len));
     
     // should be the same
-    assert_strncmp(buf, data, len);
-    assert_strlen(data, len);
+    assert_strncmp(out, buf, len);
+    assert_strlen(buf, len);
 
     // cleanup
-    free(buf);
+    free(out);
 }
 
 /**
- * Nicer name for test_sock_add_recv_str
+ * 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 *str)
+void test_sock_push (struct sock_test *sock, const char *fmt, ...)
 {
-    return sock_test_add_recv_str(sock, str);
+    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);
 }
 
 /**
@@ -534,6 +562,9 @@
 }
 
 struct test_chan_ctx {
+    /** The channel name */
+    const char *channel;
+
     /** The channel we're supposed to be testing */
     struct irc_chan *chan;
     
@@ -688,16 +719,17 @@
  *
  * You must pass a test_chan_ctx for use with later operations, this will be initialized for you.
  */
-struct irc_chan* setup_irc_chan_raw (struct irc_net *net, struct test_chan_ctx *ctx)
+struct irc_chan* setup_irc_chan_raw (struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
 {
     struct irc_chan *chan;
     struct irc_chan_info chan_info = {
-        .channel        = "#test",
+        .channel        = channel,
     };
     struct error_info err;
     
     // initialize the given ctx
     memset(ctx, 0, sizeof(*ctx));
+    ctx->channel = channel;
 
     // add a channel
     assert_success(irc_net_add_chan(net, &chan, &chan_info, &err));
@@ -716,10 +748,10 @@
 {
     // JOIN request
     assert(ctx->chan->joining);
-    assert_sock_data(sock, "JOIN #test\r\n");
+    assert_sock_data(sock, "JOIN %s\r\n", ctx->channel);
 
     // JOIN reply
-    test_sock_push(sock, ":mynick!user@host JOIN #test\r\n");
+    test_sock_push(sock, ":mynick!user@host JOIN %s\r\n", ctx->channel);
     assert(!ctx->chan->joining && ctx->chan->joined);
     assert(ctx->on_chan_self_join);
 }
@@ -730,8 +762,8 @@
 void do_irc_chan_namreply (struct sock_test *sock, struct test_chan_ctx *ctx)
 {
     // RPL_NAMREPLY
-    test_sock_push(sock, "353 mynick = #test :mynick userA +userB @userC\r\n");
-    test_sock_push(sock, "366 mynick #test :End of NAMES\r\n");
+    test_sock_push(sock, "353 mynick = %s :mynick userA +userB @userC\r\n", ctx->channel);
+    test_sock_push(sock, "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);
@@ -743,9 +775,9 @@
 /**
  * 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, struct test_chan_ctx *ctx)
+struct irc_chan* setup_irc_chan_join (struct sock_test *sock, struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
 {
-    setup_irc_chan_raw(net, ctx);
+    setup_irc_chan_raw(net, channel, ctx);
     do_irc_chan_join(sock, ctx);
 
     // ok
@@ -755,9 +787,9 @@
 /**
  * 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, struct test_chan_ctx *ctx)
+struct irc_chan* setup_irc_chan (struct sock_test *sock, struct irc_net *net, const char *channel, struct test_chan_ctx *ctx)
 {
-    setup_irc_chan_raw(net, ctx);
+    setup_irc_chan_raw(net, channel, ctx);
     do_irc_chan_join(sock, ctx);
     do_irc_chan_namreply(sock, ctx);
 
@@ -781,7 +813,7 @@
 
     // add an offline channel
     log_info("test offline irc_net_add_chan");
-    struct irc_chan *chan = setup_irc_chan_raw(net, &ctx);
+    struct irc_chan *chan = setup_irc_chan_raw(net, "#test", &ctx);
     assert(!chan->joining && !chan->joined);
 
     // send the registration reply
@@ -801,7 +833,7 @@
     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, &ctx);
+    setup_irc_chan_join(sock, net, "#test", &ctx);
 
     log_info("test irc_chan_on_RPL_NAMREPLY");
     do_irc_chan_namreply(sock, &ctx);
@@ -815,11 +847,11 @@
     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, &ctx);
+    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
 
     // have a user join
     log_info("test irc_chan_on_JOIN");
-    test_sock_push(sock, ":newuser!someone@somewhere JOIN #test\r\n");
+    test_sock_push(sock, ":newuser!someone@somewhere JOIN %s\r\n", "#test");
     assert(ctx.on_chan_join);
     check_chan_user(chan, "newuser", true);
 
@@ -832,11 +864,11 @@
     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, &ctx);
+    struct irc_chan *chan = setup_irc_chan(sock, net, "#test", &ctx);
 
     // have a user join
     log_info("test irc_chan_on_PART");
-    test_sock_push(sock, ":userA!someone@somewhere PART #test\r\n");
+    test_sock_push(sock, ":userA!someone@somewhere PART %s\r\n", "#test");
     assert(ctx.on_chan_part); ctx.on_chan_part = NULL;
     check_chan_user(chan, "userA", false);