PROTON-2018: Don't use a fixed port for the ssl proactor test
(cherry picked with changes from commit be0b0c277d5cdeeb2e7430b40d1b370b4d1425c9)
diff --git a/c/tests/ssl_proactor_test.cpp b/c/tests/ssl_proactor_test.cpp
index c9eafc7..7ae89d8 100644
--- a/c/tests/ssl_proactor_test.cpp
+++ b/c/tests/ssl_proactor_test.cpp
@@ -164,6 +164,36 @@
} while(true);
}
+static void run_until_listener_open(pn_proactor_t* p) {
+ do {
+ pn_event_batch_t *events = pn_proactor_wait(p);
+ pn_event_t *e;
+ for (e = pn_event_batch_next(events); e; e = pn_event_batch_next(events)) {
+ if (pn_event_type(e)==PN_LISTENER_OPEN) {
+ pn_proactor_done(p, events);
+ return;
+ }
+ }
+ pn_proactor_done(p, events);
+ } while (true);
+}
+
+static void setup_connection(pn_proactor_t* proactor, pn_transport_t* t) {
+ pn_listener_t* l = pn_listener();
+ pn_proactor_listen(proactor, l, ":0", 16);
+ // Don't know port until the listener is open
+ run_until_listener_open(proactor);
+
+ // Construct connect address (from listener port)
+ const pn_netaddr_t* a = pn_listener_addr(l);
+ char port[32];
+ port[0] = ':';
+ pn_netaddr_host_port(a, NULL, 0, port+1, 31);
+
+ INFO("Connecting to " << port);
+ pn_proactor_connect2(proactor, NULL, t, port);
+}
+
TEST_CASE("ssl") {
struct app_data_t app = {0};
@@ -187,8 +217,7 @@
REQUIRE(pn_ssl_domain_set_peer_authentication(cd, PN_SSL_VERIFY_PEER_NAME, NULL) == 0);
REQUIRE(pn_ssl_init(pn_ssl(t), cd, NULL) == 0);
- pn_proactor_listen(proactor, pn_listener(), "", 16);
- pn_proactor_connect2(proactor, NULL, t, "");
+ setup_connection(proactor, t);
run(proactor, &app, server_handler, client_handler);
CHECK(app.connection_succeeded==false);
@@ -200,8 +229,7 @@
REQUIRE(pn_ssl_domain_set_peer_authentication(cd, PN_SSL_ANONYMOUS_PEER, NULL) == 0);
REQUIRE(pn_ssl_init(pn_ssl(t), cd, NULL) == 0);
- pn_proactor_listen(proactor, pn_listener(), "", 16);
- pn_proactor_connect2(proactor, NULL, t, "");
+ setup_connection(proactor, t);
run(proactor, &app, server_handler, client_handler);
CHECK(app.connection_succeeded==true);