blob: 4d85a57e572b1f92a637300dc050f0648834fdff [file] [log] [blame]
John Wang3e567d52011-04-04 12:35:42 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net;
18
Rubin Xubc4c5ca2020-06-11 16:40:13 +010019import static android.net.RouteInfo.RTN_THROW;
20import static android.net.RouteInfo.RTN_UNICAST;
Rubin Xuab8cf302020-03-30 14:37:05 +010021import static android.net.RouteInfo.RTN_UNREACHABLE;
22
Chalard Jean39175f22020-06-26 00:41:26 +090023import static com.android.testutils.ParcelUtils.assertParcelingIsLossless;
24import static com.android.testutils.ParcelUtils.parcelingRoundTrip;
Chalard Jeanaf718362019-05-30 17:11:14 +090025
Hugo Benichi87d306b2017-10-12 09:54:49 +090026import static org.junit.Assert.assertEquals;
27import static org.junit.Assert.assertFalse;
paulhu9f7636c2019-05-02 17:43:28 +080028import static org.junit.Assert.assertNotEquals;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090029import static org.junit.Assert.assertNull;
Hugo Benichi87d306b2017-10-12 09:54:49 +090030import static org.junit.Assert.assertTrue;
31import static org.junit.Assert.fail;
32
Erik Kline04612b02015-05-21 16:15:02 +090033import android.net.LinkProperties.ProvisioningChange;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090034import android.os.Build;
Elliott Hughes8732b352014-04-28 11:11:32 -070035import android.system.OsConstants;
Rubin Xuffd77d82017-09-05 18:40:49 +010036import android.util.ArraySet;
37
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090038import androidx.core.os.BuildCompat;
Brett Chabot147f6cf2019-03-04 14:14:56 -080039import androidx.test.filters.SmallTest;
40import androidx.test.runner.AndroidJUnit4;
41
Chalard Jean4d6c93d2020-10-05 14:22:01 +090042import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090043import com.android.testutils.ConnectivityModuleTest;
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090044import com.android.testutils.DevSdkIgnoreRule;
45import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
46import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
47
48import org.junit.Rule;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090049import org.junit.Test;
50import org.junit.runner.RunWith;
51
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090052import java.net.Inet4Address;
Rubin Xuab8cf302020-03-30 14:37:05 +010053import java.net.Inet6Address;
John Wang3e567d52011-04-04 12:35:42 -070054import java.net.InetAddress;
Rubin Xuffd77d82017-09-05 18:40:49 +010055import java.util.Arrays;
56import java.util.Collection;
57import java.util.Collections;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010058import java.util.List;
Rubin Xuffd77d82017-09-05 18:40:49 +010059import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070060
Hugo Benichi87d306b2017-10-12 09:54:49 +090061@RunWith(AndroidJUnit4.class)
62@SmallTest
Remi NGUYEN VANe3473012022-01-18 16:47:04 +090063@ConnectivityModuleTest
Hugo Benichi87d306b2017-10-12 09:54:49 +090064public class LinkPropertiesTest {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090065 @Rule
66 public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
67
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +090068 private static final InetAddress ADDRV4 = address("75.208.6.1");
69 private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
70 private static final InetAddress DNS1 = address("75.208.7.1");
71 private static final InetAddress DNS2 = address("69.78.7.1");
72 private static final InetAddress DNS6 = address("2001:4860:4860::8888");
73 private static final InetAddress PRIVDNS1 = address("1.1.1.1");
74 private static final InetAddress PRIVDNS2 = address("1.0.0.1");
75 private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111");
76 private static final InetAddress PCSCFV4 = address("10.77.25.37");
77 private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1");
78 private static final InetAddress GATEWAY1 = address("75.208.8.1");
79 private static final InetAddress GATEWAY2 = address("69.78.8.1");
80 private static final InetAddress GATEWAY61 = address("fe80::6:0000:613");
81 private static final InetAddress GATEWAY62 = address("fe80::6:22%lo");
82 private static final InetAddress TESTIPV4ADDR = address("192.168.47.42");
83 private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43");
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090084 private static final Inet4Address DHCPSERVER = (Inet4Address) address("192.0.2.1");
paulhu9f7636c2019-05-02 17:43:28 +080085 private static final String NAME = "qmi0";
86 private static final String DOMAINS = "google.com";
87 private static final String PRIV_DNS_SERVER_NAME = "private.dns.com";
88 private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576";
89 private static final int MTU = 1500;
90 private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
91 private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
92 private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +090093 private static final Uri CAPPORT_API_URL = Uri.parse("https://test.example.com/capportapi");
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090094
95 // CaptivePortalData cannot be in a constant as it does not exist on Q.
96 // The test runner also crashes when scanning for tests if it is a return type.
97 private static Object getCaptivePortalData() {
98 return new CaptivePortalData.Builder()
99 .setVenueInfoUrl(Uri.parse("https://test.example.com/venue")).build();
100 }
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900101
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900102 private static InetAddress address(String addrString) {
paulhu9f7636c2019-05-02 17:43:28 +0800103 return InetAddresses.parseNumericAddress(addrString);
104 }
105
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900106 private static boolean isAtLeastR() {
107 // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
108 return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
109 }
110
paulhu9f7636c2019-05-02 17:43:28 +0800111 private void checkEmpty(final LinkProperties lp) {
112 assertEquals(0, lp.getAllInterfaceNames().size());
113 assertEquals(0, lp.getAllAddresses().size());
114 assertEquals(0, lp.getDnsServers().size());
115 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
116 assertEquals(0, lp.getPcscfServers().size());
117 assertEquals(0, lp.getAllRoutes().size());
118 assertEquals(0, lp.getAllLinkAddresses().size());
119 assertEquals(0, lp.getStackedLinks().size());
120 assertEquals(0, lp.getMtu());
121 assertNull(lp.getPrivateDnsServerName());
122 assertNull(lp.getDomains());
123 assertNull(lp.getHttpProxy());
124 assertNull(lp.getTcpBufferSizes());
125 assertNull(lp.getNat64Prefix());
126 assertFalse(lp.isProvisioned());
127 assertFalse(lp.isIpv4Provisioned());
128 assertFalse(lp.isIpv6Provisioned());
129 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900130
131 if (isAtLeastR()) {
132 assertNull(lp.getDhcpServerAddress());
133 assertFalse(lp.isWakeOnLanSupported());
134 assertNull(lp.getCaptivePortalApiUrl());
135 assertNull(lp.getCaptivePortalData());
136 }
paulhu9f7636c2019-05-02 17:43:28 +0800137 }
138
139 private LinkProperties makeTestObject() {
140 final LinkProperties lp = new LinkProperties();
141 lp.setInterfaceName(NAME);
142 lp.addLinkAddress(LINKADDRV4);
143 lp.addLinkAddress(LINKADDRV6);
144 lp.addDnsServer(DNS1);
145 lp.addDnsServer(DNS2);
146 lp.addValidatedPrivateDnsServer(PRIVDNS1);
147 lp.addValidatedPrivateDnsServer(PRIVDNS2);
148 lp.setUsePrivateDns(true);
149 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
150 lp.addPcscfServer(PCSCFV6);
151 lp.setDomains(DOMAINS);
152 lp.addRoute(new RouteInfo(GATEWAY1));
153 lp.addRoute(new RouteInfo(GATEWAY2));
154 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
155 lp.setMtu(MTU);
156 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
157 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900158 if (isAtLeastR()) {
159 lp.setDhcpServerAddress(DHCPSERVER);
160 lp.setWakeOnLanSupported(true);
161 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
162 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
163 }
paulhu9f7636c2019-05-02 17:43:28 +0800164 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900165 }
166
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900167 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
168 // Check implementation of equals(), element by element.
169 assertTrue(source.isIdenticalInterfaceName(target));
170 assertTrue(target.isIdenticalInterfaceName(source));
171
172 assertTrue(source.isIdenticalAddresses(target));
173 assertTrue(target.isIdenticalAddresses(source));
174
175 assertTrue(source.isIdenticalDnses(target));
176 assertTrue(target.isIdenticalDnses(source));
177
dalyk7643abc2018-01-17 14:20:55 -0500178 assertTrue(source.isIdenticalPrivateDns(target));
179 assertTrue(target.isIdenticalPrivateDns(source));
180
Chalard Jean299d8562018-04-11 16:36:41 +0900181 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
182 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
183
Hongshike2d7cf52018-06-28 20:42:19 +0900184 assertTrue(source.isIdenticalPcscfs(target));
185 assertTrue(target.isIdenticalPcscfs(source));
186
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900187 assertTrue(source.isIdenticalRoutes(target));
188 assertTrue(target.isIdenticalRoutes(source));
189
190 assertTrue(source.isIdenticalHttpProxy(target));
191 assertTrue(target.isIdenticalHttpProxy(source));
192
193 assertTrue(source.isIdenticalStackedLinks(target));
194 assertTrue(target.isIdenticalStackedLinks(source));
195
sy.yun4aa73922013-09-02 05:24:09 +0900196 assertTrue(source.isIdenticalMtu(target));
197 assertTrue(target.isIdenticalMtu(source));
198
dalyk7643abc2018-01-17 14:20:55 -0500199 assertTrue(source.isIdenticalTcpBufferSizes(target));
200 assertTrue(target.isIdenticalTcpBufferSizes(source));
201
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900202 if (isAtLeastR()) {
203 assertTrue(source.isIdenticalDhcpServerAddress(target));
204 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200205
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900206 assertTrue(source.isIdenticalWakeOnLan(target));
207 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900208
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900209 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
210 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
211
212 assertTrue(source.isIdenticalCaptivePortalData(target));
213 assertTrue(target.isIdenticalCaptivePortalData(source));
214 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900215
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900216 // Check result of equals().
217 assertTrue(source.equals(target));
218 assertTrue(target.equals(source));
219
220 // Check hashCode.
221 assertEquals(source.hashCode(), target.hashCode());
222 }
223
Hugo Benichi87d306b2017-10-12 09:54:49 +0900224 @Test
John Wang3e567d52011-04-04 12:35:42 -0700225 public void testEqualsNull() {
226 LinkProperties source = new LinkProperties();
227 LinkProperties target = new LinkProperties();
228
229 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900230 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700231 }
232
Hugo Benichi87d306b2017-10-12 09:54:49 +0900233 @Test
234 public void testEqualsSameOrder() throws Exception {
235 LinkProperties source = new LinkProperties();
236 source.setInterfaceName(NAME);
237 // set 2 link addresses
238 source.addLinkAddress(LINKADDRV4);
239 source.addLinkAddress(LINKADDRV6);
240 // set 2 dnses
241 source.addDnsServer(DNS1);
242 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900243 // set 1 pcscf
244 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900245 // set 2 gateways
246 source.addRoute(new RouteInfo(GATEWAY1));
247 source.addRoute(new RouteInfo(GATEWAY2));
248 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700249
Hugo Benichi87d306b2017-10-12 09:54:49 +0900250 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700251
Hugo Benichi87d306b2017-10-12 09:54:49 +0900252 // All fields are same
253 target.setInterfaceName(NAME);
254 target.addLinkAddress(LINKADDRV4);
255 target.addLinkAddress(LINKADDRV6);
256 target.addDnsServer(DNS1);
257 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900258 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900259 target.addRoute(new RouteInfo(GATEWAY1));
260 target.addRoute(new RouteInfo(GATEWAY2));
261 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700262
Hugo Benichi87d306b2017-10-12 09:54:49 +0900263 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700264
Hugo Benichi87d306b2017-10-12 09:54:49 +0900265 target.clear();
266 // change Interface Name
267 target.setInterfaceName("qmi1");
268 target.addLinkAddress(LINKADDRV4);
269 target.addLinkAddress(LINKADDRV6);
270 target.addDnsServer(DNS1);
271 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900272 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900273 target.addRoute(new RouteInfo(GATEWAY1));
274 target.addRoute(new RouteInfo(GATEWAY2));
275 target.setMtu(MTU);
276 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700277
Hugo Benichi87d306b2017-10-12 09:54:49 +0900278 target.clear();
279 target.setInterfaceName(NAME);
280 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900281 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900282 target.addLinkAddress(LINKADDRV6);
283 target.addDnsServer(DNS1);
284 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900285 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900286 target.addRoute(new RouteInfo(GATEWAY1));
287 target.addRoute(new RouteInfo(GATEWAY2));
288 target.setMtu(MTU);
289 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700290
Hugo Benichi87d306b2017-10-12 09:54:49 +0900291 target.clear();
292 target.setInterfaceName(NAME);
293 target.addLinkAddress(LINKADDRV4);
294 target.addLinkAddress(LINKADDRV6);
295 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900296 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900297 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900298 target.addPcscfServer(PCSCFV6);
299 target.addRoute(new RouteInfo(GATEWAY1));
300 target.addRoute(new RouteInfo(GATEWAY2));
301 target.setMtu(MTU);
302 assertFalse(source.equals(target));
303
304 target.clear();
305 target.setInterfaceName(NAME);
306 target.addLinkAddress(LINKADDRV4);
307 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900308 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900309 target.addDnsServer(DNS2);
310 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900311 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900312 target.addRoute(new RouteInfo(GATEWAY1));
313 target.addRoute(new RouteInfo(GATEWAY2));
314 target.setMtu(MTU);
315 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700316
Hugo Benichi87d306b2017-10-12 09:54:49 +0900317 target.clear();
318 target.setInterfaceName(NAME);
319 target.addLinkAddress(LINKADDRV4);
320 target.addLinkAddress(LINKADDRV6);
321 target.addDnsServer(DNS1);
322 target.addDnsServer(DNS2);
323 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900324 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900325 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900326 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900327 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900328
Hugo Benichi87d306b2017-10-12 09:54:49 +0900329 target.clear();
330 target.setInterfaceName(NAME);
331 target.addLinkAddress(LINKADDRV4);
332 target.addLinkAddress(LINKADDRV6);
333 target.addDnsServer(DNS1);
334 target.addDnsServer(DNS2);
335 target.addRoute(new RouteInfo(GATEWAY1));
336 target.addRoute(new RouteInfo(GATEWAY2));
337 // change mtu
338 target.setMtu(1440);
339 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700340 }
341
Hugo Benichi87d306b2017-10-12 09:54:49 +0900342 @Test
343 public void testEqualsDifferentOrder() throws Exception {
344 LinkProperties source = new LinkProperties();
345 source.setInterfaceName(NAME);
346 // set 2 link addresses
347 source.addLinkAddress(LINKADDRV4);
348 source.addLinkAddress(LINKADDRV6);
349 // set 2 dnses
350 source.addDnsServer(DNS1);
351 source.addDnsServer(DNS2);
352 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800353 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900354 source.addRoute(new RouteInfo(GATEWAY2));
355 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700356
Hugo Benichi87d306b2017-10-12 09:54:49 +0900357 LinkProperties target = new LinkProperties();
358 // Exchange order
359 target.setInterfaceName(NAME);
360 target.addLinkAddress(LINKADDRV6);
361 target.addLinkAddress(LINKADDRV4);
362 target.addDnsServer(DNS2);
363 target.addDnsServer(DNS1);
364 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800365 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900366 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700367
Hugo Benichi87d306b2017-10-12 09:54:49 +0900368 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700369 }
370
Hugo Benichi87d306b2017-10-12 09:54:49 +0900371 @Test
372 public void testEqualsDuplicated() throws Exception {
373 LinkProperties source = new LinkProperties();
374 // set 3 link addresses, eg, [A, A, B]
375 source.addLinkAddress(LINKADDRV4);
376 source.addLinkAddress(LINKADDRV4);
377 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700378
Hugo Benichi87d306b2017-10-12 09:54:49 +0900379 LinkProperties target = new LinkProperties();
380 // set 3 link addresses, eg, [A, B, B]
381 target.addLinkAddress(LINKADDRV4);
382 target.addLinkAddress(LINKADDRV6);
383 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700384
Hugo Benichi87d306b2017-10-12 09:54:49 +0900385 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700386 }
387
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800388 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
389 for (RouteInfo r : lp.getRoutes()) {
390 assertEquals(iface, r.getInterface());
391 }
392 }
393
paulhu9f7636c2019-05-02 17:43:28 +0800394 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
395 for (RouteInfo r : lp.getRoutes()) {
396 assertNotEquals(iface, r.getInterface());
397 }
398 }
399
Hugo Benichi87d306b2017-10-12 09:54:49 +0900400 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800401 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800402 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
403 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900404 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800405
406 // Add a route with no interface to a LinkProperties with no interface. No errors.
407 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800408 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900409 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800410 assertEquals(1, lp.getRoutes().size());
411 assertAllRoutesHaveInterface(null, lp);
412
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900413 // Adding the same route twice has no effect.
414 assertFalse(lp.addRoute(r));
415 assertEquals(1, lp.getRoutes().size());
416
417 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800418 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800419 try {
420 lp.addRoute(r);
421 fail("Adding wlan0 route to LP with no interface, expect exception");
422 } catch (IllegalArgumentException expected) {}
423
424 // Change the interface name. All the routes should change their interface name too.
425 lp.setInterfaceName("rmnet0");
426 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800427 assertAllRoutesNotHaveInterface(null, lp);
428 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800429
430 // Now add a route with the wrong interface. This causes an exception too.
431 try {
432 lp.addRoute(r);
433 fail("Adding wlan0 route to rmnet0 LP, expect exception");
434 } catch (IllegalArgumentException expected) {}
435
436 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800437 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800438 lp.setInterfaceName("wlan0");
439 lp.addRoute(r);
440 assertEquals(2, lp.getRoutes().size());
441 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800442 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800443
444 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900445 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800446 lp.addRoute(r);
447 assertEquals(3, lp.getRoutes().size());
448 assertAllRoutesHaveInterface("wlan0", lp);
449
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900450 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800451 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800452 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900453 final CompareResult<RouteInfo> cr1 =
454 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
455 assertEquals(0, cr1.added.size());
456 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800457
458 lp2.setInterfaceName("p2p0");
459 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800460 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900461 final CompareResult<RouteInfo> cr2 =
462 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
463 assertEquals(3, cr2.added.size());
464 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800465
Tyler Wear44999a72020-02-13 17:14:38 -0800466 // Remove route with incorrect interface, no route removed.
467 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800468 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800469
470 // Check remove works when interface is correct.
471 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800472 assertEquals(2, lp.getRoutes().size());
473 assertAllRoutesHaveInterface("wlan0", lp);
474 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900475 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800476
Hugo Benichi87d306b2017-10-12 09:54:49 +0900477 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800478 public void testStackedInterfaces() {
479 LinkProperties rmnet0 = new LinkProperties();
480 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900481 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800482
483 LinkProperties clat4 = new LinkProperties();
484 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900485 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800486
487 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900488 assertEquals(1, rmnet0.getAddresses().size());
489 assertEquals(1, rmnet0.getLinkAddresses().size());
490 assertEquals(1, rmnet0.getAllAddresses().size());
491 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800492 assertEquals(1, rmnet0.getAllInterfaceNames().size());
493 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900494
Lorenzo Colittic0803122013-03-07 10:59:25 -0800495 rmnet0.addStackedLink(clat4);
496 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900497 assertEquals(1, rmnet0.getAddresses().size());
498 assertEquals(1, rmnet0.getLinkAddresses().size());
499 assertEquals(2, rmnet0.getAllAddresses().size());
500 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800501 assertEquals(2, rmnet0.getAllInterfaceNames().size());
502 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
503 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900504
Lorenzo Colittic0803122013-03-07 10:59:25 -0800505 rmnet0.addStackedLink(clat4);
506 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900507 assertEquals(1, rmnet0.getAddresses().size());
508 assertEquals(1, rmnet0.getLinkAddresses().size());
509 assertEquals(2, rmnet0.getAllAddresses().size());
510 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800511 assertEquals(2, rmnet0.getAllInterfaceNames().size());
512 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
513 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900514
Lorenzo Colittic0803122013-03-07 10:59:25 -0800515 assertEquals(0, clat4.getStackedLinks().size());
516
517 // Modify an item in the returned collection to see what happens.
518 for (LinkProperties link : rmnet0.getStackedLinks()) {
519 if (link.getInterfaceName().equals("clat4")) {
520 link.setInterfaceName("newname");
521 }
522 }
523 for (LinkProperties link : rmnet0.getStackedLinks()) {
524 assertFalse("newname".equals(link.getInterfaceName()));
525 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900526
Lorenzo Colitti38258432014-10-20 11:08:03 +0900527 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900528 assertEquals(0, rmnet0.getStackedLinks().size());
529 assertEquals(1, rmnet0.getAddresses().size());
530 assertEquals(1, rmnet0.getLinkAddresses().size());
531 assertEquals(1, rmnet0.getAllAddresses().size());
532 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800533 assertEquals(1, rmnet0.getAllInterfaceNames().size());
534 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900535
Lorenzo Colitti38258432014-10-20 11:08:03 +0900536 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900537 }
538
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900539 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
540 return lp.getLinkAddresses().iterator().next();
541 }
542
Hugo Benichi87d306b2017-10-12 09:54:49 +0900543 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900544 public void testAddressMethods() {
545 LinkProperties lp = new LinkProperties();
546
547 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800548 assertFalse(lp.hasIpv4Address());
549 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900550
551 // Addresses on stacked links don't count.
552 LinkProperties stacked = new LinkProperties();
553 stacked.setInterfaceName("stacked");
554 lp.addStackedLink(stacked);
555 stacked.addLinkAddress(LINKADDRV4);
556 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800557 assertTrue(stacked.hasIpv4Address());
558 assertTrue(stacked.hasGlobalIpv6Address());
559 assertFalse(lp.hasIpv4Address());
560 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900561 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800562 assertFalse(lp.hasIpv4Address());
563 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900564
565 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800566 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900567 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900568 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900569 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900570 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800571 assertFalse(lp.hasIpv4Address());
572 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900573
574 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900575 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900576
Lorenzo Colittifc854692014-06-23 22:33:43 +0900577 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
578 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800579 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900580
581 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900582 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800583 assertTrue(lp.hasIpv4Address());
584 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900585
586 assertTrue(lp.addLinkAddress(LINKADDRV6));
587 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800588 assertTrue(lp.hasIpv4Address());
589 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900590
591 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
592 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800593 assertTrue(lp.hasIpv4Address());
594 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900595
596 // Adding an address twice has no effect.
597 // Removing an address that's not present has no effect.
598 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900599 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800600 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900601 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900602 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800603 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900604 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900605 assertEquals(1, lp.getLinkAddresses().size());
606
607 // Adding an address that's already present but with different properties causes the
608 // existing address to be updated and returns true.
609 // Start with only LINKADDRV6.
610 assertEquals(1, lp.getLinkAddresses().size());
611 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
612
613 // Create a LinkAddress object for the same address, but with different flags.
614 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
615 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
616 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
617 assertFalse(deprecated.equals(LINKADDRV6));
618
619 // Check that adding it updates the existing address instead of adding a new one.
620 assertTrue(lp.addLinkAddress(deprecated));
621 assertEquals(1, lp.getLinkAddresses().size());
622 assertEquals(deprecated, getFirstLinkAddress(lp));
623 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
624
625 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
626 assertTrue(lp.removeLinkAddress(LINKADDRV6));
627 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800628 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900629
Hugo Benichi87d306b2017-10-12 09:54:49 +0900630 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800631 public void testLinkAddresses() {
632 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900633 lp.addLinkAddress(LINKADDRV4);
634 lp.addLinkAddress(LINKADDRV6);
635
paulhu9f7636c2019-05-02 17:43:28 +0800636 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900637 lp2.addLinkAddress(LINKADDRV6);
638
paulhu9f7636c2019-05-02 17:43:28 +0800639 final LinkProperties lp3 = new LinkProperties();
640 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
641 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900642
paulhu9f7636c2019-05-02 17:43:28 +0800643 assertFalse(lp.equals(lp2));
644 assertFalse(lp2.equals(lp3));
645
646 lp.removeLinkAddress(LINKADDRV4);
647 assertTrue(lp.equals(lp2));
648
649 lp2.setLinkAddresses(lp3.getLinkAddresses());
650 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900651 }
Erik Kline8b023072014-10-24 21:50:20 +0900652
Hugo Benichi87d306b2017-10-12 09:54:49 +0900653 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900654 public void testNat64Prefix() throws Exception {
655 LinkProperties lp = new LinkProperties();
656 lp.addLinkAddress(LINKADDRV4);
657 lp.addLinkAddress(LINKADDRV6);
658
659 assertNull(lp.getNat64Prefix());
660
661 IpPrefix p = new IpPrefix("64:ff9b::/96");
662 lp.setNat64Prefix(p);
663 assertEquals(p, lp.getNat64Prefix());
664
665 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
666 lp.setNat64Prefix(p);
667 assertEquals(p, lp.getNat64Prefix());
668
669 p = new IpPrefix("2001:db8:a:b:1:2::/80");
670 try {
671 lp.setNat64Prefix(p);
672 } catch (IllegalArgumentException expected) {
673 }
674
675 p = new IpPrefix("64:ff9b::/64");
676 try {
677 lp.setNat64Prefix(p);
678 } catch (IllegalArgumentException expected) {
679 }
680
681 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
682
683 lp.setNat64Prefix(null);
684 assertNull(lp.getNat64Prefix());
685 }
686
687 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900688 public void testIsProvisioned() {
689 LinkProperties lp4 = new LinkProperties();
690 assertFalse("v4only:empty", lp4.isProvisioned());
691 lp4.addLinkAddress(LINKADDRV4);
692 assertFalse("v4only:addr-only", lp4.isProvisioned());
693 lp4.addDnsServer(DNS1);
694 assertFalse("v4only:addr+dns", lp4.isProvisioned());
695 lp4.addRoute(new RouteInfo(GATEWAY1));
696 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800697 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
698 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900699
700 LinkProperties lp6 = new LinkProperties();
701 assertFalse("v6only:empty", lp6.isProvisioned());
702 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
703 assertFalse("v6only:fe80-only", lp6.isProvisioned());
704 lp6.addDnsServer(DNS6);
705 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900706 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900707 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
708 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800709 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900710 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
711 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800712 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
713 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900714 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
715
716 LinkProperties lp46 = new LinkProperties();
717 lp46.addLinkAddress(LINKADDRV4);
718 lp46.addLinkAddress(LINKADDRV6);
719 lp46.addDnsServer(DNS1);
720 lp46.addDnsServer(DNS6);
721 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
722 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800723 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
724 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900725 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900726 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800727 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
728 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900729 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
730
731 // A link with an IPv6 address and default route, but IPv4 DNS server.
732 LinkProperties mixed = new LinkProperties();
733 mixed.addLinkAddress(LINKADDRV6);
734 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900735 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800736 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
737 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900738 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
739 }
Erik Kline04612b02015-05-21 16:15:02 +0900740
Hugo Benichi87d306b2017-10-12 09:54:49 +0900741 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900742 public void testCompareProvisioning() {
743 LinkProperties v4lp = new LinkProperties();
744 v4lp.addLinkAddress(LINKADDRV4);
745 v4lp.addRoute(new RouteInfo(GATEWAY1));
746 v4lp.addDnsServer(DNS1);
747 assertTrue(v4lp.isProvisioned());
748
749 LinkProperties v4r = new LinkProperties(v4lp);
750 v4r.removeDnsServer(DNS1);
751 assertFalse(v4r.isProvisioned());
752
753 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
754 LinkProperties.compareProvisioning(v4r, v4r));
755 assertEquals(ProvisioningChange.LOST_PROVISIONING,
756 LinkProperties.compareProvisioning(v4lp, v4r));
757 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
758 LinkProperties.compareProvisioning(v4r, v4lp));
759 assertEquals(ProvisioningChange.STILL_PROVISIONED,
760 LinkProperties.compareProvisioning(v4lp, v4lp));
761
762 // Check that losing IPv4 provisioning on a dualstack network is
763 // seen as a total loss of provisioning.
764 LinkProperties v6lp = new LinkProperties();
765 v6lp.addLinkAddress(LINKADDRV6);
766 v6lp.addRoute(new RouteInfo(GATEWAY61));
767 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800768 assertFalse(v6lp.isIpv4Provisioned());
769 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900770 assertTrue(v6lp.isProvisioned());
771
772 LinkProperties v46lp = new LinkProperties(v6lp);
773 v46lp.addLinkAddress(LINKADDRV4);
774 v46lp.addRoute(new RouteInfo(GATEWAY1));
775 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800776 assertTrue(v46lp.isIpv4Provisioned());
777 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900778 assertTrue(v46lp.isProvisioned());
779
780 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900781 LinkProperties.compareProvisioning(v4lp, v46lp));
782 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900783 LinkProperties.compareProvisioning(v6lp, v46lp));
784 assertEquals(ProvisioningChange.LOST_PROVISIONING,
785 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900786 assertEquals(ProvisioningChange.LOST_PROVISIONING,
787 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900788
789 // Check that losing and gaining a secondary router does not change
790 // the provisioning status.
791 LinkProperties v6lp2 = new LinkProperties(v6lp);
792 v6lp2.addRoute(new RouteInfo(GATEWAY62));
793 assertTrue(v6lp2.isProvisioned());
794
795 assertEquals(ProvisioningChange.STILL_PROVISIONED,
796 LinkProperties.compareProvisioning(v6lp2, v6lp));
797 assertEquals(ProvisioningChange.STILL_PROVISIONED,
798 LinkProperties.compareProvisioning(v6lp, v6lp2));
799 }
Erik Klinea923dba2015-06-26 19:21:34 +0900800
Hugo Benichi87d306b2017-10-12 09:54:49 +0900801 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900802 public void testIsReachable() {
803 final LinkProperties v4lp = new LinkProperties();
804 assertFalse(v4lp.isReachable(DNS1));
805 assertFalse(v4lp.isReachable(DNS2));
806
807 // Add an on-link route, making the on-link DNS server reachable,
808 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900809 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900810 assertFalse(v4lp.isReachable(DNS1));
811 assertFalse(v4lp.isReachable(DNS2));
812
813 // Adding an IPv4 address (right now, any IPv4 address) means we use
814 // the routes to compute likely reachability.
815 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
816 assertTrue(v4lp.isReachable(DNS1));
817 assertFalse(v4lp.isReachable(DNS2));
818
819 // Adding a default route makes the off-link DNS server reachable.
820 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
821 assertTrue(v4lp.isReachable(DNS1));
822 assertTrue(v4lp.isReachable(DNS2));
823
824 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900825 final InetAddress kLinkLocalDns = address("fe80::6:1");
826 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
827 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900828 assertFalse(v6lp.isReachable(kLinkLocalDns));
829 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
830 assertFalse(v6lp.isReachable(kOnLinkDns));
831 assertFalse(v6lp.isReachable(DNS6));
832
833 // Add a link-local route, making the link-local DNS servers reachable. Because
834 // we assume the presence of an IPv6 link-local address, link-local DNS servers
835 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900836 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900837 assertFalse(v6lp.isReachable(kLinkLocalDns));
838 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
839 assertFalse(v6lp.isReachable(kOnLinkDns));
840 assertFalse(v6lp.isReachable(DNS6));
841
842 // Add a link-local address--nothing changes.
843 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
844 assertFalse(v6lp.isReachable(kLinkLocalDns));
845 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
846 assertFalse(v6lp.isReachable(kOnLinkDns));
847 assertFalse(v6lp.isReachable(DNS6));
848
849 // Add a global route on link, but no global address yet. DNS servers reachable
850 // via a route that doesn't require a gateway: give them the benefit of the
851 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900852 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900853 assertFalse(v6lp.isReachable(kLinkLocalDns));
854 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
855 assertTrue(v6lp.isReachable(kOnLinkDns));
856 assertFalse(v6lp.isReachable(DNS6));
857
858 // Add a global address; the on-link global address DNS server is (still)
859 // presumed reachable.
860 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
861 assertFalse(v6lp.isReachable(kLinkLocalDns));
862 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
863 assertTrue(v6lp.isReachable(kOnLinkDns));
864 assertFalse(v6lp.isReachable(DNS6));
865
866 // Adding a default route makes the off-link DNS server reachable.
867 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
868 assertFalse(v6lp.isReachable(kLinkLocalDns));
869 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
870 assertTrue(v6lp.isReachable(kOnLinkDns));
871 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900872
873 // Check isReachable on stacked links. This requires that the source IP address be assigned
874 // on the interface returned by the route lookup.
875 LinkProperties stacked = new LinkProperties();
876
877 // Can't add a stacked link without an interface name.
878 stacked.setInterfaceName("v4-test0");
879 v6lp.addStackedLink(stacked);
880
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900881 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900882 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
883 assertFalse(v6lp.isReachable(stackedAddress));
884 stacked.addLinkAddress(stackedLinkAddress);
885 assertFalse(v6lp.isReachable(stackedAddress));
886 stacked.addRoute(new RouteInfo(stackedLinkAddress));
887 assertTrue(stacked.isReachable(stackedAddress));
888 assertTrue(v6lp.isReachable(stackedAddress));
889
890 assertFalse(v6lp.isReachable(DNS1));
891 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
892 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900893 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100894
Hugo Benichi87d306b2017-10-12 09:54:49 +0900895 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100896 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
897 // IPv4 case: no route added initially
898 LinkProperties rmnet0 = new LinkProperties();
899 rmnet0.setInterfaceName("rmnet0");
900 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
901 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
902 rmnet0.getInterfaceName());
903
904 // Since no routes is added explicitly, getAllRoutes() should return empty.
905 assertTrue(rmnet0.getAllRoutes().isEmpty());
906 rmnet0.ensureDirectlyConnectedRoutes();
907 // ensureDirectlyConnectedRoutes() should have added the missing local route.
908 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
909
910 // IPv4 case: both direct and default routes added initially
911 LinkProperties rmnet1 = new LinkProperties();
912 rmnet1.setInterfaceName("rmnet1");
913 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900914 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800915 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100916 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
917 rmnet1.getInterfaceName());
918 rmnet1.addRoute(defaultRoute1);
919 rmnet1.addRoute(directRoute1);
920
921 // Check added routes
922 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
923 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
924 // route is already part of the configuration.
925 rmnet1.ensureDirectlyConnectedRoutes();
926 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
927
928 // IPv6 case: only default routes added initially
929 LinkProperties rmnet2 = new LinkProperties();
930 rmnet2.setInterfaceName("rmnet2");
931 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
932 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900933 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800934 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100935 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
936 rmnet2.getInterfaceName());
937 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
938 rmnet2.getInterfaceName());
939 rmnet2.addRoute(defaultRoute2);
940
941 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
942 rmnet2.ensureDirectlyConnectedRoutes();
943 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
944 rmnet2.getAllRoutes());
945
946 // Corner case: no interface name
947 LinkProperties rmnet3 = new LinkProperties();
948 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
949 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
950 rmnet3.getInterfaceName());
951
952 assertTrue(rmnet3.getAllRoutes().isEmpty());
953 rmnet3.ensureDirectlyConnectedRoutes();
954 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100955 }
956
Rubin Xuffd77d82017-09-05 18:40:49 +0100957 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
958 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
959 Set<RouteInfo> actualSet = new ArraySet<>(actual);
960 // Duplicated entries in actual routes are considered failures
961 assertEquals(actual.size(), actualSet.size());
962
963 assertEquals(expectedSet, actualSet);
964 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100965
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900966 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900967 LinkProperties source = new LinkProperties();
968 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900969
Chalard Jean299d8562018-04-11 16:36:41 +0900970 source.addLinkAddress(LINKADDRV4);
971 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900972
Chalard Jean299d8562018-04-11 16:36:41 +0900973 source.addDnsServer(DNS1);
974 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900975 source.addDnsServer(GATEWAY62);
976
977 source.addPcscfServer(TESTIPV4ADDR);
978 source.addPcscfServer(TESTIPV6ADDR);
979
980 source.setUsePrivateDns(true);
981 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
982
983 source.setDomains(DOMAINS);
984
Chalard Jean299d8562018-04-11 16:36:41 +0900985 source.addRoute(new RouteInfo(GATEWAY1));
986 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900987
Chalard Jean299d8562018-04-11 16:36:41 +0900988 source.addValidatedPrivateDnsServer(DNS6);
989 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900990 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
991
992 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +0900993
994 source.setMtu(MTU);
995
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900996 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
997
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900998 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
999
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001000 final LinkProperties stacked = new LinkProperties();
1001 stacked.setInterfaceName("test-stacked");
1002 source.addStackedLink(stacked);
1003
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001004 return source;
1005 }
1006
1007 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1008 public void testLinkPropertiesParcelable_Q() throws Exception {
1009 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001010 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001011 }
1012
1013 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1014 public void testLinkPropertiesParcelable() throws Exception {
1015 final LinkProperties source = makeLinkPropertiesForParceling();
1016
1017 source.setWakeOnLanSupported(true);
1018 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1019 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1020 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001021 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001022
1023 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1024 final LinkProperties sanitized = new LinkProperties(source);
1025 sanitized.setCaptivePortalApiUrl(null);
1026 sanitized.setCaptivePortalData(null);
1027 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001028 }
1029
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001030 // Parceling of the scope was broken until Q-QPR2
1031 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001032 public void testLinkLocalDnsServerParceling() throws Exception {
1033 final String strAddress = "fe80::1%lo";
1034 final LinkProperties lp = new LinkProperties();
1035 lp.addDnsServer(address(strAddress));
1036 final LinkProperties unparceled = parcelingRoundTrip(lp);
1037 // Inet6Address#equals does not test for the scope id
1038 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001039 }
Chalard Jean299d8562018-04-11 16:36:41 +09001040
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001041 @Test
1042 public void testParcelUninitialized() throws Exception {
1043 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001044 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001045 }
paulhu9f7636c2019-05-02 17:43:28 +08001046
1047 @Test
1048 public void testConstructor() {
1049 LinkProperties lp = new LinkProperties();
1050 checkEmpty(lp);
1051 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1052 assertLinkPropertiesEqual(lp, new LinkProperties());
1053
1054 lp = makeTestObject();
1055 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1056 }
1057
1058 @Test
1059 public void testDnsServers() {
1060 final LinkProperties lp = new LinkProperties();
1061 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1062 lp.setDnsServers(dnsServers);
1063 assertEquals(2, lp.getDnsServers().size());
1064 assertEquals(DNS1, lp.getDnsServers().get(0));
1065 assertEquals(DNS2, lp.getDnsServers().get(1));
1066
1067 lp.removeDnsServer(DNS1);
1068 assertEquals(1, lp.getDnsServers().size());
1069 assertEquals(DNS2, lp.getDnsServers().get(0));
1070
1071 lp.addDnsServer(DNS6);
1072 assertEquals(2, lp.getDnsServers().size());
1073 assertEquals(DNS2, lp.getDnsServers().get(0));
1074 assertEquals(DNS6, lp.getDnsServers().get(1));
1075 }
1076
1077 @Test
1078 public void testValidatedPrivateDnsServers() {
1079 final LinkProperties lp = new LinkProperties();
1080 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1081 lp.setValidatedPrivateDnsServers(privDnsServers);
1082 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1083 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1084 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1085
1086 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1087 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1088 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1089
1090 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1091 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1092 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1093 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1094 }
1095
1096 @Test
1097 public void testPcscfServers() {
1098 final LinkProperties lp = new LinkProperties();
1099 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1100 lp.setPcscfServers(pcscfServers);
1101 assertEquals(1, lp.getPcscfServers().size());
1102 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1103
1104 lp.removePcscfServer(PCSCFV4);
1105 assertEquals(0, lp.getPcscfServers().size());
1106
1107 lp.addPcscfServer(PCSCFV6);
1108 assertEquals(1, lp.getPcscfServers().size());
1109 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1110 }
1111
1112 @Test
1113 public void testTcpBufferSizes() {
1114 final LinkProperties lp = makeTestObject();
1115 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1116
1117 lp.setTcpBufferSizes(null);
1118 assertNull(lp.getTcpBufferSizes());
1119 }
1120
1121 @Test
1122 public void testHasIpv6DefaultRoute() {
1123 final LinkProperties lp = makeTestObject();
1124 assertFalse(lp.hasIPv6DefaultRoute());
1125
1126 lp.addRoute(new RouteInfo(GATEWAY61));
1127 assertTrue(lp.hasIPv6DefaultRoute());
1128 }
1129
1130 @Test
1131 public void testHttpProxy() {
1132 final LinkProperties lp = makeTestObject();
1133 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1134 }
1135
1136 @Test
1137 public void testPrivateDnsServerName() {
1138 final LinkProperties lp = makeTestObject();
1139 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1140
1141 lp.setPrivateDnsServerName(null);
1142 assertNull(lp.getPrivateDnsServerName());
1143 }
1144
1145 @Test
1146 public void testUsePrivateDns() {
1147 final LinkProperties lp = makeTestObject();
1148 assertTrue(lp.isPrivateDnsActive());
1149
1150 lp.clear();
1151 assertFalse(lp.isPrivateDnsActive());
1152 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001153
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001154 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001155 public void testDhcpServerAddress() {
1156 final LinkProperties lp = makeTestObject();
1157 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1158
1159 lp.clear();
1160 assertNull(lp.getDhcpServerAddress());
1161 }
1162
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001163 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001164 public void testWakeOnLanSupported() {
1165 final LinkProperties lp = makeTestObject();
1166 assertTrue(lp.isWakeOnLanSupported());
1167
1168 lp.clear();
1169 assertFalse(lp.isWakeOnLanSupported());
1170 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001171
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001172 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001173 public void testCaptivePortalApiUrl() {
1174 final LinkProperties lp = makeTestObject();
1175 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1176
1177 lp.clear();
1178 assertNull(lp.getCaptivePortalApiUrl());
1179 }
1180
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 testCaptivePortalData() {
1183 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001184 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001185
1186 lp.clear();
1187 assertNull(lp.getCaptivePortalData());
1188 }
lucaslin55c6a842020-03-26 19:15:11 +08001189
1190 private LinkProperties makeIpv4LinkProperties() {
1191 final LinkProperties linkProperties = new LinkProperties();
1192 linkProperties.setInterfaceName(NAME);
1193 linkProperties.addLinkAddress(LINKADDRV4);
1194 linkProperties.addDnsServer(DNS1);
1195 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1196 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1197 return linkProperties;
1198 }
1199
1200 private LinkProperties makeIpv6LinkProperties() {
1201 final LinkProperties linkProperties = new LinkProperties();
1202 linkProperties.setInterfaceName(NAME);
1203 linkProperties.addLinkAddress(LINKADDRV6);
1204 linkProperties.addDnsServer(DNS6);
1205 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1206 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1207 return linkProperties;
1208 }
1209
1210 @Test
1211 public void testHasIpv4DefaultRoute() {
1212 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1213 assertTrue(Ipv4.hasIpv4DefaultRoute());
1214 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1215 assertFalse(Ipv6.hasIpv4DefaultRoute());
1216 }
1217
1218 @Test
1219 public void testHasIpv4DnsServer() {
1220 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1221 assertTrue(Ipv4.hasIpv4DnsServer());
1222 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1223 assertFalse(Ipv6.hasIpv4DnsServer());
1224 }
1225
1226 @Test
1227 public void testHasIpv6DnsServer() {
1228 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1229 assertFalse(Ipv4.hasIpv6DnsServer());
1230 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1231 assertTrue(Ipv6.hasIpv6DnsServer());
1232 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001233
1234 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1235 public void testHasIpv4UnreachableDefaultRoute() {
1236 final LinkProperties lp = makeTestObject();
1237 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1238 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1239
1240 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1241 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1242 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1243 }
1244
1245 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1246 public void testHasIpv6UnreachableDefaultRoute() {
1247 final LinkProperties lp = makeTestObject();
1248 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1249 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1250
1251 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1252 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1253 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1254 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001255
1256 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1257 public void testRouteAddWithSameKey() throws Exception {
1258 LinkProperties lp = new LinkProperties();
1259 lp.setInterfaceName("wlan0");
1260 final IpPrefix v6 = new IpPrefix("64:ff9b::/96");
1261 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1280));
1262 assertEquals(1, lp.getRoutes().size());
1263 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1500));
1264 assertEquals(1, lp.getRoutes().size());
1265 final IpPrefix v4 = new IpPrefix("192.0.2.128/25");
1266 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_UNICAST, 1460));
1267 assertEquals(2, lp.getRoutes().size());
1268 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_THROW, 1460));
1269 assertEquals(2, lp.getRoutes().size());
1270 }
John Wang3e567d52011-04-04 12:35:42 -07001271}