From 2a324c0076f6de2b62ab11e6e8c8977061466928 Mon Sep 17 00:00:00 2001 From: Christophe de Carvalho Pereira Martins Date: Fri, 7 Dec 2018 22:00:46 +0200 Subject: [PATCH] don't manually assign port during test fixes #89 instead of saving the multiaddr received in the listen method of the tcp transport class, read what the service is actually listening on this allow to use 0 as port and let the OS choose a free port for us --- tests/libp2p/test_libp2p.py | 18 +++++----- tests/protocol_muxer/test_protocol_muxer.py | 39 ++++++++++++--------- tests/transport/test_tcp.py | 20 +++++++++++ transport/tcp/tcp.py | 21 +++++++---- 4 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 tests/transport/test_tcp.py diff --git a/tests/libp2p/test_libp2p.py b/tests/libp2p/test_libp2p.py index 863d4c2..4255172 100644 --- a/tests/libp2p/test_libp2p.py +++ b/tests/libp2p/test_libp2p.py @@ -7,8 +7,8 @@ from peer.peerinfo import info_from_p2p_addr @pytest.mark.asyncio async def test_simple_messages(): - node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8001"]) - node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8000"]) + node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) + node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) async def stream_handler(stream): while True: @@ -41,8 +41,8 @@ async def test_simple_messages(): @pytest.mark.asyncio async def test_double_response(): - node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8002"]) - node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8003"]) + node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) + node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) async def stream_handler(stream): while True: @@ -80,12 +80,13 @@ async def test_double_response(): # Success, terminate pending tasks. return + @pytest.mark.asyncio async def test_multiple_streams(): # Node A should be able to open a stream with node B and then vice versa. # Stream IDs should be generated uniquely so that the stream state is not overwritten - node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8004"]) - node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8005"]) + node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) + node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) async def stream_handler_a(stream): while True: @@ -128,10 +129,11 @@ async def test_multiple_streams(): # Success, terminate pending tasks. return + @pytest.mark.asyncio async def test_host_connect(): - node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8001/"]) - node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/8000/"]) + node_a = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) + node_b = await new_node(transport_opt=["/ip4/127.0.0.1/tcp/0"]) assert not node_a.get_peerstore().peers() diff --git a/tests/protocol_muxer/test_protocol_muxer.py b/tests/protocol_muxer/test_protocol_muxer.py index 258859c..7ac4621 100644 --- a/tests/protocol_muxer/test_protocol_muxer.py +++ b/tests/protocol_muxer/test_protocol_muxer.py @@ -11,14 +11,14 @@ from protocol_muxer.multiselect_client import MultiselectClientError # TODO: modify tests so that those async issues don't occur # when using the same ports across tests -async def perform_simple_test(expected_selected_protocol, \ - protocols_for_client, protocols_with_handlers, \ - node_a_port, node_b_port): - transport_opt_a = ["/ip4/127.0.0.1/tcp/" + str(node_a_port)] - transport_opt_b = ["/ip4/127.0.0.1/tcp/" + str(node_b_port)] - node_a = await new_node(\ + +async def perform_simple_test(expected_selected_protocol, + protocols_for_client, protocols_with_handlers): + transport_opt_a = ["/ip4/127.0.0.1/tcp/0"] + transport_opt_b = ["/ip4/127.0.0.1/tcp/0"] + node_a = await new_node( transport_opt=transport_opt_a) - node_b = await new_node(\ + node_b = await new_node( transport_opt=transport_opt_b) async def stream_handler(stream): @@ -51,38 +51,43 @@ async def perform_simple_test(expected_selected_protocol, \ # Success, terminate pending tasks. return + @pytest.mark.asyncio async def test_single_protocol_succeeds(): expected_selected_protocol = "/echo/1.0.0" - await perform_simple_test(expected_selected_protocol, \ - ["/echo/1.0.0"], ["/echo/1.0.0"], 8050, 8051) + await perform_simple_test(expected_selected_protocol, + ["/echo/1.0.0"], ["/echo/1.0.0"]) + @pytest.mark.asyncio async def test_single_protocol_fails(): with pytest.raises(MultiselectClientError): - await perform_simple_test("", ["/echo/1.0.0"], \ - ["/potato/1.0.0"], 8052, 8053) + await perform_simple_test("", ["/echo/1.0.0"], + ["/potato/1.0.0"]) + @pytest.mark.asyncio async def test_multiple_protocol_first_is_valid_succeeds(): expected_selected_protocol = "/echo/1.0.0" protocols_for_client = ["/echo/1.0.0", "/potato/1.0.0"] protocols_for_listener = ["/foo/1.0.0", "/echo/1.0.0"] - await perform_simple_test(expected_selected_protocol, protocols_for_client, \ - protocols_for_listener, 8054, 8055) + await perform_simple_test(expected_selected_protocol, protocols_for_client, + protocols_for_listener) + @pytest.mark.asyncio async def test_multiple_protocol_second_is_valid_succeeds(): expected_selected_protocol = "/foo/1.0.0" protocols_for_client = ["/rock/1.0.0", "/foo/1.0.0"] protocols_for_listener = ["/foo/1.0.0", "/echo/1.0.0"] - await perform_simple_test(expected_selected_protocol, protocols_for_client, \ - protocols_for_listener, 8056, 8057) + await perform_simple_test(expected_selected_protocol, protocols_for_client, + protocols_for_listener) + @pytest.mark.asyncio async def test_multiple_protocol_fails(): protocols_for_client = ["/rock/1.0.0", "/foo/1.0.0", "/bar/1.0.0"] protocols_for_listener = ["/aspyn/1.0.0", "/rob/1.0.0", "/zx/1.0.0", "/alex/1.0.0"] with pytest.raises(MultiselectClientError): - await perform_simple_test("", protocols_for_client, \ - protocols_for_listener, 8058, 8059) + await perform_simple_test("", protocols_for_client, + protocols_for_listener) diff --git a/tests/transport/test_tcp.py b/tests/transport/test_tcp.py new file mode 100644 index 0000000..34b5b90 --- /dev/null +++ b/tests/transport/test_tcp.py @@ -0,0 +1,20 @@ +import asyncio + +import pytest + +from transport.tcp.tcp import _multiaddr_from_socket + + +@pytest.mark.asyncio +async def test_multiaddr_from_socket(): + def handler(r, w): + pass + + server = await asyncio.start_server(handler, '127.0.0.1', 8000) + assert str(_multiaddr_from_socket(server.sockets[0])) == '/ip4/127.0.0.1/tcp/8000' + + server = await asyncio.start_server(handler, '127.0.0.1', 0) + addr = _multiaddr_from_socket(server.sockets[0]) + assert addr.value_for_protocol('ip4') == '127.0.0.1' + port = addr.value_for_protocol('tcp') + assert int(port) > 0 diff --git a/transport/tcp/tcp.py b/transport/tcp/tcp.py index 24ad69e..72fc454 100644 --- a/transport/tcp/tcp.py +++ b/transport/tcp/tcp.py @@ -1,7 +1,11 @@ import asyncio -from transport.transport_interface import ITransport -from transport.listener_interface import IListener + +import multiaddr + from network.connection.raw_connection import RawConnection +from transport.listener_interface import IListener +from transport.transport_interface import ITransport + class TCP(ITransport): @@ -22,14 +26,15 @@ class TCP(ITransport): :return: return True if successful """ _multiaddr = multiaddr - _multiaddr = _multiaddr.decapsulate('/ipfs') - self.multiaddrs.append(_multiaddr) coroutine = asyncio.start_server(self.handler, - _multiaddr.value_for_protocol('ip4'), - _multiaddr.value_for_protocol('tcp')) + _multiaddr.value_for_protocol('ip4'), + _multiaddr.value_for_protocol('tcp')) self.server = await coroutine + socket = self.server.sockets[0] + self.multiaddrs.append(_multiaddr_from_socket(socket)) + return True def get_addrs(self): @@ -80,3 +85,7 @@ class TCP(ITransport): :return: a listener object that implements listener_interface.py """ return self.Listener(handler_function) + + +def _multiaddr_from_socket(socket): + return multiaddr.Multiaddr("/ip4/%s/tcp/%s" % socket.getsockname())