Repository: qpid-proton Updated Branches: refs/heads/master 876daa72d -> b86234c65
PROTON-1490: c-proactor-test sporadic failures Fixed bugs in test code - port binding and cleanup. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b86234c6 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b86234c6 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b86234c6 Branch: refs/heads/master Commit: b86234c65ca470d2d555e218c0c53082011676b4 Parents: 876daa7 Author: Alan Conway <acon...@redhat.com> Authored: Thu May 25 15:32:36 2017 -0400 Committer: Alan Conway <acon...@redhat.com> Committed: Thu May 25 15:32:36 2017 -0400 ---------------------------------------------------------------------- proton-c/src/tests/proactor.c | 131 +++++++++++++---------------------- proton-c/src/tests/test_tools.h | 2 +- 2 files changed, 50 insertions(+), 83 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b86234c6/proton-c/src/tests/proactor.c ---------------------------------------------------------------------- diff --git a/proton-c/src/tests/proactor.c b/proton-c/src/tests/proactor.c index 0a6df71..19cc7f3 100644 --- a/proton-c/src/tests/proactor.c +++ b/proton-c/src/tests/proactor.c @@ -296,15 +296,12 @@ static pn_event_type_t open_wake_handler(test_t *t, pn_event_t *e) { static void test_connection_wake(test_t *t) { proactor_test_t pts[] = { { open_wake_handler }, { listen_handler } }; PROACTOR_TEST_INIT(pts, t); - pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; - test_port_t port = test_port(localhost); /* Hold a port */ - pn_proactor_listen(server, pn_listener(), port.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port.sock); + pn_proactor_t *client = pts[0].proactor; + proactor_test_listener_t l = proactor_test_listen(&pts[1], localhost); pn_connection_t *c = pn_connection(); pn_incref(c); /* Keep a reference for wake() after free */ - pn_proactor_connect(client, c, port.host_port); + pn_proactor_connect(client, c, l.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); TEST_CHECK(t, pn_proactor_get(client) == NULL); /* Should be idle */ pn_connection_wake(c); @@ -317,7 +314,7 @@ static void test_connection_wake(test_t *t) { /* Verify we don't get a wake after close even if they happen together */ pn_connection_t *c2 = pn_connection(); - pn_proactor_connect(client, c2, port.host_port); + pn_proactor_connect(client, c2, l.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); pn_connection_wake(c2); pn_proactor_disconnect(client, NULL); @@ -352,13 +349,9 @@ static pn_event_type_t listen_abort_handler(test_t *t, pn_event_t *e) { static void test_abort(test_t *t) { proactor_test_t pts[] ={ { open_close_handler }, { listen_abort_handler } }; PROACTOR_TEST_INIT(pts, t); - pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; - test_port_t port = test_port(localhost); - pn_listener_t *l = pn_listener(); - pn_proactor_listen(server, l, port.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port.sock); - pn_proactor_connect(client, pn_connection(), port.host_port); + pn_proactor_t *client = pts[0].proactor; + proactor_test_listener_t l = proactor_test_listen(&pts[1], localhost); + pn_proactor_connect(client, pn_connection(), l.port.host_port); /* server transport closes */ if (TEST_ETYPE_EQUAL(t, PN_TRANSPORT_CLOSED, PROACTOR_TEST_RUN(pts))) { @@ -371,7 +364,7 @@ static void test_abort(test_t *t) { TEST_COND_DESC(t, "abort", last_condition); } - pn_listener_close(l); + pn_listener_close(l.listener); while (PROACTOR_TEST_RUN(pts) != PN_PROACTOR_INACTIVE) {} while (PROACTOR_TEST_RUN(pts) != PN_PROACTOR_INACTIVE) {} @@ -474,13 +467,9 @@ static void test_inactive(test_t *t) { proactor_test_t pts[] = { { open_wake_handler }, { listen_handler } }; PROACTOR_TEST_INIT(pts, t); pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; - test_port_t port = test_port(localhost); /* Hold a port */ - - pn_listener_t *l = pn_listener(); - pn_proactor_listen(server, l, port.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); + proactor_test_listener_t l = proactor_test_listen(&pts[1], localhost); pn_connection_t *c = pn_connection(); - pn_proactor_connect(client, c, port.host_port); + pn_proactor_connect(client, c, l.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); pn_connection_wake(c); TEST_ETYPE_EQUAL(t, PN_CONNECTION_WAKE, PROACTOR_TEST_RUN(pts)); @@ -490,11 +479,10 @@ static void test_inactive(test_t *t) { TEST_ETYPE_EQUAL(t, PN_PROACTOR_INACTIVE, PROACTOR_TEST_RUN(pts)); /* server won't be INACTIVE until listener is closed */ TEST_CHECK(t, pn_proactor_get(server) == NULL); - pn_listener_close(l); + pn_listener_close(l.listener); TEST_ETYPE_EQUAL(t, PN_LISTENER_CLOSE, PROACTOR_TEST_RUN(pts)); TEST_ETYPE_EQUAL(t, PN_PROACTOR_INACTIVE, PROACTOR_TEST_RUN(pts)); - sock_close(port.sock); PROACTOR_TEST_FREE(pts); } @@ -534,14 +522,10 @@ static void test_errors(test_t *t) { static void test_ipv4_ipv6(test_t *t) { proactor_test_t pts[] ={ { open_close_handler }, { listen_handler } }; PROACTOR_TEST_INIT(pts, t); - pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; + pn_proactor_t *client = pts[0].proactor; /* Listen on all interfaces for IPv6 only. If this fails, skip IPv6 tests */ - test_port_t port6 = test_port("::"); - pn_listener_t *l6 = pn_listener(); - pn_proactor_listen(server, l6, port6.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port6.sock); + proactor_test_listener_t l6 = proactor_test_listen(&pts[1], "::"); pn_event_type_t e = PROACTOR_TEST_GET(pts); bool has_ipv6 = (e != PN_LISTENER_CLOSE); if (!has_ipv6) { @@ -550,20 +534,12 @@ static void test_ipv4_ipv6(test_t *t) { PROACTOR_TEST_DRAIN(pts); /* Listen on all interfaces for IPv4 only. */ - test_port_t port4 = test_port("0.0.0.0"); - pn_listener_t *l4 = pn_listener(); - pn_proactor_listen(server, l4, port4.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port4.sock); - TEST_CHECKF(t, PROACTOR_TEST_GET(pts) != PN_LISTENER_CLOSE, "listener error: %s", pn_condition_get_description(last_condition)); + proactor_test_listener_t l4 = proactor_test_listen(&pts[1], "0.0.0.0"); + TEST_CHECKF(t, PROACTOR_TEST_GET(pts) != PN_LISTENER_CLOSE, "listener error: %s", pn_condition_get_description(last_condition)); PROACTOR_TEST_DRAIN(pts); /* Empty address listens on both IPv4 and IPv6 on all interfaces */ - test_port_t port = test_port(""); - pn_listener_t *l = pn_listener(); - pn_proactor_listen(server, l, port.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port.sock); + proactor_test_listener_t l = proactor_test_listen(&pts[1], ""); e = PROACTOR_TEST_GET(pts); TEST_CHECKF(t, PROACTOR_TEST_GET(pts) != PN_LISTENER_CLOSE, "listener error: %s", pn_condition_get_description(last_condition)); PROACTOR_TEST_DRAIN(pts); @@ -582,28 +558,28 @@ static void test_ipv4_ipv6(test_t *t) { PROACTOR_TEST_DRAIN(pts); \ } while(0) - EXPECT_CONNECT(port4, "127.0.0.1"); /* v4->v4 */ - EXPECT_CONNECT(port4, ""); /* local->v4*/ + EXPECT_CONNECT(l4.port, "127.0.0.1"); /* v4->v4 */ + EXPECT_CONNECT(l4.port, ""); /* local->v4*/ - EXPECT_CONNECT(port, "127.0.0.1"); /* v4->all */ - EXPECT_CONNECT(port, ""); /* local->all */ + EXPECT_CONNECT(l.port, "127.0.0.1"); /* v4->all */ + EXPECT_CONNECT(l.port, ""); /* local->all */ if (has_ipv6) { - EXPECT_CONNECT(port6, "::"); /* v6->v6 */ - EXPECT_CONNECT(port6, ""); /* local->v6 */ - EXPECT_CONNECT(port, "::1"); /* v6->all */ + EXPECT_CONNECT(l6.port, "::"); /* v6->v6 */ + EXPECT_CONNECT(l6.port, ""); /* local->v6 */ + EXPECT_CONNECT(l.port, "::1"); /* v6->all */ - EXPECT_FAIL(port6, "127.0.0.1"); /* fail v4->v6 */ - EXPECT_FAIL(port4, "::1"); /* fail v6->v4 */ + EXPECT_FAIL(l6.port, "127.0.0.1"); /* fail v4->v6 */ + EXPECT_FAIL(l4.port, "::1"); /* fail v6->v4 */ } PROACTOR_TEST_DRAIN(pts); - pn_listener_close(l); + pn_listener_close(l.listener); TEST_ETYPE_EQUAL(t, PN_LISTENER_CLOSE, PROACTOR_TEST_RUN(pts)); - pn_listener_close(l4); + pn_listener_close(l4.listener); TEST_ETYPE_EQUAL(t, PN_LISTENER_CLOSE, PROACTOR_TEST_RUN(pts)); if (has_ipv6) { - pn_listener_close(l6); + pn_listener_close(l6.listener); TEST_ETYPE_EQUAL(t, PN_LISTENER_CLOSE, PROACTOR_TEST_RUN(pts)); } @@ -614,19 +590,16 @@ static void test_ipv4_ipv6(test_t *t) { static void test_release_free(test_t *t) { proactor_test_t pts[] = { { open_wake_handler }, { listen_handler } }; PROACTOR_TEST_INIT(pts, t); - pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; - test_port_t port = test_port(localhost); - pn_listener_t *l = pn_listener(); - pn_proactor_listen(server, l, port.host_port, 2); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); + pn_proactor_t *client = pts[0].proactor; + proactor_test_listener_t l = proactor_test_listen(&pts[1], localhost); /* leave one connection to the proactor */ - pn_proactor_connect(client, pn_connection(), port.host_port); + pn_proactor_connect(client, pn_connection(), l.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); /* release c1 and free immediately */ pn_connection_t *c1 = pn_connection(); - pn_proactor_connect(client, c1, port.host_port); + pn_proactor_connect(client, c1, l.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); pn_proactor_release_connection(c1); /* We free but socket should still be cleaned up */ pn_connection_free(c1); @@ -635,7 +608,7 @@ static void test_release_free(test_t *t) { /* release c2 and but don't free till after proactor free */ pn_connection_t *c2 = pn_connection(); - pn_proactor_connect(client, c2, port.host_port); + pn_proactor_connect(client, c2, l.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); pn_proactor_release_connection(c2); TEST_CHECK(t, pn_proactor_get(client) == NULL); /* Should be idle */ @@ -694,13 +667,10 @@ static void test_ssl(test_t *t) { proactor_test_t pts[] ={ { ssl_handler }, { ssl_handler } }; PROACTOR_TEST_INIT(pts, t); - pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; - test_port_t port = test_port(localhost); - pn_proactor_listen(server, pn_listener(), port.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port.sock); + pn_proactor_t *client = pts[0].proactor; + proactor_test_listener_t l = proactor_test_listen(&pts[1], localhost); pn_connection_t *c = pn_connection(); - pn_proactor_connect(client, c, port.host_port); + pn_proactor_connect(client, c, l.port.host_port); /* Open ok at both ends */ TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); TEST_COND_EMPTY(t, last_condition); @@ -785,23 +755,25 @@ static void test_parse_addr(test_t *t) { static void test_netaddr(test_t *t) { proactor_test_t pts[] ={ { open_wake_handler }, { listen_handler } }; PROACTOR_TEST_INIT(pts, t); - pn_proactor_t *client = pts[0].proactor, *server = pts[1].proactor; - test_port_t port = test_port("127.0.0.1"); /* Use IPv4 to get consistent results all platforms */ - pn_listener_t *l = pn_listener(); - pn_proactor_listen(server, l, port.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); + pn_proactor_t *client = pts[0].proactor; + /* Use IPv4 to get consistent results all platforms */ + proactor_test_listener_t l = proactor_test_listen(&pts[1], "127.0.0.1"); pn_connection_t *c = pn_connection(); - pn_proactor_connect(client, c, port.host_port); - TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); + pn_proactor_connect(client, c, l.port.host_port); + if (!TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts))) { + TEST_COND_EMPTY(t, last_condition); /* Show the last condition */ + return; /* don't continue if connection is closed */ + } /* client remote, client local, server remote and server local address strings */ char cr[1024], cl[1024], sr[1024], sl[1024]; pn_transport_t *ct = pn_connection_transport(c); pn_netaddr_str(pn_netaddr_remote(ct), cr, sizeof(cr)); - TEST_STR_IN(t, test_port_use_host(&port, ""), cr); /* remote address has listening port */ + TEST_STR_IN(t, test_port_use_host(&l.port, ""), cr); /* remote address has listening port */ pn_connection_t *s = last_accepted; /* server side of the connection */ + pn_transport_t *st = pn_connection_transport(s); if (!TEST_CHECK(t, st)) return; pn_netaddr_str(pn_netaddr_local(st), sl, sizeof(sl)); @@ -822,13 +794,12 @@ static void test_netaddr(test_t *t) { NI_NUMERICHOST | NI_NUMERICSERV); TEST_CHECK(t, 0 == err); TEST_STR_EQUAL(t, "127.0.0.1", host); - TEST_STR_EQUAL(t, port.str, serv); + TEST_STR_EQUAL(t, l.port.str, serv); /* Make sure you can use NULL, 0 to get length of address string without a crash */ size_t len = pn_netaddr_str(pn_netaddr_local(ct), NULL, 0); TEST_CHECKF(t, strlen(cl) == len, "%d != %d", strlen(cl), len); - sock_close(port.sock); PROACTOR_TEST_DRAIN(pts); PROACTOR_TEST_FREE(pts); } @@ -879,12 +850,8 @@ static void test_disconnect(test_t *t) { TEST_ETYPE_EQUAL(t, PN_PROACTOR_INACTIVE, PROACTOR_TEST_RUN(pts)); /* Make sure the proactors are still functional */ - test_port_t port3 = test_port(localhost); - pn_listener_t* l3 = pn_listener(); - pn_proactor_listen(server, l3, port3.host_port, 4); - TEST_ETYPE_EQUAL(t, PN_LISTENER_OPEN, PROACTOR_TEST_RUN(pts)); - sock_close(port3.sock); - pn_proactor_connect(client, pn_connection(), port3.host_port); + proactor_test_listener_t l3 = proactor_test_listen(&pts[1], localhost); + pn_proactor_connect(client, pn_connection(), l3.port.host_port); TEST_ETYPE_EQUAL(t, PN_CONNECTION_REMOTE_OPEN, PROACTOR_TEST_RUN(pts)); pn_proactor_disconnect(client, NULL); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b86234c6/proton-c/src/tests/test_tools.h ---------------------------------------------------------------------- diff --git a/proton-c/src/tests/test_tools.h b/proton-c/src/tests/test_tools.h index 04ae0f1..af4f217 100644 --- a/proton-c/src/tests/test_tools.h +++ b/proton-c/src/tests/test_tools.h @@ -289,7 +289,7 @@ test_port_t test_port(const char* host) { socklen_t len = sizeof(addr); err = getsockname(tp.sock, (struct sockaddr*)&addr, &len); /* Get the bound port */ TEST_ASSERT_ERRNO(!err, errno); - tp.port = addr.sin_port; + tp.port = ntohs(addr.sin_port); snprintf(tp.str, sizeof(tp.str), "%d", tp.port); test_port_use_host(&tp, host); return tp; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org