コード例 #1
0
 def test_get_ping_latencies_in_threads(self):
     relays = [
         OutboundPeerModel("34.227.149.148",
                           1609,
                           node_id="0",
                           attributes={"country": "China"}),
         OutboundPeerModel("35.198.90.230",
                           1609,
                           node_id="1",
                           attributes={"country": "China"}),
         OutboundPeerModel("52.221.211.38",
                           1609,
                           node_id="2",
                           attributes={"country": "China"}),
         OutboundPeerModel("34.245.23.125",
                           1609,
                           node_id="3",
                           attributes={"country": "China"}),
         OutboundPeerModel("34.238.245.201",
                           1609,
                           node_id="4",
                           attributes={"country": "China"}),
     ]
     start = time.time()
     network_latency.get_best_relays_by_ping_latency_one_per_country(
         relays, 1)
     end = time.time() - start
     self.assertTrue(end < constants.PING_TIMEOUT_S + 1)
コード例 #2
0
 def test_get_ping_latency(self):
     relay = OutboundPeerModel("34.227.149.148",
                               1609,
                               node_id="0",
                               attributes={"country": "China"})
     start = time.time()
     network_latency.get_best_relays_by_ping_latency_one_per_country(
         [relay], 1)
     end = time.time() - start
     self.assertTrue(end < constants.PING_TIMEOUT_S + 1)
コード例 #3
0
    def test_relay_connection_update(self):
        relay_connections = [
            OutboundPeerModel(LOCALHOST, 8001, node_type=NodeType.RELAY_BLOCK),
            OutboundPeerModel(LOCALHOST, 9001, node_type=NodeType.RELAY_BLOCK)
        ]
        network_latency.get_best_relays_by_ping_latency_one_per_country = MagicMock(return_value=[relay_connections[0]])
        opts = gateway_helpers.get_gateway_opts(8000, split_relays=True, include_default_btc_args=True)
        if opts.use_extensions:
            helpers.set_extensions_parallelism()
        node = GatewayNode(opts)
        node.enqueue_connection = MagicMock()

        node._register_potential_relay_peers(
            node._find_best_relay_peers(
                network_latency.get_best_relays_by_ping_latency_one_per_country()
            )
        )
        self.assertEqual(1, len(node.peer_relays))
        self.assertEqual(1, len(node.peer_transaction_relays))
        self.assertEqual(8002, next(iter(node.peer_transaction_relays)).port)

        node.enqueue_connection.assert_has_calls([
            call(LOCALHOST, 8001, ConnectionType.RELAY_BLOCK),
            call(LOCALHOST, 8002, ConnectionType.RELAY_TRANSACTION),
        ], any_order=True)

        node.on_connection_added(MockSocketConnection(1, ip_address=LOCALHOST, port=8001, node=node))
        self._check_connection_pool(node, 1, 1, 0, 1)
        node.on_connection_added(MockSocketConnection(2, ip_address=LOCALHOST, port=8002, node=node))
        self._check_connection_pool(node, 2, 1, 1, 2)

        network_latency.get_best_relays_by_ping_latency_one_per_country = MagicMock(return_value=[relay_connections[1]])

        node._register_potential_relay_peers(
            node._find_best_relay_peers(
                network_latency.get_best_relays_by_ping_latency_one_per_country()
            )
        )
        self.assertEqual(1, len(node.peer_relays))
        self.assertEqual(1, len(node.peer_transaction_relays))
        self.assertEqual(9001, next(iter(node.peer_relays)).port)
        self.assertEqual(9002, next(iter(node.peer_transaction_relays)).port)

        node.enqueue_connection.assert_has_calls([
            call(LOCALHOST, 9001, ConnectionType.RELAY_BLOCK),
            call(LOCALHOST, 9002, ConnectionType.RELAY_TRANSACTION),
        ], any_order=True)
        node.on_connection_added(MockSocketConnection(3, ip_address=LOCALHOST, port=9001))
        node.on_connection_added(MockSocketConnection(4, ip_address=LOCALHOST, port=9002))
        for conn in node.connection_pool.get_by_connection_types([ConnectionType.RELAY_BLOCK]):
            self.assertEqual(9001, conn.peer_port)
        for conn in node.connection_pool.get_by_connection_types([ConnectionType.RELAY_TRANSACTION]):
            self.assertEqual(9002, conn.peer_port)
