44from __future__ import unicode_literals
55
66import logging
7+ import ipaddress
78import mock
89import os
910import sys
@@ -48,6 +49,13 @@ def get_reader_from_file_descriptor(filepath, mode):
4849
4950
5051class BaseTestReader (object ):
52+ use_ip_objects = False
53+
54+ def ipf (self , ip ):
55+ if self .use_ip_objects :
56+ return ipaddress .ip_address (ip )
57+ return ip
58+
5159 def test_reader (self ):
5260 for record_size in [24 , 28 , 32 ]:
5361 for ip_version in [4 , 6 ]:
@@ -67,7 +75,7 @@ def test_reader(self):
6775 def test_decoder (self ):
6876 reader = open_database (
6977 'tests/data/test-data/MaxMind-DB-test-decoder.mmdb' , self .mode )
70- record = reader .get ('::1.1.1.0' )
78+ record = reader .get (self . ipf ( '::1.1.1.0' ) )
7179
7280 self .assertEqual (record ['array' ], [1 , 2 , 3 ])
7381 self .assertEqual (record ['boolean' ], True )
@@ -97,8 +105,8 @@ def test_no_ipv4_search_tree(self):
97105 'tests/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb' ,
98106 self .mode )
99107
100- self .assertEqual (reader .get ('1.1.1.1' ), '::0/64' )
101- self .assertEqual (reader .get ('192.1.1.1' ), '::0/64' )
108+ self .assertEqual (reader .get (self . ipf ( '1.1.1.1' ) ), '::0/64' )
109+ self .assertEqual (reader .get (self . ipf ( '192.1.1.1' ) ), '::0/64' )
102110 reader .close ()
103111
104112 def test_ipv6_address_in_ipv4_database (self ):
@@ -108,7 +116,7 @@ def test_ipv6_address_in_ipv4_database(self):
108116 ValueError , 'Error looking up 2001::. '
109117 'You attempted to look up an IPv6 address '
110118 'in an IPv4-only database' ):
111- reader .get ('2001::' )
119+ reader .get (self . ipf ( '2001::' ) )
112120 reader .close ()
113121
114122 def test_no_extension_exception (self ):
@@ -122,14 +130,6 @@ def test_no_extension_exception(self):
122130 MODE_MMAP_EXT )
123131 maxminddb .extension = real_extension
124132
125- def test_ip_object_lookup (self ):
126- reader = open_database ('tests/data/test-data/GeoIP2-City-Test.mmdb' ,
127- self .mode )
128- with self .assertRaisesRegex (TypeError ,
129- "must be str(?:ing)?, not IPv6Address" ):
130- reader .get (compat_ip_address ('2001:220::' ))
131- reader .close ()
132-
133133 def test_broken_database (self ):
134134 reader = open_database (
135135 'tests/data/test-data/'
@@ -138,7 +138,7 @@ def test_broken_database(self):
138138 InvalidDatabaseError , r"The MaxMind DB file's data "
139139 r"section contains bad data \(unknown data "
140140 r"type or corrupt data\)" ):
141- reader .get ('2001:220::' )
141+ reader .get (self . ipf ( '2001:220::' ) )
142142 reader .close ()
143143
144144 def test_ip_validation (self ):
@@ -183,7 +183,7 @@ def test_too_many_get_args(self):
183183 reader = open_database (
184184 'tests/data/test-data/MaxMind-DB-test-decoder.mmdb' , self .mode )
185185 with self .assertRaises (TypeError ):
186- reader .get ('1.1.1.1' , 'blah' )
186+ reader .get (self . ipf ( '1.1.1.1' ) , 'blah' )
187187 reader .close ()
188188
189189 def test_no_get_args (self ):
@@ -231,7 +231,7 @@ def test_closed_get(self):
231231 with self .assertRaisesRegex (
232232 ValueError ,
233233 'Attempt to read from a closed MaxMind DB.|closed' ):
234- reader .get ('1.1.1.1' )
234+ reader .get (self . ipf ( '1.1.1.1' ) )
235235
236236 def test_with_statement (self ):
237237 filename = 'tests/data/test-data/MaxMind-DB-test-ipv4-24.mmdb'
@@ -296,7 +296,7 @@ def _check_concurrency(self, worker_class):
296296 def lookup (pipe ):
297297 try :
298298 for i in range (32 ):
299- reader .get ('65.115.240.{i}' .format (i = i ))
299+ reader .get (self . ipf ( '65.115.240.{i}' .format (i = i ) ))
300300 pipe .send (1 )
301301 except :
302302 pipe .send (0 )
@@ -340,7 +340,7 @@ def _check_metadata(self, reader, ip_version, record_size):
340340 def _check_ip_v4 (self , reader , file_name ):
341341 for i in range (6 ):
342342 address = '1.1.1.' + str (pow (2 , i ))
343- self .assertEqual ({'ip' : address }, reader .get (address ),
343+ self .assertEqual ({'ip' : address }, reader .get (self . ipf ( address ) ),
344344 'found expected data record for ' + address +
345345 ' in ' + file_name )
346346
@@ -357,20 +357,20 @@ def _check_ip_v4(self, reader, file_name):
357357 data = {'ip' : value_address }
358358
359359 self .assertEqual (
360- data , reader .get (key_address ),
360+ data , reader .get (self . ipf ( key_address ) ),
361361 'found expected data record for ' + key_address + ' in ' +
362362 file_name )
363363
364364 for ip in ['1.1.1.33' , '255.254.253.123' ]:
365- self .assertIsNone (reader .get (ip ))
365+ self .assertIsNone (reader .get (self . ipf ( ip ) ))
366366
367367 def _check_ip_v6 (self , reader , file_name ):
368368 subnets = [
369369 '::1:ffff:ffff' , '::2:0:0' , '::2:0:40' , '::2:0:50' , '::2:0:58'
370370 ]
371371
372372 for address in subnets :
373- self .assertEqual ({'ip' : address }, reader .get (address ),
373+ self .assertEqual ({'ip' : address }, reader .get (self . ipf ( address ) ),
374374 'found expected data record for ' + address +
375375 ' in ' + file_name )
376376
@@ -386,12 +386,13 @@ def _check_ip_v6(self, reader, file_name):
386386 }
387387
388388 for key_address , value_address in pairs .items ():
389- self .assertEqual ({'ip' : value_address }, reader .get (key_address ),
389+ self .assertEqual ({'ip' : value_address },
390+ reader .get (self .ipf (key_address )),
390391 'found expected data record for ' + key_address +
391392 ' in ' + file_name )
392393
393394 for ip in ['1.1.1.33' , '255.254.253.123' , '89fa::' ]:
394- self .assertIsNone (reader .get (ip ))
395+ self .assertIsNone (reader .get (self . ipf ( ip ) ))
395396
396397
397398def has_maxminddb_extension ():
@@ -408,6 +409,17 @@ class TestExtensionReader(BaseTestReader, unittest.TestCase):
408409 readerClass = [maxminddb .extension .Reader ]
409410
410411
412+ @unittest .skipIf (not has_maxminddb_extension ()
413+ and not os .environ .get ('MM_FORCE_EXT_TESTS' ),
414+ 'No C extension module found. Skipping tests' )
415+ class TestExtensionReaderWithIPObjects (BaseTestReader , unittest .TestCase ):
416+ mode = MODE_MMAP_EXT
417+ use_ip_objects = True
418+
419+ if has_maxminddb_extension ():
420+ readerClass = [maxminddb .extension .Reader ]
421+
422+
411423class TestAutoReader (BaseTestReader , unittest .TestCase ):
412424 mode = MODE_AUTO
413425
@@ -422,6 +434,14 @@ class TestMMAPReader(BaseTestReader, unittest.TestCase):
422434 readerClass = [maxminddb .reader .Reader ]
423435
424436
437+ # We want one pure Python test to use IP objects, it doesn't
438+ # really matter which one.
439+ class TestMMAPReaderWithIPObjects (BaseTestReader , unittest .TestCase ):
440+ mode = MODE_MMAP
441+ use_ip_objects = True
442+ readerClass = [maxminddb .reader .Reader ]
443+
444+
425445class TestFileReader (BaseTestReader , unittest .TestCase ):
426446 mode = MODE_FILE
427447 readerClass = [maxminddb .reader .Reader ]
0 commit comments