Home | History | Annotate | Download | only in net
      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