blob: 8fc636ab9743bab5491070171c9079ae74310c23 [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;
49
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;
55import org.junit.runner.RunWith;
56
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090057import java.net.Inet4Address;
Rubin Xuab8cf302020-03-30 14:37:05 +010058import java.net.Inet6Address;
John Wang3e567d52011-04-04 12:35:42 -070059import java.net.InetAddress;
Rubin Xuffd77d82017-09-05 18:40:49 +010060import java.util.Arrays;
61import java.util.Collection;
62import java.util.Collections;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010063import java.util.List;
Rubin Xuffd77d82017-09-05 18:40:49 +010064import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070065
Hugo Benichi87d306b2017-10-12 09:54:49 +090066@RunWith(AndroidJUnit4.class)
67@SmallTest
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090068@ConnectivityModuleTest
Hugo Benichi87d306b2017-10-12 09:54:49 +090069public class LinkPropertiesTest {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090070 @Rule
71 public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
72
Taras Antoshchuk30d41e52021-08-02 18:06:35 +020073 @Rule
74 public final PlatformCompatChangeRule compatChangeRule = new PlatformCompatChangeRule();
75
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +090076 private static final InetAddress ADDRV4 = address("75.208.6.1");
77 private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
78 private static final InetAddress DNS1 = address("75.208.7.1");
79 private static final InetAddress DNS2 = address("69.78.7.1");
80 private static final InetAddress DNS6 = address("2001:4860:4860::8888");
81 private static final InetAddress PRIVDNS1 = address("1.1.1.1");
82 private static final InetAddress PRIVDNS2 = address("1.0.0.1");
83 private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111");
84 private static final InetAddress PCSCFV4 = address("10.77.25.37");
85 private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1");
86 private static final InetAddress GATEWAY1 = address("75.208.8.1");
87 private static final InetAddress GATEWAY2 = address("69.78.8.1");
88 private static final InetAddress GATEWAY61 = address("fe80::6:0000:613");
89 private static final InetAddress GATEWAY62 = address("fe80::6:22%lo");
90 private static final InetAddress TESTIPV4ADDR = address("192.168.47.42");
91 private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43");
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090092 private static final Inet4Address DHCPSERVER = (Inet4Address) address("192.0.2.1");
paulhu9f7636c2019-05-02 17:43:28 +080093 private static final String NAME = "qmi0";
94 private static final String DOMAINS = "google.com";
95 private static final String PRIV_DNS_SERVER_NAME = "private.dns.com";
96 private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576";
97 private static final int MTU = 1500;
98 private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
99 private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
100 private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900101 private static final Uri CAPPORT_API_URL = Uri.parse("https://test.example.com/capportapi");
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900102
103 // CaptivePortalData cannot be in a constant as it does not exist on Q.
104 // The test runner also crashes when scanning for tests if it is a return type.
105 private static Object getCaptivePortalData() {
106 return new CaptivePortalData.Builder()
107 .setVenueInfoUrl(Uri.parse("https://test.example.com/venue")).build();
108 }
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900109
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900110 private static InetAddress address(String addrString) {
paulhu9f7636c2019-05-02 17:43:28 +0800111 return InetAddresses.parseNumericAddress(addrString);
112 }
113
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900114 private static boolean isAtLeastR() {
115 // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
116 return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
117 }
118
paulhu9f7636c2019-05-02 17:43:28 +0800119 private void checkEmpty(final LinkProperties lp) {
120 assertEquals(0, lp.getAllInterfaceNames().size());
121 assertEquals(0, lp.getAllAddresses().size());
122 assertEquals(0, lp.getDnsServers().size());
123 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
124 assertEquals(0, lp.getPcscfServers().size());
125 assertEquals(0, lp.getAllRoutes().size());
126 assertEquals(0, lp.getAllLinkAddresses().size());
127 assertEquals(0, lp.getStackedLinks().size());
128 assertEquals(0, lp.getMtu());
129 assertNull(lp.getPrivateDnsServerName());
130 assertNull(lp.getDomains());
131 assertNull(lp.getHttpProxy());
132 assertNull(lp.getTcpBufferSizes());
133 assertNull(lp.getNat64Prefix());
134 assertFalse(lp.isProvisioned());
135 assertFalse(lp.isIpv4Provisioned());
136 assertFalse(lp.isIpv6Provisioned());
137 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900138
139 if (isAtLeastR()) {
140 assertNull(lp.getDhcpServerAddress());
141 assertFalse(lp.isWakeOnLanSupported());
142 assertNull(lp.getCaptivePortalApiUrl());
143 assertNull(lp.getCaptivePortalData());
144 }
paulhu9f7636c2019-05-02 17:43:28 +0800145 }
146
147 private LinkProperties makeTestObject() {
148 final LinkProperties lp = new LinkProperties();
149 lp.setInterfaceName(NAME);
150 lp.addLinkAddress(LINKADDRV4);
151 lp.addLinkAddress(LINKADDRV6);
152 lp.addDnsServer(DNS1);
153 lp.addDnsServer(DNS2);
154 lp.addValidatedPrivateDnsServer(PRIVDNS1);
155 lp.addValidatedPrivateDnsServer(PRIVDNS2);
156 lp.setUsePrivateDns(true);
157 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
158 lp.addPcscfServer(PCSCFV6);
159 lp.setDomains(DOMAINS);
160 lp.addRoute(new RouteInfo(GATEWAY1));
161 lp.addRoute(new RouteInfo(GATEWAY2));
162 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
163 lp.setMtu(MTU);
164 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
165 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900166 if (isAtLeastR()) {
167 lp.setDhcpServerAddress(DHCPSERVER);
168 lp.setWakeOnLanSupported(true);
169 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
170 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
171 }
paulhu9f7636c2019-05-02 17:43:28 +0800172 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900173 }
174
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900175 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
176 // Check implementation of equals(), element by element.
177 assertTrue(source.isIdenticalInterfaceName(target));
178 assertTrue(target.isIdenticalInterfaceName(source));
179
180 assertTrue(source.isIdenticalAddresses(target));
181 assertTrue(target.isIdenticalAddresses(source));
182
183 assertTrue(source.isIdenticalDnses(target));
184 assertTrue(target.isIdenticalDnses(source));
185
dalyk7643abc2018-01-17 14:20:55 -0500186 assertTrue(source.isIdenticalPrivateDns(target));
187 assertTrue(target.isIdenticalPrivateDns(source));
188
Chalard Jean299d8562018-04-11 16:36:41 +0900189 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
190 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
191
Hongshike2d7cf52018-06-28 20:42:19 +0900192 assertTrue(source.isIdenticalPcscfs(target));
193 assertTrue(target.isIdenticalPcscfs(source));
194
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900195 assertTrue(source.isIdenticalRoutes(target));
196 assertTrue(target.isIdenticalRoutes(source));
197
198 assertTrue(source.isIdenticalHttpProxy(target));
199 assertTrue(target.isIdenticalHttpProxy(source));
200
201 assertTrue(source.isIdenticalStackedLinks(target));
202 assertTrue(target.isIdenticalStackedLinks(source));
203
sy.yun4aa73922013-09-02 05:24:09 +0900204 assertTrue(source.isIdenticalMtu(target));
205 assertTrue(target.isIdenticalMtu(source));
206
dalyk7643abc2018-01-17 14:20:55 -0500207 assertTrue(source.isIdenticalTcpBufferSizes(target));
208 assertTrue(target.isIdenticalTcpBufferSizes(source));
209
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900210 if (isAtLeastR()) {
211 assertTrue(source.isIdenticalDhcpServerAddress(target));
212 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200213
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900214 assertTrue(source.isIdenticalWakeOnLan(target));
215 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900216
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900217 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
218 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
219
220 assertTrue(source.isIdenticalCaptivePortalData(target));
221 assertTrue(target.isIdenticalCaptivePortalData(source));
222 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900223
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900224 // Check result of equals().
225 assertTrue(source.equals(target));
226 assertTrue(target.equals(source));
227
228 // Check hashCode.
229 assertEquals(source.hashCode(), target.hashCode());
230 }
231
Hugo Benichi87d306b2017-10-12 09:54:49 +0900232 @Test
John Wang3e567d52011-04-04 12:35:42 -0700233 public void testEqualsNull() {
234 LinkProperties source = new LinkProperties();
235 LinkProperties target = new LinkProperties();
236
237 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900238 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700239 }
240
Hugo Benichi87d306b2017-10-12 09:54:49 +0900241 @Test
242 public void testEqualsSameOrder() throws Exception {
243 LinkProperties source = new LinkProperties();
244 source.setInterfaceName(NAME);
245 // set 2 link addresses
246 source.addLinkAddress(LINKADDRV4);
247 source.addLinkAddress(LINKADDRV6);
248 // set 2 dnses
249 source.addDnsServer(DNS1);
250 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900251 // set 1 pcscf
252 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900253 // set 2 gateways
254 source.addRoute(new RouteInfo(GATEWAY1));
255 source.addRoute(new RouteInfo(GATEWAY2));
256 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700257
Hugo Benichi87d306b2017-10-12 09:54:49 +0900258 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700259
Hugo Benichi87d306b2017-10-12 09:54:49 +0900260 // All fields are same
261 target.setInterfaceName(NAME);
262 target.addLinkAddress(LINKADDRV4);
263 target.addLinkAddress(LINKADDRV6);
264 target.addDnsServer(DNS1);
265 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900266 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900267 target.addRoute(new RouteInfo(GATEWAY1));
268 target.addRoute(new RouteInfo(GATEWAY2));
269 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700270
Hugo Benichi87d306b2017-10-12 09:54:49 +0900271 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700272
Hugo Benichi87d306b2017-10-12 09:54:49 +0900273 target.clear();
274 // change Interface Name
275 target.setInterfaceName("qmi1");
276 target.addLinkAddress(LINKADDRV4);
277 target.addLinkAddress(LINKADDRV6);
278 target.addDnsServer(DNS1);
279 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900280 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900281 target.addRoute(new RouteInfo(GATEWAY1));
282 target.addRoute(new RouteInfo(GATEWAY2));
283 target.setMtu(MTU);
284 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700285
Hugo Benichi87d306b2017-10-12 09:54:49 +0900286 target.clear();
287 target.setInterfaceName(NAME);
288 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900289 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900290 target.addLinkAddress(LINKADDRV6);
291 target.addDnsServer(DNS1);
292 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900293 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900294 target.addRoute(new RouteInfo(GATEWAY1));
295 target.addRoute(new RouteInfo(GATEWAY2));
296 target.setMtu(MTU);
297 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700298
Hugo Benichi87d306b2017-10-12 09:54:49 +0900299 target.clear();
300 target.setInterfaceName(NAME);
301 target.addLinkAddress(LINKADDRV4);
302 target.addLinkAddress(LINKADDRV6);
303 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900304 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900305 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900306 target.addPcscfServer(PCSCFV6);
307 target.addRoute(new RouteInfo(GATEWAY1));
308 target.addRoute(new RouteInfo(GATEWAY2));
309 target.setMtu(MTU);
310 assertFalse(source.equals(target));
311
312 target.clear();
313 target.setInterfaceName(NAME);
314 target.addLinkAddress(LINKADDRV4);
315 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900316 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900317 target.addDnsServer(DNS2);
318 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900319 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900320 target.addRoute(new RouteInfo(GATEWAY1));
321 target.addRoute(new RouteInfo(GATEWAY2));
322 target.setMtu(MTU);
323 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700324
Hugo Benichi87d306b2017-10-12 09:54:49 +0900325 target.clear();
326 target.setInterfaceName(NAME);
327 target.addLinkAddress(LINKADDRV4);
328 target.addLinkAddress(LINKADDRV6);
329 target.addDnsServer(DNS1);
330 target.addDnsServer(DNS2);
331 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900332 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900333 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900334 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900335 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900336
Hugo Benichi87d306b2017-10-12 09:54:49 +0900337 target.clear();
338 target.setInterfaceName(NAME);
339 target.addLinkAddress(LINKADDRV4);
340 target.addLinkAddress(LINKADDRV6);
341 target.addDnsServer(DNS1);
342 target.addDnsServer(DNS2);
343 target.addRoute(new RouteInfo(GATEWAY1));
344 target.addRoute(new RouteInfo(GATEWAY2));
345 // change mtu
346 target.setMtu(1440);
347 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700348 }
349
Hugo Benichi87d306b2017-10-12 09:54:49 +0900350 @Test
351 public void testEqualsDifferentOrder() throws Exception {
352 LinkProperties source = new LinkProperties();
353 source.setInterfaceName(NAME);
354 // set 2 link addresses
355 source.addLinkAddress(LINKADDRV4);
356 source.addLinkAddress(LINKADDRV6);
357 // set 2 dnses
358 source.addDnsServer(DNS1);
359 source.addDnsServer(DNS2);
360 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800361 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900362 source.addRoute(new RouteInfo(GATEWAY2));
363 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700364
Hugo Benichi87d306b2017-10-12 09:54:49 +0900365 LinkProperties target = new LinkProperties();
366 // Exchange order
367 target.setInterfaceName(NAME);
368 target.addLinkAddress(LINKADDRV6);
369 target.addLinkAddress(LINKADDRV4);
370 target.addDnsServer(DNS2);
371 target.addDnsServer(DNS1);
372 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800373 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900374 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700375
Hugo Benichi87d306b2017-10-12 09:54:49 +0900376 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700377 }
378
Hugo Benichi87d306b2017-10-12 09:54:49 +0900379 @Test
380 public void testEqualsDuplicated() throws Exception {
381 LinkProperties source = new LinkProperties();
382 // set 3 link addresses, eg, [A, A, B]
383 source.addLinkAddress(LINKADDRV4);
384 source.addLinkAddress(LINKADDRV4);
385 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700386
Hugo Benichi87d306b2017-10-12 09:54:49 +0900387 LinkProperties target = new LinkProperties();
388 // set 3 link addresses, eg, [A, B, B]
389 target.addLinkAddress(LINKADDRV4);
390 target.addLinkAddress(LINKADDRV6);
391 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700392
Hugo Benichi87d306b2017-10-12 09:54:49 +0900393 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700394 }
395
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800396 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
397 for (RouteInfo r : lp.getRoutes()) {
398 assertEquals(iface, r.getInterface());
399 }
400 }
401
paulhu9f7636c2019-05-02 17:43:28 +0800402 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
403 for (RouteInfo r : lp.getRoutes()) {
404 assertNotEquals(iface, r.getInterface());
405 }
406 }
407
Hugo Benichi87d306b2017-10-12 09:54:49 +0900408 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800409 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800410 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
411 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900412 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800413
414 // Add a route with no interface to a LinkProperties with no interface. No errors.
415 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800416 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900417 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800418 assertEquals(1, lp.getRoutes().size());
419 assertAllRoutesHaveInterface(null, lp);
420
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900421 // Adding the same route twice has no effect.
422 assertFalse(lp.addRoute(r));
423 assertEquals(1, lp.getRoutes().size());
424
425 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800426 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800427 try {
428 lp.addRoute(r);
429 fail("Adding wlan0 route to LP with no interface, expect exception");
430 } catch (IllegalArgumentException expected) {}
431
432 // Change the interface name. All the routes should change their interface name too.
433 lp.setInterfaceName("rmnet0");
434 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800435 assertAllRoutesNotHaveInterface(null, lp);
436 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800437
438 // Now add a route with the wrong interface. This causes an exception too.
439 try {
440 lp.addRoute(r);
441 fail("Adding wlan0 route to rmnet0 LP, expect exception");
442 } catch (IllegalArgumentException expected) {}
443
444 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800445 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800446 lp.setInterfaceName("wlan0");
447 lp.addRoute(r);
448 assertEquals(2, lp.getRoutes().size());
449 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800450 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800451
452 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900453 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800454 lp.addRoute(r);
455 assertEquals(3, lp.getRoutes().size());
456 assertAllRoutesHaveInterface("wlan0", lp);
457
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900458 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800459 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800460 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900461 final CompareResult<RouteInfo> cr1 =
462 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
463 assertEquals(0, cr1.added.size());
464 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800465
466 lp2.setInterfaceName("p2p0");
467 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800468 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900469 final CompareResult<RouteInfo> cr2 =
470 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
471 assertEquals(3, cr2.added.size());
472 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800473
Tyler Wear44999a72020-02-13 17:14:38 -0800474 // Remove route with incorrect interface, no route removed.
475 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800476 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800477
478 // Check remove works when interface is correct.
479 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800480 assertEquals(2, lp.getRoutes().size());
481 assertAllRoutesHaveInterface("wlan0", lp);
482 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900483 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800484
Hugo Benichi87d306b2017-10-12 09:54:49 +0900485 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800486 public void testStackedInterfaces() {
487 LinkProperties rmnet0 = new LinkProperties();
488 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900489 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800490
491 LinkProperties clat4 = new LinkProperties();
492 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900493 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800494
495 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900496 assertEquals(1, rmnet0.getAddresses().size());
497 assertEquals(1, rmnet0.getLinkAddresses().size());
498 assertEquals(1, rmnet0.getAllAddresses().size());
499 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800500 assertEquals(1, rmnet0.getAllInterfaceNames().size());
501 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900502
Lorenzo Colittic0803122013-03-07 10:59:25 -0800503 rmnet0.addStackedLink(clat4);
504 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900505 assertEquals(1, rmnet0.getAddresses().size());
506 assertEquals(1, rmnet0.getLinkAddresses().size());
507 assertEquals(2, rmnet0.getAllAddresses().size());
508 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800509 assertEquals(2, rmnet0.getAllInterfaceNames().size());
510 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
511 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900512
Lorenzo Colittic0803122013-03-07 10:59:25 -0800513 rmnet0.addStackedLink(clat4);
514 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900515 assertEquals(1, rmnet0.getAddresses().size());
516 assertEquals(1, rmnet0.getLinkAddresses().size());
517 assertEquals(2, rmnet0.getAllAddresses().size());
518 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800519 assertEquals(2, rmnet0.getAllInterfaceNames().size());
520 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
521 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900522
Lorenzo Colittic0803122013-03-07 10:59:25 -0800523 assertEquals(0, clat4.getStackedLinks().size());
524
525 // Modify an item in the returned collection to see what happens.
526 for (LinkProperties link : rmnet0.getStackedLinks()) {
527 if (link.getInterfaceName().equals("clat4")) {
528 link.setInterfaceName("newname");
529 }
530 }
531 for (LinkProperties link : rmnet0.getStackedLinks()) {
532 assertFalse("newname".equals(link.getInterfaceName()));
533 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900534
Lorenzo Colitti38258432014-10-20 11:08:03 +0900535 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900536 assertEquals(0, rmnet0.getStackedLinks().size());
537 assertEquals(1, rmnet0.getAddresses().size());
538 assertEquals(1, rmnet0.getLinkAddresses().size());
539 assertEquals(1, rmnet0.getAllAddresses().size());
540 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800541 assertEquals(1, rmnet0.getAllInterfaceNames().size());
542 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900543
Lorenzo Colitti38258432014-10-20 11:08:03 +0900544 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900545 }
546
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900547 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
548 return lp.getLinkAddresses().iterator().next();
549 }
550
Hugo Benichi87d306b2017-10-12 09:54:49 +0900551 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900552 public void testAddressMethods() {
553 LinkProperties lp = new LinkProperties();
554
555 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800556 assertFalse(lp.hasIpv4Address());
557 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900558
559 // Addresses on stacked links don't count.
560 LinkProperties stacked = new LinkProperties();
561 stacked.setInterfaceName("stacked");
562 lp.addStackedLink(stacked);
563 stacked.addLinkAddress(LINKADDRV4);
564 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800565 assertTrue(stacked.hasIpv4Address());
566 assertTrue(stacked.hasGlobalIpv6Address());
567 assertFalse(lp.hasIpv4Address());
568 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900569 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800570 assertFalse(lp.hasIpv4Address());
571 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900572
573 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800574 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900575 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900576 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900577 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900578 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800579 assertFalse(lp.hasIpv4Address());
580 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900581
582 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900583 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900584
Lorenzo Colittifc854692014-06-23 22:33:43 +0900585 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
586 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800587 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900588
589 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900590 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800591 assertTrue(lp.hasIpv4Address());
592 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900593
594 assertTrue(lp.addLinkAddress(LINKADDRV6));
595 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800596 assertTrue(lp.hasIpv4Address());
597 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900598
599 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
600 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800601 assertTrue(lp.hasIpv4Address());
602 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900603
604 // Adding an address twice has no effect.
605 // Removing an address that's not present has no effect.
606 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900607 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800608 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900609 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900610 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800611 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900612 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900613 assertEquals(1, lp.getLinkAddresses().size());
614
615 // Adding an address that's already present but with different properties causes the
616 // existing address to be updated and returns true.
617 // Start with only LINKADDRV6.
618 assertEquals(1, lp.getLinkAddresses().size());
619 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
620
621 // Create a LinkAddress object for the same address, but with different flags.
622 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
623 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
624 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
625 assertFalse(deprecated.equals(LINKADDRV6));
626
627 // Check that adding it updates the existing address instead of adding a new one.
628 assertTrue(lp.addLinkAddress(deprecated));
629 assertEquals(1, lp.getLinkAddresses().size());
630 assertEquals(deprecated, getFirstLinkAddress(lp));
631 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
632
633 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
634 assertTrue(lp.removeLinkAddress(LINKADDRV6));
635 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800636 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900637
Hugo Benichi87d306b2017-10-12 09:54:49 +0900638 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800639 public void testLinkAddresses() {
640 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900641 lp.addLinkAddress(LINKADDRV4);
642 lp.addLinkAddress(LINKADDRV6);
643
paulhu9f7636c2019-05-02 17:43:28 +0800644 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900645 lp2.addLinkAddress(LINKADDRV6);
646
paulhu9f7636c2019-05-02 17:43:28 +0800647 final LinkProperties lp3 = new LinkProperties();
648 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
649 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900650
paulhu9f7636c2019-05-02 17:43:28 +0800651 assertFalse(lp.equals(lp2));
652 assertFalse(lp2.equals(lp3));
653
654 lp.removeLinkAddress(LINKADDRV4);
655 assertTrue(lp.equals(lp2));
656
657 lp2.setLinkAddresses(lp3.getLinkAddresses());
658 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900659 }
Erik Kline8b023072014-10-24 21:50:20 +0900660
Hugo Benichi87d306b2017-10-12 09:54:49 +0900661 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900662 public void testNat64Prefix() throws Exception {
663 LinkProperties lp = new LinkProperties();
664 lp.addLinkAddress(LINKADDRV4);
665 lp.addLinkAddress(LINKADDRV6);
666
667 assertNull(lp.getNat64Prefix());
668
669 IpPrefix p = new IpPrefix("64:ff9b::/96");
670 lp.setNat64Prefix(p);
671 assertEquals(p, lp.getNat64Prefix());
672
673 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
674 lp.setNat64Prefix(p);
675 assertEquals(p, lp.getNat64Prefix());
676
677 p = new IpPrefix("2001:db8:a:b:1:2::/80");
678 try {
679 lp.setNat64Prefix(p);
680 } catch (IllegalArgumentException expected) {
681 }
682
683 p = new IpPrefix("64:ff9b::/64");
684 try {
685 lp.setNat64Prefix(p);
686 } catch (IllegalArgumentException expected) {
687 }
688
689 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
690
691 lp.setNat64Prefix(null);
692 assertNull(lp.getNat64Prefix());
693 }
694
695 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900696 public void testIsProvisioned() {
697 LinkProperties lp4 = new LinkProperties();
698 assertFalse("v4only:empty", lp4.isProvisioned());
699 lp4.addLinkAddress(LINKADDRV4);
700 assertFalse("v4only:addr-only", lp4.isProvisioned());
701 lp4.addDnsServer(DNS1);
702 assertFalse("v4only:addr+dns", lp4.isProvisioned());
703 lp4.addRoute(new RouteInfo(GATEWAY1));
704 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800705 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
706 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900707
708 LinkProperties lp6 = new LinkProperties();
709 assertFalse("v6only:empty", lp6.isProvisioned());
710 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
711 assertFalse("v6only:fe80-only", lp6.isProvisioned());
712 lp6.addDnsServer(DNS6);
713 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900714 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900715 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
716 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800717 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900718 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
719 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800720 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
721 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900722 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
723
724 LinkProperties lp46 = new LinkProperties();
725 lp46.addLinkAddress(LINKADDRV4);
726 lp46.addLinkAddress(LINKADDRV6);
727 lp46.addDnsServer(DNS1);
728 lp46.addDnsServer(DNS6);
729 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
730 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800731 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
732 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900733 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900734 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800735 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
736 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900737 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
738
739 // A link with an IPv6 address and default route, but IPv4 DNS server.
740 LinkProperties mixed = new LinkProperties();
741 mixed.addLinkAddress(LINKADDRV6);
742 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900743 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800744 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
745 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900746 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
747 }
Erik Kline04612b02015-05-21 16:15:02 +0900748
Hugo Benichi87d306b2017-10-12 09:54:49 +0900749 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900750 public void testCompareProvisioning() {
751 LinkProperties v4lp = new LinkProperties();
752 v4lp.addLinkAddress(LINKADDRV4);
753 v4lp.addRoute(new RouteInfo(GATEWAY1));
754 v4lp.addDnsServer(DNS1);
755 assertTrue(v4lp.isProvisioned());
756
757 LinkProperties v4r = new LinkProperties(v4lp);
758 v4r.removeDnsServer(DNS1);
759 assertFalse(v4r.isProvisioned());
760
761 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
762 LinkProperties.compareProvisioning(v4r, v4r));
763 assertEquals(ProvisioningChange.LOST_PROVISIONING,
764 LinkProperties.compareProvisioning(v4lp, v4r));
765 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
766 LinkProperties.compareProvisioning(v4r, v4lp));
767 assertEquals(ProvisioningChange.STILL_PROVISIONED,
768 LinkProperties.compareProvisioning(v4lp, v4lp));
769
770 // Check that losing IPv4 provisioning on a dualstack network is
771 // seen as a total loss of provisioning.
772 LinkProperties v6lp = new LinkProperties();
773 v6lp.addLinkAddress(LINKADDRV6);
774 v6lp.addRoute(new RouteInfo(GATEWAY61));
775 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800776 assertFalse(v6lp.isIpv4Provisioned());
777 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900778 assertTrue(v6lp.isProvisioned());
779
780 LinkProperties v46lp = new LinkProperties(v6lp);
781 v46lp.addLinkAddress(LINKADDRV4);
782 v46lp.addRoute(new RouteInfo(GATEWAY1));
783 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800784 assertTrue(v46lp.isIpv4Provisioned());
785 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900786 assertTrue(v46lp.isProvisioned());
787
788 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900789 LinkProperties.compareProvisioning(v4lp, v46lp));
790 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900791 LinkProperties.compareProvisioning(v6lp, v46lp));
792 assertEquals(ProvisioningChange.LOST_PROVISIONING,
793 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900794 assertEquals(ProvisioningChange.LOST_PROVISIONING,
795 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900796
797 // Check that losing and gaining a secondary router does not change
798 // the provisioning status.
799 LinkProperties v6lp2 = new LinkProperties(v6lp);
800 v6lp2.addRoute(new RouteInfo(GATEWAY62));
801 assertTrue(v6lp2.isProvisioned());
802
803 assertEquals(ProvisioningChange.STILL_PROVISIONED,
804 LinkProperties.compareProvisioning(v6lp2, v6lp));
805 assertEquals(ProvisioningChange.STILL_PROVISIONED,
806 LinkProperties.compareProvisioning(v6lp, v6lp2));
807 }
Erik Klinea923dba2015-06-26 19:21:34 +0900808
Hugo Benichi87d306b2017-10-12 09:54:49 +0900809 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900810 public void testIsReachable() {
811 final LinkProperties v4lp = new LinkProperties();
812 assertFalse(v4lp.isReachable(DNS1));
813 assertFalse(v4lp.isReachable(DNS2));
814
815 // Add an on-link route, making the on-link DNS server reachable,
816 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900817 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900818 assertFalse(v4lp.isReachable(DNS1));
819 assertFalse(v4lp.isReachable(DNS2));
820
821 // Adding an IPv4 address (right now, any IPv4 address) means we use
822 // the routes to compute likely reachability.
823 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
824 assertTrue(v4lp.isReachable(DNS1));
825 assertFalse(v4lp.isReachable(DNS2));
826
827 // Adding a default route makes the off-link DNS server reachable.
828 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
829 assertTrue(v4lp.isReachable(DNS1));
830 assertTrue(v4lp.isReachable(DNS2));
831
832 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900833 final InetAddress kLinkLocalDns = address("fe80::6:1");
834 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
835 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900836 assertFalse(v6lp.isReachable(kLinkLocalDns));
837 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
838 assertFalse(v6lp.isReachable(kOnLinkDns));
839 assertFalse(v6lp.isReachable(DNS6));
840
841 // Add a link-local route, making the link-local DNS servers reachable. Because
842 // we assume the presence of an IPv6 link-local address, link-local DNS servers
843 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900844 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900845 assertFalse(v6lp.isReachable(kLinkLocalDns));
846 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
847 assertFalse(v6lp.isReachable(kOnLinkDns));
848 assertFalse(v6lp.isReachable(DNS6));
849
850 // Add a link-local address--nothing changes.
851 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
852 assertFalse(v6lp.isReachable(kLinkLocalDns));
853 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
854 assertFalse(v6lp.isReachable(kOnLinkDns));
855 assertFalse(v6lp.isReachable(DNS6));
856
857 // Add a global route on link, but no global address yet. DNS servers reachable
858 // via a route that doesn't require a gateway: give them the benefit of the
859 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900860 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900861 assertFalse(v6lp.isReachable(kLinkLocalDns));
862 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
863 assertTrue(v6lp.isReachable(kOnLinkDns));
864 assertFalse(v6lp.isReachable(DNS6));
865
866 // Add a global address; the on-link global address DNS server is (still)
867 // presumed reachable.
868 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
869 assertFalse(v6lp.isReachable(kLinkLocalDns));
870 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
871 assertTrue(v6lp.isReachable(kOnLinkDns));
872 assertFalse(v6lp.isReachable(DNS6));
873
874 // Adding a default route makes the off-link DNS server reachable.
875 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
876 assertFalse(v6lp.isReachable(kLinkLocalDns));
877 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
878 assertTrue(v6lp.isReachable(kOnLinkDns));
879 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900880
881 // Check isReachable on stacked links. This requires that the source IP address be assigned
882 // on the interface returned by the route lookup.
883 LinkProperties stacked = new LinkProperties();
884
885 // Can't add a stacked link without an interface name.
886 stacked.setInterfaceName("v4-test0");
887 v6lp.addStackedLink(stacked);
888
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900889 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900890 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
891 assertFalse(v6lp.isReachable(stackedAddress));
892 stacked.addLinkAddress(stackedLinkAddress);
893 assertFalse(v6lp.isReachable(stackedAddress));
894 stacked.addRoute(new RouteInfo(stackedLinkAddress));
895 assertTrue(stacked.isReachable(stackedAddress));
896 assertTrue(v6lp.isReachable(stackedAddress));
897
898 assertFalse(v6lp.isReachable(DNS1));
899 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
900 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900901 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100902
Hugo Benichi87d306b2017-10-12 09:54:49 +0900903 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100904 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
905 // IPv4 case: no route added initially
906 LinkProperties rmnet0 = new LinkProperties();
907 rmnet0.setInterfaceName("rmnet0");
908 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
909 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
910 rmnet0.getInterfaceName());
911
912 // Since no routes is added explicitly, getAllRoutes() should return empty.
913 assertTrue(rmnet0.getAllRoutes().isEmpty());
914 rmnet0.ensureDirectlyConnectedRoutes();
915 // ensureDirectlyConnectedRoutes() should have added the missing local route.
916 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
917
918 // IPv4 case: both direct and default routes added initially
919 LinkProperties rmnet1 = new LinkProperties();
920 rmnet1.setInterfaceName("rmnet1");
921 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900922 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800923 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100924 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
925 rmnet1.getInterfaceName());
926 rmnet1.addRoute(defaultRoute1);
927 rmnet1.addRoute(directRoute1);
928
929 // Check added routes
930 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
931 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
932 // route is already part of the configuration.
933 rmnet1.ensureDirectlyConnectedRoutes();
934 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
935
936 // IPv6 case: only default routes added initially
937 LinkProperties rmnet2 = new LinkProperties();
938 rmnet2.setInterfaceName("rmnet2");
939 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
940 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900941 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800942 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100943 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
944 rmnet2.getInterfaceName());
945 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
946 rmnet2.getInterfaceName());
947 rmnet2.addRoute(defaultRoute2);
948
949 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
950 rmnet2.ensureDirectlyConnectedRoutes();
951 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
952 rmnet2.getAllRoutes());
953
954 // Corner case: no interface name
955 LinkProperties rmnet3 = new LinkProperties();
956 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
957 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
958 rmnet3.getInterfaceName());
959
960 assertTrue(rmnet3.getAllRoutes().isEmpty());
961 rmnet3.ensureDirectlyConnectedRoutes();
962 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100963 }
964
Rubin Xuffd77d82017-09-05 18:40:49 +0100965 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
966 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
967 Set<RouteInfo> actualSet = new ArraySet<>(actual);
968 // Duplicated entries in actual routes are considered failures
969 assertEquals(actual.size(), actualSet.size());
970
971 assertEquals(expectedSet, actualSet);
972 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100973
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900974 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900975 LinkProperties source = new LinkProperties();
976 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900977
Chalard Jean299d8562018-04-11 16:36:41 +0900978 source.addLinkAddress(LINKADDRV4);
979 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900980
Chalard Jean299d8562018-04-11 16:36:41 +0900981 source.addDnsServer(DNS1);
982 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900983 source.addDnsServer(GATEWAY62);
984
985 source.addPcscfServer(TESTIPV4ADDR);
986 source.addPcscfServer(TESTIPV6ADDR);
987
988 source.setUsePrivateDns(true);
989 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
990
991 source.setDomains(DOMAINS);
992
Chalard Jean299d8562018-04-11 16:36:41 +0900993 source.addRoute(new RouteInfo(GATEWAY1));
994 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900995
Chalard Jean299d8562018-04-11 16:36:41 +0900996 source.addValidatedPrivateDnsServer(DNS6);
997 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900998 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
999
1000 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +09001001
1002 source.setMtu(MTU);
1003
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001004 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
1005
Lorenzo Colitti981b34f2019-01-08 09:58:59 +09001006 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
1007
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001008 final LinkProperties stacked = new LinkProperties();
1009 stacked.setInterfaceName("test-stacked");
1010 source.addStackedLink(stacked);
1011
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001012 return source;
1013 }
1014
1015 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1016 public void testLinkPropertiesParcelable_Q() throws Exception {
1017 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001018 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001019 }
1020
1021 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1022 public void testLinkPropertiesParcelable() throws Exception {
1023 final LinkProperties source = makeLinkPropertiesForParceling();
1024
1025 source.setWakeOnLanSupported(true);
1026 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1027 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1028 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001029 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001030
1031 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1032 final LinkProperties sanitized = new LinkProperties(source);
1033 sanitized.setCaptivePortalApiUrl(null);
1034 sanitized.setCaptivePortalData(null);
1035 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001036 }
1037
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001038 // Parceling of the scope was broken until Q-QPR2
1039 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001040 public void testLinkLocalDnsServerParceling() throws Exception {
1041 final String strAddress = "fe80::1%lo";
1042 final LinkProperties lp = new LinkProperties();
1043 lp.addDnsServer(address(strAddress));
1044 final LinkProperties unparceled = parcelingRoundTrip(lp);
1045 // Inet6Address#equals does not test for the scope id
1046 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001047 }
Chalard Jean299d8562018-04-11 16:36:41 +09001048
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001049 @Test
1050 public void testParcelUninitialized() throws Exception {
1051 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001052 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001053 }
paulhu9f7636c2019-05-02 17:43:28 +08001054
1055 @Test
1056 public void testConstructor() {
1057 LinkProperties lp = new LinkProperties();
1058 checkEmpty(lp);
1059 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1060 assertLinkPropertiesEqual(lp, new LinkProperties());
1061
1062 lp = makeTestObject();
1063 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1064 }
1065
1066 @Test
1067 public void testDnsServers() {
1068 final LinkProperties lp = new LinkProperties();
1069 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1070 lp.setDnsServers(dnsServers);
1071 assertEquals(2, lp.getDnsServers().size());
1072 assertEquals(DNS1, lp.getDnsServers().get(0));
1073 assertEquals(DNS2, lp.getDnsServers().get(1));
1074
1075 lp.removeDnsServer(DNS1);
1076 assertEquals(1, lp.getDnsServers().size());
1077 assertEquals(DNS2, lp.getDnsServers().get(0));
1078
1079 lp.addDnsServer(DNS6);
1080 assertEquals(2, lp.getDnsServers().size());
1081 assertEquals(DNS2, lp.getDnsServers().get(0));
1082 assertEquals(DNS6, lp.getDnsServers().get(1));
1083 }
1084
1085 @Test
1086 public void testValidatedPrivateDnsServers() {
1087 final LinkProperties lp = new LinkProperties();
1088 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1089 lp.setValidatedPrivateDnsServers(privDnsServers);
1090 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1091 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1092 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1093
1094 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1095 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1096 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1097
1098 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1099 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1100 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1101 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1102 }
1103
1104 @Test
1105 public void testPcscfServers() {
1106 final LinkProperties lp = new LinkProperties();
1107 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1108 lp.setPcscfServers(pcscfServers);
1109 assertEquals(1, lp.getPcscfServers().size());
1110 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1111
1112 lp.removePcscfServer(PCSCFV4);
1113 assertEquals(0, lp.getPcscfServers().size());
1114
1115 lp.addPcscfServer(PCSCFV6);
1116 assertEquals(1, lp.getPcscfServers().size());
1117 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1118 }
1119
1120 @Test
1121 public void testTcpBufferSizes() {
1122 final LinkProperties lp = makeTestObject();
1123 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1124
1125 lp.setTcpBufferSizes(null);
1126 assertNull(lp.getTcpBufferSizes());
1127 }
1128
1129 @Test
1130 public void testHasIpv6DefaultRoute() {
1131 final LinkProperties lp = makeTestObject();
1132 assertFalse(lp.hasIPv6DefaultRoute());
1133
1134 lp.addRoute(new RouteInfo(GATEWAY61));
1135 assertTrue(lp.hasIPv6DefaultRoute());
1136 }
1137
1138 @Test
1139 public void testHttpProxy() {
1140 final LinkProperties lp = makeTestObject();
1141 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1142 }
1143
1144 @Test
1145 public void testPrivateDnsServerName() {
1146 final LinkProperties lp = makeTestObject();
1147 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1148
1149 lp.setPrivateDnsServerName(null);
1150 assertNull(lp.getPrivateDnsServerName());
1151 }
1152
1153 @Test
1154 public void testUsePrivateDns() {
1155 final LinkProperties lp = makeTestObject();
1156 assertTrue(lp.isPrivateDnsActive());
1157
1158 lp.clear();
1159 assertFalse(lp.isPrivateDnsActive());
1160 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001161
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001162 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001163 public void testDhcpServerAddress() {
1164 final LinkProperties lp = makeTestObject();
1165 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1166
1167 lp.clear();
1168 assertNull(lp.getDhcpServerAddress());
1169 }
1170
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001171 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001172 public void testWakeOnLanSupported() {
1173 final LinkProperties lp = makeTestObject();
1174 assertTrue(lp.isWakeOnLanSupported());
1175
1176 lp.clear();
1177 assertFalse(lp.isWakeOnLanSupported());
1178 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001179
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001180 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001181 public void testCaptivePortalApiUrl() {
1182 final LinkProperties lp = makeTestObject();
1183 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1184
1185 lp.clear();
1186 assertNull(lp.getCaptivePortalApiUrl());
1187 }
1188
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001189 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001190 public void testCaptivePortalData() {
1191 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001192 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001193
1194 lp.clear();
1195 assertNull(lp.getCaptivePortalData());
1196 }
lucaslin55c6a842020-03-26 19:15:11 +08001197
1198 private LinkProperties makeIpv4LinkProperties() {
1199 final LinkProperties linkProperties = new LinkProperties();
1200 linkProperties.setInterfaceName(NAME);
1201 linkProperties.addLinkAddress(LINKADDRV4);
1202 linkProperties.addDnsServer(DNS1);
1203 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1204 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1205 return linkProperties;
1206 }
1207
1208 private LinkProperties makeIpv6LinkProperties() {
1209 final LinkProperties linkProperties = new LinkProperties();
1210 linkProperties.setInterfaceName(NAME);
1211 linkProperties.addLinkAddress(LINKADDRV6);
1212 linkProperties.addDnsServer(DNS6);
1213 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1214 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1215 return linkProperties;
1216 }
1217
1218 @Test
1219 public void testHasIpv4DefaultRoute() {
1220 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1221 assertTrue(Ipv4.hasIpv4DefaultRoute());
1222 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1223 assertFalse(Ipv6.hasIpv4DefaultRoute());
1224 }
1225
1226 @Test
1227 public void testHasIpv4DnsServer() {
1228 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1229 assertTrue(Ipv4.hasIpv4DnsServer());
1230 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1231 assertFalse(Ipv6.hasIpv4DnsServer());
1232 }
1233
1234 @Test
1235 public void testHasIpv6DnsServer() {
1236 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1237 assertFalse(Ipv4.hasIpv6DnsServer());
1238 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1239 assertTrue(Ipv6.hasIpv6DnsServer());
1240 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001241
1242 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1243 public void testHasIpv4UnreachableDefaultRoute() {
1244 final LinkProperties lp = makeTestObject();
1245 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1246 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1247
1248 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1249 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1250 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1251 }
1252
1253 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1254 public void testHasIpv6UnreachableDefaultRoute() {
1255 final LinkProperties lp = makeTestObject();
1256 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1257 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1258
1259 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1260 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1261 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1262 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001263
1264 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001265 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001266 public void testRouteAddWithSameKey() throws Exception {
1267 LinkProperties lp = new LinkProperties();
1268 lp.setInterfaceName("wlan0");
1269 final IpPrefix v6 = new IpPrefix("64:ff9b::/96");
1270 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1280));
1271 assertEquals(1, lp.getRoutes().size());
1272 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1500));
1273 assertEquals(1, lp.getRoutes().size());
1274 final IpPrefix v4 = new IpPrefix("192.0.2.128/25");
1275 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_UNICAST, 1460));
1276 assertEquals(2, lp.getRoutes().size());
1277 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_THROW, 1460));
1278 assertEquals(2, lp.getRoutes().size());
1279 }
Taras Antoshchuk30d41e52021-08-02 18:06:35 +02001280
1281 @Test @IgnoreUpTo(SC_V2)
1282 @EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1283 public void testExcludedRoutesEnabled() {
1284 final LinkProperties lp = new LinkProperties();
1285 assertEquals(0, lp.getRoutes().size());
1286
1287 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
1288 assertEquals(1, lp.getRoutes().size());
1289
1290 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_THROW));
1291 assertEquals(2, lp.getRoutes().size());
1292
1293 lp.addRoute(new RouteInfo(GATEWAY1));
1294 assertEquals(3, lp.getRoutes().size());
1295 }
1296
1297 @Test @IgnoreUpTo(SC_V2)
1298 @DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
1299 public void testExcludedRoutesDisabled() {
1300 final LinkProperties lp = new LinkProperties();
1301 assertEquals(0, lp.getRoutes().size());
1302
1303 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
1304 assertEquals(0, lp.getRoutes().size());
1305
1306 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW));
1307 assertEquals(0, lp.getRoutes().size());
1308
1309 lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST));
1310 assertEquals(1, lp.getRoutes().size());
1311 }
John Wang3e567d52011-04-04 12:35:42 -07001312}