]> granicus.if.org Git - libevent/commitdiff
Unit tests for listener error callbacks
authorNick Mathewson <nickm@torproject.org>
Thu, 23 Sep 2010 18:23:45 +0000 (14:23 -0400)
committerNick Mathewson <nickm@torproject.org>
Thu, 23 Sep 2010 18:23:45 +0000 (14:23 -0400)
listener.c
test/regress_listener.c

index 335091d93413857e536d385bd3dbf2205e7dd52b..e9ce9c0f11d5969a6a65705345f4d20929ff4809 100644 (file)
@@ -472,7 +472,7 @@ accepted_socket_cb(struct event_overlapped *o, ev_uintptr_t key, ev_ssize_t n, i
                /* Some error on accept that we couldn't actually handle. */
                event_sock_warn(as->s, "Unexpected error on AcceptEx");
                LeaveCriticalSection(&as->lock);
-               /* XXXX recover better. */
+               /* XXXX send error to user */
        }
 }
 
index 5a097030751a9733291588c9a7b10280f7592ea9..35cb8fcfbdc6bfe334b6e84a144ee86269628a83 100644 (file)
@@ -133,12 +133,51 @@ end:
                evconnlistener_free(listener2);
 }
 
+static void
+errorcb(struct evconnlistener *lis, void *data_)
+{
+       int *data = data_;
+       *data = 1000;
+       evconnlistener_disable(lis);
+}
+
+static void
+regress_listener_error(void *arg)
+{
+       struct basic_test_data *data = arg;
+       struct event_base *base = data->base;
+       struct evconnlistener *listener = NULL;
+       int count = 1;
+
+       /* send, so that pair[0] will look 'readable'*/
+       send(data->pair[1], "hello", 5, 0);
+
+       /* Start a listener with a bogus socket. */
+       listener = evconnlistener_new(base, acceptcb, &count,
+           LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, 0,
+           data->pair[0]);
+       tt_assert(listener);
+
+       evconnlistener_set_error_cb(listener, errorcb);
+
+       tt_assert(listener);
+
+       event_base_dispatch(base);
+       tt_int_op(count,==,1000); /* set by error cb */
+
+end:
+       evconnlistener_free(listener);
+}
 
 struct testcase_t listener_testcases[] = {
 
        { "randport", regress_pick_a_port, TT_FORK|TT_NEED_BASE,
          &basic_setup, NULL},
 
+       { "error", regress_listener_error,
+         TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR,
+         &basic_setup, NULL},
+
        END_OF_TESTCASES,
 };
 
@@ -147,5 +186,9 @@ struct testcase_t listener_iocp_testcases[] = {
          TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP,
          &basic_setup, NULL},
 
+       { "error", regress_listener_error,
+         TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR|TT_ENABLE_IOCP,
+         &basic_setup, NULL},
+
        END_OF_TESTCASES,
 };