1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.net; 18 19 import android.net.NetworkUtils; 20 import android.test.suitebuilder.annotation.SmallTest; 21 22 import java.math.BigInteger; 23 import java.net.Inet4Address; 24 import java.net.InetAddress; 25 import java.util.TreeSet; 26 27 import junit.framework.TestCase; 28 29 public class NetworkUtilsTest extends TestCase { 30 31 private InetAddress Address(String addr) { 32 return InetAddress.parseNumericAddress(addr); 33 } 34 35 private Inet4Address IPv4Address(String addr) { 36 return (Inet4Address) Address(addr); 37 } 38 39 @SmallTest 40 public void testGetImplicitNetmask() { 41 assertEquals(8, NetworkUtils.getImplicitNetmask(IPv4Address("4.2.2.2"))); 42 assertEquals(8, NetworkUtils.getImplicitNetmask(IPv4Address("10.5.6.7"))); 43 assertEquals(16, NetworkUtils.getImplicitNetmask(IPv4Address("173.194.72.105"))); 44 assertEquals(16, NetworkUtils.getImplicitNetmask(IPv4Address("172.23.68.145"))); 45 assertEquals(24, NetworkUtils.getImplicitNetmask(IPv4Address("192.0.2.1"))); 46 assertEquals(24, NetworkUtils.getImplicitNetmask(IPv4Address("192.168.5.1"))); 47 assertEquals(32, NetworkUtils.getImplicitNetmask(IPv4Address("224.0.0.1"))); 48 assertEquals(32, NetworkUtils.getImplicitNetmask(IPv4Address("255.6.7.8"))); 49 } 50 51 private void assertInvalidNetworkMask(Inet4Address addr) { 52 try { 53 NetworkUtils.netmaskToPrefixLength(addr); 54 fail("Invalid netmask " + addr.getHostAddress() + " did not cause exception"); 55 } catch (IllegalArgumentException expected) { 56 } 57 } 58 59 @SmallTest 60 public void testNetmaskToPrefixLength() { 61 assertEquals(0, NetworkUtils.netmaskToPrefixLength(IPv4Address("0.0.0.0"))); 62 assertEquals(9, NetworkUtils.netmaskToPrefixLength(IPv4Address("255.128.0.0"))); 63 assertEquals(17, NetworkUtils.netmaskToPrefixLength(IPv4Address("255.255.128.0"))); 64 assertEquals(23, NetworkUtils.netmaskToPrefixLength(IPv4Address("255.255.254.0"))); 65 assertEquals(31, NetworkUtils.netmaskToPrefixLength(IPv4Address("255.255.255.254"))); 66 assertEquals(32, NetworkUtils.netmaskToPrefixLength(IPv4Address("255.255.255.255"))); 67 68 assertInvalidNetworkMask(IPv4Address("0.0.0.1")); 69 assertInvalidNetworkMask(IPv4Address("255.255.255.253")); 70 assertInvalidNetworkMask(IPv4Address("255.255.0.255")); 71 } 72 73 @SmallTest 74 public void testRoutedIPv4AddressCount() { 75 final TreeSet<IpPrefix> set = new TreeSet<>(IpPrefix.lengthComparator()); 76 // No routes routes to no addresses. 77 assertEquals(0, NetworkUtils.routedIPv4AddressCount(set)); 78 79 set.add(new IpPrefix("0.0.0.0/0")); 80 assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set)); 81 82 set.add(new IpPrefix("20.18.0.0/16")); 83 set.add(new IpPrefix("20.18.0.0/24")); 84 set.add(new IpPrefix("20.18.0.0/8")); 85 // There is a default route, still covers everything 86 assertEquals(1l << 32, NetworkUtils.routedIPv4AddressCount(set)); 87 88 set.clear(); 89 set.add(new IpPrefix("20.18.0.0/24")); 90 set.add(new IpPrefix("20.18.0.0/8")); 91 // The 8-length includes the 24-length prefix 92 assertEquals(1l << 24, NetworkUtils.routedIPv4AddressCount(set)); 93 94 set.add(new IpPrefix("10.10.10.126/25")); 95 // The 8-length does not include this 25-length prefix 96 assertEquals((1l << 24) + (1 << 7), NetworkUtils.routedIPv4AddressCount(set)); 97 98 set.clear(); 99 set.add(new IpPrefix("1.2.3.4/32")); 100 set.add(new IpPrefix("1.2.3.4/32")); 101 set.add(new IpPrefix("1.2.3.4/32")); 102 set.add(new IpPrefix("1.2.3.4/32")); 103 assertEquals(1l, NetworkUtils.routedIPv4AddressCount(set)); 104 105 set.add(new IpPrefix("1.2.3.5/32")); 106 set.add(new IpPrefix("1.2.3.6/32")); 107 108 set.add(new IpPrefix("1.2.3.7/32")); 109 set.add(new IpPrefix("1.2.3.8/32")); 110 set.add(new IpPrefix("1.2.3.9/32")); 111 set.add(new IpPrefix("1.2.3.0/32")); 112 assertEquals(7l, NetworkUtils.routedIPv4AddressCount(set)); 113 114 // 1.2.3.4/30 eats 1.2.3.{4-7}/32 115 set.add(new IpPrefix("1.2.3.4/30")); 116 set.add(new IpPrefix("6.2.3.4/28")); 117 set.add(new IpPrefix("120.2.3.4/16")); 118 assertEquals(7l - 4 + 4 + 16 + 65536, NetworkUtils.routedIPv4AddressCount(set)); 119 } 120 121 @SmallTest 122 public void testRoutedIPv6AddressCount() { 123 final TreeSet<IpPrefix> set = new TreeSet<>(IpPrefix.lengthComparator()); 124 // No routes routes to no addresses. 125 assertEquals(BigInteger.ZERO, NetworkUtils.routedIPv6AddressCount(set)); 126 127 set.add(new IpPrefix("::/0")); 128 assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set)); 129 130 set.add(new IpPrefix("1234:622a::18/64")); 131 set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96")); 132 set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8")); 133 // There is a default route, still covers everything 134 assertEquals(BigInteger.ONE.shiftLeft(128), NetworkUtils.routedIPv6AddressCount(set)); 135 136 set.clear(); 137 set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/96")); 138 set.add(new IpPrefix("add4:f00:80:f7:1111::6adb/8")); 139 // The 8-length includes the 96-length prefix 140 assertEquals(BigInteger.ONE.shiftLeft(120), NetworkUtils.routedIPv6AddressCount(set)); 141 142 set.add(new IpPrefix("10::26/64")); 143 // The 8-length does not include this 64-length prefix 144 assertEquals(BigInteger.ONE.shiftLeft(120).add(BigInteger.ONE.shiftLeft(64)), 145 NetworkUtils.routedIPv6AddressCount(set)); 146 147 set.clear(); 148 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); 149 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); 150 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); 151 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/128")); 152 assertEquals(BigInteger.ONE, NetworkUtils.routedIPv6AddressCount(set)); 153 154 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad5/128")); 155 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad6/128")); 156 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad7/128")); 157 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad8/128")); 158 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad9/128")); 159 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad0/128")); 160 assertEquals(BigInteger.valueOf(7), NetworkUtils.routedIPv6AddressCount(set)); 161 162 // add4:f00:80:f7:1111::6ad4/126 eats add4:f00:8[:f7:1111::6ad{4-7}/128 163 set.add(new IpPrefix("add4:f00:80:f7:1111::6ad4/126")); 164 set.add(new IpPrefix("d00d:f00:80:f7:1111::6ade/124")); 165 set.add(new IpPrefix("f00b:a33::/112")); 166 assertEquals(BigInteger.valueOf(7l - 4 + 4 + 16 + 65536), 167 NetworkUtils.routedIPv6AddressCount(set)); 168 } 169 } 170