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 }