145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti/*
245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * Copyright (C) 2010 The Android Open Source Project
345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti *
445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License");
545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * you may not use this file except in compliance with the License.
645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * You may obtain a copy of the License at
745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti *
845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti *      http://www.apache.org/licenses/LICENSE-2.0
945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti *
1045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software
1145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS,
1245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * See the License for the specific language governing permissions and
1445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti * limitations under the License.
1545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti */
1645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
1745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittipackage android.net;
1845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
1945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittiimport java.lang.reflect.Method;
2045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittiimport java.net.InetAddress;
2145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
228c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colittiimport android.net.IpPrefix;
2345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittiimport android.net.RouteInfo;
2445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittiimport android.os.Parcel;
2545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
2645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittiimport junit.framework.TestCase;
2745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittiimport android.test.suitebuilder.annotation.SmallTest;
2845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
2945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colittipublic class RouteInfoTest extends TestCase {
3045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
3145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    private InetAddress Address(String addr) {
3245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        return InetAddress.parseNumericAddress(addr);
3345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
3445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
358c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti    private IpPrefix Prefix(String prefix) {
368c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        return new IpPrefix(prefix);
3745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
3845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
3945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    @SmallTest
4045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    public void testConstructor() {
4145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r;
4245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
4345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        // Invalid input.
4445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        try {
458c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti            r = new RouteInfo((IpPrefix) null, null, "rmnet0");
4645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            fail("Expected RuntimeException:  destination and gateway null");
4745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        } catch(RuntimeException e) {}
4845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
4945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        // Null destination is default route.
508c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        r = new RouteInfo((IpPrefix) null, Address("2001:db8::1"), null);
5145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Prefix("::/0"), r.getDestination());
5245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Address("2001:db8::1"), r.getGateway());
5345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertNull(r.getInterface());
5445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
558c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti        r = new RouteInfo((IpPrefix) null, Address("192.0.2.1"), "wlan0");
5645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Prefix("0.0.0.0/0"), r.getDestination());
5745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Address("192.0.2.1"), r.getGateway());
5845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals("wlan0", r.getInterface());
5945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
6045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        // Null gateway sets gateway to unspecified address (why?).
6145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r = new RouteInfo(Prefix("2001:db8:beef:cafe::/48"), null, "lo");
6245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Prefix("2001:db8:beef::/48"), r.getDestination());
6345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Address("::"), r.getGateway());
6445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals("lo", r.getInterface());
6545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
6645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r = new RouteInfo(Prefix("192.0.2.5/24"), null);
6745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Prefix("192.0.2.0/24"), r.getDestination());
6845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertEquals(Address("0.0.0.0"), r.getGateway());
6945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertNull(r.getInterface());
7045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
7145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
7245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    public void testMatches() {
73130669992c5ea8d54db15f142e27578bdcf7e003Robert Greenwalt        class PatchedRouteInfo {
74130669992c5ea8d54db15f142e27578bdcf7e003Robert Greenwalt            private final RouteInfo mRouteInfo;
75130669992c5ea8d54db15f142e27578bdcf7e003Robert Greenwalt
768c6c2c3c929acad783b9a56b8d9efa597d0ae609Lorenzo Colitti            public PatchedRouteInfo(IpPrefix destination, InetAddress gateway, String iface) {
77130669992c5ea8d54db15f142e27578bdcf7e003Robert Greenwalt                mRouteInfo = new RouteInfo(destination, gateway, iface);
7845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            }
7945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
8045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            public boolean matches(InetAddress destination) {
81130669992c5ea8d54db15f142e27578bdcf7e003Robert Greenwalt                return mRouteInfo.matches(destination);
8245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            }
8345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        }
8445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
856f0ec45a3bff040790ae84345f154c65c9777610Robert Greenwalt        PatchedRouteInfo r;
8645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
8745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r = new PatchedRouteInfo(Prefix("2001:db8:f00::ace:d00d/127"), null, "rmnet0");
8845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(r.matches(Address("2001:db8:f00::ace:d00c")));
8945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(r.matches(Address("2001:db8:f00::ace:d00d")));
9045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(r.matches(Address("2001:db8:f00::ace:d00e")));
9145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(r.matches(Address("2001:db8:f00::bad:d00d")));
9245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(r.matches(Address("2001:4868:4860::8888")));
9345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
9445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r = new PatchedRouteInfo(Prefix("192.0.2.0/23"), null, "wlan0");
9545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(r.matches(Address("192.0.2.43")));
9645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(r.matches(Address("192.0.3.21")));
9745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(r.matches(Address("192.0.0.21")));
9845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(r.matches(Address("8.8.8.8")));
9945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
1006f0ec45a3bff040790ae84345f154c65c9777610Robert Greenwalt        PatchedRouteInfo ipv6Default = new PatchedRouteInfo(Prefix("::/0"), null, "rmnet0");
10145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(ipv6Default.matches(Address("2001:db8::f00")));
10245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(ipv6Default.matches(Address("192.0.2.1")));
10345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
1046f0ec45a3bff040790ae84345f154c65c9777610Robert Greenwalt        PatchedRouteInfo ipv4Default = new PatchedRouteInfo(Prefix("0.0.0.0/0"), null, "rmnet0");
10545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(ipv4Default.matches(Address("255.255.255.255")));
10645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(ipv4Default.matches(Address("192.0.2.1")));
10745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(ipv4Default.matches(Address("2001:db8::f00")));
10845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
10945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
11045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    private void assertAreEqual(Object o1, Object o2) {
11145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(o1.equals(o2));
11245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertTrue(o2.equals(o1));
11345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
11445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
11545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    private void assertAreNotEqual(Object o1, Object o2) {
11645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(o1.equals(o2));
11745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertFalse(o2.equals(o1));
11845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
11945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
12045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    public void testEquals() {
12145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        // IPv4
12245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r1 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "wlan0");
12345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r2 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "wlan0");
12445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreEqual(r1, r2);
12545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
12645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r3 = new RouteInfo(Prefix("2001:db8:ace::/49"), Address("2001:db8::1"), "wlan0");
12745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r4 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::2"), "wlan0");
12845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r5 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "rmnet0");
12945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r3);
13045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r4);
13145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r5);
13245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
13345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        // IPv6
13445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r1 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "wlan0");
13545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r2 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "wlan0");
13645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreEqual(r1, r2);
13745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
13845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r3 = new RouteInfo(Prefix("192.0.2.0/24"), Address("192.0.2.1"), "wlan0");
13945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r4 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.2"), "wlan0");
14045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r5 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "rmnet0");
14145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r3);
14245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r4);
14345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r5);
14445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
14545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        // Interfaces (but not destinations or gateways) can be null.
14645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r1 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), null);
14745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r2 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), null);
14845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r3 = new RouteInfo(Prefix("192.0.2.0/24"), Address("192.0.2.1"), "wlan0");
14945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreEqual(r1, r2);
15045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertAreNotEqual(r1, r3);
15145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
15245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
15364c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti    public void testHostAndDefaultRoutes() {
154fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      RouteInfo r;
155fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
156fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("0.0.0.0/0"), Address("0.0.0.0"), "wlan0");
157fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertFalse(r.isHostRoute());
15864c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertTrue(r.isDefaultRoute());
15964c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertTrue(r.isIPv4Default());
16064c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
161fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
162fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("::/0"), Address("::"), "wlan0");
163fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertFalse(r.isHostRoute());
16464c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertTrue(r.isDefaultRoute());
16564c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
16664c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertTrue(r.isIPv6Default());
167fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
168fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0");
169fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertFalse(r.isHostRoute());
17064c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
17164c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
17264c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
173fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
174fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("2001:db8::/48"), null, "wlan0");
175fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertFalse(r.isHostRoute());
17664c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
17764c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
17864c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
179fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
180fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("192.0.2.0/32"), Address("0.0.0.0"), "wlan0");
181fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertTrue(r.isHostRoute());
18264c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
18364c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
18464c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
185fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
186fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("2001:db8::/128"), Address("::"), "wlan0");
187fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertTrue(r.isHostRoute());
18864c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
18964c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
19064c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
191fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
192fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("192.0.2.0/32"), null, "wlan0");
193fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertTrue(r.isHostRoute());
19464c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
19564c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
19664c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
197fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
198fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("2001:db8::/128"), null, "wlan0");
199fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertTrue(r.isHostRoute());
20064c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
20164c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
20264c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
203fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
204fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("::/128"), Address("fe80::"), "wlan0");
205fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertTrue(r.isHostRoute());
20664c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
20764c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
20864c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
209fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
210fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0");
211fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti      assertTrue(r.isHostRoute());
21264c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isDefaultRoute());
21364c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv4Default());
21464c43b1948a2b2fcd692cd4a48f031efbf7f7336Lorenzo Colitti      assertFalse(r.isIPv6Default());
215fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti    }
216fdadc4e242d987c09007df274e01fe678a82331fLorenzo Colitti
2171806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    public void testTruncation() {
2181806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      LinkAddress l;
2191806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      RouteInfo r;
2201806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti
2211806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      l = new LinkAddress("192.0.2.5/30");
2221806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      r = new RouteInfo(l, Address("192.0.2.1"), "wlan0");
2231806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      assertEquals("192.0.2.4", r.getDestination().getAddress().getHostAddress());
2241806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti
2251806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      l = new LinkAddress("2001:db8:1:f::5/63");
2261806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      r = new RouteInfo(l, Address("2001:db8:5::1"), "wlan0");
2271806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      assertEquals("2001:db8:1:e::", r.getDestination().getAddress().getHostAddress());
2281806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    }
2291806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti
2301806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    // Make sure that creating routes to multicast addresses doesn't throw an exception. Even though
2311806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    // there's nothing we can do with them, we don't want to crash if, e.g., someone calls
2321806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    // requestRouteToHostAddress("230.0.0.0", MOBILE_HIPRI);
2331806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    public void testMulticastRoute() {
2341806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      RouteInfo r;
2351806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      r = new RouteInfo(Prefix("230.0.0.0/32"), Address("192.0.2.1"), "wlan0");
2361806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      r = new RouteInfo(Prefix("ff02::1/128"), Address("2001:db8::1"), "wlan0");
2371806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti      // No exceptions? Good.
2381806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti    }
2391806b1fc25bcffaa005e72a55042031a42b168b1Lorenzo Colitti
24045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    public RouteInfo passThroughParcel(RouteInfo r) {
24145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        Parcel p = Parcel.obtain();
24245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r2 = null;
24345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        try {
24445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            r.writeToParcel(p, 0);
24545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            p.setDataPosition(0);
24645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            r2 = RouteInfo.CREATOR.createFromParcel(p);
24745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        } finally {
24845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti            p.recycle();
24945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        }
25045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertNotNull(r2);
25145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        return r2;
25245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
25345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
25445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    public void assertParcelingIsLossless(RouteInfo r) {
25545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti      RouteInfo r2 = passThroughParcel(r);
25645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti      assertEquals(r, r2);
25745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
25845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
25945b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    public void testParceling() {
26045b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        RouteInfo r;
26145b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
26245b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r = new RouteInfo(Prefix("::/0"), Address("2001:db8::"), null);
26345b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertParcelingIsLossless(r);
26445b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti
26545b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0");
26645b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti        assertParcelingIsLossless(r);
26745b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti    }
26845b9a5bb93569ca49bbd44f7a518091371687f96Lorenzo Colitti}
269