Fix network port collisions on concurrent unit-tests
[senf.git] / senf / PPI / SocketSource.test.cc
index 4bf23ef..7daad72 100644 (file)
@@ -47,12 +47,31 @@ namespace {
     void timeout() {
         senf::scheduler::terminate();
     }
+
+    int base_pid = 0;
+
+    unsigned port(unsigned i)
+    {
+        if (! base_pid)
+            base_pid = ::getpid();
+        return 23456u + (((base_pid^(base_pid>>8)^(base_pid>>16)^(base_pid>>24))&0xff)<<2) + i;
+    }
+
+    std::string localhost4str(unsigned i)
+    {
+        return (boost::format("localhost:%d") % port(i)).str();
+    }
+
+    std::string localhost6str(unsigned i)
+    {
+        return (boost::format("[::1]:%d") % port(i)).str();
+    }
 }
 
 BOOST_AUTO_UNIT_TEST(socketSource)
 {
     senf::UDPv4ClientSocketHandle inputSocket;
-    inputSocket.bind(senf::INet4SocketAddress("localhost:44344"));
+    inputSocket.bind(senf::INet4SocketAddress(localhost4str(0)));
     inputSocket.blocking(false);
     module::ActiveSocketSource<> udpSource(inputSocket);
     debug::PassiveSink sink;
@@ -61,7 +80,7 @@ BOOST_AUTO_UNIT_TEST(socketSource)
     std::string data ("TEST");
 
     senf::UDPv4ClientSocketHandle outputSocket;
-    outputSocket.writeto(senf::INet4SocketAddress("localhost:44344"),data);
+    outputSocket.writeto(senf::INet4SocketAddress(localhost4str(0)),data);
     senf::scheduler::TimerEvent timer (
         "socketSource test timer", &timeout,
         senf::ClockService::now() + senf::ClockService::milliseconds(100));