blob: 932fee0c19565ff2b2d0fac5216274764aab4b5e [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 Benichi39989e72017-10-12 09:54:49 +090019import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertFalse;
Lorenzo Colitti3d680282019-01-08 09:58:59 +090021import static org.junit.Assert.assertNull;
Hugo Benichi39989e72017-10-12 09:54:49 +090022import static org.junit.Assert.assertTrue;
23import static org.junit.Assert.fail;
24
Erik Kline1c8fab52015-06-26 19:21:34 +090025import android.net.IpPrefix;
26import android.net.LinkAddress;
John Wang3e567d52011-04-04 12:35:42 -070027import android.net.LinkProperties;
Rubin Xu8cb82d22017-08-22 16:35:52 +010028import android.net.LinkProperties.CompareResult;
Erik Kline0e801362015-05-21 16:15:02 +090029import android.net.LinkProperties.ProvisioningChange;
Robert Greenwalt5a901292011-04-28 14:28:50 -070030import android.net.RouteInfo;
Chalard Jeanabc68d52018-04-11 16:36:41 +090031import android.os.Parcel;
Hugo Benichi39989e72017-10-12 09:54:49 +090032import android.support.test.filters.SmallTest;
33import android.support.test.runner.AndroidJUnit4;
Elliott Hughes7ab81622014-04-28 11:11:32 -070034import android.system.OsConstants;
Rubin Xu57b437a2017-09-05 18:40:49 +010035import android.util.ArraySet;
36
Lorenzo Colitti3d680282019-01-08 09:58:59 +090037import org.junit.Test;
38import org.junit.runner.RunWith;
39
John Wang3e567d52011-04-04 12:35:42 -070040import java.net.InetAddress;
Rubin Xu8cb82d22017-08-22 16:35:52 +010041import java.util.ArrayList;
Rubin Xu57b437a2017-09-05 18:40:49 +010042import java.util.Arrays;
43import java.util.Collection;
44import java.util.Collections;
Rubin Xu8cb82d22017-08-22 16:35:52 +010045import java.util.List;
Rubin Xu57b437a2017-09-05 18:40:49 +010046import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070047
Hugo Benichi39989e72017-10-12 09:54:49 +090048@RunWith(AndroidJUnit4.class)
49@SmallTest
50public class LinkPropertiesTest {
Lorenzo Colitti34b969b2013-08-08 10:56:22 +090051 private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
52 private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
53 "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
54 private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1");
55 private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1");
Erik Klineba317782014-10-24 21:50:20 +090056 private static InetAddress DNS6 = NetworkUtils.numericToInetAddress("2001:4860:4860::8888");
Hongshik541810a2018-06-28 20:42:19 +090057 private static InetAddress PCSCFV6 = NetworkUtils.numericToInetAddress(
58 "2001:0db8:85a3:0000:0000:8a2e:0370:1");
Lorenzo Colitti34b969b2013-08-08 10:56:22 +090059 private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1");
60 private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1");
Erik Kline0e801362015-05-21 16:15:02 +090061 private static InetAddress GATEWAY61 = NetworkUtils.numericToInetAddress("fe80::6:0000:613");
62 private static InetAddress GATEWAY62 = NetworkUtils.numericToInetAddress("fe80::6:2222");
John Wang3e567d52011-04-04 12:35:42 -070063 private static String NAME = "qmi0";
sy.yun30043282013-09-02 05:24:09 +090064 private static int MTU = 1500;
John Wang3e567d52011-04-04 12:35:42 -070065
Lorenzo Colitti34b969b2013-08-08 10:56:22 +090066 private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
67 private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
Lorenzo Colittibf1b0002014-06-23 22:33:43 +090068 private static LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Lorenzo Colitti34b969b2013-08-08 10:56:22 +090069
Lorenzo Colitti319789d2015-07-30 23:41:43 +090070 // TODO: replace all calls to NetworkUtils.numericToInetAddress with calls to this method.
71 private InetAddress Address(String addrString) {
72 return NetworkUtils.numericToInetAddress(addrString);
73 }
74
Lorenzo Colittic3787fa2013-04-01 10:47:43 +090075 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
76 // Check implementation of equals(), element by element.
77 assertTrue(source.isIdenticalInterfaceName(target));
78 assertTrue(target.isIdenticalInterfaceName(source));
79
80 assertTrue(source.isIdenticalAddresses(target));
81 assertTrue(target.isIdenticalAddresses(source));
82
83 assertTrue(source.isIdenticalDnses(target));
84 assertTrue(target.isIdenticalDnses(source));
85
dalyk83b5fa22018-01-17 14:20:55 -050086 assertTrue(source.isIdenticalPrivateDns(target));
87 assertTrue(target.isIdenticalPrivateDns(source));
88
Chalard Jeanabc68d52018-04-11 16:36:41 +090089 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
90 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
91
Hongshik541810a2018-06-28 20:42:19 +090092 assertTrue(source.isIdenticalPcscfs(target));
93 assertTrue(target.isIdenticalPcscfs(source));
94
Lorenzo Colittic3787fa2013-04-01 10:47:43 +090095 assertTrue(source.isIdenticalRoutes(target));
96 assertTrue(target.isIdenticalRoutes(source));
97
98 assertTrue(source.isIdenticalHttpProxy(target));
99 assertTrue(target.isIdenticalHttpProxy(source));
100
101 assertTrue(source.isIdenticalStackedLinks(target));
102 assertTrue(target.isIdenticalStackedLinks(source));
103
sy.yun30043282013-09-02 05:24:09 +0900104 assertTrue(source.isIdenticalMtu(target));
105 assertTrue(target.isIdenticalMtu(source));
106
dalyk83b5fa22018-01-17 14:20:55 -0500107 assertTrue(source.isIdenticalTcpBufferSizes(target));
108 assertTrue(target.isIdenticalTcpBufferSizes(source));
109
Lorenzo Colittic3787fa2013-04-01 10:47:43 +0900110 // Check result of equals().
111 assertTrue(source.equals(target));
112 assertTrue(target.equals(source));
113
114 // Check hashCode.
115 assertEquals(source.hashCode(), target.hashCode());
116 }
117
Hugo Benichi39989e72017-10-12 09:54:49 +0900118 @Test
John Wang3e567d52011-04-04 12:35:42 -0700119 public void testEqualsNull() {
120 LinkProperties source = new LinkProperties();
121 LinkProperties target = new LinkProperties();
122
123 assertFalse(source == target);
Lorenzo Colittic3787fa2013-04-01 10:47:43 +0900124 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700125 }
126
Hugo Benichi39989e72017-10-12 09:54:49 +0900127 @Test
128 public void testEqualsSameOrder() throws Exception {
129 LinkProperties source = new LinkProperties();
130 source.setInterfaceName(NAME);
131 // set 2 link addresses
132 source.addLinkAddress(LINKADDRV4);
133 source.addLinkAddress(LINKADDRV6);
134 // set 2 dnses
135 source.addDnsServer(DNS1);
136 source.addDnsServer(DNS2);
Hongshik541810a2018-06-28 20:42:19 +0900137 // set 1 pcscf
138 source.addPcscfServer(PCSCFV6);
Hugo Benichi39989e72017-10-12 09:54:49 +0900139 // set 2 gateways
140 source.addRoute(new RouteInfo(GATEWAY1));
141 source.addRoute(new RouteInfo(GATEWAY2));
142 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700143
Hugo Benichi39989e72017-10-12 09:54:49 +0900144 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700145
Hugo Benichi39989e72017-10-12 09:54:49 +0900146 // All fields are same
147 target.setInterfaceName(NAME);
148 target.addLinkAddress(LINKADDRV4);
149 target.addLinkAddress(LINKADDRV6);
150 target.addDnsServer(DNS1);
151 target.addDnsServer(DNS2);
Hongshik541810a2018-06-28 20:42:19 +0900152 target.addPcscfServer(PCSCFV6);
Hugo Benichi39989e72017-10-12 09:54:49 +0900153 target.addRoute(new RouteInfo(GATEWAY1));
154 target.addRoute(new RouteInfo(GATEWAY2));
155 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700156
Hugo Benichi39989e72017-10-12 09:54:49 +0900157 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700158
Hugo Benichi39989e72017-10-12 09:54:49 +0900159 target.clear();
160 // change Interface Name
161 target.setInterfaceName("qmi1");
162 target.addLinkAddress(LINKADDRV4);
163 target.addLinkAddress(LINKADDRV6);
164 target.addDnsServer(DNS1);
165 target.addDnsServer(DNS2);
Hongshik541810a2018-06-28 20:42:19 +0900166 target.addPcscfServer(PCSCFV6);
Hugo Benichi39989e72017-10-12 09:54:49 +0900167 target.addRoute(new RouteInfo(GATEWAY1));
168 target.addRoute(new RouteInfo(GATEWAY2));
169 target.setMtu(MTU);
170 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700171
Hugo Benichi39989e72017-10-12 09:54:49 +0900172 target.clear();
173 target.setInterfaceName(NAME);
174 // change link addresses
175 target.addLinkAddress(new LinkAddress(
176 NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
177 target.addLinkAddress(LINKADDRV6);
178 target.addDnsServer(DNS1);
179 target.addDnsServer(DNS2);
Hongshik541810a2018-06-28 20:42:19 +0900180 target.addPcscfServer(PCSCFV6);
Hugo Benichi39989e72017-10-12 09:54:49 +0900181 target.addRoute(new RouteInfo(GATEWAY1));
182 target.addRoute(new RouteInfo(GATEWAY2));
183 target.setMtu(MTU);
184 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700185
Hugo Benichi39989e72017-10-12 09:54:49 +0900186 target.clear();
187 target.setInterfaceName(NAME);
188 target.addLinkAddress(LINKADDRV4);
189 target.addLinkAddress(LINKADDRV6);
190 // change dnses
191 target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
192 target.addDnsServer(DNS2);
Hongshik541810a2018-06-28 20:42:19 +0900193 target.addPcscfServer(PCSCFV6);
194 target.addRoute(new RouteInfo(GATEWAY1));
195 target.addRoute(new RouteInfo(GATEWAY2));
196 target.setMtu(MTU);
197 assertFalse(source.equals(target));
198
199 target.clear();
200 target.setInterfaceName(NAME);
201 target.addLinkAddress(LINKADDRV4);
202 target.addLinkAddress(LINKADDRV6);
203 target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2"));
204 target.addDnsServer(DNS2);
205 // change pcscf
206 target.addPcscfServer(NetworkUtils.numericToInetAddress(
207 "2001::1"));
Hugo Benichi39989e72017-10-12 09:54:49 +0900208 target.addRoute(new RouteInfo(GATEWAY1));
209 target.addRoute(new RouteInfo(GATEWAY2));
210 target.setMtu(MTU);
211 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700212
Hugo Benichi39989e72017-10-12 09:54:49 +0900213 target.clear();
214 target.setInterfaceName(NAME);
215 target.addLinkAddress(LINKADDRV4);
216 target.addLinkAddress(LINKADDRV6);
217 target.addDnsServer(DNS1);
218 target.addDnsServer(DNS2);
219 // change gateway
220 target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2")));
221 target.addRoute(new RouteInfo(GATEWAY2));
222 target.setMtu(MTU);
223 assertFalse(source.equals(target));
sy.yun30043282013-09-02 05:24:09 +0900224
Hugo Benichi39989e72017-10-12 09:54:49 +0900225 target.clear();
226 target.setInterfaceName(NAME);
227 target.addLinkAddress(LINKADDRV4);
228 target.addLinkAddress(LINKADDRV6);
229 target.addDnsServer(DNS1);
230 target.addDnsServer(DNS2);
231 target.addRoute(new RouteInfo(GATEWAY1));
232 target.addRoute(new RouteInfo(GATEWAY2));
233 // change mtu
234 target.setMtu(1440);
235 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700236 }
237
Hugo Benichi39989e72017-10-12 09:54:49 +0900238 @Test
239 public void testEqualsDifferentOrder() throws Exception {
240 LinkProperties source = new LinkProperties();
241 source.setInterfaceName(NAME);
242 // set 2 link addresses
243 source.addLinkAddress(LINKADDRV4);
244 source.addLinkAddress(LINKADDRV6);
245 // set 2 dnses
246 source.addDnsServer(DNS1);
247 source.addDnsServer(DNS2);
248 // set 2 gateways
249 source.addRoute(new RouteInfo(GATEWAY1));
250 source.addRoute(new RouteInfo(GATEWAY2));
251 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700252
Hugo Benichi39989e72017-10-12 09:54:49 +0900253 LinkProperties target = new LinkProperties();
254 // Exchange order
255 target.setInterfaceName(NAME);
256 target.addLinkAddress(LINKADDRV6);
257 target.addLinkAddress(LINKADDRV4);
258 target.addDnsServer(DNS2);
259 target.addDnsServer(DNS1);
260 target.addRoute(new RouteInfo(GATEWAY2));
261 target.addRoute(new RouteInfo(GATEWAY1));
262 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700263
Hugo Benichi39989e72017-10-12 09:54:49 +0900264 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700265 }
266
Hugo Benichi39989e72017-10-12 09:54:49 +0900267 @Test
268 public void testEqualsDuplicated() throws Exception {
269 LinkProperties source = new LinkProperties();
270 // set 3 link addresses, eg, [A, A, B]
271 source.addLinkAddress(LINKADDRV4);
272 source.addLinkAddress(LINKADDRV4);
273 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700274
Hugo Benichi39989e72017-10-12 09:54:49 +0900275 LinkProperties target = new LinkProperties();
276 // set 3 link addresses, eg, [A, B, B]
277 target.addLinkAddress(LINKADDRV4);
278 target.addLinkAddress(LINKADDRV6);
279 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700280
Hugo Benichi39989e72017-10-12 09:54:49 +0900281 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700282 }
283
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800284 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
285 for (RouteInfo r : lp.getRoutes()) {
286 assertEquals(iface, r.getInterface());
287 }
288 }
289
Hugo Benichi39989e72017-10-12 09:54:49 +0900290 @Test
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800291 public void testRouteInterfaces() {
292 LinkAddress prefix = new LinkAddress(
293 NetworkUtils.numericToInetAddress("2001:db8::"), 32);
Lorenzo Colitti34b969b2013-08-08 10:56:22 +0900294 InetAddress address = ADDRV6;
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800295
296 // Add a route with no interface to a LinkProperties with no interface. No errors.
297 LinkProperties lp = new LinkProperties();
298 RouteInfo r = new RouteInfo(prefix, address, null);
Lorenzo Colittifa6b2632014-06-23 21:16:34 +0900299 assertTrue(lp.addRoute(r));
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800300 assertEquals(1, lp.getRoutes().size());
301 assertAllRoutesHaveInterface(null, lp);
302
Lorenzo Colittifa6b2632014-06-23 21:16:34 +0900303 // Adding the same route twice has no effect.
304 assertFalse(lp.addRoute(r));
305 assertEquals(1, lp.getRoutes().size());
306
307 // Add a route with an interface. Expect an exception.
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800308 r = new RouteInfo(prefix, address, "wlan0");
309 try {
310 lp.addRoute(r);
311 fail("Adding wlan0 route to LP with no interface, expect exception");
312 } catch (IllegalArgumentException expected) {}
313
314 // Change the interface name. All the routes should change their interface name too.
315 lp.setInterfaceName("rmnet0");
316 assertAllRoutesHaveInterface("rmnet0", lp);
317
318 // Now add a route with the wrong interface. This causes an exception too.
319 try {
320 lp.addRoute(r);
321 fail("Adding wlan0 route to rmnet0 LP, expect exception");
322 } catch (IllegalArgumentException expected) {}
323
324 // If the interface name matches, the route is added.
Lorenzo Colittifa6b2632014-06-23 21:16:34 +0900325 r = new RouteInfo(prefix, null, "wlan0");
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800326 lp.setInterfaceName("wlan0");
327 lp.addRoute(r);
328 assertEquals(2, lp.getRoutes().size());
329 assertAllRoutesHaveInterface("wlan0", lp);
330
331 // Routes with null interfaces are converted to wlan0.
Lorenzo Colitti34b969b2013-08-08 10:56:22 +0900332 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800333 lp.addRoute(r);
334 assertEquals(3, lp.getRoutes().size());
335 assertAllRoutesHaveInterface("wlan0", lp);
336
337 // Check comparisons work.
338 LinkProperties lp2 = new LinkProperties(lp);
339 assertAllRoutesHaveInterface("wlan0", lp);
Lorenzo Colitti43553b62013-07-31 23:23:21 +0900340 assertEquals(0, lp.compareAllRoutes(lp2).added.size());
341 assertEquals(0, lp.compareAllRoutes(lp2).removed.size());
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800342
343 lp2.setInterfaceName("p2p0");
344 assertAllRoutesHaveInterface("p2p0", lp2);
Lorenzo Colitti43553b62013-07-31 23:23:21 +0900345 assertEquals(3, lp.compareAllRoutes(lp2).added.size());
346 assertEquals(3, lp.compareAllRoutes(lp2).removed.size());
Lorenzo Colitti50e2b432013-03-16 02:42:30 +0900347 }
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800348
Hugo Benichi39989e72017-10-12 09:54:49 +0900349 @Test
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800350 public void testStackedInterfaces() {
351 LinkProperties rmnet0 = new LinkProperties();
352 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colitti34b969b2013-08-08 10:56:22 +0900353 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800354
355 LinkProperties clat4 = new LinkProperties();
356 clat4.setInterfaceName("clat4");
Lorenzo Colitti34b969b2013-08-08 10:56:22 +0900357 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800358
359 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colitti43553b62013-07-31 23:23:21 +0900360 assertEquals(1, rmnet0.getAddresses().size());
361 assertEquals(1, rmnet0.getLinkAddresses().size());
362 assertEquals(1, rmnet0.getAllAddresses().size());
363 assertEquals(1, rmnet0.getAllLinkAddresses().size());
364
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800365 rmnet0.addStackedLink(clat4);
366 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colitti43553b62013-07-31 23:23:21 +0900367 assertEquals(1, rmnet0.getAddresses().size());
368 assertEquals(1, rmnet0.getLinkAddresses().size());
369 assertEquals(2, rmnet0.getAllAddresses().size());
370 assertEquals(2, rmnet0.getAllLinkAddresses().size());
371
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800372 rmnet0.addStackedLink(clat4);
373 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colitti43553b62013-07-31 23:23:21 +0900374 assertEquals(1, rmnet0.getAddresses().size());
375 assertEquals(1, rmnet0.getLinkAddresses().size());
376 assertEquals(2, rmnet0.getAllAddresses().size());
377 assertEquals(2, rmnet0.getAllLinkAddresses().size());
378
Lorenzo Colitti66e01c92013-03-07 10:59:25 -0800379 assertEquals(0, clat4.getStackedLinks().size());
380
381 // Modify an item in the returned collection to see what happens.
382 for (LinkProperties link : rmnet0.getStackedLinks()) {
383 if (link.getInterfaceName().equals("clat4")) {
384 link.setInterfaceName("newname");
385 }
386 }
387 for (LinkProperties link : rmnet0.getStackedLinks()) {
388 assertFalse("newname".equals(link.getInterfaceName()));
389 }
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900390
Lorenzo Colittib8588572014-10-20 11:08:03 +0900391 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900392 assertEquals(0, rmnet0.getStackedLinks().size());
393 assertEquals(1, rmnet0.getAddresses().size());
394 assertEquals(1, rmnet0.getLinkAddresses().size());
395 assertEquals(1, rmnet0.getAllAddresses().size());
396 assertEquals(1, rmnet0.getAllLinkAddresses().size());
397
Lorenzo Colittib8588572014-10-20 11:08:03 +0900398 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900399 }
400
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900401 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
402 return lp.getLinkAddresses().iterator().next();
403 }
404
Hugo Benichi39989e72017-10-12 09:54:49 +0900405 @Test
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900406 public void testAddressMethods() {
407 LinkProperties lp = new LinkProperties();
408
409 // No addresses.
410 assertFalse(lp.hasIPv4Address());
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900411 assertFalse(lp.hasGlobalIPv6Address());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900412
413 // Addresses on stacked links don't count.
414 LinkProperties stacked = new LinkProperties();
415 stacked.setInterfaceName("stacked");
416 lp.addStackedLink(stacked);
417 stacked.addLinkAddress(LINKADDRV4);
418 stacked.addLinkAddress(LINKADDRV6);
419 assertTrue(stacked.hasIPv4Address());
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900420 assertTrue(stacked.hasGlobalIPv6Address());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900421 assertFalse(lp.hasIPv4Address());
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900422 assertFalse(lp.hasGlobalIPv6Address());
Lorenzo Colittib8588572014-10-20 11:08:03 +0900423 lp.removeStackedLink("stacked");
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900424 assertFalse(lp.hasIPv4Address());
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900425 assertFalse(lp.hasGlobalIPv6Address());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900426
427 // Addresses on the base link.
428 // Check the return values of hasIPvXAddress and ensure the add/remove methods return true
429 // iff something changes.
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900430 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900431 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900432 assertEquals(1, lp.getLinkAddresses().size());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900433 assertFalse(lp.hasIPv4Address());
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900434 assertTrue(lp.hasGlobalIPv6Address());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900435
436 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900437 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900438
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900439 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
440 assertEquals(1, lp.getLinkAddresses().size());
441 assertFalse(lp.hasGlobalIPv6Address());
442
443 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900444 assertEquals(2, lp.getLinkAddresses().size());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900445 assertTrue(lp.hasIPv4Address());
Lorenzo Colittibf1b0002014-06-23 22:33:43 +0900446 assertFalse(lp.hasGlobalIPv6Address());
447
448 assertTrue(lp.addLinkAddress(LINKADDRV6));
449 assertEquals(3, lp.getLinkAddresses().size());
450 assertTrue(lp.hasIPv4Address());
451 assertTrue(lp.hasGlobalIPv6Address());
452
453 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
454 assertEquals(2, lp.getLinkAddresses().size());
455 assertTrue(lp.hasIPv4Address());
456 assertTrue(lp.hasGlobalIPv6Address());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900457
458 // Adding an address twice has no effect.
459 // Removing an address that's not present has no effect.
460 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900461 assertEquals(2, lp.getLinkAddresses().size());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900462 assertTrue(lp.hasIPv4Address());
463 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900464 assertEquals(1, lp.getLinkAddresses().size());
Lorenzo Colitti662b96c2013-08-08 11:00:12 +0900465 assertFalse(lp.hasIPv4Address());
466 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti4ea70b72013-11-15 18:43:52 +0900467 assertEquals(1, lp.getLinkAddresses().size());
468
469 // Adding an address that's already present but with different properties causes the
470 // existing address to be updated and returns true.
471 // Start with only LINKADDRV6.
472 assertEquals(1, lp.getLinkAddresses().size());
473 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
474
475 // Create a LinkAddress object for the same address, but with different flags.
476 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
477 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
478 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
479 assertFalse(deprecated.equals(LINKADDRV6));
480
481 // Check that adding it updates the existing address instead of adding a new one.
482 assertTrue(lp.addLinkAddress(deprecated));
483 assertEquals(1, lp.getLinkAddresses().size());
484 assertEquals(deprecated, getFirstLinkAddress(lp));
485 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
486
487 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
488 assertTrue(lp.removeLinkAddress(LINKADDRV6));
489 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colittiaaacefb2013-03-08 19:11:40 -0800490 }
Lorenzo Colitti5f468e22013-08-23 20:54:49 +0900491
Hugo Benichi39989e72017-10-12 09:54:49 +0900492 @Test
Lorenzo Colitti5f468e22013-08-23 20:54:49 +0900493 public void testSetLinkAddresses() {
494 LinkProperties lp = new LinkProperties();
495 lp.addLinkAddress(LINKADDRV4);
496 lp.addLinkAddress(LINKADDRV6);
497
498 LinkProperties lp2 = new LinkProperties();
499 lp2.addLinkAddress(LINKADDRV6);
500
501 assertFalse(lp.equals(lp2));
502
503 lp2.setLinkAddresses(lp.getLinkAddresses());
504 assertTrue(lp.equals(lp));
505 }
Erik Klineba317782014-10-24 21:50:20 +0900506
Hugo Benichi39989e72017-10-12 09:54:49 +0900507 @Test
Lorenzo Colitti3d680282019-01-08 09:58:59 +0900508 public void testNat64Prefix() throws Exception {
509 LinkProperties lp = new LinkProperties();
510 lp.addLinkAddress(LINKADDRV4);
511 lp.addLinkAddress(LINKADDRV6);
512
513 assertNull(lp.getNat64Prefix());
514
515 IpPrefix p = new IpPrefix("64:ff9b::/96");
516 lp.setNat64Prefix(p);
517 assertEquals(p, lp.getNat64Prefix());
518
519 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
520 lp.setNat64Prefix(p);
521 assertEquals(p, lp.getNat64Prefix());
522
523 p = new IpPrefix("2001:db8:a:b:1:2::/80");
524 try {
525 lp.setNat64Prefix(p);
526 } catch (IllegalArgumentException expected) {
527 }
528
529 p = new IpPrefix("64:ff9b::/64");
530 try {
531 lp.setNat64Prefix(p);
532 } catch (IllegalArgumentException expected) {
533 }
534
535 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
536
537 lp.setNat64Prefix(null);
538 assertNull(lp.getNat64Prefix());
539 }
540
541 @Test
Erik Klineba317782014-10-24 21:50:20 +0900542 public void testIsProvisioned() {
543 LinkProperties lp4 = new LinkProperties();
544 assertFalse("v4only:empty", lp4.isProvisioned());
545 lp4.addLinkAddress(LINKADDRV4);
546 assertFalse("v4only:addr-only", lp4.isProvisioned());
547 lp4.addDnsServer(DNS1);
548 assertFalse("v4only:addr+dns", lp4.isProvisioned());
549 lp4.addRoute(new RouteInfo(GATEWAY1));
550 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
Erik Kline0e801362015-05-21 16:15:02 +0900551 assertTrue("v4only:addr+dns+route", lp4.isIPv4Provisioned());
552 assertFalse("v4only:addr+dns+route", lp4.isIPv6Provisioned());
Erik Klineba317782014-10-24 21:50:20 +0900553
554 LinkProperties lp6 = new LinkProperties();
555 assertFalse("v6only:empty", lp6.isProvisioned());
556 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
557 assertFalse("v6only:fe80-only", lp6.isProvisioned());
558 lp6.addDnsServer(DNS6);
559 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline0e801362015-05-21 16:15:02 +0900560 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Klineba317782014-10-24 21:50:20 +0900561 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
562 lp6.addLinkAddress(LINKADDRV6);
Erik Kline0e801362015-05-21 16:15:02 +0900563 assertTrue("v6only:fe80+global+dns+route", lp6.isIPv6Provisioned());
Erik Klineba317782014-10-24 21:50:20 +0900564 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
565 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
Erik Kline0e801362015-05-21 16:15:02 +0900566 assertFalse("v6only:global+dns+route", lp6.isIPv4Provisioned());
567 assertTrue("v6only:global+dns+route", lp6.isIPv6Provisioned());
Erik Klineba317782014-10-24 21:50:20 +0900568 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
569
570 LinkProperties lp46 = new LinkProperties();
571 lp46.addLinkAddress(LINKADDRV4);
572 lp46.addLinkAddress(LINKADDRV6);
573 lp46.addDnsServer(DNS1);
574 lp46.addDnsServer(DNS6);
575 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
576 lp46.addRoute(new RouteInfo(GATEWAY1));
Erik Kline0e801362015-05-21 16:15:02 +0900577 assertTrue("dualstack:v4-provisioned", lp46.isIPv4Provisioned());
578 assertFalse("dualstack:v4-provisioned", lp46.isIPv6Provisioned());
Erik Klineba317782014-10-24 21:50:20 +0900579 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline0e801362015-05-21 16:15:02 +0900580 lp46.addRoute(new RouteInfo(GATEWAY61));
581 assertTrue("dualstack:both-provisioned", lp46.isIPv4Provisioned());
582 assertTrue("dualstack:both-provisioned", lp46.isIPv6Provisioned());
Erik Klineba317782014-10-24 21:50:20 +0900583 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
584
585 // A link with an IPv6 address and default route, but IPv4 DNS server.
586 LinkProperties mixed = new LinkProperties();
587 mixed.addLinkAddress(LINKADDRV6);
588 mixed.addDnsServer(DNS1);
Erik Kline0e801362015-05-21 16:15:02 +0900589 mixed.addRoute(new RouteInfo(GATEWAY61));
590 assertFalse("mixed:addr6+route6+dns4", mixed.isIPv4Provisioned());
591 assertFalse("mixed:addr6+route6+dns4", mixed.isIPv6Provisioned());
Erik Klineba317782014-10-24 21:50:20 +0900592 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
593 }
Erik Kline0e801362015-05-21 16:15:02 +0900594
Hugo Benichi39989e72017-10-12 09:54:49 +0900595 @Test
Erik Kline0e801362015-05-21 16:15:02 +0900596 public void testCompareProvisioning() {
597 LinkProperties v4lp = new LinkProperties();
598 v4lp.addLinkAddress(LINKADDRV4);
599 v4lp.addRoute(new RouteInfo(GATEWAY1));
600 v4lp.addDnsServer(DNS1);
601 assertTrue(v4lp.isProvisioned());
602
603 LinkProperties v4r = new LinkProperties(v4lp);
604 v4r.removeDnsServer(DNS1);
605 assertFalse(v4r.isProvisioned());
606
607 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
608 LinkProperties.compareProvisioning(v4r, v4r));
609 assertEquals(ProvisioningChange.LOST_PROVISIONING,
610 LinkProperties.compareProvisioning(v4lp, v4r));
611 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
612 LinkProperties.compareProvisioning(v4r, v4lp));
613 assertEquals(ProvisioningChange.STILL_PROVISIONED,
614 LinkProperties.compareProvisioning(v4lp, v4lp));
615
616 // Check that losing IPv4 provisioning on a dualstack network is
617 // seen as a total loss of provisioning.
618 LinkProperties v6lp = new LinkProperties();
619 v6lp.addLinkAddress(LINKADDRV6);
620 v6lp.addRoute(new RouteInfo(GATEWAY61));
621 v6lp.addDnsServer(DNS6);
622 assertFalse(v6lp.isIPv4Provisioned());
623 assertTrue(v6lp.isIPv6Provisioned());
624 assertTrue(v6lp.isProvisioned());
625
626 LinkProperties v46lp = new LinkProperties(v6lp);
627 v46lp.addLinkAddress(LINKADDRV4);
628 v46lp.addRoute(new RouteInfo(GATEWAY1));
629 v46lp.addDnsServer(DNS1);
630 assertTrue(v46lp.isIPv4Provisioned());
631 assertTrue(v46lp.isIPv6Provisioned());
632 assertTrue(v46lp.isProvisioned());
633
634 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klinebb2024b2015-08-14 12:16:55 +0900635 LinkProperties.compareProvisioning(v4lp, v46lp));
636 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline0e801362015-05-21 16:15:02 +0900637 LinkProperties.compareProvisioning(v6lp, v46lp));
638 assertEquals(ProvisioningChange.LOST_PROVISIONING,
639 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klinebb2024b2015-08-14 12:16:55 +0900640 assertEquals(ProvisioningChange.LOST_PROVISIONING,
641 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline0e801362015-05-21 16:15:02 +0900642
643 // Check that losing and gaining a secondary router does not change
644 // the provisioning status.
645 LinkProperties v6lp2 = new LinkProperties(v6lp);
646 v6lp2.addRoute(new RouteInfo(GATEWAY62));
647 assertTrue(v6lp2.isProvisioned());
648
649 assertEquals(ProvisioningChange.STILL_PROVISIONED,
650 LinkProperties.compareProvisioning(v6lp2, v6lp));
651 assertEquals(ProvisioningChange.STILL_PROVISIONED,
652 LinkProperties.compareProvisioning(v6lp, v6lp2));
653 }
Erik Kline1c8fab52015-06-26 19:21:34 +0900654
Hugo Benichi39989e72017-10-12 09:54:49 +0900655 @Test
Erik Kline1c8fab52015-06-26 19:21:34 +0900656 public void testIsReachable() {
657 final LinkProperties v4lp = new LinkProperties();
658 assertFalse(v4lp.isReachable(DNS1));
659 assertFalse(v4lp.isReachable(DNS2));
660
661 // Add an on-link route, making the on-link DNS server reachable,
662 // but there is still no IPv4 address.
663 assertTrue(v4lp.addRoute(new RouteInfo(
664 new IpPrefix(NetworkUtils.numericToInetAddress("75.208.0.0"), 16))));
665 assertFalse(v4lp.isReachable(DNS1));
666 assertFalse(v4lp.isReachable(DNS2));
667
668 // Adding an IPv4 address (right now, any IPv4 address) means we use
669 // the routes to compute likely reachability.
670 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
671 assertTrue(v4lp.isReachable(DNS1));
672 assertFalse(v4lp.isReachable(DNS2));
673
674 // Adding a default route makes the off-link DNS server reachable.
675 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
676 assertTrue(v4lp.isReachable(DNS1));
677 assertTrue(v4lp.isReachable(DNS2));
678
679 final LinkProperties v6lp = new LinkProperties();
680 final InetAddress kLinkLocalDns = NetworkUtils.numericToInetAddress("fe80::6:1");
681 final InetAddress kLinkLocalDnsWithScope = NetworkUtils.numericToInetAddress("fe80::6:2%43");
682 final InetAddress kOnLinkDns = NetworkUtils.numericToInetAddress("2001:db8:85a3::53");
683 assertFalse(v6lp.isReachable(kLinkLocalDns));
684 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
685 assertFalse(v6lp.isReachable(kOnLinkDns));
686 assertFalse(v6lp.isReachable(DNS6));
687
688 // Add a link-local route, making the link-local DNS servers reachable. Because
689 // we assume the presence of an IPv6 link-local address, link-local DNS servers
690 // are considered reachable, but only those with a non-zero scope identifier.
691 assertTrue(v6lp.addRoute(new RouteInfo(
692 new IpPrefix(NetworkUtils.numericToInetAddress("fe80::"), 64))));
693 assertFalse(v6lp.isReachable(kLinkLocalDns));
694 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
695 assertFalse(v6lp.isReachable(kOnLinkDns));
696 assertFalse(v6lp.isReachable(DNS6));
697
698 // Add a link-local address--nothing changes.
699 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
700 assertFalse(v6lp.isReachable(kLinkLocalDns));
701 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
702 assertFalse(v6lp.isReachable(kOnLinkDns));
703 assertFalse(v6lp.isReachable(DNS6));
704
705 // Add a global route on link, but no global address yet. DNS servers reachable
706 // via a route that doesn't require a gateway: give them the benefit of the
707 // doubt and hope the link-local source address suffices for communication.
708 assertTrue(v6lp.addRoute(new RouteInfo(
709 new IpPrefix(NetworkUtils.numericToInetAddress("2001:db8:85a3::"), 64))));
710 assertFalse(v6lp.isReachable(kLinkLocalDns));
711 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
712 assertTrue(v6lp.isReachable(kOnLinkDns));
713 assertFalse(v6lp.isReachable(DNS6));
714
715 // Add a global address; the on-link global address DNS server is (still)
716 // presumed reachable.
717 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
718 assertFalse(v6lp.isReachable(kLinkLocalDns));
719 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
720 assertTrue(v6lp.isReachable(kOnLinkDns));
721 assertFalse(v6lp.isReachable(DNS6));
722
723 // Adding a default route makes the off-link DNS server reachable.
724 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
725 assertFalse(v6lp.isReachable(kLinkLocalDns));
726 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
727 assertTrue(v6lp.isReachable(kOnLinkDns));
728 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti319789d2015-07-30 23:41:43 +0900729
730 // Check isReachable on stacked links. This requires that the source IP address be assigned
731 // on the interface returned by the route lookup.
732 LinkProperties stacked = new LinkProperties();
733
734 // Can't add a stacked link without an interface name.
735 stacked.setInterfaceName("v4-test0");
736 v6lp.addStackedLink(stacked);
737
738 InetAddress stackedAddress = Address("192.0.0.4");
739 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
740 assertFalse(v6lp.isReachable(stackedAddress));
741 stacked.addLinkAddress(stackedLinkAddress);
742 assertFalse(v6lp.isReachable(stackedAddress));
743 stacked.addRoute(new RouteInfo(stackedLinkAddress));
744 assertTrue(stacked.isReachable(stackedAddress));
745 assertTrue(v6lp.isReachable(stackedAddress));
746
747 assertFalse(v6lp.isReachable(DNS1));
748 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
749 assertTrue(v6lp.isReachable(DNS1));
Erik Kline1c8fab52015-06-26 19:21:34 +0900750 }
Rubin Xu57b437a2017-09-05 18:40:49 +0100751
Hugo Benichi39989e72017-10-12 09:54:49 +0900752 @Test
Rubin Xu57b437a2017-09-05 18:40:49 +0100753 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
754 // IPv4 case: no route added initially
755 LinkProperties rmnet0 = new LinkProperties();
756 rmnet0.setInterfaceName("rmnet0");
757 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
758 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
759 rmnet0.getInterfaceName());
760
761 // Since no routes is added explicitly, getAllRoutes() should return empty.
762 assertTrue(rmnet0.getAllRoutes().isEmpty());
763 rmnet0.ensureDirectlyConnectedRoutes();
764 // ensureDirectlyConnectedRoutes() should have added the missing local route.
765 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
766
767 // IPv4 case: both direct and default routes added initially
768 LinkProperties rmnet1 = new LinkProperties();
769 rmnet1.setInterfaceName("rmnet1");
770 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
771 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null,
772 NetworkUtils.numericToInetAddress("10.0.0.1"), rmnet1.getInterfaceName());
773 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
774 rmnet1.getInterfaceName());
775 rmnet1.addRoute(defaultRoute1);
776 rmnet1.addRoute(directRoute1);
777
778 // Check added routes
779 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
780 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
781 // route is already part of the configuration.
782 rmnet1.ensureDirectlyConnectedRoutes();
783 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
784
785 // IPv6 case: only default routes added initially
786 LinkProperties rmnet2 = new LinkProperties();
787 rmnet2.setInterfaceName("rmnet2");
788 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
789 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
790 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null,
791 NetworkUtils.numericToInetAddress("2001:db8::1"), rmnet2.getInterfaceName());
792 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
793 rmnet2.getInterfaceName());
794 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
795 rmnet2.getInterfaceName());
796 rmnet2.addRoute(defaultRoute2);
797
798 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
799 rmnet2.ensureDirectlyConnectedRoutes();
800 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
801 rmnet2.getAllRoutes());
802
803 // Corner case: no interface name
804 LinkProperties rmnet3 = new LinkProperties();
805 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
806 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
807 rmnet3.getInterfaceName());
808
809 assertTrue(rmnet3.getAllRoutes().isEmpty());
810 rmnet3.ensureDirectlyConnectedRoutes();
811 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
812
813 }
814
Hugo Benichi39989e72017-10-12 09:54:49 +0900815 @Test
Rubin Xu8cb82d22017-08-22 16:35:52 +0100816 public void testCompareResult() {
817 // Either adding or removing items
Hugo Benichi39989e72017-10-12 09:54:49 +0900818 compareResult(Arrays.asList(1, 2, 3, 4), Arrays.asList(1),
Rubin Xu8cb82d22017-08-22 16:35:52 +0100819 Arrays.asList(2, 3, 4), new ArrayList<>());
Hugo Benichi39989e72017-10-12 09:54:49 +0900820 compareResult(Arrays.asList(1, 2), Arrays.asList(3, 2, 1, 4),
Rubin Xu8cb82d22017-08-22 16:35:52 +0100821 new ArrayList<>(), Arrays.asList(3, 4));
822
823
824 // adding and removing items at the same time
Hugo Benichi39989e72017-10-12 09:54:49 +0900825 compareResult(Arrays.asList(1, 2, 3, 4), Arrays.asList(2, 3, 4, 5),
Rubin Xu8cb82d22017-08-22 16:35:52 +0100826 Arrays.asList(1), Arrays.asList(5));
Hugo Benichi39989e72017-10-12 09:54:49 +0900827 compareResult(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6),
Rubin Xu8cb82d22017-08-22 16:35:52 +0100828 Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));
829
830 // null cases
Hugo Benichi39989e72017-10-12 09:54:49 +0900831 compareResult(Arrays.asList(1, 2, 3), null, Arrays.asList(1, 2, 3), new ArrayList<>());
832 compareResult(null, Arrays.asList(3, 2, 1), new ArrayList<>(), Arrays.asList(1, 2, 3));
833 compareResult(null, null, new ArrayList<>(), new ArrayList<>());
Rubin Xu8cb82d22017-08-22 16:35:52 +0100834 }
835
Rubin Xu57b437a2017-09-05 18:40:49 +0100836 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
837 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
838 Set<RouteInfo> actualSet = new ArraySet<>(actual);
839 // Duplicated entries in actual routes are considered failures
840 assertEquals(actual.size(), actualSet.size());
841
842 assertEquals(expectedSet, actualSet);
843 }
Rubin Xu8cb82d22017-08-22 16:35:52 +0100844
Hugo Benichi39989e72017-10-12 09:54:49 +0900845 private <T> void compareResult(List<T> oldItems, List<T> newItems, List<T> expectRemoved,
Rubin Xu0a3da932017-09-15 11:51:39 +0100846 List<T> expectAdded) {
847 CompareResult<T> result = new CompareResult<>(oldItems, newItems);
Rubin Xu8cb82d22017-08-22 16:35:52 +0100848 assertEquals(new ArraySet<>(expectAdded), new ArraySet<>(result.added));
849 assertEquals(new ArraySet<>(expectRemoved), (new ArraySet<>(result.removed)));
850 }
Chalard Jeanabc68d52018-04-11 16:36:41 +0900851
852 @Test
Lorenzo Colitti3d680282019-01-08 09:58:59 +0900853 public void testLinkPropertiesParcelable() throws Exception {
Chalard Jeanabc68d52018-04-11 16:36:41 +0900854 LinkProperties source = new LinkProperties();
855 source.setInterfaceName(NAME);
856 // set 2 link addresses
857 source.addLinkAddress(LINKADDRV4);
858 source.addLinkAddress(LINKADDRV6);
859 // set 2 dnses
860 source.addDnsServer(DNS1);
861 source.addDnsServer(DNS2);
862 // set 2 gateways
863 source.addRoute(new RouteInfo(GATEWAY1));
864 source.addRoute(new RouteInfo(GATEWAY2));
865 // set 2 validated private dnses
866 source.addValidatedPrivateDnsServer(DNS6);
867 source.addValidatedPrivateDnsServer(GATEWAY61);
868
869 source.setMtu(MTU);
870
Lorenzo Colitti3d680282019-01-08 09:58:59 +0900871 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
872
Chalard Jeanabc68d52018-04-11 16:36:41 +0900873 Parcel p = Parcel.obtain();
874 source.writeToParcel(p, /* flags */ 0);
875 p.setDataPosition(0);
876 final byte[] marshalled = p.marshall();
877 p = Parcel.obtain();
878 p.unmarshall(marshalled, 0, marshalled.length);
879 p.setDataPosition(0);
880 LinkProperties dest = LinkProperties.CREATOR.createFromParcel(p);
881
882 assertEquals(source, dest);
883 }
John Wang3e567d52011-04-04 12:35:42 -0700884}