17
17
from multiaddr .protocols import _names_to_protocols
18
18
from multiaddr .protocols import Protocol
19
19
20
- # These test values were generated by running them
21
- # through the go implementation of multiaddr.
22
- # https://github.com/multiformats/go-multiaddr
23
- ADDR_BYTES_MAP_STR_TEST_DATA = [
20
+ # These test values were generated by running them through the go implementation
21
+ # of multiaddr (https://github.com/multiformats/go-multiaddr)
22
+ #
23
+ # All values are bijective.
24
+ ADDR_BYTES_STR_TEST_DATA = [
24
25
(_names_to_protocols ['ip4' ], b'\x0a \x0b \x0c \x0d ' , '10.11.12.13' ),
25
26
(_names_to_protocols ['ip6' ],
26
27
b'\x1a \xa1 \x2b \xb2 \x3c \xc3 \x4d \xd4 \x5e \xe5 \x6f \xf6 \x7a \xb7 \x8a \xc8 ' ,
30
31
b'\x9a \x18 \x08 \x73 \x06 \x36 \x90 \x43 \x09 \x1f \x04 \xd2 ' ,
31
32
'timaq4ygg2iegci7:1234' ),
32
33
(_names_to_protocols ['p2p' ],
33
- b'\x12 \x20 \xd5 \x2e \xbb \x89 \xd8 \x5b \x02 \xa2 \x84 \x94 \x82 \x03 \xa6 \x2f \xf2 '
34
- b'\x83 \x89 \xc5 \x7c \x9f \x42 \xbe \xec \x4e \xc2 \x0d \xb7 \x6a \x68 \x91 \x1c \x0b ' ,
34
+ b'\x01 \x72 \ x12\x20 \xd5 \x2e \xbb \x89 \xd8 \x5b \x02 \xa2 \x84 \x94 \x82 \x03 \xa6 \x2f '
35
+ b'\xf2 \ x83\x89 \xc5 \x7c \x9f \x42 \xbe \xec \x4e \xc2 \x0d \xb7 \x6a \x68 \x91 \x1c \x0b ' ,
35
36
'QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC' ),
36
37
37
38
# Additional test data
38
39
(_names_to_protocols ['dns4' ],
39
40
b'\xd9 \x85 \xd9 \x88 \xd9 \x82 \xd8 \xb9 .\xd9 \x88 \xd8 \xb2 \xd8 \xa7 \xd8 \xb1 \xd8 \xa9 '
40
41
b'-\xd8 \xa7 \xd9 \x84 \xd8 \xa7 \xd8 \xaa \xd8 \xb5 \xd8 \xa7 \xd9 \x84 \xd8 \xa7 \xd8 \xaa '
41
42
b'.\xd9 \x85 \xd8 \xb5 \xd8 \xb1 ' ,
42
- # Explicitly mark this as unicode to force the text to be LTR in editors
43
+ # Explicitly mark this as unicode, as the “u” forces the text to be displayed LTR in editors
43
44
u'موقع.وزارة-الاتصالات.مصر' ),
44
45
(_names_to_protocols ['dns4' ],
45
46
b'fu\xc3 \x9f ball.example' ,
46
47
'fußball.example' ), # This will fail if IDNA-2003/NamePrep is used
47
48
]
48
49
50
+ ADDR_BYTES_FROM_STR_TEST_DATA = [
51
+ # New CIDv1 string to new CIDv1 binary format mapping (non-bijective)
52
+ (_names_to_protocols ['p2p' ],
53
+ b'\x01 \x72 \x12 \x20 \xd5 \x2e \xbb \x89 \xd8 \x5b \x02 \xa2 \x84 \x94 \x82 \x03 \xa6 \x2f '
54
+ b'\xf2 \x83 \x89 \xc5 \x7c \x9f \x42 \xbe \xec \x4e \xc2 \x0d \xb7 \x6a \x68 \x91 \x1c \x0b ' ,
55
+ 'bafzbeigvf25ytwc3akrijfecaotc74udrhcxzh2cx3we5qqnw5vgrei4bm' ),
56
+ ]
57
+
58
+ ADDR_BYTES_TO_STR_TEST_DATA = [
59
+ # Old CIDv0 binary to old CIDv0 string format mapping (non-bijective)
60
+ (_names_to_protocols ['p2p' ],
61
+ b'\x12 \x20 \xd5 \x2e \xbb \x89 \xd8 \x5b \x02 \xa2 \x84 \x94 \x82 \x03 \xa6 \x2f \xf2 '
62
+ b'\x83 \x89 \xc5 \x7c \x9f \x42 \xbe \xec \x4e \xc2 \x0d \xb7 \x6a \x68 \x91 \x1c \x0b ' ,
63
+ 'QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC' ),
64
+ ]
65
+
49
66
BYTES_MAP_STR_TEST_DATA = [
50
67
("/ip4/127.0.0.1/udp/1234" , b'\x04 \x7f \x00 \x00 \x01 \x91 \x02 \x04 \xd2 ' ),
51
68
("/ip4/127.0.0.1/tcp/4321" , b'\x04 \x7f \x00 \x00 \x01 \x06 \x10 \xe1 ' ),
57
74
@pytest .mark .parametrize ("codec_name, buf, expected" , [
58
75
(None , b'\x01 \x02 \x03 ' , (0 , 0 )),
59
76
('ip4' , b'\x01 \x02 \x03 ' , (4 , 0 )),
60
- ('p2p ' , b'\x40 \x50 \x60 \x51 ' , (64 , 1 )),
77
+ ('cid ' , b'\x40 \x50 \x60 \x51 ' , (64 , 1 )),
61
78
])
62
79
def test_size_for_addr (codec_name , buf , expected ):
63
80
buf_io = io .BytesIO (buf )
@@ -76,13 +93,14 @@ def test_bytes_iter(buf, expected):
76
93
assert list ((proto , val ) for _ , proto , _ , val in bytes_iter (buf )) == expected
77
94
78
95
79
- @pytest .mark .parametrize ("proto, buf, expected" , ADDR_BYTES_MAP_STR_TEST_DATA )
96
+ @pytest .mark .parametrize ("proto, buf, expected" ,
97
+ ADDR_BYTES_STR_TEST_DATA + ADDR_BYTES_TO_STR_TEST_DATA )
80
98
def test_codec_to_string (proto , buf , expected ):
81
99
assert codec_by_name (proto .codec ).to_string (proto , buf ) == expected
82
100
83
101
84
102
@pytest .mark .parametrize ("proto, expected, string" ,
85
- ADDR_BYTES_MAP_STR_TEST_DATA )
103
+ ADDR_BYTES_STR_TEST_DATA + ADDR_BYTES_FROM_STR_TEST_DATA )
86
104
def test_codec_to_bytes (proto , string , expected ):
87
105
assert codec_by_name (proto .codec ).to_bytes (proto , string ) == expected
88
106
@@ -149,6 +167,8 @@ def test_bytes_to_string_value_error(protocol_extension, bytes):
149
167
(_names_to_protocols ['onion' ], 'timaq4ygg2iegci7:0' ),
150
168
(_names_to_protocols ['onion' ], 'timaq4ygg2iegci7:71234' ),
151
169
(_names_to_protocols ['p2p' ], '15230d52ebb89d85b02a284948203a' ),
170
+ (_names_to_protocols ['p2p' ], # CID type != "libp2p-key":
171
+ 'bafyaajaiaejcbrrv5vds2whn3c464rsb5r2vpxeanneinzlijenlac77cju2pptf' ),
152
172
(_names_to_protocols ['ip6zone' ], "" ),
153
173
])
154
174
def test_codec_to_bytes_value_error (proto , address ):
@@ -160,10 +180,45 @@ def test_codec_to_bytes_value_error(proto, address):
160
180
161
181
@pytest .mark .parametrize ("proto, buf" , [
162
182
(_names_to_protocols ['tcp' ], b'\xff \xff \xff \xff ' ),
183
+ (_names_to_protocols ['p2p' ], # CID type != "libp2p-key":
184
+ b"\x01 \x70 \x00 \x24 \x08 \x01 \x12 \x20 \xc6 \x35 \xed \x47 \x2d \x58 \xed \xd8 \xb9 \xee \x46 \x41 "
185
+ b"\xec \x75 \x57 \xdc \x80 \x6b \x48 \x86 \xe5 \x68 \x49 \x1a \xb0 \x0b \xff \x12 \x69 \xa7 \xbe \x65 " ),
163
186
(_names_to_protocols ['ip6zone' ], b"" ),
164
187
])
165
188
def test_codec_to_string_value_error (proto , buf ):
166
189
# Codecs themselves may raise any exception type – it will then be converted
167
190
# to `BinaryParseError` by a higher level
168
191
with pytest .raises (Exception ):
169
192
codec_by_name (proto .codec ).to_string (proto , buf )
193
+
194
+
195
+ @pytest .mark .parametrize ("proto, string, expected" , [
196
+ (_names_to_protocols ["p2p" ], # This one gets autoconverted to CIDv1
197
+ "12D3KooWPA6ax6t3jqTyGq73Zm1RmwppYqxaXzrtarfcTWGp5Wzx" ,
198
+ b"\x01 \x72 \x00 \x24 \x08 \x01 \x12 \x20 \xc6 \x35 \xed \x47 \x2d \x58 \xed \xd8 \xb9 \xee \x46 \x41 "
199
+ b"\xec \x75 \x57 \xdc \x80 \x6b \x48 \x86 \xe5 \x68 \x49 \x1a \xb0 \x0b \xff \x12 \x69 \xa7 \xbe \x65 " ),
200
+ (_names_to_protocols ["ip6" ], # Others do not
201
+ "12D3KooWPA6ax6t3jqTyGq73Zm1RmwppYqxaXzrtarfcTWGp5Wzx" ,
202
+ b"\x00 \x24 \x08 \x01 \x12 \x20 \xc6 \x35 \xed \x47 \x2d \x58 \xed \xd8 \xb9 \xee \x46 \x41 \xec \x75 "
203
+ b"\x57 \xdc \x80 \x6b \x48 \x86 \xe5 \x68 \x49 \x1a \xb0 \x0b \xff \x12 \x69 \xa7 \xbe \x65 " ),
204
+ ])
205
+ def test_cid_autoconvert_to_bytes (proto , string , expected ):
206
+ assert codec_by_name ("cid" ).to_bytes (proto , string ) == expected
207
+
208
+
209
+ @pytest .mark .parametrize ("proto, buf, expected" , [
210
+ (_names_to_protocols ["p2p" ], # This one gets autoconverted to CIDv0
211
+ b"\x01 \x72 \x00 \x24 \x08 \x01 \x12 \x20 \xc6 \x35 \xed \x47 \x2d \x58 \xed \xd8 \xb9 \xee \x46 \x41 "
212
+ b"\xec \x75 \x57 \xdc \x80 \x6b \x48 \x86 \xe5 \x68 \x49 \x1a \xb0 \x0b \xff \x12 \x69 \xa7 \xbe \x65 " ,
213
+ "12D3KooWPA6ax6t3jqTyGq73Zm1RmwppYqxaXzrtarfcTWGp5Wzx" ),
214
+ (_names_to_protocols ["ip6" ], # Others do not
215
+ b"\x01 \x72 \x00 \x24 \x08 \x01 \x12 \x20 \xc6 \x35 \xed \x47 \x2d \x58 \xed \xd8 \xb9 \xee \x46 \x41 "
216
+ b"\xec \x75 \x57 \xdc \x80 \x6b \x48 \x86 \xe5 \x68 \x49 \x1a \xb0 \x0b \xff \x12 \x69 \xa7 \xbe \x65 " ,
217
+ "bafzaajaiaejcbrrv5vds2whn3c464rsb5r2vpxeanneinzlijenlac77cju2pptf" ),
218
+ (_names_to_protocols ["ip6" ], # (Needed to put identity conversion test somewhere)
219
+ b"\x00 \x24 \x08 \x01 \x12 \x20 \xc6 \x35 \xed \x47 \x2d \x58 \xed \xd8 \xb9 \xee \x46 \x41 \xec \x75 "
220
+ b"\x57 \xdc \x80 \x6b \x48 \x86 \xe5 \x68 \x49 \x1a \xb0 \x0b \xff \x12 \x69 \xa7 \xbe \x65 " ,
221
+ "12D3KooWPA6ax6t3jqTyGq73Zm1RmwppYqxaXzrtarfcTWGp5Wzx" ),
222
+ ])
223
+ def test_cid_autoconvert_to_string (proto , buf , expected ):
224
+ assert codec_by_name ("cid" ).to_string (proto , buf ) == expected
0 commit comments