Make PRIORITIZE_* networks non-default

As a specialized network, a network with PRIORITIZE_* is not
generally a good default network, and might cause unexpected
charges if allowed to become one.

Test: CSDefaultNetworkTests
Change-Id: I8f7184f80bb987da720bd067862bd7a546a38e26
diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java
index ea6d37e..1d87121 100755
--- a/service/src/com/android/server/ConnectivityService.java
+++ b/service/src/com/android/server/ConnectivityService.java
@@ -79,6 +79,8 @@
 import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
 import static android.net.NetworkCapabilities.NET_ENTERPRISE_ID_1;
@@ -1923,6 +1925,8 @@
         final NetworkCapabilities netCap = new NetworkCapabilities();
         netCap.addCapability(NET_CAPABILITY_INTERNET);
         netCap.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED);
+        netCap.addForbiddenCapability(NET_CAPABILITY_PRIORITIZE_LATENCY);
+        netCap.addForbiddenCapability(NET_CAPABILITY_PRIORITIZE_BANDWIDTH);
         netCap.setRequestorUidAndPackageName(Process.myUid(), mContext.getPackageName());
         if (transportType > TYPE_NONE) {
             netCap.addTransportType(transportType);
diff --git a/tests/unit/java/com/android/server/connectivityservice/CSDefaultNetworkTest.kt b/tests/unit/java/com/android/server/connectivityservice/CSDefaultNetworkTest.kt
new file mode 100644
index 0000000..4d214d0
--- /dev/null
+++ b/tests/unit/java/com/android/server/connectivityservice/CSDefaultNetworkTest.kt
@@ -0,0 +1,78 @@
+package com.android.server.connectivityservice
+
+import android.net.NetworkCapabilities
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED
+import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED
+import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
+import android.net.NetworkRequest
+import android.os.Build
+import com.android.server.CSTest
+import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
+import com.android.testutils.DevSdkIgnoreRunner
+import com.android.testutils.RecorderCallback.CallbackEntry.Lost
+import com.android.testutils.TestableNetworkCallback
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.test.assertNull
+import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET as NET_CAP_INTERNET
+import android.net.NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH as NET_CAP_PRIO_BW
+
+private fun netCaps(transport: Int, vararg cap: Int): NetworkCapabilities =
+        NetworkCapabilities.Builder().apply {
+            addTransportType(transport)
+            // Standard caps that everybody in this test file needs
+            addCapability(NET_CAPABILITY_NOT_SUSPENDED)
+            addCapability(NET_CAPABILITY_NOT_VCN_MANAGED)
+            addCapability(NET_CAPABILITY_NOT_RESTRICTED)
+            cap.forEach { addCapability(it) }
+        }.build()
+
+@RunWith(DevSdkIgnoreRunner::class)
+@IgnoreUpTo(Build.VERSION_CODES.R)
+class CSDefaultNetworkTest : CSTest() {
+    @Test
+    fun testSlicesAreNotDefault() {
+        val keepSliceUpRequest = NetworkRequest.Builder().clearCapabilities()
+                .addCapability(NET_CAP_PRIO_BW)
+                .build()
+        val keepSliceUpCb = TestableNetworkCallback()
+        cm.requestNetwork(keepSliceUpRequest, keepSliceUpCb)
+
+        val nonSlice = Agent(nc = netCaps(TRANSPORT_CELLULAR, NET_CAP_INTERNET))
+        val slice = Agent(nc = netCaps(TRANSPORT_CELLULAR, NET_CAP_INTERNET, NET_CAP_PRIO_BW))
+
+        val allCb = TestableNetworkCallback()
+        val bestCb = TestableNetworkCallback()
+        val defaultCb = TestableNetworkCallback()
+        val allNetRequest = NetworkRequest.Builder().clearCapabilities().build()
+        cm.registerNetworkCallback(allNetRequest, allCb)
+        cm.registerBestMatchingNetworkCallback(allNetRequest, bestCb, csHandler)
+        cm.registerDefaultNetworkCallback(defaultCb)
+        nonSlice.connect()
+
+        allCb.expectAvailableCallbacks(nonSlice.network, validated = false)
+        keepSliceUpCb.assertNoCallback()
+        bestCb.expectAvailableCallbacks(nonSlice.network, validated = false)
+        defaultCb.expectAvailableCallbacks(nonSlice.network, validated = false)
+
+        slice.connect()
+        allCb.expectAvailableCallbacks(slice.network, validated = false)
+        keepSliceUpCb.expectAvailableCallbacks(slice.network, validated = false)
+        bestCb.assertNoCallback()
+        defaultCb.assertNoCallback()
+
+        nonSlice.disconnect()
+        allCb.expect<Lost>(nonSlice.network)
+        bestCb.expect<Lost>(nonSlice.network)
+        bestCb.expectAvailableCallbacks(slice.network, validated = false)
+        defaultCb.expect<Lost>(nonSlice.network)
+
+        allCb.assertNoCallback()
+        keepSliceUpCb.assertNoCallback()
+        bestCb.assertNoCallback()
+        defaultCb.assertNoCallback()
+
+        assertNull(cm.activeNetwork)
+    }
+}
diff --git a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt
index 4f5cfc0..6f5c2ba 100644
--- a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt
+++ b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt
@@ -116,7 +116,8 @@
     init {
         if (!SdkLevel.isAtLeastS()) {
             throw UnsupportedApiLevelException("CSTest subclasses must be annotated to only " +
-                    "run on S+, e.g. @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)")
+                    "run on S+, e.g. @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) and " +
+                    "@RunWith(DevSdkIgnoreRunner::class)")
         }
     }