diff options
author | Azat Khuzhin <a3at.mail@gmail.com> | 2015-09-10 11:18:20 +0300 |
---|---|---|
committer | Azat Khuzhin <a3at.mail@gmail.com> | 2015-09-10 11:19:08 +0300 |
commit | a0f308da99e889acadfe7486419295fc4b5c6e8a (patch) | |
tree | e6d779eb302f431ed266c37670ca6eaeba81c41d | |
parent | 37dc9e0eca7d0461e82a110a28c4744fd33b8c03 (diff) | |
download | libevent-a0f308da99e889acadfe7486419295fc4b5c6e8a.tar.gz |
test/regress_be: bufferevent_enable() shouldn't call eventcb by it's own
It must enter the event loop regardless BEV_OPT_DEFER_CALLBACKS, to avoid
potential errors with subsequent connect(), you will find more info in #43,
since this is a regression for it.
-rw-r--r-- | test/regress_bufferevent.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/regress_bufferevent.c b/test/regress_bufferevent.c index 38ca4458..5e48a7cc 100644 --- a/test/regress_bufferevent.c +++ b/test/regress_bufferevent.c @@ -597,6 +597,7 @@ static int bufferevent_connect_test_flags = 0; static int bufferevent_trigger_test_flags = 0; static int n_strings_read = 0; static int n_reads_invoked = 0; +static int n_events_invoked = 0; #define TEST_STR "Now is the time for all good events to signal for " \ "the good of their protocol" @@ -671,6 +672,14 @@ end: } static void +reader_eventcb_simple(struct bufferevent *bev, short what, void *ctx) +{ + TT_BLATHER(("Read eventcb simple invoked on %d.", + (int)bufferevent_getfd(bev))); + n_events_invoked++; +} + +static void reader_readcb(struct bufferevent *bev, void *ctx) { TT_BLATHER(("Read invoked on %d.", (int)bufferevent_getfd(bev))); @@ -756,6 +765,45 @@ end: } static void +test_bufferevent_connect_fail_eventcb(void *arg) +{ + struct basic_test_data *data = arg; + int flags = BEV_OPT_CLOSE_ON_FREE | (long)data->setup_data; + struct bufferevent *bev = NULL; + struct evconnlistener *lev = NULL; + struct sockaddr_in localhost; + ev_socklen_t slen = sizeof(localhost); + evutil_socket_t fake_listener = -1; + + fake_listener = fake_listener_create(&localhost); + + tt_int_op(n_events_invoked, ==, 0); + + bev = bufferevent_socket_new(data->base, -1, flags); + tt_assert(bev); + bufferevent_setcb(bev, reader_readcb, reader_readcb, + reader_eventcb_simple, data->base); + bufferevent_enable(bev, EV_READ|EV_WRITE); + tt_int_op(n_events_invoked, ==, 0); + tt_int_op(n_reads_invoked, ==, 0); + /** @see also test_bufferevent_connect_fail() */ + bufferevent_socket_connect(bev, (struct sockaddr *)&localhost, slen); + tt_int_op(n_events_invoked, ==, 0); + tt_int_op(n_reads_invoked, ==, 0); + event_base_dispatch(data->base); + tt_int_op(n_events_invoked, ==, 1); + tt_int_op(n_reads_invoked, ==, 0); + +end: + if (lev) + evconnlistener_free(lev); + if (bev) + bufferevent_free(bev); + if (fake_listener >= 0) + evutil_closesocket(fake_listener); +} + +static void want_fail_eventcb(struct bufferevent *bev, short what, void *ctx) { struct event_base *base = ctx; @@ -1152,6 +1200,13 @@ struct testcase_t bufferevent_testcases[] = { { "bufferevent_zlib", NULL, TT_SKIP, NULL, NULL }, #endif + { "bufferevent_connect_fail_eventcb_defer", + test_bufferevent_connect_fail_eventcb, + TT_FORK|TT_NEED_BASE, &basic_setup, (void*)BEV_OPT_DEFER_CALLBACKS }, + { "bufferevent_connect_fail_eventcb", + test_bufferevent_connect_fail_eventcb, + TT_FORK|TT_NEED_BASE, &basic_setup, NULL }, + END_OF_TESTCASES, }; @@ -1176,5 +1231,13 @@ struct testcase_t bufferevent_iocp_testcases[] = { TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP, &basic_setup, (void*)"unset_connectex" }, + { "bufferevent_connect_fail_eventcb_defer", + test_bufferevent_connect_fail_eventcb, + TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP, &basic_setup, + (void*)BEV_OPT_DEFER_CALLBACKS }, + { "bufferevent_connect_fail", + test_bufferevent_connect_fail_eventcb, + TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP, &basic_setup, NULL }, + END_OF_TESTCASES, }; |