From 0fbf45d8ca92f5289a296345268e2fc8e7bf5642 Mon Sep 17 00:00:00 2001 From: mhchia Date: Mon, 8 Jul 2019 16:14:49 +0800 Subject: [PATCH 1/6] Pin the versions Especially, use the latest multiaddr --- setup.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/setup.py b/setup.py index 452ea3b2..4807b5b9 100644 --- a/setup.py +++ b/setup.py @@ -15,16 +15,16 @@ setuptools.setup( platforms=["unix", "linux", "osx"], classifiers=classifiers, install_requires=[ - "pycryptodome", - "click", - "base58", - "pymultihash", - "multiaddr==0.0.4", - "rpcudp", - "grpcio", - "grpcio-tools", + "pycryptodome>=3.8.2,<4.0.0", + "click>=7.0,<8.0", + "base58>=1.0.3,<2.0.0", + "pymultihash>=0.8.2", + "multiaddr>=0.0.8,<0.1.0", + "rpcudp>=3.0.0,<4.0.0", + "grpcio>=1.21.1,<2.0.0", + "grpcio-tools>=1.21.1,<2.0.0", "lru-dict>=1.1.6", - "aio_timers" + "aio_timers>=0.0.1,<0.1.0", ], packages=setuptools.find_packages(exclude=["tests", "tests.*"]), zip_safe=False, From 73125b99b0437c3334f00128532a24efe06e70c6 Mon Sep 17 00:00:00 2001 From: mhchia Date: Mon, 8 Jul 2019 17:13:08 +0800 Subject: [PATCH 2/6] Fix the error due to the breaking change In multiaddr, `split` is moved to `Multiaddr`'s method. --- libp2p/peer/peerinfo.py | 19 ++++++++++++------- libp2p/transport/tcp/tcp.py | 12 +++++------- tests/peer/test_peerinfo.py | 8 ++++---- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index 2e7edb9a..bbc3eb1d 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -1,5 +1,4 @@ import multiaddr -import multiaddr.util from .id import id_b58_decode from .peerdata import PeerData @@ -12,17 +11,23 @@ class PeerInfo: self.addrs = peer_data.get_addrs() if peer_data else None -def info_from_p2p_addr(addr): +def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: if not addr: - raise InvalidAddrError() + raise InvalidAddrError("addr should not be None") - parts = multiaddr.util.split(addr) + if not isinstance(addr, multiaddr.Multiaddr): + raise InvalidAddrError(f"addr={addr} should be in type Multiaddr") + + parts = addr.split() if not parts: raise InvalidAddrError() p2p_part = parts[-1] - if p2p_part.protocols()[0].code != multiaddr.protocols.P_P2P: - raise InvalidAddrError() + last_protocol_code = p2p_part.protocols()[0].code + if last_protocol_code != multiaddr.protocols.P_P2P: + raise InvalidAddrError( + f"the last protocol should be P_P2P instead of {last_protocol_code}" + ) # make sure the /p2p value parses as a peer.ID peer_id_str = p2p_part.value_for_protocol(multiaddr.protocols.P_P2P) @@ -30,7 +35,7 @@ def info_from_p2p_addr(addr): # we might have received just an / p2p part, which means there's no addr. if len(parts) > 1: - addr = multiaddr.util.join(parts[:-1]) + addr = multiaddr.Multiaddr.join(*parts[:-1]) peer_data = PeerData() peer_data.addrs = [addr] diff --git a/libp2p/transport/tcp/tcp.py b/libp2p/transport/tcp/tcp.py index f99b78cb..bcbb5332 100644 --- a/libp2p/transport/tcp/tcp.py +++ b/libp2p/transport/tcp/tcp.py @@ -27,13 +27,11 @@ class TCP(ITransport): :param maddr: maddr of peer :return: return True if successful """ - _multiaddr = maddr - _multiaddr = _multiaddr.decapsulate('/p2p') - - coroutine = asyncio.start_server(self.handler, - _multiaddr.value_for_protocol('ip4'), - _multiaddr.value_for_protocol('tcp')) - self.server = await coroutine + self.server = await asyncio.start_server( + self.handler, + maddr.value_for_protocol('ip4'), + maddr.value_for_protocol('tcp'), + ) socket = self.server.sockets[0] self.multiaddrs.append(_multiaddr_from_socket(socket)) diff --git a/tests/peer/test_peerinfo.py b/tests/peer/test_peerinfo.py index 30f5e50b..ea861586 100644 --- a/tests/peer/test_peerinfo.py +++ b/tests/peer/test_peerinfo.py @@ -22,7 +22,7 @@ def test_init_(): def test_init_no_value(): with pytest.raises(Exception) as _: - #pylint: disable=no-value-for-parameter + # pylint: disable=no-value-for-parameter PeerInfo() def test_invalid_addr_1(): @@ -30,10 +30,10 @@ def test_invalid_addr_1(): info_from_p2p_addr(None) def test_invalid_addr_2(monkeypatch): - random_addrs = [random.randint(0, 255) for r in range(4)] - monkeypatch.setattr("multiaddr.util.split", lambda x: None) + random_addr = random.randint(0, 255) + monkeypatch.setattr("multiaddr.Multiaddr.split", lambda x: None) with pytest.raises(InvalidAddrError): - info_from_p2p_addr(random_addrs) + info_from_p2p_addr(random_addr) def test_info_from_p2p_addr(): # pylint: disable=line-too-long From d3eb68fa50aa5894d282e68859b3e5174f942c96 Mon Sep 17 00:00:00 2001 From: mhchia Date: Mon, 8 Jul 2019 17:50:32 +0800 Subject: [PATCH 3/6] Increase coverage --- tests/peer/test_peerinfo.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/tests/peer/test_peerinfo.py b/tests/peer/test_peerinfo.py index ea861586..1ad1dc08 100644 --- a/tests/peer/test_peerinfo.py +++ b/tests/peer/test_peerinfo.py @@ -1,12 +1,17 @@ import random -import multiaddr + import pytest + +import multiaddr + from libp2p.peer.peerinfo import PeerInfo, info_from_p2p_addr, InvalidAddrError from libp2p.peer.peerdata import PeerData from libp2p.peer.id import ID + ALPHABETS = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' + def test_init_(): peer_data = PeerData() random_addrs = [random.randint(0, 255) for r in range(4)] @@ -20,22 +25,27 @@ def test_init_(): assert peer_info.peer_id == peer_id assert peer_info.addrs == random_addrs + def test_init_no_value(): with pytest.raises(Exception) as _: # pylint: disable=no-value-for-parameter PeerInfo() -def test_invalid_addr_1(): - with pytest.raises(InvalidAddrError): - info_from_p2p_addr(None) -def test_invalid_addr_2(monkeypatch): - random_addr = random.randint(0, 255) - monkeypatch.setattr("multiaddr.Multiaddr.split", lambda x: None) +@pytest.mark.parametrize( + 'addr', + ( + None, + random.randint(0, 255), + multiaddr.Multiaddr('/'), + ) +) +def test_info_from_p2p_addr_invalid(addr): with pytest.raises(InvalidAddrError): - info_from_p2p_addr(random_addr) + info_from_p2p_addr(addr) -def test_info_from_p2p_addr(): + +def test_info_from_p2p_addr_valid(): # pylint: disable=line-too-long m_addr = multiaddr.Multiaddr('/ip4/127.0.0.1/tcp/8000/p2p/3YgLAeMKSAPcGqZkAt8mREqhQXmJT8SN8VCMN4T6ih4GNX9wvK8mWJnWZ1qA2mLdCQ') info = info_from_p2p_addr(m_addr) From a2d1aadf25e7185e73287a31f08a9ab3a7d9c281 Mon Sep 17 00:00:00 2001 From: mhchia Date: Mon, 8 Jul 2019 17:55:25 +0800 Subject: [PATCH 4/6] Add test for checking p2p code --- tests/peer/test_peerinfo.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/peer/test_peerinfo.py b/tests/peer/test_peerinfo.py index 1ad1dc08..75a78cef 100644 --- a/tests/peer/test_peerinfo.py +++ b/tests/peer/test_peerinfo.py @@ -35,9 +35,12 @@ def test_init_no_value(): @pytest.mark.parametrize( 'addr', ( - None, - random.randint(0, 255), - multiaddr.Multiaddr('/'), + pytest.param(None), + pytest.param(random.randint(0, 255), id='random integer'), + pytest.param(multiaddr.Multiaddr('/'), id='empty multiaddr'), + pytest.param( + multiaddr.Multiaddr('/ip4/127.0.0.1'), id='multiaddr without peer_id(p2p protocol)' + ), ) ) def test_info_from_p2p_addr_invalid(addr): From 085a5e7526eef6e6066694b111fb97677e835b29 Mon Sep 17 00:00:00 2001 From: Kevin Mai-Husan Chia Date: Sat, 20 Jul 2019 22:38:56 +0800 Subject: [PATCH 5/6] Apply suggestions from code review Co-Authored-By: NIC Lin --- libp2p/peer/peerinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index bbc3eb1d..d708fda1 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -13,10 +13,10 @@ class PeerInfo: def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: if not addr: - raise InvalidAddrError("addr should not be None") + raise InvalidAddrError("`addr` should not be `None`") if not isinstance(addr, multiaddr.Multiaddr): - raise InvalidAddrError(f"addr={addr} should be in type Multiaddr") + raise InvalidAddrError(f"`addr`={addr} should be of type `Multiaddr`") parts = addr.split() if not parts: @@ -26,7 +26,7 @@ def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: last_protocol_code = p2p_part.protocols()[0].code if last_protocol_code != multiaddr.protocols.P_P2P: raise InvalidAddrError( - f"the last protocol should be P_P2P instead of {last_protocol_code}" + f"The last protocol should be `P_P2P` instead of `{last_protocol_code}`" ) # make sure the /p2p value parses as a peer.ID From 8d3b3fdb6c4a66c19b28a56c12794172bd285f92 Mon Sep 17 00:00:00 2001 From: mhchia Date: Sat, 20 Jul 2019 22:47:37 +0800 Subject: [PATCH 6/6] Add debug msg --- libp2p/peer/peerinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index d708fda1..e1730669 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -20,7 +20,7 @@ def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: parts = addr.split() if not parts: - raise InvalidAddrError() + raise InvalidAddrError(f"`parts`={parts} should at least have a protocol `P_P2P`") p2p_part = parts[-1] last_protocol_code = p2p_part.protocols()[0].code