blob: 581ee221be893dc0c6b99a5eb570ab572e92062f [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
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020023import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
Chalard Jean39175f22020-06-26 00:41:26 +090024import static com.android.testutils.ParcelUtils.assertParcelingIsLossless;
25import static com.android.testutils.ParcelUtils.parcelingRoundTrip;
Chalard Jeanaf718362019-05-30 17:11:14 +090026
Hugo Benichi87d306b2017-10-12 09:54:49 +090027import static org.junit.Assert.assertEquals;
28import static org.junit.Assert.assertFalse;
paulhu9f7636c2019-05-02 17:43:28 +080029import static org.junit.Assert.assertNotEquals;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090030import static org.junit.Assert.assertNull;
Hugo Benichi87d306b2017-10-12 09:54:49 +090031import static org.junit.Assert.assertTrue;
32import static org.junit.Assert.fail;
33
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020034import android.compat.testing.PlatformCompatChangeRule;
Erik Kline04612b02015-05-21 16:15:02 +090035import android.net.LinkProperties.ProvisioningChange;
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
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090040import androidx.core.os.BuildCompat;
Brett Chabot147f6cf2019-03-04 14:14:56 -080041import androidx.test.filters.SmallTest;
42import androidx.test.runner.AndroidJUnit4;
43
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 Colitti4685a552022-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;
56import 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 {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090071 @Rule
72 public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
73
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020074 @Rule
75 public final PlatformCompatChangeRule compatChangeRule = new PlatformCompatChangeRule();
76
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +090077 private static final InetAddress ADDRV4 = address("75.208.6.1");
78 private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
79 private static final InetAddress DNS1 = address("75.208.7.1");
80 private static final InetAddress DNS2 = address("69.78.7.1");
81 private static final InetAddress DNS6 = address("2001:4860:4860::8888");
82 private static final InetAddress PRIVDNS1 = address("1.1.1.1");
83 private static final InetAddress PRIVDNS2 = address("1.0.0.1");
84 private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111");
85 private static final InetAddress PCSCFV4 = address("10.77.25.37");
86 private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1");
87 private static final InetAddress GATEWAY1 = address("75.208.8.1");
88 private static final InetAddress GATEWAY2 = address("69.78.8.1");
89 private static final InetAddress GATEWAY61 = address("fe80::6:0000:613");
90 private static final InetAddress GATEWAY62 = address("fe80::6:22%lo");
91 private static final InetAddress TESTIPV4ADDR = address("192.168.47.42");
92 private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43");
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090093 private static final Inet4Address DHCPSERVER = (Inet4Address) address("192.0.2.1");
paulhu9f7636c2019-05-02 17:43:28 +080094 private static final String NAME = "qmi0";
95 private static final String DOMAINS = "google.com";
96 private static final String PRIV_DNS_SERVER_NAME = "private.dns.com";
97 private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576";
98 private static final int MTU = 1500;
99 private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
100 private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
101 private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900102 private static final Uri CAPPORT_API_URL = Uri.parse("https://test.example.com/capportapi");
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900103
104 // CaptivePortalData cannot be in a constant as it does not exist on Q.
105 // The test runner also crashes when scanning for tests if it is a return type.
106 private static Object getCaptivePortalData() {
107 return new CaptivePortalData.Builder()
108 .setVenueInfoUrl(Uri.parse("https://test.example.com/venue")).build();
109 }
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900110
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900111 private static InetAddress address(String addrString) {
paulhu9f7636c2019-05-02 17:43:28 +0800112 return InetAddresses.parseNumericAddress(addrString);
113 }
114
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900115 private static boolean isAtLeastR() {
116 // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
117 return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
118 }
119
paulhu9f7636c2019-05-02 17:43:28 +0800120 private void checkEmpty(final LinkProperties lp) {
121 assertEquals(0, lp.getAllInterfaceNames().size());
122 assertEquals(0, lp.getAllAddresses().size());
123 assertEquals(0, lp.getDnsServers().size());
124 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
125 assertEquals(0, lp.getPcscfServers().size());
126 assertEquals(0, lp.getAllRoutes().size());
127 assertEquals(0, lp.getAllLinkAddresses().size());
128 assertEquals(0, lp.getStackedLinks().size());
129 assertEquals(0, lp.getMtu());
130 assertNull(lp.getPrivateDnsServerName());
131 assertNull(lp.getDomains());
132 assertNull(lp.getHttpProxy());
133 assertNull(lp.getTcpBufferSizes());
134 assertNull(lp.getNat64Prefix());
135 assertFalse(lp.isProvisioned());
136 assertFalse(lp.isIpv4Provisioned());
137 assertFalse(lp.isIpv6Provisioned());
138 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900139
140 if (isAtLeastR()) {
141 assertNull(lp.getDhcpServerAddress());
142 assertFalse(lp.isWakeOnLanSupported());
143 assertNull(lp.getCaptivePortalApiUrl());
144 assertNull(lp.getCaptivePortalData());
145 }
paulhu9f7636c2019-05-02 17:43:28 +0800146 }
147
148 private LinkProperties makeTestObject() {
149 final LinkProperties lp = new LinkProperties();
150 lp.setInterfaceName(NAME);
151 lp.addLinkAddress(LINKADDRV4);
152 lp.addLinkAddress(LINKADDRV6);
153 lp.addDnsServer(DNS1);
154 lp.addDnsServer(DNS2);
155 lp.addValidatedPrivateDnsServer(PRIVDNS1);
156 lp.addValidatedPrivateDnsServer(PRIVDNS2);
157 lp.setUsePrivateDns(true);
158 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
159 lp.addPcscfServer(PCSCFV6);
160 lp.setDomains(DOMAINS);
161 lp.addRoute(new RouteInfo(GATEWAY1));
162 lp.addRoute(new RouteInfo(GATEWAY2));
163 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
164 lp.setMtu(MTU);
165 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
166 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900167 if (isAtLeastR()) {
168 lp.setDhcpServerAddress(DHCPSERVER);
169 lp.setWakeOnLanSupported(true);
170 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
171 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
172 }
paulhu9f7636c2019-05-02 17:43:28 +0800173 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900174 }
175
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900176 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
177 // Check implementation of equals(), element by element.
178 assertTrue(source.isIdenticalInterfaceName(target));
179 assertTrue(target.isIdenticalInterfaceName(source));
180
181 assertTrue(source.isIdenticalAddresses(target));
182 assertTrue(target.isIdenticalAddresses(source));
183
184 assertTrue(source.isIdenticalDnses(target));
185 assertTrue(target.isIdenticalDnses(source));
186
dalyk7643abc2018-01-17 14:20:55 -0500187 assertTrue(source.isIdenticalPrivateDns(target));
188 assertTrue(target.isIdenticalPrivateDns(source));
189
Chalard Jean299d8562018-04-11 16:36:41 +0900190 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
191 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
192
Hongshike2d7cf52018-06-28 20:42:19 +0900193 assertTrue(source.isIdenticalPcscfs(target));
194 assertTrue(target.isIdenticalPcscfs(source));
195
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900196 assertTrue(source.isIdenticalRoutes(target));
197 assertTrue(target.isIdenticalRoutes(source));
198
199 assertTrue(source.isIdenticalHttpProxy(target));
200 assertTrue(target.isIdenticalHttpProxy(source));
201
202 assertTrue(source.isIdenticalStackedLinks(target));
203 assertTrue(target.isIdenticalStackedLinks(source));
204
sy.yun4aa73922013-09-02 05:24:09 +0900205 assertTrue(source.isIdenticalMtu(target));
206 assertTrue(target.isIdenticalMtu(source));
207
dalyk7643abc2018-01-17 14:20:55 -0500208 assertTrue(source.isIdenticalTcpBufferSizes(target));
209 assertTrue(target.isIdenticalTcpBufferSizes(source));
210
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900211 if (isAtLeastR()) {
212 assertTrue(source.isIdenticalDhcpServerAddress(target));
213 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200214
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900215 assertTrue(source.isIdenticalWakeOnLan(target));
216 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900217
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900218 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
219 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
220
221 assertTrue(source.isIdenticalCaptivePortalData(target));
222 assertTrue(target.isIdenticalCaptivePortalData(source));
223 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900224
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900225 // Check result of equals().
226 assertTrue(source.equals(target));
227 assertTrue(target.equals(source));
228
229 // Check hashCode.
230 assertEquals(source.hashCode(), target.hashCode());
231 }
232
Hugo Benichi87d306b2017-10-12 09:54:49 +0900233 @Test
John Wang3e567d52011-04-04 12:35:42 -0700234 public void testEqualsNull() {
235 LinkProperties source = new LinkProperties();
236 LinkProperties target = new LinkProperties();
237
238 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900239 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700240 }
241
Hugo Benichi87d306b2017-10-12 09:54:49 +0900242 @Test
243 public void testEqualsSameOrder() throws Exception {
244 LinkProperties source = new LinkProperties();
245 source.setInterfaceName(NAME);
246 // set 2 link addresses
247 source.addLinkAddress(LINKADDRV4);
248 source.addLinkAddress(LINKADDRV6);
249 // set 2 dnses
250 source.addDnsServer(DNS1);
251 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900252 // set 1 pcscf
253 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900254 // set 2 gateways
255 source.addRoute(new RouteInfo(GATEWAY1));
256 source.addRoute(new RouteInfo(GATEWAY2));
257 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700258
Hugo Benichi87d306b2017-10-12 09:54:49 +0900259 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700260
Hugo Benichi87d306b2017-10-12 09:54:49 +0900261 // All fields are same
262 target.setInterfaceName(NAME);
263 target.addLinkAddress(LINKADDRV4);
264 target.addLinkAddress(LINKADDRV6);
265 target.addDnsServer(DNS1);
266 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900267 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900268 target.addRoute(new RouteInfo(GATEWAY1));
269 target.addRoute(new RouteInfo(GATEWAY2));
270 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700271
Hugo Benichi87d306b2017-10-12 09:54:49 +0900272 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700273
Hugo Benichi87d306b2017-10-12 09:54:49 +0900274 target.clear();
275 // change Interface Name
276 target.setInterfaceName("qmi1");
277 target.addLinkAddress(LINKADDRV4);
278 target.addLinkAddress(LINKADDRV6);
279 target.addDnsServer(DNS1);
280 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900281 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900282 target.addRoute(new RouteInfo(GATEWAY1));
283 target.addRoute(new RouteInfo(GATEWAY2));
284 target.setMtu(MTU);
285 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700286
Hugo Benichi87d306b2017-10-12 09:54:49 +0900287 target.clear();
288 target.setInterfaceName(NAME);
289 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900290 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900291 target.addLinkAddress(LINKADDRV6);
292 target.addDnsServer(DNS1);
293 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900294 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900295 target.addRoute(new RouteInfo(GATEWAY1));
296 target.addRoute(new RouteInfo(GATEWAY2));
297 target.setMtu(MTU);
298 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700299
Hugo Benichi87d306b2017-10-12 09:54:49 +0900300 target.clear();
301 target.setInterfaceName(NAME);
302 target.addLinkAddress(LINKADDRV4);
303 target.addLinkAddress(LINKADDRV6);
304 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900305 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900306 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900307 target.addPcscfServer(PCSCFV6);
308 target.addRoute(new RouteInfo(GATEWAY1));
309 target.addRoute(new RouteInfo(GATEWAY2));
310 target.setMtu(MTU);
311 assertFalse(source.equals(target));
312
313 target.clear();
314 target.setInterfaceName(NAME);
315 target.addLinkAddress(LINKADDRV4);
316 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900317 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900318 target.addDnsServer(DNS2);
319 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900320 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900321 target.addRoute(new RouteInfo(GATEWAY1));
322 target.addRoute(new RouteInfo(GATEWAY2));
323 target.setMtu(MTU);
324 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700325
Hugo Benichi87d306b2017-10-12 09:54:49 +0900326 target.clear();
327 target.setInterfaceName(NAME);
328 target.addLinkAddress(LINKADDRV4);
329 target.addLinkAddress(LINKADDRV6);
330 target.addDnsServer(DNS1);
331 target.addDnsServer(DNS2);
332 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900333 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900334 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900335 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900336 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900337
Hugo Benichi87d306b2017-10-12 09:54:49 +0900338 target.clear();
339 target.setInterfaceName(NAME);
340 target.addLinkAddress(LINKADDRV4);
341 target.addLinkAddress(LINKADDRV6);
342 target.addDnsServer(DNS1);
343 target.addDnsServer(DNS2);
344 target.addRoute(new RouteInfo(GATEWAY1));
345 target.addRoute(new RouteInfo(GATEWAY2));
346 // change mtu
347 target.setMtu(1440);
348 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700349 }
350
Hugo Benichi87d306b2017-10-12 09:54:49 +0900351 @Test
352 public void testEqualsDifferentOrder() throws Exception {
353 LinkProperties source = new LinkProperties();
354 source.setInterfaceName(NAME);
355 // set 2 link addresses
356 source.addLinkAddress(LINKADDRV4);
357 source.addLinkAddress(LINKADDRV6);
358 // set 2 dnses
359 source.addDnsServer(DNS1);
360 source.addDnsServer(DNS2);
361 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800362 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900363 source.addRoute(new RouteInfo(GATEWAY2));
364 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700365
Hugo Benichi87d306b2017-10-12 09:54:49 +0900366 LinkProperties target = new LinkProperties();
367 // Exchange order
368 target.setInterfaceName(NAME);
369 target.addLinkAddress(LINKADDRV6);
370 target.addLinkAddress(LINKADDRV4);
371 target.addDnsServer(DNS2);
372 target.addDnsServer(DNS1);
373 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800374 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900375 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700376
Hugo Benichi87d306b2017-10-12 09:54:49 +0900377 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700378 }
379
Hugo Benichi87d306b2017-10-12 09:54:49 +0900380 @Test
381 public void testEqualsDuplicated() throws Exception {
382 LinkProperties source = new LinkProperties();
383 // set 3 link addresses, eg, [A, A, B]
384 source.addLinkAddress(LINKADDRV4);
385 source.addLinkAddress(LINKADDRV4);
386 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700387
Hugo Benichi87d306b2017-10-12 09:54:49 +0900388 LinkProperties target = new LinkProperties();
389 // set 3 link addresses, eg, [A, B, B]
390 target.addLinkAddress(LINKADDRV4);
391 target.addLinkAddress(LINKADDRV6);
392 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700393
Hugo Benichi87d306b2017-10-12 09:54:49 +0900394 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700395 }
396
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800397 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
398 for (RouteInfo r : lp.getRoutes()) {
399 assertEquals(iface, r.getInterface());
400 }
401 }
402
paulhu9f7636c2019-05-02 17:43:28 +0800403 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
404 for (RouteInfo r : lp.getRoutes()) {
405 assertNotEquals(iface, r.getInterface());
406 }
407 }
408
Hugo Benichi87d306b2017-10-12 09:54:49 +0900409 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800410 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800411 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
412 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900413 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800414
415 // Add a route with no interface to a LinkProperties with no interface. No errors.
416 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800417 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900418 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800419 assertEquals(1, lp.getRoutes().size());
420 assertAllRoutesHaveInterface(null, lp);
421
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900422 // Adding the same route twice has no effect.
423 assertFalse(lp.addRoute(r));
424 assertEquals(1, lp.getRoutes().size());
425
426 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800427 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800428 try {
429 lp.addRoute(r);
430 fail("Adding wlan0 route to LP with no interface, expect exception");
431 } catch (IllegalArgumentException expected) {}
432
433 // Change the interface name. All the routes should change their interface name too.
434 lp.setInterfaceName("rmnet0");
435 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800436 assertAllRoutesNotHaveInterface(null, lp);
437 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800438
439 // Now add a route with the wrong interface. This causes an exception too.
440 try {
441 lp.addRoute(r);
442 fail("Adding wlan0 route to rmnet0 LP, expect exception");
443 } catch (IllegalArgumentException expected) {}
444
445 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800446 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800447 lp.setInterfaceName("wlan0");
448 lp.addRoute(r);
449 assertEquals(2, lp.getRoutes().size());
450 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800451 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800452
453 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900454 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800455 lp.addRoute(r);
456 assertEquals(3, lp.getRoutes().size());
457 assertAllRoutesHaveInterface("wlan0", lp);
458
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900459 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800460 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800461 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900462 final CompareResult<RouteInfo> cr1 =
463 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
464 assertEquals(0, cr1.added.size());
465 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800466
467 lp2.setInterfaceName("p2p0");
468 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800469 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900470 final CompareResult<RouteInfo> cr2 =
471 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
472 assertEquals(3, cr2.added.size());
473 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800474
Tyler Wear44999a72020-02-13 17:14:38 -0800475 // Remove route with incorrect interface, no route removed.
476 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800477 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800478
479 // Check remove works when interface is correct.
480 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800481 assertEquals(2, lp.getRoutes().size());
482 assertAllRoutesHaveInterface("wlan0", lp);
483 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900484 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800485
Hugo Benichi87d306b2017-10-12 09:54:49 +0900486 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800487 public void testStackedInterfaces() {
488 LinkProperties rmnet0 = new LinkProperties();
489 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900490 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800491
492 LinkProperties clat4 = new LinkProperties();
493 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900494 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800495
496 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900497 assertEquals(1, rmnet0.getAddresses().size());
498 assertEquals(1, rmnet0.getLinkAddresses().size());
499 assertEquals(1, rmnet0.getAllAddresses().size());
500 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800501 assertEquals(1, rmnet0.getAllInterfaceNames().size());
502 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900503
Lorenzo Colittic0803122013-03-07 10:59:25 -0800504 rmnet0.addStackedLink(clat4);
505 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900506 assertEquals(1, rmnet0.getAddresses().size());
507 assertEquals(1, rmnet0.getLinkAddresses().size());
508 assertEquals(2, rmnet0.getAllAddresses().size());
509 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800510 assertEquals(2, rmnet0.getAllInterfaceNames().size());
511 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
512 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900513
Lorenzo Colittic0803122013-03-07 10:59:25 -0800514 rmnet0.addStackedLink(clat4);
515 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900516 assertEquals(1, rmnet0.getAddresses().size());
517 assertEquals(1, rmnet0.getLinkAddresses().size());
518 assertEquals(2, rmnet0.getAllAddresses().size());
519 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800520 assertEquals(2, rmnet0.getAllInterfaceNames().size());
521 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
522 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900523
Lorenzo Colittic0803122013-03-07 10:59:25 -0800524 assertEquals(0, clat4.getStackedLinks().size());
525
526 // Modify an item in the returned collection to see what happens.
527 for (LinkProperties link : rmnet0.getStackedLinks()) {
528 if (link.getInterfaceName().equals("clat4")) {
529 link.setInterfaceName("newname");
530 }
531 }
532 for (LinkProperties link : rmnet0.getStackedLinks()) {
533 assertFalse("newname".equals(link.getInterfaceName()));
534 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900535
Lorenzo Colitti38258432014-10-20 11:08:03 +0900536 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900537 assertEquals(0, rmnet0.getStackedLinks().size());
538 assertEquals(1, rmnet0.getAddresses().size());
539 assertEquals(1, rmnet0.getLinkAddresses().size());
540 assertEquals(1, rmnet0.getAllAddresses().size());
541 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800542 assertEquals(1, rmnet0.getAllInterfaceNames().size());
543 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900544
Lorenzo Colitti38258432014-10-20 11:08:03 +0900545 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900546 }
547
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900548 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
549 return lp.getLinkAddresses().iterator().next();
550 }
551
Hugo Benichi87d306b2017-10-12 09:54:49 +0900552 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900553 public void testAddressMethods() {
554 LinkProperties lp = new LinkProperties();
555
556 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800557 assertFalse(lp.hasIpv4Address());
558 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900559
560 // Addresses on stacked links don't count.
561 LinkProperties stacked = new LinkProperties();
562 stacked.setInterfaceName("stacked");
563 lp.addStackedLink(stacked);
564 stacked.addLinkAddress(LINKADDRV4);
565 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800566 assertTrue(stacked.hasIpv4Address());
567 assertTrue(stacked.hasGlobalIpv6Address());
568 assertFalse(lp.hasIpv4Address());
569 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900570 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800571 assertFalse(lp.hasIpv4Address());
572 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900573
574 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800575 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900576 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900577 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900578 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900579 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800580 assertFalse(lp.hasIpv4Address());
581 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900582
583 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900584 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900585
Lorenzo Colittifc854692014-06-23 22:33:43 +0900586 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
587 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800588 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900589
590 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900591 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800592 assertTrue(lp.hasIpv4Address());
593 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900594
595 assertTrue(lp.addLinkAddress(LINKADDRV6));
596 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800597 assertTrue(lp.hasIpv4Address());
598 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900599
600 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
601 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800602 assertTrue(lp.hasIpv4Address());
603 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900604
605 // Adding an address twice has no effect.
606 // Removing an address that's not present has no effect.
607 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900608 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800609 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900610 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900611 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800612 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900613 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900614 assertEquals(1, lp.getLinkAddresses().size());
615
616 // Adding an address that's already present but with different properties causes the
617 // existing address to be updated and returns true.
618 // Start with only LINKADDRV6.
619 assertEquals(1, lp.getLinkAddresses().size());
620 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
621
622 // Create a LinkAddress object for the same address, but with different flags.
623 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
624 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
625 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
626 assertFalse(deprecated.equals(LINKADDRV6));
627
628 // Check that adding it updates the existing address instead of adding a new one.
629 assertTrue(lp.addLinkAddress(deprecated));
630 assertEquals(1, lp.getLinkAddresses().size());
631 assertEquals(deprecated, getFirstLinkAddress(lp));
632 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
633
634 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
635 assertTrue(lp.removeLinkAddress(LINKADDRV6));
636 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800637 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900638
Hugo Benichi87d306b2017-10-12 09:54:49 +0900639 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800640 public void testLinkAddresses() {
641 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900642 lp.addLinkAddress(LINKADDRV4);
643 lp.addLinkAddress(LINKADDRV6);
644
paulhu9f7636c2019-05-02 17:43:28 +0800645 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900646 lp2.addLinkAddress(LINKADDRV6);
647
paulhu9f7636c2019-05-02 17:43:28 +0800648 final LinkProperties lp3 = new LinkProperties();
649 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
650 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900651
paulhu9f7636c2019-05-02 17:43:28 +0800652 assertFalse(lp.equals(lp2));
653 assertFalse(lp2.equals(lp3));
654
655 lp.removeLinkAddress(LINKADDRV4);
656 assertTrue(lp.equals(lp2));
657
658 lp2.setLinkAddresses(lp3.getLinkAddresses());
659 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900660 }
Erik Kline8b023072014-10-24 21:50:20 +0900661
Hugo Benichi87d306b2017-10-12 09:54:49 +0900662 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900663 public void testNat64Prefix() throws Exception {
664 LinkProperties lp = new LinkProperties();
665 lp.addLinkAddress(LINKADDRV4);
666 lp.addLinkAddress(LINKADDRV6);
667
668 assertNull(lp.getNat64Prefix());
669
670 IpPrefix p = new IpPrefix("64:ff9b::/96");
671 lp.setNat64Prefix(p);
672 assertEquals(p, lp.getNat64Prefix());
673
674 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
675 lp.setNat64Prefix(p);
676 assertEquals(p, lp.getNat64Prefix());
677
678 p = new IpPrefix("2001:db8:a:b:1:2::/80");
679 try {
680 lp.setNat64Prefix(p);
681 } catch (IllegalArgumentException expected) {
682 }
683
684 p = new IpPrefix("64:ff9b::/64");
685 try {
686 lp.setNat64Prefix(p);
687 } catch (IllegalArgumentException expected) {
688 }
689
690 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
691
692 lp.setNat64Prefix(null);
693 assertNull(lp.getNat64Prefix());
694 }
695
696 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900697 public void testIsProvisioned() {
698 LinkProperties lp4 = new LinkProperties();
699 assertFalse("v4only:empty", lp4.isProvisioned());
700 lp4.addLinkAddress(LINKADDRV4);
701 assertFalse("v4only:addr-only", lp4.isProvisioned());
702 lp4.addDnsServer(DNS1);
703 assertFalse("v4only:addr+dns", lp4.isProvisioned());
704 lp4.addRoute(new RouteInfo(GATEWAY1));
705 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800706 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
707 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900708
709 LinkProperties lp6 = new LinkProperties();
710 assertFalse("v6only:empty", lp6.isProvisioned());
711 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
712 assertFalse("v6only:fe80-only", lp6.isProvisioned());
713 lp6.addDnsServer(DNS6);
714 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900715 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900716 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
717 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800718 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900719 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
720 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800721 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
722 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900723 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
724
725 LinkProperties lp46 = new LinkProperties();
726 lp46.addLinkAddress(LINKADDRV4);
727 lp46.addLinkAddress(LINKADDRV6);
728 lp46.addDnsServer(DNS1);
729 lp46.addDnsServer(DNS6);
730 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
731 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800732 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
733 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900734 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900735 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800736 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
737 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900738 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
739
740 // A link with an IPv6 address and default route, but IPv4 DNS server.
741 LinkProperties mixed = new LinkProperties();
742 mixed.addLinkAddress(LINKADDRV6);
743 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900744 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800745 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
746 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900747 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
748 }
Erik Kline04612b02015-05-21 16:15:02 +0900749
Hugo Benichi87d306b2017-10-12 09:54:49 +0900750 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900751 public void testCompareProvisioning() {
752 LinkProperties v4lp = new LinkProperties();
753 v4lp.addLinkAddress(LINKADDRV4);
754 v4lp.addRoute(new RouteInfo(GATEWAY1));
755 v4lp.addDnsServer(DNS1);
756 assertTrue(v4lp.isProvisioned());
757
758 LinkProperties v4r = new LinkProperties(v4lp);
759 v4r.removeDnsServer(DNS1);
760 assertFalse(v4r.isProvisioned());
761
762 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
763 LinkProperties.compareProvisioning(v4r, v4r));
764 assertEquals(ProvisioningChange.LOST_PROVISIONING,
765 LinkProperties.compareProvisioning(v4lp, v4r));
766 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
767 LinkProperties.compareProvisioning(v4r, v4lp));
768 assertEquals(ProvisioningChange.STILL_PROVISIONED,
769 LinkProperties.compareProvisioning(v4lp, v4lp));
770
771 // Check that losing IPv4 provisioning on a dualstack network is
772 // seen as a total loss of provisioning.
773 LinkProperties v6lp = new LinkProperties();
774 v6lp.addLinkAddress(LINKADDRV6);
775 v6lp.addRoute(new RouteInfo(GATEWAY61));
776 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800777 assertFalse(v6lp.isIpv4Provisioned());
778 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900779 assertTrue(v6lp.isProvisioned());
780
781 LinkProperties v46lp = new LinkProperties(v6lp);
782 v46lp.addLinkAddress(LINKADDRV4);
783 v46lp.addRoute(new RouteInfo(GATEWAY1));
784 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800785 assertTrue(v46lp.isIpv4Provisioned());
786 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900787 assertTrue(v46lp.isProvisioned());
788
789 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900790 LinkProperties.compareProvisioning(v4lp, v46lp));
791 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900792 LinkProperties.compareProvisioning(v6lp, v46lp));
793 assertEquals(ProvisioningChange.LOST_PROVISIONING,
794 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900795 assertEquals(ProvisioningChange.LOST_PROVISIONING,
796 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900797
798 // Check that losing and gaining a secondary router does not change
799 // the provisioning status.
800 LinkProperties v6lp2 = new LinkProperties(v6lp);
801 v6lp2.addRoute(new RouteInfo(GATEWAY62));
802 assertTrue(v6lp2.isProvisioned());
803
804 assertEquals(ProvisioningChange.STILL_PROVISIONED,
805 LinkProperties.compareProvisioning(v6lp2, v6lp));
806 assertEquals(ProvisioningChange.STILL_PROVISIONED,
807 LinkProperties.compareProvisioning(v6lp, v6lp2));
808 }
Erik Klinea923dba2015-06-26 19:21:34 +0900809
Hugo Benichi87d306b2017-10-12 09:54:49 +0900810 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900811 public void testIsReachable() {
812 final LinkProperties v4lp = new LinkProperties();
813 assertFalse(v4lp.isReachable(DNS1));
814 assertFalse(v4lp.isReachable(DNS2));
815
816 // Add an on-link route, making the on-link DNS server reachable,
817 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900818 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900819 assertFalse(v4lp.isReachable(DNS1));
820 assertFalse(v4lp.isReachable(DNS2));
821
822 // Adding an IPv4 address (right now, any IPv4 address) means we use
823 // the routes to compute likely reachability.
824 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
825 assertTrue(v4lp.isReachable(DNS1));
826 assertFalse(v4lp.isReachable(DNS2));
827
828 // Adding a default route makes the off-link DNS server reachable.
829 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
830 assertTrue(v4lp.isReachable(DNS1));
831 assertTrue(v4lp.isReachable(DNS2));
832
833 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900834 final InetAddress kLinkLocalDns = address("fe80::6:1");
835 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
836 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900837 assertFalse(v6lp.isReachable(kLinkLocalDns));
838 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
839 assertFalse(v6lp.isReachable(kOnLinkDns));
840 assertFalse(v6lp.isReachable(DNS6));
841
842 // Add a link-local route, making the link-local DNS servers reachable. Because
843 // we assume the presence of an IPv6 link-local address, link-local DNS servers
844 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900845 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900846 assertFalse(v6lp.isReachable(kLinkLocalDns));
847 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
848 assertFalse(v6lp.isReachable(kOnLinkDns));
849 assertFalse(v6lp.isReachable(DNS6));
850
851 // Add a link-local address--nothing changes.
852 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
853 assertFalse(v6lp.isReachable(kLinkLocalDns));
854 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
855 assertFalse(v6lp.isReachable(kOnLinkDns));
856 assertFalse(v6lp.isReachable(DNS6));
857
858 // Add a global route on link, but no global address yet. DNS servers reachable
859 // via a route that doesn't require a gateway: give them the benefit of the
860 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900861 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900862 assertFalse(v6lp.isReachable(kLinkLocalDns));
863 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
864 assertTrue(v6lp.isReachable(kOnLinkDns));
865 assertFalse(v6lp.isReachable(DNS6));
866
867 // Add a global address; the on-link global address DNS server is (still)
868 // presumed reachable.
869 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
870 assertFalse(v6lp.isReachable(kLinkLocalDns));
871 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
872 assertTrue(v6lp.isReachable(kOnLinkDns));
873 assertFalse(v6lp.isReachable(DNS6));
874
875 // Adding a default route makes the off-link DNS server reachable.
876 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
877 assertFalse(v6lp.isReachable(kLinkLocalDns));
878 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
879 assertTrue(v6lp.isReachable(kOnLinkDns));
880 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900881
882 // Check isReachable on stacked links. This requires that the source IP address be assigned
883 // on the interface returned by the route lookup.
884 LinkProperties stacked = new LinkProperties();
885
886 // Can't add a stacked link without an interface name.
887 stacked.setInterfaceName("v4-test0");
888 v6lp.addStackedLink(stacked);
889
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900890 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900891 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
892 assertFalse(v6lp.isReachable(stackedAddress));
893 stacked.addLinkAddress(stackedLinkAddress);
894 assertFalse(v6lp.isReachable(stackedAddress));
895 stacked.addRoute(new RouteInfo(stackedLinkAddress));
896 assertTrue(stacked.isReachable(stackedAddress));
897 assertTrue(v6lp.isReachable(stackedAddress));
898
899 assertFalse(v6lp.isReachable(DNS1));
900 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
901 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900902 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100903
Hugo Benichi87d306b2017-10-12 09:54:49 +0900904 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100905 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
906 // IPv4 case: no route added initially
907 LinkProperties rmnet0 = new LinkProperties();
908 rmnet0.setInterfaceName("rmnet0");
909 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
910 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
911 rmnet0.getInterfaceName());
912
913 // Since no routes is added explicitly, getAllRoutes() should return empty.
914 assertTrue(rmnet0.getAllRoutes().isEmpty());
915 rmnet0.ensureDirectlyConnectedRoutes();
916 // ensureDirectlyConnectedRoutes() should have added the missing local route.
917 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
918
919 // IPv4 case: both direct and default routes added initially
920 LinkProperties rmnet1 = new LinkProperties();
921 rmnet1.setInterfaceName("rmnet1");
922 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900923 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800924 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100925 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
926 rmnet1.getInterfaceName());
927 rmnet1.addRoute(defaultRoute1);
928 rmnet1.addRoute(directRoute1);
929
930 // Check added routes
931 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
932 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
933 // route is already part of the configuration.
934 rmnet1.ensureDirectlyConnectedRoutes();
935 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
936
937 // IPv6 case: only default routes added initially
938 LinkProperties rmnet2 = new LinkProperties();
939 rmnet2.setInterfaceName("rmnet2");
940 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
941 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900942 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800943 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100944 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
945 rmnet2.getInterfaceName());
946 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
947 rmnet2.getInterfaceName());
948 rmnet2.addRoute(defaultRoute2);
949
950 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
951 rmnet2.ensureDirectlyConnectedRoutes();
952 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
953 rmnet2.getAllRoutes());
954
955 // Corner case: no interface name
956 LinkProperties rmnet3 = new LinkProperties();
957 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
958 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
959 rmnet3.getInterfaceName());
960
961 assertTrue(rmnet3.getAllRoutes().isEmpty());
962 rmnet3.ensureDirectlyConnectedRoutes();
963 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100964 }
965
Rubin Xuffd77d82017-09-05 18:40:49 +0100966 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
967 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
968 Set<RouteInfo> actualSet = new ArraySet<>(actual);
969 // Duplicated entries in actual routes are considered failures
970 assertEquals(actual.size(), actualSet.size());
971
972 assertEquals(expectedSet, actualSet);
973 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100974
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900975 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900976 LinkProperties source = new LinkProperties();
977 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900978
Chalard Jean299d8562018-04-11 16:36:41 +0900979 source.addLinkAddress(LINKADDRV4);
980 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900981
Chalard Jean299d8562018-04-11 16:36:41 +0900982 source.addDnsServer(DNS1);
983 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900984 source.addDnsServer(GATEWAY62);
985
986 source.addPcscfServer(TESTIPV4ADDR);
987 source.addPcscfServer(TESTIPV6ADDR);
988
989 source.setUsePrivateDns(true);
990 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
991
992 source.setDomains(DOMAINS);
993
Chalard Jean299d8562018-04-11 16:36:41 +0900994 source.addRoute(new RouteInfo(GATEWAY1));
995 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900996
Chalard Jean299d8562018-04-11 16:36:41 +0900997 source.addValidatedPrivateDnsServer(DNS6);
998 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900999 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
1000
1001 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +09001002
1003 source.setMtu(MTU);
1004
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001005 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
1006
Lorenzo Colitti981b34f2019-01-08 09:58:59 +09001007 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
1008
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001009 final LinkProperties stacked = new LinkProperties();
1010 stacked.setInterfaceName("test-stacked");
1011 source.addStackedLink(stacked);
1012
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001013 return source;
1014 }
1015
1016 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1017 public void testLinkPropertiesParcelable_Q() throws Exception {
1018 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001019 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001020 }
1021
1022 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1023 public void testLinkPropertiesParcelable() throws Exception {
1024 final LinkProperties source = makeLinkPropertiesForParceling();
1025
1026 source.setWakeOnLanSupported(true);
1027 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1028 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1029 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001030 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001031
1032 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1033 final LinkProperties sanitized = new LinkProperties(source);
1034 sanitized.setCaptivePortalApiUrl(null);
1035 sanitized.setCaptivePortalData(null);
1036 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001037 }
1038
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001039 // Parceling of the scope was broken until Q-QPR2
1040 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001041 public void testLinkLocalDnsServerParceling() throws Exception {
1042 final String strAddress = "fe80::1%lo";
1043 final LinkProperties lp = new LinkProperties();
1044 lp.addDnsServer(address(strAddress));
1045 final LinkProperties unparceled = parcelingRoundTrip(lp);
1046 // Inet6Address#equals does not test for the scope id
1047 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001048 }
Chalard Jean299d8562018-04-11 16:36:41 +09001049
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001050 @Test
1051 public void testParcelUninitialized() throws Exception {
1052 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001053 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001054 }
paulhu9f7636c2019-05-02 17:43:28 +08001055
1056 @Test
1057 public void testConstructor() {
1058 LinkProperties lp = new LinkProperties();
1059 checkEmpty(lp);
1060 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1061 assertLinkPropertiesEqual(lp, new LinkProperties());
1062
1063 lp = makeTestObject();
1064 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1065 }
1066
1067 @Test
1068 public void testDnsServers() {
1069 final LinkProperties lp = new LinkProperties();
1070 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1071 lp.setDnsServers(dnsServers);
1072 assertEquals(2, lp.getDnsServers().size());
1073 assertEquals(DNS1, lp.getDnsServers().get(0));
1074 assertEquals(DNS2, lp.getDnsServers().get(1));
1075
1076 lp.removeDnsServer(DNS1);
1077 assertEquals(1, lp.getDnsServers().size());
1078 assertEquals(DNS2, lp.getDnsServers().get(0));
1079
1080 lp.addDnsServer(DNS6);
1081 assertEquals(2, lp.getDnsServers().size());
1082 assertEquals(DNS2, lp.getDnsServers().get(0));
1083 assertEquals(DNS6, lp.getDnsServers().get(1));
1084 }
1085
1086 @Test
1087 public void testValidatedPrivateDnsServers() {
1088 final LinkProperties lp = new LinkProperties();
1089 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1090 lp.setValidatedPrivateDnsServers(privDnsServers);
1091 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1092 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1093 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1094
1095 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1096 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1097 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1098
1099 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1100 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1101 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1102 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1103 }
1104
1105 @Test
1106 public void testPcscfServers() {
1107 final LinkProperties lp = new LinkProperties();
1108 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1109 lp.setPcscfServers(pcscfServers);
1110 assertEquals(1, lp.getPcscfServers().size());
1111 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1112
1113 lp.removePcscfServer(PCSCFV4);
1114 assertEquals(0, lp.getPcscfServers().size());
1115
1116 lp.addPcscfServer(PCSCFV6);
1117 assertEquals(1, lp.getPcscfServers().size());
1118 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1119 }
1120
1121 @Test
1122 public void testTcpBufferSizes() {
1123 final LinkProperties lp = makeTestObject();
1124 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1125
1126 lp.setTcpBufferSizes(null);
1127 assertNull(lp.getTcpBufferSizes());
1128 }
1129
1130 @Test
1131 public void testHasIpv6DefaultRoute() {
1132 final LinkProperties lp = makeTestObject();
1133 assertFalse(lp.hasIPv6DefaultRoute());
1134
1135 lp.addRoute(new RouteInfo(GATEWAY61));
1136 assertTrue(lp.hasIPv6DefaultRoute());
1137 }
1138
1139 @Test
1140 public void testHttpProxy() {
1141 final LinkProperties lp = makeTestObject();
1142 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1143 }
1144
1145 @Test
1146 public void testPrivateDnsServerName() {
1147 final LinkProperties lp = makeTestObject();
1148 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1149
1150 lp.setPrivateDnsServerName(null);
1151 assertNull(lp.getPrivateDnsServerName());
1152 }
1153
1154 @Test
1155 public void testUsePrivateDns() {
1156 final LinkProperties lp = makeTestObject();
1157 assertTrue(lp.isPrivateDnsActive());
1158
1159 lp.clear();
1160 assertFalse(lp.isPrivateDnsActive());
1161 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001162
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001163 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001164 public void testDhcpServerAddress() {
1165 final LinkProperties lp = makeTestObject();
1166 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1167
1168 lp.clear();
1169 assertNull(lp.getDhcpServerAddress());
1170 }
1171
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001172 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001173 public void testWakeOnLanSupported() {
1174 final LinkProperties lp = makeTestObject();
1175 assertTrue(lp.isWakeOnLanSupported());
1176
1177 lp.clear();
1178 assertFalse(lp.isWakeOnLanSupported());
1179 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001180
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001181 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001182 public void testCaptivePortalApiUrl() {
1183 final LinkProperties lp = makeTestObject();
1184 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1185
1186 lp.clear();
1187 assertNull(lp.getCaptivePortalApiUrl());
1188 }
1189
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001190 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001191 public void testCaptivePortalData() {
1192 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001193 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001194
1195 lp.clear();
1196 assertNull(lp.getCaptivePortalData());
1197 }
lucaslin55c6a842020-03-26 19:15:11 +08001198
1199 private LinkProperties makeIpv4LinkProperties() {
1200 final LinkProperties linkProperties = new LinkProperties();
1201 linkProperties.setInterfaceName(NAME);
1202 linkProperties.addLinkAddress(LINKADDRV4);
1203 linkProperties.addDnsServer(DNS1);
1204 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1205 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1206 return linkProperties;
1207 }
1208
1209 private LinkProperties makeIpv6LinkProperties() {
1210 final LinkProperties linkProperties = new LinkProperties();
1211 linkProperties.setInterfaceName(NAME);
1212 linkProperties.addLinkAddress(LINKADDRV6);
1213 linkProperties.addDnsServer(DNS6);
1214 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1215 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1216 return linkProperties;
1217 }
1218
1219 @Test
1220 public void testHasIpv4DefaultRoute() {
1221 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1222 assertTrue(Ipv4.hasIpv4DefaultRoute());
1223 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1224 assertFalse(Ipv6.hasIpv4DefaultRoute());
1225 }
1226
1227 @Test
1228 public void testHasIpv4DnsServer() {
1229 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1230 assertTrue(Ipv4.hasIpv4DnsServer());
1231 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1232 assertFalse(Ipv6.hasIpv4DnsServer());
1233 }
1234
1235 @Test
1236 public void testHasIpv6DnsServer() {
1237 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1238 assertFalse(Ipv4.hasIpv6DnsServer());
1239 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1240 assertTrue(Ipv6.hasIpv6DnsServer());
1241 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001242
1243 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1244 public void testHasIpv4UnreachableDefaultRoute() {
1245 final LinkProperties lp = makeTestObject();
1246 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1247 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1248
1249 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1250 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1251 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1252 }
1253
1254 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1255 public void testHasIpv6UnreachableDefaultRoute() {
1256 final LinkProperties lp = makeTestObject();
1257 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1258 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1259
1260 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1261 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1262 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1263 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001264
Preranaa53ed852022-04-28 04:02:05 +00001265 @Test @IgnoreUpTo(Build.VERSION_CODES.S_V2)
preranap19051542022-05-11 04:23:14 +00001266 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Preranaa53ed852022-04-28 04:02:05 +00001267 public void testHasExcludeRoute() {
1268 LinkProperties lp = new LinkProperties();
preranap19051542022-05-11 04:23:14 +00001269 lp.setInterfaceName("tun0");
1270 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 24), RTN_UNICAST));
Preranaa53ed852022-04-28 04:02:05 +00001271 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_UNICAST));
1272 assertFalse(lp.hasExcludeRoute());
preranap19051542022-05-11 04:23:14 +00001273 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 32), RTN_THROW));
Preranaa53ed852022-04-28 04:02:05 +00001274 assertTrue(lp.hasExcludeRoute());
1275 }
1276
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001277 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001278 @EnableCompatChanges({LinkProperties.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
1294 @Test @IgnoreUpTo(SC_V2)
1295 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1296 public void testExcludedRoutesEnabled() {
1297 final LinkProperties lp = new LinkProperties();
1298 assertEquals(0, lp.getRoutes().size());
1299
1300 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
1301 assertEquals(1, lp.getRoutes().size());
1302
1303 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_THROW));
1304 assertEquals(2, lp.getRoutes().size());
1305
1306 lp.addRoute(new RouteInfo(GATEWAY1));
1307 assertEquals(3, lp.getRoutes().size());
1308 }
1309
1310 @Test @IgnoreUpTo(SC_V2)
Lorenzo Colitti4685a552022-05-28 00:22:06 +09001311 @CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden on T or above")
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001312 @DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1313 public void testExcludedRoutesDisabled() {
1314 final LinkProperties lp = new LinkProperties();
1315 assertEquals(0, lp.getRoutes().size());
1316
1317 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
1318 assertEquals(0, lp.getRoutes().size());
1319
1320 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW));
1321 assertEquals(0, lp.getRoutes().size());
1322
1323 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST));
1324 assertEquals(1, lp.getRoutes().size());
1325 }
John Wang3e567d52011-04-04 12:35:42 -07001326}