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