blob: 2edbd403b5b53702b0f896803c03713fa9d0d171 [file] [log] [blame]
Lorenzo Colitti05805982013-03-08 11:30:39 -08001/*
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
17package android.net;
18
Rubin Xu1c19cf32019-01-08 22:03:26 +000019import static android.net.RouteInfo.RTN_UNREACHABLE;
Lorenzo Colitti05805982013-03-08 11:30:39 -080020
Lorenzo Colitti05805982013-03-08 11:30:39 -080021import android.os.Parcel;
Rubin Xu1c19cf32019-01-08 22:03:26 +000022import android.test.suitebuilder.annotation.SmallTest;
Lorenzo Colitti05805982013-03-08 11:30:39 -080023
24import junit.framework.TestCase;
Rubin Xu1c19cf32019-01-08 22:03:26 +000025
26import java.net.Inet4Address;
27import java.net.Inet6Address;
28import java.net.InetAddress;
Lorenzo Colitti05805982013-03-08 11:30:39 -080029
30public class RouteInfoTest extends TestCase {
31
32 private InetAddress Address(String addr) {
33 return InetAddress.parseNumericAddress(addr);
34 }
35
Lorenzo Colitti2e9b1232014-06-12 13:41:17 +090036 private IpPrefix Prefix(String prefix) {
37 return new IpPrefix(prefix);
Lorenzo Colitti05805982013-03-08 11:30:39 -080038 }
39
40 @SmallTest
41 public void testConstructor() {
42 RouteInfo r;
43
44 // Invalid input.
45 try {
Lorenzo Colitti2e9b1232014-06-12 13:41:17 +090046 r = new RouteInfo((IpPrefix) null, null, "rmnet0");
Lorenzo Colitti05805982013-03-08 11:30:39 -080047 fail("Expected RuntimeException: destination and gateway null");
48 } catch(RuntimeException e) {}
49
50 // Null destination is default route.
Lorenzo Colitti2e9b1232014-06-12 13:41:17 +090051 r = new RouteInfo((IpPrefix) null, Address("2001:db8::1"), null);
Lorenzo Colitti05805982013-03-08 11:30:39 -080052 assertEquals(Prefix("::/0"), r.getDestination());
53 assertEquals(Address("2001:db8::1"), r.getGateway());
54 assertNull(r.getInterface());
55
Lorenzo Colitti2e9b1232014-06-12 13:41:17 +090056 r = new RouteInfo((IpPrefix) null, Address("192.0.2.1"), "wlan0");
Lorenzo Colitti05805982013-03-08 11:30:39 -080057 assertEquals(Prefix("0.0.0.0/0"), r.getDestination());
58 assertEquals(Address("192.0.2.1"), r.getGateway());
59 assertEquals("wlan0", r.getInterface());
60
61 // Null gateway sets gateway to unspecified address (why?).
62 r = new RouteInfo(Prefix("2001:db8:beef:cafe::/48"), null, "lo");
63 assertEquals(Prefix("2001:db8:beef::/48"), r.getDestination());
64 assertEquals(Address("::"), r.getGateway());
65 assertEquals("lo", r.getInterface());
66
67 r = new RouteInfo(Prefix("192.0.2.5/24"), null);
68 assertEquals(Prefix("192.0.2.0/24"), r.getDestination());
69 assertEquals(Address("0.0.0.0"), r.getGateway());
70 assertNull(r.getInterface());
71 }
72
73 public void testMatches() {
Robert Greenwalt4caa8812014-06-11 18:06:55 -070074 class PatchedRouteInfo {
75 private final RouteInfo mRouteInfo;
76
Lorenzo Colitti2e9b1232014-06-12 13:41:17 +090077 public PatchedRouteInfo(IpPrefix destination, InetAddress gateway, String iface) {
Robert Greenwalt4caa8812014-06-11 18:06:55 -070078 mRouteInfo = new RouteInfo(destination, gateway, iface);
Lorenzo Colitti05805982013-03-08 11:30:39 -080079 }
80
81 public boolean matches(InetAddress destination) {
Robert Greenwalt4caa8812014-06-11 18:06:55 -070082 return mRouteInfo.matches(destination);
Lorenzo Colitti05805982013-03-08 11:30:39 -080083 }
84 }
85
Robert Greenwalta4c6a852014-06-11 18:36:36 -070086 PatchedRouteInfo r;
Lorenzo Colitti05805982013-03-08 11:30:39 -080087
88 r = new PatchedRouteInfo(Prefix("2001:db8:f00::ace:d00d/127"), null, "rmnet0");
89 assertTrue(r.matches(Address("2001:db8:f00::ace:d00c")));
90 assertTrue(r.matches(Address("2001:db8:f00::ace:d00d")));
91 assertFalse(r.matches(Address("2001:db8:f00::ace:d00e")));
92 assertFalse(r.matches(Address("2001:db8:f00::bad:d00d")));
93 assertFalse(r.matches(Address("2001:4868:4860::8888")));
Erik Kline8a100e32015-04-13 15:33:34 +090094 assertFalse(r.matches(Address("8.8.8.8")));
Lorenzo Colitti05805982013-03-08 11:30:39 -080095
96 r = new PatchedRouteInfo(Prefix("192.0.2.0/23"), null, "wlan0");
97 assertTrue(r.matches(Address("192.0.2.43")));
98 assertTrue(r.matches(Address("192.0.3.21")));
99 assertFalse(r.matches(Address("192.0.0.21")));
100 assertFalse(r.matches(Address("8.8.8.8")));
101
Robert Greenwalta4c6a852014-06-11 18:36:36 -0700102 PatchedRouteInfo ipv6Default = new PatchedRouteInfo(Prefix("::/0"), null, "rmnet0");
Lorenzo Colitti05805982013-03-08 11:30:39 -0800103 assertTrue(ipv6Default.matches(Address("2001:db8::f00")));
104 assertFalse(ipv6Default.matches(Address("192.0.2.1")));
105
Robert Greenwalta4c6a852014-06-11 18:36:36 -0700106 PatchedRouteInfo ipv4Default = new PatchedRouteInfo(Prefix("0.0.0.0/0"), null, "rmnet0");
Lorenzo Colitti05805982013-03-08 11:30:39 -0800107 assertTrue(ipv4Default.matches(Address("255.255.255.255")));
108 assertTrue(ipv4Default.matches(Address("192.0.2.1")));
109 assertFalse(ipv4Default.matches(Address("2001:db8::f00")));
110 }
111
112 private void assertAreEqual(Object o1, Object o2) {
113 assertTrue(o1.equals(o2));
114 assertTrue(o2.equals(o1));
115 }
116
117 private void assertAreNotEqual(Object o1, Object o2) {
118 assertFalse(o1.equals(o2));
119 assertFalse(o2.equals(o1));
120 }
121
122 public void testEquals() {
123 // IPv4
124 RouteInfo r1 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "wlan0");
125 RouteInfo r2 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "wlan0");
126 assertAreEqual(r1, r2);
127
128 RouteInfo r3 = new RouteInfo(Prefix("2001:db8:ace::/49"), Address("2001:db8::1"), "wlan0");
129 RouteInfo r4 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::2"), "wlan0");
130 RouteInfo r5 = new RouteInfo(Prefix("2001:db8:ace::/48"), Address("2001:db8::1"), "rmnet0");
131 assertAreNotEqual(r1, r3);
132 assertAreNotEqual(r1, r4);
133 assertAreNotEqual(r1, r5);
134
135 // IPv6
136 r1 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "wlan0");
137 r2 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "wlan0");
138 assertAreEqual(r1, r2);
139
140 r3 = new RouteInfo(Prefix("192.0.2.0/24"), Address("192.0.2.1"), "wlan0");
141 r4 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.2"), "wlan0");
142 r5 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), "rmnet0");
143 assertAreNotEqual(r1, r3);
144 assertAreNotEqual(r1, r4);
145 assertAreNotEqual(r1, r5);
146
147 // Interfaces (but not destinations or gateways) can be null.
148 r1 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), null);
149 r2 = new RouteInfo(Prefix("192.0.2.0/25"), Address("192.0.2.1"), null);
150 r3 = new RouteInfo(Prefix("192.0.2.0/24"), Address("192.0.2.1"), "wlan0");
151 assertAreEqual(r1, r2);
152 assertAreNotEqual(r1, r3);
153 }
154
Lorenzo Colitti1b72e052014-06-23 21:27:53 +0900155 public void testHostAndDefaultRoutes() {
Rubin Xu1c19cf32019-01-08 22:03:26 +0000156 RouteInfo r;
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900157
Rubin Xu1c19cf32019-01-08 22:03:26 +0000158 r = new RouteInfo(Prefix("0.0.0.0/0"), Address("0.0.0.0"), "wlan0");
159 assertFalse(r.isHostRoute());
160 assertTrue(r.isDefaultRoute());
161 assertTrue(r.isIPv4Default());
162 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900163
Rubin Xu1c19cf32019-01-08 22:03:26 +0000164 r = new RouteInfo(Prefix("::/0"), Address("::"), "wlan0");
165 assertFalse(r.isHostRoute());
166 assertTrue(r.isDefaultRoute());
167 assertFalse(r.isIPv4Default());
168 assertTrue(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900169
Rubin Xu1c19cf32019-01-08 22:03:26 +0000170 r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0");
171 assertFalse(r.isHostRoute());
172 assertFalse(r.isDefaultRoute());
173 assertFalse(r.isIPv4Default());
174 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900175
Rubin Xu1c19cf32019-01-08 22:03:26 +0000176 r = new RouteInfo(Prefix("2001:db8::/48"), null, "wlan0");
177 assertFalse(r.isHostRoute());
178 assertFalse(r.isDefaultRoute());
179 assertFalse(r.isIPv4Default());
180 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900181
Rubin Xu1c19cf32019-01-08 22:03:26 +0000182 r = new RouteInfo(Prefix("192.0.2.0/32"), Address("0.0.0.0"), "wlan0");
183 assertTrue(r.isHostRoute());
184 assertFalse(r.isDefaultRoute());
185 assertFalse(r.isIPv4Default());
186 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900187
Rubin Xu1c19cf32019-01-08 22:03:26 +0000188 r = new RouteInfo(Prefix("2001:db8::/128"), Address("::"), "wlan0");
189 assertTrue(r.isHostRoute());
190 assertFalse(r.isDefaultRoute());
191 assertFalse(r.isIPv4Default());
192 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900193
Rubin Xu1c19cf32019-01-08 22:03:26 +0000194 r = new RouteInfo(Prefix("192.0.2.0/32"), null, "wlan0");
195 assertTrue(r.isHostRoute());
196 assertFalse(r.isDefaultRoute());
197 assertFalse(r.isIPv4Default());
198 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900199
Rubin Xu1c19cf32019-01-08 22:03:26 +0000200 r = new RouteInfo(Prefix("2001:db8::/128"), null, "wlan0");
201 assertTrue(r.isHostRoute());
202 assertFalse(r.isDefaultRoute());
203 assertFalse(r.isIPv4Default());
204 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900205
Rubin Xu1c19cf32019-01-08 22:03:26 +0000206 r = new RouteInfo(Prefix("::/128"), Address("fe80::"), "wlan0");
207 assertTrue(r.isHostRoute());
208 assertFalse(r.isDefaultRoute());
209 assertFalse(r.isIPv4Default());
210 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900211
Rubin Xu1c19cf32019-01-08 22:03:26 +0000212 r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0");
213 assertTrue(r.isHostRoute());
214 assertFalse(r.isDefaultRoute());
215 assertFalse(r.isIPv4Default());
216 assertFalse(r.isIPv6Default());
217
218 r = new RouteInfo(Prefix("0.0.0.0/32"), Address("192.0.2.1"), "wlan0");
219 assertTrue(r.isHostRoute());
220 assertFalse(r.isDefaultRoute());
221 assertFalse(r.isIPv4Default());
222 assertFalse(r.isIPv6Default());
223
224 r = new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE);
225 assertFalse(r.isHostRoute());
226 assertFalse(r.isDefaultRoute());
227 assertFalse(r.isIPv4Default());
228 assertFalse(r.isIPv6Default());
229
230 r = new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE);
231 assertFalse(r.isHostRoute());
232 assertFalse(r.isDefaultRoute());
233 assertFalse(r.isIPv4Default());
234 assertFalse(r.isIPv6Default());
Lorenzo Colitticdc56fe2013-03-27 13:07:18 +0900235 }
236
Lorenzo Colitti4a0ff022014-08-12 12:37:50 +0900237 public void testTruncation() {
238 LinkAddress l;
239 RouteInfo r;
240
241 l = new LinkAddress("192.0.2.5/30");
242 r = new RouteInfo(l, Address("192.0.2.1"), "wlan0");
243 assertEquals("192.0.2.4", r.getDestination().getAddress().getHostAddress());
244
245 l = new LinkAddress("2001:db8:1:f::5/63");
246 r = new RouteInfo(l, Address("2001:db8:5::1"), "wlan0");
247 assertEquals("2001:db8:1:e::", r.getDestination().getAddress().getHostAddress());
248 }
249
250 // Make sure that creating routes to multicast addresses doesn't throw an exception. Even though
251 // there's nothing we can do with them, we don't want to crash if, e.g., someone calls
252 // requestRouteToHostAddress("230.0.0.0", MOBILE_HIPRI);
253 public void testMulticastRoute() {
254 RouteInfo r;
255 r = new RouteInfo(Prefix("230.0.0.0/32"), Address("192.0.2.1"), "wlan0");
256 r = new RouteInfo(Prefix("ff02::1/128"), Address("2001:db8::1"), "wlan0");
257 // No exceptions? Good.
258 }
259
Lorenzo Colitti05805982013-03-08 11:30:39 -0800260 public RouteInfo passThroughParcel(RouteInfo r) {
261 Parcel p = Parcel.obtain();
262 RouteInfo r2 = null;
263 try {
264 r.writeToParcel(p, 0);
265 p.setDataPosition(0);
266 r2 = RouteInfo.CREATOR.createFromParcel(p);
267 } finally {
268 p.recycle();
269 }
270 assertNotNull(r2);
271 return r2;
272 }
273
274 public void assertParcelingIsLossless(RouteInfo r) {
275 RouteInfo r2 = passThroughParcel(r);
276 assertEquals(r, r2);
277 }
278
279 public void testParceling() {
280 RouteInfo r;
281
282 r = new RouteInfo(Prefix("::/0"), Address("2001:db8::"), null);
283 assertParcelingIsLossless(r);
284
285 r = new RouteInfo(Prefix("192.0.2.0/24"), null, "wlan0");
286 assertParcelingIsLossless(r);
287 }
288}