1 /* 2 * Copyright (C) 2018 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 17 package android.net.cts; 18 19 import static android.net.ConnectivityManager.TYPE_NONE; 20 import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; 21 import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA; 22 import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; 23 import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS; 24 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; 25 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; 26 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; 27 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; 28 import static android.net.NetworkCapabilities.NET_CAPABILITY_SUPL; 29 import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED; 30 import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED; 31 import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH; 32 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; 33 import static android.net.NetworkCapabilities.TRANSPORT_VPN; 34 import static android.net.NetworkCapabilities.TRANSPORT_WIFI; 35 36 import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; 37 import static com.google.common.truth.Truth.assertThat; 38 39 import static junit.framework.Assert.fail; 40 41 import static org.junit.Assert.assertArrayEquals; 42 import static org.junit.Assert.assertEquals; 43 import static org.junit.Assert.assertFalse; 44 import static org.junit.Assert.assertNotEquals; 45 import static org.junit.Assert.assertNull; 46 import static org.junit.Assert.assertThrows; 47 import static org.junit.Assert.assertTrue; 48 import static org.junit.Assume.assumeTrue; 49 50 import android.annotation.NonNull; 51 import android.net.MacAddress; 52 import android.net.MatchAllNetworkSpecifier; 53 import android.net.NetworkCapabilities; 54 import android.net.NetworkRequest; 55 import android.net.NetworkSpecifier; 56 import android.net.wifi.WifiNetworkSpecifier; 57 import android.os.Build; 58 import android.os.PatternMatcher; 59 import android.os.Process; 60 import android.util.ArraySet; 61 import android.util.Range; 62 63 import androidx.test.runner.AndroidJUnit4; 64 65 import com.android.modules.utils.build.SdkLevel; 66 import com.android.networkstack.apishim.ConstantsShim; 67 import com.android.networkstack.apishim.NetworkRequestShimImpl; 68 import com.android.networkstack.apishim.common.NetworkRequestShim; 69 import com.android.networkstack.apishim.common.UnsupportedApiLevelException; 70 import com.android.testutils.ConnectivityModuleTest; 71 import com.android.testutils.DevSdkIgnoreRule; 72 import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter; 73 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; 74 75 import org.junit.Rule; 76 import org.junit.Test; 77 import org.junit.runner.RunWith; 78 79 import java.util.Set; 80 81 @RunWith(AndroidJUnit4.class) 82 @ConnectivityModuleTest 83 public class NetworkRequestTest { 84 @Rule 85 public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule(); 86 87 private static final String TEST_SSID = "TestSSID"; 88 private static final String OTHER_SSID = "OtherSSID"; 89 private static final int TEST_UID = 2097; 90 private static final String TEST_PACKAGE_NAME = "test.package.name"; 91 private static final MacAddress ARBITRARY_ADDRESS = MacAddress.fromString("3:5:8:12:9:2"); 92 93 private class LocalNetworkSpecifier extends NetworkSpecifier { 94 private final int mId; 95 LocalNetworkSpecifier(int id)96 LocalNetworkSpecifier(int id) { 97 mId = id; 98 } 99 100 @Override canBeSatisfiedBy(NetworkSpecifier other)101 public boolean canBeSatisfiedBy(NetworkSpecifier other) { 102 return other instanceof LocalNetworkSpecifier 103 && mId == ((LocalNetworkSpecifier) other).mId; 104 } 105 } 106 107 @IgnoreUpTo(Build.VERSION_CODES.R) 108 @Test testParceling()109 public void testParceling() { 110 NetworkCapabilities nc = new NetworkCapabilities.Builder().build(); 111 NetworkRequest request = new NetworkRequest(nc, TYPE_NONE, 42 /* rId */, 112 NetworkRequest.Type.RESERVATION); 113 114 assertParcelingIsLossless(request); 115 } 116 117 @Test testCapabilities()118 public void testCapabilities() { 119 assertTrue(new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build() 120 .hasCapability(NET_CAPABILITY_MMS)); 121 assertFalse(new NetworkRequest.Builder().removeCapability(NET_CAPABILITY_MMS).build() 122 .hasCapability(NET_CAPABILITY_MMS)); 123 124 final NetworkRequest nr = new NetworkRequest.Builder().clearCapabilities().build(); 125 // Verify request has no capabilities 126 verifyNoCapabilities(nr); 127 } 128 129 @Test @IgnoreUpTo(Build.VERSION_CODES.R) testForbiddenCapabilities()130 public void testForbiddenCapabilities() { 131 final NetworkRequest.Builder builder = new NetworkRequest.Builder(); 132 builder.addForbiddenCapability(NET_CAPABILITY_MMS); 133 assertTrue(builder.build().hasForbiddenCapability(NET_CAPABILITY_MMS)); 134 builder.removeForbiddenCapability(NET_CAPABILITY_MMS); 135 assertFalse(builder.build().hasCapability(NET_CAPABILITY_MMS)); 136 builder.addCapability(NET_CAPABILITY_MMS); 137 assertFalse(builder.build().hasForbiddenCapability(NET_CAPABILITY_MMS)); 138 assertTrue(builder.build().hasCapability(NET_CAPABILITY_MMS)); 139 builder.addForbiddenCapability(NET_CAPABILITY_MMS); 140 assertTrue(builder.build().hasForbiddenCapability(NET_CAPABILITY_MMS)); 141 assertFalse(builder.build().hasCapability(NET_CAPABILITY_MMS)); 142 builder.clearCapabilities(); 143 verifyNoCapabilities(builder.build()); 144 } 145 146 @Test testTemporarilyNotMeteredCapability()147 public void testTemporarilyNotMeteredCapability() { 148 assertTrue(new NetworkRequest.Builder() 149 .addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED).build() 150 .hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); 151 assertFalse(new NetworkRequest.Builder() 152 .removeCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED).build() 153 .hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); 154 } 155 verifyNoCapabilities(NetworkRequest nr)156 private void verifyNoCapabilities(NetworkRequest nr) { 157 // NetworkCapabilities.mNetworkCapabilities is defined as type long 158 final int MAX_POSSIBLE_CAPABILITY = Long.SIZE; 159 for(int bit = 0; bit < MAX_POSSIBLE_CAPABILITY; bit++) { 160 assertFalse(nr.hasCapability(bit)); 161 } 162 } 163 164 @Test testTransports()165 public void testTransports() { 166 assertTrue(new NetworkRequest.Builder().addTransportType(TRANSPORT_BLUETOOTH).build() 167 .hasTransport(TRANSPORT_BLUETOOTH)); 168 assertFalse(new NetworkRequest.Builder().removeTransportType(TRANSPORT_BLUETOOTH).build() 169 .hasTransport(TRANSPORT_BLUETOOTH)); 170 } 171 172 @Test testSpecifier()173 public void testSpecifier() { 174 assertNull(new NetworkRequest.Builder().build().getNetworkSpecifier()); 175 final WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() 176 .setSsidPattern(new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL)) 177 .setBssidPattern(ARBITRARY_ADDRESS, ARBITRARY_ADDRESS) 178 .build(); 179 final NetworkSpecifier obtainedSpecifier = new NetworkRequest.Builder() 180 .addTransportType(TRANSPORT_WIFI) 181 .setNetworkSpecifier(specifier) 182 .build() 183 .getNetworkSpecifier(); 184 assertEquals(obtainedSpecifier, specifier); 185 186 assertNull(new NetworkRequest.Builder() 187 .clearCapabilities() 188 .build() 189 .getNetworkSpecifier()); 190 } 191 192 @Test 193 @IgnoreUpTo(Build.VERSION_CODES.S) testSubscriptionIds()194 public void testSubscriptionIds() { 195 int[] subIds = {1, 2}; 196 assertTrue( 197 new NetworkRequest.Builder().build() 198 .getSubscriptionIds().isEmpty()); 199 assertThat(new NetworkRequest.Builder() 200 .setSubscriptionIds(Set.of(subIds[0], subIds[1])) 201 .build() 202 .getSubscriptionIds()) 203 .containsExactly(subIds[0], subIds[1]); 204 } 205 206 @Test testRequestorPackageName()207 public void testRequestorPackageName() { 208 assertNull(new NetworkRequest.Builder().build().getRequestorPackageName()); 209 final String pkgName = "android.net.test"; 210 final NetworkCapabilities nc = new NetworkCapabilities.Builder() 211 .setRequestorPackageName(pkgName) 212 .build(); 213 final NetworkRequest nr = new NetworkRequest.Builder() 214 .setCapabilities(nc) 215 .build(); 216 assertEquals(pkgName, nr.getRequestorPackageName()); 217 assertNull(new NetworkRequest.Builder() 218 .clearCapabilities() 219 .build() 220 .getRequestorPackageName()); 221 } 222 addNotVcnManagedCapability(@onNull NetworkCapabilities nc)223 private void addNotVcnManagedCapability(@NonNull NetworkCapabilities nc) { 224 if (SdkLevel.isAtLeastS()) { 225 nc.addCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED); 226 } 227 } 228 229 @Test testCanBeSatisfiedBy()230 public void testCanBeSatisfiedBy() { 231 final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */); 232 final LocalNetworkSpecifier specifier2 = new LocalNetworkSpecifier(5678 /* id */); 233 234 // Some requests are adding NOT_VCN_MANAGED capability automatically. Add it to the 235 // capabilities below for bypassing the check. 236 final NetworkCapabilities capCellularMmsInternet = new NetworkCapabilities() 237 .addTransportType(TRANSPORT_CELLULAR) 238 .addCapability(NET_CAPABILITY_MMS) 239 .addCapability(NET_CAPABILITY_INTERNET); 240 addNotVcnManagedCapability(capCellularMmsInternet); 241 final NetworkCapabilities capCellularVpnMmsInternet = 242 new NetworkCapabilities(capCellularMmsInternet).addTransportType(TRANSPORT_VPN); 243 addNotVcnManagedCapability(capCellularVpnMmsInternet); 244 final NetworkCapabilities capCellularMmsInternetSpecifier1 = 245 new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier1); 246 addNotVcnManagedCapability(capCellularMmsInternetSpecifier1); 247 final NetworkCapabilities capVpnInternetSpecifier1 = new NetworkCapabilities() 248 .addCapability(NET_CAPABILITY_INTERNET) 249 .addTransportType(TRANSPORT_VPN) 250 .setNetworkSpecifier(specifier1); 251 addNotVcnManagedCapability(capVpnInternetSpecifier1); 252 final NetworkCapabilities capCellularMmsInternetMatchallspecifier = 253 new NetworkCapabilities(capCellularMmsInternet) 254 .setNetworkSpecifier(new MatchAllNetworkSpecifier()); 255 addNotVcnManagedCapability(capCellularMmsInternetMatchallspecifier); 256 final NetworkCapabilities capCellularMmsInternetSpecifier2 = 257 new NetworkCapabilities(capCellularMmsInternet) 258 .setNetworkSpecifier(specifier2); 259 addNotVcnManagedCapability(capCellularMmsInternetSpecifier2); 260 261 final NetworkRequest requestCellularInternetSpecifier1 = new NetworkRequest.Builder() 262 .addTransportType(TRANSPORT_CELLULAR) 263 .addCapability(NET_CAPABILITY_INTERNET) 264 .setNetworkSpecifier(specifier1) 265 .build(); 266 assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(null)); 267 assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(new NetworkCapabilities())); 268 assertTrue(requestCellularInternetSpecifier1.canBeSatisfiedBy( 269 capCellularMmsInternetMatchallspecifier)); 270 assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(capCellularMmsInternet)); 271 assertTrue(requestCellularInternetSpecifier1.canBeSatisfiedBy( 272 capCellularMmsInternetSpecifier1)); 273 assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(capCellularVpnMmsInternet)); 274 assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy( 275 capCellularMmsInternetSpecifier2)); 276 277 final NetworkRequest requestCellularInternet = new NetworkRequest.Builder() 278 .addTransportType(TRANSPORT_CELLULAR) 279 .addCapability(NET_CAPABILITY_INTERNET) 280 .build(); 281 assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternet)); 282 assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternetSpecifier1)); 283 assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternetSpecifier2)); 284 assertFalse(requestCellularInternet.canBeSatisfiedBy(capVpnInternetSpecifier1)); 285 assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularVpnMmsInternet)); 286 } 287 setUids(NetworkRequest.Builder builder, Set<Range<Integer>> ranges)288 private void setUids(NetworkRequest.Builder builder, Set<Range<Integer>> ranges) 289 throws UnsupportedApiLevelException { 290 if (SdkLevel.isAtLeastS()) { 291 final NetworkRequestShim networkRequestShim = NetworkRequestShimImpl.newInstance(); 292 networkRequestShim.setUids(builder, ranges); 293 } 294 } 295 296 @Test testInvariantInCanBeSatisfiedBy()297 public void testInvariantInCanBeSatisfiedBy() { 298 // Test invariant that result of NetworkRequest.canBeSatisfiedBy() should be the same with 299 // NetworkCapabilities.satisfiedByNetworkCapabilities(). 300 final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */); 301 final int uid = Process.myUid(); 302 final NetworkRequest.Builder nrBuilder = new NetworkRequest.Builder() 303 .addTransportType(TRANSPORT_CELLULAR) 304 .addCapability(NET_CAPABILITY_INTERNET) 305 .setLinkUpstreamBandwidthKbps(1000) 306 .setNetworkSpecifier(specifier1) 307 .setSignalStrength(-123); 308 309 // The uid ranges should be set into the request, but setUids() takes a set of UidRange 310 // that is hidden and inaccessible from shims. Before, S setUids will be a no-op. But 311 // because NetworkRequest.Builder sets the UID of the request to the current UID, the 312 // request contains the current UID both on S and before S. 313 final Set<Range<Integer>> ranges = new ArraySet<>(); 314 ranges.add(new Range<Integer>(uid, uid)); 315 try { 316 setUids(nrBuilder, ranges); 317 } catch (UnsupportedApiLevelException e) { 318 // Not supported before API31. 319 } 320 final NetworkRequest requestCombination = nrBuilder.build(); 321 322 final NetworkCapabilities capCell = new NetworkCapabilities.Builder() 323 .addTransportType(TRANSPORT_CELLULAR).build(); 324 assertCorrectlySatisfies(false, requestCombination, capCell); 325 326 final NetworkCapabilities capCellInternet = new NetworkCapabilities.Builder(capCell) 327 .addCapability(NET_CAPABILITY_INTERNET).build(); 328 assertCorrectlySatisfies(false, requestCombination, capCellInternet); 329 330 final NetworkCapabilities capCellInternetBW = 331 new NetworkCapabilities.Builder(capCellInternet) 332 .setLinkUpstreamBandwidthKbps(1024).build(); 333 assertCorrectlySatisfies(false, requestCombination, capCellInternetBW); 334 335 final NetworkCapabilities capCellInternetBWSpecifier1 = 336 new NetworkCapabilities.Builder(capCellInternetBW) 337 .setNetworkSpecifier(specifier1).build(); 338 assertCorrectlySatisfies(false, requestCombination, capCellInternetBWSpecifier1); 339 340 final NetworkCapabilities capCellInternetBWSpecifier1Signal = 341 new NetworkCapabilities.Builder(capCellInternetBWSpecifier1) 342 .setSignalStrength(-123).build(); 343 addNotVcnManagedCapability(capCellInternetBWSpecifier1Signal); 344 assertCorrectlySatisfies(true, requestCombination, 345 capCellInternetBWSpecifier1Signal); 346 347 final NetworkCapabilities capCellInternetBWSpecifier1SignalUid = 348 new NetworkCapabilities.Builder(capCellInternetBWSpecifier1Signal) 349 .setOwnerUid(uid) 350 .setAdministratorUids(new int [] {uid}).build(); 351 assertCorrectlySatisfies(true, requestCombination, 352 capCellInternetBWSpecifier1SignalUid); 353 } 354 assertCorrectlySatisfies(boolean expect, NetworkRequest request, NetworkCapabilities nc)355 private void assertCorrectlySatisfies(boolean expect, NetworkRequest request, 356 NetworkCapabilities nc) { 357 assertEquals(expect, request.canBeSatisfiedBy(nc)); 358 assertEquals( 359 request.canBeSatisfiedBy(nc), 360 request.networkCapabilities.satisfiedByNetworkCapabilities(nc)); 361 } 362 uidRangesForUid(int uid)363 private static Set<Range<Integer>> uidRangesForUid(int uid) { 364 final Range<Integer> range = new Range<>(uid, uid); 365 return Set.of(range); 366 } 367 368 @Test testSetIncludeOtherUidNetworks()369 public void testSetIncludeOtherUidNetworks() throws Exception { 370 assumeTrue(TestUtils.shouldTestSApis()); 371 final NetworkRequestShim shim = NetworkRequestShimImpl.newInstance(); 372 373 final NetworkRequest.Builder builder = new NetworkRequest.Builder(); 374 // NetworkRequests have NET_CAPABILITY_NOT_VCN_MANAGED by default. 375 builder.removeCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED); 376 shim.setIncludeOtherUidNetworks(builder, false); 377 final NetworkRequest request = builder.build(); 378 379 final NetworkRequest.Builder otherUidsBuilder = new NetworkRequest.Builder(); 380 otherUidsBuilder.removeCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED); 381 shim.setIncludeOtherUidNetworks(otherUidsBuilder, true); 382 final NetworkRequest otherUidsRequest = otherUidsBuilder.build(); 383 384 assertNotEquals(Process.SYSTEM_UID, Process.myUid()); 385 final NetworkCapabilities ncWithMyUid = new NetworkCapabilities() 386 .setUids(uidRangesForUid(Process.myUid())); 387 final NetworkCapabilities ncWithOtherUid = new NetworkCapabilities() 388 .setUids(uidRangesForUid(Process.SYSTEM_UID)); 389 390 assertTrue(request + " should be satisfied by " + ncWithMyUid, 391 request.canBeSatisfiedBy(ncWithMyUid)); 392 assertTrue(otherUidsRequest + " should be satisfied by " + ncWithMyUid, 393 otherUidsRequest.canBeSatisfiedBy(ncWithMyUid)); 394 assertFalse(request + " should not be satisfied by " + ncWithOtherUid, 395 request.canBeSatisfiedBy(ncWithOtherUid)); 396 assertTrue(otherUidsRequest + " should be satisfied by " + ncWithOtherUid, 397 otherUidsRequest.canBeSatisfiedBy(ncWithOtherUid)); 398 } 399 400 @Test testRequestorUid()401 public void testRequestorUid() { 402 final NetworkCapabilities nc = new NetworkCapabilities(); 403 // Verify default value is INVALID_UID 404 assertEquals(Process.INVALID_UID, new NetworkRequest.Builder() 405 .setCapabilities(nc).build().getRequestorUid()); 406 407 nc.setRequestorUid(1314); 408 final NetworkRequest nr = new NetworkRequest.Builder().setCapabilities(nc).build(); 409 assertEquals(1314, nr.getRequestorUid()); 410 411 assertEquals(Process.INVALID_UID, new NetworkRequest.Builder() 412 .clearCapabilities().build().getRequestorUid()); 413 } 414 415 // TODO: 1. Refactor test cases with helper method. 416 // 2. Test capability that does not yet exist. 417 @Test @IgnoreUpTo(Build.VERSION_CODES.R) testBypassingVcn()418 public void testBypassingVcn() { 419 // Make an empty request. Verify the NOT_VCN_MANAGED is added. 420 final NetworkRequest emptyRequest = new NetworkRequest.Builder().build(); 421 assertTrue(emptyRequest.hasCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 422 423 // Make a request explicitly add NOT_VCN_MANAGED. Verify the NOT_VCN_MANAGED is preserved. 424 final NetworkRequest mmsAddNotVcnRequest = new NetworkRequest.Builder() 425 .addCapability(NET_CAPABILITY_MMS) 426 .addCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED) 427 .build(); 428 assertTrue(mmsAddNotVcnRequest.hasCapability( 429 ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 430 431 // Similar to above, but the opposite order. 432 final NetworkRequest mmsAddNotVcnRequest2 = new NetworkRequest.Builder() 433 .addCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED) 434 .addCapability(NET_CAPABILITY_MMS) 435 .build(); 436 assertTrue(mmsAddNotVcnRequest2.hasCapability( 437 ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 438 439 // Make a request explicitly remove NOT_VCN_MANAGED. Verify the NOT_VCN_MANAGED is removed. 440 final NetworkRequest removeNotVcnRequest = new NetworkRequest.Builder() 441 .removeCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED).build(); 442 assertFalse(removeNotVcnRequest.hasCapability( 443 ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 444 445 // Make a request add some capability inside VCN supported capabilities. 446 // Verify the NOT_VCN_MANAGED is added. 447 final NetworkRequest notRoamRequest = new NetworkRequest.Builder() 448 .addCapability(NET_CAPABILITY_NOT_ROAMING).build(); 449 assertTrue(notRoamRequest.hasCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 450 451 // Make an internet request. Verify the NOT_VCN_MANAGED is added. 452 final NetworkRequest internetRequest = new NetworkRequest.Builder() 453 .addCapability(NET_CAPABILITY_INTERNET).build(); 454 assertTrue(internetRequest.hasCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 455 456 // Make an internet request which explicitly removed NOT_VCN_MANAGED. 457 // Verify the NOT_VCN_MANAGED is removed. 458 final NetworkRequest internetRemoveNotVcnRequest = new NetworkRequest.Builder() 459 .addCapability(NET_CAPABILITY_INTERNET) 460 .removeCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED).build(); 461 assertFalse(internetRemoveNotVcnRequest.hasCapability( 462 ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 463 464 // Make a normal MMS request. Verify the request could bypass VCN. 465 final NetworkRequest mmsRequest = 466 new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build(); 467 assertFalse(mmsRequest.hasCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 468 469 // Make a SUPL request along with internet. Verify NOT_VCN_MANAGED is not added since 470 // SUPL is not in the supported list. 471 final NetworkRequest suplWithInternetRequest = new NetworkRequest.Builder() 472 .addCapability(NET_CAPABILITY_SUPL) 473 .addCapability(NET_CAPABILITY_INTERNET).build(); 474 assertFalse(suplWithInternetRequest.hasCapability( 475 ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 476 477 // Make a FOTA request with explicitly add NOT_VCN_MANAGED capability. Verify 478 // NOT_VCN_MANAGED is preserved. 479 final NetworkRequest fotaRequest = new NetworkRequest.Builder() 480 .addCapability(NET_CAPABILITY_FOTA) 481 .addCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED).build(); 482 assertTrue(fotaRequest.hasCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 483 484 // Make a DUN request, which is in {@code VCN_SUPPORTED_CAPABILITIES}. 485 // Verify NOT_VCN_MANAGED is preserved. 486 final NetworkRequest dunRequest = new NetworkRequest.Builder() 487 .addCapability(NET_CAPABILITY_DUN).build(); 488 assertTrue(dunRequest.hasCapability(ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 489 490 // Make an internet request but with NetworkSpecifier. Verify the NOT_VCN_MANAGED is not 491 // added. 492 final NetworkRequest internetWithSpecifierRequest = new NetworkRequest.Builder() 493 .addTransportType(TRANSPORT_WIFI).addCapability(NET_CAPABILITY_INTERNET) 494 .setNetworkSpecifier(makeTestWifiSpecifier()).build(); 495 assertFalse(internetWithSpecifierRequest.hasCapability( 496 ConstantsShim.NET_CAPABILITY_NOT_VCN_MANAGED)); 497 } 498 verifyEqualRequestBuilt(NetworkRequest orig)499 private void verifyEqualRequestBuilt(NetworkRequest orig) { 500 try { 501 final NetworkRequestShim shim = NetworkRequestShimImpl.newInstance(); 502 final NetworkRequest copy = shim.newBuilder(orig).build(); 503 assertEquals(orig, copy); 504 } catch (UnsupportedApiLevelException e) { 505 fail("NetworkRequestShim.newBuilder should be supported in this SDK version"); 506 } 507 } 508 509 @Test @IgnoreUpTo(Build.VERSION_CODES.R) testGetCapabilities()510 public void testGetCapabilities() { 511 final int[] netCapabilities = new int[] { 512 NET_CAPABILITY_INTERNET, 513 NET_CAPABILITY_NOT_ROAMING }; 514 final NetworkCapabilities.Builder builder = NetworkCapabilities.Builder 515 .withoutDefaultCapabilities(); 516 for (int capability : netCapabilities) builder.addCapability(capability); 517 final NetworkRequest nr = new NetworkRequest.Builder() 518 .clearCapabilities() 519 .setCapabilities(builder.build()) 520 .build(); 521 assertArrayEquals(netCapabilities, nr.getCapabilities()); 522 } 523 524 // Default capabilities and default forbidden capabilities must not be changed on U- because 525 // this could cause the system server crash when there is a module rollback (b/313030307) 526 @Test 527 @IgnoreUpTo(Build.VERSION_CODES.R) @IgnoreAfter(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) testDefaultCapabilities()528 public void testDefaultCapabilities() { 529 final NetworkRequest defaultNR = new NetworkRequest.Builder().build(); 530 531 assertEquals(4, defaultNR.getCapabilities().length); 532 assertTrue(defaultNR.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); 533 assertTrue(defaultNR.hasCapability(NET_CAPABILITY_TRUSTED)); 534 assertTrue(defaultNR.hasCapability(NET_CAPABILITY_NOT_VPN)); 535 assertTrue(defaultNR.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); 536 537 assertEquals(0, defaultNR.getForbiddenCapabilities().length); 538 } 539 540 @Test testBuildRequestFromExistingRequestWithBuilder()541 public void testBuildRequestFromExistingRequestWithBuilder() { 542 assumeTrue(TestUtils.shouldTestSApis()); 543 final NetworkRequest.Builder builder = new NetworkRequest.Builder(); 544 545 final NetworkRequest baseRequest = builder.build(); 546 verifyEqualRequestBuilt(baseRequest); 547 548 final NetworkRequest requestCellMms = builder 549 .addTransportType(TRANSPORT_CELLULAR) 550 .addCapability(NET_CAPABILITY_MMS) 551 .setSignalStrength(-99).build(); 552 verifyEqualRequestBuilt(requestCellMms); 553 554 final NetworkRequest requestWifi = builder 555 .addTransportType(TRANSPORT_WIFI) 556 .removeTransportType(TRANSPORT_CELLULAR) 557 .addCapability(NET_CAPABILITY_INTERNET) 558 .removeCapability(NET_CAPABILITY_MMS) 559 .setNetworkSpecifier(makeTestWifiSpecifier()) 560 .setSignalStrength(-33).build(); 561 verifyEqualRequestBuilt(requestWifi); 562 } 563 makeTestWifiSpecifier()564 private WifiNetworkSpecifier makeTestWifiSpecifier() { 565 return new WifiNetworkSpecifier.Builder() 566 .setSsidPattern(new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL)) 567 .setBssidPattern(ARBITRARY_ADDRESS, ARBITRARY_ADDRESS) 568 .build(); 569 } 570 571 @Test 572 @IgnoreUpTo(Build.VERSION_CODES.R) testNetworkReservation()573 public void testNetworkReservation() { 574 final NetworkCapabilities nc = new NetworkCapabilities(); 575 final NetworkCapabilities blanketOffer = new NetworkCapabilities(nc); 576 blanketOffer.setReservationId(NetworkCapabilities.RES_ID_MATCH_ALL_RESERVATIONS); 577 final NetworkCapabilities specificOffer = new NetworkCapabilities(nc); 578 specificOffer.setReservationId(42); 579 final NetworkCapabilities otherSpecificOffer = new NetworkCapabilities(nc); 580 otherSpecificOffer.setReservationId(43); 581 final NetworkCapabilities regularOffer = new NetworkCapabilities(nc); 582 583 final NetworkRequest reservationNR = new NetworkRequest(new NetworkCapabilities(nc), 584 TYPE_NONE, 42 /* rId */, NetworkRequest.Type.RESERVATION); 585 final NetworkRequest requestNR = new NetworkRequest(new NetworkCapabilities(nc), 586 TYPE_NONE, 42 /* rId */, NetworkRequest.Type.REQUEST); 587 588 assertTrue(reservationNR.canBeSatisfiedBy(blanketOffer)); 589 assertTrue(reservationNR.canBeSatisfiedBy(specificOffer)); 590 assertFalse(reservationNR.canBeSatisfiedBy(otherSpecificOffer)); 591 assertFalse(reservationNR.canBeSatisfiedBy(regularOffer)); 592 593 assertFalse(requestNR.canBeSatisfiedBy(blanketOffer)); 594 assertTrue(requestNR.canBeSatisfiedBy(specificOffer)); 595 assertTrue(requestNR.canBeSatisfiedBy(otherSpecificOffer)); 596 assertTrue(requestNR.canBeSatisfiedBy(regularOffer)); 597 } 598 599 @Test 600 @IgnoreUpTo(Build.VERSION_CODES.R) testNetworkRequest_throwsWhenPassingCapsWithReservationId()601 public void testNetworkRequest_throwsWhenPassingCapsWithReservationId() { 602 final NetworkCapabilities capsWithResId = new NetworkCapabilities(); 603 capsWithResId.setReservationId(42); 604 605 assertThrows(IllegalArgumentException.class, () -> { 606 new NetworkRequest(capsWithResId, TYPE_NONE, 42 /* rId */, NetworkRequest.Type.REQUEST); 607 }); 608 } 609 } 610