diff --git a/tests/peerdiscoverytester.cpp b/tests/peerdiscoverytester.cpp
index 2454f2324bfec696b5f55986d7c96d432fd96c9b..61ed48b92dc1b86b00bf9697f810776201540e6b 100644
--- a/tests/peerdiscoverytester.cpp
+++ b/tests/peerdiscoverytester.cpp
@@ -22,16 +22,14 @@
 
 namespace test {
 
-class NodeInsertion{
-public:
-    dht::InfoHash nodeid_;
-    in_port_t node_port_;
-    dht::NetId nid_;
-    MSGPACK_DEFINE(nodeid_, node_port_, nid_)
+struct NodeInsertion {
+    dht::InfoHash nodeid;
+    in_port_t node_port;
+    dht::NetId nid;
+    MSGPACK_DEFINE(nodeid, node_port, nid)
 };
 
-class TestPack{
-public:
+struct TestPack {
     int num;
     char cha;
     std::string str;
@@ -42,63 +40,70 @@ CPPUNIT_TEST_SUITE_REGISTRATION(PeerDiscoveryTester);
 
 void PeerDiscoveryTester::setUp(){}
 
-void PeerDiscoveryTester::testTransmission(){
-
+void PeerDiscoveryTester::testTransmission()
+{
     // Node for getnode id
     const std::string type {"dht"};
     const std::string test_type {"pdd"};
-    dht::InfoHash data_n = dht::InfoHash::get("applepin");
-    int port = 2222;
-    in_port_t port_n = 50000;
+    constexpr int MULTICAST_PORT = 2222;
 
-    msgpack::sbuffer sbuf;
     NodeInsertion adc;
-    adc.nid_ = 10;
-    adc.node_port_ = port_n;
-    adc.nodeid_ = data_n;
-    msgpack::pack(sbuf,adc);
+    adc.nid = 10;
+    adc.node_port = 50000;
+    adc.nodeid = dht::InfoHash::get("applepin");
 
-    msgpack::sbuffer pbuf;
     TestPack pdd;
     pdd.num = 100;
     pdd.cha = 'a';
     pdd.str = "apple";
-    msgpack::pack(pbuf,pdd);
-
-    try{
-        dht::PeerDiscovery test_n(port);
-        dht::PeerDiscovery test_s(port);
-        try{
-            test_s.startDiscovery(type,[&](msgpack::object&& obj, dht::SockAddr&& add){
-                auto v = obj.as<NodeInsertion>();
-                CPPUNIT_ASSERT_EQUAL(v.node_port_, port_n);
-                CPPUNIT_ASSERT_EQUAL(v.nodeid_, data_n);
-            });
-
-            test_s.startDiscovery(test_type,[&](msgpack::object&& obj, dht::SockAddr&& add){
-                auto v = obj.as<TestPack>();
-                CPPUNIT_ASSERT_EQUAL(v.num, 100);
-                CPPUNIT_ASSERT_EQUAL(v.cha, 'a');
-            });
-
-            test_n.startPublish(type, sbuf);
-            std::this_thread::sleep_for(std::chrono::seconds(5));
-            test_n.startPublish(test_type, pbuf);
-            std::this_thread::sleep_for(std::chrono::seconds(5));
-            test_n.stopPublish(test_type);
-
-            std::this_thread::sleep_for(std::chrono::seconds(10));
-            test_n.stop();
-            test_s.stop();
-            test_n.join();
-            test_s.join();
-        } catch(std::exception &exception){
-            perror(exception.what());
-            CPPUNIT_ASSERT(false);
+
+    dht::PeerDiscovery test_n(MULTICAST_PORT);
+    dht::PeerDiscovery test_s(MULTICAST_PORT);
+
+    std::mutex lock;
+    std::condition_variable cv;
+    std::unique_lock<std::mutex> l(lock);
+    unsigned count_node {0};
+    unsigned count_test {0};
+
+    test_s.startDiscovery<NodeInsertion>(type,[&](NodeInsertion&& v, dht::SockAddr&& add){
+        CPPUNIT_ASSERT_EQUAL(v.node_port, adc.node_port);
+        CPPUNIT_ASSERT_EQUAL(v.nodeid, adc.nodeid);
+        CPPUNIT_ASSERT_EQUAL(v.nid, adc.nid);
+        {
+            std::lock_guard<std::mutex> l(lock);
+            count_node++;
+        }
+        cv.notify_all();
+    });
+
+    test_s.startDiscovery(test_type,[&](msgpack::object&& obj, dht::SockAddr&& add){
+        auto v = obj.as<TestPack>();
+        CPPUNIT_ASSERT_EQUAL(v.num, pdd.num);
+        CPPUNIT_ASSERT_EQUAL(v.cha, pdd.cha);
+        CPPUNIT_ASSERT_EQUAL(v.str, pdd.str);
+        {
+            std::lock_guard<std::mutex> l(lock);
+            count_test++;
         }
-    } catch(std::exception &exception){
-            perror(exception.what());
-    }
+        cv.notify_all();
+    });
+
+    test_n.startPublish(type, adc);
+    CPPUNIT_ASSERT(cv.wait_for(l, std::chrono::seconds(5), [&]{
+        return count_node > 0;
+    }));
+
+    test_n.startPublish(test_type, pdd);
+    CPPUNIT_ASSERT(cv.wait_for(l, std::chrono::seconds(5), [&]{
+        return count_node > 1 and count_test > 0;
+    }));
+    l.unlock();
+
+    test_n.stopPublish(type);
+    test_n.stopPublish(test_type);
+    test_n.stopDiscovery(type);
+    test_n.stopDiscovery(test_type);
 }
 
 void PeerDiscoveryTester::tearDown(){}