@@ -2,6 +2,7 @@ package maxminddb
22
33import (
44 "fmt"
5+ "net"
56 "testing"
67
78 "github.com/stretchr/testify/assert"
@@ -46,3 +47,192 @@ func TestNetworksWithInvalidSearchTree(t *testing.T) {
4647 assert .NotNil (t , n .Err (), "no error received when traversing an broken search tree" )
4748 assert .Equal (t , n .Err ().Error (), "invalid search tree at 128.128.128.128/32" )
4849}
50+
51+ type networkTest struct {
52+ Network string
53+ Database string
54+ Expected []string
55+ }
56+
57+ var tests = []networkTest {
58+ networkTest {
59+ Network : "0.0.0.0/0" ,
60+ Database : "ipv4" ,
61+ Expected : []string {
62+ "1.1.1.1/32" ,
63+ "1.1.1.2/31" ,
64+ "1.1.1.4/30" ,
65+ "1.1.1.8/29" ,
66+ "1.1.1.16/28" ,
67+ "1.1.1.32/32" ,
68+ },
69+ },
70+ networkTest {
71+ Network : "1.1.1.1/30" ,
72+ Database : "ipv4" ,
73+ Expected : []string {
74+ "1.1.1.1/32" ,
75+ "1.1.1.2/31" ,
76+ },
77+ },
78+ networkTest {
79+ Network : "1.1.1.1/32" ,
80+ Database : "ipv4" ,
81+ Expected : []string {
82+ "1.1.1.1/32" ,
83+ },
84+ },
85+ networkTest {
86+ Network : "255.255.255.0/24" ,
87+ Database : "ipv4" ,
88+ Expected : []string (nil ),
89+ },
90+ networkTest {
91+ Network : "1.1.1.1/32" ,
92+ Database : "mixed" ,
93+ Expected : []string {
94+ "1.1.1.1/32" ,
95+ },
96+ },
97+ networkTest {
98+ Network : "255.255.255.0/24" ,
99+ Database : "mixed" ,
100+ Expected : []string (nil ),
101+ },
102+ networkTest {
103+ Network : "::1:ffff:ffff/128" ,
104+ Database : "ipv6" ,
105+ Expected : []string {
106+ "::1:ffff:ffff/128" ,
107+ },
108+ },
109+ networkTest {
110+ Network : "::/0" ,
111+ Database : "ipv6" ,
112+ Expected : []string {
113+ "::1:ffff:ffff/128" ,
114+ "::2:0:0/122" ,
115+ "::2:0:40/124" ,
116+ "::2:0:50/125" ,
117+ "::2:0:58/127" ,
118+ },
119+ },
120+ networkTest {
121+ Network : "::2:0:40/123" ,
122+ Database : "ipv6" ,
123+ Expected : []string {
124+ "::2:0:40/124" ,
125+ "::2:0:50/125" ,
126+ "::2:0:58/127" ,
127+ },
128+ },
129+ networkTest {
130+ Network : "0:0:0:0:0:ffff:ffff:ff00/120" ,
131+ Database : "ipv6" ,
132+ Expected : []string (nil ),
133+ },
134+ networkTest {
135+ Network : "0.0.0.0/0" ,
136+ Database : "mixed" ,
137+ Expected : []string {
138+ "1.1.1.1/32" ,
139+ "1.1.1.2/31" ,
140+ "1.1.1.4/30" ,
141+ "1.1.1.8/29" ,
142+ "1.1.1.16/28" ,
143+ "1.1.1.32/32" ,
144+ },
145+ },
146+ networkTest {
147+ Network : "1.1.1.16/28" ,
148+ Database : "mixed" ,
149+ Expected : []string {
150+ "1.1.1.16/28" ,
151+ },
152+ },
153+ networkTest {
154+ Network : "::/0" ,
155+ Database : "ipv4" ,
156+ Expected : []string {
157+ "101:101::/32" ,
158+ "101:102::/31" ,
159+ "101:104::/30" ,
160+ "101:108::/29" ,
161+ "101:110::/28" ,
162+ "101:120::/32" ,
163+ },
164+ },
165+ networkTest {
166+ Network : "101:104::/30" ,
167+ Database : "ipv4" ,
168+ Expected : []string {
169+ "101:104::/30" ,
170+ },
171+ },
172+ }
173+
174+ func TestNetworksWithin (t * testing.T ) {
175+ for _ , v := range tests {
176+ for _ , recordSize := range []uint {24 , 28 , 32 } {
177+ fileName := testFile (fmt .Sprintf ("MaxMind-DB-test-%s-%d.mmdb" , v .Database , recordSize ))
178+ reader , err := Open (fileName )
179+ require .Nil (t , err , "unexpected error while opening database: %v" , err )
180+ defer reader .Close ()
181+
182+ _ , network , err := net .ParseCIDR (v .Network )
183+ assert .Nil (t , err )
184+ n := reader .NetworksWithin (network )
185+ var innerIPs []string
186+
187+ for n .Next () {
188+ record := struct {
189+ IP string `maxminddb:"ip"`
190+ }{}
191+ network , err := n .Network (& record )
192+ assert .Nil (t , err )
193+ innerIPs = append (innerIPs , network .String ())
194+ }
195+
196+ assert .Equal (t , v .Expected , innerIPs )
197+ assert .Nil (t , n .Err ())
198+ }
199+ }
200+ }
201+
202+ var geoIPTests = []networkTest {
203+ networkTest {
204+ Network : "81.2.69.128/26" ,
205+ Database : "GeoIP2-Country-Test.mmdb" ,
206+ Expected : []string {
207+ "81.2.69.142/31" ,
208+ "81.2.69.144/28" ,
209+ "81.2.69.160/27" ,
210+ },
211+ },
212+ }
213+
214+ func TestGeoIPNetworksWithin (t * testing.T ) {
215+ for _ , v := range geoIPTests {
216+ fileName := testFile (v .Database )
217+ reader , err := Open (fileName )
218+ require .Nil (t , err , "unexpected error while opening database: %v" , err )
219+ defer reader .Close ()
220+
221+ _ , network , err := net .ParseCIDR (v .Network )
222+ assert .Nil (t , err )
223+ n := reader .NetworksWithin (network )
224+ var innerIPs []string
225+
226+ for n .Next () {
227+ record := struct {
228+ IP string `maxminddb:"ip"`
229+ }{}
230+ network , err := n .Network (& record )
231+ assert .Nil (t , err )
232+ innerIPs = append (innerIPs , network .String ())
233+ }
234+
235+ assert .Equal (t , v .Expected , innerIPs )
236+ assert .Nil (t , n .Err ())
237+ }
238+ }
0 commit comments