]> granicus.if.org Git - libevent/commitdiff
Make the bufferevent_connect_fail test faster on OSX.
authorNick Mathewson <nickm@torproject.org>
Wed, 21 Oct 2009 19:21:05 +0000 (19:21 +0000)
committerNick Mathewson <nickm@torproject.org>
Wed, 21 Oct 2009 19:21:05 +0000 (19:21 +0000)
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

index 523ad09c99666607a179e2915d1b8cfd9f8189de..e605d72ac51ee46efe76360bcbadb4fc024c0d94 100644 (file)
@@ -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);