1 // Aleth: Ethereum C++ client, tools and libraries.
2 // Copyright 2019 Aleth Authors.
3 // Licensed under the GNU General Public License, Version 3.
4 
5 #include <libp2p/EndpointTracker.h>
6 #include <gtest/gtest.h>
7 #include <thread>
8 
9 using namespace dev;
10 using namespace dev::p2p;
11 
12 namespace
13 {
createEndpoint(std::string const & _address,uint16_t _port)14     bi::udp::endpoint createEndpoint(std::string const& _address, uint16_t _port)
15     {
16         return bi::udp::endpoint{bi::make_address(_address), _port};
17     }
18 }
19 
20 
TEST(endpointTracker,findBestEndpoint)21 TEST(endpointTracker, findBestEndpoint)
22 {
23     EndpointTracker tracker;
24 
25     auto const endpoint1 = createEndpoint("204.25.170.185", 30303);
26     auto const endpoint2 = createEndpoint("53.124.81.255", 30305);
27 
28     auto const sourceEndpoint1 = createEndpoint("13.74.189.147", 30303);
29     auto const sourceEndpoint2 = createEndpoint("13.74.189.148", 30303);
30     auto const sourceEndpoint3 = createEndpoint("13.74.189.149", 30303);
31 
32     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint1, endpoint1), 1);
33     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint2, endpoint1), 2);
34     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint3, endpoint2), 1);
35 
36     EXPECT_EQ(tracker.bestEndpoint(), endpoint1);
37 }
38 
TEST(endpointTracker,sourceSendsDifferentEndpoints)39 TEST(endpointTracker, sourceSendsDifferentEndpoints)
40 {
41     EndpointTracker tracker;
42 
43     auto const endpoint1 = createEndpoint("204.25.170.185", 30303);
44     auto const endpoint2 = createEndpoint("53.124.81.255", 30305);
45     auto const endpoint3 = createEndpoint("111.175.56.85", 30306);
46     auto const endpoint4 = createEndpoint("215.185.124.47", 30303);
47 
48     auto const sourceEndpoint1 = createEndpoint("13.74.189.147", 30303);
49     auto const sourceEndpoint2 = createEndpoint("13.74.189.148", 30303);
50     auto const sourceEndpoint3 = createEndpoint("13.74.189.149", 30303);
51     auto const sourceEndpoint4 = createEndpoint("13.74.189.150", 30303);
52 
53     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint1, endpoint1), 1);
54     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint1, endpoint2), 1);
55     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint1, endpoint3), 1);
56 
57     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint2, endpoint1), 1);
58 
59     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint3, endpoint4), 1);
60     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint4, endpoint4), 2);
61 
62     EXPECT_EQ(tracker.bestEndpoint(), endpoint4);
63 }
64 
TEST(endpointTracker,garbageCollection)65 TEST(endpointTracker, garbageCollection)
66 {
67     EndpointTracker tracker;
68 
69     auto const endpoint1 = createEndpoint("204.25.170.185", 30303);
70     auto const endpoint2 = createEndpoint("53.124.81.255", 30305);
71 
72     auto const sourceEndpoint1 = createEndpoint("13.74.189.147", 30303);
73     auto const sourceEndpoint2 = createEndpoint("13.74.189.148", 30303);
74     auto const sourceEndpoint3 = createEndpoint("13.74.189.149", 30303);
75     auto const sourceEndpoint4 = createEndpoint("13.74.189.150", 30303);
76     auto const sourceEndpoint5 = createEndpoint("13.74.189.151", 30303);
77 
78     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint1, endpoint1), 1);
79     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint2, endpoint1), 2);
80     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint3, endpoint1), 3);
81 
82     std::this_thread::sleep_for(std::chrono::seconds(1));
83     tracker.garbageCollectStatements(std::chrono::seconds(1));
84 
85     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint4, endpoint2), 1);
86     EXPECT_EQ(tracker.addEndpointStatement(sourceEndpoint5, endpoint2), 2);
87 
88     EXPECT_EQ(tracker.bestEndpoint(), endpoint2);
89 }
90