Skip to content

Commit 54bb90f

Browse files
committed
Run tests with both ipaddress object and string IPs
1 parent ace0dbb commit 54bb90f

File tree

1 file changed

+42
-22
lines changed

1 file changed

+42
-22
lines changed

tests/reader_test.py

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from __future__ import unicode_literals
55

66
import logging
7+
import ipaddress
78
import mock
89
import os
910
import sys
@@ -48,6 +49,13 @@ def get_reader_from_file_descriptor(filepath, mode):
4849

4950

5051
class 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

397398
def 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+
411423
class 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+
425445
class TestFileReader(BaseTestReader, unittest.TestCase):
426446
mode = MODE_FILE
427447
readerClass = [maxminddb.reader.Reader]

0 commit comments

Comments
 (0)