@@ -3,6 +3,8 @@ package maxminddb
3
3
import (
4
4
"fmt"
5
5
"net"
6
+ "strconv"
7
+ "strings"
6
8
"testing"
7
9
8
10
"github.com/stretchr/testify/assert"
@@ -71,20 +73,50 @@ var tests = []networkTest{
71
73
},
72
74
},
73
75
{
76
+ // This is intentionally in non-canonical form to test
77
+ // that we handle it correctly.
74
78
Network : "1.1.1.1/30" ,
75
79
Database : "ipv4" ,
76
80
Expected : []string {
77
81
"1.1.1.1/32" ,
78
82
"1.1.1.2/31" ,
79
83
},
80
84
},
85
+ {
86
+ Network : "1.1.1.2/31" ,
87
+ Database : "ipv4" ,
88
+ Expected : []string {
89
+ "1.1.1.2/31" ,
90
+ },
91
+ },
81
92
{
82
93
Network : "1.1.1.1/32" ,
83
94
Database : "ipv4" ,
84
95
Expected : []string {
85
96
"1.1.1.1/32" ,
86
97
},
87
98
},
99
+ {
100
+ Network : "1.1.1.2/32" ,
101
+ Database : "ipv4" ,
102
+ Expected : []string {
103
+ "1.1.1.2/31" ,
104
+ },
105
+ },
106
+ {
107
+ Network : "1.1.1.3/32" ,
108
+ Database : "ipv4" ,
109
+ Expected : []string {
110
+ "1.1.1.2/31" ,
111
+ },
112
+ },
113
+ {
114
+ Network : "1.1.1.19/32" ,
115
+ Database : "ipv4" ,
116
+ Expected : []string {
117
+ "1.1.1.16/28" ,
118
+ },
119
+ },
88
120
{
89
121
Network : "255.255.255.0/24" ,
90
122
Database : "ipv4" ,
@@ -234,28 +266,51 @@ var tests = []networkTest{
234
266
func TestNetworksWithin (t * testing.T ) {
235
267
for _ , v := range tests {
236
268
for _ , recordSize := range []uint {24 , 28 , 32 } {
237
- fileName := testFile (fmt .Sprintf ("MaxMind-DB-test-%s-%d.mmdb" , v .Database , recordSize ))
238
- reader , err := Open (fileName )
239
- require .NoError (t , err , "unexpected error while opening database: %v" , err )
269
+ name := fmt .Sprintf (
270
+ "%s-%d: %s, options: %v" ,
271
+ v .Database ,
272
+ recordSize ,
273
+ v .Network ,
274
+ len (v .Options ) != 0 ,
275
+ )
276
+ t .Run (name , func (t * testing.T ) {
277
+ fileName := testFile (fmt .Sprintf ("MaxMind-DB-test-%s-%d.mmdb" , v .Database , recordSize ))
278
+ reader , err := Open (fileName )
279
+ require .NoError (t , err , "unexpected error while opening database: %v" , err )
240
280
241
- _ , network , err := net .ParseCIDR (v .Network )
242
- require .NoError (t , err )
243
- n := reader .NetworksWithin (network , v .Options ... )
244
- var innerIPs []string
281
+ // We are purposely not using net.ParseCIDR so that we can pass in
282
+ // values that aren't in canonical form.
283
+ parts := strings .Split (v .Network , "/" )
284
+ ip := net .ParseIP (parts [0 ])
285
+ if v := ip .To4 (); v != nil {
286
+ ip = v
287
+ }
288
+ prefixLength , err := strconv .Atoi (parts [1 ])
289
+ require .NoError (t , err )
290
+ mask := net .CIDRMask (prefixLength , len (ip )* 8 )
291
+ network := & net.IPNet {
292
+ IP : ip ,
293
+ Mask : mask ,
294
+ }
245
295
246
- for n .Next () {
247
- record := struct {
248
- IP string `maxminddb:"ip"`
249
- }{}
250
- network , err := n .Network (& record )
251
296
require .NoError (t , err )
252
- innerIPs = append ( innerIPs , network . String () )
253
- }
297
+ n := reader . NetworksWithin ( network , v . Options ... )
298
+ var innerIPs [] string
254
299
255
- assert .Equal (t , v .Expected , innerIPs )
256
- require .NoError (t , n .Err ())
300
+ for n .Next () {
301
+ record := struct {
302
+ IP string `maxminddb:"ip"`
303
+ }{}
304
+ network , err := n .Network (& record )
305
+ require .NoError (t , err )
306
+ innerIPs = append (innerIPs , network .String ())
307
+ }
257
308
258
- require .NoError (t , reader .Close ())
309
+ assert .Equal (t , v .Expected , innerIPs )
310
+ require .NoError (t , n .Err ())
311
+
312
+ require .NoError (t , reader .Close ())
313
+ })
259
314
}
260
315
}
261
316
}
0 commit comments