• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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