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