summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzat Khuzhin <a3at.mail@gmail.com>2015-09-10 11:18:20 +0300
committerAzat Khuzhin <a3at.mail@gmail.com>2015-09-10 11:19:08 +0300
commita0f308da99e889acadfe7486419295fc4b5c6e8a (patch)
treee6d779eb302f431ed266c37670ca6eaeba81c41d
parent37dc9e0eca7d0461e82a110a28c4744fd33b8c03 (diff)
downloadlibevent-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.c63
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,
};