コード例 #4
0
def initialize_split_relay_node():
    relay_connections = [
        OutboundPeerModel(LOCALHOST, 8001, node_type=NodeType.RELAY_BLOCK)
    ]
    network_latency.get_best_relays_by_ping_latency_one_per_country = MagicMock(
        return_value=[relay_connections[0]])
    opts = gateway_helpers.get_gateway_opts(8000,
                                            split_relays=True,
                                            include_default_btc_args=True)
    if opts.use_extensions:
        helpers.set_extensions_parallelism()
    node = GatewayNode(opts)
    node.enqueue_connection = MagicMock()

    node._register_potential_relay_peers(
        node._find_best_relay_peers(
            network_latency.get_best_relays_by_ping_latency_one_per_country()))
    node.enqueue_connection.assert_has_calls([
        call(LOCALHOST, 8001, ConnectionType.RELAY_BLOCK),
        call(LOCALHOST, 8002, ConnectionType.RELAY_TRANSACTION),
    ],
                                             any_order=True)
    node.on_connection_added(
        MockSocketConnection(1, node, ip_address=LOCALHOST, port=8001))
    node.on_connection_added(
        MockSocketConnection(2, node, ip_address=LOCALHOST, port=8002))

    node.alarm_queue = AlarmQueue()
    node.enqueue_connection.reset_mock()
    return node
コード例 #5
0
    def test_get_ping_latencies_one_country(self, mock_get_ping_latencies):
        relays = [
            OutboundPeerModel("34.227.149.148",
                              1609,
                              node_id="0",
                              attributes={"country": "China"}),
            OutboundPeerModel("35.198.90.230",
                              1609,
                              node_id="1",
                              attributes={"country": "China"}),
            OutboundPeerModel("52.221.211.38",
                              1609,
                              node_id="2",
                              attributes={"country": "China"}),
            OutboundPeerModel("34.245.23.125",
                              1609,
                              node_id="3",
                              attributes={"country": "EU"}),
            OutboundPeerModel("34.238.245.201",
                              1609,
                              node_id="4",
                              attributes={"country": "EU"}),
        ]

        mock_get_ping_latencies.return_value = [
            NodeLatencyInfo(relays[4], 100),
            NodeLatencyInfo(relays[1], 101),
            NodeLatencyInfo(relays[3], 109),
            NodeLatencyInfo(relays[2], 120),
            NodeLatencyInfo(relays[0], 130),
        ]
        best_relays = network_latency.get_best_relays_by_ping_latency_one_per_country(
            relays, 1)
        self.assertEqual(1, len(best_relays))
        self.assertEqual("1", best_relays[0].node_id)
コード例 #6
0
    def test_get_ping_latencies_current_relay_within_threshold_of_fastest(
            self, mock_get_ping_latencies):
        current_relay = OutboundPeerModel("52.221.211.38",
                                          1609,
                                          node_id="2",
                                          attributes={"country": "EU"})
        fastest_relay = OutboundPeerModel("35.198.90.230",
                                          1609,
                                          node_id="1",
                                          attributes={"country": "EU"})
        first_recommended_relay = OutboundPeerModel(
            "34.227.149.148", 1609, node_id="0", attributes={"country": "EU"})
        self.peer_relays = set()
        self.peer_relays.add(current_relay)

        relays = [
            first_recommended_relay,
            fastest_relay,
            current_relay,
            OutboundPeerModel("34.245.23.125",
                              1609,
                              node_id="3",
                              attributes={"country": "China"}),
            OutboundPeerModel("34.238.245.201",
                              1609,
                              node_id="4",
                              attributes={"country": "China"}),
        ]

        mock_get_ping_latencies.return_value = [
            NodeLatencyInfo(relays[4], 100),
            NodeLatencyInfo(fastest_relay, 8),
            NodeLatencyInfo(relays[3], 109),
            NodeLatencyInfo(current_relay, 10),
            NodeLatencyInfo(first_recommended_relay, 9),
        ]
        best_relays = network_latency.get_best_relays_by_ping_latency_one_per_country(
            relays, 2, self.peer_relays)
        self.assertEqual(2, len(best_relays))
        self.assertEqual("2", best_relays[0].node_id)
        self.assertEqual("3", best_relays[1].node_id)
