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 org.apache.commons.net.util.SubnetUtils;
21  import org.apache.commons.net.util.SubnetUtils.SubnetInfo;
22  
23  import junit.framework.TestCase;
24  
25  public class SubnetUtilsTest extends TestCase {
26  
27      public void testParseSimpleNetmask() {
28          final String address = "192.168.0.1";
29          final String masks[] = new String[] { "255.0.0.0", "255.255.0.0", "255.255.255.0", "255.255.255.248"};
30          final String bcastAddresses[] = new String[] { "192.255.255.255", "192.168.255.255", "192.168.0.255", "192.168.0.7"};
31          final String lowAddresses[] = new String[] { "192.0.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1" };
32          final String highAddresses[] = new String[] { "192.255.255.254", "192.168.255.254", "192.168.0.254", "192.168.0.6" };
33          final String networkAddresses[] = new String[] { "192.0.0.0", "192.168.0.0", "192.168.0.0", "192.168.0.0" };
34          final String cidrSignatures[] = new String[] { "192.168.0.1/8", "192.168.0.1/16", "192.168.0.1/24", "192.168.0.1/29" };
35          final int usableAddresses[] = new int[] { 16777214, 65534, 254, 6 };
36  
37          for (int i = 0; i < masks.length; ++i) {
38              SubnetUtils utils = new SubnetUtils(address, masks[i]);
39              SubnetInfo info = utils.getInfo();
40              assertEquals(bcastAddresses[i], info.getBroadcastAddress());
41              assertEquals(cidrSignatures[i], info.getCidrSignature());
42              assertEquals(lowAddresses[i], info.getLowAddress());
43              assertEquals(highAddresses[i], info.getHighAddress());
44              assertEquals(networkAddresses[i], info.getNetworkAddress());
45              assertEquals(usableAddresses[i], info.getAddressCount());
46          }
47      }
48  
49      public void testParseSimpleNetmaskInclusive() {
50           String address = "192.168.15.7";
51           String masks[]=new String[]{ "255.255.255.252",  "255.255.255.254",  "255.255.255.255"};
52           String bcast[]=new String[]{ "192.168.15.7",     "192.168.15.7",     "192.168.15.7"};
53           String netwk[]=new String[]{ "192.168.15.4",     "192.168.15.6",     "192.168.15.7" };
54           String lowAd[]=new String[]{ "192.168.15.4",     "192.168.15.6",     "192.168.15.7" };
55           String highA[]=new String[]{ "192.168.15.7",     "192.168.15.7",     "192.168.15.7" };
56           String cidrS[]=new String[]{ "192.168.15.7/30",  "192.168.15.7/31",  "192.168.15.7/32"};
57           int usableAd[]=new int[]   { 4 ,                 2,                  1};
58  
59           for (int i = 0; i < masks.length; ++i) {
60               SubnetUtils utils = new SubnetUtils(address, masks[i]);
61               utils.setInclusiveHostCount(true);
62               SubnetInfo info = utils.getInfo();
63               assertEquals("ci "+masks[i], cidrS[i], info.getCidrSignature());
64               assertEquals("bc "+masks[i], bcast[i], info.getBroadcastAddress());
65               assertEquals("ac "+masks[i], usableAd[i], info.getAddressCount());
66               assertEquals("nw "+masks[i], netwk[i], info.getNetworkAddress());
67               assertEquals("lo "+masks[i], lowAd[i], info.getLowAddress());
68               assertEquals("hi "+masks[i], highA[i], info.getHighAddress());
69           }
70       }
71  
72      public void testParseSimpleNetmaskExclusive() {
73          String address = "192.168.15.7";
74          String masks[]=new String[]{ "255.255.255.252",  "255.255.255.254",  "255.255.255.255"};
75          String bcast[]=new String[]{ "192.168.15.7",     "192.168.15.7",     "192.168.15.7"};
76          String netwk[]=new String[]{ "192.168.15.4",     "192.168.15.6",     "192.168.15.7" };
77          String lowAd[]=new String[]{ "192.168.15.5",     "0.0.0.0",          "0.0.0.0"    };
78          String highA[]=new String[]{ "192.168.15.6",     "0.0.0.0",          "0.0.0.0"    };
79          String cidrS[]=new String[]{ "192.168.15.7/30",  "192.168.15.7/31",  "192.168.15.7/32"};
80          int usableAd[]=new int[]   { 2 ,                 0,                  0};
81         // low and high addresses don't exist
82  
83          for (int i = 0; i < masks.length; ++i) {
84              SubnetUtils utils = new SubnetUtils(address, masks[i]);
85              utils.setInclusiveHostCount(false);
86              SubnetInfo info = utils.getInfo();
87              assertEquals("ci "+masks[i], cidrS[i], info.getCidrSignature());
88              assertEquals("bc "+masks[i], bcast[i], info.getBroadcastAddress());
89              assertEquals("nw "+masks[i], netwk[i], info.getNetworkAddress());
90              assertEquals("ac "+masks[i], usableAd[i], info.getAddressCount());
91              assertEquals("lo "+masks[i], lowAd[i], info.getLowAddress());
92              assertEquals("hi "+masks[i], highA[i], info.getHighAddress());
93          }
94      }
95  
96      // TODO Lower address test
97      public void testAddresses() {
98          SubnetUtils utils = new SubnetUtils("192.168.0.1/29");
99          SubnetInfo info = utils.getInfo();
100         assertTrue(info.isInRange("192.168.0.1"));
101         // We don't count the broadcast address as usable
102         assertFalse(info.isInRange("192.168.0.7"));
103         assertFalse(info.isInRange("192.168.0.8"));
104         assertFalse(info.isInRange("10.10.2.1"));
105         assertFalse(info.isInRange("192.168.1.1"));
106         assertFalse(info.isInRange("192.168.0.255"));
107     }
108 
109     public void testZeroNetmaskBits() {
110         try {
111             new SubnetUtils("192.168.0.1/0");
112             fail("Mask /0 should have generated an IllegalArgumentException");
113         }
114         catch (IllegalArgumentException expected) {
115         }
116     }
117 
118     /**
119      * Test using the inclusiveHostCount flag, which includes
120      * the network and broadcast addresses in host counts
121      */
122     public void testCidrAddresses() {
123         SubnetUtils utils = new SubnetUtils("192.168.0.1/8");
124         utils.setInclusiveHostCount(true);
125         SubnetInfo info = utils.getInfo();
126         assertEquals("255.0.0.0",info.getNetmask());
127         assertEquals(16777216, info.getAddressCount());
128 
129         utils = new SubnetUtils("192.168.0.1/9");
130         utils.setInclusiveHostCount(true);
131         info = utils.getInfo();
132         assertEquals("255.128.0.0",info.getNetmask());
133         assertEquals(8388608, info.getAddressCount());
134 
135         utils = new SubnetUtils("192.168.0.1/10");
136         utils.setInclusiveHostCount(true);
137         info = utils.getInfo();
138         assertEquals("255.192.0.0",info.getNetmask());
139         assertEquals(4194304, info.getAddressCount());
140 
141         utils = new SubnetUtils("192.168.0.1/11");
142         utils.setInclusiveHostCount(true);
143         info = utils.getInfo();
144         assertEquals("255.224.0.0",info.getNetmask());
145         assertEquals(2097152, info.getAddressCount());
146 
147         utils = new SubnetUtils("192.168.0.1/12");
148         utils.setInclusiveHostCount(true);
149         info = utils.getInfo();
150         assertEquals("255.240.0.0",info.getNetmask());
151         assertEquals(1048576, info.getAddressCount());
152 
153         utils = new SubnetUtils("192.168.0.1/13");
154         utils.setInclusiveHostCount(true);
155         info = utils.getInfo();
156         assertEquals("255.248.0.0",info.getNetmask());
157         assertEquals(524288, info.getAddressCount());
158 
159         utils = new SubnetUtils("192.168.0.1/14");
160         utils.setInclusiveHostCount(true);
161         info = utils.getInfo();
162         assertEquals("255.252.0.0",info.getNetmask());
163         assertEquals(262144, info.getAddressCount());
164 
165         utils = new SubnetUtils("192.168.0.1/15");
166         utils.setInclusiveHostCount(true);
167         info = utils.getInfo();
168         assertEquals("255.254.0.0",info.getNetmask());
169         assertEquals(131072, info.getAddressCount());
170 
171         utils = new SubnetUtils("192.168.0.1/16");
172         utils.setInclusiveHostCount(true);
173         info = utils.getInfo();
174         assertEquals("255.255.0.0",info.getNetmask());
175         assertEquals(65536, info.getAddressCount());
176 
177         utils = new SubnetUtils("192.168.0.1/17");
178         utils.setInclusiveHostCount(true);
179         info = utils.getInfo();
180         assertEquals("255.255.128.0",info.getNetmask());
181         assertEquals(32768, info.getAddressCount());
182 
183         utils = new SubnetUtils("192.168.0.1/18");
184         utils.setInclusiveHostCount(true);
185         info = utils.getInfo();
186         assertEquals("255.255.192.0",info.getNetmask());
187         assertEquals(16384, info.getAddressCount());
188 
189         utils = new SubnetUtils("192.168.0.1/19");
190         utils.setInclusiveHostCount(true);
191         info = utils.getInfo();
192         assertEquals("255.255.224.0",info.getNetmask());
193         assertEquals(8192, info.getAddressCount());
194 
195         utils = new SubnetUtils("192.168.0.1/20");
196         utils.setInclusiveHostCount(true);
197         info = utils.getInfo();
198         assertEquals("255.255.240.0",info.getNetmask());
199         assertEquals(4096, info.getAddressCount());
200 
201         utils = new SubnetUtils("192.168.0.1/21");
202         utils.setInclusiveHostCount(true);
203         info = utils.getInfo();
204         assertEquals("255.255.248.0",info.getNetmask());
205         assertEquals(2048, info.getAddressCount());
206 
207         utils = new SubnetUtils("192.168.0.1/22");
208         utils.setInclusiveHostCount(true);
209         info = utils.getInfo();
210         assertEquals("255.255.252.0",info.getNetmask());
211         assertEquals(1024, info.getAddressCount());
212 
213         utils = new SubnetUtils("192.168.0.1/23");
214         utils.setInclusiveHostCount(true);
215         info = utils.getInfo();
216         assertEquals("255.255.254.0",info.getNetmask());
217         assertEquals(512, info.getAddressCount());
218 
219         utils = new SubnetUtils("192.168.0.1/24");
220         utils.setInclusiveHostCount(true);
221         info = utils.getInfo();
222         assertEquals("255.255.255.0",info.getNetmask());
223         assertEquals(256, info.getAddressCount());
224 
225         utils = new SubnetUtils("192.168.0.1/25");
226         utils.setInclusiveHostCount(true);
227         info = utils.getInfo();
228         assertEquals("255.255.255.128",info.getNetmask());
229         assertEquals(128, info.getAddressCount());
230 
231         utils = new SubnetUtils("192.168.0.1/26");
232         utils.setInclusiveHostCount(true);
233         info = utils.getInfo();
234         assertEquals("255.255.255.192",info.getNetmask());
235         assertEquals(64, info.getAddressCount());
236 
237         utils = new SubnetUtils("192.168.0.1/27");
238         utils.setInclusiveHostCount(true);
239         info = utils.getInfo();
240         assertEquals("255.255.255.224",info.getNetmask());
241         assertEquals(32, info.getAddressCount());
242 
243         utils = new SubnetUtils("192.168.0.1/28");
244         utils.setInclusiveHostCount(true);
245         info = utils.getInfo();
246         assertEquals("255.255.255.240",info.getNetmask());
247         assertEquals(16, info.getAddressCount());
248 
249         utils = new SubnetUtils("192.168.0.1/29");
250         utils.setInclusiveHostCount(true);
251         info = utils.getInfo();
252         assertEquals("255.255.255.248",info.getNetmask());
253         assertEquals(8, info.getAddressCount());
254 
255         utils = new SubnetUtils("192.168.0.1/30");
256         utils.setInclusiveHostCount(true);
257         info = utils.getInfo();
258         assertEquals("255.255.255.252",info.getNetmask());
259         assertEquals(4, info.getAddressCount());
260 
261         utils = new SubnetUtils("192.168.0.1/31");
262         utils.setInclusiveHostCount(true);
263         info = utils.getInfo();
264         assertEquals("255.255.255.254",info.getNetmask());
265         assertEquals(2, info.getAddressCount());
266 
267         utils = new SubnetUtils("192.168.0.1/32");
268         utils.setInclusiveHostCount(true);
269         info = utils.getInfo();
270         assertEquals("255.255.255.255",info.getNetmask());
271         assertEquals(1, info.getAddressCount());
272 
273         new SubnetUtils("192.168.0.1/1");
274     }
275 
276     public void testInvalidMasks(){
277         try {
278             new SubnetUtils("192.168.0.1/33");
279             fail("Should have thrown IllegalArgumentException");
280         } catch (IllegalArgumentException expected) {
281         }
282         try {
283             new SubnetUtils("192.168.0.1/0");
284             fail("Should have thrown IllegalArgumentException");
285         } catch (IllegalArgumentException expected) {
286         }
287         try {
288             new SubnetUtils("192.168.0.1","0.0.0.0");
289             fail("Should have thrown IllegalArgumentException");
290         } catch (IllegalArgumentException expected) {
291         }
292     }
293 
294     public void testNET428_31() throws Exception {
295         final SubnetUtils subnetUtils = new SubnetUtils("1.2.3.4/31");
296         assertEquals(0,subnetUtils.getInfo().getAddressCount());
297         String[] address = subnetUtils.getInfo().getAllAddresses();
298         assertNotNull(address);
299         assertEquals(0,address.length);
300     }
301 
302     public void testNET428_32() throws Exception {
303         final SubnetUtils subnetUtils = new SubnetUtils("1.2.3.4/32");
304         assertEquals(0,subnetUtils.getInfo().getAddressCount());
305         String[] address = subnetUtils.getInfo().getAllAddresses();
306         assertNotNull(address);
307         assertEquals(0,address.length);
308     }
309 }