View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.net;
19  
20  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
21  import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
22  import static org.junit.jupiter.api.Assertions.assertEquals;
23  import static org.junit.jupiter.api.Assertions.assertFalse;
24  import static org.junit.jupiter.api.Assertions.assertNotNull;
25  import static org.junit.jupiter.api.Assertions.assertThrows;
26  import static org.junit.jupiter.api.Assertions.assertTrue;
27  
28  import org.apache.commons.net.util.SubnetUtils;
29  import org.apache.commons.net.util.SubnetUtils.SubnetInfo;
30  import org.junit.jupiter.api.Test;
31  
32  @SuppressWarnings("deprecation") // deliberate use of deprecated methods
33  public class SubnetUtilsTest {
34  
35      @Test
36      public void testAddresses() {
37          final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
38          final SubnetInfo info = utils.getInfo();
39          assertTrue(info.isInRange("192.168.0.1"));
40          assertTrue(info.isInRange("192.168.0.2"));
41          assertTrue(info.isInRange("192.168.0.3"));
42          assertTrue(info.isInRange("192.168.0.4"));
43          assertTrue(info.isInRange("192.168.0.5"));
44          assertTrue(info.isInRange("192.168.0.6"));
45          // We don't count the broadcast address as usable
46          assertFalse(info.isInRange("192.168.0.7"));
47          assertFalse(info.isInRange("192.168.0.8"));
48          assertFalse(info.isInRange("10.10.2.1"));
49          assertFalse(info.isInRange("192.168.1.1"));
50          assertFalse(info.isInRange("192.168.0.255"));
51          //
52          assertEquals(-1062731775, info.asInteger("192.168.0.1"));
53          assertThrows(IllegalArgumentException.class, () -> info.asInteger("bad"));
54          //
55          assertArrayEquals(new String[] { "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6" }, info.getAllAddresses());
56      }
57  
58      @Test
59      public void testAddressIllegalArgument() {
60          assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("bad"));
61      }
62  
63      /**
64       * Test using the inclusiveHostCount flag, which includes the network and broadcast addresses in host counts
65       */
66      @Test
67      public void testCidrAddresses() {
68          SubnetUtils utils = new SubnetUtils("192.168.0.1/8");
69          utils.setInclusiveHostCount(true);
70          SubnetInfo info = utils.getInfo();
71          assertEquals("255.0.0.0", info.getNetmask());
72          assertEquals(16777216, info.getAddressCount());
73  
74          utils = new SubnetUtils("192.168.0.1/0");
75          utils.setInclusiveHostCount(true);
76          info = utils.getInfo();
77          assertEquals("0.0.0.0", info.getNetmask());
78          assertEquals(4294967296L, info.getAddressCountLong());
79  
80          utils = new SubnetUtils("192.168.0.1/1");
81          utils.setInclusiveHostCount(true);
82          info = utils.getInfo();
83          assertEquals("128.0.0.0", info.getNetmask());
84          assertEquals(2147483648L, info.getAddressCountLong());
85  
86          utils = new SubnetUtils("192.168.0.1/9");
87          utils.setInclusiveHostCount(true);
88          info = utils.getInfo();
89          assertEquals("255.128.0.0", info.getNetmask());
90          assertEquals(8388608, info.getAddressCount());
91  
92          utils = new SubnetUtils("192.168.0.1/10");
93          utils.setInclusiveHostCount(true);
94          info = utils.getInfo();
95          assertEquals("255.192.0.0", info.getNetmask());
96          assertEquals(4194304, info.getAddressCount());
97  
98          utils = new SubnetUtils("192.168.0.1/11");
99          utils.setInclusiveHostCount(true);
100         info = utils.getInfo();
101         assertEquals("255.224.0.0", info.getNetmask());
102         assertEquals(2097152, info.getAddressCount());
103 
104         utils = new SubnetUtils("192.168.0.1/12");
105         utils.setInclusiveHostCount(true);
106         info = utils.getInfo();
107         assertEquals("255.240.0.0", info.getNetmask());
108         assertEquals(1048576, info.getAddressCount());
109 
110         utils = new SubnetUtils("192.168.0.1/13");
111         utils.setInclusiveHostCount(true);
112         info = utils.getInfo();
113         assertEquals("255.248.0.0", info.getNetmask());
114         assertEquals(524288, info.getAddressCount());
115 
116         utils = new SubnetUtils("192.168.0.1/14");
117         utils.setInclusiveHostCount(true);
118         info = utils.getInfo();
119         assertEquals("255.252.0.0", info.getNetmask());
120         assertEquals(262144, info.getAddressCount());
121 
122         utils = new SubnetUtils("192.168.0.1/15");
123         utils.setInclusiveHostCount(true);
124         info = utils.getInfo();
125         assertEquals("255.254.0.0", info.getNetmask());
126         assertEquals(131072, info.getAddressCount());
127 
128         utils = new SubnetUtils("192.168.0.1/16");
129         utils.setInclusiveHostCount(true);
130         info = utils.getInfo();
131         assertEquals("255.255.0.0", info.getNetmask());
132         assertEquals(65536, info.getAddressCount());
133 
134         utils = new SubnetUtils("192.168.0.1/17");
135         utils.setInclusiveHostCount(true);
136         info = utils.getInfo();
137         assertEquals("255.255.128.0", info.getNetmask());
138         assertEquals(32768, info.getAddressCount());
139 
140         utils = new SubnetUtils("192.168.0.1/18");
141         utils.setInclusiveHostCount(true);
142         info = utils.getInfo();
143         assertEquals("255.255.192.0", info.getNetmask());
144         assertEquals(16384, info.getAddressCount());
145 
146         utils = new SubnetUtils("192.168.0.1/19");
147         utils.setInclusiveHostCount(true);
148         info = utils.getInfo();
149         assertEquals("255.255.224.0", info.getNetmask());
150         assertEquals(8192, info.getAddressCount());
151 
152         utils = new SubnetUtils("192.168.0.1/20");
153         utils.setInclusiveHostCount(true);
154         info = utils.getInfo();
155         assertEquals("255.255.240.0", info.getNetmask());
156         assertEquals(4096, info.getAddressCount());
157 
158         utils = new SubnetUtils("192.168.0.1/21");
159         utils.setInclusiveHostCount(true);
160         info = utils.getInfo();
161         assertEquals("255.255.248.0", info.getNetmask());
162         assertEquals(2048, info.getAddressCount());
163 
164         utils = new SubnetUtils("192.168.0.1/22");
165         utils.setInclusiveHostCount(true);
166         info = utils.getInfo();
167         assertEquals("255.255.252.0", info.getNetmask());
168         assertEquals(1024, info.getAddressCount());
169 
170         utils = new SubnetUtils("192.168.0.1/23");
171         utils.setInclusiveHostCount(true);
172         info = utils.getInfo();
173         assertEquals("255.255.254.0", info.getNetmask());
174         assertEquals(512, info.getAddressCount());
175 
176         utils = new SubnetUtils("192.168.0.1/24");
177         utils.setInclusiveHostCount(true);
178         info = utils.getInfo();
179         assertEquals("255.255.255.0", info.getNetmask());
180         assertEquals(256, info.getAddressCount());
181 
182         utils = new SubnetUtils("192.168.0.1/25");
183         utils.setInclusiveHostCount(true);
184         info = utils.getInfo();
185         assertEquals("255.255.255.128", info.getNetmask());
186         assertEquals(128, info.getAddressCount());
187 
188         utils = new SubnetUtils("192.168.0.1/26");
189         utils.setInclusiveHostCount(true);
190         info = utils.getInfo();
191         assertEquals("255.255.255.192", info.getNetmask());
192         assertEquals(64, info.getAddressCount());
193 
194         utils = new SubnetUtils("192.168.0.1/27");
195         utils.setInclusiveHostCount(true);
196         info = utils.getInfo();
197         assertEquals("255.255.255.224", info.getNetmask());
198         assertEquals(32, info.getAddressCount());
199 
200         utils = new SubnetUtils("192.168.0.1/28");
201         utils.setInclusiveHostCount(true);
202         info = utils.getInfo();
203         assertEquals("255.255.255.240", info.getNetmask());
204         assertEquals(16, info.getAddressCount());
205 
206         utils = new SubnetUtils("192.168.0.1/29");
207         utils.setInclusiveHostCount(true);
208         info = utils.getInfo();
209         assertEquals("255.255.255.248", info.getNetmask());
210         assertEquals(8, info.getAddressCount());
211 
212         utils = new SubnetUtils("192.168.0.1/30");
213         utils.setInclusiveHostCount(true);
214         info = utils.getInfo();
215         assertEquals("255.255.255.252", info.getNetmask());
216         assertEquals(4, info.getAddressCount());
217 
218         utils = new SubnetUtils("192.168.0.1/31");
219         utils.setInclusiveHostCount(true);
220         info = utils.getInfo();
221         assertEquals("255.255.255.254", info.getNetmask());
222         assertEquals(2, info.getAddressCount());
223 
224         utils = new SubnetUtils("192.168.0.1/32");
225         utils.setInclusiveHostCount(true);
226         info = utils.getInfo();
227         assertEquals("255.255.255.255", info.getNetmask());
228         assertEquals(1, info.getAddressCount());
229 
230     }
231 
232     @Test
233     public void testInvalidMasks() {
234         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("192.168.0.1/"));
235         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("192.168.0.1/33"));
236         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("192.168.0.1/111"));
237         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("192.168.0.1/032"));
238     }
239 
240     @Test
241     public void testNET428_31() {
242         final SubnetUtils subnetUtils = new SubnetUtils("1.2.3.4/31");
243         assertEquals(0, subnetUtils.getInfo().getAddressCount());
244         final String[] address = subnetUtils.getInfo().getAllAddresses();
245         assertNotNull(address);
246         assertEquals(0, address.length);
247     }
248 
249     @Test
250     public void testNET428_32() {
251         final SubnetUtils subnetUtils = new SubnetUtils("1.2.3.4/32");
252         assertEquals(0, subnetUtils.getInfo().getAddressCount());
253         final String[] address = subnetUtils.getInfo().getAllAddresses();
254         assertNotNull(address);
255         assertEquals(0, address.length);
256     }
257 
258     @Test
259     public void testNET520() {
260         final SubnetUtils utils = new SubnetUtils("0.0.0.0/0");
261         utils.setInclusiveHostCount(true);
262         final SubnetInfo info = utils.getInfo();
263         assertEquals("0.0.0.0", info.getNetworkAddress());
264         assertEquals("255.255.255.255", info.getBroadcastAddress());
265         assertTrue(info.isInRange("127.0.0.0"));
266         utils.setInclusiveHostCount(false);
267         assertTrue(info.isInRange("127.0.0.0"));
268     }
269 
270     @Test
271     public void testNET521() {
272         SubnetUtils utils;
273         SubnetInfo info;
274 
275         utils = new SubnetUtils("0.0.0.0/0");
276         utils.setInclusiveHostCount(true);
277         info = utils.getInfo();
278         assertEquals("0.0.0.0", info.getNetmask());
279         assertEquals(4294967296L, info.getAddressCountLong());
280         assertThrows(RuntimeException.class, info::getAddressCount);
281         utils = new SubnetUtils("128.0.0.0/1");
282         utils.setInclusiveHostCount(true);
283         info = utils.getInfo();
284         assertEquals("128.0.0.0", info.getNetmask());
285         assertEquals(2147483648L, info.getAddressCountLong());
286         assertThrows(RuntimeException.class, info::getAddressCount);
287         // if we exclude the broadcast and network addresses, the count is less than Integer.MAX_VALUE
288         utils.setInclusiveHostCount(false);
289         info = utils.getInfo();
290         assertEquals(2147483646, info.getAddressCount());
291     }
292 
293     @Test
294     public void testNET624() {
295         assertDoesNotThrow(() -> new SubnetUtils("0.0.0.0/0"));
296         assertDoesNotThrow(() -> new SubnetUtils("0.0.0.0", "0.0.0.0"));
297         assertDoesNotThrow(() -> new SubnetUtils("0.0.0.0", "128.0.0.0"));
298         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("0.0.0.0", "64.0.0.0"));
299         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("0.0.0.0", "0.0.0.1"));
300     }
301 
302     @Test
303     public void testNET641() {
304         assertFalse(new SubnetUtils("192.168.1.0/00").getInfo().isInRange("0.0.0.0"));
305         assertFalse(new SubnetUtils("192.168.1.0/30").getInfo().isInRange("0.0.0.0"));
306         assertFalse(new SubnetUtils("192.168.1.0/31").getInfo().isInRange("0.0.0.0"));
307         assertFalse(new SubnetUtils("192.168.1.0/32").getInfo().isInRange("0.0.0.0"));
308     }
309 
310     @Test
311     public void testNET675() {
312         final SubnetUtils utils = new SubnetUtils("192.168.0.15/32");
313         utils.setInclusiveHostCount(true);
314         final SubnetInfo info = utils.getInfo();
315         assertTrue(info.isInRange("192.168.0.15"));
316     }
317 
318     @Test
319     public void testNET679() {
320         final SubnetUtils utils = new SubnetUtils("10.213.160.0/16");
321         utils.setInclusiveHostCount(true);
322         final SubnetInfo info = utils.getInfo();
323         assertTrue(info.isInRange("10.213.0.0"));
324         assertTrue(info.isInRange("10.213.255.255"));
325     }
326 
327     @Test
328     public void testNext() {
329         final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
330         assertEquals("192.168.0.2", utils.getNext().getInfo().getAddress());
331     }
332 
333     @Test
334     public void testParseSimpleNetmask() {
335         final String address = "192.168.0.1";
336         final String[] masks = { "255.0.0.0", "255.255.0.0", "255.255.255.0", "255.255.255.248" };
337         final String[] bcastAddresses = { "192.255.255.255", "192.168.255.255", "192.168.0.255", "192.168.0.7" };
338         final String[] lowAddresses = { "192.0.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1" };
339         final String[] highAddresses = { "192.255.255.254", "192.168.255.254", "192.168.0.254", "192.168.0.6" };
340         final String[] nextAddresses = { "192.168.0.2", "192.168.0.2", "192.168.0.2", "192.168.0.2" };
341         final String[] previousAddresses = { "192.168.0.0", "192.168.0.0", "192.168.0.0", "192.168.0.0" };
342         final String[] networkAddresses = { "192.0.0.0", "192.168.0.0", "192.168.0.0", "192.168.0.0" };
343         final String[] cidrSignatures = { "192.168.0.1/8", "192.168.0.1/16", "192.168.0.1/24", "192.168.0.1/29" };
344         final int[] usableAddresses = { 16777214, 65534, 254, 6 };
345 
346         for (int i = 0; i < masks.length; ++i) {
347             final SubnetUtils utils = new SubnetUtils(address, masks[i]);
348             final SubnetInfo info = utils.getInfo();
349             assertEquals(address, info.getAddress());
350             assertEquals(bcastAddresses[i], info.getBroadcastAddress());
351             assertEquals(cidrSignatures[i], info.getCidrSignature());
352             assertEquals(lowAddresses[i], info.getLowAddress());
353             assertEquals(highAddresses[i], info.getHighAddress());
354             assertEquals(nextAddresses[i], info.getNextAddress());
355             assertEquals(previousAddresses[i], info.getPreviousAddress());
356             assertEquals(networkAddresses[i], info.getNetworkAddress());
357             assertEquals(usableAddresses[i], info.getAddressCount());
358         }
359     }
360 
361     @Test
362     public void testParseSimpleNetmaskExclusive() {
363         final String address = "192.168.15.7";
364         final String[] masks = { "255.255.255.252", "255.255.255.254", "255.255.255.255" };
365         final String[] bcast = { "192.168.15.7", "192.168.15.7", "192.168.15.7" };
366         final String[] netwk = { "192.168.15.4", "192.168.15.6", "192.168.15.7" };
367         final String[] lowAd = { "192.168.15.5", "0.0.0.0", "0.0.0.0" };
368         final String[] highA = { "192.168.15.6", "0.0.0.0", "0.0.0.0" };
369         final String[] cidrS = { "192.168.15.7/30", "192.168.15.7/31", "192.168.15.7/32" };
370         final int[] usableAd = { 2, 0, 0 };
371         // low and high addresses don't exist
372 
373         for (int i = 0; i < masks.length; ++i) {
374             final SubnetUtils utils = new SubnetUtils(address, masks[i]);
375             utils.setInclusiveHostCount(false);
376             final SubnetInfo info = utils.getInfo();
377             assertEquals(cidrS[i], info.getCidrSignature(), "ci " + masks[i]);
378             assertEquals(bcast[i], info.getBroadcastAddress(), "bc " + masks[i]);
379             assertEquals(netwk[i], info.getNetworkAddress(), "nw " + masks[i]);
380             assertEquals(usableAd[i], info.getAddressCount(), "ac " + masks[i]);
381             assertEquals(lowAd[i], info.getLowAddress(), "lo " + masks[i]);
382             assertEquals(highA[i], info.getHighAddress(), "hi " + masks[i]);
383         }
384     }
385 
386     @Test
387     public void testParseSimpleNetmaskInclusive() {
388         final String address = "192.168.15.7";
389         final String[] masks = { "255.255.255.252", "255.255.255.254", "255.255.255.255" };
390         final String[] bcast = { "192.168.15.7", "192.168.15.7", "192.168.15.7" };
391         final String[] netwk = { "192.168.15.4", "192.168.15.6", "192.168.15.7" };
392         final String[] lowAd = { "192.168.15.4", "192.168.15.6", "192.168.15.7" };
393         final String[] highA = { "192.168.15.7", "192.168.15.7", "192.168.15.7" };
394         final String[] cidrS = { "192.168.15.7/30", "192.168.15.7/31", "192.168.15.7/32" };
395         final int[] usableAd = { 4, 2, 1 };
396 
397         for (int i = 0; i < masks.length; ++i) {
398             final SubnetUtils utils = new SubnetUtils(address, masks[i]);
399             utils.setInclusiveHostCount(true);
400             final SubnetInfo info = utils.getInfo();
401             assertEquals(cidrS[i], info.getCidrSignature(), "ci " + masks[i]);
402             assertEquals(bcast[i], info.getBroadcastAddress(), "bc " + masks[i]);
403             assertEquals(usableAd[i], info.getAddressCount(), "ac " + masks[i]);
404             assertEquals(netwk[i], info.getNetworkAddress(), "nw " + masks[i]);
405             assertEquals(lowAd[i], info.getLowAddress(), "lo " + masks[i]);
406             assertEquals(highA[i], info.getHighAddress(), "hi " + masks[i]);
407         }
408     }
409 
410     @Test
411     public void testPrevious() {
412         final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
413         assertEquals("192.168.0.0", utils.getPrevious().getInfo().getAddress());
414     }
415 
416     @Test
417     public void testToString() {
418         final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
419         assertDoesNotThrow(() -> utils.toString());
420         final SubnetInfo info = utils.getInfo();
421         assertDoesNotThrow(() -> info.toString());
422     }
423 
424     @Test
425     public void testZeroAddressAndCidr() {
426         final SubnetUtils snu = new SubnetUtils("0.0.0.0/0");
427         assertNotNull(snu);
428     }
429 }