From 8ee7883c53425576d7b66e548e4c01a0e058ef72 Mon Sep 17 00:00:00 2001
From: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
Date: Fri, 5 Apr 2019 17:24:15 -0400
Subject: [PATCH] peerdiscovery: Exception added for supporting construction
 error

---
 src/dhtrunner.cpp             | 30 +++++++++++++++++++++---------
 src/peer_discovery.cpp        |  2 +-
 tests/peerdiscoverytester.cpp | 16 +++++++---------
 tests/peerdiscoverytester.h   |  4 ++--
 4 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index ae68fdf5..3812043c 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -150,21 +150,34 @@ DhtRunner::run(const SockAddr& local4, const SockAddr& local6, const DhtRunner::
     });
 
     if (config.peer_discovery or config.peer_publish) {
-        peerDiscovery4_.reset(new PeerDiscovery(AF_INET, port_multicast));
-        peerDiscovery6_.reset(new PeerDiscovery(AF_INET6, port_multicast));
+        try {
+            peerDiscovery4_.reset(new PeerDiscovery(AF_INET, port_multicast));
+        }catch(std::exception &exception){
+            perror(exception.what());
+        }
+        try{
+            peerDiscovery6_.reset(new PeerDiscovery(AF_INET6, port_multicast));
+        }catch(std::exception &exception){
+            perror(exception.what());
+        }
     }
     if (config.peer_discovery) {
         using sig = void (DhtRunner::*)(const InfoHash&, const SockAddr&);
-        peerDiscovery4_->startDiscovery(std::bind(static_cast<sig>(&DhtRunner::bootstrap),
-                                                   this,
-                                                   std::placeholders::_1,std::placeholders::_2));
-        peerDiscovery6_->startDiscovery(std::bind(static_cast<sig>(&DhtRunner::bootstrap),
+        if (peerDiscovery4_)
+            peerDiscovery4_->startDiscovery(std::bind(static_cast<sig>(&DhtRunner::bootstrap),
                                                    this,
                                                    std::placeholders::_1,std::placeholders::_2));
+
+        if (peerDiscovery6_)
+            peerDiscovery6_->startDiscovery(std::bind(static_cast<sig>(&DhtRunner::bootstrap),
+                                                    this,
+                                                    std::placeholders::_1,std::placeholders::_2));
     }
     if (config.peer_publish) {
-        peerDiscovery4_->startPublish(getNodeId(),getBoundPort());
-        peerDiscovery6_->startPublish(getNodeId(),getBoundPort());
+        if (peerDiscovery4_)
+            peerDiscovery4_->startPublish(getNodeId(), getBoundPort(AF_INET));
+        if (peerDiscovery6_)
+            peerDiscovery6_->startPublish(getNodeId(), getBoundPort(AF_INET6));
     }
 }
 
@@ -173,7 +186,6 @@ void DhtRunner::bootstrap(const InfoHash& id, const SockAddr& address)
     {
         std::unique_lock<std::mutex> lck(storage_mtx);
         pending_ops_prio.emplace([id, address](SecureDht& dht) mutable {
-            std::cout<<address.getPort()<<std::endl;
             dht.insertNode(id, address);
         });
     }
diff --git a/src/peer_discovery.cpp b/src/peer_discovery.cpp
index 972f265d..b4885a22 100644
--- a/src/peer_discovery.cpp
+++ b/src/peer_discovery.cpp
@@ -158,7 +158,7 @@ PeerDiscovery::socketJoinMulticast(int sockfd, sa_family_t family)
             break;
         }
 
-    }       
+    }      
 }
 
 void
diff --git a/tests/peerdiscoverytester.cpp b/tests/peerdiscoverytester.cpp
index 42e4ad28..85c164e9 100644
--- a/tests/peerdiscoverytester.cpp
+++ b/tests/peerdiscoverytester.cpp
@@ -30,7 +30,7 @@ void PeerDiscoveryTester::testTransmission_ipv4(){
     // Node for getnode id
     dht::InfoHash data_n = dht::InfoHash::get("applepin");
     int port = 2222;
-    in_port_t port_n = 50000;;
+    in_port_t port_n = 50000;
 
     dht::PeerDiscovery test_n(AF_INET, port);
     dht::PeerDiscovery test_s(AF_INET, port);
@@ -49,21 +49,19 @@ void PeerDiscoveryTester::testTransmission_ipv4(){
     test_s.join();
 }
 
-/*void PeerDiscoveryTester::testTransmission_ipv6(){
+void PeerDiscoveryTester::testTransmission_ipv6(){
 
     // Node for getnode id
     dht::InfoHash data_n = dht::InfoHash::get("applepin");
-    int port = 2222;
-    int port_n = 50000;;
+    int port = 3333;
+    in_port_t port_n = 50001;
 
     dht::PeerDiscovery test_n(AF_INET6,port);
     dht::PeerDiscovery test_s(AF_INET6,port);
 
     test_s.startDiscovery([&](const dht::InfoHash& node, const dht::SockAddr& addr){
-
-        CPPUNIT_ASSERT_MESSAGE("Data Receive Incorrect", memcmp(node.data(),data_n.data(),dht::InfoHash::size()) == 0 );
-        CPPUNIT_ASSERT_MESSAGE("Port Receive Incorrect", addr.getPort() == 50000);
-
+        CPPUNIT_ASSERT_EQUAL(data_n, node);
+        CPPUNIT_ASSERT_EQUAL(port_n, addr.getPort());
     });
 
     test_n.startPublish(data_n,port_n);
@@ -74,7 +72,7 @@ void PeerDiscoveryTester::testTransmission_ipv4(){
     test_n.join();
     test_s.join();
 
-}*/
+}
 
 void PeerDiscoveryTester::tearDown(){}
 
diff --git a/tests/peerdiscoverytester.h b/tests/peerdiscoverytester.h
index 3d5438cc..b1f1dd9e 100644
--- a/tests/peerdiscoverytester.h
+++ b/tests/peerdiscoverytester.h
@@ -30,7 +30,7 @@ class PeerDiscoveryTester : public CppUnit::TestFixture {
 
     CPPUNIT_TEST_SUITE(PeerDiscoveryTester);
     CPPUNIT_TEST(testTransmission_ipv4);
-   // CPPUNIT_TEST(testTransmission_ipv6);
+    CPPUNIT_TEST(testTransmission_ipv6);
     CPPUNIT_TEST_SUITE_END();
 
  public:
@@ -49,7 +49,7 @@ class PeerDiscoveryTester : public CppUnit::TestFixture {
     /**
      * Test Multicast Transmission Ipv6
      */
-    //void testTransmission_ipv6();
+    void testTransmission_ipv6();
 
 };
 
-- 
GitLab