synapse 2.180.1__py311-none-any.whl → 2.181.0__py311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synapse might be problematic. Click here for more details.

Files changed (85) hide show
  1. synapse/assets/__init__.py +35 -0
  2. synapse/assets/storm/migrations/model-0.2.28.storm +355 -0
  3. synapse/common.py +2 -1
  4. synapse/cortex.py +49 -35
  5. synapse/cryotank.py +1 -1
  6. synapse/datamodel.py +30 -0
  7. synapse/lib/ast.py +12 -7
  8. synapse/lib/cell.py +1 -1
  9. synapse/lib/chop.py +0 -1
  10. synapse/lib/drive.py +8 -8
  11. synapse/lib/layer.py +55 -13
  12. synapse/lib/lmdbslab.py +26 -5
  13. synapse/lib/modelrev.py +28 -1
  14. synapse/lib/modules.py +1 -0
  15. synapse/lib/nexus.py +1 -1
  16. synapse/lib/node.py +5 -0
  17. synapse/lib/parser.py +23 -16
  18. synapse/lib/scrape.py +1 -1
  19. synapse/lib/slabseqn.py +2 -2
  20. synapse/lib/snap.py +129 -0
  21. synapse/lib/storm.lark +16 -2
  22. synapse/lib/storm.py +3 -0
  23. synapse/lib/storm_format.py +1 -0
  24. synapse/lib/stormhttp.py +34 -1
  25. synapse/lib/stormlib/auth.py +1 -1
  26. synapse/lib/stormlib/cortex.py +5 -2
  27. synapse/lib/stormlib/ipv6.py +2 -2
  28. synapse/lib/stormlib/model.py +114 -12
  29. synapse/lib/stormlib/project.py +1 -1
  30. synapse/lib/stormtypes.py +81 -7
  31. synapse/lib/types.py +7 -0
  32. synapse/lib/version.py +2 -2
  33. synapse/lib/view.py +47 -0
  34. synapse/models/inet.py +10 -3
  35. synapse/models/infotech.py +2 -1
  36. synapse/models/language.py +4 -0
  37. synapse/models/math.py +50 -0
  38. synapse/models/orgs.py +8 -0
  39. synapse/models/risk.py +9 -0
  40. synapse/tests/files/stormcov/pragma-nocov.storm +18 -0
  41. synapse/tests/test_assets.py +25 -0
  42. synapse/tests/test_cortex.py +129 -0
  43. synapse/tests/test_datamodel.py +6 -0
  44. synapse/tests/test_lib_grammar.py +7 -1
  45. synapse/tests/test_lib_layer.py +35 -0
  46. synapse/tests/test_lib_lmdbslab.py +11 -9
  47. synapse/tests/test_lib_modelrev.py +655 -1
  48. synapse/tests/test_lib_slabseqn.py +5 -4
  49. synapse/tests/test_lib_snap.py +4 -0
  50. synapse/tests/test_lib_storm.py +72 -1
  51. synapse/tests/test_lib_stormhttp.py +99 -1
  52. synapse/tests/test_lib_stormlib_cortex.py +21 -4
  53. synapse/tests/test_lib_stormlib_iters.py +8 -5
  54. synapse/tests/test_lib_stormlib_model.py +45 -6
  55. synapse/tests/test_lib_stormtypes.py +158 -2
  56. synapse/tests/test_lib_types.py +6 -0
  57. synapse/tests/test_model_inet.py +10 -0
  58. synapse/tests/test_model_language.py +4 -0
  59. synapse/tests/test_model_math.py +22 -0
  60. synapse/tests/test_model_orgs.py +6 -2
  61. synapse/tests/test_model_risk.py +4 -0
  62. synapse/tests/test_utils_stormcov.py +5 -0
  63. synapse/tests/utils.py +18 -5
  64. synapse/utils/stormcov/plugin.py +31 -1
  65. synapse/vendor/cpython/LICENSE +279 -0
  66. synapse/vendor/cpython/__init__.py +0 -0
  67. synapse/vendor/cpython/lib/__init__.py +0 -0
  68. synapse/vendor/cpython/lib/email/__init__.py +0 -0
  69. synapse/vendor/cpython/lib/email/_parseaddr.py +560 -0
  70. synapse/vendor/cpython/lib/email/utils.py +505 -0
  71. synapse/vendor/cpython/lib/ipaddress.py +2366 -0
  72. synapse/vendor/cpython/lib/test/__init__.py +0 -0
  73. synapse/vendor/cpython/lib/test/support/__init__.py +114 -0
  74. synapse/vendor/cpython/lib/test/test_email/__init__.py +0 -0
  75. synapse/vendor/cpython/lib/test/test_email/test_email.py +480 -0
  76. synapse/vendor/cpython/lib/test/test_email/test_utils.py +167 -0
  77. synapse/vendor/cpython/lib/test/test_ipaddress.py +2672 -0
  78. synapse/vendor/utils.py +4 -3
  79. {synapse-2.180.1.dist-info → synapse-2.181.0.dist-info}/METADATA +1 -1
  80. {synapse-2.180.1.dist-info → synapse-2.181.0.dist-info}/RECORD +83 -66
  81. {synapse-2.180.1.dist-info → synapse-2.181.0.dist-info}/WHEEL +1 -1
  82. synapse/lib/jupyter.py +0 -505
  83. synapse/tests/test_lib_jupyter.py +0 -224
  84. {synapse-2.180.1.dist-info → synapse-2.181.0.dist-info}/LICENSE +0 -0
  85. {synapse-2.180.1.dist-info → synapse-2.181.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,2672 @@
1
+ ##############################################################################
2
+ # Taken from the cpython 3.11 source branch after the 3.11.10 release.
3
+ # It has been modified for vendored imports and vendored test harness.
4
+ # Subclasses have been modified to use super().setUp() calls
5
+ ##############################################################################
6
+ # Copyright 2007 Google Inc.
7
+ # Licensed to PSF under a Contributor Agreement.
8
+
9
+ """Unittest for ipaddress module."""
10
+
11
+
12
+ import copy
13
+ import unittest
14
+ import re
15
+ import contextlib
16
+ import operator
17
+ import pickle
18
+ import synapse.vendor.cpython.lib.ipaddress as ipaddress
19
+ import weakref
20
+ from synapse.vendor.cpython.lib.test.support import LARGEST, SMALLEST
21
+
22
+ import synapse.vendor.utils as s_v_utils
23
+
24
+ class BaseTestCase(s_v_utils.VendorTest):
25
+ # One big change in ipaddress over the original ipaddr module is
26
+ # error reporting that tries to assume users *don't know the rules*
27
+ # for what constitutes an RFC compliant IP address
28
+
29
+ # Ensuring these errors are emitted correctly in all relevant cases
30
+ # meant moving to a more systematic test structure that allows the
31
+ # test structure to map more directly to the module structure
32
+
33
+ # Note that if the constructors are refactored so that addresses with
34
+ # multiple problems get classified differently, that's OK - just
35
+ # move the affected examples to the newly appropriate test case.
36
+
37
+ # There is some duplication between the original relatively ad hoc
38
+ # test suite and the new systematic tests. While some redundancy in
39
+ # testing is considered preferable to accidentally deleting a valid
40
+ # test, the original test suite will likely be reduced over time as
41
+ # redundant tests are identified.
42
+
43
+ @property
44
+ def factory(self):
45
+ raise NotImplementedError
46
+
47
+ @contextlib.contextmanager
48
+ def assertCleanError(self, exc_type, details, *args):
49
+ """
50
+ Ensure exception does not display a context by default
51
+
52
+ Wraps unittest.TestCase.assertRaisesRegex
53
+ """
54
+ if args:
55
+ details = details % args
56
+ cm = self.assertRaisesRegex(exc_type, details)
57
+ with cm as exc:
58
+ yield exc
59
+ # Ensure we produce clean tracebacks on failure
60
+ if exc.exception.__context__ is not None:
61
+ self.assertTrue(exc.exception.__suppress_context__)
62
+
63
+ def assertAddressError(self, details, *args):
64
+ """Ensure a clean AddressValueError"""
65
+ return self.assertCleanError(ipaddress.AddressValueError,
66
+ details, *args)
67
+
68
+ def assertNetmaskError(self, details, *args):
69
+ """Ensure a clean NetmaskValueError"""
70
+ return self.assertCleanError(ipaddress.NetmaskValueError,
71
+ details, *args)
72
+
73
+ def assertInstancesEqual(self, lhs, rhs):
74
+ """Check constructor arguments produce equivalent instances"""
75
+ self.assertEqual(self.factory(lhs), self.factory(rhs))
76
+
77
+
78
+ class CommonTestMixin:
79
+
80
+ def test_empty_address(self):
81
+ with self.assertAddressError("Address cannot be empty"):
82
+ self.factory("")
83
+
84
+ def test_floats_rejected(self):
85
+ with self.assertAddressError(re.escape(repr("1.0"))):
86
+ self.factory(1.0)
87
+
88
+ def test_not_an_index_issue15559(self):
89
+ # Implementing __index__ makes for a very nasty interaction with the
90
+ # bytes constructor. Thus, we disallow implicit use as an integer
91
+ self.assertRaises(TypeError, operator.index, self.factory(1))
92
+ self.assertRaises(TypeError, hex, self.factory(1))
93
+ self.assertRaises(TypeError, bytes, self.factory(1))
94
+
95
+ def pickle_test(self, addr):
96
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
97
+ with self.subTest(proto=proto):
98
+ x = self.factory(addr)
99
+ y = pickle.loads(pickle.dumps(x, proto))
100
+ self.assertEqual(y, x)
101
+
102
+
103
+ class CommonTestMixin_v4(CommonTestMixin):
104
+
105
+ def test_leading_zeros(self):
106
+ # bpo-36384: no leading zeros to avoid ambiguity with octal notation
107
+ msg = "Leading zeros are not permitted in '\\d+'"
108
+ addresses = [
109
+ "000.000.000.000",
110
+ "192.168.000.001",
111
+ "016.016.016.016",
112
+ "001.000.008.016",
113
+ "01.2.3.40",
114
+ "1.02.3.40",
115
+ "1.2.03.40",
116
+ "1.2.3.040",
117
+ ]
118
+ for address in addresses:
119
+ with self.subTest(address=address):
120
+ with self.assertAddressError(msg):
121
+ self.factory(address)
122
+
123
+ def test_int(self):
124
+ self.assertInstancesEqual(0, "0.0.0.0")
125
+ self.assertInstancesEqual(3232235521, "192.168.0.1")
126
+
127
+ def test_packed(self):
128
+ self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
129
+ self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
130
+
131
+ def test_negative_ints_rejected(self):
132
+ msg = "-1 (< 0) is not permitted as an IPv4 address"
133
+ with self.assertAddressError(re.escape(msg)):
134
+ self.factory(-1)
135
+
136
+ def test_large_ints_rejected(self):
137
+ msg = "%d (>= 2**32) is not permitted as an IPv4 address"
138
+ with self.assertAddressError(re.escape(msg % 2**32)):
139
+ self.factory(2**32)
140
+
141
+ def test_bad_packed_length(self):
142
+ def assertBadLength(length):
143
+ addr = b'\0' * length
144
+ msg = "%r (len %d != 4) is not permitted as an IPv4 address"
145
+ with self.assertAddressError(re.escape(msg % (addr, length))):
146
+ self.factory(addr)
147
+
148
+ assertBadLength(3)
149
+ assertBadLength(5)
150
+
151
+
152
+ class CommonTestMixin_v6(CommonTestMixin):
153
+
154
+ def test_leading_zeros(self):
155
+ self.assertInstancesEqual("0000::0000", "::")
156
+ self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
157
+
158
+ def test_int(self):
159
+ self.assertInstancesEqual(0, "::")
160
+ self.assertInstancesEqual(3232235521, "::c0a8:1")
161
+
162
+ def test_packed(self):
163
+ addr = b'\0' * 12 + bytes.fromhex("00000000")
164
+ self.assertInstancesEqual(addr, "::")
165
+ addr = b'\0' * 12 + bytes.fromhex("c0a80001")
166
+ self.assertInstancesEqual(addr, "::c0a8:1")
167
+ addr = bytes.fromhex("c0a80001") + b'\0' * 12
168
+ self.assertInstancesEqual(addr, "c0a8:1::")
169
+
170
+ def test_negative_ints_rejected(self):
171
+ msg = "-1 (< 0) is not permitted as an IPv6 address"
172
+ with self.assertAddressError(re.escape(msg)):
173
+ self.factory(-1)
174
+
175
+ def test_large_ints_rejected(self):
176
+ msg = "%d (>= 2**128) is not permitted as an IPv6 address"
177
+ with self.assertAddressError(re.escape(msg % 2**128)):
178
+ self.factory(2**128)
179
+
180
+ def test_bad_packed_length(self):
181
+ def assertBadLength(length):
182
+ addr = b'\0' * length
183
+ msg = "%r (len %d != 16) is not permitted as an IPv6 address"
184
+ with self.assertAddressError(re.escape(msg % (addr, length))):
185
+ self.factory(addr)
186
+ self.factory(addr)
187
+
188
+ assertBadLength(15)
189
+ assertBadLength(17)
190
+
191
+ def test_blank_scope_id(self):
192
+ address = ('::1%')
193
+ with self.assertAddressError('Invalid IPv6 address: "%r"', address):
194
+ self.factory(address)
195
+
196
+ def test_invalid_scope_id_with_percent(self):
197
+ address = ('::1%scope%')
198
+ with self.assertAddressError('Invalid IPv6 address: "%r"', address):
199
+ self.factory(address)
200
+
201
+ class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
202
+ factory = ipaddress.IPv4Address
203
+
204
+ def test_format(self):
205
+ v4 = ipaddress.IPv4Address("1.2.3.42")
206
+ v4_pairs = [
207
+ ("b", "00000001000000100000001100101010"),
208
+ ("n", "00000001000000100000001100101010"),
209
+ ("x", "0102032a"),
210
+ ("X", "0102032A"),
211
+ ("_b", "0000_0001_0000_0010_0000_0011_0010_1010"),
212
+ ("_n", "0000_0001_0000_0010_0000_0011_0010_1010"),
213
+ ("_x", "0102_032a"),
214
+ ("_X", "0102_032A"),
215
+ ("#b", "0b00000001000000100000001100101010"),
216
+ ("#n", "0b00000001000000100000001100101010"),
217
+ ("#x", "0x0102032a"),
218
+ ("#X", "0X0102032A"),
219
+ ("#_b", "0b0000_0001_0000_0010_0000_0011_0010_1010"),
220
+ ("#_n", "0b0000_0001_0000_0010_0000_0011_0010_1010"),
221
+ ("#_x", "0x0102_032a"),
222
+ ("#_X", "0X0102_032A"),
223
+ ("s", "1.2.3.42"),
224
+ ("", "1.2.3.42"),
225
+ ]
226
+ for (fmt, txt) in v4_pairs:
227
+ self.assertEqual(txt, format(v4, fmt))
228
+
229
+ def test_network_passed_as_address(self):
230
+ addr = "127.0.0.1/24"
231
+ with self.assertAddressError("Unexpected '/' in %r", addr):
232
+ ipaddress.IPv4Address(addr)
233
+
234
+ def test_bad_address_split(self):
235
+ def assertBadSplit(addr):
236
+ with self.assertAddressError("Expected 4 octets in %r", addr):
237
+ ipaddress.IPv4Address(addr)
238
+
239
+ assertBadSplit("127.0.1")
240
+ assertBadSplit("42.42.42.42.42")
241
+ assertBadSplit("42.42.42")
242
+ assertBadSplit("42.42")
243
+ assertBadSplit("42")
244
+ assertBadSplit("42..42.42.42")
245
+ assertBadSplit("42.42.42.42.")
246
+ assertBadSplit("42.42.42.42...")
247
+ assertBadSplit(".42.42.42.42")
248
+ assertBadSplit("...42.42.42.42")
249
+ assertBadSplit("016.016.016")
250
+ assertBadSplit("016.016")
251
+ assertBadSplit("016")
252
+ assertBadSplit("000")
253
+ assertBadSplit("0x0a.0x0a.0x0a")
254
+ assertBadSplit("0x0a.0x0a")
255
+ assertBadSplit("0x0a")
256
+ assertBadSplit(".")
257
+ assertBadSplit("bogus")
258
+ assertBadSplit("bogus.com")
259
+ assertBadSplit("1000")
260
+ assertBadSplit("1000000000000000")
261
+ assertBadSplit("192.168.0.1.com")
262
+
263
+ def test_empty_octet(self):
264
+ def assertBadOctet(addr):
265
+ with self.assertAddressError("Empty octet not permitted in %r",
266
+ addr):
267
+ ipaddress.IPv4Address(addr)
268
+
269
+ assertBadOctet("42..42.42")
270
+ assertBadOctet("...")
271
+
272
+ def test_invalid_characters(self):
273
+ def assertBadOctet(addr, octet):
274
+ msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
275
+ with self.assertAddressError(re.escape(msg)):
276
+ ipaddress.IPv4Address(addr)
277
+
278
+ assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
279
+ assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
280
+ assertBadOctet("42.42.42.-0", "-0")
281
+ assertBadOctet("42.42.42.+0", "+0")
282
+ assertBadOctet("42.42.42.-42", "-42")
283
+ assertBadOctet("+1.+2.+3.4", "+1")
284
+ assertBadOctet("1.2.3.4e0", "4e0")
285
+ assertBadOctet("1.2.3.4::", "4::")
286
+ assertBadOctet("1.a.2.3", "a")
287
+
288
+ def test_octet_length(self):
289
+ def assertBadOctet(addr, octet):
290
+ msg = "At most 3 characters permitted in %r in %r"
291
+ with self.assertAddressError(re.escape(msg % (octet, addr))):
292
+ ipaddress.IPv4Address(addr)
293
+
294
+ assertBadOctet("0000.000.000.000", "0000")
295
+ assertBadOctet("12345.67899.-54321.-98765", "12345")
296
+
297
+ def test_octet_limit(self):
298
+ def assertBadOctet(addr, octet):
299
+ msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
300
+ with self.assertAddressError(re.escape(msg)):
301
+ ipaddress.IPv4Address(addr)
302
+
303
+ assertBadOctet("257.0.0.0", 257)
304
+ assertBadOctet("192.168.0.999", 999)
305
+
306
+ def test_pickle(self):
307
+ self.pickle_test('192.0.2.1')
308
+
309
+ def test_weakref(self):
310
+ weakref.ref(self.factory('192.0.2.1'))
311
+
312
+
313
+ class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
314
+ factory = ipaddress.IPv6Address
315
+
316
+ def test_format(self):
317
+
318
+ v6 = ipaddress.IPv6Address("::1.2.3.42")
319
+ v6_pairs = [
320
+ ("b",
321
+ "000000000000000000000000000000000000000000000000000000"
322
+ "000000000000000000000000000000000000000000000000010000"
323
+ "00100000001100101010"),
324
+ ("n", "0000000000000000000000000102032a"),
325
+ ("x", "0000000000000000000000000102032a"),
326
+ ("X", "0000000000000000000000000102032A"),
327
+ ("_b",
328
+ "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
329
+ "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
330
+ "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010"
331
+ "_1010"),
332
+ ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"),
333
+ ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"),
334
+ ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"),
335
+ ("#b",
336
+ "0b0000000000000000000000000000000000000000000000000000"
337
+ "000000000000000000000000000000000000000000000000000100"
338
+ "0000100000001100101010"),
339
+ ("#n", "0x0000000000000000000000000102032a"),
340
+ ("#x", "0x0000000000000000000000000102032a"),
341
+ ("#X", "0X0000000000000000000000000102032A"),
342
+ ("#_b",
343
+ "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
344
+ "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
345
+ "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011"
346
+ "_0010_1010"),
347
+ ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
348
+ ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
349
+ ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"),
350
+ ("s", "::102:32a"),
351
+ ("", "::102:32a"),
352
+ ]
353
+
354
+ for (fmt, txt) in v6_pairs:
355
+ self.assertEqual(txt, format(v6, fmt))
356
+
357
+ def test_network_passed_as_address(self):
358
+ def assertBadSplit(addr):
359
+ msg = "Unexpected '/' in %r"
360
+ with self.assertAddressError(msg, addr):
361
+ ipaddress.IPv6Address(addr)
362
+ assertBadSplit("::1/24")
363
+ assertBadSplit("::1%scope_id/24")
364
+
365
+ def test_bad_address_split_v6_not_enough_parts(self):
366
+ def assertBadSplit(addr):
367
+ msg = "At least 3 parts expected in %r"
368
+ with self.assertAddressError(msg, addr.split('%')[0]):
369
+ ipaddress.IPv6Address(addr)
370
+
371
+ assertBadSplit(":")
372
+ assertBadSplit(":1")
373
+ assertBadSplit("FEDC:9878")
374
+ assertBadSplit(":%scope")
375
+ assertBadSplit(":1%scope")
376
+ assertBadSplit("FEDC:9878%scope")
377
+
378
+ def test_bad_address_split_v6_too_many_colons(self):
379
+ def assertBadSplit(addr):
380
+ msg = "At most 8 colons permitted in %r"
381
+ with self.assertAddressError(msg, addr.split('%')[0]):
382
+ ipaddress.IPv6Address(addr)
383
+
384
+ assertBadSplit("9:8:7:6:5:4:3::2:1")
385
+ assertBadSplit("10:9:8:7:6:5:4:3:2:1")
386
+ assertBadSplit("::8:7:6:5:4:3:2:1")
387
+ assertBadSplit("8:7:6:5:4:3:2:1::")
388
+ # A trailing IPv4 address is two parts
389
+ assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
390
+
391
+ assertBadSplit("9:8:7:6:5:4:3::2:1%scope")
392
+ assertBadSplit("10:9:8:7:6:5:4:3:2:1%scope")
393
+ assertBadSplit("::8:7:6:5:4:3:2:1%scope")
394
+ assertBadSplit("8:7:6:5:4:3:2:1::%scope")
395
+ # A trailing IPv4 address is two parts
396
+ assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope")
397
+
398
+ def test_bad_address_split_v6_too_many_parts(self):
399
+ def assertBadSplit(addr):
400
+ msg = "Exactly 8 parts expected without '::' in %r"
401
+ with self.assertAddressError(msg, addr.split('%')[0]):
402
+ ipaddress.IPv6Address(addr)
403
+
404
+ assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
405
+ assertBadSplit("9:8:7:6:5:4:3:2:1")
406
+ assertBadSplit("7:6:5:4:3:2:1")
407
+ # A trailing IPv4 address is two parts
408
+ assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
409
+ assertBadSplit("7:6:5:4:3:42.42.42.42")
410
+
411
+ assertBadSplit("3ffe:0:0:0:0:0:0:0:1%scope")
412
+ assertBadSplit("9:8:7:6:5:4:3:2:1%scope")
413
+ assertBadSplit("7:6:5:4:3:2:1%scope")
414
+ # A trailing IPv4 address is two parts
415
+ assertBadSplit("9:8:7:6:5:4:3:42.42.42.42%scope")
416
+ assertBadSplit("7:6:5:4:3:42.42.42.42%scope")
417
+
418
+ def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
419
+ def assertBadSplit(addr):
420
+ msg = "Expected at most 7 other parts with '::' in %r"
421
+ with self.assertAddressError(msg, addr.split('%')[0]):
422
+ ipaddress.IPv6Address(addr)
423
+
424
+ assertBadSplit("1:2:3:4::5:6:7:8")
425
+ assertBadSplit("1:2:3:4::5:6:7:8%scope")
426
+
427
+ def test_bad_address_split_v6_repeated_double_colon(self):
428
+ def assertBadSplit(addr):
429
+ msg = "At most one '::' permitted in %r"
430
+ with self.assertAddressError(msg, addr.split('%')[0]):
431
+ ipaddress.IPv6Address(addr)
432
+
433
+ assertBadSplit("3ffe::1::1")
434
+ assertBadSplit("1::2::3::4:5")
435
+ assertBadSplit("2001::db:::1")
436
+ assertBadSplit("3ffe::1::")
437
+ assertBadSplit("::3ffe::1")
438
+ assertBadSplit(":3ffe::1::1")
439
+ assertBadSplit("3ffe::1::1:")
440
+ assertBadSplit(":3ffe::1::1:")
441
+ assertBadSplit(":::")
442
+ assertBadSplit('2001:db8:::1')
443
+
444
+ assertBadSplit("3ffe::1::1%scope")
445
+ assertBadSplit("1::2::3::4:5%scope")
446
+ assertBadSplit("2001::db:::1%scope")
447
+ assertBadSplit("3ffe::1::%scope")
448
+ assertBadSplit("::3ffe::1%scope")
449
+ assertBadSplit(":3ffe::1::1%scope")
450
+ assertBadSplit("3ffe::1::1:%scope")
451
+ assertBadSplit(":3ffe::1::1:%scope")
452
+ assertBadSplit(":::%scope")
453
+ assertBadSplit('2001:db8:::1%scope')
454
+
455
+ def test_bad_address_split_v6_leading_colon(self):
456
+ def assertBadSplit(addr):
457
+ msg = "Leading ':' only permitted as part of '::' in %r"
458
+ with self.assertAddressError(msg, addr.split('%')[0]):
459
+ ipaddress.IPv6Address(addr)
460
+
461
+ assertBadSplit(":2001:db8::1")
462
+ assertBadSplit(":1:2:3:4:5:6:7")
463
+ assertBadSplit(":1:2:3:4:5:6:")
464
+ assertBadSplit(":6:5:4:3:2:1::")
465
+
466
+ assertBadSplit(":2001:db8::1%scope")
467
+ assertBadSplit(":1:2:3:4:5:6:7%scope")
468
+ assertBadSplit(":1:2:3:4:5:6:%scope")
469
+ assertBadSplit(":6:5:4:3:2:1::%scope")
470
+
471
+ def test_bad_address_split_v6_trailing_colon(self):
472
+ def assertBadSplit(addr):
473
+ msg = "Trailing ':' only permitted as part of '::' in %r"
474
+ with self.assertAddressError(msg, addr.split('%')[0]):
475
+ ipaddress.IPv6Address(addr)
476
+
477
+ assertBadSplit("2001:db8::1:")
478
+ assertBadSplit("1:2:3:4:5:6:7:")
479
+ assertBadSplit("::1.2.3.4:")
480
+ assertBadSplit("::7:6:5:4:3:2:")
481
+
482
+ assertBadSplit("2001:db8::1:%scope")
483
+ assertBadSplit("1:2:3:4:5:6:7:%scope")
484
+ assertBadSplit("::1.2.3.4:%scope")
485
+ assertBadSplit("::7:6:5:4:3:2:%scope")
486
+
487
+ def test_bad_v4_part_in(self):
488
+ def assertBadAddressPart(addr, v4_error):
489
+ with self.assertAddressError("%s in %r", v4_error, addr.split('%')[0]):
490
+ ipaddress.IPv6Address(addr)
491
+
492
+ assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
493
+ assertBadAddressPart("3ffe::127.0.1",
494
+ "Expected 4 octets in '127.0.1'")
495
+ assertBadAddressPart("::1.2.3",
496
+ "Expected 4 octets in '1.2.3'")
497
+ assertBadAddressPart("::1.2.3.4.5",
498
+ "Expected 4 octets in '1.2.3.4.5'")
499
+ assertBadAddressPart("3ffe::1.1.1.net",
500
+ "Only decimal digits permitted in 'net' "
501
+ "in '1.1.1.net'")
502
+
503
+ assertBadAddressPart("3ffe::1.net%scope", "Expected 4 octets in '1.net'")
504
+ assertBadAddressPart("3ffe::127.0.1%scope",
505
+ "Expected 4 octets in '127.0.1'")
506
+ assertBadAddressPart("::1.2.3%scope",
507
+ "Expected 4 octets in '1.2.3'")
508
+ assertBadAddressPart("::1.2.3.4.5%scope",
509
+ "Expected 4 octets in '1.2.3.4.5'")
510
+ assertBadAddressPart("3ffe::1.1.1.net%scope",
511
+ "Only decimal digits permitted in 'net' "
512
+ "in '1.1.1.net'")
513
+
514
+ def test_invalid_characters(self):
515
+ def assertBadPart(addr, part):
516
+ msg = "Only hex digits permitted in %r in %r" % (part, addr.split('%')[0])
517
+ with self.assertAddressError(re.escape(msg)):
518
+ ipaddress.IPv6Address(addr)
519
+
520
+ assertBadPart("3ffe::goog", "goog")
521
+ assertBadPart("3ffe::-0", "-0")
522
+ assertBadPart("3ffe::+0", "+0")
523
+ assertBadPart("3ffe::-1", "-1")
524
+ assertBadPart("1.2.3.4::", "1.2.3.4")
525
+ assertBadPart('1234:axy::b', "axy")
526
+
527
+ assertBadPart("3ffe::goog%scope", "goog")
528
+ assertBadPart("3ffe::-0%scope", "-0")
529
+ assertBadPart("3ffe::+0%scope", "+0")
530
+ assertBadPart("3ffe::-1%scope", "-1")
531
+ assertBadPart("1.2.3.4::%scope", "1.2.3.4")
532
+ assertBadPart('1234:axy::b%scope', "axy")
533
+
534
+ def test_part_length(self):
535
+ def assertBadPart(addr, part):
536
+ msg = "At most 4 characters permitted in %r in %r"
537
+ with self.assertAddressError(msg, part, addr.split('%')[0]):
538
+ ipaddress.IPv6Address(addr)
539
+
540
+ assertBadPart("::00000", "00000")
541
+ assertBadPart("3ffe::10000", "10000")
542
+ assertBadPart("02001:db8::", "02001")
543
+ assertBadPart('2001:888888::1', "888888")
544
+
545
+ assertBadPart("::00000%scope", "00000")
546
+ assertBadPart("3ffe::10000%scope", "10000")
547
+ assertBadPart("02001:db8::%scope", "02001")
548
+ assertBadPart('2001:888888::1%scope', "888888")
549
+
550
+ def test_pickle(self):
551
+ self.pickle_test('2001:db8::')
552
+ self.pickle_test('2001:db8::%scope')
553
+
554
+ def test_weakref(self):
555
+ weakref.ref(self.factory('2001:db8::'))
556
+ weakref.ref(self.factory('2001:db8::%scope'))
557
+
558
+ def test_copy(self):
559
+ addr = self.factory('2001:db8::%scope')
560
+ self.assertEqual(addr, copy.copy(addr))
561
+ self.assertEqual(addr, copy.deepcopy(addr))
562
+
563
+
564
+ class NetmaskTestMixin_v4(CommonTestMixin_v4):
565
+ """Input validation on interfaces and networks is very similar"""
566
+
567
+ def test_no_mask(self):
568
+ for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
569
+ net = self.factory(address)
570
+ self.assertEqual(str(net), '1.2.3.4/32')
571
+ self.assertEqual(str(net.netmask), '255.255.255.255')
572
+ self.assertEqual(str(net.hostmask), '0.0.0.0')
573
+ # IPv4Network has prefixlen, but IPv4Interface doesn't.
574
+ # Should we add it to IPv4Interface too? (bpo-36392)
575
+
576
+ def test_split_netmask(self):
577
+ addr = "1.2.3.4/32/24"
578
+ with self.assertAddressError("Only one '/' permitted in %r" % addr):
579
+ self.factory(addr)
580
+
581
+ def test_address_errors(self):
582
+ def assertBadAddress(addr, details):
583
+ with self.assertAddressError(details):
584
+ self.factory(addr)
585
+
586
+ assertBadAddress("/", "Address cannot be empty")
587
+ assertBadAddress("/8", "Address cannot be empty")
588
+ assertBadAddress("bogus", "Expected 4 octets")
589
+ assertBadAddress("google.com", "Expected 4 octets")
590
+ assertBadAddress("10/8", "Expected 4 octets")
591
+ assertBadAddress("::1.2.3.4", "Only decimal digits")
592
+ assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
593
+
594
+ def test_valid_netmask(self):
595
+ self.assertEqual(str(self.factory(('192.0.2.0', 24))), '192.0.2.0/24')
596
+ self.assertEqual(str(self.factory(('192.0.2.0', '24'))), '192.0.2.0/24')
597
+ self.assertEqual(str(self.factory(('192.0.2.0', '255.255.255.0'))),
598
+ '192.0.2.0/24')
599
+ self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
600
+ '192.0.2.0/24')
601
+ for i in range(0, 33):
602
+ # Generate and re-parse the CIDR format (trivial).
603
+ net_str = '0.0.0.0/%d' % i
604
+ net = self.factory(net_str)
605
+ self.assertEqual(str(net), net_str)
606
+ # Generate and re-parse the expanded netmask.
607
+ self.assertEqual(
608
+ str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
609
+ # Zero prefix is treated as decimal.
610
+ self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
611
+ # Generate and re-parse the expanded hostmask. The ambiguous
612
+ # cases (/0 and /32) are treated as netmasks.
613
+ if i in (32, 0):
614
+ net_str = '0.0.0.0/%d' % (32 - i)
615
+ self.assertEqual(
616
+ str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
617
+
618
+ def test_netmask_errors(self):
619
+ def assertBadNetmask(addr, netmask):
620
+ msg = "%r is not a valid netmask" % netmask
621
+ with self.assertNetmaskError(re.escape(msg)):
622
+ self.factory("%s/%s" % (addr, netmask))
623
+
624
+ assertBadNetmask("1.2.3.4", "")
625
+ assertBadNetmask("1.2.3.4", "-1")
626
+ assertBadNetmask("1.2.3.4", "+1")
627
+ assertBadNetmask("1.2.3.4", " 1 ")
628
+ assertBadNetmask("1.2.3.4", "0x1")
629
+ assertBadNetmask("1.2.3.4", "33")
630
+ assertBadNetmask("1.2.3.4", "254.254.255.256")
631
+ assertBadNetmask("1.2.3.4", "1.a.2.3")
632
+ assertBadNetmask("1.1.1.1", "254.xyz.2.3")
633
+ assertBadNetmask("1.1.1.1", "240.255.0.0")
634
+ assertBadNetmask("1.1.1.1", "255.254.128.0")
635
+ assertBadNetmask("1.1.1.1", "0.1.127.255")
636
+ assertBadNetmask("1.1.1.1", "pudding")
637
+ assertBadNetmask("1.1.1.1", "::")
638
+
639
+ def test_netmask_in_tuple_errors(self):
640
+ def assertBadNetmask(addr, netmask):
641
+ msg = "%r is not a valid netmask" % netmask
642
+ with self.assertNetmaskError(re.escape(msg)):
643
+ self.factory((addr, netmask))
644
+ assertBadNetmask("1.1.1.1", -1)
645
+ assertBadNetmask("1.1.1.1", 33)
646
+
647
+ def test_pickle(self):
648
+ self.pickle_test('192.0.2.0/27')
649
+ self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
650
+ self.pickle_test('192.0.2.0') # IPV4LENGTH
651
+
652
+
653
+ class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
654
+ factory = ipaddress.IPv4Interface
655
+
656
+
657
+ class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
658
+ factory = ipaddress.IPv4Network
659
+
660
+ def test_subnet_of(self):
661
+ # containee left of container
662
+ self.assertFalse(
663
+ self.factory('10.0.0.0/30').subnet_of(
664
+ self.factory('10.0.1.0/24')))
665
+ # containee inside container
666
+ self.assertTrue(
667
+ self.factory('10.0.0.0/30').subnet_of(
668
+ self.factory('10.0.0.0/24')))
669
+ # containee right of container
670
+ self.assertFalse(
671
+ self.factory('10.0.0.0/30').subnet_of(
672
+ self.factory('10.0.1.0/24')))
673
+ # containee larger than container
674
+ self.assertFalse(
675
+ self.factory('10.0.1.0/24').subnet_of(
676
+ self.factory('10.0.0.0/30')))
677
+
678
+ def test_supernet_of(self):
679
+ # containee left of container
680
+ self.assertFalse(
681
+ self.factory('10.0.0.0/30').supernet_of(
682
+ self.factory('10.0.1.0/24')))
683
+ # containee inside container
684
+ self.assertFalse(
685
+ self.factory('10.0.0.0/30').supernet_of(
686
+ self.factory('10.0.0.0/24')))
687
+ # containee right of container
688
+ self.assertFalse(
689
+ self.factory('10.0.0.0/30').supernet_of(
690
+ self.factory('10.0.1.0/24')))
691
+ # containee larger than container
692
+ self.assertTrue(
693
+ self.factory('10.0.0.0/24').supernet_of(
694
+ self.factory('10.0.0.0/30')))
695
+
696
+ def test_subnet_of_mixed_types(self):
697
+ with self.assertRaises(TypeError):
698
+ ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
699
+ ipaddress.IPv6Network('::1/128'))
700
+ with self.assertRaises(TypeError):
701
+ ipaddress.IPv6Network('::1/128').supernet_of(
702
+ ipaddress.IPv4Network('10.0.0.0/30'))
703
+ with self.assertRaises(TypeError):
704
+ ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
705
+ ipaddress.IPv6Network('::1/128'))
706
+ with self.assertRaises(TypeError):
707
+ ipaddress.IPv6Network('::1/128').subnet_of(
708
+ ipaddress.IPv4Network('10.0.0.0/30'))
709
+
710
+
711
+ class NetmaskTestMixin_v6(CommonTestMixin_v6):
712
+ """Input validation on interfaces and networks is very similar"""
713
+
714
+ def test_no_mask(self):
715
+ for address in ('::1', 1, b'\x00' * 15 + b'\x01'):
716
+ net = self.factory(address)
717
+ self.assertEqual(str(net), '::1/128')
718
+ self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
719
+ self.assertEqual(str(net.hostmask), '::')
720
+ # IPv6Network has prefixlen, but IPv6Interface doesn't.
721
+ # Should we add it to IPv4Interface too? (bpo-36392)
722
+
723
+ scoped_net = self.factory('::1%scope')
724
+ self.assertEqual(str(scoped_net), '::1%scope/128')
725
+ self.assertEqual(str(scoped_net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
726
+ self.assertEqual(str(scoped_net.hostmask), '::')
727
+
728
+ def test_split_netmask(self):
729
+ addr = "cafe:cafe::/128/190"
730
+ with self.assertAddressError("Only one '/' permitted in %r" % addr):
731
+ self.factory(addr)
732
+
733
+ scoped_addr = "cafe:cafe::%scope/128/190"
734
+ with self.assertAddressError("Only one '/' permitted in %r" % scoped_addr):
735
+ self.factory(scoped_addr)
736
+
737
+ def test_address_errors(self):
738
+ def assertBadAddress(addr, details):
739
+ with self.assertAddressError(details):
740
+ self.factory(addr)
741
+
742
+ assertBadAddress("/", "Address cannot be empty")
743
+ assertBadAddress("/8", "Address cannot be empty")
744
+ assertBadAddress("google.com", "At least 3 parts")
745
+ assertBadAddress("1.2.3.4", "At least 3 parts")
746
+ assertBadAddress("10/8", "At least 3 parts")
747
+ assertBadAddress("1234:axy::b", "Only hex digits")
748
+
749
+ assertBadAddress("/%scope", "Address cannot be empty")
750
+ assertBadAddress("/%scope8", "Address cannot be empty")
751
+ assertBadAddress("google.com%scope", "At least 3 parts")
752
+ assertBadAddress("1.2.3.4%scope", "At least 3 parts")
753
+ assertBadAddress("10%scope/8", "At least 3 parts")
754
+ assertBadAddress("1234:axy::b%scope", "Only hex digits")
755
+
756
+ def test_valid_netmask(self):
757
+ # We only support CIDR for IPv6, because expanded netmasks are not
758
+ # standard notation.
759
+ self.assertEqual(str(self.factory(('2001:db8::', 32))),
760
+ '2001:db8::/32')
761
+ self.assertEqual(str(self.factory(('2001:db8::', '32'))),
762
+ '2001:db8::/32')
763
+ self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
764
+ for i in range(0, 129):
765
+ # Generate and re-parse the CIDR format (trivial).
766
+ net_str = '::/%d' % i
767
+ self.assertEqual(str(self.factory(net_str)), net_str)
768
+ # Zero prefix is treated as decimal.
769
+ self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
770
+
771
+ self.assertEqual(str(self.factory('2001:db8::%scope/32')), '2001:db8::%scope/32')
772
+ for i in range(0, 129):
773
+ # Generate and re-parse the CIDR format (trivial).
774
+ net_str = '::/%d' % i
775
+ self.assertEqual(str(self.factory(net_str)), net_str)
776
+ # Zero prefix is treated as decimal.
777
+ self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
778
+
779
+ def test_netmask_errors(self):
780
+ def assertBadNetmask(addr, netmask):
781
+ msg = "%r is not a valid netmask" % netmask
782
+ with self.assertNetmaskError(re.escape(msg)):
783
+ self.factory("%s/%s" % (addr, netmask))
784
+
785
+ assertBadNetmask("::1", "")
786
+ assertBadNetmask("::1", "::1")
787
+ assertBadNetmask("::1", "1::")
788
+ assertBadNetmask("::1", "-1")
789
+ assertBadNetmask("::1", "+1")
790
+ assertBadNetmask("::1", " 1 ")
791
+ assertBadNetmask("::1", "0x1")
792
+ assertBadNetmask("::1", "129")
793
+ assertBadNetmask("::1", "1.2.3.4")
794
+ assertBadNetmask("::1", "pudding")
795
+ assertBadNetmask("::", "::")
796
+
797
+ assertBadNetmask("::1%scope", "pudding")
798
+
799
+ def test_netmask_in_tuple_errors(self):
800
+ def assertBadNetmask(addr, netmask):
801
+ msg = "%r is not a valid netmask" % netmask
802
+ with self.assertNetmaskError(re.escape(msg)):
803
+ self.factory((addr, netmask))
804
+ assertBadNetmask("::1", -1)
805
+ assertBadNetmask("::1", 129)
806
+ assertBadNetmask("::1%scope", 129)
807
+
808
+ def test_pickle(self):
809
+ self.pickle_test('2001:db8::1000/124')
810
+ self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
811
+ self.pickle_test('2001:db8::1000') # IPV6LENGTH
812
+
813
+ self.pickle_test('2001:db8::1000%scope') # IPV6LENGTH
814
+
815
+
816
+ class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
817
+ factory = ipaddress.IPv6Interface
818
+
819
+
820
+ class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
821
+ factory = ipaddress.IPv6Network
822
+
823
+ def test_subnet_of(self):
824
+ # containee left of container
825
+ self.assertFalse(
826
+ self.factory('2000:999::/56').subnet_of(
827
+ self.factory('2000:aaa::/48')))
828
+ # containee inside container
829
+ self.assertTrue(
830
+ self.factory('2000:aaa::/56').subnet_of(
831
+ self.factory('2000:aaa::/48')))
832
+ # containee right of container
833
+ self.assertFalse(
834
+ self.factory('2000:bbb::/56').subnet_of(
835
+ self.factory('2000:aaa::/48')))
836
+ # containee larger than container
837
+ self.assertFalse(
838
+ self.factory('2000:aaa::/48').subnet_of(
839
+ self.factory('2000:aaa::/56')))
840
+
841
+ self.assertFalse(
842
+ self.factory('2000:999::%scope/56').subnet_of(
843
+ self.factory('2000:aaa::%scope/48')))
844
+ self.assertTrue(
845
+ self.factory('2000:aaa::%scope/56').subnet_of(
846
+ self.factory('2000:aaa::%scope/48')))
847
+
848
+ def test_supernet_of(self):
849
+ # containee left of container
850
+ self.assertFalse(
851
+ self.factory('2000:999::/56').supernet_of(
852
+ self.factory('2000:aaa::/48')))
853
+ # containee inside container
854
+ self.assertFalse(
855
+ self.factory('2000:aaa::/56').supernet_of(
856
+ self.factory('2000:aaa::/48')))
857
+ # containee right of container
858
+ self.assertFalse(
859
+ self.factory('2000:bbb::/56').supernet_of(
860
+ self.factory('2000:aaa::/48')))
861
+ # containee larger than container
862
+ self.assertTrue(
863
+ self.factory('2000:aaa::/48').supernet_of(
864
+ self.factory('2000:aaa::/56')))
865
+
866
+
867
+ class FactoryFunctionErrors(BaseTestCase):
868
+
869
+ def assertFactoryError(self, factory, kind):
870
+ """Ensure a clean ValueError with the expected message"""
871
+ addr = "camelot"
872
+ msg = '%r does not appear to be an IPv4 or IPv6 %s'
873
+ with self.assertCleanError(ValueError, msg, addr, kind):
874
+ factory(addr)
875
+
876
+ def test_ip_address(self):
877
+ self.assertFactoryError(ipaddress.ip_address, "address")
878
+
879
+ def test_ip_interface(self):
880
+ self.assertFactoryError(ipaddress.ip_interface, "interface")
881
+
882
+ def test_ip_network(self):
883
+ self.assertFactoryError(ipaddress.ip_network, "network")
884
+
885
+
886
+ class ComparisonTests(s_v_utils.VendorTest):
887
+
888
+ v4addr = ipaddress.IPv4Address(1)
889
+ v4net = ipaddress.IPv4Network(1)
890
+ v4intf = ipaddress.IPv4Interface(1)
891
+ v6addr = ipaddress.IPv6Address(1)
892
+ v6net = ipaddress.IPv6Network(1)
893
+ v6intf = ipaddress.IPv6Interface(1)
894
+ v6addr_scoped = ipaddress.IPv6Address('::1%scope')
895
+ v6net_scoped = ipaddress.IPv6Network('::1%scope')
896
+ v6intf_scoped = ipaddress.IPv6Interface('::1%scope')
897
+
898
+ v4_addresses = [v4addr, v4intf]
899
+ v4_objects = v4_addresses + [v4net]
900
+ v6_addresses = [v6addr, v6intf]
901
+ v6_objects = v6_addresses + [v6net]
902
+ v6_scoped_addresses = [v6addr_scoped, v6intf_scoped]
903
+ v6_scoped_objects = v6_scoped_addresses + [v6net_scoped]
904
+
905
+ objects = v4_objects + v6_objects
906
+ objects_with_scoped = objects + v6_scoped_objects
907
+
908
+ v4addr2 = ipaddress.IPv4Address(2)
909
+ v4net2 = ipaddress.IPv4Network(2)
910
+ v4intf2 = ipaddress.IPv4Interface(2)
911
+ v6addr2 = ipaddress.IPv6Address(2)
912
+ v6net2 = ipaddress.IPv6Network(2)
913
+ v6intf2 = ipaddress.IPv6Interface(2)
914
+ v6addr2_scoped = ipaddress.IPv6Address('::2%scope')
915
+ v6net2_scoped = ipaddress.IPv6Network('::2%scope')
916
+ v6intf2_scoped = ipaddress.IPv6Interface('::2%scope')
917
+
918
+ def test_foreign_type_equality(self):
919
+ # __eq__ should never raise TypeError directly
920
+ other = object()
921
+ for obj in self.objects_with_scoped:
922
+ self.assertNotEqual(obj, other)
923
+ self.assertFalse(obj == other)
924
+ self.assertEqual(obj.__eq__(other), NotImplemented)
925
+ self.assertEqual(obj.__ne__(other), NotImplemented)
926
+
927
+ def test_mixed_type_equality(self):
928
+ # Ensure none of the internal objects accidentally
929
+ # expose the right set of attributes to become "equal"
930
+ for lhs in self.objects:
931
+ for rhs in self.objects:
932
+ if lhs is rhs:
933
+ continue
934
+ self.assertNotEqual(lhs, rhs)
935
+
936
+ def test_scoped_ipv6_equality(self):
937
+ for lhs, rhs in zip(self.v6_objects, self.v6_scoped_objects):
938
+ self.assertNotEqual(lhs, rhs)
939
+
940
+ def test_v4_with_v6_scoped_equality(self):
941
+ for lhs in self.v4_objects:
942
+ for rhs in self.v6_scoped_objects:
943
+ self.assertNotEqual(lhs, rhs)
944
+
945
+ def test_same_type_equality(self):
946
+ for obj in self.objects_with_scoped:
947
+ self.assertEqual(obj, obj)
948
+ self.assertLessEqual(obj, obj)
949
+ self.assertGreaterEqual(obj, obj)
950
+
951
+ def test_same_type_ordering(self):
952
+ for lhs, rhs in (
953
+ (self.v4addr, self.v4addr2),
954
+ (self.v4net, self.v4net2),
955
+ (self.v4intf, self.v4intf2),
956
+ (self.v6addr, self.v6addr2),
957
+ (self.v6net, self.v6net2),
958
+ (self.v6intf, self.v6intf2),
959
+ (self.v6addr_scoped, self.v6addr2_scoped),
960
+ (self.v6net_scoped, self.v6net2_scoped),
961
+ (self.v6intf_scoped, self.v6intf2_scoped),
962
+ ):
963
+ self.assertNotEqual(lhs, rhs)
964
+ self.assertLess(lhs, rhs)
965
+ self.assertLessEqual(lhs, rhs)
966
+ self.assertGreater(rhs, lhs)
967
+ self.assertGreaterEqual(rhs, lhs)
968
+ self.assertFalse(lhs > rhs)
969
+ self.assertFalse(rhs < lhs)
970
+ self.assertFalse(lhs >= rhs)
971
+ self.assertFalse(rhs <= lhs)
972
+
973
+ def test_containment(self):
974
+ for obj in self.v4_addresses:
975
+ self.assertIn(obj, self.v4net)
976
+ for obj in self.v6_addresses + self.v6_scoped_addresses:
977
+ self.assertIn(obj, self.v6net)
978
+ for obj in self.v6_addresses + self.v6_scoped_addresses:
979
+ self.assertIn(obj, self.v6net_scoped)
980
+
981
+ for obj in self.v4_objects + [self.v6net, self.v6net_scoped]:
982
+ self.assertNotIn(obj, self.v6net)
983
+ for obj in self.v4_objects + [self.v6net, self.v6net_scoped]:
984
+ self.assertNotIn(obj, self.v6net_scoped)
985
+ for obj in self.v6_objects + self.v6_scoped_objects + [self.v4net]:
986
+ self.assertNotIn(obj, self.v4net)
987
+
988
+ def test_mixed_type_ordering(self):
989
+ for lhs in self.objects_with_scoped:
990
+ for rhs in self.objects_with_scoped:
991
+ if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
992
+ continue
993
+ self.assertRaises(TypeError, lambda: lhs < rhs)
994
+ self.assertRaises(TypeError, lambda: lhs > rhs)
995
+ self.assertRaises(TypeError, lambda: lhs <= rhs)
996
+ self.assertRaises(TypeError, lambda: lhs >= rhs)
997
+
998
+ def test_foreign_type_ordering(self):
999
+ other = object()
1000
+ for obj in self.objects_with_scoped:
1001
+ with self.assertRaises(TypeError):
1002
+ obj < other
1003
+ with self.assertRaises(TypeError):
1004
+ obj > other
1005
+ with self.assertRaises(TypeError):
1006
+ obj <= other
1007
+ with self.assertRaises(TypeError):
1008
+ obj >= other
1009
+ self.assertTrue(obj < LARGEST)
1010
+ self.assertFalse(obj > LARGEST)
1011
+ self.assertTrue(obj <= LARGEST)
1012
+ self.assertFalse(obj >= LARGEST)
1013
+ self.assertFalse(obj < SMALLEST)
1014
+ self.assertTrue(obj > SMALLEST)
1015
+ self.assertFalse(obj <= SMALLEST)
1016
+ self.assertTrue(obj >= SMALLEST)
1017
+
1018
+ def test_mixed_type_key(self):
1019
+ # with get_mixed_type_key, you can sort addresses and network.
1020
+ v4_ordered = [self.v4addr, self.v4net, self.v4intf]
1021
+ v6_ordered = [self.v6addr, self.v6net, self.v6intf]
1022
+ v6_scoped_ordered = [self.v6addr_scoped, self.v6net_scoped, self.v6intf_scoped]
1023
+ self.assertEqual(v4_ordered,
1024
+ sorted(self.v4_objects,
1025
+ key=ipaddress.get_mixed_type_key))
1026
+ self.assertEqual(v6_ordered,
1027
+ sorted(self.v6_objects,
1028
+ key=ipaddress.get_mixed_type_key))
1029
+ self.assertEqual(v6_scoped_ordered,
1030
+ sorted(self.v6_scoped_objects,
1031
+ key=ipaddress.get_mixed_type_key))
1032
+ self.assertEqual(v4_ordered + v6_scoped_ordered,
1033
+ sorted(self.v4_objects + self.v6_scoped_objects,
1034
+ key=ipaddress.get_mixed_type_key))
1035
+ self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
1036
+
1037
+ def test_incompatible_versions(self):
1038
+ # These should always raise TypeError
1039
+ v4addr = ipaddress.ip_address('1.1.1.1')
1040
+ v4net = ipaddress.ip_network('1.1.1.1')
1041
+ v6addr = ipaddress.ip_address('::1')
1042
+ v6net = ipaddress.ip_network('::1')
1043
+ v6addr_scoped = ipaddress.ip_address('::1%scope')
1044
+ v6net_scoped = ipaddress.ip_network('::1%scope')
1045
+
1046
+ self.assertRaises(TypeError, v4addr.__lt__, v6addr)
1047
+ self.assertRaises(TypeError, v4addr.__gt__, v6addr)
1048
+ self.assertRaises(TypeError, v4net.__lt__, v6net)
1049
+ self.assertRaises(TypeError, v4net.__gt__, v6net)
1050
+
1051
+ self.assertRaises(TypeError, v6addr.__lt__, v4addr)
1052
+ self.assertRaises(TypeError, v6addr.__gt__, v4addr)
1053
+ self.assertRaises(TypeError, v6net.__lt__, v4net)
1054
+ self.assertRaises(TypeError, v6net.__gt__, v4net)
1055
+
1056
+ self.assertRaises(TypeError, v4addr.__lt__, v6addr_scoped)
1057
+ self.assertRaises(TypeError, v4addr.__gt__, v6addr_scoped)
1058
+ self.assertRaises(TypeError, v4net.__lt__, v6net_scoped)
1059
+ self.assertRaises(TypeError, v4net.__gt__, v6net_scoped)
1060
+
1061
+ self.assertRaises(TypeError, v6addr_scoped.__lt__, v4addr)
1062
+ self.assertRaises(TypeError, v6addr_scoped.__gt__, v4addr)
1063
+ self.assertRaises(TypeError, v6net_scoped.__lt__, v4net)
1064
+ self.assertRaises(TypeError, v6net_scoped.__gt__, v4net)
1065
+
1066
+
1067
+ class IpaddrUnitTest(s_v_utils.VendorTest):
1068
+
1069
+ def setUp(self):
1070
+ super().setUp()
1071
+ self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
1072
+ self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
1073
+ self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
1074
+ # self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
1075
+ self.ipv6_address = ipaddress.IPv6Interface(
1076
+ '2001:658:22a:cafe:200:0:0:1')
1077
+ self.ipv6_interface = ipaddress.IPv6Interface(
1078
+ '2001:658:22a:cafe:200:0:0:1/64')
1079
+ self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
1080
+ self.ipv6_scoped_address = ipaddress.IPv6Interface(
1081
+ '2001:658:22a:cafe:200:0:0:1%scope')
1082
+ self.ipv6_scoped_interface = ipaddress.IPv6Interface(
1083
+ '2001:658:22a:cafe:200:0:0:1%scope/64')
1084
+ self.ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/64')
1085
+
1086
+ def testRepr(self):
1087
+ self.assertEqual("IPv4Interface('1.2.3.4/32')",
1088
+ repr(ipaddress.IPv4Interface('1.2.3.4')))
1089
+ self.assertEqual("IPv6Interface('::1/128')",
1090
+ repr(ipaddress.IPv6Interface('::1')))
1091
+ self.assertEqual("IPv6Interface('::1%scope/128')",
1092
+ repr(ipaddress.IPv6Interface('::1%scope')))
1093
+
1094
+ # issue #16531: constructing IPv4Network from an (address, mask) tuple
1095
+ def testIPv4Tuple(self):
1096
+ # /32
1097
+ ip = ipaddress.IPv4Address('192.0.2.1')
1098
+ net = ipaddress.IPv4Network('192.0.2.1/32')
1099
+ self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
1100
+ self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
1101
+ self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
1102
+ self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
1103
+ '255.255.255.255')), net)
1104
+ self.assertEqual(ipaddress.IPv4Network((ip,
1105
+ '255.255.255.255')), net)
1106
+ self.assertEqual(ipaddress.IPv4Network((3221225985,
1107
+ '255.255.255.255')), net)
1108
+ # strict=True and host bits set
1109
+ with self.assertRaises(ValueError):
1110
+ ipaddress.IPv4Network(('192.0.2.1', 24))
1111
+ with self.assertRaises(ValueError):
1112
+ ipaddress.IPv4Network((ip, 24))
1113
+ with self.assertRaises(ValueError):
1114
+ ipaddress.IPv4Network((3221225985, 24))
1115
+ with self.assertRaises(ValueError):
1116
+ ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
1117
+ with self.assertRaises(ValueError):
1118
+ ipaddress.IPv4Network((ip, '255.255.255.0'))
1119
+ with self.assertRaises(ValueError):
1120
+ ipaddress.IPv4Network((3221225985, '255.255.255.0'))
1121
+ # strict=False and host bits set
1122
+ net = ipaddress.IPv4Network('192.0.2.0/24')
1123
+ self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
1124
+ strict=False), net)
1125
+ self.assertEqual(ipaddress.IPv4Network((ip, 24),
1126
+ strict=False), net)
1127
+ self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
1128
+ strict=False), net)
1129
+ self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
1130
+ '255.255.255.0'),
1131
+ strict=False), net)
1132
+ self.assertEqual(ipaddress.IPv4Network((ip,
1133
+ '255.255.255.0'),
1134
+ strict=False), net)
1135
+ self.assertEqual(ipaddress.IPv4Network((3221225985,
1136
+ '255.255.255.0'),
1137
+ strict=False), net)
1138
+
1139
+ # /24
1140
+ ip = ipaddress.IPv4Address('192.0.2.0')
1141
+ net = ipaddress.IPv4Network('192.0.2.0/24')
1142
+ self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
1143
+ '255.255.255.0')), net)
1144
+ self.assertEqual(ipaddress.IPv4Network((ip,
1145
+ '255.255.255.0')), net)
1146
+ self.assertEqual(ipaddress.IPv4Network((3221225984,
1147
+ '255.255.255.0')), net)
1148
+ self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
1149
+ self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
1150
+ self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
1151
+
1152
+ self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
1153
+ ipaddress.IPv4Interface('192.0.2.1/24'))
1154
+ self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
1155
+ ipaddress.IPv4Interface('192.0.2.1/24'))
1156
+
1157
+ # Invalid netmask
1158
+ with self.assertRaises(ValueError):
1159
+ ipaddress.IPv4Network(('192.0.2.1', '255.255.255.255.0'))
1160
+
1161
+ # Invalid netmask using factory
1162
+ with self.assertRaises(ValueError):
1163
+ ipaddress.ip_network(('192.0.2.1', '255.255.255.255.0'))
1164
+
1165
+ # issue #16531: constructing IPv6Network from an (address, mask) tuple
1166
+ def testIPv6Tuple(self):
1167
+ # /128
1168
+ ip = ipaddress.IPv6Address('2001:db8::')
1169
+ net = ipaddress.IPv6Network('2001:db8::/128')
1170
+ self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
1171
+ net)
1172
+ self.assertEqual(ipaddress.IPv6Network(
1173
+ (42540766411282592856903984951653826560, 128)),
1174
+ net)
1175
+ self.assertEqual(ipaddress.IPv6Network((ip, '128')),
1176
+ net)
1177
+ ip = ipaddress.IPv6Address('2001:db8::')
1178
+ net = ipaddress.IPv6Network('2001:db8::/96')
1179
+ self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
1180
+ net)
1181
+ self.assertEqual(ipaddress.IPv6Network(
1182
+ (42540766411282592856903984951653826560, 96)),
1183
+ net)
1184
+ self.assertEqual(ipaddress.IPv6Network((ip, '96')),
1185
+ net)
1186
+
1187
+ ip_scoped = ipaddress.IPv6Address('2001:db8::%scope')
1188
+
1189
+ # strict=True and host bits set
1190
+ ip = ipaddress.IPv6Address('2001:db8::1')
1191
+ with self.assertRaises(ValueError):
1192
+ ipaddress.IPv6Network(('2001:db8::1', 96))
1193
+ with self.assertRaises(ValueError):
1194
+ ipaddress.IPv6Network((
1195
+ 42540766411282592856903984951653826561, 96))
1196
+ with self.assertRaises(ValueError):
1197
+ ipaddress.IPv6Network((ip, 96))
1198
+ # strict=False and host bits set
1199
+ net = ipaddress.IPv6Network('2001:db8::/96')
1200
+ self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
1201
+ strict=False),
1202
+ net)
1203
+ self.assertEqual(ipaddress.IPv6Network(
1204
+ (42540766411282592856903984951653826561, 96),
1205
+ strict=False),
1206
+ net)
1207
+ self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
1208
+ net)
1209
+
1210
+ # /96
1211
+ self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
1212
+ ipaddress.IPv6Interface('2001:db8::1/96'))
1213
+ self.assertEqual(ipaddress.IPv6Interface(
1214
+ (42540766411282592856903984951653826561, '96')),
1215
+ ipaddress.IPv6Interface('2001:db8::1/96'))
1216
+
1217
+ ip_scoped = ipaddress.IPv6Address('2001:db8::1%scope')
1218
+ with self.assertRaises(ValueError):
1219
+ ipaddress.IPv6Network(('2001:db8::1%scope', 96))
1220
+ with self.assertRaises(ValueError):
1221
+ ipaddress.IPv6Network((ip_scoped, 96))
1222
+ # strict=False and host bits set
1223
+
1224
+ # Invalid netmask
1225
+ with self.assertRaises(ValueError):
1226
+ ipaddress.IPv6Network(('2001:db8::1', '255.255.255.0'))
1227
+
1228
+ # Invalid netmask using factory
1229
+ with self.assertRaises(ValueError):
1230
+ ipaddress.ip_network(('2001:db8::1', '255.255.255.0'))
1231
+
1232
+ # issue57
1233
+ def testAddressIntMath(self):
1234
+ self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
1235
+ ipaddress.IPv4Address('1.1.2.0'))
1236
+ self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
1237
+ ipaddress.IPv4Address('1.1.0.1'))
1238
+ self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
1239
+ ipaddress.IPv6Address('::ffff'))
1240
+ self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
1241
+ ipaddress.IPv6Address('::1'))
1242
+ self.assertNotEqual(ipaddress.IPv6Address('::1%scope') + (2**16 - 2),
1243
+ ipaddress.IPv6Address('::ffff%scope'))
1244
+ self.assertNotEqual(ipaddress.IPv6Address('::ffff%scope') - (2**16 - 2),
1245
+ ipaddress.IPv6Address('::1%scope'))
1246
+
1247
+ def testInvalidIntToBytes(self):
1248
+ self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
1249
+ self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
1250
+ 2 ** ipaddress.IPV4LENGTH)
1251
+ self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
1252
+ self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
1253
+ 2 ** ipaddress.IPV6LENGTH)
1254
+
1255
+ def testInternals(self):
1256
+ ip1 = ipaddress.IPv4Address('10.10.10.10')
1257
+ ip2 = ipaddress.IPv4Address('10.10.10.11')
1258
+ ip3 = ipaddress.IPv4Address('10.10.10.12')
1259
+ self.assertEqual(list(ipaddress._find_address_range([ip1])),
1260
+ [(ip1, ip1)])
1261
+ self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
1262
+ [(ip1, ip1), (ip3, ip3)])
1263
+ self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
1264
+ [(ip1, ip3)])
1265
+ self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
1266
+ self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
1267
+
1268
+ def testGetNetwork(self):
1269
+ self.assertEqual(int(self.ipv4_network.network_address), 16909056)
1270
+ self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
1271
+
1272
+ self.assertEqual(int(self.ipv6_network.network_address),
1273
+ 42540616829182469433403647294022090752)
1274
+ self.assertEqual(str(self.ipv6_network.network_address),
1275
+ '2001:658:22a:cafe::')
1276
+ self.assertEqual(str(self.ipv6_network.hostmask),
1277
+ '::ffff:ffff:ffff:ffff')
1278
+ self.assertEqual(int(self.ipv6_scoped_network.network_address),
1279
+ 42540616829182469433403647294022090752)
1280
+ self.assertEqual(str(self.ipv6_scoped_network.network_address),
1281
+ '2001:658:22a:cafe::%scope')
1282
+ self.assertEqual(str(self.ipv6_scoped_network.hostmask),
1283
+ '::ffff:ffff:ffff:ffff')
1284
+
1285
+ def testIpFromInt(self):
1286
+ self.assertEqual(self.ipv4_interface._ip,
1287
+ ipaddress.IPv4Interface(16909060)._ip)
1288
+
1289
+ ipv4 = ipaddress.ip_network('1.2.3.4')
1290
+ ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
1291
+ ipv6_scoped = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1%scope')
1292
+ self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
1293
+ self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
1294
+ self.assertNotEqual(ipv6_scoped, ipaddress.ip_network(int(ipv6_scoped.network_address)))
1295
+
1296
+ v6_int = 42540616829182469433547762482097946625
1297
+ self.assertEqual(self.ipv6_interface._ip,
1298
+ ipaddress.IPv6Interface(v6_int)._ip)
1299
+ self.assertEqual(self.ipv6_scoped_interface._ip,
1300
+ ipaddress.IPv6Interface(v6_int)._ip)
1301
+
1302
+ self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1303
+ 4)
1304
+ self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1305
+ 6)
1306
+ self.assertEqual(ipaddress.ip_network(self.ipv6_scoped_address._ip).version,
1307
+ 6)
1308
+
1309
+ def testIpFromPacked(self):
1310
+ address = ipaddress.ip_address
1311
+ self.assertEqual(self.ipv4_interface._ip,
1312
+ ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1313
+ self.assertEqual(address('255.254.253.252'),
1314
+ address(b'\xff\xfe\xfd\xfc'))
1315
+ self.assertEqual(self.ipv6_interface.ip,
1316
+ ipaddress.ip_interface(
1317
+ b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1318
+ b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1319
+ self.assertEqual(address('ffff:2:3:4:ffff::'),
1320
+ address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1321
+ b'\xff\xff' + b'\x00' * 6))
1322
+ self.assertEqual(address('::'),
1323
+ address(b'\x00' * 16))
1324
+
1325
+ def testGetIp(self):
1326
+ self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1327
+ self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1328
+
1329
+ self.assertEqual(int(self.ipv6_interface.ip),
1330
+ 42540616829182469433547762482097946625)
1331
+ self.assertEqual(str(self.ipv6_interface.ip),
1332
+ '2001:658:22a:cafe:200::1')
1333
+ self.assertEqual(int(self.ipv6_scoped_interface.ip),
1334
+ 42540616829182469433547762482097946625)
1335
+ self.assertEqual(str(self.ipv6_scoped_interface.ip),
1336
+ '2001:658:22a:cafe:200::1')
1337
+
1338
+ def testGetScopeId(self):
1339
+ self.assertEqual(self.ipv6_address.scope_id,
1340
+ None)
1341
+ self.assertEqual(str(self.ipv6_scoped_address.scope_id),
1342
+ 'scope')
1343
+ self.assertEqual(self.ipv6_interface.scope_id,
1344
+ None)
1345
+ self.assertEqual(str(self.ipv6_scoped_interface.scope_id),
1346
+ 'scope')
1347
+ self.assertEqual(self.ipv6_network.network_address.scope_id,
1348
+ None)
1349
+ self.assertEqual(str(self.ipv6_scoped_network.network_address.scope_id),
1350
+ 'scope')
1351
+
1352
+ def testGetNetmask(self):
1353
+ self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1354
+ self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1355
+ self.assertEqual(int(self.ipv6_network.netmask),
1356
+ 340282366920938463444927863358058659840)
1357
+ self.assertEqual(self.ipv6_network.prefixlen, 64)
1358
+ self.assertEqual(int(self.ipv6_scoped_network.netmask),
1359
+ 340282366920938463444927863358058659840)
1360
+ self.assertEqual(self.ipv6_scoped_network.prefixlen, 64)
1361
+
1362
+ def testZeroNetmask(self):
1363
+ ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1364
+ self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
1365
+ self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
1366
+
1367
+ ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1368
+ self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
1369
+ self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
1370
+
1371
+ ipv6_scoped_zero_netmask = ipaddress.IPv6Interface('::1%scope/0')
1372
+ self.assertEqual(int(ipv6_scoped_zero_netmask.network.netmask), 0)
1373
+ self.assertEqual(ipv6_scoped_zero_netmask._prefix_from_prefix_string('0'), 0)
1374
+
1375
+ def testIPv4Net(self):
1376
+ net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
1377
+ self.assertEqual(net.prefixlen, 24)
1378
+
1379
+ def testGetBroadcast(self):
1380
+ self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1381
+ self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1382
+
1383
+ self.assertEqual(int(self.ipv6_network.broadcast_address),
1384
+ 42540616829182469451850391367731642367)
1385
+ self.assertEqual(str(self.ipv6_network.broadcast_address),
1386
+ '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1387
+
1388
+ self.assertEqual(int(self.ipv6_scoped_network.broadcast_address),
1389
+ 42540616829182469451850391367731642367)
1390
+ self.assertEqual(str(self.ipv6_scoped_network.broadcast_address),
1391
+ '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1392
+
1393
+ def testGetPrefixlen(self):
1394
+ self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1395
+ self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
1396
+ self.assertEqual(self.ipv6_scoped_interface.network.prefixlen, 64)
1397
+
1398
+ def testGetSupernet(self):
1399
+ self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1400
+ self.assertEqual(str(self.ipv4_network.supernet().network_address),
1401
+ '1.2.2.0')
1402
+ self.assertEqual(
1403
+ ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1404
+ ipaddress.IPv4Network('0.0.0.0/0'))
1405
+
1406
+ self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1407
+ self.assertEqual(str(self.ipv6_network.supernet().network_address),
1408
+ '2001:658:22a:cafe::')
1409
+ self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1410
+ ipaddress.IPv6Network('::0/0'))
1411
+ self.assertEqual(self.ipv6_scoped_network.supernet().prefixlen, 63)
1412
+ self.assertEqual(str(self.ipv6_scoped_network.supernet().network_address),
1413
+ '2001:658:22a:cafe::')
1414
+
1415
+ def testGetSupernet3(self):
1416
+ self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1417
+ self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1418
+ '1.2.0.0')
1419
+
1420
+ self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1421
+ self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1422
+ '2001:658:22a:caf8::')
1423
+ self.assertEqual(self.ipv6_scoped_network.supernet(3).prefixlen, 61)
1424
+ self.assertEqual(str(self.ipv6_scoped_network.supernet(3).network_address),
1425
+ '2001:658:22a:caf8::')
1426
+
1427
+ def testGetSupernet4(self):
1428
+ self.assertRaises(ValueError, self.ipv4_network.supernet,
1429
+ prefixlen_diff=2, new_prefix=1)
1430
+ self.assertRaises(ValueError, self.ipv4_network.supernet,
1431
+ new_prefix=25)
1432
+ self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1433
+ self.ipv4_network.supernet(new_prefix=22))
1434
+
1435
+ self.assertRaises(ValueError, self.ipv6_network.supernet,
1436
+ prefixlen_diff=2, new_prefix=1)
1437
+ self.assertRaises(ValueError, self.ipv6_network.supernet,
1438
+ new_prefix=65)
1439
+ self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1440
+ self.ipv6_network.supernet(new_prefix=62))
1441
+ self.assertRaises(ValueError, self.ipv6_scoped_network.supernet,
1442
+ prefixlen_diff=2, new_prefix=1)
1443
+ self.assertRaises(ValueError, self.ipv6_scoped_network.supernet,
1444
+ new_prefix=65)
1445
+ self.assertEqual(self.ipv6_scoped_network.supernet(prefixlen_diff=2),
1446
+ self.ipv6_scoped_network.supernet(new_prefix=62))
1447
+
1448
+ def testHosts(self):
1449
+ hosts = list(self.ipv4_network.hosts())
1450
+ self.assertEqual(254, len(hosts))
1451
+ self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1452
+ self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1453
+
1454
+ ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1455
+ hosts = list(ipv6_network.hosts())
1456
+ self.assertEqual(255, len(hosts))
1457
+ self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1458
+ self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1459
+
1460
+ ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120')
1461
+ hosts = list(ipv6_scoped_network.hosts())
1462
+ self.assertEqual(255, len(hosts))
1463
+ self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1464
+ self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1465
+
1466
+ # special case where only 1 bit is left for address
1467
+ addrs = [ipaddress.IPv4Address('2.0.0.0'),
1468
+ ipaddress.IPv4Address('2.0.0.1')]
1469
+ str_args = '2.0.0.0/31'
1470
+ tpl_args = ('2.0.0.0', 31)
1471
+ self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1472
+ self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1473
+ self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1474
+ list(ipaddress.ip_network(tpl_args).hosts()))
1475
+
1476
+ # special case where the network is a /32
1477
+ addrs = [ipaddress.IPv4Address('1.2.3.4')]
1478
+ str_args = '1.2.3.4/32'
1479
+ tpl_args = ('1.2.3.4', 32)
1480
+ self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1481
+ self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1482
+ self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1483
+ list(ipaddress.ip_network(tpl_args).hosts()))
1484
+
1485
+ addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1486
+ ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1487
+ str_args = '2001:658:22a:cafe::/127'
1488
+ tpl_args = ('2001:658:22a:cafe::', 127)
1489
+ self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1490
+ self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1491
+ self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1492
+ list(ipaddress.ip_network(tpl_args).hosts()))
1493
+
1494
+ addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ]
1495
+ str_args = '2001:658:22a:cafe::1/128'
1496
+ tpl_args = ('2001:658:22a:cafe::1', 128)
1497
+ self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1498
+ self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1499
+ self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1500
+ list(ipaddress.ip_network(tpl_args).hosts()))
1501
+
1502
+ def testFancySubnetting(self):
1503
+ self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1504
+ sorted(self.ipv4_network.subnets(new_prefix=27)))
1505
+ self.assertRaises(ValueError, list,
1506
+ self.ipv4_network.subnets(new_prefix=23))
1507
+ self.assertRaises(ValueError, list,
1508
+ self.ipv4_network.subnets(prefixlen_diff=3,
1509
+ new_prefix=27))
1510
+ self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1511
+ sorted(self.ipv6_network.subnets(new_prefix=68)))
1512
+ self.assertRaises(ValueError, list,
1513
+ self.ipv6_network.subnets(new_prefix=63))
1514
+ self.assertRaises(ValueError, list,
1515
+ self.ipv6_network.subnets(prefixlen_diff=4,
1516
+ new_prefix=68))
1517
+ self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)),
1518
+ sorted(self.ipv6_scoped_network.subnets(new_prefix=68)))
1519
+ self.assertRaises(ValueError, list,
1520
+ self.ipv6_scoped_network.subnets(new_prefix=63))
1521
+ self.assertRaises(ValueError, list,
1522
+ self.ipv6_scoped_network.subnets(prefixlen_diff=4,
1523
+ new_prefix=68))
1524
+
1525
+ def testGetSubnets(self):
1526
+ self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1527
+ self.assertEqual(str(list(
1528
+ self.ipv4_network.subnets())[0].network_address),
1529
+ '1.2.3.0')
1530
+ self.assertEqual(str(list(
1531
+ self.ipv4_network.subnets())[1].network_address),
1532
+ '1.2.3.128')
1533
+
1534
+ self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1535
+ self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65)
1536
+
1537
+ def testGetSubnetForSingle32(self):
1538
+ ip = ipaddress.IPv4Network('1.2.3.4/32')
1539
+ subnets1 = [str(x) for x in ip.subnets()]
1540
+ subnets2 = [str(x) for x in ip.subnets(2)]
1541
+ self.assertEqual(subnets1, ['1.2.3.4/32'])
1542
+ self.assertEqual(subnets1, subnets2)
1543
+
1544
+ def testGetSubnetForSingle128(self):
1545
+ ip = ipaddress.IPv6Network('::1/128')
1546
+ subnets1 = [str(x) for x in ip.subnets()]
1547
+ subnets2 = [str(x) for x in ip.subnets(2)]
1548
+ self.assertEqual(subnets1, ['::1/128'])
1549
+ self.assertEqual(subnets1, subnets2)
1550
+
1551
+ ip_scoped = ipaddress.IPv6Network('::1%scope/128')
1552
+ subnets1 = [str(x) for x in ip_scoped.subnets()]
1553
+ subnets2 = [str(x) for x in ip_scoped.subnets(2)]
1554
+ self.assertEqual(subnets1, ['::1%scope/128'])
1555
+ self.assertEqual(subnets1, subnets2)
1556
+
1557
+ def testSubnet2(self):
1558
+ ips = [str(x) for x in self.ipv4_network.subnets(2)]
1559
+ self.assertEqual(
1560
+ ips,
1561
+ ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1562
+
1563
+ ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1564
+ self.assertEqual(
1565
+ ipsv6,
1566
+ ['2001:658:22a:cafe::/66',
1567
+ '2001:658:22a:cafe:4000::/66',
1568
+ '2001:658:22a:cafe:8000::/66',
1569
+ '2001:658:22a:cafe:c000::/66'])
1570
+
1571
+ def testGetSubnets3(self):
1572
+ subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1573
+ self.assertEqual(subnets[:3],
1574
+ ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1575
+ self.assertEqual(subnets[-3:],
1576
+ ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1577
+ self.assertEqual(len(subnets), 256)
1578
+
1579
+ ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1580
+ subnets = [str(x) for x in ipv6_network.subnets(8)]
1581
+ self.assertEqual(subnets[:3],
1582
+ ['2001:658:22a:cafe::/128',
1583
+ '2001:658:22a:cafe::1/128',
1584
+ '2001:658:22a:cafe::2/128'])
1585
+ self.assertEqual(subnets[-3:],
1586
+ ['2001:658:22a:cafe::fd/128',
1587
+ '2001:658:22a:cafe::fe/128',
1588
+ '2001:658:22a:cafe::ff/128'])
1589
+ self.assertEqual(len(subnets), 256)
1590
+
1591
+ def testSubnetFailsForLargeCidrDiff(self):
1592
+ self.assertRaises(ValueError, list,
1593
+ self.ipv4_interface.network.subnets(9))
1594
+ self.assertRaises(ValueError, list,
1595
+ self.ipv4_network.subnets(9))
1596
+ self.assertRaises(ValueError, list,
1597
+ self.ipv6_interface.network.subnets(65))
1598
+ self.assertRaises(ValueError, list,
1599
+ self.ipv6_network.subnets(65))
1600
+ self.assertRaises(ValueError, list,
1601
+ self.ipv6_scoped_interface.network.subnets(65))
1602
+ self.assertRaises(ValueError, list,
1603
+ self.ipv6_scoped_network.subnets(65))
1604
+
1605
+ def testSupernetFailsForLargeCidrDiff(self):
1606
+ self.assertRaises(ValueError,
1607
+ self.ipv4_interface.network.supernet, 25)
1608
+ self.assertRaises(ValueError,
1609
+ self.ipv6_interface.network.supernet, 65)
1610
+ self.assertRaises(ValueError,
1611
+ self.ipv6_scoped_interface.network.supernet, 65)
1612
+
1613
+ def testSubnetFailsForNegativeCidrDiff(self):
1614
+ self.assertRaises(ValueError, list,
1615
+ self.ipv4_interface.network.subnets(-1))
1616
+ self.assertRaises(ValueError, list,
1617
+ self.ipv4_network.subnets(-1))
1618
+ self.assertRaises(ValueError, list,
1619
+ self.ipv6_interface.network.subnets(-1))
1620
+ self.assertRaises(ValueError, list,
1621
+ self.ipv6_network.subnets(-1))
1622
+ self.assertRaises(ValueError, list,
1623
+ self.ipv6_scoped_interface.network.subnets(-1))
1624
+ self.assertRaises(ValueError, list,
1625
+ self.ipv6_scoped_network.subnets(-1))
1626
+
1627
+ def testGetNum_Addresses(self):
1628
+ self.assertEqual(self.ipv4_network.num_addresses, 256)
1629
+ self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1630
+ 128)
1631
+ self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1632
+
1633
+ self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1634
+ self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1635
+ 9223372036854775808)
1636
+ self.assertEqual(self.ipv6_network.supernet().num_addresses,
1637
+ 36893488147419103232)
1638
+ self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616)
1639
+ self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses,
1640
+ 9223372036854775808)
1641
+ self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses,
1642
+ 36893488147419103232)
1643
+
1644
+ def testContains(self):
1645
+ self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1646
+ self.ipv4_network)
1647
+ self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
1648
+ self.ipv4_network)
1649
+ # We can test addresses and string as well.
1650
+ addr1 = ipaddress.IPv4Address('1.2.3.37')
1651
+ self.assertIn(addr1, self.ipv4_network)
1652
+ # issue 61, bad network comparison on like-ip'd network objects
1653
+ # with identical broadcast addresses.
1654
+ self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1655
+ ipaddress.IPv4Network('1.0.0.0/15')))
1656
+
1657
+ def testNth(self):
1658
+ self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1659
+ self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1660
+
1661
+ self.assertEqual(str(self.ipv6_network[5]),
1662
+ '2001:658:22a:cafe::5')
1663
+ self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
1664
+ self.assertEqual(str(self.ipv6_scoped_network[5]),
1665
+ '2001:658:22a:cafe::5')
1666
+ self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64)
1667
+
1668
+ def testGetitem(self):
1669
+ # https://code.google.com/p/ipaddr-py/issues/detail?id=15
1670
+ addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1671
+ self.assertEqual(28, addr.prefixlen)
1672
+ addr_list = list(addr)
1673
+ self.assertEqual('172.31.255.128', str(addr_list[0]))
1674
+ self.assertEqual('172.31.255.128', str(addr[0]))
1675
+ self.assertEqual('172.31.255.143', str(addr_list[-1]))
1676
+ self.assertEqual('172.31.255.143', str(addr[-1]))
1677
+ self.assertEqual(addr_list[-1], addr[-1])
1678
+
1679
+ def testEqual(self):
1680
+ self.assertTrue(self.ipv4_interface ==
1681
+ ipaddress.IPv4Interface('1.2.3.4/24'))
1682
+ self.assertFalse(self.ipv4_interface ==
1683
+ ipaddress.IPv4Interface('1.2.3.4/23'))
1684
+ self.assertFalse(self.ipv4_interface ==
1685
+ ipaddress.IPv6Interface('::1.2.3.4/24'))
1686
+ self.assertFalse(self.ipv4_interface ==
1687
+ ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
1688
+ self.assertFalse(self.ipv4_interface == '')
1689
+ self.assertFalse(self.ipv4_interface == [])
1690
+ self.assertFalse(self.ipv4_interface == 2)
1691
+
1692
+ self.assertTrue(self.ipv6_interface ==
1693
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1694
+ self.assertFalse(self.ipv6_interface ==
1695
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1696
+ self.assertFalse(self.ipv6_interface ==
1697
+ ipaddress.IPv4Interface('1.2.3.4/23'))
1698
+ self.assertFalse(self.ipv6_interface == '')
1699
+ self.assertFalse(self.ipv6_interface == [])
1700
+ self.assertFalse(self.ipv6_interface == 2)
1701
+
1702
+ self.assertTrue(self.ipv6_scoped_interface ==
1703
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1704
+ self.assertFalse(self.ipv6_scoped_interface ==
1705
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1706
+ self.assertFalse(self.ipv6_scoped_interface ==
1707
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1708
+ self.assertFalse(self.ipv6_scoped_interface ==
1709
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1710
+ self.assertFalse(self.ipv6_scoped_interface ==
1711
+ ipaddress.IPv4Interface('1.2.3.4/23'))
1712
+ self.assertFalse(self.ipv6_scoped_interface == '')
1713
+ self.assertFalse(self.ipv6_scoped_interface == [])
1714
+ self.assertFalse(self.ipv6_scoped_interface == 2)
1715
+
1716
+ def testNotEqual(self):
1717
+ self.assertFalse(self.ipv4_interface !=
1718
+ ipaddress.IPv4Interface('1.2.3.4/24'))
1719
+ self.assertTrue(self.ipv4_interface !=
1720
+ ipaddress.IPv4Interface('1.2.3.4/23'))
1721
+ self.assertTrue(self.ipv4_interface !=
1722
+ ipaddress.IPv6Interface('::1.2.3.4/24'))
1723
+ self.assertTrue(self.ipv4_interface !=
1724
+ ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
1725
+ self.assertTrue(self.ipv4_interface != '')
1726
+ self.assertTrue(self.ipv4_interface != [])
1727
+ self.assertTrue(self.ipv4_interface != 2)
1728
+
1729
+ self.assertTrue(self.ipv4_address !=
1730
+ ipaddress.IPv4Address('1.2.3.5'))
1731
+ self.assertTrue(self.ipv4_address != '')
1732
+ self.assertTrue(self.ipv4_address != [])
1733
+ self.assertTrue(self.ipv4_address != 2)
1734
+
1735
+ self.assertFalse(self.ipv6_interface !=
1736
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1737
+ self.assertTrue(self.ipv6_interface !=
1738
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1739
+ self.assertTrue(self.ipv6_interface !=
1740
+ ipaddress.IPv4Interface('1.2.3.4/23'))
1741
+ self.assertTrue(self.ipv6_interface != '')
1742
+ self.assertTrue(self.ipv6_interface != [])
1743
+ self.assertTrue(self.ipv6_interface != 2)
1744
+
1745
+ self.assertTrue(self.ipv6_address !=
1746
+ ipaddress.IPv4Address('1.2.3.4'))
1747
+ self.assertTrue(self.ipv6_address != '')
1748
+ self.assertTrue(self.ipv6_address != [])
1749
+ self.assertTrue(self.ipv6_address != 2)
1750
+
1751
+ self.assertFalse(self.ipv6_scoped_interface !=
1752
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1753
+ self.assertTrue(self.ipv6_scoped_interface !=
1754
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1755
+ self.assertTrue(self.ipv6_scoped_interface !=
1756
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1757
+ self.assertTrue(self.ipv6_scoped_interface !=
1758
+ ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1759
+ self.assertTrue(self.ipv6_scoped_interface !=
1760
+ ipaddress.IPv4Interface('1.2.3.4/23'))
1761
+ self.assertTrue(self.ipv6_scoped_interface != '')
1762
+ self.assertTrue(self.ipv6_scoped_interface != [])
1763
+ self.assertTrue(self.ipv6_scoped_interface != 2)
1764
+
1765
+ self.assertTrue(self.ipv6_scoped_address !=
1766
+ ipaddress.IPv4Address('1.2.3.4'))
1767
+ self.assertTrue(self.ipv6_scoped_address != '')
1768
+ self.assertTrue(self.ipv6_scoped_address != [])
1769
+ self.assertTrue(self.ipv6_scoped_address != 2)
1770
+
1771
+ def testSlash32Constructor(self):
1772
+ self.assertEqual(str(ipaddress.IPv4Interface(
1773
+ '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1774
+
1775
+ def testSlash128Constructor(self):
1776
+ self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1777
+ '::1/128')
1778
+ self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')),
1779
+ '::1%scope/128')
1780
+
1781
+ def testSlash0Constructor(self):
1782
+ self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1783
+ '1.2.3.4/0')
1784
+
1785
+ def testCollapsing(self):
1786
+ # test only IP addresses including some duplicates
1787
+ ip1 = ipaddress.IPv4Address('1.1.1.0')
1788
+ ip2 = ipaddress.IPv4Address('1.1.1.1')
1789
+ ip3 = ipaddress.IPv4Address('1.1.1.2')
1790
+ ip4 = ipaddress.IPv4Address('1.1.1.3')
1791
+ ip5 = ipaddress.IPv4Address('1.1.1.4')
1792
+ ip6 = ipaddress.IPv4Address('1.1.1.0')
1793
+ # check that addresses are subsumed properly.
1794
+ collapsed = ipaddress.collapse_addresses(
1795
+ [ip1, ip2, ip3, ip4, ip5, ip6])
1796
+ self.assertEqual(list(collapsed),
1797
+ [ipaddress.IPv4Network('1.1.1.0/30'),
1798
+ ipaddress.IPv4Network('1.1.1.4/32')])
1799
+
1800
+ # test a mix of IP addresses and networks including some duplicates
1801
+ ip1 = ipaddress.IPv4Address('1.1.1.0')
1802
+ ip2 = ipaddress.IPv4Address('1.1.1.1')
1803
+ ip3 = ipaddress.IPv4Address('1.1.1.2')
1804
+ ip4 = ipaddress.IPv4Address('1.1.1.3')
1805
+ # ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1806
+ # ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1807
+ # check that addresses are subsumed properly.
1808
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
1809
+ self.assertEqual(list(collapsed),
1810
+ [ipaddress.IPv4Network('1.1.1.0/30')])
1811
+
1812
+ # test only IP networks
1813
+ ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1814
+ ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1815
+ ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1816
+ ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1817
+ ip5 = ipaddress.IPv4Network('1.1.4.0/24')
1818
+ # stored in no particular order b/c we want CollapseAddr to call
1819
+ # [].sort
1820
+ ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1821
+ # check that addresses are subsumed properly.
1822
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1823
+ ip6])
1824
+ self.assertEqual(list(collapsed),
1825
+ [ipaddress.IPv4Network('1.1.0.0/22'),
1826
+ ipaddress.IPv4Network('1.1.4.0/24')])
1827
+
1828
+ # test that two addresses are supernet'ed properly
1829
+ collapsed = ipaddress.collapse_addresses([ip1, ip2])
1830
+ self.assertEqual(list(collapsed),
1831
+ [ipaddress.IPv4Network('1.1.0.0/23')])
1832
+
1833
+ # test same IP networks
1834
+ ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1835
+ self.assertEqual(list(ipaddress.collapse_addresses(
1836
+ [ip_same1, ip_same2])),
1837
+ [ip_same1])
1838
+
1839
+ # test same IP addresses
1840
+ ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1841
+ self.assertEqual(list(ipaddress.collapse_addresses(
1842
+ [ip_same1, ip_same2])),
1843
+ [ipaddress.ip_network('1.1.1.1/32')])
1844
+ ip1 = ipaddress.IPv6Network('2001::/100')
1845
+ ip2 = ipaddress.IPv6Network('2001::/120')
1846
+ ip3 = ipaddress.IPv6Network('2001::/96')
1847
+ # test that ipv6 addresses are subsumed properly.
1848
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1849
+ self.assertEqual(list(collapsed), [ip3])
1850
+
1851
+ ip1 = ipaddress.IPv6Network('2001::%scope/100')
1852
+ ip2 = ipaddress.IPv6Network('2001::%scope/120')
1853
+ ip3 = ipaddress.IPv6Network('2001::%scope/96')
1854
+ # test that ipv6 addresses are subsumed properly.
1855
+ collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1856
+ self.assertEqual(list(collapsed), [ip3])
1857
+
1858
+ # the toejam test
1859
+ addr_tuples = [
1860
+ (ipaddress.ip_address('1.1.1.1'),
1861
+ ipaddress.ip_address('::1')),
1862
+ (ipaddress.IPv4Network('1.1.0.0/24'),
1863
+ ipaddress.IPv6Network('2001::/120')),
1864
+ (ipaddress.IPv4Network('1.1.0.0/32'),
1865
+ ipaddress.IPv6Network('2001::/128')),
1866
+ ]
1867
+ for ip1, ip2 in addr_tuples:
1868
+ self.assertRaises(TypeError, ipaddress.collapse_addresses,
1869
+ [ip1, ip2])
1870
+
1871
+ addr_tuples = [
1872
+ (ipaddress.ip_address('1.1.1.1'),
1873
+ ipaddress.ip_address('::1%scope')),
1874
+ (ipaddress.IPv4Network('1.1.0.0/24'),
1875
+ ipaddress.IPv6Network('2001::%scope/120')),
1876
+ (ipaddress.IPv4Network('1.1.0.0/32'),
1877
+ ipaddress.IPv6Network('2001::%scope/128')),
1878
+ ]
1879
+ for ip1, ip2 in addr_tuples:
1880
+ self.assertRaises(TypeError, ipaddress.collapse_addresses,
1881
+ [ip1, ip2])
1882
+
1883
+ def testSummarizing(self):
1884
+ # ip = ipaddress.ip_address
1885
+ # ipnet = ipaddress.ip_network
1886
+ summarize = ipaddress.summarize_address_range
1887
+ ip1 = ipaddress.ip_address('1.1.1.0')
1888
+ ip2 = ipaddress.ip_address('1.1.1.255')
1889
+
1890
+ # summarize works only for IPv4 & IPv6
1891
+ class IPv7Address(ipaddress.IPv6Address):
1892
+ @property
1893
+ def version(self):
1894
+ return 7
1895
+ ip_invalid1 = IPv7Address('::1')
1896
+ ip_invalid2 = IPv7Address('::1')
1897
+ self.assertRaises(ValueError, list,
1898
+ summarize(ip_invalid1, ip_invalid2))
1899
+ # test that a summary over ip4 & ip6 fails
1900
+ self.assertRaises(TypeError, list,
1901
+ summarize(ip1, ipaddress.IPv6Address('::1')))
1902
+ self.assertRaises(TypeError, list,
1903
+ summarize(ip1, ipaddress.IPv6Address('::1%scope')))
1904
+ # test a /24 is summarized properly
1905
+ self.assertEqual(list(summarize(ip1, ip2))[0],
1906
+ ipaddress.ip_network('1.1.1.0/24'))
1907
+ # test an IPv4 range that isn't on a network byte boundary
1908
+ ip2 = ipaddress.ip_address('1.1.1.8')
1909
+ self.assertEqual(list(summarize(ip1, ip2)),
1910
+ [ipaddress.ip_network('1.1.1.0/29'),
1911
+ ipaddress.ip_network('1.1.1.8')])
1912
+ # all!
1913
+ ip1 = ipaddress.IPv4Address(0)
1914
+ ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1915
+ self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1916
+ list(summarize(ip1, ip2)))
1917
+
1918
+ ip1 = ipaddress.ip_address('1::')
1919
+ ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1920
+ # test an IPv6 is summarized properly
1921
+ self.assertEqual(list(summarize(ip1, ip2))[0],
1922
+ ipaddress.ip_network('1::/16'))
1923
+ # test an IPv6 range that isn't on a network byte boundary
1924
+ ip2 = ipaddress.ip_address('2::')
1925
+ self.assertEqual(list(summarize(ip1, ip2)),
1926
+ [ipaddress.ip_network('1::/16'),
1927
+ ipaddress.ip_network('2::/128')])
1928
+
1929
+ ip1 = ipaddress.ip_address('1::%scope')
1930
+ ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope')
1931
+ # test an IPv6 is summarized properly
1932
+ self.assertEqual(list(summarize(ip1, ip2))[0],
1933
+ ipaddress.ip_network('1::/16'))
1934
+ # test an IPv6 range that isn't on a network byte boundary
1935
+ ip2 = ipaddress.ip_address('2::%scope')
1936
+ self.assertEqual(list(summarize(ip1, ip2)),
1937
+ [ipaddress.ip_network('1::/16'),
1938
+ ipaddress.ip_network('2::/128')])
1939
+
1940
+ # test exception raised when first is greater than last
1941
+ self.assertRaises(ValueError, list,
1942
+ summarize(ipaddress.ip_address('1.1.1.0'),
1943
+ ipaddress.ip_address('1.1.0.0')))
1944
+ # test exception raised when first and last aren't IP addresses
1945
+ self.assertRaises(TypeError, list,
1946
+ summarize(ipaddress.ip_network('1.1.1.0'),
1947
+ ipaddress.ip_network('1.1.0.0')))
1948
+ self.assertRaises(TypeError, list,
1949
+ summarize(ipaddress.ip_network('1.1.1.0'),
1950
+ ipaddress.ip_network('1.1.0.0')))
1951
+ # test exception raised when first and last are not same version
1952
+ self.assertRaises(TypeError, list,
1953
+ summarize(ipaddress.ip_address('::'),
1954
+ ipaddress.ip_network('1.1.0.0')))
1955
+
1956
+ def testAddressComparison(self):
1957
+ self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1958
+ ipaddress.ip_address('1.1.1.1'))
1959
+ self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1960
+ ipaddress.ip_address('1.1.1.2'))
1961
+ self.assertTrue(ipaddress.ip_address('::1') <=
1962
+ ipaddress.ip_address('::1'))
1963
+ self.assertTrue(ipaddress.ip_address('::1') <=
1964
+ ipaddress.ip_address('::2'))
1965
+ self.assertTrue(ipaddress.ip_address('::1%scope') <=
1966
+ ipaddress.ip_address('::1%scope'))
1967
+ self.assertTrue(ipaddress.ip_address('::1%scope') <=
1968
+ ipaddress.ip_address('::2%scope'))
1969
+
1970
+ def testInterfaceComparison(self):
1971
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1972
+ ipaddress.ip_interface('1.1.1.1/24'))
1973
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1974
+ ipaddress.ip_interface('1.1.1.1/24'))
1975
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1976
+ ipaddress.ip_interface('1.1.1.2/24'))
1977
+ self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1978
+ ipaddress.ip_interface('1.1.1.1/24'))
1979
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1980
+ ipaddress.ip_interface('1.1.1.1/16'))
1981
+ self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1982
+ ipaddress.ip_interface('1.1.1.1/24'))
1983
+ self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1984
+ ipaddress.ip_interface('1.1.1.2/16'))
1985
+
1986
+ self.assertTrue(ipaddress.ip_interface('::1/64') ==
1987
+ ipaddress.ip_interface('::1/64'))
1988
+ self.assertTrue(ipaddress.ip_interface('::1/64') <
1989
+ ipaddress.ip_interface('::1/80'))
1990
+ self.assertTrue(ipaddress.ip_interface('::1/64') <
1991
+ ipaddress.ip_interface('::2/64'))
1992
+ self.assertTrue(ipaddress.ip_interface('::2/48') <
1993
+ ipaddress.ip_interface('::1/64'))
1994
+ self.assertTrue(ipaddress.ip_interface('::1/80') >
1995
+ ipaddress.ip_interface('::1/64'))
1996
+ self.assertTrue(ipaddress.ip_interface('::2/64') >
1997
+ ipaddress.ip_interface('::1/64'))
1998
+ self.assertTrue(ipaddress.ip_interface('::1/64') >
1999
+ ipaddress.ip_interface('::2/48'))
2000
+
2001
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') ==
2002
+ ipaddress.ip_interface('::1%scope/64'))
2003
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
2004
+ ipaddress.ip_interface('::1%scope/80'))
2005
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
2006
+ ipaddress.ip_interface('::2%scope/64'))
2007
+ self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
2008
+ ipaddress.ip_interface('::1%scope/64'))
2009
+ self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
2010
+ ipaddress.ip_interface('::1%scope/64'))
2011
+ self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
2012
+ ipaddress.ip_interface('::1%scope/64'))
2013
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
2014
+ ipaddress.ip_interface('::2%scope/48'))
2015
+
2016
+ self.assertFalse(ipaddress.ip_interface('::1%scope/64') ==
2017
+ ipaddress.ip_interface('::1/64'))
2018
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
2019
+ ipaddress.ip_interface('::1/80'))
2020
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
2021
+ ipaddress.ip_interface('::2/64'))
2022
+ self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
2023
+ ipaddress.ip_interface('::1/64'))
2024
+ self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
2025
+ ipaddress.ip_interface('::1/64'))
2026
+ self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
2027
+ ipaddress.ip_interface('::1/64'))
2028
+ self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
2029
+ ipaddress.ip_interface('::2/48'))
2030
+
2031
+ self.assertFalse(ipaddress.ip_interface('::1/64') ==
2032
+ ipaddress.ip_interface('::1%scope/64'))
2033
+ self.assertTrue(ipaddress.ip_interface('::1/64') <
2034
+ ipaddress.ip_interface('::1%scope/80'))
2035
+ self.assertTrue(ipaddress.ip_interface('::1/64') <
2036
+ ipaddress.ip_interface('::2%scope/64'))
2037
+ self.assertTrue(ipaddress.ip_interface('::2/48') <
2038
+ ipaddress.ip_interface('::1%scope/64'))
2039
+ self.assertTrue(ipaddress.ip_interface('::1/80') >
2040
+ ipaddress.ip_interface('::1%scope/64'))
2041
+ self.assertTrue(ipaddress.ip_interface('::2/64') >
2042
+ ipaddress.ip_interface('::1%scope/64'))
2043
+ self.assertTrue(ipaddress.ip_interface('::1/64') >
2044
+ ipaddress.ip_interface('::2%scope/48'))
2045
+
2046
+ def testNetworkComparison(self):
2047
+ # ip1 and ip2 have the same network address
2048
+ ip1 = ipaddress.IPv4Network('1.1.1.0/24')
2049
+ ip2 = ipaddress.IPv4Network('1.1.1.0/32')
2050
+ ip3 = ipaddress.IPv4Network('1.1.2.0/24')
2051
+
2052
+ self.assertTrue(ip1 < ip3)
2053
+ self.assertTrue(ip3 > ip2)
2054
+
2055
+ self.assertEqual(ip1.compare_networks(ip1), 0)
2056
+
2057
+ # if addresses are the same, sort by netmask
2058
+ self.assertEqual(ip1.compare_networks(ip2), -1)
2059
+ self.assertEqual(ip2.compare_networks(ip1), 1)
2060
+
2061
+ self.assertEqual(ip1.compare_networks(ip3), -1)
2062
+ self.assertEqual(ip3.compare_networks(ip1), 1)
2063
+ self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2064
+
2065
+ ip1 = ipaddress.IPv6Network('2001:2000::/96')
2066
+ ip2 = ipaddress.IPv6Network('2001:2001::/96')
2067
+ ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
2068
+
2069
+ self.assertTrue(ip1 < ip3)
2070
+ self.assertTrue(ip3 > ip2)
2071
+ self.assertEqual(ip1.compare_networks(ip3), -1)
2072
+ self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2073
+
2074
+ # Test comparing different protocols.
2075
+ # Should always raise a TypeError.
2076
+ self.assertRaises(TypeError,
2077
+ self.ipv4_network.compare_networks,
2078
+ self.ipv6_network)
2079
+ ipv6 = ipaddress.IPv6Interface('::/0')
2080
+ ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
2081
+ self.assertRaises(TypeError, ipv4.__lt__, ipv6)
2082
+ self.assertRaises(TypeError, ipv4.__gt__, ipv6)
2083
+ self.assertRaises(TypeError, ipv6.__lt__, ipv4)
2084
+ self.assertRaises(TypeError, ipv6.__gt__, ipv4)
2085
+
2086
+ # Regression test for issue 19.
2087
+ ip1 = ipaddress.ip_network('10.1.2.128/25')
2088
+ self.assertFalse(ip1 < ip1)
2089
+ self.assertFalse(ip1 > ip1)
2090
+ ip2 = ipaddress.ip_network('10.1.3.0/24')
2091
+ self.assertTrue(ip1 < ip2)
2092
+ self.assertFalse(ip2 < ip1)
2093
+ self.assertFalse(ip1 > ip2)
2094
+ self.assertTrue(ip2 > ip1)
2095
+ ip3 = ipaddress.ip_network('10.1.3.0/25')
2096
+ self.assertTrue(ip2 < ip3)
2097
+ self.assertFalse(ip3 < ip2)
2098
+ self.assertFalse(ip2 > ip3)
2099
+ self.assertTrue(ip3 > ip2)
2100
+
2101
+ # Regression test for issue 28.
2102
+ ip1 = ipaddress.ip_network('10.10.10.0/31')
2103
+ ip2 = ipaddress.ip_network('10.10.10.0')
2104
+ ip3 = ipaddress.ip_network('10.10.10.2/31')
2105
+ ip4 = ipaddress.ip_network('10.10.10.2')
2106
+ sorted = [ip1, ip2, ip3, ip4]
2107
+ unsorted = [ip2, ip4, ip1, ip3]
2108
+ unsorted.sort()
2109
+ self.assertEqual(sorted, unsorted)
2110
+ unsorted = [ip4, ip1, ip3, ip2]
2111
+ unsorted.sort()
2112
+ self.assertEqual(sorted, unsorted)
2113
+ self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
2114
+ NotImplemented)
2115
+ self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
2116
+ NotImplemented)
2117
+
2118
+ # <=, >=
2119
+ self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2120
+ ipaddress.ip_network('1.1.1.1'))
2121
+ self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2122
+ ipaddress.ip_network('1.1.1.2'))
2123
+ self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
2124
+ ipaddress.ip_network('1.1.1.1'))
2125
+
2126
+ self.assertTrue(ipaddress.ip_network('::1') <=
2127
+ ipaddress.ip_network('::1'))
2128
+ self.assertTrue(ipaddress.ip_network('::1') <=
2129
+ ipaddress.ip_network('::2'))
2130
+ self.assertFalse(ipaddress.ip_network('::2') <=
2131
+ ipaddress.ip_network('::1'))
2132
+
2133
+ def testStrictNetworks(self):
2134
+ self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
2135
+ self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
2136
+ self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120')
2137
+
2138
+ def testOverlaps(self):
2139
+ other = ipaddress.IPv4Network('1.2.3.0/30')
2140
+ other2 = ipaddress.IPv4Network('1.2.2.0/24')
2141
+ other3 = ipaddress.IPv4Network('1.2.2.64/26')
2142
+ self.assertTrue(self.ipv4_network.overlaps(other))
2143
+ self.assertFalse(self.ipv4_network.overlaps(other2))
2144
+ self.assertTrue(other2.overlaps(other3))
2145
+
2146
+ def testEmbeddedIpv4(self):
2147
+ ipv4_string = '192.168.0.1'
2148
+ ipv4 = ipaddress.IPv4Interface(ipv4_string)
2149
+ v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
2150
+ self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
2151
+ v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
2152
+ self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
2153
+ self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
2154
+ '2001:1.1.1.1:1.1.1.1')
2155
+
2156
+ # Issue 67: IPv6 with embedded IPv4 address not recognized.
2157
+ def testIPv6AddressTooLarge(self):
2158
+ # RFC4291 2.5.5.2
2159
+ self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2160
+ ipaddress.ip_address('::FFFF:c000:201'))
2161
+ # RFC4291 2.2 (part 3) x::d.d.d.d
2162
+ self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2163
+ ipaddress.ip_address('FFFF::c000:201'))
2164
+
2165
+ self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2166
+ ipaddress.ip_address('::FFFF:c000:201%scope'))
2167
+ self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2168
+ ipaddress.ip_address('FFFF::c000:201%scope'))
2169
+ self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2170
+ ipaddress.ip_address('::FFFF:c000:201'))
2171
+ self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2172
+ ipaddress.ip_address('FFFF::c000:201'))
2173
+ self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2174
+ ipaddress.ip_address('::FFFF:c000:201%scope'))
2175
+ self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2176
+ ipaddress.ip_address('FFFF::c000:201%scope'))
2177
+
2178
+ def testIPVersion(self):
2179
+ self.assertEqual(self.ipv4_address.version, 4)
2180
+ self.assertEqual(self.ipv6_address.version, 6)
2181
+ self.assertEqual(self.ipv6_scoped_address.version, 6)
2182
+
2183
+ def testMaxPrefixLength(self):
2184
+ self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
2185
+ self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
2186
+ self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128)
2187
+
2188
+ def testPacked(self):
2189
+ self.assertEqual(self.ipv4_address.packed,
2190
+ b'\x01\x02\x03\x04')
2191
+ self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
2192
+ b'\xff\xfe\xfd\xfc')
2193
+ self.assertEqual(self.ipv6_address.packed,
2194
+ b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2195
+ b'\x02\x00\x00\x00\x00\x00\x00\x01')
2196
+ self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
2197
+ b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2198
+ + b'\x00' * 6)
2199
+ self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
2200
+ b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
2201
+ self.assertEqual(self.ipv6_scoped_address.packed,
2202
+ b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2203
+ b'\x02\x00\x00\x00\x00\x00\x00\x01')
2204
+ self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed,
2205
+ b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2206
+ + b'\x00' * 6)
2207
+ self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed,
2208
+ b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
2209
+
2210
+ def testIpType(self):
2211
+ ipv4net = ipaddress.ip_network('1.2.3.4')
2212
+ ipv4addr = ipaddress.ip_address('1.2.3.4')
2213
+ ipv6net = ipaddress.ip_network('::1.2.3.4')
2214
+ ipv6addr = ipaddress.ip_address('::1.2.3.4')
2215
+ self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
2216
+ self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
2217
+ self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
2218
+ self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
2219
+
2220
+ def testReservedIpv4(self):
2221
+ # test networks
2222
+ self.assertEqual(True, ipaddress.ip_interface(
2223
+ '224.1.1.1/31').is_multicast)
2224
+ self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
2225
+ self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
2226
+
2227
+ self.assertEqual(True, ipaddress.ip_interface(
2228
+ '192.168.1.1/17').is_private)
2229
+ self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
2230
+ self.assertEqual(True, ipaddress.ip_network(
2231
+ '10.255.255.255').is_private)
2232
+ self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
2233
+ self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
2234
+ self.assertEqual(True, ipaddress.ip_network(
2235
+ '172.31.255.255').is_private)
2236
+ self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
2237
+ self.assertEqual(True,
2238
+ ipaddress.ip_network('169.254.1.0/24').is_link_local)
2239
+
2240
+ self.assertEqual(True,
2241
+ ipaddress.ip_interface(
2242
+ '169.254.100.200/24').is_link_local)
2243
+ self.assertEqual(False,
2244
+ ipaddress.ip_interface(
2245
+ '169.255.100.200/24').is_link_local)
2246
+
2247
+ self.assertEqual(True,
2248
+ ipaddress.ip_network(
2249
+ '127.100.200.254/32').is_loopback)
2250
+ self.assertEqual(True, ipaddress.ip_network(
2251
+ '127.42.0.0/16').is_loopback)
2252
+ self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
2253
+ self.assertEqual(False,
2254
+ ipaddress.ip_network('100.64.0.0/10').is_private)
2255
+ self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
2256
+
2257
+ self.assertEqual(True,
2258
+ ipaddress.ip_network('192.0.2.128/25').is_private)
2259
+ self.assertEqual(True,
2260
+ ipaddress.ip_network('192.0.3.0/24').is_global)
2261
+
2262
+ # test addresses
2263
+ self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
2264
+ self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
2265
+ self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
2266
+ self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
2267
+ self.assertEqual(False,
2268
+ ipaddress.ip_address('239.255.255.255').is_reserved)
2269
+
2270
+ self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
2271
+ self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
2272
+ self.assertEqual(True, ipaddress.ip_address(
2273
+ '10.255.255.255').is_private)
2274
+ self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
2275
+ self.assertEqual(True, ipaddress.ip_address(
2276
+ '172.31.255.255').is_private)
2277
+ self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
2278
+ self.assertFalse(ipaddress.ip_address('192.0.0.0').is_global)
2279
+ self.assertTrue(ipaddress.ip_address('192.0.0.9').is_global)
2280
+ self.assertTrue(ipaddress.ip_address('192.0.0.10').is_global)
2281
+ self.assertFalse(ipaddress.ip_address('192.0.0.255').is_global)
2282
+
2283
+ self.assertEqual(True,
2284
+ ipaddress.ip_address('169.254.100.200').is_link_local)
2285
+ self.assertEqual(False,
2286
+ ipaddress.ip_address('169.255.100.200').is_link_local)
2287
+
2288
+ self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
2289
+ self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
2290
+
2291
+ self.assertEqual(True,
2292
+ ipaddress.ip_address('127.100.200.254').is_loopback)
2293
+ self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
2294
+ self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
2295
+ self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
2296
+
2297
+ def testPrivateNetworks(self):
2298
+ self.assertEqual(False, ipaddress.ip_network("0.0.0.0/0").is_private)
2299
+ self.assertEqual(False, ipaddress.ip_network("1.0.0.0/8").is_private)
2300
+
2301
+ self.assertEqual(True, ipaddress.ip_network("0.0.0.0/8").is_private)
2302
+ self.assertEqual(True, ipaddress.ip_network("10.0.0.0/8").is_private)
2303
+ self.assertEqual(True, ipaddress.ip_network("127.0.0.0/8").is_private)
2304
+ self.assertEqual(True, ipaddress.ip_network("169.254.0.0/16").is_private)
2305
+ self.assertEqual(True, ipaddress.ip_network("172.16.0.0/12").is_private)
2306
+ self.assertEqual(True, ipaddress.ip_network("192.0.0.0/29").is_private)
2307
+ self.assertEqual(False, ipaddress.ip_network("192.0.0.9/32").is_private)
2308
+ self.assertEqual(True, ipaddress.ip_network("192.0.0.170/31").is_private)
2309
+ self.assertEqual(True, ipaddress.ip_network("192.0.2.0/24").is_private)
2310
+ self.assertEqual(True, ipaddress.ip_network("192.168.0.0/16").is_private)
2311
+ self.assertEqual(True, ipaddress.ip_network("198.18.0.0/15").is_private)
2312
+ self.assertEqual(True, ipaddress.ip_network("198.51.100.0/24").is_private)
2313
+ self.assertEqual(True, ipaddress.ip_network("203.0.113.0/24").is_private)
2314
+ self.assertEqual(True, ipaddress.ip_network("240.0.0.0/4").is_private)
2315
+ self.assertEqual(True, ipaddress.ip_network("255.255.255.255/32").is_private)
2316
+
2317
+ self.assertEqual(False, ipaddress.ip_network("::/0").is_private)
2318
+ self.assertEqual(False, ipaddress.ip_network("::ff/128").is_private)
2319
+
2320
+ self.assertEqual(True, ipaddress.ip_network("::1/128").is_private)
2321
+ self.assertEqual(True, ipaddress.ip_network("::/128").is_private)
2322
+ self.assertEqual(True, ipaddress.ip_network("::ffff:0:0/96").is_private)
2323
+ self.assertEqual(True, ipaddress.ip_network("100::/64").is_private)
2324
+ self.assertEqual(True, ipaddress.ip_network("2001:2::/48").is_private)
2325
+ self.assertEqual(False, ipaddress.ip_network("2001:3::/48").is_private)
2326
+ self.assertEqual(True, ipaddress.ip_network("2001:db8::/32").is_private)
2327
+ self.assertEqual(True, ipaddress.ip_network("2001:10::/28").is_private)
2328
+ self.assertEqual(True, ipaddress.ip_network("fc00::/7").is_private)
2329
+ self.assertEqual(True, ipaddress.ip_network("fe80::/10").is_private)
2330
+
2331
+ def testReservedIpv6(self):
2332
+
2333
+ self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
2334
+ self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
2335
+ self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
2336
+ self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
2337
+
2338
+ self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
2339
+ self.assertEqual(True, ipaddress.ip_network(
2340
+ 'feff:ffff:ffff:ffff::').is_site_local)
2341
+ self.assertEqual(False, ipaddress.ip_network(
2342
+ 'fbf:ffff::').is_site_local)
2343
+ self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
2344
+
2345
+ self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
2346
+ self.assertEqual(True, ipaddress.ip_network(
2347
+ 'fc00:ffff:ffff:ffff::').is_private)
2348
+ self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
2349
+ self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
2350
+
2351
+ self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
2352
+ self.assertEqual(True, ipaddress.ip_network(
2353
+ 'febf:ffff::').is_link_local)
2354
+ self.assertEqual(False, ipaddress.ip_network(
2355
+ 'fe7f:ffff::').is_link_local)
2356
+ self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
2357
+
2358
+ self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
2359
+ self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
2360
+ self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
2361
+ self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
2362
+
2363
+ self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
2364
+ self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
2365
+ self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
2366
+
2367
+ self.assertEqual(True,
2368
+ ipaddress.ip_network('2001::1/128').is_private)
2369
+ self.assertEqual(True,
2370
+ ipaddress.ip_network('200::1/128').is_global)
2371
+ # test addresses
2372
+ self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
2373
+ self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
2374
+ self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
2375
+ self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
2376
+
2377
+ self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
2378
+ self.assertEqual(True, ipaddress.ip_address(
2379
+ 'feff:ffff:ffff:ffff::').is_site_local)
2380
+ self.assertEqual(False, ipaddress.ip_address(
2381
+ 'fbf:ffff::').is_site_local)
2382
+ self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
2383
+
2384
+ self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
2385
+ self.assertEqual(True, ipaddress.ip_address(
2386
+ 'fc00:ffff:ffff:ffff::').is_private)
2387
+ self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
2388
+ self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
2389
+
2390
+ self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
2391
+ self.assertEqual(True, ipaddress.ip_address(
2392
+ 'febf:ffff::').is_link_local)
2393
+ self.assertEqual(False, ipaddress.ip_address(
2394
+ 'fe7f:ffff::').is_link_local)
2395
+ self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
2396
+
2397
+ self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
2398
+ self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
2399
+ self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
2400
+
2401
+ self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
2402
+ self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
2403
+
2404
+ self.assertFalse(ipaddress.ip_address('64:ff9b:1::').is_global)
2405
+ self.assertFalse(ipaddress.ip_address('2001::').is_global)
2406
+ self.assertTrue(ipaddress.ip_address('2001:1::1').is_global)
2407
+ self.assertTrue(ipaddress.ip_address('2001:1::2').is_global)
2408
+ self.assertFalse(ipaddress.ip_address('2001:2::').is_global)
2409
+ self.assertTrue(ipaddress.ip_address('2001:3::').is_global)
2410
+ self.assertFalse(ipaddress.ip_address('2001:4::').is_global)
2411
+ self.assertTrue(ipaddress.ip_address('2001:4:112::').is_global)
2412
+ self.assertFalse(ipaddress.ip_address('2001:10::').is_global)
2413
+ self.assertTrue(ipaddress.ip_address('2001:20::').is_global)
2414
+ self.assertTrue(ipaddress.ip_address('2001:30::').is_global)
2415
+ self.assertFalse(ipaddress.ip_address('2001:40::').is_global)
2416
+ self.assertFalse(ipaddress.ip_address('2002::').is_global)
2417
+
2418
+ # some generic IETF reserved addresses
2419
+ self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
2420
+ self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
2421
+
2422
+ def testIpv4Mapped(self):
2423
+ self.assertEqual(
2424
+ ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
2425
+ ipaddress.ip_address('192.168.1.1'))
2426
+ self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
2427
+ self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
2428
+ ipaddress.ip_address('192.168.1.1'))
2429
+
2430
+ def testIpv4MappedPrivateCheck(self):
2431
+ self.assertEqual(
2432
+ True, ipaddress.ip_address('::ffff:192.168.1.1').is_private)
2433
+ self.assertEqual(
2434
+ False, ipaddress.ip_address('::ffff:172.32.0.0').is_private)
2435
+
2436
+ def testAddrExclude(self):
2437
+ addr1 = ipaddress.ip_network('10.1.1.0/24')
2438
+ addr2 = ipaddress.ip_network('10.1.1.0/26')
2439
+ addr3 = ipaddress.ip_network('10.2.1.0/24')
2440
+ addr4 = ipaddress.ip_address('10.1.1.0')
2441
+ addr5 = ipaddress.ip_network('2001:db8::0/32')
2442
+ addr6 = ipaddress.ip_network('10.1.1.5/32')
2443
+ self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
2444
+ [ipaddress.ip_network('10.1.1.64/26'),
2445
+ ipaddress.ip_network('10.1.1.128/25')])
2446
+ self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
2447
+ self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
2448
+ self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
2449
+ self.assertEqual(list(addr1.address_exclude(addr1)), [])
2450
+ self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
2451
+ [ipaddress.ip_network('10.1.1.0/30'),
2452
+ ipaddress.ip_network('10.1.1.4/32'),
2453
+ ipaddress.ip_network('10.1.1.6/31'),
2454
+ ipaddress.ip_network('10.1.1.8/29'),
2455
+ ipaddress.ip_network('10.1.1.16/28'),
2456
+ ipaddress.ip_network('10.1.1.32/27'),
2457
+ ipaddress.ip_network('10.1.1.64/26'),
2458
+ ipaddress.ip_network('10.1.1.128/25')])
2459
+
2460
+ def testHash(self):
2461
+ self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
2462
+ hash(ipaddress.ip_interface('10.1.1.0/24')))
2463
+ self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
2464
+ hash(ipaddress.ip_network('10.1.1.0/24')))
2465
+ self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
2466
+ hash(ipaddress.ip_address('10.1.1.0')))
2467
+ # i70
2468
+ self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
2469
+ hash(ipaddress.ip_address(
2470
+ int(ipaddress.ip_address('1.2.3.4')._ip))))
2471
+ ip1 = ipaddress.ip_address('10.1.1.0')
2472
+ ip2 = ipaddress.ip_address('1::')
2473
+ dummy = {}
2474
+ dummy[self.ipv4_address] = None
2475
+ dummy[self.ipv6_address] = None
2476
+ dummy[ip1] = None
2477
+ dummy[ip2] = None
2478
+ self.assertIn(self.ipv4_address, dummy)
2479
+ self.assertIn(ip2, dummy)
2480
+
2481
+ def testIPBases(self):
2482
+ net = self.ipv4_network
2483
+ self.assertEqual('1.2.3.0/24', net.compressed)
2484
+ net = self.ipv6_network
2485
+ self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
2486
+
2487
+ def testIPv6NetworkHelpers(self):
2488
+ net = self.ipv6_network
2489
+ self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
2490
+ self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
2491
+ net.with_netmask)
2492
+ self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
2493
+ net.with_hostmask)
2494
+ self.assertEqual('2001:658:22a:cafe::/64', str(net))
2495
+
2496
+ def testIPv4NetworkHelpers(self):
2497
+ net = self.ipv4_network
2498
+ self.assertEqual('1.2.3.0/24', net.with_prefixlen)
2499
+ self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
2500
+ self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
2501
+ self.assertEqual('1.2.3.0/24', str(net))
2502
+
2503
+ def testCopyConstructor(self):
2504
+ addr1 = ipaddress.ip_network('10.1.1.0/24')
2505
+ addr2 = ipaddress.ip_network(addr1)
2506
+ addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
2507
+ addr4 = ipaddress.ip_interface(addr3)
2508
+ addr5 = ipaddress.IPv4Address('1.1.1.1')
2509
+ addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
2510
+
2511
+ self.assertEqual(addr1, addr2)
2512
+ self.assertEqual(addr3, addr4)
2513
+ self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
2514
+ self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
2515
+
2516
+ def testCompressIPv6Address(self):
2517
+ test_addresses = {
2518
+ '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
2519
+ '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
2520
+ '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
2521
+ '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
2522
+ '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
2523
+ '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
2524
+ '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
2525
+ '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
2526
+ '0:0:0:0:0:0:0:0': '::/128',
2527
+ '0:0:0:0:0:0:0:0/0': '::/0',
2528
+ '0:0:0:0:0:0:0:1': '::1/128',
2529
+ '2001:0658:022a:cafe:0000:0000:0000:0000/66':
2530
+ '2001:658:22a:cafe::/66',
2531
+ '::1.2.3.4': '::102:304/128',
2532
+ '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
2533
+ '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
2534
+ '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
2535
+ '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
2536
+ '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2537
+ }
2538
+ for uncompressed, compressed in list(test_addresses.items()):
2539
+ self.assertEqual(compressed, str(ipaddress.IPv6Interface(
2540
+ uncompressed)))
2541
+
2542
+ def testExplodeShortHandIpStr(self):
2543
+ addr1 = ipaddress.IPv6Interface('2001::1')
2544
+ addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2545
+ addr3 = ipaddress.IPv6Network('2001::/96')
2546
+ addr4 = ipaddress.IPv4Address('192.168.178.1')
2547
+ self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
2548
+ addr1.exploded)
2549
+ self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
2550
+ ipaddress.IPv6Interface('::1/128').exploded)
2551
+ # issue 77
2552
+ self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
2553
+ addr2.exploded)
2554
+ self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
2555
+ addr3.exploded)
2556
+ self.assertEqual('192.168.178.1', addr4.exploded)
2557
+
2558
+ def testReversePointer(self):
2559
+ addr1 = ipaddress.IPv4Address('127.0.0.1')
2560
+ addr2 = ipaddress.IPv6Address('2001:db8::1')
2561
+ self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
2562
+ self.assertEqual('1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.' +
2563
+ 'b.d.0.1.0.0.2.ip6.arpa',
2564
+ addr2.reverse_pointer)
2565
+
2566
+ def testIntRepresentation(self):
2567
+ self.assertEqual(16909060, int(self.ipv4_address))
2568
+ self.assertEqual(42540616829182469433547762482097946625,
2569
+ int(self.ipv6_address))
2570
+
2571
+ def testForceVersion(self):
2572
+ self.assertEqual(ipaddress.ip_network(1).version, 4)
2573
+ self.assertEqual(ipaddress.IPv6Network(1).version, 6)
2574
+
2575
+ def testWithStar(self):
2576
+ self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
2577
+ self.assertEqual(self.ipv4_interface.with_netmask,
2578
+ "1.2.3.4/255.255.255.0")
2579
+ self.assertEqual(self.ipv4_interface.with_hostmask,
2580
+ "1.2.3.4/0.0.0.255")
2581
+
2582
+ self.assertEqual(self.ipv6_interface.with_prefixlen,
2583
+ '2001:658:22a:cafe:200::1/64')
2584
+ self.assertEqual(self.ipv6_interface.with_netmask,
2585
+ '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
2586
+ # this probably don't make much sense, but it's included for
2587
+ # compatibility with ipv4
2588
+ self.assertEqual(self.ipv6_interface.with_hostmask,
2589
+ '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2590
+
2591
+ def testNetworkElementCaching(self):
2592
+ # V4 - make sure we're empty
2593
+ self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
2594
+ self.assertNotIn('hostmask', self.ipv4_network.__dict__)
2595
+
2596
+ # V4 - populate and test
2597
+ self.assertEqual(self.ipv4_network.broadcast_address,
2598
+ ipaddress.IPv4Address('1.2.3.255'))
2599
+ self.assertEqual(self.ipv4_network.hostmask,
2600
+ ipaddress.IPv4Address('0.0.0.255'))
2601
+
2602
+ # V4 - check we're cached
2603
+ self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2604
+ self.assertIn('hostmask', self.ipv4_network.__dict__)
2605
+
2606
+ # V6 - make sure we're empty
2607
+ self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2608
+ self.assertNotIn('hostmask', self.ipv6_network.__dict__)
2609
+
2610
+ # V6 - populate and test
2611
+ self.assertEqual(self.ipv6_network.network_address,
2612
+ ipaddress.IPv6Address('2001:658:22a:cafe::'))
2613
+ self.assertEqual(self.ipv6_interface.network.network_address,
2614
+ ipaddress.IPv6Address('2001:658:22a:cafe::'))
2615
+
2616
+ self.assertEqual(
2617
+ self.ipv6_network.broadcast_address,
2618
+ ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2619
+ self.assertEqual(self.ipv6_network.hostmask,
2620
+ ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2621
+ self.assertEqual(
2622
+ self.ipv6_interface.network.broadcast_address,
2623
+ ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2624
+ self.assertEqual(self.ipv6_interface.network.hostmask,
2625
+ ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2626
+
2627
+ # V6 - check we're cached
2628
+ self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2629
+ self.assertIn('hostmask', self.ipv6_network.__dict__)
2630
+ self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2631
+ self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
2632
+
2633
+ def testTeredo(self):
2634
+ # stolen from wikipedia
2635
+ server = ipaddress.IPv4Address('65.54.227.120')
2636
+ client = ipaddress.IPv4Address('192.0.2.45')
2637
+ teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2638
+ self.assertEqual((server, client),
2639
+ ipaddress.ip_address(teredo_addr).teredo)
2640
+ bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2641
+ self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2642
+ bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2643
+ self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2644
+
2645
+ # i77
2646
+ teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2647
+ self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2648
+ ipaddress.IPv4Address('95.26.244.94')),
2649
+ teredo_addr.teredo)
2650
+
2651
+ def testsixtofour(self):
2652
+ sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2653
+ bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2654
+ self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2655
+ sixtofouraddr.sixtofour)
2656
+ self.assertFalse(bad_addr.sixtofour)
2657
+
2658
+ # issue41004 Hash collisions in IPv4Interface and IPv6Interface
2659
+ def testV4HashIsNotConstant(self):
2660
+ ipv4_address1 = ipaddress.IPv4Interface("1.2.3.4")
2661
+ ipv4_address2 = ipaddress.IPv4Interface("2.3.4.5")
2662
+ self.assertNotEqual(ipv4_address1.__hash__(), ipv4_address2.__hash__())
2663
+
2664
+ # issue41004 Hash collisions in IPv4Interface and IPv6Interface
2665
+ def testV6HashIsNotConstant(self):
2666
+ ipv6_address1 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:1")
2667
+ ipv6_address2 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:2")
2668
+ self.assertNotEqual(ipv6_address1.__hash__(), ipv6_address2.__hash__())
2669
+
2670
+
2671
+ if __name__ == '__main__': # pragma: no cover
2672
+ unittest.main()