Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2010 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.LinkProperties;
     20 import android.net.RouteInfo;
     21 import android.test.suitebuilder.annotation.SmallTest;
     22 import junit.framework.TestCase;
     23 
     24 import java.net.InetAddress;
     25 import java.util.ArrayList;
     26 
     27 public class LinkPropertiesTest extends TestCase {
     28     private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
     29     private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
     30             "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
     31     private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
     32     private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
     33     private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
     34     private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
     35     private static String NAME = "qmi0";
     36     private static int MTU = 1500;
     37 
     38     private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
     39     private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
     40 
     41     public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
     42         // Check implementation of equals(), element by element.
     43         assertTrue(source.isIdenticalInterfaceName(target));
     44         assertTrue(target.isIdenticalInterfaceName(source));
     45 
     46         assertTrue(source.isIdenticalAddresses(target));
     47         assertTrue(target.isIdenticalAddresses(source));
     48 
     49         assertTrue(source.isIdenticalDnses(target));
     50         assertTrue(target.isIdenticalDnses(source));
     51 
     52         assertTrue(source.isIdenticalRoutes(target));
     53         assertTrue(target.isIdenticalRoutes(source));
     54 
     55         assertTrue(source.isIdenticalHttpProxy(target));
     56         assertTrue(target.isIdenticalHttpProxy(source));
     57 
     58         assertTrue(source.isIdenticalStackedLinks(target));
     59         assertTrue(target.isIdenticalStackedLinks(source));
     60 
     61         assertTrue(source.isIdenticalMtu(target));
     62         assertTrue(target.isIdenticalMtu(source));
     63 
     64         // Check result of equals().
     65         assertTrue(source.equals(target));
     66         assertTrue(target.equals(source));
     67 
     68         // Check hashCode.
     69         assertEquals(source.hashCode(), target.hashCode());
     70     }
     71 
     72     @SmallTest
     73     public void testEqualsNull() {
     74         LinkProperties source = new LinkProperties();
     75         LinkProperties target = new LinkProperties();
     76 
     77         assertFalse(source == target);
     78         assertLinkPropertiesEqual(source, target);
     79     }
     80 
     81     @SmallTest
     82     public void testEqualsSameOrder() {
     83         try {
     84             LinkProperties source = new LinkProperties();
     85             source.setInterfaceName(NAME);
     86             // set 2 link addresses
     87             source.addLinkAddress(LINKADDRV4);
     88             source.addLinkAddress(LINKADDRV6);
     89             // set 2 dnses
     90             source.addDns(DNS1);
     91             source.addDns(DNS2);
     92             // set 2 gateways
     93             source.addRoute(new RouteInfo(GATEWAY1));
     94             source.addRoute(new RouteInfo(GATEWAY2));
     95             source.setMtu(MTU);
     96 
     97             LinkProperties target = new LinkProperties();
     98 
     99             // All fields are same
    100             target.setInterfaceName(NAME);
    101             target.addLinkAddress(LINKADDRV4);
    102             target.addLinkAddress(LINKADDRV6);
    103             target.addDns(DNS1);
    104             target.addDns(DNS2);
    105             target.addRoute(new RouteInfo(GATEWAY1));
    106             target.addRoute(new RouteInfo(GATEWAY2));
    107             target.setMtu(MTU);
    108 
    109             assertLinkPropertiesEqual(source, target);
    110 
    111             target.clear();
    112             // change Interface Name
    113             target.setInterfaceName("qmi1");
    114             target.addLinkAddress(LINKADDRV4);
    115             target.addLinkAddress(LINKADDRV6);
    116             target.addDns(DNS1);
    117             target.addDns(DNS2);
    118             target.addRoute(new RouteInfo(GATEWAY1));
    119             target.addRoute(new RouteInfo(GATEWAY2));
    120             target.setMtu(MTU);
    121             assertFalse(source.equals(target));
    122 
    123             target.clear();
    124             target.setInterfaceName(NAME);
    125             // change link addresses
    126             target.addLinkAddress(new LinkAddress(
    127                     NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
    128             target.addLinkAddress(LINKADDRV6);
    129             target.addDns(DNS1);
    130             target.addDns(DNS2);
    131             target.addRoute(new RouteInfo(GATEWAY1));
    132             target.addRoute(new RouteInfo(GATEWAY2));
    133             target.setMtu(MTU);
    134             assertFalse(source.equals(target));
    135 
    136             target.clear();
    137             target.setInterfaceName(NAME);
    138             target.addLinkAddress(LINKADDRV4);
    139             target.addLinkAddress(LINKADDRV6);
    140             // change dnses
    141             target.addDns(NetworkUtils.numericToInetAddress("75.208.7.2"));
    142             target.addDns(DNS2);
    143             target.addRoute(new RouteInfo(GATEWAY1));
    144             target.addRoute(new RouteInfo(GATEWAY2));
    145             target.setMtu(MTU);
    146             assertFalse(source.equals(target));
    147 
    148             target.clear();
    149             target.setInterfaceName(NAME);
    150             target.addLinkAddress(LINKADDRV4);
    151             target.addLinkAddress(LINKADDRV6);
    152             target.addDns(DNS1);
    153             target.addDns(DNS2);
    154             // change gateway
    155             target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2")));
    156             target.addRoute(new RouteInfo(GATEWAY2));
    157             target.setMtu(MTU);
    158             assertFalse(source.equals(target));
    159 
    160             target.clear();
    161             target.setInterfaceName(NAME);
    162             target.addLinkAddress(LINKADDRV4);
    163             target.addLinkAddress(LINKADDRV6);
    164             target.addDns(DNS1);
    165             target.addDns(DNS2);
    166             target.addRoute(new RouteInfo(GATEWAY1));
    167             target.addRoute(new RouteInfo(GATEWAY2));
    168             // change mtu
    169             target.setMtu(1440);
    170             assertFalse(source.equals(target));
    171 
    172         } catch (Exception e) {
    173             throw new RuntimeException(e.toString());
    174             //fail();
    175         }
    176     }
    177 
    178     @SmallTest
    179     public void testEqualsDifferentOrder() {
    180         try {
    181             LinkProperties source = new LinkProperties();
    182             source.setInterfaceName(NAME);
    183             // set 2 link addresses
    184             source.addLinkAddress(LINKADDRV4);
    185             source.addLinkAddress(LINKADDRV6);
    186             // set 2 dnses
    187             source.addDns(DNS1);
    188             source.addDns(DNS2);
    189             // set 2 gateways
    190             source.addRoute(new RouteInfo(GATEWAY1));
    191             source.addRoute(new RouteInfo(GATEWAY2));
    192             source.setMtu(MTU);
    193 
    194             LinkProperties target = new LinkProperties();
    195             // Exchange order
    196             target.setInterfaceName(NAME);
    197             target.addLinkAddress(LINKADDRV6);
    198             target.addLinkAddress(LINKADDRV4);
    199             target.addDns(DNS2);
    200             target.addDns(DNS1);
    201             target.addRoute(new RouteInfo(GATEWAY2));
    202             target.addRoute(new RouteInfo(GATEWAY1));
    203             target.setMtu(MTU);
    204 
    205             assertLinkPropertiesEqual(source, target);
    206         } catch (Exception e) {
    207             fail();
    208         }
    209     }
    210 
    211     @SmallTest
    212     public void testEqualsDuplicated() {
    213         try {
    214             LinkProperties source = new LinkProperties();
    215             // set 3 link addresses, eg, [A, A, B]
    216             source.addLinkAddress(LINKADDRV4);
    217             source.addLinkAddress(LINKADDRV4);
    218             source.addLinkAddress(LINKADDRV6);
    219 
    220             LinkProperties target = new LinkProperties();
    221             // set 3 link addresses, eg, [A, B, B]
    222             target.addLinkAddress(LINKADDRV4);
    223             target.addLinkAddress(LINKADDRV6);
    224             target.addLinkAddress(LINKADDRV6);
    225 
    226             assertLinkPropertiesEqual(source, target);
    227         } catch (Exception e) {
    228             fail();
    229         }
    230     }
    231 
    232     private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
    233         for (RouteInfo r : lp.getRoutes()) {
    234             assertEquals(iface, r.getInterface());
    235         }
    236     }
    237 
    238     @SmallTest
    239     public void testRouteInterfaces() {
    240         LinkAddress prefix = new LinkAddress(
    241             NetworkUtils.numericToInetAddress("2001:db8::"), 32);
    242         InetAddress address = ADDRV6;
    243 
    244         // Add a route with no interface to a LinkProperties with no interface. No errors.
    245         LinkProperties lp = new LinkProperties();
    246         RouteInfo r = new RouteInfo(prefix, address, null);
    247         lp.addRoute(r);
    248         assertEquals(1, lp.getRoutes().size());
    249         assertAllRoutesHaveInterface(null, lp);
    250 
    251         // Add a route with an interface. Except an exception.
    252         r = new RouteInfo(prefix, address, "wlan0");
    253         try {
    254           lp.addRoute(r);
    255           fail("Adding wlan0 route to LP with no interface, expect exception");
    256         } catch (IllegalArgumentException expected) {}
    257 
    258         // Change the interface name. All the routes should change their interface name too.
    259         lp.setInterfaceName("rmnet0");
    260         assertAllRoutesHaveInterface("rmnet0", lp);
    261 
    262         // Now add a route with the wrong interface. This causes an exception too.
    263         try {
    264           lp.addRoute(r);
    265           fail("Adding wlan0 route to rmnet0 LP, expect exception");
    266         } catch (IllegalArgumentException expected) {}
    267 
    268         // If the interface name matches, the route is added.
    269         lp.setInterfaceName("wlan0");
    270         lp.addRoute(r);
    271         assertEquals(2, lp.getRoutes().size());
    272         assertAllRoutesHaveInterface("wlan0", lp);
    273 
    274         // Routes with null interfaces are converted to wlan0.
    275         r = RouteInfo.makeHostRoute(ADDRV6, null);
    276         lp.addRoute(r);
    277         assertEquals(3, lp.getRoutes().size());
    278         assertAllRoutesHaveInterface("wlan0", lp);
    279 
    280         // Check comparisons work.
    281         LinkProperties lp2 = new LinkProperties(lp);
    282         assertAllRoutesHaveInterface("wlan0", lp);
    283         assertEquals(0, lp.compareAllRoutes(lp2).added.size());
    284         assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
    285 
    286         lp2.setInterfaceName("p2p0");
    287         assertAllRoutesHaveInterface("p2p0", lp2);
    288         assertEquals(3, lp.compareAllRoutes(lp2).added.size());
    289         assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
    290     }
    291 
    292     @SmallTest
    293     public void testStackedInterfaces() {
    294         LinkProperties rmnet0 = new LinkProperties();
    295         rmnet0.setInterfaceName("rmnet0");
    296         rmnet0.addLinkAddress(LINKADDRV6);
    297 
    298         LinkProperties clat4 = new LinkProperties();
    299         clat4.setInterfaceName("clat4");
    300         clat4.addLinkAddress(LINKADDRV4);
    301 
    302         assertEquals(0, rmnet0.getStackedLinks().size());
    303         assertEquals(1, rmnet0.getAddresses().size());
    304         assertEquals(1, rmnet0.getLinkAddresses().size());
    305         assertEquals(1, rmnet0.getAllAddresses().size());
    306         assertEquals(1, rmnet0.getAllLinkAddresses().size());
    307 
    308         rmnet0.addStackedLink(clat4);
    309         assertEquals(1, rmnet0.getStackedLinks().size());
    310         assertEquals(1, rmnet0.getAddresses().size());
    311         assertEquals(1, rmnet0.getLinkAddresses().size());
    312         assertEquals(2, rmnet0.getAllAddresses().size());
    313         assertEquals(2, rmnet0.getAllLinkAddresses().size());
    314 
    315         rmnet0.addStackedLink(clat4);
    316         assertEquals(1, rmnet0.getStackedLinks().size());
    317         assertEquals(1, rmnet0.getAddresses().size());
    318         assertEquals(1, rmnet0.getLinkAddresses().size());
    319         assertEquals(2, rmnet0.getAllAddresses().size());
    320         assertEquals(2, rmnet0.getAllLinkAddresses().size());
    321 
    322         assertEquals(0, clat4.getStackedLinks().size());
    323 
    324         // Modify an item in the returned collection to see what happens.
    325         for (LinkProperties link : rmnet0.getStackedLinks()) {
    326             if (link.getInterfaceName().equals("clat4")) {
    327                link.setInterfaceName("newname");
    328             }
    329         }
    330         for (LinkProperties link : rmnet0.getStackedLinks()) {
    331             assertFalse("newname".equals(link.getInterfaceName()));
    332         }
    333 
    334         assertTrue(rmnet0.removeStackedLink(clat4));
    335         assertEquals(0, rmnet0.getStackedLinks().size());
    336         assertEquals(1, rmnet0.getAddresses().size());
    337         assertEquals(1, rmnet0.getLinkAddresses().size());
    338         assertEquals(1, rmnet0.getAllAddresses().size());
    339         assertEquals(1, rmnet0.getAllLinkAddresses().size());
    340 
    341         assertFalse(rmnet0.removeStackedLink(clat4));
    342     }
    343 
    344     @SmallTest
    345     public void testAddressMethods() {
    346         LinkProperties lp = new LinkProperties();
    347 
    348         // No addresses.
    349         assertFalse(lp.hasIPv4Address());
    350         assertFalse(lp.hasIPv6Address());
    351 
    352         // Addresses on stacked links don't count.
    353         LinkProperties stacked = new LinkProperties();
    354         stacked.setInterfaceName("stacked");
    355         lp.addStackedLink(stacked);
    356         stacked.addLinkAddress(LINKADDRV4);
    357         stacked.addLinkAddress(LINKADDRV6);
    358         assertTrue(stacked.hasIPv4Address());
    359         assertTrue(stacked.hasIPv6Address());
    360         assertFalse(lp.hasIPv4Address());
    361         assertFalse(lp.hasIPv6Address());
    362         lp.removeStackedLink(stacked);
    363         assertFalse(lp.hasIPv4Address());
    364         assertFalse(lp.hasIPv6Address());
    365 
    366         // Addresses on the base link.
    367         // Check the return values of hasIPvXAddress and ensure the add/remove methods return true
    368         // iff something changes.
    369         assertTrue(lp.addLinkAddress(LINKADDRV6));
    370         assertFalse(lp.hasIPv4Address());
    371         assertTrue(lp.hasIPv6Address());
    372 
    373         assertTrue(lp.removeLinkAddress(LINKADDRV6));
    374         assertTrue(lp.addLinkAddress(LINKADDRV4));
    375         assertTrue(lp.hasIPv4Address());
    376         assertFalse(lp.hasIPv6Address());
    377 
    378         assertTrue(lp.addLinkAddress(LINKADDRV6));
    379         assertTrue(lp.hasIPv4Address());
    380         assertTrue(lp.hasIPv6Address());
    381 
    382         // Adding an address twice has no effect.
    383         // Removing an address that's not present has no effect.
    384         assertFalse(lp.addLinkAddress(LINKADDRV4));
    385         assertTrue(lp.hasIPv4Address());
    386         assertTrue(lp.removeLinkAddress(LINKADDRV4));
    387         assertFalse(lp.hasIPv4Address());
    388         assertFalse(lp.removeLinkAddress(LINKADDRV4));
    389     }
    390 
    391     @SmallTest
    392     public void testSetLinkAddresses() {
    393         LinkProperties lp = new LinkProperties();
    394         lp.addLinkAddress(LINKADDRV4);
    395         lp.addLinkAddress(LINKADDRV6);
    396 
    397         LinkProperties lp2 = new LinkProperties();
    398         lp2.addLinkAddress(LINKADDRV6);
    399 
    400         assertFalse(lp.equals(lp2));
    401 
    402         lp2.setLinkAddresses(lp.getLinkAddresses());
    403         assertTrue(lp.equals(lp));
    404     }
    405 }
    406