blob: 417729150be8fdb212d5e701a18963d55489dbdb [file] [log] [blame]
John Wang3e567d52011-04-04 12:35:42 -07001/*
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
Hugo Benichi87d306b2017-10-12 09:54:49 +090019import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertFalse;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090021import static org.junit.Assert.assertNull;
Hugo Benichi87d306b2017-10-12 09:54:49 +090022import static org.junit.Assert.assertTrue;
23import static org.junit.Assert.fail;
24
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010025import android.net.LinkProperties.CompareResult;
Erik Kline04612b02015-05-21 16:15:02 +090026import android.net.LinkProperties.ProvisioningChange;
Elliott Hughes8732b352014-04-28 11:11:32 -070027import android.system.OsConstants;
Rubin Xuffd77d82017-09-05 18:40:49 +010028import android.util.ArraySet;
29
Brett Chabot147f6cf2019-03-04 14:14:56 -080030import androidx.test.filters.SmallTest;
31import androidx.test.runner.AndroidJUnit4;
32
markchiene5591ce2018-12-27 22:49:51 +080033import com.android.internal.util.TestUtils;
34
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090035import org.junit.Test;
36import org.junit.runner.RunWith;
37
John Wang3e567d52011-04-04 12:35:42 -070038import java.net.InetAddress;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010039import java.util.ArrayList;
Rubin Xuffd77d82017-09-05 18:40:49 +010040import java.util.Arrays;
41import java.util.Collection;
42import java.util.Collections;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010043import java.util.List;
Rubin Xuffd77d82017-09-05 18:40:49 +010044import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070045
Hugo Benichi87d306b2017-10-12 09:54:49 +090046@RunWith(AndroidJUnit4.class)
47@SmallTest
48public class LinkPropertiesTest {
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +090049 private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
50 private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
51 "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
52 private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
53 private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
Erik Kline8b023072014-10-24 21:50:20 +090054 private static InetAddress DNS6 = NetworkUtils.numericToInetAddress("2001:4860:4860::8888");
Hongshike2d7cf52018-06-28 20:42:19 +090055 private static InetAddress PCSCFV6 = NetworkUtils.numericToInetAddress(
56 "2001:0db8:85a3:0000:0000:8a2e:0370:1");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +090057 private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
58 private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
Erik Kline04612b02015-05-21 16:15:02 +090059 private static InetAddress GATEWAY61 = NetworkUtils.numericToInetAddress("fe80::6:0000:613");
60 private static InetAddress GATEWAY62 = NetworkUtils.numericToInetAddress("fe80::6:2222");
John Wang3e567d52011-04-04 12:35:42 -070061 private static String NAME = "qmi0";
sy.yun4aa73922013-09-02 05:24:09 +090062 private static int MTU = 1500;
John Wang3e567d52011-04-04 12:35:42 -070063
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +090064 private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
65 private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
Lorenzo Colittifc854692014-06-23 22:33:43 +090066 private static LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +090067
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +090068 // TODO: replace all calls to NetworkUtils.numericToInetAddress with calls to this method.
69 private InetAddress Address(String addrString) {
70 return NetworkUtils.numericToInetAddress(addrString);
71 }
72
Lorenzo Colitti89218e52013-04-01 10:47:43 +090073 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
74 // Check implementation of equals(), element by element.
75 assertTrue(source.isIdenticalInterfaceName(target));
76 assertTrue(target.isIdenticalInterfaceName(source));
77
78 assertTrue(source.isIdenticalAddresses(target));
79 assertTrue(target.isIdenticalAddresses(source));
80
81 assertTrue(source.isIdenticalDnses(target));
82 assertTrue(target.isIdenticalDnses(source));
83
dalyk7643abc2018-01-17 14:20:55 -050084 assertTrue(source.isIdenticalPrivateDns(target));
85 assertTrue(target.isIdenticalPrivateDns(source));
86
Chalard Jean299d8562018-04-11 16:36:41 +090087 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
88 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
89
Hongshike2d7cf52018-06-28 20:42:19 +090090 assertTrue(source.isIdenticalPcscfs(target));
91 assertTrue(target.isIdenticalPcscfs(source));
92
Lorenzo Colitti89218e52013-04-01 10:47:43 +090093 assertTrue(source.isIdenticalRoutes(target));
94 assertTrue(target.isIdenticalRoutes(source));
95
96 assertTrue(source.isIdenticalHttpProxy(target));
97 assertTrue(target.isIdenticalHttpProxy(source));
98
99 assertTrue(source.isIdenticalStackedLinks(target));
100 assertTrue(target.isIdenticalStackedLinks(source));
101
sy.yun4aa73922013-09-02 05:24:09 +0900102 assertTrue(source.isIdenticalMtu(target));
103 assertTrue(target.isIdenticalMtu(source));
104
dalyk7643abc2018-01-17 14:20:55 -0500105 assertTrue(source.isIdenticalTcpBufferSizes(target));
106 assertTrue(target.isIdenticalTcpBufferSizes(source));
107
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900108 // Check result of equals().
109 assertTrue(source.equals(target));
110 assertTrue(target.equals(source));
111
112 // Check hashCode.
113 assertEquals(source.hashCode(), target.hashCode());
114 }
115
Hugo Benichi87d306b2017-10-12 09:54:49 +0900116 @Test
John Wang3e567d52011-04-04 12:35:42 -0700117 public void testEqualsNull() {
118 LinkProperties source = new LinkProperties();
119 LinkProperties target = new LinkProperties();
120
121 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900122 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700123 }
124
Hugo Benichi87d306b2017-10-12 09:54:49 +0900125 @Test
126 public void testEqualsSameOrder() throws Exception {
127 LinkProperties source = new LinkProperties();
128 source.setInterfaceName(NAME);
129 // set 2 link addresses
130 source.addLinkAddress(LINKADDRV4);
131 source.addLinkAddress(LINKADDRV6);
132 // set 2 dnses
133 source.addDnsServer(DNS1);
134 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900135 // set 1 pcscf
136 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900137 // set 2 gateways
138 source.addRoute(new RouteInfo(GATEWAY1));
139 source.addRoute(new RouteInfo(GATEWAY2));
140 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700141
Hugo Benichi87d306b2017-10-12 09:54:49 +0900142 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700143
Hugo Benichi87d306b2017-10-12 09:54:49 +0900144 // All fields are same
145 target.setInterfaceName(NAME);
146 target.addLinkAddress(LINKADDRV4);
147 target.addLinkAddress(LINKADDRV6);
148 target.addDnsServer(DNS1);
149 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900150 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900151 target.addRoute(new RouteInfo(GATEWAY1));
152 target.addRoute(new RouteInfo(GATEWAY2));
153 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700154
Hugo Benichi87d306b2017-10-12 09:54:49 +0900155 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700156
Hugo Benichi87d306b2017-10-12 09:54:49 +0900157 target.clear();
158 // change Interface Name
159 target.setInterfaceName("qmi1");
160 target.addLinkAddress(LINKADDRV4);
161 target.addLinkAddress(LINKADDRV6);
162 target.addDnsServer(DNS1);
163 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900164 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900165 target.addRoute(new RouteInfo(GATEWAY1));
166 target.addRoute(new RouteInfo(GATEWAY2));
167 target.setMtu(MTU);
168 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700169
Hugo Benichi87d306b2017-10-12 09:54:49 +0900170 target.clear();
171 target.setInterfaceName(NAME);
172 // change link addresses
173 target.addLinkAddress(new LinkAddress(
174 NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
175 target.addLinkAddress(LINKADDRV6);
176 target.addDnsServer(DNS1);
177 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900178 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900179 target.addRoute(new RouteInfo(GATEWAY1));
180 target.addRoute(new RouteInfo(GATEWAY2));
181 target.setMtu(MTU);
182 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700183
Hugo Benichi87d306b2017-10-12 09:54:49 +0900184 target.clear();
185 target.setInterfaceName(NAME);
186 target.addLinkAddress(LINKADDRV4);
187 target.addLinkAddress(LINKADDRV6);
188 // change dnses
189 target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
190 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900191 target.addPcscfServer(PCSCFV6);
192 target.addRoute(new RouteInfo(GATEWAY1));
193 target.addRoute(new RouteInfo(GATEWAY2));
194 target.setMtu(MTU);
195 assertFalse(source.equals(target));
196
197 target.clear();
198 target.setInterfaceName(NAME);
199 target.addLinkAddress(LINKADDRV4);
200 target.addLinkAddress(LINKADDRV6);
201 target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
202 target.addDnsServer(DNS2);
203 // change pcscf
204 target.addPcscfServer(NetworkUtils.numericToInetAddress(
205 "2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900206 target.addRoute(new RouteInfo(GATEWAY1));
207 target.addRoute(new RouteInfo(GATEWAY2));
208 target.setMtu(MTU);
209 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700210
Hugo Benichi87d306b2017-10-12 09:54:49 +0900211 target.clear();
212 target.setInterfaceName(NAME);
213 target.addLinkAddress(LINKADDRV4);
214 target.addLinkAddress(LINKADDRV6);
215 target.addDnsServer(DNS1);
216 target.addDnsServer(DNS2);
217 // change gateway
218 target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2")));
219 target.addRoute(new RouteInfo(GATEWAY2));
220 target.setMtu(MTU);
221 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900222
Hugo Benichi87d306b2017-10-12 09:54:49 +0900223 target.clear();
224 target.setInterfaceName(NAME);
225 target.addLinkAddress(LINKADDRV4);
226 target.addLinkAddress(LINKADDRV6);
227 target.addDnsServer(DNS1);
228 target.addDnsServer(DNS2);
229 target.addRoute(new RouteInfo(GATEWAY1));
230 target.addRoute(new RouteInfo(GATEWAY2));
231 // change mtu
232 target.setMtu(1440);
233 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700234 }
235
Hugo Benichi87d306b2017-10-12 09:54:49 +0900236 @Test
237 public void testEqualsDifferentOrder() throws Exception {
238 LinkProperties source = new LinkProperties();
239 source.setInterfaceName(NAME);
240 // set 2 link addresses
241 source.addLinkAddress(LINKADDRV4);
242 source.addLinkAddress(LINKADDRV6);
243 // set 2 dnses
244 source.addDnsServer(DNS1);
245 source.addDnsServer(DNS2);
246 // set 2 gateways
247 source.addRoute(new RouteInfo(GATEWAY1));
248 source.addRoute(new RouteInfo(GATEWAY2));
249 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700250
Hugo Benichi87d306b2017-10-12 09:54:49 +0900251 LinkProperties target = new LinkProperties();
252 // Exchange order
253 target.setInterfaceName(NAME);
254 target.addLinkAddress(LINKADDRV6);
255 target.addLinkAddress(LINKADDRV4);
256 target.addDnsServer(DNS2);
257 target.addDnsServer(DNS1);
258 target.addRoute(new RouteInfo(GATEWAY2));
259 target.addRoute(new RouteInfo(GATEWAY1));
260 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700261
Hugo Benichi87d306b2017-10-12 09:54:49 +0900262 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700263 }
264
Hugo Benichi87d306b2017-10-12 09:54:49 +0900265 @Test
266 public void testEqualsDuplicated() throws Exception {
267 LinkProperties source = new LinkProperties();
268 // set 3 link addresses, eg, [A, A, B]
269 source.addLinkAddress(LINKADDRV4);
270 source.addLinkAddress(LINKADDRV4);
271 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700272
Hugo Benichi87d306b2017-10-12 09:54:49 +0900273 LinkProperties target = new LinkProperties();
274 // set 3 link addresses, eg, [A, B, B]
275 target.addLinkAddress(LINKADDRV4);
276 target.addLinkAddress(LINKADDRV6);
277 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700278
Hugo Benichi87d306b2017-10-12 09:54:49 +0900279 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700280 }
281
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800282 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
283 for (RouteInfo r : lp.getRoutes()) {
284 assertEquals(iface, r.getInterface());
285 }
286 }
287
Hugo Benichi87d306b2017-10-12 09:54:49 +0900288 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800289 public void testRouteInterfaces() {
290 LinkAddress prefix = new LinkAddress(
291 NetworkUtils.numericToInetAddress("2001:db8::"), 32);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900292 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800293
294 // Add a route with no interface to a LinkProperties with no interface. No errors.
295 LinkProperties lp = new LinkProperties();
296 RouteInfo r = new RouteInfo(prefix, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900297 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800298 assertEquals(1, lp.getRoutes().size());
299 assertAllRoutesHaveInterface(null, lp);
300
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900301 // Adding the same route twice has no effect.
302 assertFalse(lp.addRoute(r));
303 assertEquals(1, lp.getRoutes().size());
304
305 // Add a route with an interface. Expect an exception.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800306 r = new RouteInfo(prefix, address, "wlan0");
307 try {
308 lp.addRoute(r);
309 fail("Adding wlan0 route to LP with no interface, expect exception");
310 } catch (IllegalArgumentException expected) {}
311
312 // Change the interface name. All the routes should change their interface name too.
313 lp.setInterfaceName("rmnet0");
314 assertAllRoutesHaveInterface("rmnet0", lp);
315
316 // Now add a route with the wrong interface. This causes an exception too.
317 try {
318 lp.addRoute(r);
319 fail("Adding wlan0 route to rmnet0 LP, expect exception");
320 } catch (IllegalArgumentException expected) {}
321
322 // If the interface name matches, the route is added.
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900323 r = new RouteInfo(prefix, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800324 lp.setInterfaceName("wlan0");
325 lp.addRoute(r);
326 assertEquals(2, lp.getRoutes().size());
327 assertAllRoutesHaveInterface("wlan0", lp);
328
329 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900330 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800331 lp.addRoute(r);
332 assertEquals(3, lp.getRoutes().size());
333 assertAllRoutesHaveInterface("wlan0", lp);
334
335 // Check comparisons work.
336 LinkProperties lp2 = new LinkProperties(lp);
337 assertAllRoutesHaveInterface("wlan0", lp);
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900338 assertEquals(0, lp.compareAllRoutes(lp2).added.size());
339 assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800340
341 lp2.setInterfaceName("p2p0");
342 assertAllRoutesHaveInterface("p2p0", lp2);
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900343 assertEquals(3, lp.compareAllRoutes(lp2).added.size());
344 assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900345 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800346
Hugo Benichi87d306b2017-10-12 09:54:49 +0900347 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800348 public void testStackedInterfaces() {
349 LinkProperties rmnet0 = new LinkProperties();
350 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900351 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800352
353 LinkProperties clat4 = new LinkProperties();
354 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900355 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800356
357 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900358 assertEquals(1, rmnet0.getAddresses().size());
359 assertEquals(1, rmnet0.getLinkAddresses().size());
360 assertEquals(1, rmnet0.getAllAddresses().size());
361 assertEquals(1, rmnet0.getAllLinkAddresses().size());
362
Lorenzo Colittic0803122013-03-07 10:59:25 -0800363 rmnet0.addStackedLink(clat4);
364 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900365 assertEquals(1, rmnet0.getAddresses().size());
366 assertEquals(1, rmnet0.getLinkAddresses().size());
367 assertEquals(2, rmnet0.getAllAddresses().size());
368 assertEquals(2, rmnet0.getAllLinkAddresses().size());
369
Lorenzo Colittic0803122013-03-07 10:59:25 -0800370 rmnet0.addStackedLink(clat4);
371 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900372 assertEquals(1, rmnet0.getAddresses().size());
373 assertEquals(1, rmnet0.getLinkAddresses().size());
374 assertEquals(2, rmnet0.getAllAddresses().size());
375 assertEquals(2, rmnet0.getAllLinkAddresses().size());
376
Lorenzo Colittic0803122013-03-07 10:59:25 -0800377 assertEquals(0, clat4.getStackedLinks().size());
378
379 // Modify an item in the returned collection to see what happens.
380 for (LinkProperties link : rmnet0.getStackedLinks()) {
381 if (link.getInterfaceName().equals("clat4")) {
382 link.setInterfaceName("newname");
383 }
384 }
385 for (LinkProperties link : rmnet0.getStackedLinks()) {
386 assertFalse("newname".equals(link.getInterfaceName()));
387 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900388
Lorenzo Colitti38258432014-10-20 11:08:03 +0900389 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900390 assertEquals(0, rmnet0.getStackedLinks().size());
391 assertEquals(1, rmnet0.getAddresses().size());
392 assertEquals(1, rmnet0.getLinkAddresses().size());
393 assertEquals(1, rmnet0.getAllAddresses().size());
394 assertEquals(1, rmnet0.getAllLinkAddresses().size());
395
Lorenzo Colitti38258432014-10-20 11:08:03 +0900396 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900397 }
398
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900399 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
400 return lp.getLinkAddresses().iterator().next();
401 }
402
Hugo Benichi87d306b2017-10-12 09:54:49 +0900403 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900404 public void testAddressMethods() {
405 LinkProperties lp = new LinkProperties();
406
407 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800408 assertFalse(lp.hasIpv4Address());
409 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900410
411 // Addresses on stacked links don't count.
412 LinkProperties stacked = new LinkProperties();
413 stacked.setInterfaceName("stacked");
414 lp.addStackedLink(stacked);
415 stacked.addLinkAddress(LINKADDRV4);
416 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800417 assertTrue(stacked.hasIpv4Address());
418 assertTrue(stacked.hasGlobalIpv6Address());
419 assertFalse(lp.hasIpv4Address());
420 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900421 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800422 assertFalse(lp.hasIpv4Address());
423 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900424
425 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800426 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900427 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900428 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900429 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900430 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800431 assertFalse(lp.hasIpv4Address());
432 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900433
434 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900435 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900436
Lorenzo Colittifc854692014-06-23 22:33:43 +0900437 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
438 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800439 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900440
441 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900442 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800443 assertTrue(lp.hasIpv4Address());
444 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900445
446 assertTrue(lp.addLinkAddress(LINKADDRV6));
447 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800448 assertTrue(lp.hasIpv4Address());
449 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900450
451 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
452 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800453 assertTrue(lp.hasIpv4Address());
454 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900455
456 // Adding an address twice has no effect.
457 // Removing an address that's not present has no effect.
458 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900459 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800460 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900461 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900462 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800463 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900464 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900465 assertEquals(1, lp.getLinkAddresses().size());
466
467 // Adding an address that's already present but with different properties causes the
468 // existing address to be updated and returns true.
469 // Start with only LINKADDRV6.
470 assertEquals(1, lp.getLinkAddresses().size());
471 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
472
473 // Create a LinkAddress object for the same address, but with different flags.
474 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
475 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
476 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
477 assertFalse(deprecated.equals(LINKADDRV6));
478
479 // Check that adding it updates the existing address instead of adding a new one.
480 assertTrue(lp.addLinkAddress(deprecated));
481 assertEquals(1, lp.getLinkAddresses().size());
482 assertEquals(deprecated, getFirstLinkAddress(lp));
483 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
484
485 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
486 assertTrue(lp.removeLinkAddress(LINKADDRV6));
487 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800488 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900489
Hugo Benichi87d306b2017-10-12 09:54:49 +0900490 @Test
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900491 public void testSetLinkAddresses() {
492 LinkProperties lp = new LinkProperties();
493 lp.addLinkAddress(LINKADDRV4);
494 lp.addLinkAddress(LINKADDRV6);
495
496 LinkProperties lp2 = new LinkProperties();
497 lp2.addLinkAddress(LINKADDRV6);
498
499 assertFalse(lp.equals(lp2));
500
501 lp2.setLinkAddresses(lp.getLinkAddresses());
502 assertTrue(lp.equals(lp));
503 }
Erik Kline8b023072014-10-24 21:50:20 +0900504
Hugo Benichi87d306b2017-10-12 09:54:49 +0900505 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900506 public void testNat64Prefix() throws Exception {
507 LinkProperties lp = new LinkProperties();
508 lp.addLinkAddress(LINKADDRV4);
509 lp.addLinkAddress(LINKADDRV6);
510
511 assertNull(lp.getNat64Prefix());
512
513 IpPrefix p = new IpPrefix("64:ff9b::/96");
514 lp.setNat64Prefix(p);
515 assertEquals(p, lp.getNat64Prefix());
516
517 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
518 lp.setNat64Prefix(p);
519 assertEquals(p, lp.getNat64Prefix());
520
521 p = new IpPrefix("2001:db8:a:b:1:2::/80");
522 try {
523 lp.setNat64Prefix(p);
524 } catch (IllegalArgumentException expected) {
525 }
526
527 p = new IpPrefix("64:ff9b::/64");
528 try {
529 lp.setNat64Prefix(p);
530 } catch (IllegalArgumentException expected) {
531 }
532
533 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
534
535 lp.setNat64Prefix(null);
536 assertNull(lp.getNat64Prefix());
537 }
538
539 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900540 public void testIsProvisioned() {
541 LinkProperties lp4 = new LinkProperties();
542 assertFalse("v4only:empty", lp4.isProvisioned());
543 lp4.addLinkAddress(LINKADDRV4);
544 assertFalse("v4only:addr-only", lp4.isProvisioned());
545 lp4.addDnsServer(DNS1);
546 assertFalse("v4only:addr+dns", lp4.isProvisioned());
547 lp4.addRoute(new RouteInfo(GATEWAY1));
548 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800549 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
550 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900551
552 LinkProperties lp6 = new LinkProperties();
553 assertFalse("v6only:empty", lp6.isProvisioned());
554 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
555 assertFalse("v6only:fe80-only", lp6.isProvisioned());
556 lp6.addDnsServer(DNS6);
557 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900558 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900559 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
560 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800561 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900562 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
563 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800564 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
565 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900566 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
567
568 LinkProperties lp46 = new LinkProperties();
569 lp46.addLinkAddress(LINKADDRV4);
570 lp46.addLinkAddress(LINKADDRV6);
571 lp46.addDnsServer(DNS1);
572 lp46.addDnsServer(DNS6);
573 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
574 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800575 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
576 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900577 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900578 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800579 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
580 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900581 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
582
583 // A link with an IPv6 address and default route, but IPv4 DNS server.
584 LinkProperties mixed = new LinkProperties();
585 mixed.addLinkAddress(LINKADDRV6);
586 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900587 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800588 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
589 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900590 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
591 }
Erik Kline04612b02015-05-21 16:15:02 +0900592
Hugo Benichi87d306b2017-10-12 09:54:49 +0900593 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900594 public void testCompareProvisioning() {
595 LinkProperties v4lp = new LinkProperties();
596 v4lp.addLinkAddress(LINKADDRV4);
597 v4lp.addRoute(new RouteInfo(GATEWAY1));
598 v4lp.addDnsServer(DNS1);
599 assertTrue(v4lp.isProvisioned());
600
601 LinkProperties v4r = new LinkProperties(v4lp);
602 v4r.removeDnsServer(DNS1);
603 assertFalse(v4r.isProvisioned());
604
605 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
606 LinkProperties.compareProvisioning(v4r, v4r));
607 assertEquals(ProvisioningChange.LOST_PROVISIONING,
608 LinkProperties.compareProvisioning(v4lp, v4r));
609 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
610 LinkProperties.compareProvisioning(v4r, v4lp));
611 assertEquals(ProvisioningChange.STILL_PROVISIONED,
612 LinkProperties.compareProvisioning(v4lp, v4lp));
613
614 // Check that losing IPv4 provisioning on a dualstack network is
615 // seen as a total loss of provisioning.
616 LinkProperties v6lp = new LinkProperties();
617 v6lp.addLinkAddress(LINKADDRV6);
618 v6lp.addRoute(new RouteInfo(GATEWAY61));
619 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800620 assertFalse(v6lp.isIpv4Provisioned());
621 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900622 assertTrue(v6lp.isProvisioned());
623
624 LinkProperties v46lp = new LinkProperties(v6lp);
625 v46lp.addLinkAddress(LINKADDRV4);
626 v46lp.addRoute(new RouteInfo(GATEWAY1));
627 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800628 assertTrue(v46lp.isIpv4Provisioned());
629 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900630 assertTrue(v46lp.isProvisioned());
631
632 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900633 LinkProperties.compareProvisioning(v4lp, v46lp));
634 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900635 LinkProperties.compareProvisioning(v6lp, v46lp));
636 assertEquals(ProvisioningChange.LOST_PROVISIONING,
637 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900638 assertEquals(ProvisioningChange.LOST_PROVISIONING,
639 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900640
641 // Check that losing and gaining a secondary router does not change
642 // the provisioning status.
643 LinkProperties v6lp2 = new LinkProperties(v6lp);
644 v6lp2.addRoute(new RouteInfo(GATEWAY62));
645 assertTrue(v6lp2.isProvisioned());
646
647 assertEquals(ProvisioningChange.STILL_PROVISIONED,
648 LinkProperties.compareProvisioning(v6lp2, v6lp));
649 assertEquals(ProvisioningChange.STILL_PROVISIONED,
650 LinkProperties.compareProvisioning(v6lp, v6lp2));
651 }
Erik Klinea923dba2015-06-26 19:21:34 +0900652
Hugo Benichi87d306b2017-10-12 09:54:49 +0900653 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900654 public void testIsReachable() {
655 final LinkProperties v4lp = new LinkProperties();
656 assertFalse(v4lp.isReachable(DNS1));
657 assertFalse(v4lp.isReachable(DNS2));
658
659 // Add an on-link route, making the on-link DNS server reachable,
660 // but there is still no IPv4 address.
661 assertTrue(v4lp.addRoute(new RouteInfo(
662 new IpPrefix(NetworkUtils.numericToInetAddress("75.208.0.0"), 16))));
663 assertFalse(v4lp.isReachable(DNS1));
664 assertFalse(v4lp.isReachable(DNS2));
665
666 // Adding an IPv4 address (right now, any IPv4 address) means we use
667 // the routes to compute likely reachability.
668 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
669 assertTrue(v4lp.isReachable(DNS1));
670 assertFalse(v4lp.isReachable(DNS2));
671
672 // Adding a default route makes the off-link DNS server reachable.
673 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
674 assertTrue(v4lp.isReachable(DNS1));
675 assertTrue(v4lp.isReachable(DNS2));
676
677 final LinkProperties v6lp = new LinkProperties();
678 final InetAddress kLinkLocalDns = NetworkUtils.numericToInetAddress("fe80::6:1");
679 final InetAddress kLinkLocalDnsWithScope = NetworkUtils.numericToInetAddress("fe80::6:2%43");
680 final InetAddress kOnLinkDns = NetworkUtils.numericToInetAddress("2001:db8:85a3::53");
681 assertFalse(v6lp.isReachable(kLinkLocalDns));
682 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
683 assertFalse(v6lp.isReachable(kOnLinkDns));
684 assertFalse(v6lp.isReachable(DNS6));
685
686 // Add a link-local route, making the link-local DNS servers reachable. Because
687 // we assume the presence of an IPv6 link-local address, link-local DNS servers
688 // are considered reachable, but only those with a non-zero scope identifier.
689 assertTrue(v6lp.addRoute(new RouteInfo(
690 new IpPrefix(NetworkUtils.numericToInetAddress("fe80::"), 64))));
691 assertFalse(v6lp.isReachable(kLinkLocalDns));
692 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
693 assertFalse(v6lp.isReachable(kOnLinkDns));
694 assertFalse(v6lp.isReachable(DNS6));
695
696 // Add a link-local address--nothing changes.
697 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
698 assertFalse(v6lp.isReachable(kLinkLocalDns));
699 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
700 assertFalse(v6lp.isReachable(kOnLinkDns));
701 assertFalse(v6lp.isReachable(DNS6));
702
703 // Add a global route on link, but no global address yet. DNS servers reachable
704 // via a route that doesn't require a gateway: give them the benefit of the
705 // doubt and hope the link-local source address suffices for communication.
706 assertTrue(v6lp.addRoute(new RouteInfo(
707 new IpPrefix(NetworkUtils.numericToInetAddress("2001:db8:85a3::"), 64))));
708 assertFalse(v6lp.isReachable(kLinkLocalDns));
709 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
710 assertTrue(v6lp.isReachable(kOnLinkDns));
711 assertFalse(v6lp.isReachable(DNS6));
712
713 // Add a global address; the on-link global address DNS server is (still)
714 // presumed reachable.
715 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
716 assertFalse(v6lp.isReachable(kLinkLocalDns));
717 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
718 assertTrue(v6lp.isReachable(kOnLinkDns));
719 assertFalse(v6lp.isReachable(DNS6));
720
721 // Adding a default route makes the off-link DNS server reachable.
722 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
723 assertFalse(v6lp.isReachable(kLinkLocalDns));
724 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
725 assertTrue(v6lp.isReachable(kOnLinkDns));
726 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900727
728 // Check isReachable on stacked links. This requires that the source IP address be assigned
729 // on the interface returned by the route lookup.
730 LinkProperties stacked = new LinkProperties();
731
732 // Can't add a stacked link without an interface name.
733 stacked.setInterfaceName("v4-test0");
734 v6lp.addStackedLink(stacked);
735
736 InetAddress stackedAddress = Address("192.0.0.4");
737 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
738 assertFalse(v6lp.isReachable(stackedAddress));
739 stacked.addLinkAddress(stackedLinkAddress);
740 assertFalse(v6lp.isReachable(stackedAddress));
741 stacked.addRoute(new RouteInfo(stackedLinkAddress));
742 assertTrue(stacked.isReachable(stackedAddress));
743 assertTrue(v6lp.isReachable(stackedAddress));
744
745 assertFalse(v6lp.isReachable(DNS1));
746 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
747 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900748 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100749
Hugo Benichi87d306b2017-10-12 09:54:49 +0900750 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100751 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
752 // IPv4 case: no route added initially
753 LinkProperties rmnet0 = new LinkProperties();
754 rmnet0.setInterfaceName("rmnet0");
755 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
756 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
757 rmnet0.getInterfaceName());
758
759 // Since no routes is added explicitly, getAllRoutes() should return empty.
760 assertTrue(rmnet0.getAllRoutes().isEmpty());
761 rmnet0.ensureDirectlyConnectedRoutes();
762 // ensureDirectlyConnectedRoutes() should have added the missing local route.
763 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
764
765 // IPv4 case: both direct and default routes added initially
766 LinkProperties rmnet1 = new LinkProperties();
767 rmnet1.setInterfaceName("rmnet1");
768 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
769 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null,
770 NetworkUtils.numericToInetAddress("10.0.0.1"), rmnet1.getInterfaceName());
771 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
772 rmnet1.getInterfaceName());
773 rmnet1.addRoute(defaultRoute1);
774 rmnet1.addRoute(directRoute1);
775
776 // Check added routes
777 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
778 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
779 // route is already part of the configuration.
780 rmnet1.ensureDirectlyConnectedRoutes();
781 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
782
783 // IPv6 case: only default routes added initially
784 LinkProperties rmnet2 = new LinkProperties();
785 rmnet2.setInterfaceName("rmnet2");
786 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
787 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
788 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null,
789 NetworkUtils.numericToInetAddress("2001:db8::1"), rmnet2.getInterfaceName());
790 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
791 rmnet2.getInterfaceName());
792 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
793 rmnet2.getInterfaceName());
794 rmnet2.addRoute(defaultRoute2);
795
796 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
797 rmnet2.ensureDirectlyConnectedRoutes();
798 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
799 rmnet2.getAllRoutes());
800
801 // Corner case: no interface name
802 LinkProperties rmnet3 = new LinkProperties();
803 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
804 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
805 rmnet3.getInterfaceName());
806
807 assertTrue(rmnet3.getAllRoutes().isEmpty());
808 rmnet3.ensureDirectlyConnectedRoutes();
809 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
810
811 }
812
Hugo Benichi87d306b2017-10-12 09:54:49 +0900813 @Test
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100814 public void testCompareResult() {
815 // Either adding or removing items
Hugo Benichi87d306b2017-10-12 09:54:49 +0900816 compareResult(Arrays.asList(1, 2, 3, 4), Arrays.asList(1),
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100817 Arrays.asList(2, 3, 4), new ArrayList<>());
Hugo Benichi87d306b2017-10-12 09:54:49 +0900818 compareResult(Arrays.asList(1, 2), Arrays.asList(3, 2, 1, 4),
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100819 new ArrayList<>(), Arrays.asList(3, 4));
820
821
822 // adding and removing items at the same time
Hugo Benichi87d306b2017-10-12 09:54:49 +0900823 compareResult(Arrays.asList(1, 2, 3, 4), Arrays.asList(2, 3, 4, 5),
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100824 Arrays.asList(1), Arrays.asList(5));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900825 compareResult(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6),
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100826 Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));
827
828 // null cases
Hugo Benichi87d306b2017-10-12 09:54:49 +0900829 compareResult(Arrays.asList(1, 2, 3), null, Arrays.asList(1, 2, 3), new ArrayList<>());
830 compareResult(null, Arrays.asList(3, 2, 1), new ArrayList<>(), Arrays.asList(1, 2, 3));
831 compareResult(null, null, new ArrayList<>(), new ArrayList<>());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100832 }
833
Rubin Xuffd77d82017-09-05 18:40:49 +0100834 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
835 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
836 Set<RouteInfo> actualSet = new ArraySet<>(actual);
837 // Duplicated entries in actual routes are considered failures
838 assertEquals(actual.size(), actualSet.size());
839
840 assertEquals(expectedSet, actualSet);
841 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100842
Hugo Benichi87d306b2017-10-12 09:54:49 +0900843 private <T> void compareResult(List<T> oldItems, List<T> newItems, List<T> expectRemoved,
Rubin Xu83012442017-09-15 11:51:39 +0100844 List<T> expectAdded) {
845 CompareResult<T> result = new CompareResult<>(oldItems, newItems);
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100846 assertEquals(new ArraySet<>(expectAdded), new ArraySet<>(result.added));
847 assertEquals(new ArraySet<>(expectRemoved), (new ArraySet<>(result.removed)));
848 }
Chalard Jean299d8562018-04-11 16:36:41 +0900849
850 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900851 public void testLinkPropertiesParcelable() throws Exception {
Chalard Jean299d8562018-04-11 16:36:41 +0900852 LinkProperties source = new LinkProperties();
853 source.setInterfaceName(NAME);
854 // set 2 link addresses
855 source.addLinkAddress(LINKADDRV4);
856 source.addLinkAddress(LINKADDRV6);
857 // set 2 dnses
858 source.addDnsServer(DNS1);
859 source.addDnsServer(DNS2);
860 // set 2 gateways
861 source.addRoute(new RouteInfo(GATEWAY1));
862 source.addRoute(new RouteInfo(GATEWAY2));
863 // set 2 validated private dnses
864 source.addValidatedPrivateDnsServer(DNS6);
865 source.addValidatedPrivateDnsServer(GATEWAY61);
866
867 source.setMtu(MTU);
868
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900869 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
870
markchiene5591ce2018-12-27 22:49:51 +0800871 TestUtils.assertParcelingIsLossless(source, LinkProperties.CREATOR);
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +0900872 }
Chalard Jean299d8562018-04-11 16:36:41 +0900873
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +0900874 @Test
875 public void testParcelUninitialized() throws Exception {
876 LinkProperties empty = new LinkProperties();
markchiene5591ce2018-12-27 22:49:51 +0800877 TestUtils.assertParcelingIsLossless(empty, LinkProperties.CREATOR);
Chalard Jean299d8562018-04-11 16:36:41 +0900878 }
John Wang3e567d52011-04-04 12:35:42 -0700879}