View Javadoc

1   package com.atlassian.ip;
2   
3   import org.junit.Test;
4   
5   import java.net.InetAddress;
6   import java.net.UnknownHostException;
7   
8   import static org.junit.Assert.assertFalse;
9   import static org.junit.Assert.assertTrue;
10  import static org.mockito.Mockito.doReturn;
11  import static org.mockito.Mockito.doThrow;
12  import static org.mockito.Mockito.spy;
13  
14  public class IPMatcherTest
15  {
16      @Test
17      public void testIPv4MatchingSuccess() throws Exception
18      {
19          final IPMatcher.Builder builder = IPMatcher.builder();
20          builder.addPattern("1.1.1.1");
21          final IPMatcher ipMatcher = builder.build();
22          
23          assertTrue(ipMatcher.matches("1.1.1.1"));
24      }
25  
26      @Test
27      public void testIPv4MatchingFailure() throws Exception
28      {
29          final IPMatcher.Builder builder = IPMatcher.builder();
30          builder.addPattern("1.1.1.1");
31          final IPMatcher ipMatcher = builder.build();
32  
33          assertFalse(ipMatcher.matches("1.1.1.0"));
34      }
35  
36      @Test
37      public void testIPv6MatchingSuccess() throws Exception
38      {
39          final IPMatcher.Builder builder = IPMatcher.builder();
40          builder.addPattern("::2");
41          final IPMatcher ipMatcher = builder.build();
42  
43          assertTrue(ipMatcher.matches("0:0:0:0:0:0:0:2"));
44      }
45  
46      @Test
47      public void testShortFormIPv6MatchingSuccess() throws Exception
48      {
49          final IPMatcher.Builder builder = IPMatcher.builder();
50          builder.addPattern("::2");
51          final IPMatcher ipMatcher = builder.build();
52  
53          assertTrue(ipMatcher.matches("::2"));
54      }
55  
56      @Test
57      public void testIPv6MatchingFailure() throws Exception
58      {
59          final IPMatcher.Builder builder = IPMatcher.builder();
60          builder.addPattern("::2");
61          final IPMatcher ipMatcher = builder.build();
62  
63          assertFalse(ipMatcher.matches("0:0:0:0:0:0:0:1"));
64      }
65  
66      @Test(expected = IllegalArgumentException.class)
67      public void testInvalidPattern() throws Exception
68      {
69          final IPMatcher.Builder builder = IPMatcher.builder();
70          builder.addPattern("192.1.2");
71      }
72  
73      @Test
74      public void testAsteriskMatchingSuccess() throws Exception
75      {
76          final IPMatcher.Builder builder = IPMatcher.builder();
77          builder.addPattern("172.16.*.*");
78          final IPMatcher ipMatcher = builder.build();
79  
80          assertTrue(ipMatcher.matches("172.16.1.1"));
81      }
82  
83      @Test
84      public void testAsteriskMatchingFailure() throws Exception
85      {
86          final IPMatcher.Builder builder = IPMatcher.builder();
87          builder.addPattern("172.16.*.*");
88          final IPMatcher ipMatcher = builder.build();
89  
90          assertFalse(ipMatcher.matches("172.15.255.255"));
91      }
92  
93      @Test
94      public void testIPv4CIDRMatchingSuccess() throws Exception
95      {
96          final IPMatcher.Builder builder = IPMatcher.builder();
97          builder.addPattern("192.1.2.3/8");
98          final IPMatcher ipMatcher = builder.build();
99  
100         assertTrue(ipMatcher.matches("192.1.1.1"));
101     }
102 
103     @Test
104     public void testIPv4CIDRMatchingFailure() throws Exception
105     {
106         final IPMatcher.Builder builder = IPMatcher.builder();
107         builder.addPattern("192.1.2.3/8");
108         final IPMatcher ipMatcher = builder.build();
109 
110         assertTrue(ipMatcher.matches("192.2.0.0"));
111     }
112 
113     @Test
114     public void testIPv6CIDRMatchingSuccess() throws Exception
115     {
116         final IPMatcher.Builder builder = IPMatcher.builder();
117         builder.addPattern("0:0:0:1::/64");
118         final IPMatcher ipMatcher = builder.build();
119 
120         assertTrue(ipMatcher.matches("0:0:0:1:ffff:ffff:ffff:ffff"));
121     }
122 
123     @Test
124     public void testIPv6CIDRMatchingFailure() throws Exception
125     {
126         final IPMatcher.Builder builder = IPMatcher.builder();
127         builder.addPattern("0:0:0:1::/64");
128         final IPMatcher ipMatcher = builder.build();
129 
130         assertFalse(ipMatcher.matches("0:0:0:2::"));
131     }
132     
133     @Test
134     public void testSubnetZeroAsteriskMatching() throws Exception
135     {
136         final IPMatcher.Builder builder = IPMatcher.builder();
137         builder.addPattern("*.*.*.*");
138         final IPMatcher ipMatcher = builder.build();
139 
140         assertTrue(ipMatcher.matches("255.255.255.255"));
141     }
142 
143     @Test
144     public void testIPv4IPv6MatchingFailure() throws Exception
145     {
146         final IPMatcher.Builder builder = IPMatcher.builder();
147         builder.addPattern("0.0.0.1");
148         final IPMatcher ipMatcher = builder.build();
149 
150         assertFalse(ipMatcher.matches("::1"));
151     }
152 
153     @Test
154     public void testSubnetZeroIPv4CIDRMatching() throws Exception
155     {
156         final IPMatcher.Builder builder = IPMatcher.builder();
157         builder.addPattern("192.1.2.3/0");
158         final IPMatcher ipMatcher = builder.build();
159         
160         assertTrue(ipMatcher.matches("0.0.0.0"));
161     }
162 
163     @Test
164     public void testSubnetZeroIPv6CIDRMatching() throws Exception
165     {
166         final IPMatcher.Builder builder = IPMatcher.builder();
167         builder.addPattern("::1/0");
168         final IPMatcher ipMatcher = builder.build();
169 
170         assertTrue(ipMatcher.matches("::2"));
171     }
172 
173     @Test
174     public void testAllOnesSubnetIPv4CIDRMatchingSuccess() throws Exception
175     {
176         final IPMatcher.Builder builder = IPMatcher.builder();
177         builder.addPattern("192.1.2.3/32");
178         final IPMatcher ipMatcher = builder.build();
179 
180         assertTrue(ipMatcher.matches("192.1.2.3"));
181     }
182 
183     @Test
184     public void testAllOnesSubnetIPv4CIDRMatchingFailure() throws Exception
185     {
186         final IPMatcher.Builder builder = IPMatcher.builder();
187         builder.addPattern("192.1.2.3/32");
188         final IPMatcher ipMatcher = builder.build();
189 
190         assertFalse(ipMatcher.matches("192.1.2.2"));
191     }
192 
193     @Test
194     public void testAllOnesSubnetIPv6CIDRMatchingSuccess() throws Exception
195     {
196         final IPMatcher.Builder builder = IPMatcher.builder();
197         builder.addPattern("::1/128");
198         final IPMatcher ipMatcher = builder.build();
199 
200         assertTrue(ipMatcher.matches("::1"));
201     }
202 
203     @Test
204     public void testAllOnesSubnetIPv6CIDRMatchingFailure() throws Exception
205     {
206         final IPMatcher.Builder builder = IPMatcher.builder();
207         builder.addPattern("::1/128");
208         final IPMatcher ipMatcher = builder.build();
209 
210         assertFalse(ipMatcher.matches("::2"));
211     }
212 
213     @Test
214     public void testPatternResolving() throws Exception
215     {
216         final IPMatcher.Builder builder = spy(IPMatcher.builder());
217         doReturn(new InetAddress[]{InetAddress.getByAddress(new byte[]{1, 1, 1, 1})}).when(builder).getAllByName("example.org");
218         builder.addPatternOrHost("example.org");
219         final IPMatcher ipMatcher = builder.build();
220 
221         assertTrue(ipMatcher.matches("1.1.1.1"));
222     }
223 
224     @Test
225     public void testPatternResolvingWithUnknownHost() throws Exception
226     {
227         final IPMatcher.Builder builder = spy(IPMatcher.builder());
228         doThrow(new UnknownHostException("example.org")).when(builder).getAllByName("example.org");
229         builder.addPatternOrHost("example.org");
230         final IPMatcher ipMatcher = builder.build();
231 
232         assertFalse(ipMatcher.matches("1.1.1.1"));
233     }
234 
235     @Test
236     public void testBuilder() throws Exception
237     {
238         final IPMatcher ipMatcher = IPMatcher.builder()
239             .addPatternOrHost("example.org")
240             .addPattern("192.168.1.0/24")
241             .build();
242         assertTrue(ipMatcher.matches("192.168.1.13"));
243     }
244 
245     @Test
246     public void testNonsensePattern() throws Exception
247     {
248         final IPMatcher.Builder builder = IPMatcher.builder();
249         builder.addPatternOrHost("nonsense");
250         final IPMatcher ipMatcher = builder.build();
251         assertFalse(ipMatcher.matches("127.0.0.1"));
252     }
253 
254     @Test
255     public void testIP6Brackets() throws Exception
256     {
257         final IPMatcher.Builder builder = IPMatcher.builder();
258         builder.addPatternOrHost("[::0]");
259         final IPMatcher ipMatcher = builder.build();
260         assertTrue(ipMatcher.matches("::0"));
261     }
262 
263     @Test
264     public void testAlmostIP() throws Exception
265     {
266         assertFalse(IPMatcher.isValidPatternOrHost("127.0.0.a"));
267         assertFalse(IPMatcher.isValidPatternOrHost("fe80::221:6aff:fe7e:61ek"));
268     }
269 
270     @Test
271     public void testInvalidIP6Brackets() throws Exception
272     {
273         assertFalse(IPMatcher.isValidPatternOrHost("[::0]/64"));
274     }
275 
276     @Test
277     public void testDisallowedIP4Brackets() throws Exception
278     {
279         assertFalse(IPMatcher.isValidPatternOrHost("[74.125.237.20]"));
280     }
281 
282     @Test
283     public void testDN() throws Exception
284     {
285         assertTrue(IPMatcher.isValidPatternOrHost("localhost"));
286     }
287 
288     @Test
289     public void testDisallowedDNBrackets() throws Exception
290     {
291         assertFalse(IPMatcher.isValidPatternOrHost("[w.example.com]"));
292     }
293 
294     @Test
295     public void testUnmatchedBrackets() throws Exception
296     {
297         assertFalse(IPMatcher.isValidPatternOrHost("[::0"));
298         assertFalse(IPMatcher.isValidPatternOrHost("::0]"));
299     }
300 
301     @Test
302     public void testMissingColon() throws Exception
303     {
304         assertFalse(IPMatcher.isValidPatternOrHost(":1"));
305         assertFalse(IPMatcher.isValidPatternOrHost("fe80:221:6aff:fe7e:61e8"));
306     }
307 
308     @Test
309     public void testTooLong() throws Exception
310     {
311         assertFalse(IPMatcher.isValidPatternOrHost("fe80::221:6aff:fe7e:61e8:6789:6789:6789:6789"));
312         assertFalse(IPMatcher.isValidPatternOrHost("127.0.0.0.1"));
313     }
314 
315     @Test
316     public void testEmpty() throws Exception
317     {
318         assertFalse(IPMatcher.isValidPatternOrHost(""));
319     }
320 
321     @Test
322     public void testNull() throws Exception
323     {
324         assertFalse(IPMatcher.isValidPatternOrHost(null));
325     }
326 
327     @Test
328     public void testInvalidSlash() throws Exception
329     {
330         assertFalse(IPMatcher.isValidPatternOrHost("/127.0.0.1"));
331     }
332 
333 }