From 651a95f1265ced4dfa3d2f3e3706f529b70b1ef2 Mon Sep 17 00:00:00 2001 From: junyulai Date: Thu, 14 Jan 2021 21:22:40 +0800 Subject: [PATCH] [VCN07.1] Add test for bypassing VCN for non-internet request This is a re-upload that combines aosp/1550755 and aosp/1579872. Test: atest NetworkRequestTest#testBypassingVcnForNonInternetRequest Test: atest CtsNetTestCasesLatestSdk on R device Bug: 175662146 Change-Id: I2fdc2418339bef30c9f816d63418bba218abf4a1 --- .../src/android/net/cts/NetworkAgentTest.kt | 8 ++ .../android/net/cts/NetworkRequestTest.java | 100 +++++++++++++++++- 2 files changed, 105 insertions(+), 3 deletions(-) diff --git a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt index aea33cad54..1046b5059a 100644 --- a/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt +++ b/tests/cts/net/src/android/net/cts/NetworkAgentTest.kt @@ -35,6 +35,7 @@ import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED +import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN import android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED @@ -67,6 +68,7 @@ import android.util.DebugUtils.valueToString import androidx.test.InstrumentationRegistry import com.android.connectivity.aidl.INetworkAgent import com.android.connectivity.aidl.INetworkAgentRegistry +import com.android.modules.utils.build.SdkLevel import com.android.net.module.util.ArrayTrackRecord import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo import com.android.testutils.DevSdkIgnoreRunner @@ -321,6 +323,9 @@ class NetworkAgentTest { addCapability(NET_CAPABILITY_NOT_SUSPENDED) addCapability(NET_CAPABILITY_NOT_ROAMING) addCapability(NET_CAPABILITY_NOT_VPN) + if (SdkLevel.isAtLeastS()) { + addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) + } if (null != name) { setNetworkSpecifier(StringNetworkSpecifier(name)) } @@ -558,6 +563,9 @@ class NetworkAgentTest { addTransportType(TRANSPORT_VPN) removeCapability(NET_CAPABILITY_NOT_VPN) setTransportInfo(VpnTransportInfo(VpnManager.TYPE_VPN_SERVICE)) + if (SdkLevel.isAtLeastS()) { + addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) + } } val defaultNetwork = mCM.activeNetwork assertNotNull(defaultNetwork) diff --git a/tests/cts/net/src/android/net/cts/NetworkRequestTest.java b/tests/cts/net/src/android/net/cts/NetworkRequestTest.java index d118c8a0ca..31dc64dd45 100644 --- a/tests/cts/net/src/android/net/cts/NetworkRequestTest.java +++ b/tests/cts/net/src/android/net/cts/NetworkRequestTest.java @@ -16,8 +16,13 @@ package android.net.cts; +import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; +import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; +import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; +import static android.net.NetworkCapabilities.NET_CAPABILITY_SUPL; import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED; import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; @@ -29,6 +34,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import android.annotation.NonNull; import android.net.MacAddress; import android.net.MatchAllNetworkSpecifier; import android.net.NetworkCapabilities; @@ -43,6 +49,7 @@ import android.util.ArraySet; import androidx.test.runner.AndroidJUnit4; +import com.android.modules.utils.build.SdkLevel; import com.android.testutils.DevSdkIgnoreRule; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; @@ -152,29 +159,44 @@ public class NetworkRequestTest { .getRequestorPackageName()); } + private void addNotVcnManagedCapability(@NonNull NetworkCapabilities nc) { + if (SdkLevel.isAtLeastS()) { + nc.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); + } + } + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) public void testCanBeSatisfiedBy() { final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */); final LocalNetworkSpecifier specifier2 = new LocalNetworkSpecifier(5678 /* id */); + // Some requests are adding NOT_VCN_MANAGED capability automatically. Add it to the + // capabilities below for bypassing the check. final NetworkCapabilities capCellularMmsInternet = new NetworkCapabilities() .addTransportType(TRANSPORT_CELLULAR) .addCapability(NET_CAPABILITY_MMS) .addCapability(NET_CAPABILITY_INTERNET); + addNotVcnManagedCapability(capCellularMmsInternet); final NetworkCapabilities capCellularVpnMmsInternet = new NetworkCapabilities(capCellularMmsInternet).addTransportType(TRANSPORT_VPN); + addNotVcnManagedCapability(capCellularVpnMmsInternet); final NetworkCapabilities capCellularMmsInternetSpecifier1 = new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier1); + addNotVcnManagedCapability(capCellularMmsInternetSpecifier1); final NetworkCapabilities capVpnInternetSpecifier1 = new NetworkCapabilities() .addCapability(NET_CAPABILITY_INTERNET) .addTransportType(TRANSPORT_VPN) .setNetworkSpecifier(specifier1); + addNotVcnManagedCapability(capVpnInternetSpecifier1); final NetworkCapabilities capCellularMmsInternetMatchallspecifier = new NetworkCapabilities(capCellularMmsInternet) - .setNetworkSpecifier(new MatchAllNetworkSpecifier()); + .setNetworkSpecifier(new MatchAllNetworkSpecifier()); + addNotVcnManagedCapability(capCellularMmsInternetMatchallspecifier); final NetworkCapabilities capCellularMmsInternetSpecifier2 = - new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier2); + new NetworkCapabilities(capCellularMmsInternet) + .setNetworkSpecifier(specifier2); + addNotVcnManagedCapability(capCellularMmsInternetSpecifier2); final NetworkRequest requestCellularInternetSpecifier1 = new NetworkRequest.Builder() .addTransportType(TRANSPORT_CELLULAR) @@ -239,7 +261,8 @@ public class NetworkRequestTest { final NetworkCapabilities capCellInternetBWSpecifier1Signal = new NetworkCapabilities.Builder(capCellInternetBWSpecifier1) - .setSignalStrength(-123).build(); + .setSignalStrength(-123).build(); + addNotVcnManagedCapability(capCellInternetBWSpecifier1Signal); assertCorrectlySatisfies(true, requestCombination, capCellInternetBWSpecifier1Signal); @@ -273,4 +296,75 @@ public class NetworkRequestTest { assertEquals(Process.INVALID_UID, new NetworkRequest.Builder() .clearCapabilities().build().getRequestorUid()); } + + // TODO: 1. Refactor test cases with helper method. + // 2. Test capability that does not yet exist. + @Test @IgnoreUpTo(Build.VERSION_CODES.R) + public void testBypassingVcnForNonInternetRequest() { + // Make an empty request. Verify the NOT_VCN_MANAGED is added. + final NetworkRequest emptyRequest = new NetworkRequest.Builder().build(); + assertTrue(emptyRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a request explicitly add NOT_VCN_MANAGED. Verify the NOT_VCN_MANAGED is preserved. + final NetworkRequest mmsAddNotVcnRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_MMS) + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) + .build(); + assertTrue(mmsAddNotVcnRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Similar to above, but the opposite order. + final NetworkRequest mmsAddNotVcnRequest2 = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) + .addCapability(NET_CAPABILITY_MMS) + .build(); + assertTrue(mmsAddNotVcnRequest2.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a request explicitly remove NOT_VCN_MANAGED. Verify the NOT_VCN_MANAGED is removed. + final NetworkRequest removeNotVcnRequest = new NetworkRequest.Builder() + .removeCapability(NET_CAPABILITY_NOT_VCN_MANAGED).build(); + assertFalse(removeNotVcnRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a request add some capability inside VCN supported capabilities. + // Verify the NOT_VCN_MANAGED is added. + final NetworkRequest notRoamRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_NOT_ROAMING).build(); + assertTrue(notRoamRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a internet request. Verify the NOT_VCN_MANAGED is added. + final NetworkRequest internetRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_INTERNET).build(); + assertTrue(internetRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a internet request which explicitly removed NOT_VCN_MANAGED. + // Verify the NOT_VCN_MANAGED is removed. + final NetworkRequest internetRemoveNotVcnRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_INTERNET) + .removeCapability(NET_CAPABILITY_NOT_VCN_MANAGED).build(); + assertFalse(internetRemoveNotVcnRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a normal MMS request. Verify the request could bypass VCN. + final NetworkRequest mmsRequest = + new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build(); + assertFalse(mmsRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a SUPL request along with internet. Verify NOT_VCN_MANAGED is not added since + // SUPL is not in the supported list. + final NetworkRequest suplWithInternetRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_SUPL) + .addCapability(NET_CAPABILITY_INTERNET).build(); + assertFalse(suplWithInternetRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a FOTA request with explicitly add NOT_VCN_MANAGED capability. Verify + // NOT_VCN_MANAGED is preserved. + final NetworkRequest fotaRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_FOTA) + .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED).build(); + assertTrue(fotaRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + + // Make a DUN request, which is in {@code VCN_SUPPORTED_CAPABILITIES}. + // Verify NOT_VCN_MANAGED is preserved. + final NetworkRequest dunRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_DUN).build(); + assertTrue(dunRequest.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED)); + } }