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/33"));
235     }
236 
237     @Test
238     public void testNET428_31() {
239         final SubnetUtils subnetUtils = new SubnetUtils("1.2.3.4/31");
240         assertEquals(0, subnetUtils.getInfo().getAddressCount());
241         final String[] address = subnetUtils.getInfo().getAllAddresses();
242         assertNotNull(address);
243         assertEquals(0, address.length);
244     }
245 
246     @Test
247     public void testNET428_32() {
248         final SubnetUtils subnetUtils = new SubnetUtils("1.2.3.4/32");
249         assertEquals(0, subnetUtils.getInfo().getAddressCount());
250         final String[] address = subnetUtils.getInfo().getAllAddresses();
251         assertNotNull(address);
252         assertEquals(0, address.length);
253     }
254 
255     @Test
256     public void testNET520() {
257         final SubnetUtils utils = new SubnetUtils("0.0.0.0/0");
258         utils.setInclusiveHostCount(true);
259         final SubnetInfo info = utils.getInfo();
260         assertEquals("0.0.0.0", info.getNetworkAddress());
261         assertEquals("255.255.255.255", info.getBroadcastAddress());
262         assertTrue(info.isInRange("127.0.0.0"));
263         utils.setInclusiveHostCount(false);
264         assertTrue(info.isInRange("127.0.0.0"));
265     }
266 
267     @Test
268     public void testNET521() {
269         SubnetUtils utils;
270         SubnetInfo info;
271 
272         utils = new SubnetUtils("0.0.0.0/0");
273         utils.setInclusiveHostCount(true);
274         info = utils.getInfo();
275         assertEquals("0.0.0.0", info.getNetmask());
276         assertEquals(4294967296L, info.getAddressCountLong());
277         assertThrows(RuntimeException.class, info::getAddressCount);
278         utils = new SubnetUtils("128.0.0.0/1");
279         utils.setInclusiveHostCount(true);
280         info = utils.getInfo();
281         assertEquals("128.0.0.0", info.getNetmask());
282         assertEquals(2147483648L, info.getAddressCountLong());
283         assertThrows(RuntimeException.class, info::getAddressCount);
284         // if we exclude the broadcast and network addresses, the count is less than Integer.MAX_VALUE
285         utils.setInclusiveHostCount(false);
286         info = utils.getInfo();
287         assertEquals(2147483646, info.getAddressCount());
288     }
289 
290     @Test
291     public void testNET624() {
292         assertDoesNotThrow(() -> new SubnetUtils("0.0.0.0/0"));
293         assertDoesNotThrow(() -> new SubnetUtils("0.0.0.0", "0.0.0.0"));
294         assertDoesNotThrow(() -> new SubnetUtils("0.0.0.0", "128.0.0.0"));
295         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("0.0.0.0", "64.0.0.0"));
296         assertThrows(IllegalArgumentException.class, () -> new SubnetUtils("0.0.0.0", "0.0.0.1"));
297     }
298 
299     @Test
300     public void testNET641() {
301         assertFalse(new SubnetUtils("192.168.1.0/00").getInfo().isInRange("0.0.0.0"));
302         assertFalse(new SubnetUtils("192.168.1.0/30").getInfo().isInRange("0.0.0.0"));
303         assertFalse(new SubnetUtils("192.168.1.0/31").getInfo().isInRange("0.0.0.0"));
304         assertFalse(new SubnetUtils("192.168.1.0/32").getInfo().isInRange("0.0.0.0"));
305     }
306 
307     @Test
308     public void testNET675() {
309         final SubnetUtils utils = new SubnetUtils("192.168.0.15/32");
310         utils.setInclusiveHostCount(true);
311         final SubnetInfo info = utils.getInfo();
312         assertTrue(info.isInRange("192.168.0.15"));
313     }
314 
315     @Test
316     public void testNET679() {
317         final SubnetUtils utils = new SubnetUtils("10.213.160.0/16");
318         utils.setInclusiveHostCount(true);
319         final SubnetInfo info = utils.getInfo();
320         assertTrue(info.isInRange("10.213.0.0"));
321         assertTrue(info.isInRange("10.213.255.255"));
322     }
323 
324     @Test
325     public void testNext() {
326         final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
327         assertEquals("192.168.0.2", utils.getNext().getInfo().getAddress());
328     }
329 
330     @Test
331     public void testParseSimpleNetmask() {
332         final String address = "192.168.0.1";
333         final String[] masks = { "255.0.0.0", "255.255.0.0", "255.255.255.0", "255.255.255.248" };
334         final String[] bcastAddresses = { "192.255.255.255", "192.168.255.255", "192.168.0.255", "192.168.0.7" };
335         final String[] lowAddresses = { "192.0.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1" };
336         final String[] highAddresses = { "192.255.255.254", "192.168.255.254", "192.168.0.254", "192.168.0.6" };
337         final String[] nextAddresses = { "192.168.0.2", "192.168.0.2", "192.168.0.2", "192.168.0.2" };
338         final String[] previousAddresses = { "192.168.0.0", "192.168.0.0", "192.168.0.0", "192.168.0.0" };
339         final String[] networkAddresses = { "192.0.0.0", "192.168.0.0", "192.168.0.0", "192.168.0.0" };
340         final String[] cidrSignatures = { "192.168.0.1/8", "192.168.0.1/16", "192.168.0.1/24", "192.168.0.1/29" };
341         final int[] usableAddresses = { 16777214, 65534, 254, 6 };
342 
343         for (int i = 0; i < masks.length; ++i) {
344             final SubnetUtils utils = new SubnetUtils(address, masks[i]);
345             final SubnetInfo info = utils.getInfo();
346             assertEquals(address, info.getAddress());
347             assertEquals(bcastAddresses[i], info.getBroadcastAddress());
348             assertEquals(cidrSignatures[i], info.getCidrSignature());
349             assertEquals(lowAddresses[i], info.getLowAddress());
350             assertEquals(highAddresses[i], info.getHighAddress());
351             assertEquals(nextAddresses[i], info.getNextAddress());
352             assertEquals(previousAddresses[i], info.getPreviousAddress());
353             assertEquals(networkAddresses[i], info.getNetworkAddress());
354             assertEquals(usableAddresses[i], info.getAddressCount());
355         }
356     }
357 
358     @Test
359     public void testParseSimpleNetmaskExclusive() {
360         final String address = "192.168.15.7";
361         final String[] masks = { "255.255.255.252", "255.255.255.254", "255.255.255.255" };
362         final String[] bcast = { "192.168.15.7", "192.168.15.7", "192.168.15.7" };
363         final String[] netwk = { "192.168.15.4", "192.168.15.6", "192.168.15.7" };
364         final String[] lowAd = { "192.168.15.5", "0.0.0.0", "0.0.0.0" };
365         final String[] highA = { "192.168.15.6", "0.0.0.0", "0.0.0.0" };
366         final String[] cidrS = { "192.168.15.7/30", "192.168.15.7/31", "192.168.15.7/32" };
367         final int[] usableAd = { 2, 0, 0 };
368         // low and high addresses don't exist
369 
370         for (int i = 0; i < masks.length; ++i) {
371             final SubnetUtils utils = new SubnetUtils(address, masks[i]);
372             utils.setInclusiveHostCount(false);
373             final SubnetInfo info = utils.getInfo();
374             assertEquals(cidrS[i], info.getCidrSignature(), "ci " + masks[i]);
375             assertEquals(bcast[i], info.getBroadcastAddress(), "bc " + masks[i]);
376             assertEquals(netwk[i], info.getNetworkAddress(), "nw " + masks[i]);
377             assertEquals(usableAd[i], info.getAddressCount(), "ac " + masks[i]);
378             assertEquals(lowAd[i], info.getLowAddress(), "lo " + masks[i]);
379             assertEquals(highA[i], info.getHighAddress(), "hi " + masks[i]);
380         }
381     }
382 
383     @Test
384     public void testParseSimpleNetmaskInclusive() {
385         final String address = "192.168.15.7";
386         final String[] masks = { "255.255.255.252", "255.255.255.254", "255.255.255.255" };
387         final String[] bcast = { "192.168.15.7", "192.168.15.7", "192.168.15.7" };
388         final String[] netwk = { "192.168.15.4", "192.168.15.6", "192.168.15.7" };
389         final String[] lowAd = { "192.168.15.4", "192.168.15.6", "192.168.15.7" };
390         final String[] highA = { "192.168.15.7", "192.168.15.7", "192.168.15.7" };
391         final String[] cidrS = { "192.168.15.7/30", "192.168.15.7/31", "192.168.15.7/32" };
392         final int[] usableAd = { 4, 2, 1 };
393 
394         for (int i = 0; i < masks.length; ++i) {
395             final SubnetUtils utils = new SubnetUtils(address, masks[i]);
396             utils.setInclusiveHostCount(true);
397             final SubnetInfo info = utils.getInfo();
398             assertEquals(cidrS[i], info.getCidrSignature(), "ci " + masks[i]);
399             assertEquals(bcast[i], info.getBroadcastAddress(), "bc " + masks[i]);
400             assertEquals(usableAd[i], info.getAddressCount(), "ac " + masks[i]);
401             assertEquals(netwk[i], info.getNetworkAddress(), "nw " + masks[i]);
402             assertEquals(lowAd[i], info.getLowAddress(), "lo " + masks[i]);
403             assertEquals(highA[i], info.getHighAddress(), "hi " + masks[i]);
404         }
405     }
406 
407     @Test
408     public void testPrevious() {
409         final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
410         assertEquals("192.168.0.0", utils.getPrevious().getInfo().getAddress());
411     }
412 
413     @Test
414     public void testToString() {
415         final SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
416         assertDoesNotThrow(() -> utils.toString());
417         final SubnetInfo info = utils.getInfo();
418         assertDoesNotThrow(() -> info.toString());
419     }
420 
421     @Test
422     public void testZeroAddressAndCidr() {
423         final SubnetUtils snu = new SubnetUtils("0.0.0.0/0");
424         assertNotNull(snu);
425     }
426 }