diff options
| author | Lorenzo Colitti <lorenzo@google.com> | 2013-03-08 11:30:39 -0800 | 
|---|---|---|
| committer | Lorenzo Colitti <lorenzo@google.com> | 2013-03-08 16:41:25 -0800 | 
| commit | 45b9a5bb93569ca49bbd44f7a518091371687f96 (patch) | |
| tree | 389bdedc8d3fbdc9c52d73e9eca4a553e546360e /core/tests | |
| parent | 6916c6ee105e7e91f494ec79c24152fb64d8eed1 (diff) | |
| download | frameworks_base-45b9a5bb93569ca49bbd44f7a518091371687f96.zip frameworks_base-45b9a5bb93569ca49bbd44f7a518091371687f96.tar.gz frameworks_base-45b9a5bb93569ca49bbd44f7a518091371687f96.tar.bz2  | |
RouteInfo changes.
- Add the interface name.
- Fix a bug where a default route would match an address of
  another protocol (e.g., 0.0.0.0/0 would match 2001::).
- Tweak the hashCode method.
- Write a unit test.
Change-Id: Ida8266de440a9b1d9eaa132f182b9f1ce8978c44
Diffstat (limited to 'core/tests')
| -rw-r--r-- | core/tests/coretests/src/android/net/RouteInfoTest.java | 180 | 
1 files changed, 180 insertions, 0 deletions
diff --git a/core/tests/coretests/src/android/net/RouteInfoTest.java b/core/tests/coretests/src/android/net/RouteInfoTest.java new file mode 100644 index 0000000..59eb601 --- /dev/null +++ b/core/tests/coretests/src/android/net/RouteInfoTest.java @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net; + +import java.lang.reflect.Method; +import java.net.InetAddress; + +import android.net.LinkAddress; +import android.net.RouteInfo; +import android.os.Parcel; + +import junit.framework.TestCase; +import android.test.suitebuilder.annotation.SmallTest; + +public class RouteInfoTest extends TestCase { + +    private InetAddress Address(String addr) { +        return InetAddress.parseNumericAddress(addr); +    } + +    private LinkAddress Prefix(String prefix) { +        String[] parts = prefix.split("/"); +        return new LinkAddress(Address(parts[0]), Integer.parseInt(parts[1])); +    } + +    @SmallTest +    public void testConstructor() { +        RouteInfo r; + +        // Invalid input. +        try { +            r = new RouteInfo(null, null, "rmnet0"); +            fail("Expected RuntimeException:  destination and gateway null"); +        } catch(RuntimeException e) {} + +        // Null destination is default route. +        r = new RouteInfo(null, Address("2001:db8::1"), null); +        assertEquals(Prefix("::/0"), r.getDestination()); +        assertEquals(Address("2001:db8::1"), r.getGateway()); +        assertNull(r.getInterface()); + +        r = new RouteInfo(null, Address("192.0.2.1"), "wlan0"); +        assertEquals(Prefix("0.0.0.0/0"), r.getDestination()); +        assertEquals(Address("192.0.2.1"), r.getGateway()); +        assertEquals("wlan0", r.getInterface()); + +        // Null gateway sets gateway to unspecified address (why?). +        r = new RouteInfo(Prefix("2001:db8:beef:cafe::/48"), null, "lo"); +        assertEquals(Prefix("2001:db8:beef::/48"), r.getDestination()); +        assertEquals(Address("::"), r.getGateway()); +        assertEquals("lo", r.getInterface()); + +        r = new RouteInfo(Prefix("192.0.2.5/24"), null); +        assertEquals(Prefix("192.0.2.0/24"), r.getDestination()); +        assertEquals(Address("0.0.0.0"), r.getGateway()); +        assertNull(r.getInterface()); +    } + +    public void testMatches() { +        class PatchedRouteInfo extends RouteInfo { +            public PatchedRouteInfo(LinkAddress destination, InetAddress gateway, String iface) { +                super(destination, gateway, iface); +            } + +            public boolean matches(InetAddress destination) { +                return super.matches(destination); +            } +        } + +        RouteInfo r; + +        r = new PatchedRouteInfo(Prefix("2001:db8:f00::ace:d00d/127"), null, "rmnet0"); +        assertTrue(r.matches(Address("2001:db8:f00::ace:d00c"))); +        assertTrue(r.matches(Address("2001:db8:f00::ace:d00d"))); +        assertFalse(r.matches(Address("2001:db8:f00::ace:d00e"))); +        assertFalse(r.matches(Address("2001:db8:f00::bad:d00d"))); +        assertFalse(r.matches(Address("2001:4868:4860::8888"))); + +        r = new PatchedRouteInfo(Prefix("192.0.2.0/23"), null, "wlan0"); +        assertTrue(r.matches(Address("192.0.2.43"))); +        assertTrue(r.matches(Address("192.0.3.21"))); +        assertFalse(r.matches(Address("192.0.0.21"))); +        assertFalse(r.matches(Address("8.8.8.8"))); + +        RouteInfo ipv6Default = new PatchedRouteInfo(Prefix("::/0"), null, "rmnet0"); +        assertTrue(ipv6Default.matches(Address("2001:db8::f00"))); +        assertFalse(ipv6Default.matches(Address("192.0.2.1"))); + +        RouteInfo ipv4Default = new PatchedRouteInfo(Prefix("0.0.0.0/0"), null, "rmnet0"); +        assertTrue(ipv4Default.matches(Address("255.255.255.255"))); +        assertTrue(ipv4Default.matches(Address("192.0.2.1"))); +        assertFalse(ipv4Default.matches(Address("2001:db8::f00"))); +    } + +    private void assertAreEqual(Object o1, Object o2) { +        assertTrue(o1.equals(o2)); +        assertTrue(o2.equals(o1)); +    } + +    private void assertAreNotEqual(Object o1, Object o2) { +        assertFalse(o1.equals(o2)); +        assertFalse(o2.equals(o1)); +    } + +    public void testEquals() { +        // IPv4 +        RouteInfo r1 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "wlan0"); +        RouteInfo r2 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "wlan0"); +        assertAreEqual(r1, r2); + +        RouteInfo r3 = new RouteInfo(Prefix("2001:db8:ace::/49"), Address("2001:db8::1"), "wlan0"); +        RouteInfo r4 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::2"), "wlan0"); +        RouteInfo r5 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "rmnet0"); +        assertAreNotEqual(r1, r3); +        assertAreNotEqual(r1, r4); +        assertAreNotEqual(r1, r5); + +        // IPv6 +        r1 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "wlan0"); +        r2 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "wlan0"); +        assertAreEqual(r1, r2); + +        r3 = new RouteInfo(Prefix("192.0.2.0/24"), Address("192.0.2.1"), "wlan0"); +        r4 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.2"), "wlan0"); +        r5 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "rmnet0"); +        assertAreNotEqual(r1, r3); +        assertAreNotEqual(r1, r4); +        assertAreNotEqual(r1, r5); + +        // Interfaces (but not destinations or gateways) can be null. +        r1 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), null); +        r2 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), null); +        r3 = new RouteInfo(Prefix("192.0.2.0/24"), Address("192.0.2.1"), "wlan0"); +        assertAreEqual(r1, r2); +        assertAreNotEqual(r1, r3); +    } + +    public RouteInfo passThroughParcel(RouteInfo r) { +        Parcel p = Parcel.obtain(); +        RouteInfo r2 = null; +        try { +            r.writeToParcel(p, 0); +            p.setDataPosition(0); +            r2 = RouteInfo.CREATOR.createFromParcel(p); +        } finally { +            p.recycle(); +        } +        assertNotNull(r2); +        return r2; +    } + +    public void assertParcelingIsLossless(RouteInfo r) { +      RouteInfo r2 = passThroughParcel(r); +      assertEquals(r, r2); +    } + +    public void testParceling() { +        RouteInfo r; + +        r = new RouteInfo(Prefix("::/0"), Address("2001:db8::"), null); +        assertParcelingIsLossless(r); + +        r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0"); +        assertParcelingIsLossless(r); +    } +}  | 
