From fdd11c00bb7a90d2f11a8933baa577ac199f74e3 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 21 Oct 2009 19:21:05 +0000 Subject: [PATCH] Make the bufferevent_connect_fail test faster on OSX. It seems that connecting to a listener that is bound but not accepting or listening doesn't give a 'connection refused' error on OSX, but rather makes the connect() time out after 75 seconds. I couldn't find any way to make the timout shorter. Fortunately, closing the listener after a second or so makes the desired error occur after another second or so. svn:r1457 --- test/regress_bufferevent.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/regress_bufferevent.c b/test/regress_bufferevent.c index 523ad09c..e605d72a 100644 --- a/test/regress_bufferevent.c +++ b/test/regress_bufferevent.c @@ -517,6 +517,16 @@ want_fail_eventcb(struct bufferevent *bev, short what, void *ctx) event_base_loopexit(base, NULL); } +static void +close_socket_cb(evutil_socket_t fd, short what, void *arg) +{ + evutil_socket_t *fdp = arg; + if (*fdp >= 0) { + EVUTIL_CLOSESOCKET(*fdp); + *fdp = -1; + } +} + static void test_bufferevent_connect_fail(void *arg) { @@ -526,6 +536,8 @@ test_bufferevent_connect_fail(void *arg) struct sockaddr *sa = (struct sockaddr*)&localhost; evutil_socket_t fake_listener = -1; ev_socklen_t slen = sizeof(localhost); + struct event close_listener_event; + struct timeval one_second = { 1, 0 }; test_ok = 0; @@ -535,7 +547,7 @@ test_bufferevent_connect_fail(void *arg) localhost.sin_family = AF_INET; /* bind, but don't listen or accept. should trigger - "Connection refused" reliably */ + "Connection refused" reliably on most platforms. */ fake_listener = socket(localhost.sin_family, SOCK_STREAM, 0); tt_assert(fake_listener >= 0); tt_assert(bind(fake_listener, sa, slen) == 0); @@ -547,6 +559,12 @@ test_bufferevent_connect_fail(void *arg) tt_want(!bufferevent_socket_connect(bev, sa, slen)); + /* Close the listener socket after a second. This should trigger + "connection refused" on some other platforms, including OSX. */ + evtimer_assign(&close_listener_event, data->base, close_socket_cb, + &fake_listener); + event_add(&close_listener_event, &one_second); + event_base_dispatch(data->base); tt_int_op(test_ok, ==, 1); -- 2.40.0