blob: 9ed2bb3b86b478dccc44007f5521c7c74ae338ed [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
Rubin Xubc4c5ca2020-06-11 16:40:13 +010019import static android.net.RouteInfo.RTN_THROW;
20import static android.net.RouteInfo.RTN_UNICAST;
Rubin Xuab8cf302020-03-30 14:37:05 +010021import static android.net.RouteInfo.RTN_UNREACHABLE;
22
Chalard Jean39175f22020-06-26 00:41:26 +090023import static com.android.testutils.ParcelUtils.assertParcelingIsLossless;
24import static com.android.testutils.ParcelUtils.parcelingRoundTrip;
Chalard Jeanaf718362019-05-30 17:11:14 +090025
Hugo Benichi87d306b2017-10-12 09:54:49 +090026import static org.junit.Assert.assertEquals;
27import static org.junit.Assert.assertFalse;
paulhu9f7636c2019-05-02 17:43:28 +080028import static org.junit.Assert.assertNotEquals;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090029import static org.junit.Assert.assertNull;
Hugo Benichi87d306b2017-10-12 09:54:49 +090030import static org.junit.Assert.assertTrue;
31import static org.junit.Assert.fail;
32
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020033import android.compat.testing.PlatformCompatChangeRule;
Erik Kline04612b02015-05-21 16:15:02 +090034import android.net.LinkProperties.ProvisioningChange;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090035import android.os.Build;
Elliott Hughes8732b352014-04-28 11:11:32 -070036import android.system.OsConstants;
Rubin Xuffd77d82017-09-05 18:40:49 +010037import android.util.ArraySet;
38
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090039import androidx.core.os.BuildCompat;
Brett Chabot147f6cf2019-03-04 14:14:56 -080040import androidx.test.filters.SmallTest;
41import androidx.test.runner.AndroidJUnit4;
42
Chalard Jean4d6c93d2020-10-05 14:22:01 +090043import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090044import com.android.testutils.ConnectivityModuleTest;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090045import com.android.testutils.DevSdkIgnoreRule;
46import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
47import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
Lorenzo Colitti1c7a20c2022-05-28 00:22:06 +090048import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk31;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090049
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020050import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
51import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
52
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090053import org.junit.Rule;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090054import org.junit.Test;
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +090055import org.junit.rules.RuleChain;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090056import org.junit.runner.RunWith;
57
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090058import java.net.Inet4Address;
Rubin Xuab8cf302020-03-30 14:37:05 +010059import java.net.Inet6Address;
John Wang3e567d52011-04-04 12:35:42 -070060import java.net.InetAddress;
Rubin Xuffd77d82017-09-05 18:40:49 +010061import java.util.Arrays;
62import java.util.Collection;
63import java.util.Collections;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010064import java.util.List;
Rubin Xuffd77d82017-09-05 18:40:49 +010065import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070066
Hugo Benichi87d306b2017-10-12 09:54:49 +090067@RunWith(AndroidJUnit4.class)
68@SmallTest
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090069@ConnectivityModuleTest
Hugo Benichi87d306b2017-10-12 09:54:49 +090070public class LinkPropertiesTest {
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +090071 // Use a RuleChain to explicitly specify the order of rules. DevSdkIgnoreRule must run before
72 // PlatformCompatChange rule, because otherwise tests with that should be skipped when targeting
73 // target SDK 33 will still attempt to override compat changes (which on user builds will crash)
74 // before being skipped.
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090075 @Rule
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +090076 public final RuleChain chain = RuleChain.outerRule(
77 new DevSdkIgnoreRule()).around(new PlatformCompatChangeRule());
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020078
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +090079 private static final InetAddress ADDRV4 = address("75.208.6.1");
80 private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
81 private static final InetAddress DNS1 = address("75.208.7.1");
82 private static final InetAddress DNS2 = address("69.78.7.1");
83 private static final InetAddress DNS6 = address("2001:4860:4860::8888");
84 private static final InetAddress PRIVDNS1 = address("1.1.1.1");
85 private static final InetAddress PRIVDNS2 = address("1.0.0.1");
86 private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111");
87 private static final InetAddress PCSCFV4 = address("10.77.25.37");
88 private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1");
89 private static final InetAddress GATEWAY1 = address("75.208.8.1");
90 private static final InetAddress GATEWAY2 = address("69.78.8.1");
91 private static final InetAddress GATEWAY61 = address("fe80::6:0000:613");
92 private static final InetAddress GATEWAY62 = address("fe80::6:22%lo");
93 private static final InetAddress TESTIPV4ADDR = address("192.168.47.42");
94 private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43");
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090095 private static final Inet4Address DHCPSERVER = (Inet4Address) address("192.0.2.1");
paulhu9f7636c2019-05-02 17:43:28 +080096 private static final String NAME = "qmi0";
97 private static final String DOMAINS = "google.com";
98 private static final String PRIV_DNS_SERVER_NAME = "private.dns.com";
99 private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576";
100 private static final int MTU = 1500;
101 private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
102 private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
103 private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900104 private static final Uri CAPPORT_API_URL = Uri.parse("https://test.example.com/capportapi");
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900105
106 // CaptivePortalData cannot be in a constant as it does not exist on Q.
107 // The test runner also crashes when scanning for tests if it is a return type.
108 private static Object getCaptivePortalData() {
109 return new CaptivePortalData.Builder()
110 .setVenueInfoUrl(Uri.parse("https://test.example.com/venue")).build();
111 }
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900112
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900113 private static InetAddress address(String addrString) {
paulhu9f7636c2019-05-02 17:43:28 +0800114 return InetAddresses.parseNumericAddress(addrString);
115 }
116
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900117 private static boolean isAtLeastR() {
118 // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
119 return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
120 }
121
paulhu9f7636c2019-05-02 17:43:28 +0800122 private void checkEmpty(final LinkProperties lp) {
123 assertEquals(0, lp.getAllInterfaceNames().size());
124 assertEquals(0, lp.getAllAddresses().size());
125 assertEquals(0, lp.getDnsServers().size());
126 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
127 assertEquals(0, lp.getPcscfServers().size());
128 assertEquals(0, lp.getAllRoutes().size());
129 assertEquals(0, lp.getAllLinkAddresses().size());
130 assertEquals(0, lp.getStackedLinks().size());
131 assertEquals(0, lp.getMtu());
132 assertNull(lp.getPrivateDnsServerName());
133 assertNull(lp.getDomains());
134 assertNull(lp.getHttpProxy());
135 assertNull(lp.getTcpBufferSizes());
136 assertNull(lp.getNat64Prefix());
137 assertFalse(lp.isProvisioned());
138 assertFalse(lp.isIpv4Provisioned());
139 assertFalse(lp.isIpv6Provisioned());
140 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900141
142 if (isAtLeastR()) {
143 assertNull(lp.getDhcpServerAddress());
144 assertFalse(lp.isWakeOnLanSupported());
145 assertNull(lp.getCaptivePortalApiUrl());
146 assertNull(lp.getCaptivePortalData());
147 }
paulhu9f7636c2019-05-02 17:43:28 +0800148 }
149
150 private LinkProperties makeTestObject() {
151 final LinkProperties lp = new LinkProperties();
152 lp.setInterfaceName(NAME);
153 lp.addLinkAddress(LINKADDRV4);
154 lp.addLinkAddress(LINKADDRV6);
155 lp.addDnsServer(DNS1);
156 lp.addDnsServer(DNS2);
157 lp.addValidatedPrivateDnsServer(PRIVDNS1);
158 lp.addValidatedPrivateDnsServer(PRIVDNS2);
159 lp.setUsePrivateDns(true);
160 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
161 lp.addPcscfServer(PCSCFV6);
162 lp.setDomains(DOMAINS);
163 lp.addRoute(new RouteInfo(GATEWAY1));
164 lp.addRoute(new RouteInfo(GATEWAY2));
165 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
166 lp.setMtu(MTU);
167 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
168 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900169 if (isAtLeastR()) {
170 lp.setDhcpServerAddress(DHCPSERVER);
171 lp.setWakeOnLanSupported(true);
172 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
173 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
174 }
paulhu9f7636c2019-05-02 17:43:28 +0800175 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900176 }
177
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900178 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
179 // Check implementation of equals(), element by element.
180 assertTrue(source.isIdenticalInterfaceName(target));
181 assertTrue(target.isIdenticalInterfaceName(source));
182
183 assertTrue(source.isIdenticalAddresses(target));
184 assertTrue(target.isIdenticalAddresses(source));
185
186 assertTrue(source.isIdenticalDnses(target));
187 assertTrue(target.isIdenticalDnses(source));
188
dalyk7643abc2018-01-17 14:20:55 -0500189 assertTrue(source.isIdenticalPrivateDns(target));
190 assertTrue(target.isIdenticalPrivateDns(source));
191
Chalard Jean299d8562018-04-11 16:36:41 +0900192 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
193 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
194
Hongshike2d7cf52018-06-28 20:42:19 +0900195 assertTrue(source.isIdenticalPcscfs(target));
196 assertTrue(target.isIdenticalPcscfs(source));
197
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900198 assertTrue(source.isIdenticalRoutes(target));
199 assertTrue(target.isIdenticalRoutes(source));
200
201 assertTrue(source.isIdenticalHttpProxy(target));
202 assertTrue(target.isIdenticalHttpProxy(source));
203
204 assertTrue(source.isIdenticalStackedLinks(target));
205 assertTrue(target.isIdenticalStackedLinks(source));
206
sy.yun4aa73922013-09-02 05:24:09 +0900207 assertTrue(source.isIdenticalMtu(target));
208 assertTrue(target.isIdenticalMtu(source));
209
dalyk7643abc2018-01-17 14:20:55 -0500210 assertTrue(source.isIdenticalTcpBufferSizes(target));
211 assertTrue(target.isIdenticalTcpBufferSizes(source));
212
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900213 if (isAtLeastR()) {
214 assertTrue(source.isIdenticalDhcpServerAddress(target));
215 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200216
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900217 assertTrue(source.isIdenticalWakeOnLan(target));
218 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900219
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900220 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
221 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
222
223 assertTrue(source.isIdenticalCaptivePortalData(target));
224 assertTrue(target.isIdenticalCaptivePortalData(source));
225 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900226
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900227 // Check result of equals().
228 assertTrue(source.equals(target));
229 assertTrue(target.equals(source));
230
231 // Check hashCode.
232 assertEquals(source.hashCode(), target.hashCode());
233 }
234
Hugo Benichi87d306b2017-10-12 09:54:49 +0900235 @Test
John Wang3e567d52011-04-04 12:35:42 -0700236 public void testEqualsNull() {
237 LinkProperties source = new LinkProperties();
238 LinkProperties target = new LinkProperties();
239
240 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900241 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700242 }
243
Hugo Benichi87d306b2017-10-12 09:54:49 +0900244 @Test
245 public void testEqualsSameOrder() throws Exception {
246 LinkProperties source = new LinkProperties();
247 source.setInterfaceName(NAME);
248 // set 2 link addresses
249 source.addLinkAddress(LINKADDRV4);
250 source.addLinkAddress(LINKADDRV6);
251 // set 2 dnses
252 source.addDnsServer(DNS1);
253 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900254 // set 1 pcscf
255 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900256 // set 2 gateways
257 source.addRoute(new RouteInfo(GATEWAY1));
258 source.addRoute(new RouteInfo(GATEWAY2));
259 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700260
Hugo Benichi87d306b2017-10-12 09:54:49 +0900261 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700262
Hugo Benichi87d306b2017-10-12 09:54:49 +0900263 // All fields are same
264 target.setInterfaceName(NAME);
265 target.addLinkAddress(LINKADDRV4);
266 target.addLinkAddress(LINKADDRV6);
267 target.addDnsServer(DNS1);
268 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900269 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900270 target.addRoute(new RouteInfo(GATEWAY1));
271 target.addRoute(new RouteInfo(GATEWAY2));
272 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700273
Hugo Benichi87d306b2017-10-12 09:54:49 +0900274 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700275
Hugo Benichi87d306b2017-10-12 09:54:49 +0900276 target.clear();
277 // change Interface Name
278 target.setInterfaceName("qmi1");
279 target.addLinkAddress(LINKADDRV4);
280 target.addLinkAddress(LINKADDRV6);
281 target.addDnsServer(DNS1);
282 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900283 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900284 target.addRoute(new RouteInfo(GATEWAY1));
285 target.addRoute(new RouteInfo(GATEWAY2));
286 target.setMtu(MTU);
287 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700288
Hugo Benichi87d306b2017-10-12 09:54:49 +0900289 target.clear();
290 target.setInterfaceName(NAME);
291 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900292 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900293 target.addLinkAddress(LINKADDRV6);
294 target.addDnsServer(DNS1);
295 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900296 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900297 target.addRoute(new RouteInfo(GATEWAY1));
298 target.addRoute(new RouteInfo(GATEWAY2));
299 target.setMtu(MTU);
300 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700301
Hugo Benichi87d306b2017-10-12 09:54:49 +0900302 target.clear();
303 target.setInterfaceName(NAME);
304 target.addLinkAddress(LINKADDRV4);
305 target.addLinkAddress(LINKADDRV6);
306 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900307 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900308 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900309 target.addPcscfServer(PCSCFV6);
310 target.addRoute(new RouteInfo(GATEWAY1));
311 target.addRoute(new RouteInfo(GATEWAY2));
312 target.setMtu(MTU);
313 assertFalse(source.equals(target));
314
315 target.clear();
316 target.setInterfaceName(NAME);
317 target.addLinkAddress(LINKADDRV4);
318 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900319 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900320 target.addDnsServer(DNS2);
321 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900322 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900323 target.addRoute(new RouteInfo(GATEWAY1));
324 target.addRoute(new RouteInfo(GATEWAY2));
325 target.setMtu(MTU);
326 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700327
Hugo Benichi87d306b2017-10-12 09:54:49 +0900328 target.clear();
329 target.setInterfaceName(NAME);
330 target.addLinkAddress(LINKADDRV4);
331 target.addLinkAddress(LINKADDRV6);
332 target.addDnsServer(DNS1);
333 target.addDnsServer(DNS2);
334 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900335 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900336 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900337 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900338 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900339
Hugo Benichi87d306b2017-10-12 09:54:49 +0900340 target.clear();
341 target.setInterfaceName(NAME);
342 target.addLinkAddress(LINKADDRV4);
343 target.addLinkAddress(LINKADDRV6);
344 target.addDnsServer(DNS1);
345 target.addDnsServer(DNS2);
346 target.addRoute(new RouteInfo(GATEWAY1));
347 target.addRoute(new RouteInfo(GATEWAY2));
348 // change mtu
349 target.setMtu(1440);
350 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700351 }
352
Hugo Benichi87d306b2017-10-12 09:54:49 +0900353 @Test
354 public void testEqualsDifferentOrder() throws Exception {
355 LinkProperties source = new LinkProperties();
356 source.setInterfaceName(NAME);
357 // set 2 link addresses
358 source.addLinkAddress(LINKADDRV4);
359 source.addLinkAddress(LINKADDRV6);
360 // set 2 dnses
361 source.addDnsServer(DNS1);
362 source.addDnsServer(DNS2);
363 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800364 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900365 source.addRoute(new RouteInfo(GATEWAY2));
366 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700367
Hugo Benichi87d306b2017-10-12 09:54:49 +0900368 LinkProperties target = new LinkProperties();
369 // Exchange order
370 target.setInterfaceName(NAME);
371 target.addLinkAddress(LINKADDRV6);
372 target.addLinkAddress(LINKADDRV4);
373 target.addDnsServer(DNS2);
374 target.addDnsServer(DNS1);
375 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800376 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900377 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700378
Hugo Benichi87d306b2017-10-12 09:54:49 +0900379 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700380 }
381
Hugo Benichi87d306b2017-10-12 09:54:49 +0900382 @Test
383 public void testEqualsDuplicated() throws Exception {
384 LinkProperties source = new LinkProperties();
385 // set 3 link addresses, eg, [A, A, B]
386 source.addLinkAddress(LINKADDRV4);
387 source.addLinkAddress(LINKADDRV4);
388 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700389
Hugo Benichi87d306b2017-10-12 09:54:49 +0900390 LinkProperties target = new LinkProperties();
391 // set 3 link addresses, eg, [A, B, B]
392 target.addLinkAddress(LINKADDRV4);
393 target.addLinkAddress(LINKADDRV6);
394 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700395
Hugo Benichi87d306b2017-10-12 09:54:49 +0900396 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700397 }
398
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800399 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
400 for (RouteInfo r : lp.getRoutes()) {
401 assertEquals(iface, r.getInterface());
402 }
403 }
404
paulhu9f7636c2019-05-02 17:43:28 +0800405 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
406 for (RouteInfo r : lp.getRoutes()) {
407 assertNotEquals(iface, r.getInterface());
408 }
409 }
410
Hugo Benichi87d306b2017-10-12 09:54:49 +0900411 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800412 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800413 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
414 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900415 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800416
417 // Add a route with no interface to a LinkProperties with no interface. No errors.
418 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800419 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900420 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800421 assertEquals(1, lp.getRoutes().size());
422 assertAllRoutesHaveInterface(null, lp);
423
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900424 // Adding the same route twice has no effect.
425 assertFalse(lp.addRoute(r));
426 assertEquals(1, lp.getRoutes().size());
427
428 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800429 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800430 try {
431 lp.addRoute(r);
432 fail("Adding wlan0 route to LP with no interface, expect exception");
433 } catch (IllegalArgumentException expected) {}
434
435 // Change the interface name. All the routes should change their interface name too.
436 lp.setInterfaceName("rmnet0");
437 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800438 assertAllRoutesNotHaveInterface(null, lp);
439 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800440
441 // Now add a route with the wrong interface. This causes an exception too.
442 try {
443 lp.addRoute(r);
444 fail("Adding wlan0 route to rmnet0 LP, expect exception");
445 } catch (IllegalArgumentException expected) {}
446
447 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800448 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800449 lp.setInterfaceName("wlan0");
450 lp.addRoute(r);
451 assertEquals(2, lp.getRoutes().size());
452 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800453 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800454
455 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900456 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800457 lp.addRoute(r);
458 assertEquals(3, lp.getRoutes().size());
459 assertAllRoutesHaveInterface("wlan0", lp);
460
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900461 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800462 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800463 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900464 final CompareResult<RouteInfo> cr1 =
465 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
466 assertEquals(0, cr1.added.size());
467 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800468
469 lp2.setInterfaceName("p2p0");
470 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800471 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900472 final CompareResult<RouteInfo> cr2 =
473 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
474 assertEquals(3, cr2.added.size());
475 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800476
Tyler Wear44999a72020-02-13 17:14:38 -0800477 // Remove route with incorrect interface, no route removed.
478 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800479 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800480
481 // Check remove works when interface is correct.
482 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800483 assertEquals(2, lp.getRoutes().size());
484 assertAllRoutesHaveInterface("wlan0", lp);
485 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900486 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800487
Hugo Benichi87d306b2017-10-12 09:54:49 +0900488 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800489 public void testStackedInterfaces() {
490 LinkProperties rmnet0 = new LinkProperties();
491 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900492 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800493
494 LinkProperties clat4 = new LinkProperties();
495 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900496 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800497
498 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900499 assertEquals(1, rmnet0.getAddresses().size());
500 assertEquals(1, rmnet0.getLinkAddresses().size());
501 assertEquals(1, rmnet0.getAllAddresses().size());
502 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800503 assertEquals(1, rmnet0.getAllInterfaceNames().size());
504 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900505
Lorenzo Colittic0803122013-03-07 10:59:25 -0800506 rmnet0.addStackedLink(clat4);
507 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900508 assertEquals(1, rmnet0.getAddresses().size());
509 assertEquals(1, rmnet0.getLinkAddresses().size());
510 assertEquals(2, rmnet0.getAllAddresses().size());
511 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800512 assertEquals(2, rmnet0.getAllInterfaceNames().size());
513 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
514 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900515
Lorenzo Colittic0803122013-03-07 10:59:25 -0800516 rmnet0.addStackedLink(clat4);
517 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900518 assertEquals(1, rmnet0.getAddresses().size());
519 assertEquals(1, rmnet0.getLinkAddresses().size());
520 assertEquals(2, rmnet0.getAllAddresses().size());
521 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800522 assertEquals(2, rmnet0.getAllInterfaceNames().size());
523 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
524 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900525
Lorenzo Colittic0803122013-03-07 10:59:25 -0800526 assertEquals(0, clat4.getStackedLinks().size());
527
528 // Modify an item in the returned collection to see what happens.
529 for (LinkProperties link : rmnet0.getStackedLinks()) {
530 if (link.getInterfaceName().equals("clat4")) {
531 link.setInterfaceName("newname");
532 }
533 }
534 for (LinkProperties link : rmnet0.getStackedLinks()) {
535 assertFalse("newname".equals(link.getInterfaceName()));
536 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900537
Lorenzo Colitti38258432014-10-20 11:08:03 +0900538 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900539 assertEquals(0, rmnet0.getStackedLinks().size());
540 assertEquals(1, rmnet0.getAddresses().size());
541 assertEquals(1, rmnet0.getLinkAddresses().size());
542 assertEquals(1, rmnet0.getAllAddresses().size());
543 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800544 assertEquals(1, rmnet0.getAllInterfaceNames().size());
545 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900546
Lorenzo Colitti38258432014-10-20 11:08:03 +0900547 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900548 }
549
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900550 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
551 return lp.getLinkAddresses().iterator().next();
552 }
553
Hugo Benichi87d306b2017-10-12 09:54:49 +0900554 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900555 public void testAddressMethods() {
556 LinkProperties lp = new LinkProperties();
557
558 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800559 assertFalse(lp.hasIpv4Address());
560 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900561
562 // Addresses on stacked links don't count.
563 LinkProperties stacked = new LinkProperties();
564 stacked.setInterfaceName("stacked");
565 lp.addStackedLink(stacked);
566 stacked.addLinkAddress(LINKADDRV4);
567 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800568 assertTrue(stacked.hasIpv4Address());
569 assertTrue(stacked.hasGlobalIpv6Address());
570 assertFalse(lp.hasIpv4Address());
571 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900572 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800573 assertFalse(lp.hasIpv4Address());
574 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900575
576 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800577 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900578 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900579 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900580 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900581 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800582 assertFalse(lp.hasIpv4Address());
583 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900584
585 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900586 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900587
Lorenzo Colittifc854692014-06-23 22:33:43 +0900588 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
589 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800590 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900591
592 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900593 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800594 assertTrue(lp.hasIpv4Address());
595 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900596
597 assertTrue(lp.addLinkAddress(LINKADDRV6));
598 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800599 assertTrue(lp.hasIpv4Address());
600 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900601
602 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
603 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800604 assertTrue(lp.hasIpv4Address());
605 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900606
607 // Adding an address twice has no effect.
608 // Removing an address that's not present has no effect.
609 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900610 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800611 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900612 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900613 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800614 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900615 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900616 assertEquals(1, lp.getLinkAddresses().size());
617
618 // Adding an address that's already present but with different properties causes the
619 // existing address to be updated and returns true.
620 // Start with only LINKADDRV6.
621 assertEquals(1, lp.getLinkAddresses().size());
622 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
623
624 // Create a LinkAddress object for the same address, but with different flags.
625 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
626 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
627 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
628 assertFalse(deprecated.equals(LINKADDRV6));
629
630 // Check that adding it updates the existing address instead of adding a new one.
631 assertTrue(lp.addLinkAddress(deprecated));
632 assertEquals(1, lp.getLinkAddresses().size());
633 assertEquals(deprecated, getFirstLinkAddress(lp));
634 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
635
636 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
637 assertTrue(lp.removeLinkAddress(LINKADDRV6));
638 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800639 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900640
Hugo Benichi87d306b2017-10-12 09:54:49 +0900641 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800642 public void testLinkAddresses() {
643 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900644 lp.addLinkAddress(LINKADDRV4);
645 lp.addLinkAddress(LINKADDRV6);
646
paulhu9f7636c2019-05-02 17:43:28 +0800647 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900648 lp2.addLinkAddress(LINKADDRV6);
649
paulhu9f7636c2019-05-02 17:43:28 +0800650 final LinkProperties lp3 = new LinkProperties();
651 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
652 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900653
paulhu9f7636c2019-05-02 17:43:28 +0800654 assertFalse(lp.equals(lp2));
655 assertFalse(lp2.equals(lp3));
656
657 lp.removeLinkAddress(LINKADDRV4);
658 assertTrue(lp.equals(lp2));
659
660 lp2.setLinkAddresses(lp3.getLinkAddresses());
661 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900662 }
Erik Kline8b023072014-10-24 21:50:20 +0900663
Hugo Benichi87d306b2017-10-12 09:54:49 +0900664 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900665 public void testNat64Prefix() throws Exception {
666 LinkProperties lp = new LinkProperties();
667 lp.addLinkAddress(LINKADDRV4);
668 lp.addLinkAddress(LINKADDRV6);
669
670 assertNull(lp.getNat64Prefix());
671
672 IpPrefix p = new IpPrefix("64:ff9b::/96");
673 lp.setNat64Prefix(p);
674 assertEquals(p, lp.getNat64Prefix());
675
676 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
677 lp.setNat64Prefix(p);
678 assertEquals(p, lp.getNat64Prefix());
679
680 p = new IpPrefix("2001:db8:a:b:1:2::/80");
681 try {
682 lp.setNat64Prefix(p);
683 } catch (IllegalArgumentException expected) {
684 }
685
686 p = new IpPrefix("64:ff9b::/64");
687 try {
688 lp.setNat64Prefix(p);
689 } catch (IllegalArgumentException expected) {
690 }
691
692 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
693
694 lp.setNat64Prefix(null);
695 assertNull(lp.getNat64Prefix());
696 }
697
698 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900699 public void testIsProvisioned() {
700 LinkProperties lp4 = new LinkProperties();
701 assertFalse("v4only:empty", lp4.isProvisioned());
702 lp4.addLinkAddress(LINKADDRV4);
703 assertFalse("v4only:addr-only", lp4.isProvisioned());
704 lp4.addDnsServer(DNS1);
705 assertFalse("v4only:addr+dns", lp4.isProvisioned());
706 lp4.addRoute(new RouteInfo(GATEWAY1));
707 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800708 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
709 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900710
711 LinkProperties lp6 = new LinkProperties();
712 assertFalse("v6only:empty", lp6.isProvisioned());
713 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
714 assertFalse("v6only:fe80-only", lp6.isProvisioned());
715 lp6.addDnsServer(DNS6);
716 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900717 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900718 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
719 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800720 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900721 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
722 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800723 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
724 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900725 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
726
727 LinkProperties lp46 = new LinkProperties();
728 lp46.addLinkAddress(LINKADDRV4);
729 lp46.addLinkAddress(LINKADDRV6);
730 lp46.addDnsServer(DNS1);
731 lp46.addDnsServer(DNS6);
732 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
733 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800734 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
735 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900736 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900737 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800738 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
739 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900740 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
741
742 // A link with an IPv6 address and default route, but IPv4 DNS server.
743 LinkProperties mixed = new LinkProperties();
744 mixed.addLinkAddress(LINKADDRV6);
745 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900746 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800747 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
748 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900749 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
750 }
Erik Kline04612b02015-05-21 16:15:02 +0900751
Hugo Benichi87d306b2017-10-12 09:54:49 +0900752 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900753 public void testCompareProvisioning() {
754 LinkProperties v4lp = new LinkProperties();
755 v4lp.addLinkAddress(LINKADDRV4);
756 v4lp.addRoute(new RouteInfo(GATEWAY1));
757 v4lp.addDnsServer(DNS1);
758 assertTrue(v4lp.isProvisioned());
759
760 LinkProperties v4r = new LinkProperties(v4lp);
761 v4r.removeDnsServer(DNS1);
762 assertFalse(v4r.isProvisioned());
763
764 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
765 LinkProperties.compareProvisioning(v4r, v4r));
766 assertEquals(ProvisioningChange.LOST_PROVISIONING,
767 LinkProperties.compareProvisioning(v4lp, v4r));
768 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
769 LinkProperties.compareProvisioning(v4r, v4lp));
770 assertEquals(ProvisioningChange.STILL_PROVISIONED,
771 LinkProperties.compareProvisioning(v4lp, v4lp));
772
773 // Check that losing IPv4 provisioning on a dualstack network is
774 // seen as a total loss of provisioning.
775 LinkProperties v6lp = new LinkProperties();
776 v6lp.addLinkAddress(LINKADDRV6);
777 v6lp.addRoute(new RouteInfo(GATEWAY61));
778 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800779 assertFalse(v6lp.isIpv4Provisioned());
780 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900781 assertTrue(v6lp.isProvisioned());
782
783 LinkProperties v46lp = new LinkProperties(v6lp);
784 v46lp.addLinkAddress(LINKADDRV4);
785 v46lp.addRoute(new RouteInfo(GATEWAY1));
786 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800787 assertTrue(v46lp.isIpv4Provisioned());
788 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900789 assertTrue(v46lp.isProvisioned());
790
791 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900792 LinkProperties.compareProvisioning(v4lp, v46lp));
793 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900794 LinkProperties.compareProvisioning(v6lp, v46lp));
795 assertEquals(ProvisioningChange.LOST_PROVISIONING,
796 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900797 assertEquals(ProvisioningChange.LOST_PROVISIONING,
798 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900799
800 // Check that losing and gaining a secondary router does not change
801 // the provisioning status.
802 LinkProperties v6lp2 = new LinkProperties(v6lp);
803 v6lp2.addRoute(new RouteInfo(GATEWAY62));
804 assertTrue(v6lp2.isProvisioned());
805
806 assertEquals(ProvisioningChange.STILL_PROVISIONED,
807 LinkProperties.compareProvisioning(v6lp2, v6lp));
808 assertEquals(ProvisioningChange.STILL_PROVISIONED,
809 LinkProperties.compareProvisioning(v6lp, v6lp2));
810 }
Erik Klinea923dba2015-06-26 19:21:34 +0900811
Hugo Benichi87d306b2017-10-12 09:54:49 +0900812 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900813 public void testIsReachable() {
814 final LinkProperties v4lp = new LinkProperties();
815 assertFalse(v4lp.isReachable(DNS1));
816 assertFalse(v4lp.isReachable(DNS2));
817
818 // Add an on-link route, making the on-link DNS server reachable,
819 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900820 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900821 assertFalse(v4lp.isReachable(DNS1));
822 assertFalse(v4lp.isReachable(DNS2));
823
824 // Adding an IPv4 address (right now, any IPv4 address) means we use
825 // the routes to compute likely reachability.
826 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
827 assertTrue(v4lp.isReachable(DNS1));
828 assertFalse(v4lp.isReachable(DNS2));
829
830 // Adding a default route makes the off-link DNS server reachable.
831 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
832 assertTrue(v4lp.isReachable(DNS1));
833 assertTrue(v4lp.isReachable(DNS2));
834
835 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900836 final InetAddress kLinkLocalDns = address("fe80::6:1");
837 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
838 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900839 assertFalse(v6lp.isReachable(kLinkLocalDns));
840 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
841 assertFalse(v6lp.isReachable(kOnLinkDns));
842 assertFalse(v6lp.isReachable(DNS6));
843
844 // Add a link-local route, making the link-local DNS servers reachable. Because
845 // we assume the presence of an IPv6 link-local address, link-local DNS servers
846 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900847 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900848 assertFalse(v6lp.isReachable(kLinkLocalDns));
849 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
850 assertFalse(v6lp.isReachable(kOnLinkDns));
851 assertFalse(v6lp.isReachable(DNS6));
852
853 // Add a link-local address--nothing changes.
854 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
855 assertFalse(v6lp.isReachable(kLinkLocalDns));
856 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
857 assertFalse(v6lp.isReachable(kOnLinkDns));
858 assertFalse(v6lp.isReachable(DNS6));
859
860 // Add a global route on link, but no global address yet. DNS servers reachable
861 // via a route that doesn't require a gateway: give them the benefit of the
862 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900863 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900864 assertFalse(v6lp.isReachable(kLinkLocalDns));
865 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
866 assertTrue(v6lp.isReachable(kOnLinkDns));
867 assertFalse(v6lp.isReachable(DNS6));
868
869 // Add a global address; the on-link global address DNS server is (still)
870 // presumed reachable.
871 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
872 assertFalse(v6lp.isReachable(kLinkLocalDns));
873 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
874 assertTrue(v6lp.isReachable(kOnLinkDns));
875 assertFalse(v6lp.isReachable(DNS6));
876
877 // Adding a default route makes the off-link DNS server reachable.
878 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
879 assertFalse(v6lp.isReachable(kLinkLocalDns));
880 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
881 assertTrue(v6lp.isReachable(kOnLinkDns));
882 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900883
884 // Check isReachable on stacked links. This requires that the source IP address be assigned
885 // on the interface returned by the route lookup.
886 LinkProperties stacked = new LinkProperties();
887
888 // Can't add a stacked link without an interface name.
889 stacked.setInterfaceName("v4-test0");
890 v6lp.addStackedLink(stacked);
891
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900892 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900893 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
894 assertFalse(v6lp.isReachable(stackedAddress));
895 stacked.addLinkAddress(stackedLinkAddress);
896 assertFalse(v6lp.isReachable(stackedAddress));
897 stacked.addRoute(new RouteInfo(stackedLinkAddress));
898 assertTrue(stacked.isReachable(stackedAddress));
899 assertTrue(v6lp.isReachable(stackedAddress));
900
901 assertFalse(v6lp.isReachable(DNS1));
902 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
903 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900904 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100905
Hugo Benichi87d306b2017-10-12 09:54:49 +0900906 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100907 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
908 // IPv4 case: no route added initially
909 LinkProperties rmnet0 = new LinkProperties();
910 rmnet0.setInterfaceName("rmnet0");
911 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
912 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
913 rmnet0.getInterfaceName());
914
915 // Since no routes is added explicitly, getAllRoutes() should return empty.
916 assertTrue(rmnet0.getAllRoutes().isEmpty());
917 rmnet0.ensureDirectlyConnectedRoutes();
918 // ensureDirectlyConnectedRoutes() should have added the missing local route.
919 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
920
921 // IPv4 case: both direct and default routes added initially
922 LinkProperties rmnet1 = new LinkProperties();
923 rmnet1.setInterfaceName("rmnet1");
924 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900925 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800926 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100927 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
928 rmnet1.getInterfaceName());
929 rmnet1.addRoute(defaultRoute1);
930 rmnet1.addRoute(directRoute1);
931
932 // Check added routes
933 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
934 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
935 // route is already part of the configuration.
936 rmnet1.ensureDirectlyConnectedRoutes();
937 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
938
939 // IPv6 case: only default routes added initially
940 LinkProperties rmnet2 = new LinkProperties();
941 rmnet2.setInterfaceName("rmnet2");
942 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
943 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900944 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800945 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100946 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
947 rmnet2.getInterfaceName());
948 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
949 rmnet2.getInterfaceName());
950 rmnet2.addRoute(defaultRoute2);
951
952 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
953 rmnet2.ensureDirectlyConnectedRoutes();
954 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
955 rmnet2.getAllRoutes());
956
957 // Corner case: no interface name
958 LinkProperties rmnet3 = new LinkProperties();
959 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
960 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
961 rmnet3.getInterfaceName());
962
963 assertTrue(rmnet3.getAllRoutes().isEmpty());
964 rmnet3.ensureDirectlyConnectedRoutes();
965 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100966 }
967
Rubin Xuffd77d82017-09-05 18:40:49 +0100968 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
969 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
970 Set<RouteInfo> actualSet = new ArraySet<>(actual);
971 // Duplicated entries in actual routes are considered failures
972 assertEquals(actual.size(), actualSet.size());
973
974 assertEquals(expectedSet, actualSet);
975 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100976
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900977 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900978 LinkProperties source = new LinkProperties();
979 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900980
Chalard Jean299d8562018-04-11 16:36:41 +0900981 source.addLinkAddress(LINKADDRV4);
982 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900983
Chalard Jean299d8562018-04-11 16:36:41 +0900984 source.addDnsServer(DNS1);
985 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900986 source.addDnsServer(GATEWAY62);
987
988 source.addPcscfServer(TESTIPV4ADDR);
989 source.addPcscfServer(TESTIPV6ADDR);
990
991 source.setUsePrivateDns(true);
992 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
993
994 source.setDomains(DOMAINS);
995
Chalard Jean299d8562018-04-11 16:36:41 +0900996 source.addRoute(new RouteInfo(GATEWAY1));
997 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900998
Chalard Jean299d8562018-04-11 16:36:41 +0900999 source.addValidatedPrivateDnsServer(DNS6);
1000 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001001 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
1002
1003 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +09001004
1005 source.setMtu(MTU);
1006
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001007 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
1008
Lorenzo Colitti981b34f2019-01-08 09:58:59 +09001009 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
1010
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001011 final LinkProperties stacked = new LinkProperties();
1012 stacked.setInterfaceName("test-stacked");
1013 source.addStackedLink(stacked);
1014
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001015 return source;
1016 }
1017
1018 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1019 public void testLinkPropertiesParcelable_Q() throws Exception {
1020 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001021 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001022 }
1023
1024 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1025 public void testLinkPropertiesParcelable() throws Exception {
1026 final LinkProperties source = makeLinkPropertiesForParceling();
1027
1028 source.setWakeOnLanSupported(true);
1029 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1030 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1031 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001032 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001033
1034 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1035 final LinkProperties sanitized = new LinkProperties(source);
1036 sanitized.setCaptivePortalApiUrl(null);
1037 sanitized.setCaptivePortalData(null);
1038 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001039 }
1040
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001041 // Parceling of the scope was broken until Q-QPR2
1042 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001043 public void testLinkLocalDnsServerParceling() throws Exception {
1044 final String strAddress = "fe80::1%lo";
1045 final LinkProperties lp = new LinkProperties();
1046 lp.addDnsServer(address(strAddress));
1047 final LinkProperties unparceled = parcelingRoundTrip(lp);
1048 // Inet6Address#equals does not test for the scope id
1049 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001050 }
Chalard Jean299d8562018-04-11 16:36:41 +09001051
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001052 @Test
1053 public void testParcelUninitialized() throws Exception {
1054 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001055 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001056 }
paulhu9f7636c2019-05-02 17:43:28 +08001057
1058 @Test
1059 public void testConstructor() {
1060 LinkProperties lp = new LinkProperties();
1061 checkEmpty(lp);
1062 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1063 assertLinkPropertiesEqual(lp, new LinkProperties());
1064
1065 lp = makeTestObject();
1066 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1067 }
1068
1069 @Test
1070 public void testDnsServers() {
1071 final LinkProperties lp = new LinkProperties();
1072 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1073 lp.setDnsServers(dnsServers);
1074 assertEquals(2, lp.getDnsServers().size());
1075 assertEquals(DNS1, lp.getDnsServers().get(0));
1076 assertEquals(DNS2, lp.getDnsServers().get(1));
1077
1078 lp.removeDnsServer(DNS1);
1079 assertEquals(1, lp.getDnsServers().size());
1080 assertEquals(DNS2, lp.getDnsServers().get(0));
1081
1082 lp.addDnsServer(DNS6);
1083 assertEquals(2, lp.getDnsServers().size());
1084 assertEquals(DNS2, lp.getDnsServers().get(0));
1085 assertEquals(DNS6, lp.getDnsServers().get(1));
1086 }
1087
1088 @Test
1089 public void testValidatedPrivateDnsServers() {
1090 final LinkProperties lp = new LinkProperties();
1091 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1092 lp.setValidatedPrivateDnsServers(privDnsServers);
1093 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1094 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1095 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1096
1097 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1098 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1099 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1100
1101 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1102 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1103 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1104 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1105 }
1106
1107 @Test
1108 public void testPcscfServers() {
1109 final LinkProperties lp = new LinkProperties();
1110 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1111 lp.setPcscfServers(pcscfServers);
1112 assertEquals(1, lp.getPcscfServers().size());
1113 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1114
1115 lp.removePcscfServer(PCSCFV4);
1116 assertEquals(0, lp.getPcscfServers().size());
1117
1118 lp.addPcscfServer(PCSCFV6);
1119 assertEquals(1, lp.getPcscfServers().size());
1120 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1121 }
1122
1123 @Test
1124 public void testTcpBufferSizes() {
1125 final LinkProperties lp = makeTestObject();
1126 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1127
1128 lp.setTcpBufferSizes(null);
1129 assertNull(lp.getTcpBufferSizes());
1130 }
1131
1132 @Test
1133 public void testHasIpv6DefaultRoute() {
1134 final LinkProperties lp = makeTestObject();
1135 assertFalse(lp.hasIPv6DefaultRoute());
1136
1137 lp.addRoute(new RouteInfo(GATEWAY61));
1138 assertTrue(lp.hasIPv6DefaultRoute());
1139 }
1140
1141 @Test
1142 public void testHttpProxy() {
1143 final LinkProperties lp = makeTestObject();
1144 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1145 }
1146
1147 @Test
1148 public void testPrivateDnsServerName() {
1149 final LinkProperties lp = makeTestObject();
1150 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1151
1152 lp.setPrivateDnsServerName(null);
1153 assertNull(lp.getPrivateDnsServerName());
1154 }
1155
1156 @Test
1157 public void testUsePrivateDns() {
1158 final LinkProperties lp = makeTestObject();
1159 assertTrue(lp.isPrivateDnsActive());
1160
1161 lp.clear();
1162 assertFalse(lp.isPrivateDnsActive());
1163 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001164
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001165 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001166 public void testDhcpServerAddress() {
1167 final LinkProperties lp = makeTestObject();
1168 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1169
1170 lp.clear();
1171 assertNull(lp.getDhcpServerAddress());
1172 }
1173
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001174 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001175 public void testWakeOnLanSupported() {
1176 final LinkProperties lp = makeTestObject();
1177 assertTrue(lp.isWakeOnLanSupported());
1178
1179 lp.clear();
1180 assertFalse(lp.isWakeOnLanSupported());
1181 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001182
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001183 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001184 public void testCaptivePortalApiUrl() {
1185 final LinkProperties lp = makeTestObject();
1186 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1187
1188 lp.clear();
1189 assertNull(lp.getCaptivePortalApiUrl());
1190 }
1191
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001192 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001193 public void testCaptivePortalData() {
1194 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001195 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001196
1197 lp.clear();
1198 assertNull(lp.getCaptivePortalData());
1199 }
lucaslin55c6a842020-03-26 19:15:11 +08001200
1201 private LinkProperties makeIpv4LinkProperties() {
1202 final LinkProperties linkProperties = new LinkProperties();
1203 linkProperties.setInterfaceName(NAME);
1204 linkProperties.addLinkAddress(LINKADDRV4);
1205 linkProperties.addDnsServer(DNS1);
1206 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1207 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1208 return linkProperties;
1209 }
1210
1211 private LinkProperties makeIpv6LinkProperties() {
1212 final LinkProperties linkProperties = new LinkProperties();
1213 linkProperties.setInterfaceName(NAME);
1214 linkProperties.addLinkAddress(LINKADDRV6);
1215 linkProperties.addDnsServer(DNS6);
1216 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1217 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1218 return linkProperties;
1219 }
1220
1221 @Test
1222 public void testHasIpv4DefaultRoute() {
1223 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1224 assertTrue(Ipv4.hasIpv4DefaultRoute());
1225 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1226 assertFalse(Ipv6.hasIpv4DefaultRoute());
1227 }
1228
1229 @Test
1230 public void testHasIpv4DnsServer() {
1231 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1232 assertTrue(Ipv4.hasIpv4DnsServer());
1233 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1234 assertFalse(Ipv6.hasIpv4DnsServer());
1235 }
1236
1237 @Test
1238 public void testHasIpv6DnsServer() {
1239 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1240 assertFalse(Ipv4.hasIpv6DnsServer());
1241 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1242 assertTrue(Ipv6.hasIpv6DnsServer());
1243 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001244
1245 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1246 public void testHasIpv4UnreachableDefaultRoute() {
1247 final LinkProperties lp = makeTestObject();
1248 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1249 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1250
1251 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1252 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1253 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1254 }
1255
1256 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1257 public void testHasIpv6UnreachableDefaultRoute() {
1258 final LinkProperties lp = makeTestObject();
1259 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1260 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1261
1262 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1263 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1264 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1265 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001266
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001267 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1268 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
preranapee4bfe72022-05-11 04:23:14 +00001269 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Prerana2b97bbe2022-04-28 04:02:05 +00001270 public void testHasExcludeRoute() {
1271 LinkProperties lp = new LinkProperties();
preranapee4bfe72022-05-11 04:23:14 +00001272 lp.setInterfaceName("tun0");
1273 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 24), RTN_UNICAST));
Prerana2b97bbe2022-04-28 04:02:05 +00001274 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_UNICAST));
1275 assertFalse(lp.hasExcludeRoute());
preranapee4bfe72022-05-11 04:23:14 +00001276 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 32), RTN_THROW));
Prerana2b97bbe2022-04-28 04:02:05 +00001277 assertTrue(lp.hasExcludeRoute());
1278 }
1279
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001280 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1281 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001282 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001283 public void testRouteAddWithSameKey() throws Exception {
1284 LinkProperties lp = new LinkProperties();
1285 lp.setInterfaceName("wlan0");
1286 final IpPrefix v6 = new IpPrefix("64:ff9b::/96");
1287 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1280));
1288 assertEquals(1, lp.getRoutes().size());
1289 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1500));
1290 assertEquals(1, lp.getRoutes().size());
1291 final IpPrefix v4 = new IpPrefix("192.0.2.128/25");
1292 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_UNICAST, 1460));
1293 assertEquals(2, lp.getRoutes().size());
1294 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_THROW, 1460));
1295 assertEquals(2, lp.getRoutes().size());
1296 }
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001297
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001298 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1299 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001300 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1301 public void testExcludedRoutesEnabled() {
1302 final LinkProperties lp = new LinkProperties();
1303 assertEquals(0, lp.getRoutes().size());
1304
1305 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
1306 assertEquals(1, lp.getRoutes().size());
1307
1308 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_THROW));
1309 assertEquals(2, lp.getRoutes().size());
1310
1311 lp.addRoute(new RouteInfo(GATEWAY1));
1312 assertEquals(3, lp.getRoutes().size());
1313 }
1314
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001315 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1316 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001317 @DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1318 public void testExcludedRoutesDisabled() {
1319 final LinkProperties lp = new LinkProperties();
1320 assertEquals(0, lp.getRoutes().size());
1321
1322 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
1323 assertEquals(0, lp.getRoutes().size());
1324
1325 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW));
1326 assertEquals(0, lp.getRoutes().size());
1327
1328 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST));
1329 assertEquals(1, lp.getRoutes().size());
1330 }
John Wang3e567d52011-04-04 12:35:42 -07001331}