From eb66389d6af3f995eecff5bddc3e0e340253a71d Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Sat, 7 Oct 2023 15:17:07 +0900 Subject: [PATCH] Allow for mocking an SDK in the tests Test: in followup patches Change-Id: I540ce2a455c92be52eb94fbd4b54a2081d04d25e --- .../android/server/ConnectivityService.java | 6 +++ .../server/connectivityservice/base/CSTest.kt | 44 +++++++++++-------- .../connectivityservice/base/CSTestHelpers.kt | 23 ++++++++++ 3 files changed, 55 insertions(+), 18 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 01ffb03b50..ea4d82ab78 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -97,12 +97,14 @@ import static android.os.Process.VPN_UID; import static android.system.OsConstants.ETH_P_ALL; import static android.system.OsConstants.IPPROTO_TCP; import static android.system.OsConstants.IPPROTO_UDP; + import static com.android.net.module.util.NetworkMonitorUtils.isPrivateDnsValidationRequired; import static com.android.net.module.util.PermissionUtils.checkAnyPermissionOf; import static com.android.net.module.util.PermissionUtils.enforceAnyPermissionOf; import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermission; import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermissionOr; import static com.android.server.ConnectivityStatsLog.CONNECTIVITY_STATE_SAMPLE; + import static java.util.Map.Entry; import android.Manifest; @@ -1315,6 +1317,10 @@ public class ConnectivityService extends IConnectivityManager.Stub return SdkLevel.isAtLeastU(); } + public boolean isAtLeastV() { + return SdkLevel.isAtLeastV(); + } + /** * Get system properties to use in ConnectivityService. */ 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 94242b187c..6f9cd076e4 100644 --- a/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt +++ b/tests/unit/java/com/android/server/connectivityservice/base/CSTest.kt @@ -26,19 +26,14 @@ import android.content.res.Resources import android.net.ConnectivityManager import android.net.INetd import android.net.InetAddresses -import android.net.IpPrefix -import android.net.LinkAddress import android.net.LinkProperties import android.net.NetworkAgentConfig import android.net.NetworkCapabilities -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.NetworkPolicyManager import android.net.NetworkProvider import android.net.NetworkScore import android.net.PacProxyManager -import android.net.RouteInfo import android.net.networkstack.NetworkStackClientBase import android.os.BatteryStatsManager import android.os.Handler @@ -76,6 +71,14 @@ internal val LOCAL_IPV4_ADDRESS = InetAddresses.parseNumericAddress("192.0.2.1") open class FromS(val value: Type) +internal const val VERSION_UNMOCKED = -1 +internal const val VERSION_R = 1 +internal const val VERSION_S = 2 +internal const val VERSION_T = 3 +internal const val VERSION_U = 4 +internal const val VERSION_V = 5 +internal const val VERSION_MAX = VERSION_V + /** * Base class for tests testing ConnectivityService and its satellites. * @@ -193,6 +196,24 @@ open class CSTest { changeId in enabledChangeIds override fun isChangeEnabled(changeId: Long, uid: Int) = changeId in enabledChangeIds + + // In AOSP, build version codes are all over the place (e.g. at the time of this writing + // U == V). Define custom ones. + private var sdkLevel = VERSION_UNMOCKED + private val isSdkUnmocked get() = sdkLevel == VERSION_UNMOCKED + + fun setBuildSdk(sdkLevel: Int) { + require(sdkLevel <= VERSION_MAX) { + "setBuildSdk must not be called with Build.VERSION constants but " + + "CsTest.VERSION_* constants" + } + visibleOnHandlerThread(csHandler) { this.sdkLevel = sdkLevel } + } + + override fun isAtLeastS() = if (isSdkUnmocked) super.isAtLeastS() else sdkLevel >= VERSION_S + override fun isAtLeastT() = if (isSdkUnmocked) super.isAtLeastT() else sdkLevel >= VERSION_T + override fun isAtLeastU() = if (isSdkUnmocked) super.isAtLeastU() else sdkLevel >= VERSION_U + override fun isAtLeastV() = if (isSdkUnmocked) super.isAtLeastV() else sdkLevel >= VERSION_V } inner class CSContext(base: Context) : BroadcastInterceptingContext(base) { @@ -248,19 +269,6 @@ open class CSTest { // Utility methods for subclasses to use fun waitForIdle() = csHandlerThread.waitForIdle(HANDLER_TIMEOUT_MS) - private fun emptyAgentConfig() = NetworkAgentConfig.Builder().build() - private fun defaultNc() = NetworkCapabilities.Builder() - // Add sensible defaults for agents that don't want to care - .addCapability(NET_CAPABILITY_NOT_SUSPENDED) - .addCapability(NET_CAPABILITY_NOT_ROAMING) - .addCapability(NET_CAPABILITY_NOT_VCN_MANAGED) - .build() - private fun defaultScore() = FromS(NetworkScore.Builder().build()) - private fun defaultLp() = LinkProperties().apply { - addLinkAddress(LinkAddress(LOCAL_IPV4_ADDRESS, 32)) - addRoute(RouteInfo(IpPrefix("0.0.0.0/0"), null, null)) - } - // Network agents. See CSAgentWrapper. This class contains utility methods to simplify // creation. fun Agent( diff --git a/tests/unit/java/com/android/server/connectivityservice/base/CSTestHelpers.kt b/tests/unit/java/com/android/server/connectivityservice/base/CSTestHelpers.kt index 716d2574a7..2d8607bad5 100644 --- a/tests/unit/java/com/android/server/connectivityservice/base/CSTestHelpers.kt +++ b/tests/unit/java/com/android/server/connectivityservice/base/CSTestHelpers.kt @@ -30,6 +30,13 @@ import android.content.pm.UserInfo import android.content.res.Resources import android.net.IDnsResolver import android.net.INetd +import android.net.IpPrefix +import android.net.LinkAddress +import android.net.LinkProperties +import android.net.NetworkAgentConfig +import android.net.NetworkCapabilities +import android.net.NetworkScore +import android.net.RouteInfo import android.net.metrics.IpConnectivityLog import android.os.Handler import android.os.HandlerThread @@ -60,6 +67,22 @@ import kotlin.test.fail internal inline fun mock() = Mockito.mock(T::class.java) internal inline fun any() = any(T::class.java) +internal fun emptyAgentConfig() = NetworkAgentConfig.Builder().build() + +internal fun defaultNc() = NetworkCapabilities.Builder() + // Add sensible defaults for agents that don't want to care + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) + .build() + +internal fun defaultScore() = FromS(NetworkScore.Builder().build()) + +internal fun defaultLp() = LinkProperties().apply { + addLinkAddress(LinkAddress(LOCAL_IPV4_ADDRESS, 32)) + addRoute(RouteInfo(IpPrefix("0.0.0.0/0"), null, null)) +} + internal fun makeMockContentResolver(context: Context) = MockContentResolver(context).apply { addProvider(Settings.AUTHORITY, FakeSettingsProvider()) }