blob: 5ee375f2c41683da4abc12a66796862e92ee19dd [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
Brett Chabot147f6cf2019-03-04 14:14:56 -080039import androidx.test.filters.SmallTest;
40import androidx.test.runner.AndroidJUnit4;
41
Lorenzo Colitticcd30202022-07-21 15:42:37 +090042import com.android.modules.utils.build.SdkLevel;
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
117 private void checkEmpty(final LinkProperties lp) {
118 assertEquals(0, lp.getAllInterfaceNames().size());
119 assertEquals(0, lp.getAllAddresses().size());
120 assertEquals(0, lp.getDnsServers().size());
121 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
122 assertEquals(0, lp.getPcscfServers().size());
123 assertEquals(0, lp.getAllRoutes().size());
124 assertEquals(0, lp.getAllLinkAddresses().size());
125 assertEquals(0, lp.getStackedLinks().size());
126 assertEquals(0, lp.getMtu());
127 assertNull(lp.getPrivateDnsServerName());
128 assertNull(lp.getDomains());
129 assertNull(lp.getHttpProxy());
130 assertNull(lp.getTcpBufferSizes());
131 assertNull(lp.getNat64Prefix());
132 assertFalse(lp.isProvisioned());
133 assertFalse(lp.isIpv4Provisioned());
134 assertFalse(lp.isIpv6Provisioned());
135 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900136
Lorenzo Colitticcd30202022-07-21 15:42:37 +0900137 if (SdkLevel.isAtLeastR()) {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900138 assertNull(lp.getDhcpServerAddress());
139 assertFalse(lp.isWakeOnLanSupported());
140 assertNull(lp.getCaptivePortalApiUrl());
141 assertNull(lp.getCaptivePortalData());
142 }
paulhu9f7636c2019-05-02 17:43:28 +0800143 }
144
145 private LinkProperties makeTestObject() {
146 final LinkProperties lp = new LinkProperties();
147 lp.setInterfaceName(NAME);
148 lp.addLinkAddress(LINKADDRV4);
149 lp.addLinkAddress(LINKADDRV6);
150 lp.addDnsServer(DNS1);
151 lp.addDnsServer(DNS2);
152 lp.addValidatedPrivateDnsServer(PRIVDNS1);
153 lp.addValidatedPrivateDnsServer(PRIVDNS2);
154 lp.setUsePrivateDns(true);
155 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
156 lp.addPcscfServer(PCSCFV6);
157 lp.setDomains(DOMAINS);
158 lp.addRoute(new RouteInfo(GATEWAY1));
159 lp.addRoute(new RouteInfo(GATEWAY2));
160 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
161 lp.setMtu(MTU);
162 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
163 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Lorenzo Colitticcd30202022-07-21 15:42:37 +0900164 if (SdkLevel.isAtLeastR()) {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900165 lp.setDhcpServerAddress(DHCPSERVER);
166 lp.setWakeOnLanSupported(true);
167 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
168 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
169 }
paulhu9f7636c2019-05-02 17:43:28 +0800170 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900171 }
172
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900173 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
174 // Check implementation of equals(), element by element.
175 assertTrue(source.isIdenticalInterfaceName(target));
176 assertTrue(target.isIdenticalInterfaceName(source));
177
178 assertTrue(source.isIdenticalAddresses(target));
179 assertTrue(target.isIdenticalAddresses(source));
180
181 assertTrue(source.isIdenticalDnses(target));
182 assertTrue(target.isIdenticalDnses(source));
183
dalyk7643abc2018-01-17 14:20:55 -0500184 assertTrue(source.isIdenticalPrivateDns(target));
185 assertTrue(target.isIdenticalPrivateDns(source));
186
Chalard Jean299d8562018-04-11 16:36:41 +0900187 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
188 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
189
Hongshike2d7cf52018-06-28 20:42:19 +0900190 assertTrue(source.isIdenticalPcscfs(target));
191 assertTrue(target.isIdenticalPcscfs(source));
192
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900193 assertTrue(source.isIdenticalRoutes(target));
194 assertTrue(target.isIdenticalRoutes(source));
195
196 assertTrue(source.isIdenticalHttpProxy(target));
197 assertTrue(target.isIdenticalHttpProxy(source));
198
199 assertTrue(source.isIdenticalStackedLinks(target));
200 assertTrue(target.isIdenticalStackedLinks(source));
201
sy.yun4aa73922013-09-02 05:24:09 +0900202 assertTrue(source.isIdenticalMtu(target));
203 assertTrue(target.isIdenticalMtu(source));
204
dalyk7643abc2018-01-17 14:20:55 -0500205 assertTrue(source.isIdenticalTcpBufferSizes(target));
206 assertTrue(target.isIdenticalTcpBufferSizes(source));
207
Lorenzo Colitticcd30202022-07-21 15:42:37 +0900208 if (SdkLevel.isAtLeastR()) {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900209 assertTrue(source.isIdenticalDhcpServerAddress(target));
210 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200211
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900212 assertTrue(source.isIdenticalWakeOnLan(target));
213 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900214
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900215 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
216 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
217
218 assertTrue(source.isIdenticalCaptivePortalData(target));
219 assertTrue(target.isIdenticalCaptivePortalData(source));
220 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900221
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900222 // Check result of equals().
223 assertTrue(source.equals(target));
224 assertTrue(target.equals(source));
225
226 // Check hashCode.
227 assertEquals(source.hashCode(), target.hashCode());
228 }
229
Hugo Benichi87d306b2017-10-12 09:54:49 +0900230 @Test
John Wang3e567d52011-04-04 12:35:42 -0700231 public void testEqualsNull() {
232 LinkProperties source = new LinkProperties();
233 LinkProperties target = new LinkProperties();
234
235 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900236 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700237 }
238
Hugo Benichi87d306b2017-10-12 09:54:49 +0900239 @Test
240 public void testEqualsSameOrder() throws Exception {
241 LinkProperties source = new LinkProperties();
242 source.setInterfaceName(NAME);
243 // set 2 link addresses
244 source.addLinkAddress(LINKADDRV4);
245 source.addLinkAddress(LINKADDRV6);
246 // set 2 dnses
247 source.addDnsServer(DNS1);
248 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900249 // set 1 pcscf
250 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900251 // set 2 gateways
252 source.addRoute(new RouteInfo(GATEWAY1));
253 source.addRoute(new RouteInfo(GATEWAY2));
254 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700255
Hugo Benichi87d306b2017-10-12 09:54:49 +0900256 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700257
Hugo Benichi87d306b2017-10-12 09:54:49 +0900258 // All fields are same
259 target.setInterfaceName(NAME);
260 target.addLinkAddress(LINKADDRV4);
261 target.addLinkAddress(LINKADDRV6);
262 target.addDnsServer(DNS1);
263 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900264 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900265 target.addRoute(new RouteInfo(GATEWAY1));
266 target.addRoute(new RouteInfo(GATEWAY2));
267 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700268
Hugo Benichi87d306b2017-10-12 09:54:49 +0900269 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700270
Hugo Benichi87d306b2017-10-12 09:54:49 +0900271 target.clear();
272 // change Interface Name
273 target.setInterfaceName("qmi1");
274 target.addLinkAddress(LINKADDRV4);
275 target.addLinkAddress(LINKADDRV6);
276 target.addDnsServer(DNS1);
277 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900278 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900279 target.addRoute(new RouteInfo(GATEWAY1));
280 target.addRoute(new RouteInfo(GATEWAY2));
281 target.setMtu(MTU);
282 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700283
Hugo Benichi87d306b2017-10-12 09:54:49 +0900284 target.clear();
285 target.setInterfaceName(NAME);
286 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900287 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900288 target.addLinkAddress(LINKADDRV6);
289 target.addDnsServer(DNS1);
290 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900291 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900292 target.addRoute(new RouteInfo(GATEWAY1));
293 target.addRoute(new RouteInfo(GATEWAY2));
294 target.setMtu(MTU);
295 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700296
Hugo Benichi87d306b2017-10-12 09:54:49 +0900297 target.clear();
298 target.setInterfaceName(NAME);
299 target.addLinkAddress(LINKADDRV4);
300 target.addLinkAddress(LINKADDRV6);
301 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900302 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900303 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900304 target.addPcscfServer(PCSCFV6);
305 target.addRoute(new RouteInfo(GATEWAY1));
306 target.addRoute(new RouteInfo(GATEWAY2));
307 target.setMtu(MTU);
308 assertFalse(source.equals(target));
309
310 target.clear();
311 target.setInterfaceName(NAME);
312 target.addLinkAddress(LINKADDRV4);
313 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900314 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900315 target.addDnsServer(DNS2);
316 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900317 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900318 target.addRoute(new RouteInfo(GATEWAY1));
319 target.addRoute(new RouteInfo(GATEWAY2));
320 target.setMtu(MTU);
321 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700322
Hugo Benichi87d306b2017-10-12 09:54:49 +0900323 target.clear();
324 target.setInterfaceName(NAME);
325 target.addLinkAddress(LINKADDRV4);
326 target.addLinkAddress(LINKADDRV6);
327 target.addDnsServer(DNS1);
328 target.addDnsServer(DNS2);
329 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900330 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900331 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900332 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900333 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900334
Hugo Benichi87d306b2017-10-12 09:54:49 +0900335 target.clear();
336 target.setInterfaceName(NAME);
337 target.addLinkAddress(LINKADDRV4);
338 target.addLinkAddress(LINKADDRV6);
339 target.addDnsServer(DNS1);
340 target.addDnsServer(DNS2);
341 target.addRoute(new RouteInfo(GATEWAY1));
342 target.addRoute(new RouteInfo(GATEWAY2));
343 // change mtu
344 target.setMtu(1440);
345 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700346 }
347
Hugo Benichi87d306b2017-10-12 09:54:49 +0900348 @Test
349 public void testEqualsDifferentOrder() throws Exception {
350 LinkProperties source = new LinkProperties();
351 source.setInterfaceName(NAME);
352 // set 2 link addresses
353 source.addLinkAddress(LINKADDRV4);
354 source.addLinkAddress(LINKADDRV6);
355 // set 2 dnses
356 source.addDnsServer(DNS1);
357 source.addDnsServer(DNS2);
358 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800359 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900360 source.addRoute(new RouteInfo(GATEWAY2));
361 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700362
Hugo Benichi87d306b2017-10-12 09:54:49 +0900363 LinkProperties target = new LinkProperties();
364 // Exchange order
365 target.setInterfaceName(NAME);
366 target.addLinkAddress(LINKADDRV6);
367 target.addLinkAddress(LINKADDRV4);
368 target.addDnsServer(DNS2);
369 target.addDnsServer(DNS1);
370 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800371 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900372 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700373
Hugo Benichi87d306b2017-10-12 09:54:49 +0900374 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700375 }
376
Hugo Benichi87d306b2017-10-12 09:54:49 +0900377 @Test
378 public void testEqualsDuplicated() throws Exception {
379 LinkProperties source = new LinkProperties();
380 // set 3 link addresses, eg, [A, A, B]
381 source.addLinkAddress(LINKADDRV4);
382 source.addLinkAddress(LINKADDRV4);
383 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700384
Hugo Benichi87d306b2017-10-12 09:54:49 +0900385 LinkProperties target = new LinkProperties();
386 // set 3 link addresses, eg, [A, B, B]
387 target.addLinkAddress(LINKADDRV4);
388 target.addLinkAddress(LINKADDRV6);
389 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700390
Hugo Benichi87d306b2017-10-12 09:54:49 +0900391 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700392 }
393
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800394 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
395 for (RouteInfo r : lp.getRoutes()) {
396 assertEquals(iface, r.getInterface());
397 }
398 }
399
paulhu9f7636c2019-05-02 17:43:28 +0800400 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
401 for (RouteInfo r : lp.getRoutes()) {
402 assertNotEquals(iface, r.getInterface());
403 }
404 }
405
Hugo Benichi87d306b2017-10-12 09:54:49 +0900406 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800407 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800408 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
409 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900410 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800411
412 // Add a route with no interface to a LinkProperties with no interface. No errors.
413 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800414 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900415 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800416 assertEquals(1, lp.getRoutes().size());
417 assertAllRoutesHaveInterface(null, lp);
418
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900419 // Adding the same route twice has no effect.
420 assertFalse(lp.addRoute(r));
421 assertEquals(1, lp.getRoutes().size());
422
423 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800424 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800425 try {
426 lp.addRoute(r);
427 fail("Adding wlan0 route to LP with no interface, expect exception");
428 } catch (IllegalArgumentException expected) {}
429
430 // Change the interface name. All the routes should change their interface name too.
431 lp.setInterfaceName("rmnet0");
432 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800433 assertAllRoutesNotHaveInterface(null, lp);
434 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800435
436 // Now add a route with the wrong interface. This causes an exception too.
437 try {
438 lp.addRoute(r);
439 fail("Adding wlan0 route to rmnet0 LP, expect exception");
440 } catch (IllegalArgumentException expected) {}
441
442 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800443 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800444 lp.setInterfaceName("wlan0");
445 lp.addRoute(r);
446 assertEquals(2, lp.getRoutes().size());
447 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800448 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800449
450 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900451 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800452 lp.addRoute(r);
453 assertEquals(3, lp.getRoutes().size());
454 assertAllRoutesHaveInterface("wlan0", lp);
455
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900456 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800457 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800458 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900459 final CompareResult<RouteInfo> cr1 =
460 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
461 assertEquals(0, cr1.added.size());
462 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800463
464 lp2.setInterfaceName("p2p0");
465 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800466 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900467 final CompareResult<RouteInfo> cr2 =
468 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
469 assertEquals(3, cr2.added.size());
470 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800471
Tyler Wear44999a72020-02-13 17:14:38 -0800472 // Remove route with incorrect interface, no route removed.
473 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800474 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800475
476 // Check remove works when interface is correct.
477 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800478 assertEquals(2, lp.getRoutes().size());
479 assertAllRoutesHaveInterface("wlan0", lp);
480 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900481 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800482
Hugo Benichi87d306b2017-10-12 09:54:49 +0900483 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800484 public void testStackedInterfaces() {
485 LinkProperties rmnet0 = new LinkProperties();
486 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900487 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800488
489 LinkProperties clat4 = new LinkProperties();
490 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900491 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800492
493 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900494 assertEquals(1, rmnet0.getAddresses().size());
495 assertEquals(1, rmnet0.getLinkAddresses().size());
496 assertEquals(1, rmnet0.getAllAddresses().size());
497 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800498 assertEquals(1, rmnet0.getAllInterfaceNames().size());
499 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900500
Lorenzo Colittic0803122013-03-07 10:59:25 -0800501 rmnet0.addStackedLink(clat4);
502 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900503 assertEquals(1, rmnet0.getAddresses().size());
504 assertEquals(1, rmnet0.getLinkAddresses().size());
505 assertEquals(2, rmnet0.getAllAddresses().size());
506 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800507 assertEquals(2, rmnet0.getAllInterfaceNames().size());
508 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
509 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900510
Lorenzo Colittic0803122013-03-07 10:59:25 -0800511 rmnet0.addStackedLink(clat4);
512 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900513 assertEquals(1, rmnet0.getAddresses().size());
514 assertEquals(1, rmnet0.getLinkAddresses().size());
515 assertEquals(2, rmnet0.getAllAddresses().size());
516 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800517 assertEquals(2, rmnet0.getAllInterfaceNames().size());
518 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
519 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900520
Lorenzo Colittic0803122013-03-07 10:59:25 -0800521 assertEquals(0, clat4.getStackedLinks().size());
522
523 // Modify an item in the returned collection to see what happens.
524 for (LinkProperties link : rmnet0.getStackedLinks()) {
525 if (link.getInterfaceName().equals("clat4")) {
526 link.setInterfaceName("newname");
527 }
528 }
529 for (LinkProperties link : rmnet0.getStackedLinks()) {
530 assertFalse("newname".equals(link.getInterfaceName()));
531 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900532
Lorenzo Colitti38258432014-10-20 11:08:03 +0900533 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900534 assertEquals(0, rmnet0.getStackedLinks().size());
535 assertEquals(1, rmnet0.getAddresses().size());
536 assertEquals(1, rmnet0.getLinkAddresses().size());
537 assertEquals(1, rmnet0.getAllAddresses().size());
538 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800539 assertEquals(1, rmnet0.getAllInterfaceNames().size());
540 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900541
Lorenzo Colitti38258432014-10-20 11:08:03 +0900542 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900543 }
544
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900545 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
546 return lp.getLinkAddresses().iterator().next();
547 }
548
Hugo Benichi87d306b2017-10-12 09:54:49 +0900549 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900550 public void testAddressMethods() {
551 LinkProperties lp = new LinkProperties();
552
553 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800554 assertFalse(lp.hasIpv4Address());
555 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900556
557 // Addresses on stacked links don't count.
558 LinkProperties stacked = new LinkProperties();
559 stacked.setInterfaceName("stacked");
560 lp.addStackedLink(stacked);
561 stacked.addLinkAddress(LINKADDRV4);
562 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800563 assertTrue(stacked.hasIpv4Address());
564 assertTrue(stacked.hasGlobalIpv6Address());
565 assertFalse(lp.hasIpv4Address());
566 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900567 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800568 assertFalse(lp.hasIpv4Address());
569 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900570
571 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800572 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900573 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900574 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900575 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900576 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800577 assertFalse(lp.hasIpv4Address());
578 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900579
580 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900581 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900582
Lorenzo Colittifc854692014-06-23 22:33:43 +0900583 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
584 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800585 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900586
587 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900588 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800589 assertTrue(lp.hasIpv4Address());
590 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900591
592 assertTrue(lp.addLinkAddress(LINKADDRV6));
593 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800594 assertTrue(lp.hasIpv4Address());
595 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900596
597 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
598 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800599 assertTrue(lp.hasIpv4Address());
600 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900601
602 // Adding an address twice has no effect.
603 // Removing an address that's not present has no effect.
604 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900605 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800606 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900607 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900608 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800609 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900610 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900611 assertEquals(1, lp.getLinkAddresses().size());
612
613 // Adding an address that's already present but with different properties causes the
614 // existing address to be updated and returns true.
615 // Start with only LINKADDRV6.
616 assertEquals(1, lp.getLinkAddresses().size());
617 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
618
619 // Create a LinkAddress object for the same address, but with different flags.
620 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
621 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
622 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
623 assertFalse(deprecated.equals(LINKADDRV6));
624
625 // Check that adding it updates the existing address instead of adding a new one.
626 assertTrue(lp.addLinkAddress(deprecated));
627 assertEquals(1, lp.getLinkAddresses().size());
628 assertEquals(deprecated, getFirstLinkAddress(lp));
629 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
630
631 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
632 assertTrue(lp.removeLinkAddress(LINKADDRV6));
633 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800634 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900635
Hugo Benichi87d306b2017-10-12 09:54:49 +0900636 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800637 public void testLinkAddresses() {
638 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900639 lp.addLinkAddress(LINKADDRV4);
640 lp.addLinkAddress(LINKADDRV6);
641
paulhu9f7636c2019-05-02 17:43:28 +0800642 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900643 lp2.addLinkAddress(LINKADDRV6);
644
paulhu9f7636c2019-05-02 17:43:28 +0800645 final LinkProperties lp3 = new LinkProperties();
646 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
647 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900648
paulhu9f7636c2019-05-02 17:43:28 +0800649 assertFalse(lp.equals(lp2));
650 assertFalse(lp2.equals(lp3));
651
652 lp.removeLinkAddress(LINKADDRV4);
653 assertTrue(lp.equals(lp2));
654
655 lp2.setLinkAddresses(lp3.getLinkAddresses());
656 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900657 }
Erik Kline8b023072014-10-24 21:50:20 +0900658
Hugo Benichi87d306b2017-10-12 09:54:49 +0900659 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900660 public void testNat64Prefix() throws Exception {
661 LinkProperties lp = new LinkProperties();
662 lp.addLinkAddress(LINKADDRV4);
663 lp.addLinkAddress(LINKADDRV6);
664
665 assertNull(lp.getNat64Prefix());
666
667 IpPrefix p = new IpPrefix("64:ff9b::/96");
668 lp.setNat64Prefix(p);
669 assertEquals(p, lp.getNat64Prefix());
670
671 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
672 lp.setNat64Prefix(p);
673 assertEquals(p, lp.getNat64Prefix());
674
675 p = new IpPrefix("2001:db8:a:b:1:2::/80");
676 try {
677 lp.setNat64Prefix(p);
678 } catch (IllegalArgumentException expected) {
679 }
680
681 p = new IpPrefix("64:ff9b::/64");
682 try {
683 lp.setNat64Prefix(p);
684 } catch (IllegalArgumentException expected) {
685 }
686
687 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
688
689 lp.setNat64Prefix(null);
690 assertNull(lp.getNat64Prefix());
691 }
692
693 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900694 public void testIsProvisioned() {
695 LinkProperties lp4 = new LinkProperties();
696 assertFalse("v4only:empty", lp4.isProvisioned());
697 lp4.addLinkAddress(LINKADDRV4);
698 assertFalse("v4only:addr-only", lp4.isProvisioned());
699 lp4.addDnsServer(DNS1);
700 assertFalse("v4only:addr+dns", lp4.isProvisioned());
701 lp4.addRoute(new RouteInfo(GATEWAY1));
702 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800703 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
704 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900705
706 LinkProperties lp6 = new LinkProperties();
707 assertFalse("v6only:empty", lp6.isProvisioned());
708 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
709 assertFalse("v6only:fe80-only", lp6.isProvisioned());
710 lp6.addDnsServer(DNS6);
711 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900712 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900713 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
714 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800715 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900716 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
717 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800718 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
719 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900720 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
721
722 LinkProperties lp46 = new LinkProperties();
723 lp46.addLinkAddress(LINKADDRV4);
724 lp46.addLinkAddress(LINKADDRV6);
725 lp46.addDnsServer(DNS1);
726 lp46.addDnsServer(DNS6);
727 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
728 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800729 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
730 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900731 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900732 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800733 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
734 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900735 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
736
737 // A link with an IPv6 address and default route, but IPv4 DNS server.
738 LinkProperties mixed = new LinkProperties();
739 mixed.addLinkAddress(LINKADDRV6);
740 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900741 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800742 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
743 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900744 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
745 }
Erik Kline04612b02015-05-21 16:15:02 +0900746
Hugo Benichi87d306b2017-10-12 09:54:49 +0900747 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900748 public void testCompareProvisioning() {
749 LinkProperties v4lp = new LinkProperties();
750 v4lp.addLinkAddress(LINKADDRV4);
751 v4lp.addRoute(new RouteInfo(GATEWAY1));
752 v4lp.addDnsServer(DNS1);
753 assertTrue(v4lp.isProvisioned());
754
755 LinkProperties v4r = new LinkProperties(v4lp);
756 v4r.removeDnsServer(DNS1);
757 assertFalse(v4r.isProvisioned());
758
759 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
760 LinkProperties.compareProvisioning(v4r, v4r));
761 assertEquals(ProvisioningChange.LOST_PROVISIONING,
762 LinkProperties.compareProvisioning(v4lp, v4r));
763 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
764 LinkProperties.compareProvisioning(v4r, v4lp));
765 assertEquals(ProvisioningChange.STILL_PROVISIONED,
766 LinkProperties.compareProvisioning(v4lp, v4lp));
767
768 // Check that losing IPv4 provisioning on a dualstack network is
769 // seen as a total loss of provisioning.
770 LinkProperties v6lp = new LinkProperties();
771 v6lp.addLinkAddress(LINKADDRV6);
772 v6lp.addRoute(new RouteInfo(GATEWAY61));
773 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800774 assertFalse(v6lp.isIpv4Provisioned());
775 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900776 assertTrue(v6lp.isProvisioned());
777
778 LinkProperties v46lp = new LinkProperties(v6lp);
779 v46lp.addLinkAddress(LINKADDRV4);
780 v46lp.addRoute(new RouteInfo(GATEWAY1));
781 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800782 assertTrue(v46lp.isIpv4Provisioned());
783 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900784 assertTrue(v46lp.isProvisioned());
785
786 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900787 LinkProperties.compareProvisioning(v4lp, v46lp));
788 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900789 LinkProperties.compareProvisioning(v6lp, v46lp));
790 assertEquals(ProvisioningChange.LOST_PROVISIONING,
791 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900792 assertEquals(ProvisioningChange.LOST_PROVISIONING,
793 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900794
795 // Check that losing and gaining a secondary router does not change
796 // the provisioning status.
797 LinkProperties v6lp2 = new LinkProperties(v6lp);
798 v6lp2.addRoute(new RouteInfo(GATEWAY62));
799 assertTrue(v6lp2.isProvisioned());
800
801 assertEquals(ProvisioningChange.STILL_PROVISIONED,
802 LinkProperties.compareProvisioning(v6lp2, v6lp));
803 assertEquals(ProvisioningChange.STILL_PROVISIONED,
804 LinkProperties.compareProvisioning(v6lp, v6lp2));
805 }
Erik Klinea923dba2015-06-26 19:21:34 +0900806
Hugo Benichi87d306b2017-10-12 09:54:49 +0900807 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900808 public void testIsReachable() {
809 final LinkProperties v4lp = new LinkProperties();
810 assertFalse(v4lp.isReachable(DNS1));
811 assertFalse(v4lp.isReachable(DNS2));
812
813 // Add an on-link route, making the on-link DNS server reachable,
814 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900815 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900816 assertFalse(v4lp.isReachable(DNS1));
817 assertFalse(v4lp.isReachable(DNS2));
818
819 // Adding an IPv4 address (right now, any IPv4 address) means we use
820 // the routes to compute likely reachability.
821 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
822 assertTrue(v4lp.isReachable(DNS1));
823 assertFalse(v4lp.isReachable(DNS2));
824
825 // Adding a default route makes the off-link DNS server reachable.
826 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
827 assertTrue(v4lp.isReachable(DNS1));
828 assertTrue(v4lp.isReachable(DNS2));
829
830 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900831 final InetAddress kLinkLocalDns = address("fe80::6:1");
832 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
833 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900834 assertFalse(v6lp.isReachable(kLinkLocalDns));
835 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
836 assertFalse(v6lp.isReachable(kOnLinkDns));
837 assertFalse(v6lp.isReachable(DNS6));
838
839 // Add a link-local route, making the link-local DNS servers reachable. Because
840 // we assume the presence of an IPv6 link-local address, link-local DNS servers
841 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900842 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900843 assertFalse(v6lp.isReachable(kLinkLocalDns));
844 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
845 assertFalse(v6lp.isReachable(kOnLinkDns));
846 assertFalse(v6lp.isReachable(DNS6));
847
848 // Add a link-local address--nothing changes.
849 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
850 assertFalse(v6lp.isReachable(kLinkLocalDns));
851 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
852 assertFalse(v6lp.isReachable(kOnLinkDns));
853 assertFalse(v6lp.isReachable(DNS6));
854
855 // Add a global route on link, but no global address yet. DNS servers reachable
856 // via a route that doesn't require a gateway: give them the benefit of the
857 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900858 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900859 assertFalse(v6lp.isReachable(kLinkLocalDns));
860 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
861 assertTrue(v6lp.isReachable(kOnLinkDns));
862 assertFalse(v6lp.isReachable(DNS6));
863
864 // Add a global address; the on-link global address DNS server is (still)
865 // presumed reachable.
866 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
867 assertFalse(v6lp.isReachable(kLinkLocalDns));
868 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
869 assertTrue(v6lp.isReachable(kOnLinkDns));
870 assertFalse(v6lp.isReachable(DNS6));
871
872 // Adding a default route makes the off-link DNS server reachable.
873 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
874 assertFalse(v6lp.isReachable(kLinkLocalDns));
875 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
876 assertTrue(v6lp.isReachable(kOnLinkDns));
877 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900878
879 // Check isReachable on stacked links. This requires that the source IP address be assigned
880 // on the interface returned by the route lookup.
881 LinkProperties stacked = new LinkProperties();
882
883 // Can't add a stacked link without an interface name.
884 stacked.setInterfaceName("v4-test0");
885 v6lp.addStackedLink(stacked);
886
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900887 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900888 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
889 assertFalse(v6lp.isReachable(stackedAddress));
890 stacked.addLinkAddress(stackedLinkAddress);
891 assertFalse(v6lp.isReachable(stackedAddress));
892 stacked.addRoute(new RouteInfo(stackedLinkAddress));
893 assertTrue(stacked.isReachable(stackedAddress));
894 assertTrue(v6lp.isReachable(stackedAddress));
895
896 assertFalse(v6lp.isReachable(DNS1));
897 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
898 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900899 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100900
Hugo Benichi87d306b2017-10-12 09:54:49 +0900901 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100902 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
903 // IPv4 case: no route added initially
904 LinkProperties rmnet0 = new LinkProperties();
905 rmnet0.setInterfaceName("rmnet0");
906 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
907 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
908 rmnet0.getInterfaceName());
909
910 // Since no routes is added explicitly, getAllRoutes() should return empty.
911 assertTrue(rmnet0.getAllRoutes().isEmpty());
912 rmnet0.ensureDirectlyConnectedRoutes();
913 // ensureDirectlyConnectedRoutes() should have added the missing local route.
914 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
915
916 // IPv4 case: both direct and default routes added initially
917 LinkProperties rmnet1 = new LinkProperties();
918 rmnet1.setInterfaceName("rmnet1");
919 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900920 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800921 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100922 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
923 rmnet1.getInterfaceName());
924 rmnet1.addRoute(defaultRoute1);
925 rmnet1.addRoute(directRoute1);
926
927 // Check added routes
928 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
929 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
930 // route is already part of the configuration.
931 rmnet1.ensureDirectlyConnectedRoutes();
932 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
933
934 // IPv6 case: only default routes added initially
935 LinkProperties rmnet2 = new LinkProperties();
936 rmnet2.setInterfaceName("rmnet2");
937 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
938 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900939 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800940 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100941 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
942 rmnet2.getInterfaceName());
943 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
944 rmnet2.getInterfaceName());
945 rmnet2.addRoute(defaultRoute2);
946
947 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
948 rmnet2.ensureDirectlyConnectedRoutes();
949 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
950 rmnet2.getAllRoutes());
951
952 // Corner case: no interface name
953 LinkProperties rmnet3 = new LinkProperties();
954 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
955 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
956 rmnet3.getInterfaceName());
957
958 assertTrue(rmnet3.getAllRoutes().isEmpty());
959 rmnet3.ensureDirectlyConnectedRoutes();
960 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100961 }
962
Rubin Xuffd77d82017-09-05 18:40:49 +0100963 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
964 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
965 Set<RouteInfo> actualSet = new ArraySet<>(actual);
966 // Duplicated entries in actual routes are considered failures
967 assertEquals(actual.size(), actualSet.size());
968
969 assertEquals(expectedSet, actualSet);
970 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100971
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900972 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900973 LinkProperties source = new LinkProperties();
974 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900975
Chalard Jean299d8562018-04-11 16:36:41 +0900976 source.addLinkAddress(LINKADDRV4);
977 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900978
Chalard Jean299d8562018-04-11 16:36:41 +0900979 source.addDnsServer(DNS1);
980 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900981 source.addDnsServer(GATEWAY62);
982
983 source.addPcscfServer(TESTIPV4ADDR);
984 source.addPcscfServer(TESTIPV6ADDR);
985
986 source.setUsePrivateDns(true);
987 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
988
989 source.setDomains(DOMAINS);
990
Chalard Jean299d8562018-04-11 16:36:41 +0900991 source.addRoute(new RouteInfo(GATEWAY1));
992 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900993
Chalard Jean299d8562018-04-11 16:36:41 +0900994 source.addValidatedPrivateDnsServer(DNS6);
995 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900996 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
997
998 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +0900999
1000 source.setMtu(MTU);
1001
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001002 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
1003
Lorenzo Colitti981b34f2019-01-08 09:58:59 +09001004 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
1005
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001006 final LinkProperties stacked = new LinkProperties();
1007 stacked.setInterfaceName("test-stacked");
1008 source.addStackedLink(stacked);
1009
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001010 return source;
1011 }
1012
1013 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1014 public void testLinkPropertiesParcelable_Q() throws Exception {
1015 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001016 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001017 }
1018
1019 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1020 public void testLinkPropertiesParcelable() throws Exception {
1021 final LinkProperties source = makeLinkPropertiesForParceling();
1022
1023 source.setWakeOnLanSupported(true);
1024 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1025 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1026 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001027 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001028
1029 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1030 final LinkProperties sanitized = new LinkProperties(source);
1031 sanitized.setCaptivePortalApiUrl(null);
1032 sanitized.setCaptivePortalData(null);
1033 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001034 }
1035
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001036 // Parceling of the scope was broken until Q-QPR2
1037 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001038 public void testLinkLocalDnsServerParceling() throws Exception {
1039 final String strAddress = "fe80::1%lo";
1040 final LinkProperties lp = new LinkProperties();
1041 lp.addDnsServer(address(strAddress));
1042 final LinkProperties unparceled = parcelingRoundTrip(lp);
1043 // Inet6Address#equals does not test for the scope id
1044 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001045 }
Chalard Jean299d8562018-04-11 16:36:41 +09001046
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001047 @Test
1048 public void testParcelUninitialized() throws Exception {
1049 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001050 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001051 }
paulhu9f7636c2019-05-02 17:43:28 +08001052
1053 @Test
1054 public void testConstructor() {
1055 LinkProperties lp = new LinkProperties();
1056 checkEmpty(lp);
1057 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1058 assertLinkPropertiesEqual(lp, new LinkProperties());
1059
1060 lp = makeTestObject();
1061 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1062 }
1063
1064 @Test
1065 public void testDnsServers() {
1066 final LinkProperties lp = new LinkProperties();
1067 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1068 lp.setDnsServers(dnsServers);
1069 assertEquals(2, lp.getDnsServers().size());
1070 assertEquals(DNS1, lp.getDnsServers().get(0));
1071 assertEquals(DNS2, lp.getDnsServers().get(1));
1072
1073 lp.removeDnsServer(DNS1);
1074 assertEquals(1, lp.getDnsServers().size());
1075 assertEquals(DNS2, lp.getDnsServers().get(0));
1076
1077 lp.addDnsServer(DNS6);
1078 assertEquals(2, lp.getDnsServers().size());
1079 assertEquals(DNS2, lp.getDnsServers().get(0));
1080 assertEquals(DNS6, lp.getDnsServers().get(1));
1081 }
1082
1083 @Test
1084 public void testValidatedPrivateDnsServers() {
1085 final LinkProperties lp = new LinkProperties();
1086 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1087 lp.setValidatedPrivateDnsServers(privDnsServers);
1088 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1089 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1090 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1091
1092 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1093 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1094 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1095
1096 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1097 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1098 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1099 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1100 }
1101
1102 @Test
1103 public void testPcscfServers() {
1104 final LinkProperties lp = new LinkProperties();
1105 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1106 lp.setPcscfServers(pcscfServers);
1107 assertEquals(1, lp.getPcscfServers().size());
1108 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1109
1110 lp.removePcscfServer(PCSCFV4);
1111 assertEquals(0, lp.getPcscfServers().size());
1112
1113 lp.addPcscfServer(PCSCFV6);
1114 assertEquals(1, lp.getPcscfServers().size());
1115 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1116 }
1117
1118 @Test
1119 public void testTcpBufferSizes() {
1120 final LinkProperties lp = makeTestObject();
1121 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1122
1123 lp.setTcpBufferSizes(null);
1124 assertNull(lp.getTcpBufferSizes());
1125 }
1126
1127 @Test
1128 public void testHasIpv6DefaultRoute() {
1129 final LinkProperties lp = makeTestObject();
1130 assertFalse(lp.hasIPv6DefaultRoute());
1131
1132 lp.addRoute(new RouteInfo(GATEWAY61));
1133 assertTrue(lp.hasIPv6DefaultRoute());
1134 }
1135
1136 @Test
1137 public void testHttpProxy() {
1138 final LinkProperties lp = makeTestObject();
1139 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1140 }
1141
1142 @Test
1143 public void testPrivateDnsServerName() {
1144 final LinkProperties lp = makeTestObject();
1145 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1146
1147 lp.setPrivateDnsServerName(null);
1148 assertNull(lp.getPrivateDnsServerName());
1149 }
1150
1151 @Test
1152 public void testUsePrivateDns() {
1153 final LinkProperties lp = makeTestObject();
1154 assertTrue(lp.isPrivateDnsActive());
1155
1156 lp.clear();
1157 assertFalse(lp.isPrivateDnsActive());
1158 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001159
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001160 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001161 public void testDhcpServerAddress() {
1162 final LinkProperties lp = makeTestObject();
1163 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1164
1165 lp.clear();
1166 assertNull(lp.getDhcpServerAddress());
1167 }
1168
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001169 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001170 public void testWakeOnLanSupported() {
1171 final LinkProperties lp = makeTestObject();
1172 assertTrue(lp.isWakeOnLanSupported());
1173
1174 lp.clear();
1175 assertFalse(lp.isWakeOnLanSupported());
1176 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001177
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001178 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001179 public void testCaptivePortalApiUrl() {
1180 final LinkProperties lp = makeTestObject();
1181 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1182
1183 lp.clear();
1184 assertNull(lp.getCaptivePortalApiUrl());
1185 }
1186
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001187 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001188 public void testCaptivePortalData() {
1189 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001190 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001191
1192 lp.clear();
1193 assertNull(lp.getCaptivePortalData());
1194 }
lucaslin55c6a842020-03-26 19:15:11 +08001195
1196 private LinkProperties makeIpv4LinkProperties() {
1197 final LinkProperties linkProperties = new LinkProperties();
1198 linkProperties.setInterfaceName(NAME);
1199 linkProperties.addLinkAddress(LINKADDRV4);
1200 linkProperties.addDnsServer(DNS1);
1201 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1202 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1203 return linkProperties;
1204 }
1205
1206 private LinkProperties makeIpv6LinkProperties() {
1207 final LinkProperties linkProperties = new LinkProperties();
1208 linkProperties.setInterfaceName(NAME);
1209 linkProperties.addLinkAddress(LINKADDRV6);
1210 linkProperties.addDnsServer(DNS6);
1211 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1212 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1213 return linkProperties;
1214 }
1215
1216 @Test
1217 public void testHasIpv4DefaultRoute() {
1218 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1219 assertTrue(Ipv4.hasIpv4DefaultRoute());
1220 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1221 assertFalse(Ipv6.hasIpv4DefaultRoute());
1222 }
1223
1224 @Test
1225 public void testHasIpv4DnsServer() {
1226 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1227 assertTrue(Ipv4.hasIpv4DnsServer());
1228 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1229 assertFalse(Ipv6.hasIpv4DnsServer());
1230 }
1231
1232 @Test
1233 public void testHasIpv6DnsServer() {
1234 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1235 assertFalse(Ipv4.hasIpv6DnsServer());
1236 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1237 assertTrue(Ipv6.hasIpv6DnsServer());
1238 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001239
1240 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1241 public void testHasIpv4UnreachableDefaultRoute() {
1242 final LinkProperties lp = makeTestObject();
1243 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1244 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1245
1246 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1247 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1248 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1249 }
1250
1251 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1252 public void testHasIpv6UnreachableDefaultRoute() {
1253 final LinkProperties lp = makeTestObject();
1254 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1255 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1256
1257 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1258 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1259 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1260 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001261
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001262 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1263 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
preranapee4bfe72022-05-11 04:23:14 +00001264 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Prerana2b97bbe2022-04-28 04:02:05 +00001265 public void testHasExcludeRoute() {
1266 LinkProperties lp = new LinkProperties();
preranapee4bfe72022-05-11 04:23:14 +00001267 lp.setInterfaceName("tun0");
1268 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 24), RTN_UNICAST));
Prerana2b97bbe2022-04-28 04:02:05 +00001269 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_UNICAST));
1270 assertFalse(lp.hasExcludeRoute());
preranapee4bfe72022-05-11 04:23:14 +00001271 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 32), RTN_THROW));
Prerana2b97bbe2022-04-28 04:02:05 +00001272 assertTrue(lp.hasExcludeRoute());
1273 }
1274
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001275 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1276 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001277 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001278 public void testRouteAddWithSameKey() throws Exception {
1279 LinkProperties lp = new LinkProperties();
1280 lp.setInterfaceName("wlan0");
1281 final IpPrefix v6 = new IpPrefix("64:ff9b::/96");
1282 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1280));
1283 assertEquals(1, lp.getRoutes().size());
1284 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1500));
1285 assertEquals(1, lp.getRoutes().size());
1286 final IpPrefix v4 = new IpPrefix("192.0.2.128/25");
1287 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_UNICAST, 1460));
1288 assertEquals(2, lp.getRoutes().size());
1289 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_THROW, 1460));
1290 assertEquals(2, lp.getRoutes().size());
1291 }
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001292
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001293 private void assertExcludeRoutesVisible() {
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001294 final LinkProperties lp = new LinkProperties();
1295 assertEquals(0, lp.getRoutes().size());
1296
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001297 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 31), RTN_UNREACHABLE));
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001298 assertEquals(1, lp.getRoutes().size());
1299
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001300 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 127), RTN_THROW));
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001301 assertEquals(2, lp.getRoutes().size());
1302
1303 lp.addRoute(new RouteInfo(GATEWAY1));
1304 assertEquals(3, lp.getRoutes().size());
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001305
1306 lp.addRoute(new RouteInfo(new IpPrefix(DNS6, 127), RTN_UNICAST));
1307 assertEquals(4, lp.getRoutes().size());
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001308 }
1309
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001310 private void assertExcludeRoutesNotVisible() {
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001311 final LinkProperties lp = new LinkProperties();
1312 assertEquals(0, lp.getRoutes().size());
1313
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001314 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 31), RTN_UNREACHABLE));
1315 assertEquals(0, lp.getRoutes().size());
1316
1317 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 127), RTN_THROW));
1318 assertEquals(0, lp.getRoutes().size());
1319
1320 lp.addRoute(new RouteInfo(GATEWAY1));
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001321 assertEquals(1, lp.getRoutes().size());
1322
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001323 lp.addRoute(new RouteInfo(new IpPrefix(DNS6, 127), RTN_UNICAST));
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001324 assertEquals(2, lp.getRoutes().size());
Remi NGUYEN VAN66c27c12022-07-14 18:50:10 +09001325 }
1326
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001327 private void checkExcludeRoutesNotVisibleAfterS() {
1328 if (!SdkLevel.isAtLeastT()) {
1329 // RTN_THROW routes are visible on R and S when added by the caller (but they are not
1330 // added by the system except for legacy VPN).
1331 // This is uncommon usage but was tested by CTSr12.
1332 assertExcludeRoutesVisible();
1333 } else {
1334 assertExcludeRoutesNotVisible();
1335 }
1336 }
1337
1338 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1339 @CtsNetTestCasesMaxTargetSdk31(reason = "Testing behaviour for target SDK 31")
1340 public void testExcludedRoutesNotVisibleOnTargetSdk31() {
1341 checkExcludeRoutesNotVisibleAfterS();
1342 }
1343
1344 @Test
1345 public void testExcludedRoutesVisibleOnTargetSdk33AndAbove() {
1346 assertExcludeRoutesVisible();
1347 }
1348
1349 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
1350 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
1351 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1352 public void testExcludedRoutesEnabledByCompatChange() {
1353 assertExcludeRoutesVisible();
1354 }
1355
1356 @Test @IgnoreUpTo(Build.VERSION_CODES.R)
Lorenzo Colitti1bb94a32022-06-10 23:19:48 +09001357 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001358 @DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Lorenzo Colitticcd30202022-07-21 15:42:37 +09001359 public void testExcludedRoutesDisabledByCompatChange() {
1360 checkExcludeRoutesNotVisibleAfterS();
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001361 }
John Wang3e567d52011-04-04 12:35:42 -07001362}