コード例 #7
0
    def test_register_potential_relay_peers(self):
        node = initialize_split_relay_node()
        node.opts.country = constants.NODE_COUNTRY_CHINA

        relay1 = OutboundPeerModel(ip="10.10.10.01", port=1, node_id="1", node_type=NodeType.RELAY)
        relay2 = OutboundPeerModel(ip="10.10.10.02", port=1, node_id="2", node_type=NodeType.RELAY)
        relay3 = OutboundPeerModel(ip="10.10.10.03", port=1, node_id="3", node_type=NodeType.RELAY)
        relay4 = OutboundPeerModel(ip="10.10.10.04", port=1, node_id="4", node_type=NodeType.RELAY)

        # More then 2 potential relay, get 2 fastest
        network_latency.get_best_relays_by_ping_latency_one_per_country.return_value = [relay1, relay2]
        node._register_potential_relay_peers(
            node._find_best_relay_peers(
                network_latency.get_best_relays_by_ping_latency_one_per_country()
            )
        )
        self.assertEqual(2, len(node.peer_relays))
        self.assertIn(relay1, node.peer_relays)
        self.assertIn(relay2, node.peer_relays)
        self.assertEqual(2, len(node.peer_transaction_relays))
        self.assertNotIn(relay1, node.peer_transaction_relays)
        self.assertNotIn(relay2, node.peer_transaction_relays)
        self.assertTrue(
            any(
                peer.ip == relay1.ip and peer.port == relay1.port + 1
                for peer in node.peer_transaction_relays
            )
        )
        self.assertTrue(
            any(
                peer.ip == relay2.ip and peer.port == relay2.port + 1
                for peer in node.peer_transaction_relays
            )
        )

        # Second block relay changed
        network_latency.get_best_relays_by_ping_latency_one_per_country.return_value = [relay1, relay3]
        node._register_potential_relay_peers(
            node._find_best_relay_peers(
                [relay1, relay2, relay3]
            )
        )
        self.assertEqual(2, len(node.peer_relays))
        self.assertIn(relay1, node.peer_relays)
        self.assertIn(relay3, node.peer_relays)
        self.assertEqual(2, len(node.peer_transaction_relays))
        self.assertNotIn(relay1, node.peer_transaction_relays)
        self.assertNotIn(relay3, node.peer_transaction_relays)
        self.assertTrue(
            any(
                peer.ip == relay1.ip and peer.port == relay1.port + 1
                for peer in node.peer_transaction_relays
            )
        )
        self.assertTrue(
            any(
                peer.ip == relay3.ip and peer.port == relay3.port + 1
                for peer in node.peer_transaction_relays
            )
        )

        # Both relays changed
        network_latency.get_best_relays_by_ping_latency_one_per_country.return_value = [relay4, relay2]
        node._register_potential_relay_peers(
            node._find_best_relay_peers(
                [relay1, relay2, relay3, relay4]
            )
        )

        self.assertEqual(2, len(node.peer_relays))
        self.assertIn(relay4, node.peer_relays)
        self.assertIn(relay2, node.peer_relays)
        self.assertEqual(2, len(node.peer_transaction_relays))
        self.assertNotIn(relay4, node.peer_transaction_relays)
        self.assertNotIn(relay2, node.peer_transaction_relays)
        self.assertTrue(
            any(
                peer.ip == relay4.ip and peer.port == relay4.port + 1
                for peer in node.peer_transaction_relays
            )
        )
        self.assertTrue(
            any(
                peer.ip == relay2.ip and peer.port == relay2.port + 1
                for peer in node.peer_transaction_relays
            )
        )

        # Use existing peers if new peers are empty
        network_latency.get_best_relays_by_ping_latency_one_per_country.return_value = [relay4, relay2]
        node._register_potential_relay_peers(
            node._find_best_relay_peers(
                []
            )
        )
        self.assertEqual(2, len(node.peer_relays))
        self.assertIn(relay4, node.peer_relays)
        self.assertIn(relay2, node.peer_relays)
        self.assertEqual(2, len(node.peer_transaction_relays))
        self.assertNotIn(relay4, node.peer_transaction_relays)
        self.assertTrue(
            any(
                peer.ip == relay4.ip and peer.port == relay4.port + 1
                for peer in node.peer_transaction_relays
            )
        )
        self.assertTrue(
            any(
                peer.ip == relay2.ip and peer.port == relay2.port + 1
                for peer in node.peer_transaction_relays
            )
        )

        # Only one potential relay
        node.peer_relays.clear()
        node.peer_transaction_relays.clear()
        network_latency.get_best_relays_by_ping_latency_one_per_country.return_value = []
        node._register_potential_relay_peers([relay1])
        self.assertEqual(1, len(node.peer_relays))
        self.assertIn(relay1, node.peer_relays)
        self.assertEqual(1, len(node.peer_transaction_relays))
        self.assertNotIn(relay1, node.peer_transaction_relays)
        self.assertEqual(relay1.ip, next(iter(node.peer_transaction_relays)).ip)
        self.assertEqual(relay1.port + 1, next(iter(node.peer_transaction_relays)).port)