# HG changeset patch # User Tero Marttila # Date 1236895272 -7200 # Node ID 96e0f703a58c1b8003af6372c368f9a85bf76a80 # Parent 4841f4398fd2cadfb20ef2a7cc6e0f8e2650b6c4 update irc_conn status, and add tests for irc_conn_QUIT diff -r 4841f4398fd2 -r 96e0f703a58c src/irc_conn.c --- a/src/irc_conn.c Thu Mar 12 23:54:03 2009 +0200 +++ b/src/irc_conn.c Fri Mar 13 00:01:12 2009 +0200 @@ -138,6 +138,11 @@ // EOF after quit? if (ERROR_CODE(err) == ERR_READ_EOF && conn->quitting) { + // udpate states + conn->registered = false; + conn->quitting = false; + conn->quit = true; + // callback if (conn->callbacks.on_quit) conn->callbacks.on_quit(conn, conn->cb_arg); @@ -306,7 +311,7 @@ }; // state check - if (conn->quitting) + if (conn->quitting || conn->quit) return ERR_IRC_CONN_QUIT_STATE; // try and send diff -r 4841f4398fd2 -r 96e0f703a58c src/irc_conn.h --- a/src/irc_conn.h Thu Mar 12 23:54:03 2009 +0200 +++ b/src/irc_conn.h Fri Mar 13 00:01:12 2009 +0200 @@ -79,6 +79,9 @@ /** Quit message sent, waiting for server to close connection */ bool quitting; + + /** Quit message sent, connection closed, we're done */ + bool quit; // @} diff -r 4841f4398fd2 -r 96e0f703a58c src/test.c --- a/src/test.c Thu Mar 12 23:54:03 2009 +0200 +++ b/src/test.c Fri Mar 13 00:01:12 2009 +0200 @@ -241,7 +241,7 @@ } struct _test_irc_conn_ctx { - bool on_registered, on_TEST; + bool on_registered, on_TEST, on_error, on_quit; }; static void _conn_on_registered (struct irc_conn *conn, void *arg) @@ -255,6 +255,29 @@ log_debug("registered"); } +static void _conn_on_error (struct irc_conn *conn, struct error_info *err, void *arg) +{ + struct _test_irc_conn_ctx *ctx = arg; + + (void) conn; + (void) err; + + if (ctx) ctx->on_error = true; + + log_debug("on_error"); +} + +static void _conn_on_quit (struct irc_conn *conn, void *arg) +{ + struct _test_irc_conn_ctx *ctx = arg; + + (void) conn; + + if (ctx) ctx->on_quit = true; + + log_debug("on_quit"); +} + static void _conn_on_TEST (const struct irc_line *line, void *arg) { struct _test_irc_conn_ctx *ctx = arg; @@ -271,6 +294,8 @@ static struct irc_conn_callbacks _conn_callbacks = { .on_registered = &_conn_on_registered, + .on_error = &_conn_on_error, + .on_quit = &_conn_on_quit, }; static struct irc_cmd_handler _conn_handlers[] = { @@ -308,7 +333,7 @@ { struct sock_test *sock; struct irc_conn *conn; - struct _test_irc_conn_ctx ctx = { false, false }; + struct _test_irc_conn_ctx ctx = { false, false, false, false }; // create the test socket assert((sock = sock_test_create())); @@ -329,6 +354,18 @@ sock_test_add_recv_str(sock, "PING foo\r\n"); assert_sock_data(sock, "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(conn->quitting); + + sock_test_add_recv_str(sock, "ERROR :Closing Link: Quit\r\n"); + sock_test_set_recv_eof(sock); + assert(conn->quit && !conn->quitting && !conn->registered); + assert(ctx.on_quit); + assert(!ctx.on_error); + // destroy it irc_conn_destroy(conn); }