def test_delete_removes_multiple_types(self): class TestConnectionType(SerializableFlag): A = auto() B = auto() AB = A | B conn = MockConnection( MockSocketConnection(1, node=self.node1, ip_address=LOCALHOST, port=8000), self.node1) conn.CONNECTION_TYPE = TestConnectionType.AB self.conn_pool1.add(self.fileno1, LOCALHOST, 8000, conn) self.assertIn( conn, self.conn_pool1.get_by_connection_types([TestConnectionType.A])) self.assertIn( conn, self.conn_pool1.get_by_connection_types([TestConnectionType.B])) self.conn_pool1.delete(conn) self.assertNotIn( conn, self.conn_pool1.get_by_connection_types([TestConnectionType.A])) self.assertNotIn( conn, self.conn_pool1.get_by_connection_types([TestConnectionType.B]))
def _add_connection(self, fileno: int, port: int, network_num: int, connection_type=MockConnection.CONNECTION_TYPE) -> MockConnection: conn = MockConnection(MockSocketConnection(fileno, self.node, ip_address=LOCALHOST, port=port), self.node) conn.network_num = network_num conn.on_connection_established() conn.CONNECTION_TYPE = connection_type self.connection_pool.add(fileno, LOCALHOST, port, conn) return conn
def test_get_by_connection_types_performance(self): log_config.set_level([ "bxcommon.connections.abstract_node", "bxcommon.services.transaction_service" ], LogLevel.INFO) conn_pool = ConnectionPool() self.conn1.CONNECTION_TYPE = ConnectionType.EXTERNAL_GATEWAY self.conn2.CONNECTION_TYPE = ConnectionType.RELAY_BLOCK self.conn3.CONNECTION_TYPE = ConnectionType.RELAY_ALL number_of_iteration = 100 for i in range(40): ip = f"{i}.{i}.{i}.{i}" node = MockNode(helpers.get_common_opts(i, external_ip=ip)) conn = MockConnection( MockSocketConnection(i, ip_address=ip, port=i), node) if i % 7 == 0: conn.CONNECTION_TYPE = ConnectionType.RELAY_BLOCK elif i % 5 == 0: conn.CONNECTION_TYPE = ConnectionType.RELAY_TRANSACTION elif i % 3 == 0: conn.CONNECTION_TYPE = ConnectionType.INTERNAL_GATEWAY else: conn.CONNECTION_TYPE = ConnectionType.EXTERNAL_GATEWAY conn_pool.add(i, ip, i, conn) timeit_get_by_connections_types_one_type = timeit.timeit( lambda: conn_pool.get_by_connection_types([ConnectionType.GATEWAY] ), number=number_of_iteration) timeit_get_by_connections_types_two_types = timeit.timeit( lambda: conn_pool.get_by_connection_types( [ConnectionType.GATEWAY, ConnectionType.RELAY_TRANSACTION]), number=number_of_iteration) print( f"\ntimeit_get_by_connections_types_one_type # 2: {timeit_get_by_connections_types_one_type * 1000 / number_of_iteration:.4f}ms, " f"#connections: {len(list(conn_pool.get_by_connection_types([ConnectionType.GATEWAY])))}" f"\ntimeit_get_by_connections_types_two_types # 2: {timeit_get_by_connections_types_two_types * 1000 / number_of_iteration:.4f}ms, " f"#connections: {len(list(conn_pool.get_by_connection_types([ConnectionType.GATEWAY, ConnectionType.RELAY_TRANSACTION])))}" ) print("*****") for c in conn_pool.get_by_connection_types( [ConnectionType.GATEWAY, ConnectionType.RELAY_TRANSACTION]): print(f"connection: {c}, connection type: {c.CONNECTION_TYPE}")
def _add_connection( self, fileno: int, port: int, network_num: int, connection_type=MockConnection.CONNECTION_TYPE) -> MockConnection: conn = MockConnection(MockSocketConnection(fileno), (LOCALHOST, port), self.node) conn.network_num = network_num conn.state = ConnectionState.ESTABLISHED conn.CONNECTION_TYPE = connection_type self.connection_pool.add(fileno, LOCALHOST, port, conn) return conn
def test_delete_removes_multiple_types(self): class TestConnectionType(Flag): A = auto() B = auto() AB = A | B conn = MockConnection(MockSocketConnection(), (LOCALHOST, 8000), self.node1) conn.CONNECTION_TYPE = TestConnectionType.AB self.conn_pool1.add(self.fileno1, LOCALHOST, 8000, conn) self.assertIn(conn, self.conn_pool1.get_by_connection_type(TestConnectionType.A)) self.assertIn(conn, self.conn_pool1.get_by_connection_type(TestConnectionType.B)) self.conn_pool1.delete(conn) self.assertNotIn(conn, self.conn_pool1.get_by_connection_type(TestConnectionType.A)) self.assertNotIn(conn, self.conn_pool1.get_by_connection_type(TestConnectionType.B))