blob: 23c187e1adbcdca1aae7e79e22ef5b2c1a390fed [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 VAN3994e732020-03-09 11:52:33 +090043import com.android.testutils.DevSdkIgnoreRule;
44import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
45import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
46
47import org.junit.Rule;
Lorenzo Colitti981b34f2019-01-08 09:58:59 +090048import org.junit.Test;
49import org.junit.runner.RunWith;
50
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090051import java.net.Inet4Address;
Rubin Xuab8cf302020-03-30 14:37:05 +010052import java.net.Inet6Address;
John Wang3e567d52011-04-04 12:35:42 -070053import java.net.InetAddress;
Rubin Xuffd77d82017-09-05 18:40:49 +010054import java.util.Arrays;
55import java.util.Collection;
56import java.util.Collections;
Rubin Xu2fa7d9e2017-08-22 16:35:52 +010057import java.util.List;
Rubin Xuffd77d82017-09-05 18:40:49 +010058import java.util.Set;
John Wang3e567d52011-04-04 12:35:42 -070059
Hugo Benichi87d306b2017-10-12 09:54:49 +090060@RunWith(AndroidJUnit4.class)
61@SmallTest
62public class LinkPropertiesTest {
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090063 @Rule
64 public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
65
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +090066 private static final InetAddress ADDRV4 = address("75.208.6.1");
67 private static final InetAddress ADDRV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
68 private static final InetAddress DNS1 = address("75.208.7.1");
69 private static final InetAddress DNS2 = address("69.78.7.1");
70 private static final InetAddress DNS6 = address("2001:4860:4860::8888");
71 private static final InetAddress PRIVDNS1 = address("1.1.1.1");
72 private static final InetAddress PRIVDNS2 = address("1.0.0.1");
73 private static final InetAddress PRIVDNS6 = address("2606:4700:4700::1111");
74 private static final InetAddress PCSCFV4 = address("10.77.25.37");
75 private static final InetAddress PCSCFV6 = address("2001:0db8:85a3:0000:0000:8a2e:0370:1");
76 private static final InetAddress GATEWAY1 = address("75.208.8.1");
77 private static final InetAddress GATEWAY2 = address("69.78.8.1");
78 private static final InetAddress GATEWAY61 = address("fe80::6:0000:613");
79 private static final InetAddress GATEWAY62 = address("fe80::6:22%lo");
80 private static final InetAddress TESTIPV4ADDR = address("192.168.47.42");
81 private static final InetAddress TESTIPV6ADDR = address("fe80::7:33%43");
Lorenzo Colitti279a1d62020-01-06 19:43:59 +090082 private static final Inet4Address DHCPSERVER = (Inet4Address) address("192.0.2.1");
paulhu9f7636c2019-05-02 17:43:28 +080083 private static final String NAME = "qmi0";
84 private static final String DOMAINS = "google.com";
85 private static final String PRIV_DNS_SERVER_NAME = "private.dns.com";
86 private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576";
87 private static final int MTU = 1500;
88 private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32);
89 private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128);
90 private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64");
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +090091 private static final Uri CAPPORT_API_URL = Uri.parse("https://test.example.com/capportapi");
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +090092
93 // CaptivePortalData cannot be in a constant as it does not exist on Q.
94 // The test runner also crashes when scanning for tests if it is a return type.
95 private static Object getCaptivePortalData() {
96 return new CaptivePortalData.Builder()
97 .setVenueInfoUrl(Uri.parse("https://test.example.com/venue")).build();
98 }
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +090099
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900100 private static InetAddress address(String addrString) {
paulhu9f7636c2019-05-02 17:43:28 +0800101 return InetAddresses.parseNumericAddress(addrString);
102 }
103
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900104 private static boolean isAtLeastR() {
105 // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
106 return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
107 }
108
paulhu9f7636c2019-05-02 17:43:28 +0800109 private void checkEmpty(final LinkProperties lp) {
110 assertEquals(0, lp.getAllInterfaceNames().size());
111 assertEquals(0, lp.getAllAddresses().size());
112 assertEquals(0, lp.getDnsServers().size());
113 assertEquals(0, lp.getValidatedPrivateDnsServers().size());
114 assertEquals(0, lp.getPcscfServers().size());
115 assertEquals(0, lp.getAllRoutes().size());
116 assertEquals(0, lp.getAllLinkAddresses().size());
117 assertEquals(0, lp.getStackedLinks().size());
118 assertEquals(0, lp.getMtu());
119 assertNull(lp.getPrivateDnsServerName());
120 assertNull(lp.getDomains());
121 assertNull(lp.getHttpProxy());
122 assertNull(lp.getTcpBufferSizes());
123 assertNull(lp.getNat64Prefix());
124 assertFalse(lp.isProvisioned());
125 assertFalse(lp.isIpv4Provisioned());
126 assertFalse(lp.isIpv6Provisioned());
127 assertFalse(lp.isPrivateDnsActive());
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900128
129 if (isAtLeastR()) {
130 assertNull(lp.getDhcpServerAddress());
131 assertFalse(lp.isWakeOnLanSupported());
132 assertNull(lp.getCaptivePortalApiUrl());
133 assertNull(lp.getCaptivePortalData());
134 }
paulhu9f7636c2019-05-02 17:43:28 +0800135 }
136
137 private LinkProperties makeTestObject() {
138 final LinkProperties lp = new LinkProperties();
139 lp.setInterfaceName(NAME);
140 lp.addLinkAddress(LINKADDRV4);
141 lp.addLinkAddress(LINKADDRV6);
142 lp.addDnsServer(DNS1);
143 lp.addDnsServer(DNS2);
144 lp.addValidatedPrivateDnsServer(PRIVDNS1);
145 lp.addValidatedPrivateDnsServer(PRIVDNS2);
146 lp.setUsePrivateDns(true);
147 lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
148 lp.addPcscfServer(PCSCFV6);
149 lp.setDomains(DOMAINS);
150 lp.addRoute(new RouteInfo(GATEWAY1));
151 lp.addRoute(new RouteInfo(GATEWAY2));
152 lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
153 lp.setMtu(MTU);
154 lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
155 lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900156 if (isAtLeastR()) {
157 lp.setDhcpServerAddress(DHCPSERVER);
158 lp.setWakeOnLanSupported(true);
159 lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
160 lp.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
161 }
paulhu9f7636c2019-05-02 17:43:28 +0800162 return lp;
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900163 }
164
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900165 public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) {
166 // Check implementation of equals(), element by element.
167 assertTrue(source.isIdenticalInterfaceName(target));
168 assertTrue(target.isIdenticalInterfaceName(source));
169
170 assertTrue(source.isIdenticalAddresses(target));
171 assertTrue(target.isIdenticalAddresses(source));
172
173 assertTrue(source.isIdenticalDnses(target));
174 assertTrue(target.isIdenticalDnses(source));
175
dalyk7643abc2018-01-17 14:20:55 -0500176 assertTrue(source.isIdenticalPrivateDns(target));
177 assertTrue(target.isIdenticalPrivateDns(source));
178
Chalard Jean299d8562018-04-11 16:36:41 +0900179 assertTrue(source.isIdenticalValidatedPrivateDnses(target));
180 assertTrue(target.isIdenticalValidatedPrivateDnses(source));
181
Hongshike2d7cf52018-06-28 20:42:19 +0900182 assertTrue(source.isIdenticalPcscfs(target));
183 assertTrue(target.isIdenticalPcscfs(source));
184
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900185 assertTrue(source.isIdenticalRoutes(target));
186 assertTrue(target.isIdenticalRoutes(source));
187
188 assertTrue(source.isIdenticalHttpProxy(target));
189 assertTrue(target.isIdenticalHttpProxy(source));
190
191 assertTrue(source.isIdenticalStackedLinks(target));
192 assertTrue(target.isIdenticalStackedLinks(source));
193
sy.yun4aa73922013-09-02 05:24:09 +0900194 assertTrue(source.isIdenticalMtu(target));
195 assertTrue(target.isIdenticalMtu(source));
196
dalyk7643abc2018-01-17 14:20:55 -0500197 assertTrue(source.isIdenticalTcpBufferSizes(target));
198 assertTrue(target.isIdenticalTcpBufferSizes(source));
199
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900200 if (isAtLeastR()) {
201 assertTrue(source.isIdenticalDhcpServerAddress(target));
202 assertTrue(source.isIdenticalDhcpServerAddress(source));
Valentin Iftime9fa35092019-09-24 13:32:13 +0200203
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900204 assertTrue(source.isIdenticalWakeOnLan(target));
205 assertTrue(target.isIdenticalWakeOnLan(source));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900206
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900207 assertTrue(source.isIdenticalCaptivePortalApiUrl(target));
208 assertTrue(target.isIdenticalCaptivePortalApiUrl(source));
209
210 assertTrue(source.isIdenticalCaptivePortalData(target));
211 assertTrue(target.isIdenticalCaptivePortalData(source));
212 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +0900213
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900214 // Check result of equals().
215 assertTrue(source.equals(target));
216 assertTrue(target.equals(source));
217
218 // Check hashCode.
219 assertEquals(source.hashCode(), target.hashCode());
220 }
221
Hugo Benichi87d306b2017-10-12 09:54:49 +0900222 @Test
John Wang3e567d52011-04-04 12:35:42 -0700223 public void testEqualsNull() {
224 LinkProperties source = new LinkProperties();
225 LinkProperties target = new LinkProperties();
226
227 assertFalse(source == target);
Lorenzo Colitti89218e52013-04-01 10:47:43 +0900228 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700229 }
230
Hugo Benichi87d306b2017-10-12 09:54:49 +0900231 @Test
232 public void testEqualsSameOrder() throws Exception {
233 LinkProperties source = new LinkProperties();
234 source.setInterfaceName(NAME);
235 // set 2 link addresses
236 source.addLinkAddress(LINKADDRV4);
237 source.addLinkAddress(LINKADDRV6);
238 // set 2 dnses
239 source.addDnsServer(DNS1);
240 source.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900241 // set 1 pcscf
242 source.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900243 // set 2 gateways
244 source.addRoute(new RouteInfo(GATEWAY1));
245 source.addRoute(new RouteInfo(GATEWAY2));
246 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700247
Hugo Benichi87d306b2017-10-12 09:54:49 +0900248 LinkProperties target = new LinkProperties();
John Wang3e567d52011-04-04 12:35:42 -0700249
Hugo Benichi87d306b2017-10-12 09:54:49 +0900250 // All fields are same
251 target.setInterfaceName(NAME);
252 target.addLinkAddress(LINKADDRV4);
253 target.addLinkAddress(LINKADDRV6);
254 target.addDnsServer(DNS1);
255 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900256 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900257 target.addRoute(new RouteInfo(GATEWAY1));
258 target.addRoute(new RouteInfo(GATEWAY2));
259 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700260
Hugo Benichi87d306b2017-10-12 09:54:49 +0900261 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700262
Hugo Benichi87d306b2017-10-12 09:54:49 +0900263 target.clear();
264 // change Interface Name
265 target.setInterfaceName("qmi1");
266 target.addLinkAddress(LINKADDRV4);
267 target.addLinkAddress(LINKADDRV6);
268 target.addDnsServer(DNS1);
269 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900270 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900271 target.addRoute(new RouteInfo(GATEWAY1));
272 target.addRoute(new RouteInfo(GATEWAY2));
273 target.setMtu(MTU);
274 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700275
Hugo Benichi87d306b2017-10-12 09:54:49 +0900276 target.clear();
277 target.setInterfaceName(NAME);
278 // change link addresses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900279 target.addLinkAddress(new LinkAddress(address("75.208.6.2"), 32));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900280 target.addLinkAddress(LINKADDRV6);
281 target.addDnsServer(DNS1);
282 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900283 target.addPcscfServer(PCSCFV6);
Hugo Benichi87d306b2017-10-12 09:54:49 +0900284 target.addRoute(new RouteInfo(GATEWAY1));
285 target.addRoute(new RouteInfo(GATEWAY2));
286 target.setMtu(MTU);
287 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700288
Hugo Benichi87d306b2017-10-12 09:54:49 +0900289 target.clear();
290 target.setInterfaceName(NAME);
291 target.addLinkAddress(LINKADDRV4);
292 target.addLinkAddress(LINKADDRV6);
293 // change dnses
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900294 target.addDnsServer(address("75.208.7.2"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900295 target.addDnsServer(DNS2);
Hongshike2d7cf52018-06-28 20:42:19 +0900296 target.addPcscfServer(PCSCFV6);
297 target.addRoute(new RouteInfo(GATEWAY1));
298 target.addRoute(new RouteInfo(GATEWAY2));
299 target.setMtu(MTU);
300 assertFalse(source.equals(target));
301
302 target.clear();
303 target.setInterfaceName(NAME);
304 target.addLinkAddress(LINKADDRV4);
305 target.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900306 target.addDnsServer(address("75.208.7.2"));
Hongshike2d7cf52018-06-28 20:42:19 +0900307 target.addDnsServer(DNS2);
308 // change pcscf
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900309 target.addPcscfServer(address("2001::1"));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900310 target.addRoute(new RouteInfo(GATEWAY1));
311 target.addRoute(new RouteInfo(GATEWAY2));
312 target.setMtu(MTU);
313 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700314
Hugo Benichi87d306b2017-10-12 09:54:49 +0900315 target.clear();
316 target.setInterfaceName(NAME);
317 target.addLinkAddress(LINKADDRV4);
318 target.addLinkAddress(LINKADDRV6);
319 target.addDnsServer(DNS1);
320 target.addDnsServer(DNS2);
321 // change gateway
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900322 target.addRoute(new RouteInfo(address("75.208.8.2")));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900323 target.setMtu(MTU);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900324 target.addRoute(new RouteInfo(GATEWAY2));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900325 assertFalse(source.equals(target));
sy.yun4aa73922013-09-02 05:24:09 +0900326
Hugo Benichi87d306b2017-10-12 09:54:49 +0900327 target.clear();
328 target.setInterfaceName(NAME);
329 target.addLinkAddress(LINKADDRV4);
330 target.addLinkAddress(LINKADDRV6);
331 target.addDnsServer(DNS1);
332 target.addDnsServer(DNS2);
333 target.addRoute(new RouteInfo(GATEWAY1));
334 target.addRoute(new RouteInfo(GATEWAY2));
335 // change mtu
336 target.setMtu(1440);
337 assertFalse(source.equals(target));
John Wang3e567d52011-04-04 12:35:42 -0700338 }
339
Hugo Benichi87d306b2017-10-12 09:54:49 +0900340 @Test
341 public void testEqualsDifferentOrder() throws Exception {
342 LinkProperties source = new LinkProperties();
343 source.setInterfaceName(NAME);
344 // set 2 link addresses
345 source.addLinkAddress(LINKADDRV4);
346 source.addLinkAddress(LINKADDRV6);
347 // set 2 dnses
348 source.addDnsServer(DNS1);
349 source.addDnsServer(DNS2);
350 // set 2 gateways
Tyler Wear44999a72020-02-13 17:14:38 -0800351 source.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900352 source.addRoute(new RouteInfo(GATEWAY2));
353 source.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700354
Hugo Benichi87d306b2017-10-12 09:54:49 +0900355 LinkProperties target = new LinkProperties();
356 // Exchange order
357 target.setInterfaceName(NAME);
358 target.addLinkAddress(LINKADDRV6);
359 target.addLinkAddress(LINKADDRV4);
360 target.addDnsServer(DNS2);
361 target.addDnsServer(DNS1);
362 target.addRoute(new RouteInfo(GATEWAY2));
Tyler Wear44999a72020-02-13 17:14:38 -0800363 target.addRoute(new RouteInfo(LINKADDRV4, GATEWAY1));
Hugo Benichi87d306b2017-10-12 09:54:49 +0900364 target.setMtu(MTU);
John Wang3e567d52011-04-04 12:35:42 -0700365
Hugo Benichi87d306b2017-10-12 09:54:49 +0900366 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700367 }
368
Hugo Benichi87d306b2017-10-12 09:54:49 +0900369 @Test
370 public void testEqualsDuplicated() throws Exception {
371 LinkProperties source = new LinkProperties();
372 // set 3 link addresses, eg, [A, A, B]
373 source.addLinkAddress(LINKADDRV4);
374 source.addLinkAddress(LINKADDRV4);
375 source.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700376
Hugo Benichi87d306b2017-10-12 09:54:49 +0900377 LinkProperties target = new LinkProperties();
378 // set 3 link addresses, eg, [A, B, B]
379 target.addLinkAddress(LINKADDRV4);
380 target.addLinkAddress(LINKADDRV6);
381 target.addLinkAddress(LINKADDRV6);
John Wang3e567d52011-04-04 12:35:42 -0700382
Hugo Benichi87d306b2017-10-12 09:54:49 +0900383 assertLinkPropertiesEqual(source, target);
John Wang3e567d52011-04-04 12:35:42 -0700384 }
385
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800386 private void assertAllRoutesHaveInterface(String iface, LinkProperties lp) {
387 for (RouteInfo r : lp.getRoutes()) {
388 assertEquals(iface, r.getInterface());
389 }
390 }
391
paulhu9f7636c2019-05-02 17:43:28 +0800392 private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) {
393 for (RouteInfo r : lp.getRoutes()) {
394 assertNotEquals(iface, r.getInterface());
395 }
396 }
397
Hugo Benichi87d306b2017-10-12 09:54:49 +0900398 @Test
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800399 public void testRouteInterfaces() {
Tyler Wear44999a72020-02-13 17:14:38 -0800400 LinkAddress prefix1 = new LinkAddress(address("2001:db8:1::"), 48);
401 LinkAddress prefix2 = new LinkAddress(address("2001:db8:2::"), 48);
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900402 InetAddress address = ADDRV6;
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800403
404 // Add a route with no interface to a LinkProperties with no interface. No errors.
405 LinkProperties lp = new LinkProperties();
Tyler Wear44999a72020-02-13 17:14:38 -0800406 RouteInfo r = new RouteInfo(prefix1, address, null);
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900407 assertTrue(lp.addRoute(r));
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800408 assertEquals(1, lp.getRoutes().size());
409 assertAllRoutesHaveInterface(null, lp);
410
Lorenzo Colitti3897f1a2014-06-23 21:16:34 +0900411 // Adding the same route twice has no effect.
412 assertFalse(lp.addRoute(r));
413 assertEquals(1, lp.getRoutes().size());
414
415 // Add a route with an interface. Expect an exception.
Tyler Wear44999a72020-02-13 17:14:38 -0800416 r = new RouteInfo(prefix2, address, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800417 try {
418 lp.addRoute(r);
419 fail("Adding wlan0 route to LP with no interface, expect exception");
420 } catch (IllegalArgumentException expected) {}
421
422 // Change the interface name. All the routes should change their interface name too.
423 lp.setInterfaceName("rmnet0");
424 assertAllRoutesHaveInterface("rmnet0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800425 assertAllRoutesNotHaveInterface(null, lp);
426 assertAllRoutesNotHaveInterface("wlan0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800427
428 // Now add a route with the wrong interface. This causes an exception too.
429 try {
430 lp.addRoute(r);
431 fail("Adding wlan0 route to rmnet0 LP, expect exception");
432 } catch (IllegalArgumentException expected) {}
433
434 // If the interface name matches, the route is added.
Tyler Wear44999a72020-02-13 17:14:38 -0800435 r = new RouteInfo(prefix2, null, "wlan0");
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800436 lp.setInterfaceName("wlan0");
437 lp.addRoute(r);
438 assertEquals(2, lp.getRoutes().size());
439 assertAllRoutesHaveInterface("wlan0", lp);
paulhu9f7636c2019-05-02 17:43:28 +0800440 assertAllRoutesNotHaveInterface("rmnet0", lp);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800441
442 // Routes with null interfaces are converted to wlan0.
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900443 r = RouteInfo.makeHostRoute(ADDRV6, null);
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800444 lp.addRoute(r);
445 assertEquals(3, lp.getRoutes().size());
446 assertAllRoutesHaveInterface("wlan0", lp);
447
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900448 // Check routes are updated correctly when calling setInterfaceName.
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800449 LinkProperties lp2 = new LinkProperties(lp);
paulhu9f7636c2019-05-02 17:43:28 +0800450 assertAllRoutesHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900451 final CompareResult<RouteInfo> cr1 =
452 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
453 assertEquals(0, cr1.added.size());
454 assertEquals(0, cr1.removed.size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800455
456 lp2.setInterfaceName("p2p0");
457 assertAllRoutesHaveInterface("p2p0", lp2);
paulhu9f7636c2019-05-02 17:43:28 +0800458 assertAllRoutesNotHaveInterface("wlan0", lp2);
Chalard Jean4d6c93d2020-10-05 14:22:01 +0900459 final CompareResult<RouteInfo> cr2 =
460 new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes());
461 assertEquals(3, cr2.added.size());
462 assertEquals(3, cr2.removed.size());
paulhu9f7636c2019-05-02 17:43:28 +0800463
Tyler Wear44999a72020-02-13 17:14:38 -0800464 // Remove route with incorrect interface, no route removed.
465 lp.removeRoute(new RouteInfo(prefix2, null, null));
paulhu9f7636c2019-05-02 17:43:28 +0800466 assertEquals(3, lp.getRoutes().size());
Tyler Wear44999a72020-02-13 17:14:38 -0800467
468 // Check remove works when interface is correct.
469 lp.removeRoute(new RouteInfo(prefix2, null, "wlan0"));
paulhu9f7636c2019-05-02 17:43:28 +0800470 assertEquals(2, lp.getRoutes().size());
471 assertAllRoutesHaveInterface("wlan0", lp);
472 assertAllRoutesNotHaveInterface("p2p0", lp);
Lorenzo Colitti3989de82013-03-16 02:42:30 +0900473 }
Lorenzo Colittic0803122013-03-07 10:59:25 -0800474
Hugo Benichi87d306b2017-10-12 09:54:49 +0900475 @Test
Lorenzo Colittic0803122013-03-07 10:59:25 -0800476 public void testStackedInterfaces() {
477 LinkProperties rmnet0 = new LinkProperties();
478 rmnet0.setInterfaceName("rmnet0");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900479 rmnet0.addLinkAddress(LINKADDRV6);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800480
481 LinkProperties clat4 = new LinkProperties();
482 clat4.setInterfaceName("clat4");
Lorenzo Colittia2dc69a2013-08-08 10:56:22 +0900483 clat4.addLinkAddress(LINKADDRV4);
Lorenzo Colittic0803122013-03-07 10:59:25 -0800484
485 assertEquals(0, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900486 assertEquals(1, rmnet0.getAddresses().size());
487 assertEquals(1, rmnet0.getLinkAddresses().size());
488 assertEquals(1, rmnet0.getAllAddresses().size());
489 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800490 assertEquals(1, rmnet0.getAllInterfaceNames().size());
491 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900492
Lorenzo Colittic0803122013-03-07 10:59:25 -0800493 rmnet0.addStackedLink(clat4);
494 assertEquals(1, rmnet0.getStackedLinks().size());
Lorenzo Colittie1b47422013-07-31 23:23:21 +0900495 assertEquals(1, rmnet0.getAddresses().size());
496 assertEquals(1, rmnet0.getLinkAddresses().size());
497 assertEquals(2, rmnet0.getAllAddresses().size());
498 assertEquals(2, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800499 assertEquals(2, rmnet0.getAllInterfaceNames().size());
500 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
501 assertEquals("clat4", rmnet0.getAllInterfaceNames().get(1));
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 assertEquals(0, clat4.getStackedLinks().size());
514
515 // Modify an item in the returned collection to see what happens.
516 for (LinkProperties link : rmnet0.getStackedLinks()) {
517 if (link.getInterfaceName().equals("clat4")) {
518 link.setInterfaceName("newname");
519 }
520 }
521 for (LinkProperties link : rmnet0.getStackedLinks()) {
522 assertFalse("newname".equals(link.getInterfaceName()));
523 }
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900524
Lorenzo Colitti38258432014-10-20 11:08:03 +0900525 assertTrue(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900526 assertEquals(0, rmnet0.getStackedLinks().size());
527 assertEquals(1, rmnet0.getAddresses().size());
528 assertEquals(1, rmnet0.getLinkAddresses().size());
529 assertEquals(1, rmnet0.getAllAddresses().size());
530 assertEquals(1, rmnet0.getAllLinkAddresses().size());
lucaslin55c6a842020-03-26 19:15:11 +0800531 assertEquals(1, rmnet0.getAllInterfaceNames().size());
532 assertEquals("rmnet0", rmnet0.getAllInterfaceNames().get(0));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900533
Lorenzo Colitti38258432014-10-20 11:08:03 +0900534 assertFalse(rmnet0.removeStackedLink("clat4"));
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900535 }
536
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900537 private LinkAddress getFirstLinkAddress(LinkProperties lp) {
538 return lp.getLinkAddresses().iterator().next();
539 }
540
Hugo Benichi87d306b2017-10-12 09:54:49 +0900541 @Test
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900542 public void testAddressMethods() {
543 LinkProperties lp = new LinkProperties();
544
545 // No addresses.
paulhucbbc3db2019-03-08 16:35:20 +0800546 assertFalse(lp.hasIpv4Address());
547 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900548
549 // Addresses on stacked links don't count.
550 LinkProperties stacked = new LinkProperties();
551 stacked.setInterfaceName("stacked");
552 lp.addStackedLink(stacked);
553 stacked.addLinkAddress(LINKADDRV4);
554 stacked.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800555 assertTrue(stacked.hasIpv4Address());
556 assertTrue(stacked.hasGlobalIpv6Address());
557 assertFalse(lp.hasIpv4Address());
558 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti38258432014-10-20 11:08:03 +0900559 lp.removeStackedLink("stacked");
paulhucbbc3db2019-03-08 16:35:20 +0800560 assertFalse(lp.hasIpv4Address());
561 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900562
563 // Addresses on the base link.
paulhucbbc3db2019-03-08 16:35:20 +0800564 // Check the return values of hasIpvXAddress and ensure the add/remove methods return true
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900565 // iff something changes.
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900566 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900567 assertTrue(lp.addLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900568 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800569 assertFalse(lp.hasIpv4Address());
570 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900571
572 assertTrue(lp.removeLinkAddress(LINKADDRV6));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900573 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900574
Lorenzo Colittifc854692014-06-23 22:33:43 +0900575 assertTrue(lp.addLinkAddress(LINKADDRV6LINKLOCAL));
576 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800577 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900578
579 assertTrue(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900580 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800581 assertTrue(lp.hasIpv4Address());
582 assertFalse(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900583
584 assertTrue(lp.addLinkAddress(LINKADDRV6));
585 assertEquals(3, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800586 assertTrue(lp.hasIpv4Address());
587 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colittifc854692014-06-23 22:33:43 +0900588
589 assertTrue(lp.removeLinkAddress(LINKADDRV6LINKLOCAL));
590 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800591 assertTrue(lp.hasIpv4Address());
592 assertTrue(lp.hasGlobalIpv6Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900593
594 // Adding an address twice has no effect.
595 // Removing an address that's not present has no effect.
596 assertFalse(lp.addLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900597 assertEquals(2, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800598 assertTrue(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900599 assertTrue(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900600 assertEquals(1, lp.getLinkAddresses().size());
paulhucbbc3db2019-03-08 16:35:20 +0800601 assertFalse(lp.hasIpv4Address());
Lorenzo Colitti09de4182013-08-08 11:00:12 +0900602 assertFalse(lp.removeLinkAddress(LINKADDRV4));
Lorenzo Colitti61b65822013-11-15 18:43:52 +0900603 assertEquals(1, lp.getLinkAddresses().size());
604
605 // Adding an address that's already present but with different properties causes the
606 // existing address to be updated and returns true.
607 // Start with only LINKADDRV6.
608 assertEquals(1, lp.getLinkAddresses().size());
609 assertEquals(LINKADDRV6, getFirstLinkAddress(lp));
610
611 // Create a LinkAddress object for the same address, but with different flags.
612 LinkAddress deprecated = new LinkAddress(ADDRV6, 128,
613 OsConstants.IFA_F_DEPRECATED, OsConstants.RT_SCOPE_UNIVERSE);
614 assertTrue(deprecated.isSameAddressAs(LINKADDRV6));
615 assertFalse(deprecated.equals(LINKADDRV6));
616
617 // Check that adding it updates the existing address instead of adding a new one.
618 assertTrue(lp.addLinkAddress(deprecated));
619 assertEquals(1, lp.getLinkAddresses().size());
620 assertEquals(deprecated, getFirstLinkAddress(lp));
621 assertFalse(LINKADDRV6.equals(getFirstLinkAddress(lp)));
622
623 // Removing LINKADDRV6 removes deprecated, because removing addresses ignores properties.
624 assertTrue(lp.removeLinkAddress(LINKADDRV6));
625 assertEquals(0, lp.getLinkAddresses().size());
Lorenzo Colitti8ec0b8a2013-03-08 19:11:40 -0800626 }
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900627
Hugo Benichi87d306b2017-10-12 09:54:49 +0900628 @Test
paulhu9f7636c2019-05-02 17:43:28 +0800629 public void testLinkAddresses() {
630 final LinkProperties lp = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900631 lp.addLinkAddress(LINKADDRV4);
632 lp.addLinkAddress(LINKADDRV6);
633
paulhu9f7636c2019-05-02 17:43:28 +0800634 final LinkProperties lp2 = new LinkProperties();
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900635 lp2.addLinkAddress(LINKADDRV6);
636
paulhu9f7636c2019-05-02 17:43:28 +0800637 final LinkProperties lp3 = new LinkProperties();
638 final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4);
639 lp3.setLinkAddresses(linkAddresses);
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900640
paulhu9f7636c2019-05-02 17:43:28 +0800641 assertFalse(lp.equals(lp2));
642 assertFalse(lp2.equals(lp3));
643
644 lp.removeLinkAddress(LINKADDRV4);
645 assertTrue(lp.equals(lp2));
646
647 lp2.setLinkAddresses(lp3.getLinkAddresses());
648 assertTrue(lp2.equals(lp3));
Lorenzo Colitti174782b2013-08-23 20:54:49 +0900649 }
Erik Kline8b023072014-10-24 21:50:20 +0900650
Hugo Benichi87d306b2017-10-12 09:54:49 +0900651 @Test
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900652 public void testNat64Prefix() throws Exception {
653 LinkProperties lp = new LinkProperties();
654 lp.addLinkAddress(LINKADDRV4);
655 lp.addLinkAddress(LINKADDRV6);
656
657 assertNull(lp.getNat64Prefix());
658
659 IpPrefix p = new IpPrefix("64:ff9b::/96");
660 lp.setNat64Prefix(p);
661 assertEquals(p, lp.getNat64Prefix());
662
663 p = new IpPrefix("2001:db8:a:b:1:2:3::/96");
664 lp.setNat64Prefix(p);
665 assertEquals(p, lp.getNat64Prefix());
666
667 p = new IpPrefix("2001:db8:a:b:1:2::/80");
668 try {
669 lp.setNat64Prefix(p);
670 } catch (IllegalArgumentException expected) {
671 }
672
673 p = new IpPrefix("64:ff9b::/64");
674 try {
675 lp.setNat64Prefix(p);
676 } catch (IllegalArgumentException expected) {
677 }
678
679 assertEquals(new IpPrefix("2001:db8:a:b:1:2:3::/96"), lp.getNat64Prefix());
680
681 lp.setNat64Prefix(null);
682 assertNull(lp.getNat64Prefix());
683 }
684
685 @Test
Erik Kline8b023072014-10-24 21:50:20 +0900686 public void testIsProvisioned() {
687 LinkProperties lp4 = new LinkProperties();
688 assertFalse("v4only:empty", lp4.isProvisioned());
689 lp4.addLinkAddress(LINKADDRV4);
690 assertFalse("v4only:addr-only", lp4.isProvisioned());
691 lp4.addDnsServer(DNS1);
692 assertFalse("v4only:addr+dns", lp4.isProvisioned());
693 lp4.addRoute(new RouteInfo(GATEWAY1));
694 assertTrue("v4only:addr+dns+route", lp4.isProvisioned());
paulhucbbc3db2019-03-08 16:35:20 +0800695 assertTrue("v4only:addr+dns+route", lp4.isIpv4Provisioned());
696 assertFalse("v4only:addr+dns+route", lp4.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900697
698 LinkProperties lp6 = new LinkProperties();
699 assertFalse("v6only:empty", lp6.isProvisioned());
700 lp6.addLinkAddress(LINKADDRV6LINKLOCAL);
701 assertFalse("v6only:fe80-only", lp6.isProvisioned());
702 lp6.addDnsServer(DNS6);
703 assertFalse("v6only:fe80+dns", lp6.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900704 lp6.addRoute(new RouteInfo(GATEWAY61));
Erik Kline8b023072014-10-24 21:50:20 +0900705 assertFalse("v6only:fe80+dns+route", lp6.isProvisioned());
706 lp6.addLinkAddress(LINKADDRV6);
paulhucbbc3db2019-03-08 16:35:20 +0800707 assertTrue("v6only:fe80+global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900708 assertTrue("v6only:fe80+global+dns+route", lp6.isProvisioned());
709 lp6.removeLinkAddress(LINKADDRV6LINKLOCAL);
paulhucbbc3db2019-03-08 16:35:20 +0800710 assertFalse("v6only:global+dns+route", lp6.isIpv4Provisioned());
711 assertTrue("v6only:global+dns+route", lp6.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900712 assertTrue("v6only:global+dns+route", lp6.isProvisioned());
713
714 LinkProperties lp46 = new LinkProperties();
715 lp46.addLinkAddress(LINKADDRV4);
716 lp46.addLinkAddress(LINKADDRV6);
717 lp46.addDnsServer(DNS1);
718 lp46.addDnsServer(DNS6);
719 assertFalse("dualstack:missing-routes", lp46.isProvisioned());
720 lp46.addRoute(new RouteInfo(GATEWAY1));
paulhucbbc3db2019-03-08 16:35:20 +0800721 assertTrue("dualstack:v4-provisioned", lp46.isIpv4Provisioned());
722 assertFalse("dualstack:v4-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900723 assertTrue("dualstack:v4-provisioned", lp46.isProvisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900724 lp46.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800725 assertTrue("dualstack:both-provisioned", lp46.isIpv4Provisioned());
726 assertTrue("dualstack:both-provisioned", lp46.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900727 assertTrue("dualstack:both-provisioned", lp46.isProvisioned());
728
729 // A link with an IPv6 address and default route, but IPv4 DNS server.
730 LinkProperties mixed = new LinkProperties();
731 mixed.addLinkAddress(LINKADDRV6);
732 mixed.addDnsServer(DNS1);
Erik Kline04612b02015-05-21 16:15:02 +0900733 mixed.addRoute(new RouteInfo(GATEWAY61));
paulhucbbc3db2019-03-08 16:35:20 +0800734 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv4Provisioned());
735 assertFalse("mixed:addr6+route6+dns4", mixed.isIpv6Provisioned());
Erik Kline8b023072014-10-24 21:50:20 +0900736 assertFalse("mixed:addr6+route6+dns4", mixed.isProvisioned());
737 }
Erik Kline04612b02015-05-21 16:15:02 +0900738
Hugo Benichi87d306b2017-10-12 09:54:49 +0900739 @Test
Erik Kline04612b02015-05-21 16:15:02 +0900740 public void testCompareProvisioning() {
741 LinkProperties v4lp = new LinkProperties();
742 v4lp.addLinkAddress(LINKADDRV4);
743 v4lp.addRoute(new RouteInfo(GATEWAY1));
744 v4lp.addDnsServer(DNS1);
745 assertTrue(v4lp.isProvisioned());
746
747 LinkProperties v4r = new LinkProperties(v4lp);
748 v4r.removeDnsServer(DNS1);
749 assertFalse(v4r.isProvisioned());
750
751 assertEquals(ProvisioningChange.STILL_NOT_PROVISIONED,
752 LinkProperties.compareProvisioning(v4r, v4r));
753 assertEquals(ProvisioningChange.LOST_PROVISIONING,
754 LinkProperties.compareProvisioning(v4lp, v4r));
755 assertEquals(ProvisioningChange.GAINED_PROVISIONING,
756 LinkProperties.compareProvisioning(v4r, v4lp));
757 assertEquals(ProvisioningChange.STILL_PROVISIONED,
758 LinkProperties.compareProvisioning(v4lp, v4lp));
759
760 // Check that losing IPv4 provisioning on a dualstack network is
761 // seen as a total loss of provisioning.
762 LinkProperties v6lp = new LinkProperties();
763 v6lp.addLinkAddress(LINKADDRV6);
764 v6lp.addRoute(new RouteInfo(GATEWAY61));
765 v6lp.addDnsServer(DNS6);
paulhucbbc3db2019-03-08 16:35:20 +0800766 assertFalse(v6lp.isIpv4Provisioned());
767 assertTrue(v6lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900768 assertTrue(v6lp.isProvisioned());
769
770 LinkProperties v46lp = new LinkProperties(v6lp);
771 v46lp.addLinkAddress(LINKADDRV4);
772 v46lp.addRoute(new RouteInfo(GATEWAY1));
773 v46lp.addDnsServer(DNS1);
paulhucbbc3db2019-03-08 16:35:20 +0800774 assertTrue(v46lp.isIpv4Provisioned());
775 assertTrue(v46lp.isIpv6Provisioned());
Erik Kline04612b02015-05-21 16:15:02 +0900776 assertTrue(v46lp.isProvisioned());
777
778 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Klineaa8f8f32015-08-14 12:16:55 +0900779 LinkProperties.compareProvisioning(v4lp, v46lp));
780 assertEquals(ProvisioningChange.STILL_PROVISIONED,
Erik Kline04612b02015-05-21 16:15:02 +0900781 LinkProperties.compareProvisioning(v6lp, v46lp));
782 assertEquals(ProvisioningChange.LOST_PROVISIONING,
783 LinkProperties.compareProvisioning(v46lp, v6lp));
Erik Klineaa8f8f32015-08-14 12:16:55 +0900784 assertEquals(ProvisioningChange.LOST_PROVISIONING,
785 LinkProperties.compareProvisioning(v46lp, v4lp));
Erik Kline04612b02015-05-21 16:15:02 +0900786
787 // Check that losing and gaining a secondary router does not change
788 // the provisioning status.
789 LinkProperties v6lp2 = new LinkProperties(v6lp);
790 v6lp2.addRoute(new RouteInfo(GATEWAY62));
791 assertTrue(v6lp2.isProvisioned());
792
793 assertEquals(ProvisioningChange.STILL_PROVISIONED,
794 LinkProperties.compareProvisioning(v6lp2, v6lp));
795 assertEquals(ProvisioningChange.STILL_PROVISIONED,
796 LinkProperties.compareProvisioning(v6lp, v6lp2));
797 }
Erik Klinea923dba2015-06-26 19:21:34 +0900798
Hugo Benichi87d306b2017-10-12 09:54:49 +0900799 @Test
Erik Klinea923dba2015-06-26 19:21:34 +0900800 public void testIsReachable() {
801 final LinkProperties v4lp = new LinkProperties();
802 assertFalse(v4lp.isReachable(DNS1));
803 assertFalse(v4lp.isReachable(DNS2));
804
805 // Add an on-link route, making the on-link DNS server reachable,
806 // but there is still no IPv4 address.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900807 assertTrue(v4lp.addRoute(new RouteInfo(new IpPrefix(address("75.208.0.0"), 16))));
Erik Klinea923dba2015-06-26 19:21:34 +0900808 assertFalse(v4lp.isReachable(DNS1));
809 assertFalse(v4lp.isReachable(DNS2));
810
811 // Adding an IPv4 address (right now, any IPv4 address) means we use
812 // the routes to compute likely reachability.
813 assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
814 assertTrue(v4lp.isReachable(DNS1));
815 assertFalse(v4lp.isReachable(DNS2));
816
817 // Adding a default route makes the off-link DNS server reachable.
818 assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
819 assertTrue(v4lp.isReachable(DNS1));
820 assertTrue(v4lp.isReachable(DNS2));
821
822 final LinkProperties v6lp = new LinkProperties();
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900823 final InetAddress kLinkLocalDns = address("fe80::6:1");
824 final InetAddress kLinkLocalDnsWithScope = address("fe80::6:2%43");
825 final InetAddress kOnLinkDns = address("2001:db8:85a3::53");
Erik Klinea923dba2015-06-26 19:21:34 +0900826 assertFalse(v6lp.isReachable(kLinkLocalDns));
827 assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
828 assertFalse(v6lp.isReachable(kOnLinkDns));
829 assertFalse(v6lp.isReachable(DNS6));
830
831 // Add a link-local route, making the link-local DNS servers reachable. Because
832 // we assume the presence of an IPv6 link-local address, link-local DNS servers
833 // are considered reachable, but only those with a non-zero scope identifier.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900834 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("fe80::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900835 assertFalse(v6lp.isReachable(kLinkLocalDns));
836 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
837 assertFalse(v6lp.isReachable(kOnLinkDns));
838 assertFalse(v6lp.isReachable(DNS6));
839
840 // Add a link-local address--nothing changes.
841 assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
842 assertFalse(v6lp.isReachable(kLinkLocalDns));
843 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
844 assertFalse(v6lp.isReachable(kOnLinkDns));
845 assertFalse(v6lp.isReachable(DNS6));
846
847 // Add a global route on link, but no global address yet. DNS servers reachable
848 // via a route that doesn't require a gateway: give them the benefit of the
849 // doubt and hope the link-local source address suffices for communication.
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900850 assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(address("2001:db8:85a3::"), 64))));
Erik Klinea923dba2015-06-26 19:21:34 +0900851 assertFalse(v6lp.isReachable(kLinkLocalDns));
852 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
853 assertTrue(v6lp.isReachable(kOnLinkDns));
854 assertFalse(v6lp.isReachable(DNS6));
855
856 // Add a global address; the on-link global address DNS server is (still)
857 // presumed reachable.
858 assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
859 assertFalse(v6lp.isReachable(kLinkLocalDns));
860 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
861 assertTrue(v6lp.isReachable(kOnLinkDns));
862 assertFalse(v6lp.isReachable(DNS6));
863
864 // Adding a default route makes the off-link DNS server reachable.
865 assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
866 assertFalse(v6lp.isReachable(kLinkLocalDns));
867 assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
868 assertTrue(v6lp.isReachable(kOnLinkDns));
869 assertTrue(v6lp.isReachable(DNS6));
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900870
871 // Check isReachable on stacked links. This requires that the source IP address be assigned
872 // on the interface returned by the route lookup.
873 LinkProperties stacked = new LinkProperties();
874
875 // Can't add a stacked link without an interface name.
876 stacked.setInterfaceName("v4-test0");
877 v6lp.addStackedLink(stacked);
878
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900879 InetAddress stackedAddress = address("192.0.0.4");
Lorenzo Colitti28bb16c2015-07-30 23:41:43 +0900880 LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32);
881 assertFalse(v6lp.isReachable(stackedAddress));
882 stacked.addLinkAddress(stackedLinkAddress);
883 assertFalse(v6lp.isReachable(stackedAddress));
884 stacked.addRoute(new RouteInfo(stackedLinkAddress));
885 assertTrue(stacked.isReachable(stackedAddress));
886 assertTrue(v6lp.isReachable(stackedAddress));
887
888 assertFalse(v6lp.isReachable(DNS1));
889 stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress));
890 assertTrue(v6lp.isReachable(DNS1));
Erik Klinea923dba2015-06-26 19:21:34 +0900891 }
Rubin Xuffd77d82017-09-05 18:40:49 +0100892
Hugo Benichi87d306b2017-10-12 09:54:49 +0900893 @Test
Rubin Xuffd77d82017-09-05 18:40:49 +0100894 public void testLinkPropertiesEnsureDirectlyConnectedRoutes() {
895 // IPv4 case: no route added initially
896 LinkProperties rmnet0 = new LinkProperties();
897 rmnet0.setInterfaceName("rmnet0");
898 rmnet0.addLinkAddress(new LinkAddress("10.0.0.2/8"));
899 RouteInfo directRoute0 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
900 rmnet0.getInterfaceName());
901
902 // Since no routes is added explicitly, getAllRoutes() should return empty.
903 assertTrue(rmnet0.getAllRoutes().isEmpty());
904 rmnet0.ensureDirectlyConnectedRoutes();
905 // ensureDirectlyConnectedRoutes() should have added the missing local route.
906 assertEqualRoutes(Collections.singletonList(directRoute0), rmnet0.getAllRoutes());
907
908 // IPv4 case: both direct and default routes added initially
909 LinkProperties rmnet1 = new LinkProperties();
910 rmnet1.setInterfaceName("rmnet1");
911 rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900912 RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, address("10.0.0.1"),
paulhu9f7636c2019-05-02 17:43:28 +0800913 rmnet1.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100914 RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null,
915 rmnet1.getInterfaceName());
916 rmnet1.addRoute(defaultRoute1);
917 rmnet1.addRoute(directRoute1);
918
919 // Check added routes
920 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
921 // ensureDirectlyConnectedRoutes() shouldn't change the routes since direct connected
922 // route is already part of the configuration.
923 rmnet1.ensureDirectlyConnectedRoutes();
924 assertEqualRoutes(Arrays.asList(defaultRoute1, directRoute1), rmnet1.getAllRoutes());
925
926 // IPv6 case: only default routes added initially
927 LinkProperties rmnet2 = new LinkProperties();
928 rmnet2.setInterfaceName("rmnet2");
929 rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64"));
930 rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64"));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900931 RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, address("2001:db8::1"),
paulhu9f7636c2019-05-02 17:43:28 +0800932 rmnet2.getInterfaceName());
Rubin Xuffd77d82017-09-05 18:40:49 +0100933 RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null,
934 rmnet2.getInterfaceName());
935 RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null,
936 rmnet2.getInterfaceName());
937 rmnet2.addRoute(defaultRoute2);
938
939 assertEqualRoutes(Arrays.asList(defaultRoute2), rmnet2.getAllRoutes());
940 rmnet2.ensureDirectlyConnectedRoutes();
941 assertEqualRoutes(Arrays.asList(defaultRoute2, directRoute2, linkLocalRoute2),
942 rmnet2.getAllRoutes());
943
944 // Corner case: no interface name
945 LinkProperties rmnet3 = new LinkProperties();
946 rmnet3.addLinkAddress(new LinkAddress("192.168.0.2/24"));
947 RouteInfo directRoute3 = new RouteInfo(new IpPrefix("192.168.0.0/24"), null,
948 rmnet3.getInterfaceName());
949
950 assertTrue(rmnet3.getAllRoutes().isEmpty());
951 rmnet3.ensureDirectlyConnectedRoutes();
952 assertEqualRoutes(Collections.singletonList(directRoute3), rmnet3.getAllRoutes());
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100953 }
954
Rubin Xuffd77d82017-09-05 18:40:49 +0100955 private void assertEqualRoutes(Collection<RouteInfo> expected, Collection<RouteInfo> actual) {
956 Set<RouteInfo> expectedSet = new ArraySet<>(expected);
957 Set<RouteInfo> actualSet = new ArraySet<>(actual);
958 // Duplicated entries in actual routes are considered failures
959 assertEquals(actual.size(), actualSet.size());
960
961 assertEquals(expectedSet, actualSet);
962 }
Rubin Xu2fa7d9e2017-08-22 16:35:52 +0100963
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +0900964 private static LinkProperties makeLinkPropertiesForParceling() {
Chalard Jean299d8562018-04-11 16:36:41 +0900965 LinkProperties source = new LinkProperties();
966 source.setInterfaceName(NAME);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900967
Chalard Jean299d8562018-04-11 16:36:41 +0900968 source.addLinkAddress(LINKADDRV4);
969 source.addLinkAddress(LINKADDRV6);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900970
Chalard Jean299d8562018-04-11 16:36:41 +0900971 source.addDnsServer(DNS1);
972 source.addDnsServer(DNS2);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900973 source.addDnsServer(GATEWAY62);
974
975 source.addPcscfServer(TESTIPV4ADDR);
976 source.addPcscfServer(TESTIPV6ADDR);
977
978 source.setUsePrivateDns(true);
979 source.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME);
980
981 source.setDomains(DOMAINS);
982
Chalard Jean299d8562018-04-11 16:36:41 +0900983 source.addRoute(new RouteInfo(GATEWAY1));
984 source.addRoute(new RouteInfo(GATEWAY2));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900985
Chalard Jean299d8562018-04-11 16:36:41 +0900986 source.addValidatedPrivateDnsServer(DNS6);
987 source.addValidatedPrivateDnsServer(GATEWAY61);
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900988 source.addValidatedPrivateDnsServer(TESTIPV6ADDR);
989
990 source.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888));
Chalard Jean299d8562018-04-11 16:36:41 +0900991
992 source.setMtu(MTU);
993
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900994 source.setTcpBufferSizes(TCP_BUFFER_SIZES);
995
Lorenzo Colitti981b34f2019-01-08 09:58:59 +0900996 source.setNat64Prefix(new IpPrefix("2001:db8:1:2:64:64::/96"));
997
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +0900998 final LinkProperties stacked = new LinkProperties();
999 stacked.setInterfaceName("test-stacked");
1000 source.addStackedLink(stacked);
1001
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001002 return source;
1003 }
1004
1005 @Test @IgnoreAfter(Build.VERSION_CODES.Q)
1006 public void testLinkPropertiesParcelable_Q() throws Exception {
1007 final LinkProperties source = makeLinkPropertiesForParceling();
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001008 assertParcelingIsLossless(source);
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001009 }
1010
1011 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1012 public void testLinkPropertiesParcelable() throws Exception {
1013 final LinkProperties source = makeLinkPropertiesForParceling();
1014
1015 source.setWakeOnLanSupported(true);
1016 source.setCaptivePortalApiUrl(CAPPORT_API_URL);
1017 source.setCaptivePortalData((CaptivePortalData) getCaptivePortalData());
1018 source.setDhcpServerAddress((Inet4Address) GATEWAY1);
Remi NGUYEN VAN8bc36962022-01-18 12:36:25 +09001019 assertParcelingIsLossless(new LinkProperties(source, true /* parcelSensitiveFields */));
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001020
1021 // Verify that without using a sensitiveFieldsParcelingCopy, sensitive fields are cleared.
1022 final LinkProperties sanitized = new LinkProperties(source);
1023 sanitized.setCaptivePortalApiUrl(null);
1024 sanitized.setCaptivePortalData(null);
1025 assertEquals(sanitized, parcelingRoundTrip(source));
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001026 }
1027
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001028 // Parceling of the scope was broken until Q-QPR2
1029 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN3a59a922019-12-18 14:47:06 +09001030 public void testLinkLocalDnsServerParceling() throws Exception {
1031 final String strAddress = "fe80::1%lo";
1032 final LinkProperties lp = new LinkProperties();
1033 lp.addDnsServer(address(strAddress));
1034 final LinkProperties unparceled = parcelingRoundTrip(lp);
1035 // Inet6Address#equals does not test for the scope id
1036 assertEquals(strAddress, unparceled.getDnsServers().get(0).getHostAddress());
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001037 }
Chalard Jean299d8562018-04-11 16:36:41 +09001038
Lorenzo Colitti1d3bf3d2019-01-15 11:25:56 +09001039 @Test
1040 public void testParcelUninitialized() throws Exception {
1041 LinkProperties empty = new LinkProperties();
Chalard Jeanaf718362019-05-30 17:11:14 +09001042 assertParcelingIsLossless(empty);
Chalard Jean299d8562018-04-11 16:36:41 +09001043 }
paulhu9f7636c2019-05-02 17:43:28 +08001044
1045 @Test
1046 public void testConstructor() {
1047 LinkProperties lp = new LinkProperties();
1048 checkEmpty(lp);
1049 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1050 assertLinkPropertiesEqual(lp, new LinkProperties());
1051
1052 lp = makeTestObject();
1053 assertLinkPropertiesEqual(lp, new LinkProperties(lp));
1054 }
1055
1056 @Test
1057 public void testDnsServers() {
1058 final LinkProperties lp = new LinkProperties();
1059 final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2);
1060 lp.setDnsServers(dnsServers);
1061 assertEquals(2, lp.getDnsServers().size());
1062 assertEquals(DNS1, lp.getDnsServers().get(0));
1063 assertEquals(DNS2, lp.getDnsServers().get(1));
1064
1065 lp.removeDnsServer(DNS1);
1066 assertEquals(1, lp.getDnsServers().size());
1067 assertEquals(DNS2, lp.getDnsServers().get(0));
1068
1069 lp.addDnsServer(DNS6);
1070 assertEquals(2, lp.getDnsServers().size());
1071 assertEquals(DNS2, lp.getDnsServers().get(0));
1072 assertEquals(DNS6, lp.getDnsServers().get(1));
1073 }
1074
1075 @Test
1076 public void testValidatedPrivateDnsServers() {
1077 final LinkProperties lp = new LinkProperties();
1078 final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2);
1079 lp.setValidatedPrivateDnsServers(privDnsServers);
1080 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1081 assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0));
1082 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1));
1083
1084 lp.removeValidatedPrivateDnsServer(PRIVDNS1);
1085 assertEquals(1, lp.getValidatedPrivateDnsServers().size());
1086 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1087
1088 lp.addValidatedPrivateDnsServer(PRIVDNS6);
1089 assertEquals(2, lp.getValidatedPrivateDnsServers().size());
1090 assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0));
1091 assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1));
1092 }
1093
1094 @Test
1095 public void testPcscfServers() {
1096 final LinkProperties lp = new LinkProperties();
1097 final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4);
1098 lp.setPcscfServers(pcscfServers);
1099 assertEquals(1, lp.getPcscfServers().size());
1100 assertEquals(PCSCFV4, lp.getPcscfServers().get(0));
1101
1102 lp.removePcscfServer(PCSCFV4);
1103 assertEquals(0, lp.getPcscfServers().size());
1104
1105 lp.addPcscfServer(PCSCFV6);
1106 assertEquals(1, lp.getPcscfServers().size());
1107 assertEquals(PCSCFV6, lp.getPcscfServers().get(0));
1108 }
1109
1110 @Test
1111 public void testTcpBufferSizes() {
1112 final LinkProperties lp = makeTestObject();
1113 assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes());
1114
1115 lp.setTcpBufferSizes(null);
1116 assertNull(lp.getTcpBufferSizes());
1117 }
1118
1119 @Test
1120 public void testHasIpv6DefaultRoute() {
1121 final LinkProperties lp = makeTestObject();
1122 assertFalse(lp.hasIPv6DefaultRoute());
1123
1124 lp.addRoute(new RouteInfo(GATEWAY61));
1125 assertTrue(lp.hasIPv6DefaultRoute());
1126 }
1127
1128 @Test
1129 public void testHttpProxy() {
1130 final LinkProperties lp = makeTestObject();
1131 assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888)));
1132 }
1133
1134 @Test
1135 public void testPrivateDnsServerName() {
1136 final LinkProperties lp = makeTestObject();
1137 assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName());
1138
1139 lp.setPrivateDnsServerName(null);
1140 assertNull(lp.getPrivateDnsServerName());
1141 }
1142
1143 @Test
1144 public void testUsePrivateDns() {
1145 final LinkProperties lp = makeTestObject();
1146 assertTrue(lp.isPrivateDnsActive());
1147
1148 lp.clear();
1149 assertFalse(lp.isPrivateDnsActive());
1150 }
Valentin Iftime9fa35092019-09-24 13:32:13 +02001151
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001152 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Lorenzo Colitti279a1d62020-01-06 19:43:59 +09001153 public void testDhcpServerAddress() {
1154 final LinkProperties lp = makeTestObject();
1155 assertEquals(DHCPSERVER, lp.getDhcpServerAddress());
1156
1157 lp.clear();
1158 assertNull(lp.getDhcpServerAddress());
1159 }
1160
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001161 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Valentin Iftime9fa35092019-09-24 13:32:13 +02001162 public void testWakeOnLanSupported() {
1163 final LinkProperties lp = makeTestObject();
1164 assertTrue(lp.isWakeOnLanSupported());
1165
1166 lp.clear();
1167 assertFalse(lp.isWakeOnLanSupported());
1168 }
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001169
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001170 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001171 public void testCaptivePortalApiUrl() {
1172 final LinkProperties lp = makeTestObject();
1173 assertEquals(CAPPORT_API_URL, lp.getCaptivePortalApiUrl());
1174
1175 lp.clear();
1176 assertNull(lp.getCaptivePortalApiUrl());
1177 }
1178
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001179 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001180 public void testCaptivePortalData() {
1181 final LinkProperties lp = makeTestObject();
Remi NGUYEN VAN3994e732020-03-09 11:52:33 +09001182 assertEquals(getCaptivePortalData(), lp.getCaptivePortalData());
Remi NGUYEN VAN0a65eed2019-12-17 16:45:42 +09001183
1184 lp.clear();
1185 assertNull(lp.getCaptivePortalData());
1186 }
lucaslin55c6a842020-03-26 19:15:11 +08001187
1188 private LinkProperties makeIpv4LinkProperties() {
1189 final LinkProperties linkProperties = new LinkProperties();
1190 linkProperties.setInterfaceName(NAME);
1191 linkProperties.addLinkAddress(LINKADDRV4);
1192 linkProperties.addDnsServer(DNS1);
1193 linkProperties.addRoute(new RouteInfo(GATEWAY1));
1194 linkProperties.addRoute(new RouteInfo(GATEWAY2));
1195 return linkProperties;
1196 }
1197
1198 private LinkProperties makeIpv6LinkProperties() {
1199 final LinkProperties linkProperties = new LinkProperties();
1200 linkProperties.setInterfaceName(NAME);
1201 linkProperties.addLinkAddress(LINKADDRV6);
1202 linkProperties.addDnsServer(DNS6);
1203 linkProperties.addRoute(new RouteInfo(GATEWAY61));
1204 linkProperties.addRoute(new RouteInfo(GATEWAY62));
1205 return linkProperties;
1206 }
1207
1208 @Test
1209 public void testHasIpv4DefaultRoute() {
1210 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1211 assertTrue(Ipv4.hasIpv4DefaultRoute());
1212 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1213 assertFalse(Ipv6.hasIpv4DefaultRoute());
1214 }
1215
1216 @Test
1217 public void testHasIpv4DnsServer() {
1218 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1219 assertTrue(Ipv4.hasIpv4DnsServer());
1220 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1221 assertFalse(Ipv6.hasIpv4DnsServer());
1222 }
1223
1224 @Test
1225 public void testHasIpv6DnsServer() {
1226 final LinkProperties Ipv4 = makeIpv4LinkProperties();
1227 assertFalse(Ipv4.hasIpv6DnsServer());
1228 final LinkProperties Ipv6 = makeIpv6LinkProperties();
1229 assertTrue(Ipv6.hasIpv6DnsServer());
1230 }
Rubin Xuab8cf302020-03-30 14:37:05 +01001231
1232 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1233 public void testHasIpv4UnreachableDefaultRoute() {
1234 final LinkProperties lp = makeTestObject();
1235 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1236 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1237
1238 lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE));
1239 assertTrue(lp.hasIpv4UnreachableDefaultRoute());
1240 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1241 }
1242
1243 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1244 public void testHasIpv6UnreachableDefaultRoute() {
1245 final LinkProperties lp = makeTestObject();
1246 assertFalse(lp.hasIpv6UnreachableDefaultRoute());
1247 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1248
1249 lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE));
1250 assertTrue(lp.hasIpv6UnreachableDefaultRoute());
1251 assertFalse(lp.hasIpv4UnreachableDefaultRoute());
1252 }
Rubin Xubc4c5ca2020-06-11 16:40:13 +01001253
1254 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
1255 public void testRouteAddWithSameKey() throws Exception {
1256 LinkProperties lp = new LinkProperties();
1257 lp.setInterfaceName("wlan0");
1258 final IpPrefix v6 = new IpPrefix("64:ff9b::/96");
1259 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1280));
1260 assertEquals(1, lp.getRoutes().size());
1261 lp.addRoute(new RouteInfo(v6, address("fe80::1"), "wlan0", RTN_UNICAST, 1500));
1262 assertEquals(1, lp.getRoutes().size());
1263 final IpPrefix v4 = new IpPrefix("192.0.2.128/25");
1264 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_UNICAST, 1460));
1265 assertEquals(2, lp.getRoutes().size());
1266 lp.addRoute(new RouteInfo(v4, address("192.0.2.1"), "wlan0", RTN_THROW, 1460));
1267 assertEquals(2, lp.getRoutes().size());
1268 }
John Wang3e567d52011-04-04 12:35:42 -07001269}