blob: 09f5d6ec8578fab1a193303f38fafd90b2cb97c5 [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;
Yuyang Huang90a2cbd2023-02-09 16:29:16 +090035import android.net.connectivity.ConnectivityCompatChanges;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090036import android.os.Build;
Elliott Hughes8732b352014-04-28 11:11:32 -070037import android.system.OsConstants;
Rubin Xuffd77d82017-09-05 18:40:49 +010038import android.util.ArraySet;
39
Brett Chabot147f6cf2019-03-04 14:14:56 -080040import androidx.test.filters.SmallTest;
41import androidx.test.runner.AndroidJUnit4;
42
Lorenzo Colitticcd30202022-07-21 15:42:37 +090043import com.android.modules.utils.build.SdkLevel;
Chalard Jean4d6c93d2020-10-05 14:22:01 +090044import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090045import com.android.testutils.ConnectivityModuleTest;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090046import com.android.testutils.DevSdkIgnoreRule;
47import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
48import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
Lorenzo Colitti1c7a20c2022-05-28 00:22:06 +090049import com.android.testutils.filters.CtsNetTestCasesMaxTargetSdk31;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090050
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020051import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
52import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
53
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090054import org.junit.Rule;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090055import org.junit.Test;
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +090056import org.junit.rules.RuleChain;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090057import org.junit.runner.RunWith;
58
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090059import java.net.Inet4Address;
Rubin Xuab8cf302020-03-30 14:37:05 +010060import java.net.Inet6Address;
John Wang3e567d52011-04-04 12:35:42 -070061import java.net.InetAddress;
Rubin Xuffd77d82017-09-05 18:40:49 +010062import java.util.Arrays;
63import java.util.Collection;
64import java.util.Collections;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010065import java.util.List;
Rubin Xuffd77d82017-09-05 18:40:49 +010066import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070067
Hugo Benichi87d306b2017-10-12 09:54:49 +090068@RunWith(AndroidJUnit4.class)
69@SmallTest
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090070@ConnectivityModuleTest
Hugo Benichi87d306b2017-10-12 09:54:49 +090071public class LinkPropertiesTest {
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +090072 // Use a RuleChain to explicitly specify the order of rules. DevSdkIgnoreRule must run before
73 // PlatformCompatChange rule, because otherwise tests with that should be skipped when targeting
74 // target SDK 33 will still attempt to override compat changes (which on user builds will crash)
75 // before being skipped.
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090076 @Rule
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +090077 public final RuleChain chain = RuleChain.outerRule(
78 new DevSdkIgnoreRule()).around(new PlatformCompatChangeRule());
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020079
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +090080 private static final InetAddress ADDRV4 = address("75.208.6.1");
81 private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
82 private static final InetAddress DNS1 = address("75.208.7.1");
83 private static final InetAddress DNS2 = address("69.78.7.1");
84 private static final InetAddress DNS6 = address("2001:4860:4860::8888");
85 private static final InetAddress PRIVDNS1 = address("1.1.1.1");
86 private static final InetAddress PRIVDNS2 = address("1.0.0.1");
87 private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111");
88 private static final InetAddress PCSCFV4 = address("10.77.25.37");
89 private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1");
90 private static final InetAddress GATEWAY1 = address("75.208.8.1");
91 private static final InetAddress GATEWAY2 = address("69.78.8.1");
92 private static final InetAddress GATEWAY61 = address("fe80::6:0000:613");
93 private static final InetAddress GATEWAY62 = address("fe80::6:22%lo");
94 private static final InetAddress TESTIPV4ADDR = address("192.168.47.42");
95 private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43");
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090096 private static final Inet4Address DHCPSERVER = (Inet4Address) address("192.0.2.1");
paulhu9f7636c2019-05-02 17:43:28 +080097 private static final String NAME = "qmi0";
98 private static final String DOMAINS = "google.com";
99 private static final String PRIV_DNS_SERVER_NAME = "private.dns.com";
100 private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576";
101 private static final int MTU = 1500;
102 private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
103 private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
104 private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900105 private static final Uri CAPPORT_API_URL = Uri.parse("https://test.example.com/capportapi");
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900106
107 // CaptivePortalData cannot be in a constant as it does not exist on Q.
108 // The test runner also crashes when scanning for tests if it is a return type.
109 private static Object getCaptivePortalData() {
110 return new CaptivePortalData.Builder()
111 .setVenueInfoUrl(Uri.parse("https://test.example.com/venue")).build();
112 }
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900113
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900114 private static InetAddress address(String addrString) {
paulhu9f7636c2019-05-02 17:43:28 +0800115 return InetAddresses.parseNumericAddress(addrString);
116 }
117
118 private void checkEmpty(final LinkProperties lp) {
119 assertEquals(0, lp.getAllInterfaceNames().size());
120 assertEquals(0, lp.getAllAddresses().size());
121 assertEquals(0, lp.getDnsServers().size());
122 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
123 assertEquals(0, lp.getPcscfServers().size());
124 assertEquals(0, lp.getAllRoutes().size());
125 assertEquals(0, lp.getAllLinkAddresses().size());
126 assertEquals(0, lp.getStackedLinks().size());
127 assertEquals(0, lp.getMtu());
128 assertNull(lp.getPrivateDnsServerName());
129 assertNull(lp.getDomains());
130 assertNull(lp.getHttpProxy());
131 assertNull(lp.getTcpBufferSizes());
132 assertNull(lp.getNat64Prefix());
133 assertFalse(lp.isProvisioned());
134 assertFalse(lp.isIpv4Provisioned());
135 assertFalse(lp.isIpv6Provisioned());
136 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900137
Lorenzo Colitticcd30202022-07-21 15:42:37 +0900138 if (SdkLevel.isAtLeastR()) {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900139 assertNull(lp.getDhcpServerAddress());
140 assertFalse(lp.isWakeOnLanSupported());
141 assertNull(lp.getCaptivePortalApiUrl());
142 assertNull(lp.getCaptivePortalData());
143 }
paulhu9f7636c2019-05-02 17:43:28 +0800144 }
145
146 private LinkProperties makeTestObject() {
147 final LinkProperties lp = new LinkProperties();
148 lp.setInterfaceName(NAME);
149 lp.addLinkAddress(LINKADDRV4);
150 lp.addLinkAddress(LINKADDRV6);
151 lp.addDnsServer(DNS1);
152 lp.addDnsServer(DNS2);
153 lp.addValidatedPrivateDnsServer(PRIVDNS1);
154 lp.addValidatedPrivateDnsServer(PRIVDNS2);
155 lp.setUsePrivateDns(true);
156 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
157 lp.addPcscfServer(PCSCFV6);
158 lp.setDomains(DOMAINS);
159 lp.addRoute(new RouteInfo(GATEWAY1));
160 lp.addRoute(new RouteInfo(GATEWAY2));
161 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
162 lp.setMtu(MTU);
163 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
164 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Lorenzo Colitticcd30202022-07-21 15:42:37 +0900165 if (SdkLevel.isAtLeastR()) {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900166 lp.setDhcpServerAddress(DHCPSERVER);
167 lp.setWakeOnLanSupported(true);
168 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
169 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
170 }
paulhu9f7636c2019-05-02 17:43:28 +0800171 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900172 }
173
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900174 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
175 // Check implementation of equals(), element by element.
176 assertTrue(source.isIdenticalInterfaceName(target));
177 assertTrue(target.isIdenticalInterfaceName(source));
178
179 assertTrue(source.isIdenticalAddresses(target));
180 assertTrue(target.isIdenticalAddresses(source));
181
182 assertTrue(source.isIdenticalDnses(target));
183 assertTrue(target.isIdenticalDnses(source));
184
dalyk7643abc2018-01-17 14:20:55 -0500185 assertTrue(source.isIdenticalPrivateDns(target));
186 assertTrue(target.isIdenticalPrivateDns(source));
187
Chalard Jean299d8562018-04-11 16:36:41 +0900188 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
189 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
190
Hongshike2d7cf52018-06-28 20:42:19 +0900191 assertTrue(source.isIdenticalPcscfs(target));
192 assertTrue(target.isIdenticalPcscfs(source));
193
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900194 assertTrue(source.isIdenticalRoutes(target));
195 assertTrue(target.isIdenticalRoutes(source));
196
197 assertTrue(source.isIdenticalHttpProxy(target));
198 assertTrue(target.isIdenticalHttpProxy(source));
199
200 assertTrue(source.isIdenticalStackedLinks(target));
201 assertTrue(target.isIdenticalStackedLinks(source));
202
sy.yun4aa73922013-09-02 05:24:09 +0900203 assertTrue(source.isIdenticalMtu(target));
204 assertTrue(target.isIdenticalMtu(source));
205
dalyk7643abc2018-01-17 14:20:55 -0500206 assertTrue(source.isIdenticalTcpBufferSizes(target));
207 assertTrue(target.isIdenticalTcpBufferSizes(source));
208
Lorenzo Colitticcd30202022-07-21 15:42:37 +0900209 if (SdkLevel.isAtLeastR()) {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900210 assertTrue(source.isIdenticalDhcpServerAddress(target));
211 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200212
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900213 assertTrue(source.isIdenticalWakeOnLan(target));
214 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900215
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900216 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
217 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
218
219 assertTrue(source.isIdenticalCaptivePortalData(target));
220 assertTrue(target.isIdenticalCaptivePortalData(source));
221 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900222
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900223 // Check result of equals().
224 assertTrue(source.equals(target));
225 assertTrue(target.equals(source));
226
227 // Check hashCode.
228 assertEquals(source.hashCode(), target.hashCode());
229 }
230
Hugo Benichi87d306b2017-10-12 09:54:49 +0900231 @Test
John Wang3e567d52011-04-04 12:35:42 -0700232 public void testEqualsNull() {
233 LinkProperties source = new LinkProperties();
234 LinkProperties target = new LinkProperties();
235
236 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900237 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700238 }
239
Hugo Benichi87d306b2017-10-12 09:54:49 +0900240 @Test
241 public void testEqualsSameOrder() throws Exception {
242 LinkProperties source = new LinkProperties();
243 source.setInterfaceName(NAME);
244 // set 2 link addresses
245 source.addLinkAddress(LINKADDRV4);
246 source.addLinkAddress(LINKADDRV6);
247 // set 2 dnses
248 source.addDnsServer(DNS1);
249 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900250 // set 1 pcscf
251 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900252 // set 2 gateways
253 source.addRoute(new RouteInfo(GATEWAY1));
254 source.addRoute(new RouteInfo(GATEWAY2));
255 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700256
Hugo Benichi87d306b2017-10-12 09:54:49 +0900257 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700258
Hugo Benichi87d306b2017-10-12 09:54:49 +0900259 // All fields are same
260 target.setInterfaceName(NAME);
261 target.addLinkAddress(LINKADDRV4);
262 target.addLinkAddress(LINKADDRV6);
263 target.addDnsServer(DNS1);
264 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900265 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900266 target.addRoute(new RouteInfo(GATEWAY1));
267 target.addRoute(new RouteInfo(GATEWAY2));
268 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700269
Hugo Benichi87d306b2017-10-12 09:54:49 +0900270 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700271
Hugo Benichi87d306b2017-10-12 09:54:49 +0900272 target.clear();
273 // change Interface Name
274 target.setInterfaceName("qmi1");
275 target.addLinkAddress(LINKADDRV4);
276 target.addLinkAddress(LINKADDRV6);
277 target.addDnsServer(DNS1);
278 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900279 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900280 target.addRoute(new RouteInfo(GATEWAY1));
281 target.addRoute(new RouteInfo(GATEWAY2));
282 target.setMtu(MTU);
283 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700284
Hugo Benichi87d306b2017-10-12 09:54:49 +0900285 target.clear();
286 target.setInterfaceName(NAME);
287 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900288 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900289 target.addLinkAddress(LINKADDRV6);
290 target.addDnsServer(DNS1);
291 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900292 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900293 target.addRoute(new RouteInfo(GATEWAY1));
294 target.addRoute(new RouteInfo(GATEWAY2));
295 target.setMtu(MTU);
296 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700297
Hugo Benichi87d306b2017-10-12 09:54:49 +0900298 target.clear();
299 target.setInterfaceName(NAME);
300 target.addLinkAddress(LINKADDRV4);
301 target.addLinkAddress(LINKADDRV6);
302 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900303 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900304 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900305 target.addPcscfServer(PCSCFV6);
306 target.addRoute(new RouteInfo(GATEWAY1));
307 target.addRoute(new RouteInfo(GATEWAY2));
308 target.setMtu(MTU);
309 assertFalse(source.equals(target));
310
311 target.clear();
312 target.setInterfaceName(NAME);
313 target.addLinkAddress(LINKADDRV4);
314 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900315 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900316 target.addDnsServer(DNS2);
317 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900318 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900319 target.addRoute(new RouteInfo(GATEWAY1));
320 target.addRoute(new RouteInfo(GATEWAY2));
321 target.setMtu(MTU);
322 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700323
Hugo Benichi87d306b2017-10-12 09:54:49 +0900324 target.clear();
325 target.setInterfaceName(NAME);
326 target.addLinkAddress(LINKADDRV4);
327 target.addLinkAddress(LINKADDRV6);
328 target.addDnsServer(DNS1);
329 target.addDnsServer(DNS2);
330 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900331 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900332 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900333 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900334 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900335
Hugo Benichi87d306b2017-10-12 09:54:49 +0900336 target.clear();
337 target.setInterfaceName(NAME);
338 target.addLinkAddress(LINKADDRV4);
339 target.addLinkAddress(LINKADDRV6);
340 target.addDnsServer(DNS1);
341 target.addDnsServer(DNS2);
342 target.addRoute(new RouteInfo(GATEWAY1));
343 target.addRoute(new RouteInfo(GATEWAY2));
344 // change mtu
345 target.setMtu(1440);
346 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700347 }
348
Hugo Benichi87d306b2017-10-12 09:54:49 +0900349 @Test
350 public void testEqualsDifferentOrder() throws Exception {
351 LinkProperties source = new LinkProperties();
352 source.setInterfaceName(NAME);
353 // set 2 link addresses
354 source.addLinkAddress(LINKADDRV4);
355 source.addLinkAddress(LINKADDRV6);
356 // set 2 dnses
357 source.addDnsServer(DNS1);
358 source.addDnsServer(DNS2);
359 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800360 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900361 source.addRoute(new RouteInfo(GATEWAY2));
362 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700363
Hugo Benichi87d306b2017-10-12 09:54:49 +0900364 LinkProperties target = new LinkProperties();
365 // Exchange order
366 target.setInterfaceName(NAME);
367 target.addLinkAddress(LINKADDRV6);
368 target.addLinkAddress(LINKADDRV4);
369 target.addDnsServer(DNS2);
370 target.addDnsServer(DNS1);
371 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800372 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900373 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700374
Hugo Benichi87d306b2017-10-12 09:54:49 +0900375 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700376 }
377
Hugo Benichi87d306b2017-10-12 09:54:49 +0900378 @Test
379 public void testEqualsDuplicated() throws Exception {
380 LinkProperties source = new LinkProperties();
381 // set 3 link addresses, eg, [A, A, B]
382 source.addLinkAddress(LINKADDRV4);
383 source.addLinkAddress(LINKADDRV4);
384 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700385
Hugo Benichi87d306b2017-10-12 09:54:49 +0900386 LinkProperties target = new LinkProperties();
387 // set 3 link addresses, eg, [A, B, B]
388 target.addLinkAddress(LINKADDRV4);
389 target.addLinkAddress(LINKADDRV6);
390 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700391
Hugo Benichi87d306b2017-10-12 09:54:49 +0900392 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700393 }
394
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800395 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
396 for (RouteInfo r : lp.getRoutes()) {
397 assertEquals(iface, r.getInterface());
398 }
399 }
400
paulhu9f7636c2019-05-02 17:43:28 +0800401 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
402 for (RouteInfo r : lp.getRoutes()) {
403 assertNotEquals(iface, r.getInterface());
404 }
405 }
406
Hugo Benichi87d306b2017-10-12 09:54:49 +0900407 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800408 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800409 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
410 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900411 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800412
413 // Add a route with no interface to a LinkProperties with no interface. No errors.
414 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800415 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900416 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800417 assertEquals(1, lp.getRoutes().size());
418 assertAllRoutesHaveInterface(null, lp);
419
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900420 // Adding the same route twice has no effect.
421 assertFalse(lp.addRoute(r));
422 assertEquals(1, lp.getRoutes().size());
423
424 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800425 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800426 try {
427 lp.addRoute(r);
428 fail("Adding wlan0 route to LP with no interface, expect exception");
429 } catch (IllegalArgumentException expected) {}
430
431 // Change the interface name. All the routes should change their interface name too.
432 lp.setInterfaceName("rmnet0");
433 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800434 assertAllRoutesNotHaveInterface(null, lp);
435 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800436
437 // Now add a route with the wrong interface. This causes an exception too.
438 try {
439 lp.addRoute(r);
440 fail("Adding wlan0 route to rmnet0 LP, expect exception");
441 } catch (IllegalArgumentException expected) {}
442
443 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800444 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800445 lp.setInterfaceName("wlan0");
446 lp.addRoute(r);
447 assertEquals(2, lp.getRoutes().size());
448 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800449 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800450
451 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900452 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800453 lp.addRoute(r);
454 assertEquals(3, lp.getRoutes().size());
455 assertAllRoutesHaveInterface("wlan0", lp);
456
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900457 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800458 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800459 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900460 final CompareResult<RouteInfo> cr1 =
461 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
462 assertEquals(0, cr1.added.size());
463 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800464
465 lp2.setInterfaceName("p2p0");
466 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800467 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900468 final CompareResult<RouteInfo> cr2 =
469 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
470 assertEquals(3, cr2.added.size());
471 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800472
Tyler Wear44999a72020-02-13 17:14:38 -0800473 // Remove route with incorrect interface, no route removed.
474 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800475 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800476
477 // Check remove works when interface is correct.
478 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800479 assertEquals(2, lp.getRoutes().size());
480 assertAllRoutesHaveInterface("wlan0", lp);
481 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900482 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800483
Hugo Benichi87d306b2017-10-12 09:54:49 +0900484 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800485 public void testStackedInterfaces() {
486 LinkProperties rmnet0 = new LinkProperties();
487 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900488 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800489
490 LinkProperties clat4 = new LinkProperties();
491 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900492 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800493
494 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900495 assertEquals(1, rmnet0.getAddresses().size());
496 assertEquals(1, rmnet0.getLinkAddresses().size());
497 assertEquals(1, rmnet0.getAllAddresses().size());
498 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800499 assertEquals(1, rmnet0.getAllInterfaceNames().size());
500 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900501
Lorenzo Colittic0803122013-03-07 10:59:25 -0800502 rmnet0.addStackedLink(clat4);
503 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900504 assertEquals(1, rmnet0.getAddresses().size());
505 assertEquals(1, rmnet0.getLinkAddresses().size());
506 assertEquals(2, rmnet0.getAllAddresses().size());
507 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800508 assertEquals(2, rmnet0.getAllInterfaceNames().size());
509 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
510 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900511
Lorenzo Colittic0803122013-03-07 10:59:25 -0800512 rmnet0.addStackedLink(clat4);
513 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900514 assertEquals(1, rmnet0.getAddresses().size());
515 assertEquals(1, rmnet0.getLinkAddresses().size());
516 assertEquals(2, rmnet0.getAllAddresses().size());
517 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800518 assertEquals(2, rmnet0.getAllInterfaceNames().size());
519 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
520 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900521
Lorenzo Colittic0803122013-03-07 10:59:25 -0800522 assertEquals(0, clat4.getStackedLinks().size());
523
524 // Modify an item in the returned collection to see what happens.
525 for (LinkProperties link : rmnet0.getStackedLinks()) {
526 if (link.getInterfaceName().equals("clat4")) {
527 link.setInterfaceName("newname");
528 }
529 }
530 for (LinkProperties link : rmnet0.getStackedLinks()) {
531 assertFalse("newname".equals(link.getInterfaceName()));
532 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900533
Lorenzo Colitti38258432014-10-20 11:08:03 +0900534 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900535 assertEquals(0, rmnet0.getStackedLinks().size());
536 assertEquals(1, rmnet0.getAddresses().size());
537 assertEquals(1, rmnet0.getLinkAddresses().size());
538 assertEquals(1, rmnet0.getAllAddresses().size());
539 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800540 assertEquals(1, rmnet0.getAllInterfaceNames().size());
541 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900542
Lorenzo Colitti38258432014-10-20 11:08:03 +0900543 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900544 }
545
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900546 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
547 return lp.getLinkAddresses().iterator().next();
548 }
549
Hugo Benichi87d306b2017-10-12 09:54:49 +0900550 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900551 public void testAddressMethods() {
552 LinkProperties lp = new LinkProperties();
553
554 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800555 assertFalse(lp.hasIpv4Address());
556 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900557
558 // Addresses on stacked links don't count.
559 LinkProperties stacked = new LinkProperties();
560 stacked.setInterfaceName("stacked");
561 lp.addStackedLink(stacked);
562 stacked.addLinkAddress(LINKADDRV4);
563 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800564 assertTrue(stacked.hasIpv4Address());
565 assertTrue(stacked.hasGlobalIpv6Address());
566 assertFalse(lp.hasIpv4Address());
567 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900568 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800569 assertFalse(lp.hasIpv4Address());
570 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900571
572 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800573 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900574 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900575 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900576 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900577 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800578 assertFalse(lp.hasIpv4Address());
579 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900580
581 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900582 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900583
Lorenzo Colittifc854692014-06-23 22:33:43 +0900584 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
585 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800586 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900587
588 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900589 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800590 assertTrue(lp.hasIpv4Address());
591 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900592
593 assertTrue(lp.addLinkAddress(LINKADDRV6));
594 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800595 assertTrue(lp.hasIpv4Address());
596 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900597
598 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
599 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800600 assertTrue(lp.hasIpv4Address());
601 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900602
603 // Adding an address twice has no effect.
604 // Removing an address that's not present has no effect.
605 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900606 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800607 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900608 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900609 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800610 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900611 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900612 assertEquals(1, lp.getLinkAddresses().size());
613
614 // Adding an address that's already present but with different properties causes the
615 // existing address to be updated and returns true.
616 // Start with only LINKADDRV6.
617 assertEquals(1, lp.getLinkAddresses().size());
618 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
619
620 // Create a LinkAddress object for the same address, but with different flags.
621 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
622 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
623 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
624 assertFalse(deprecated.equals(LINKADDRV6));
625
626 // Check that adding it updates the existing address instead of adding a new one.
627 assertTrue(lp.addLinkAddress(deprecated));
628 assertEquals(1, lp.getLinkAddresses().size());
629 assertEquals(deprecated, getFirstLinkAddress(lp));
630 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
631
632 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
633 assertTrue(lp.removeLinkAddress(LINKADDRV6));
634 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800635 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900636
Hugo Benichi87d306b2017-10-12 09:54:49 +0900637 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800638 public void testLinkAddresses() {
639 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900640 lp.addLinkAddress(LINKADDRV4);
641 lp.addLinkAddress(LINKADDRV6);
642
paulhu9f7636c2019-05-02 17:43:28 +0800643 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900644 lp2.addLinkAddress(LINKADDRV6);
645
paulhu9f7636c2019-05-02 17:43:28 +0800646 final LinkProperties lp3 = new LinkProperties();
647 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
648 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900649
paulhu9f7636c2019-05-02 17:43:28 +0800650 assertFalse(lp.equals(lp2));
651 assertFalse(lp2.equals(lp3));
652
653 lp.removeLinkAddress(LINKADDRV4);
654 assertTrue(lp.equals(lp2));
655
656 lp2.setLinkAddresses(lp3.getLinkAddresses());
657 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900658 }
Erik Kline8b023072014-10-24 21:50:20 +0900659
Hugo Benichi87d306b2017-10-12 09:54:49 +0900660 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900661 public void testNat64Prefix() throws Exception {
662 LinkProperties lp = new LinkProperties();
663 lp.addLinkAddress(LINKADDRV4);
664 lp.addLinkAddress(LINKADDRV6);
665
666 assertNull(lp.getNat64Prefix());
667
668 IpPrefix p = new IpPrefix("64:ff9b::/96");
669 lp.setNat64Prefix(p);
670 assertEquals(p, lp.getNat64Prefix());
671
672 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
673 lp.setNat64Prefix(p);
674 assertEquals(p, lp.getNat64Prefix());
675
676 p = new IpPrefix("2001:db8:a:b:1:2::/80");
677 try {
678 lp.setNat64Prefix(p);
679 } catch (IllegalArgumentException expected) {
680 }
681
682 p = new IpPrefix("64:ff9b::/64");
683 try {
684 lp.setNat64Prefix(p);
685 } catch (IllegalArgumentException expected) {
686 }
687
688 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
689
690 lp.setNat64Prefix(null);
691 assertNull(lp.getNat64Prefix());
692 }
693
694 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900695 public void testIsProvisioned() {
696 LinkProperties lp4 = new LinkProperties();
697 assertFalse("v4only:empty", lp4.isProvisioned());
698 lp4.addLinkAddress(LINKADDRV4);
699 assertFalse("v4only:addr-only", lp4.isProvisioned());
700 lp4.addDnsServer(DNS1);
701 assertFalse("v4only:addr+dns", lp4.isProvisioned());
702 lp4.addRoute(new RouteInfo(GATEWAY1));
703 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800704 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
705 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900706
707 LinkProperties lp6 = new LinkProperties();
708 assertFalse("v6only:empty", lp6.isProvisioned());
709 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
710 assertFalse("v6only:fe80-only", lp6.isProvisioned());
711 lp6.addDnsServer(DNS6);
712 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900713 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900714 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
715 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800716 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900717 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
718 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800719 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
720 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900721 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
722
723 LinkProperties lp46 = new LinkProperties();
724 lp46.addLinkAddress(LINKADDRV4);
725 lp46.addLinkAddress(LINKADDRV6);
726 lp46.addDnsServer(DNS1);
727 lp46.addDnsServer(DNS6);
728 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
729 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800730 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
731 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900732 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900733 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800734 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
735 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900736 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
737
738 // A link with an IPv6 address and default route, but IPv4 DNS server.
739 LinkProperties mixed = new LinkProperties();
740 mixed.addLinkAddress(LINKADDRV6);
741 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900742 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800743 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
744 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900745 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
746 }
Erik Kline04612b02015-05-21 16:15:02 +0900747
Hugo Benichi87d306b2017-10-12 09:54:49 +0900748 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900749 public void testCompareProvisioning() {
750 LinkProperties v4lp = new LinkProperties();
751 v4lp.addLinkAddress(LINKADDRV4);
752 v4lp.addRoute(new RouteInfo(GATEWAY1));
753 v4lp.addDnsServer(DNS1);
754 assertTrue(v4lp.isProvisioned());
755
756 LinkProperties v4r = new LinkProperties(v4lp);
757 v4r.removeDnsServer(DNS1);
758 assertFalse(v4r.isProvisioned());
759
760 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
761 LinkProperties.compareProvisioning(v4r, v4r));
762 assertEquals(ProvisioningChange.LOST_PROVISIONING,
763 LinkProperties.compareProvisioning(v4lp, v4r));
764 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
765 LinkProperties.compareProvisioning(v4r, v4lp));
766 assertEquals(ProvisioningChange.STILL_PROVISIONED,
767 LinkProperties.compareProvisioning(v4lp, v4lp));
768
769 // Check that losing IPv4 provisioning on a dualstack network is
770 // seen as a total loss of provisioning.
771 LinkProperties v6lp = new LinkProperties();
772 v6lp.addLinkAddress(LINKADDRV6);
773 v6lp.addRoute(new RouteInfo(GATEWAY61));
774 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800775 assertFalse(v6lp.isIpv4Provisioned());
776 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900777 assertTrue(v6lp.isProvisioned());
778
779 LinkProperties v46lp = new LinkProperties(v6lp);
780 v46lp.addLinkAddress(LINKADDRV4);
781 v46lp.addRoute(new RouteInfo(GATEWAY1));
782 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800783 assertTrue(v46lp.isIpv4Provisioned());
784 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900785 assertTrue(v46lp.isProvisioned());
786
787 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900788 LinkProperties.compareProvisioning(v4lp, v46lp));
789 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900790 LinkProperties.compareProvisioning(v6lp, v46lp));
791 assertEquals(ProvisioningChange.LOST_PROVISIONING,
792 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900793 assertEquals(ProvisioningChange.LOST_PROVISIONING,
794 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900795
796 // Check that losing and gaining a secondary router does not change
797 // the provisioning status.
798 LinkProperties v6lp2 = new LinkProperties(v6lp);
799 v6lp2.addRoute(new RouteInfo(GATEWAY62));
800 assertTrue(v6lp2.isProvisioned());
801
802 assertEquals(ProvisioningChange.STILL_PROVISIONED,
803 LinkProperties.compareProvisioning(v6lp2, v6lp));
804 assertEquals(ProvisioningChange.STILL_PROVISIONED,
805 LinkProperties.compareProvisioning(v6lp, v6lp2));
806 }
Erik Klinea923dba2015-06-26 19:21:34 +0900807
Hugo Benichi87d306b2017-10-12 09:54:49 +0900808 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900809 public void testIsReachable() {
810 final LinkProperties v4lp = new LinkProperties();
811 assertFalse(v4lp.isReachable(DNS1));
812 assertFalse(v4lp.isReachable(DNS2));
813
814 // Add an on-link route, making the on-link DNS server reachable,
815 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900816 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900817 assertFalse(v4lp.isReachable(DNS1));
818 assertFalse(v4lp.isReachable(DNS2));
819
820 // Adding an IPv4 address (right now, any IPv4 address) means we use
821 // the routes to compute likely reachability.
822 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
823 assertTrue(v4lp.isReachable(DNS1));
824 assertFalse(v4lp.isReachable(DNS2));
825
826 // Adding a default route makes the off-link DNS server reachable.
827 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
828 assertTrue(v4lp.isReachable(DNS1));
829 assertTrue(v4lp.isReachable(DNS2));
830
831 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900832 final InetAddress kLinkLocalDns = address("fe80::6:1");
833 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
834 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900835 assertFalse(v6lp.isReachable(kLinkLocalDns));
836 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
837 assertFalse(v6lp.isReachable(kOnLinkDns));
838 assertFalse(v6lp.isReachable(DNS6));
839
840 // Add a link-local route, making the link-local DNS servers reachable. Because
841 // we assume the presence of an IPv6 link-local address, link-local DNS servers
842 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900843 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900844 assertFalse(v6lp.isReachable(kLinkLocalDns));
845 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
846 assertFalse(v6lp.isReachable(kOnLinkDns));
847 assertFalse(v6lp.isReachable(DNS6));
848
849 // Add a link-local address--nothing changes.
850 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
851 assertFalse(v6lp.isReachable(kLinkLocalDns));
852 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
853 assertFalse(v6lp.isReachable(kOnLinkDns));
854 assertFalse(v6lp.isReachable(DNS6));
855
856 // Add a global route on link, but no global address yet. DNS servers reachable
857 // via a route that doesn't require a gateway: give them the benefit of the
858 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900859 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900860 assertFalse(v6lp.isReachable(kLinkLocalDns));
861 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
862 assertTrue(v6lp.isReachable(kOnLinkDns));
863 assertFalse(v6lp.isReachable(DNS6));
864
865 // Add a global address; the on-link global address DNS server is (still)
866 // presumed reachable.
867 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
868 assertFalse(v6lp.isReachable(kLinkLocalDns));
869 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
870 assertTrue(v6lp.isReachable(kOnLinkDns));
871 assertFalse(v6lp.isReachable(DNS6));
872
873 // Adding a default route makes the off-link DNS server reachable.
874 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
875 assertFalse(v6lp.isReachable(kLinkLocalDns));
876 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
877 assertTrue(v6lp.isReachable(kOnLinkDns));
878 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900879
880 // Check isReachable on stacked links. This requires that the source IP address be assigned
881 // on the interface returned by the route lookup.
882 LinkProperties stacked = new LinkProperties();
883
884 // Can't add a stacked link without an interface name.
885 stacked.setInterfaceName("v4-test0");
886 v6lp.addStackedLink(stacked);
887
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900888 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900889 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
890 assertFalse(v6lp.isReachable(stackedAddress));
891 stacked.addLinkAddress(stackedLinkAddress);
892 assertFalse(v6lp.isReachable(stackedAddress));
893 stacked.addRoute(new RouteInfo(stackedLinkAddress));
894 assertTrue(stacked.isReachable(stackedAddress));
895 assertTrue(v6lp.isReachable(stackedAddress));
896
897 assertFalse(v6lp.isReachable(DNS1));
898 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
899 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900900 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100901
Hugo Benichi87d306b2017-10-12 09:54:49 +0900902 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100903 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
904 // IPv4 case: no route added initially
905 LinkProperties rmnet0 = new LinkProperties();
906 rmnet0.setInterfaceName("rmnet0");
907 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
908 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
909 rmnet0.getInterfaceName());
910
911 // Since no routes is added explicitly, getAllRoutes() should return empty.
912 assertTrue(rmnet0.getAllRoutes().isEmpty());
913 rmnet0.ensureDirectlyConnectedRoutes();
914 // ensureDirectlyConnectedRoutes() should have added the missing local route.
915 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
916
917 // IPv4 case: both direct and default routes added initially
918 LinkProperties rmnet1 = new LinkProperties();
919 rmnet1.setInterfaceName("rmnet1");
920 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900921 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800922 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100923 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
924 rmnet1.getInterfaceName());
925 rmnet1.addRoute(defaultRoute1);
926 rmnet1.addRoute(directRoute1);
927
928 // Check added routes
929 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
930 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
931 // route is already part of the configuration.
932 rmnet1.ensureDirectlyConnectedRoutes();
933 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
934
935 // IPv6 case: only default routes added initially
936 LinkProperties rmnet2 = new LinkProperties();
937 rmnet2.setInterfaceName("rmnet2");
938 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
939 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900940 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800941 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100942 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
943 rmnet2.getInterfaceName());
944 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
945 rmnet2.getInterfaceName());
946 rmnet2.addRoute(defaultRoute2);
947
948 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
949 rmnet2.ensureDirectlyConnectedRoutes();
950 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
951 rmnet2.getAllRoutes());
952
953 // Corner case: no interface name
954 LinkProperties rmnet3 = new LinkProperties();
955 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
956 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
957 rmnet3.getInterfaceName());
958
959 assertTrue(rmnet3.getAllRoutes().isEmpty());
960 rmnet3.ensureDirectlyConnectedRoutes();
961 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100962 }
963
Rubin Xuffd77d82017-09-05 18:40:49 +0100964 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
965 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
966 Set<RouteInfo> actualSet = new ArraySet<>(actual);
967 // Duplicated entries in actual routes are considered failures
968 assertEquals(actual.size(), actualSet.size());
969
970 assertEquals(expectedSet, actualSet);
971 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100972
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900973 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900974 LinkProperties source = new LinkProperties();
975 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900976
Chalard Jean299d8562018-04-11 16:36:41 +0900977 source.addLinkAddress(LINKADDRV4);
978 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900979
Chalard Jean299d8562018-04-11 16:36:41 +0900980 source.addDnsServer(DNS1);
981 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900982 source.addDnsServer(GATEWAY62);
983
984 source.addPcscfServer(TESTIPV4ADDR);
985 source.addPcscfServer(TESTIPV6ADDR);
986
987 source.setUsePrivateDns(true);
988 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
989
990 source.setDomains(DOMAINS);
991
Chalard Jean299d8562018-04-11 16:36:41 +0900992 source.addRoute(new RouteInfo(GATEWAY1));
993 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900994
Chalard Jean299d8562018-04-11 16:36:41 +0900995 source.addValidatedPrivateDnsServer(DNS6);
996 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900997 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
998
999 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +09001000
1001 source.setMtu(MTU);
1002
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001003 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
1004
Lorenzo Colitti981b34f2019-01-08 09:58:59 +09001005 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
1006
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001007 final LinkProperties stacked = new LinkProperties();
1008 stacked.setInterfaceName("test-stacked");
1009 source.addStackedLink(stacked);
1010
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001011 return source;
1012 }
1013
1014 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1015 public void testLinkPropertiesParcelable_Q() throws Exception {
1016 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001017 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001018 }
1019
1020 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1021 public void testLinkPropertiesParcelable() throws Exception {
1022 final LinkProperties source = makeLinkPropertiesForParceling();
1023
1024 source.setWakeOnLanSupported(true);
1025 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1026 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1027 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001028 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001029
1030 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1031 final LinkProperties sanitized = new LinkProperties(source);
1032 sanitized.setCaptivePortalApiUrl(null);
1033 sanitized.setCaptivePortalData(null);
1034 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001035 }
1036
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001037 // Parceling of the scope was broken until Q-QPR2
1038 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001039 public void testLinkLocalDnsServerParceling() throws Exception {
1040 final String strAddress = "fe80::1%lo";
1041 final LinkProperties lp = new LinkProperties();
1042 lp.addDnsServer(address(strAddress));
1043 final LinkProperties unparceled = parcelingRoundTrip(lp);
1044 // Inet6Address#equals does not test for the scope id
1045 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001046 }
Chalard Jean299d8562018-04-11 16:36:41 +09001047
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001048 @Test
1049 public void testParcelUninitialized() throws Exception {
1050 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001051 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001052 }
paulhu9f7636c2019-05-02 17:43:28 +08001053
1054 @Test
1055 public void testConstructor() {
1056 LinkProperties lp = new LinkProperties();
1057 checkEmpty(lp);
1058 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1059 assertLinkPropertiesEqual(lp, new LinkProperties());
1060
1061 lp = makeTestObject();
1062 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1063 }
1064
1065 @Test
1066 public void testDnsServers() {
1067 final LinkProperties lp = new LinkProperties();
1068 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1069 lp.setDnsServers(dnsServers);
1070 assertEquals(2, lp.getDnsServers().size());
1071 assertEquals(DNS1, lp.getDnsServers().get(0));
1072 assertEquals(DNS2, lp.getDnsServers().get(1));
1073
1074 lp.removeDnsServer(DNS1);
1075 assertEquals(1, lp.getDnsServers().size());
1076 assertEquals(DNS2, lp.getDnsServers().get(0));
1077
1078 lp.addDnsServer(DNS6);
1079 assertEquals(2, lp.getDnsServers().size());
1080 assertEquals(DNS2, lp.getDnsServers().get(0));
1081 assertEquals(DNS6, lp.getDnsServers().get(1));
1082 }
1083
1084 @Test
1085 public void testValidatedPrivateDnsServers() {
1086 final LinkProperties lp = new LinkProperties();
1087 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1088 lp.setValidatedPrivateDnsServers(privDnsServers);
1089 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1090 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1091 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1092
1093 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1094 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1095 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1096
1097 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1098 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1099 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1100 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1101 }
1102
1103 @Test
1104 public void testPcscfServers() {
1105 final LinkProperties lp = new LinkProperties();
1106 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1107 lp.setPcscfServers(pcscfServers);
1108 assertEquals(1, lp.getPcscfServers().size());
1109 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1110
1111 lp.removePcscfServer(PCSCFV4);
1112 assertEquals(0, lp.getPcscfServers().size());
1113
1114 lp.addPcscfServer(PCSCFV6);
1115 assertEquals(1, lp.getPcscfServers().size());
1116 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1117 }
1118
1119 @Test
1120 public void testTcpBufferSizes() {
1121 final LinkProperties lp = makeTestObject();
1122 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1123
1124 lp.setTcpBufferSizes(null);
1125 assertNull(lp.getTcpBufferSizes());
1126 }
1127
1128 @Test
1129 public void testHasIpv6DefaultRoute() {
1130 final LinkProperties lp = makeTestObject();
1131 assertFalse(lp.hasIPv6DefaultRoute());
1132
1133 lp.addRoute(new RouteInfo(GATEWAY61));
1134 assertTrue(lp.hasIPv6DefaultRoute());
1135 }
1136
1137 @Test
1138 public void testHttpProxy() {
1139 final LinkProperties lp = makeTestObject();
1140 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1141 }
1142
1143 @Test
1144 public void testPrivateDnsServerName() {
1145 final LinkProperties lp = makeTestObject();
1146 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1147
1148 lp.setPrivateDnsServerName(null);
1149 assertNull(lp.getPrivateDnsServerName());
1150 }
1151
1152 @Test
1153 public void testUsePrivateDns() {
1154 final LinkProperties lp = makeTestObject();
1155 assertTrue(lp.isPrivateDnsActive());
1156
1157 lp.clear();
1158 assertFalse(lp.isPrivateDnsActive());
1159 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001160
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001161 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001162 public void testDhcpServerAddress() {
1163 final LinkProperties lp = makeTestObject();
1164 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1165
1166 lp.clear();
1167 assertNull(lp.getDhcpServerAddress());
1168 }
1169
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001170 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001171 public void testWakeOnLanSupported() {
1172 final LinkProperties lp = makeTestObject();
1173 assertTrue(lp.isWakeOnLanSupported());
1174
1175 lp.clear();
1176 assertFalse(lp.isWakeOnLanSupported());
1177 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001178
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001179 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001180 public void testCaptivePortalApiUrl() {
1181 final LinkProperties lp = makeTestObject();
1182 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1183
1184 lp.clear();
1185 assertNull(lp.getCaptivePortalApiUrl());
1186 }
1187
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001188 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001189 public void testCaptivePortalData() {
1190 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001191 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001192
1193 lp.clear();
1194 assertNull(lp.getCaptivePortalData());
1195 }
lucaslin55c6a842020-03-26 19:15:11 +08001196
1197 private LinkProperties makeIpv4LinkProperties() {
1198 final LinkProperties linkProperties = new LinkProperties();
1199 linkProperties.setInterfaceName(NAME);
1200 linkProperties.addLinkAddress(LINKADDRV4);
1201 linkProperties.addDnsServer(DNS1);
1202 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1203 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1204 return linkProperties;
1205 }
1206
1207 private LinkProperties makeIpv6LinkProperties() {
1208 final LinkProperties linkProperties = new LinkProperties();
1209 linkProperties.setInterfaceName(NAME);
1210 linkProperties.addLinkAddress(LINKADDRV6);
1211 linkProperties.addDnsServer(DNS6);
1212 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1213 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1214 return linkProperties;
1215 }
1216
1217 @Test
1218 public void testHasIpv4DefaultRoute() {
1219 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1220 assertTrue(Ipv4.hasIpv4DefaultRoute());
1221 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1222 assertFalse(Ipv6.hasIpv4DefaultRoute());
1223 }
1224
1225 @Test
1226 public void testHasIpv4DnsServer() {
1227 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1228 assertTrue(Ipv4.hasIpv4DnsServer());
1229 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1230 assertFalse(Ipv6.hasIpv4DnsServer());
1231 }
1232
1233 @Test
1234 public void testHasIpv6DnsServer() {
1235 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1236 assertFalse(Ipv4.hasIpv6DnsServer());
1237 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1238 assertTrue(Ipv6.hasIpv6DnsServer());
1239 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001240
1241 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1242 public void testHasIpv4UnreachableDefaultRoute() {
1243 final LinkProperties lp = makeTestObject();
1244 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1245 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1246
1247 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1248 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1249 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1250 }
1251
1252 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1253 public void testHasIpv6UnreachableDefaultRoute() {
1254 final LinkProperties lp = makeTestObject();
1255 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1256 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1257
1258 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1259 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1260 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1261 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001262
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001263 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1264 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Yuyang Huang90a2cbd2023-02-09 16:29:16 +09001265 @EnableCompatChanges({ConnectivityCompatChanges.EXCLUDED_ROUTES})
Prerana2b97bbe2022-04-28 04:02:05 +00001266 public void testHasExcludeRoute() {
1267 LinkProperties lp = new LinkProperties();
preranapee4bfe72022-05-11 04:23:14 +00001268 lp.setInterfaceName("tun0");
1269 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 24), RTN_UNICAST));
Prerana2b97bbe2022-04-28 04:02:05 +00001270 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_UNICAST));
1271 assertFalse(lp.hasExcludeRoute());
preranapee4bfe72022-05-11 04:23:14 +00001272 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 32), RTN_THROW));
Prerana2b97bbe2022-04-28 04:02:05 +00001273 assertTrue(lp.hasExcludeRoute());
1274 }
1275
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001276 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1277 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Yuyang Huang90a2cbd2023-02-09 16:29:16 +09001278 @EnableCompatChanges({ConnectivityCompatChanges.EXCLUDED_ROUTES})
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001279 public void testRouteAddWithSameKey() throws Exception {
1280 LinkProperties lp = new LinkProperties();
1281 lp.setInterfaceName("wlan0");
1282 final IpPrefix v6 = new IpPrefix("64:ff9b::/96");
1283 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1280));
1284 assertEquals(1, lp.getRoutes().size());
1285 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1500));
1286 assertEquals(1, lp.getRoutes().size());
1287 final IpPrefix v4 = new IpPrefix("192.0.2.128/25");
1288 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_UNICAST, 1460));
1289 assertEquals(2, lp.getRoutes().size());
1290 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_THROW, 1460));
1291 assertEquals(2, lp.getRoutes().size());
1292 }
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001293
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001294 private void assertExcludeRoutesVisible() {
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001295 final LinkProperties lp = new LinkProperties();
1296 assertEquals(0, lp.getRoutes().size());
1297
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001298 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 31), RTN_UNREACHABLE));
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001299 assertEquals(1, lp.getRoutes().size());
1300
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001301 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 127), RTN_THROW));
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001302 assertEquals(2, lp.getRoutes().size());
1303
1304 lp.addRoute(new RouteInfo(GATEWAY1));
1305 assertEquals(3, lp.getRoutes().size());
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001306
1307 lp.addRoute(new RouteInfo(new IpPrefix(DNS6, 127), RTN_UNICAST));
1308 assertEquals(4, lp.getRoutes().size());
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001309 }
1310
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001311 private void assertExcludeRoutesNotVisible() {
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001312 final LinkProperties lp = new LinkProperties();
1313 assertEquals(0, lp.getRoutes().size());
1314
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001315 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 31), RTN_UNREACHABLE));
1316 assertEquals(0, lp.getRoutes().size());
1317
1318 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 127), RTN_THROW));
1319 assertEquals(0, lp.getRoutes().size());
1320
1321 lp.addRoute(new RouteInfo(GATEWAY1));
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001322 assertEquals(1, lp.getRoutes().size());
1323
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001324 lp.addRoute(new RouteInfo(new IpPrefix(DNS6, 127), RTN_UNICAST));
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001325 assertEquals(2, lp.getRoutes().size());
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001326 }
1327
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001328 private void checkExcludeRoutesNotVisibleAfterS() {
1329 if (!SdkLevel.isAtLeastT()) {
1330 // RTN_THROW routes are visible on R and S when added by the caller (but they are not
1331 // added by the system except for legacy VPN).
1332 // This is uncommon usage but was tested by CTSr12.
1333 assertExcludeRoutesVisible();
1334 } else {
1335 assertExcludeRoutesNotVisible();
1336 }
1337 }
1338
1339 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1340 @CtsNetTestCasesMaxTargetSdk31(reason = "Testing behaviour for target SDK 31")
1341 public void testExcludedRoutesNotVisibleOnTargetSdk31() {
1342 checkExcludeRoutesNotVisibleAfterS();
1343 }
1344
1345 @Test
1346 public void testExcludedRoutesVisibleOnTargetSdk33AndAbove() {
1347 assertExcludeRoutesVisible();
1348 }
1349
1350 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1351 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Yuyang Huang90a2cbd2023-02-09 16:29:16 +09001352 @EnableCompatChanges({ConnectivityCompatChanges.EXCLUDED_ROUTES})
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001353 public void testExcludedRoutesEnabledByCompatChange() {
1354 assertExcludeRoutesVisible();
1355 }
1356
1357 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001358 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Yuyang Huang90a2cbd2023-02-09 16:29:16 +09001359 @DisableCompatChanges({ConnectivityCompatChanges.EXCLUDED_ROUTES})
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001360 public void testExcludedRoutesDisabledByCompatChange() {
1361 checkExcludeRoutesNotVisibleAfterS();
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001362 }
John Wang3e567d52011-04-04 12:35:42 -07001363}