Allow for mocking an SDK in the tests

Test: in followup patches
Change-Id: I540ce2a455c92be52eb94fbd4b54a2081d04d25e
This commit is contained in:
Chalard Jean
2023-10-07 15:17:07 +09:00
parent af11354ba5
commit eb66389d6a
3 changed files with 55 additions and 18 deletions

View File

@@ -97,12 +97,14 @@ import static android.os.Process.VPN_UID;
import static android.system.OsConstants.ETH_P_ALL; import static android.system.OsConstants.ETH_P_ALL;
import static android.system.OsConstants.IPPROTO_TCP; import static android.system.OsConstants.IPPROTO_TCP;
import static android.system.OsConstants.IPPROTO_UDP; import static android.system.OsConstants.IPPROTO_UDP;
import static com.android.net.module.util.NetworkMonitorUtils.isPrivateDnsValidationRequired; 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.checkAnyPermissionOf;
import static com.android.net.module.util.PermissionUtils.enforceAnyPermissionOf; 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.enforceNetworkStackPermission;
import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermissionOr; import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermissionOr;
import static com.android.server.ConnectivityStatsLog.CONNECTIVITY_STATE_SAMPLE; import static com.android.server.ConnectivityStatsLog.CONNECTIVITY_STATE_SAMPLE;
import static java.util.Map.Entry; import static java.util.Map.Entry;
import android.Manifest; import android.Manifest;
@@ -1315,6 +1317,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
return SdkLevel.isAtLeastU(); return SdkLevel.isAtLeastU();
} }
public boolean isAtLeastV() {
return SdkLevel.isAtLeastV();
}
/** /**
* Get system properties to use in ConnectivityService. * Get system properties to use in ConnectivityService.
*/ */

View File

@@ -26,19 +26,14 @@ import android.content.res.Resources
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.INetd import android.net.INetd
import android.net.InetAddresses import android.net.InetAddresses
import android.net.IpPrefix
import android.net.LinkAddress
import android.net.LinkProperties import android.net.LinkProperties
import android.net.NetworkAgentConfig import android.net.NetworkAgentConfig
import android.net.NetworkCapabilities 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_SUSPENDED
import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED
import android.net.NetworkPolicyManager import android.net.NetworkPolicyManager
import android.net.NetworkProvider import android.net.NetworkProvider
import android.net.NetworkScore import android.net.NetworkScore
import android.net.PacProxyManager import android.net.PacProxyManager
import android.net.RouteInfo
import android.net.networkstack.NetworkStackClientBase import android.net.networkstack.NetworkStackClientBase
import android.os.BatteryStatsManager import android.os.BatteryStatsManager
import android.os.Handler import android.os.Handler
@@ -76,6 +71,14 @@ internal val LOCAL_IPV4_ADDRESS = InetAddresses.parseNumericAddress("192.0.2.1")
open class FromS<Type>(val value: Type) open class FromS<Type>(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. * Base class for tests testing ConnectivityService and its satellites.
* *
@@ -193,6 +196,24 @@ open class CSTest {
changeId in enabledChangeIds changeId in enabledChangeIds
override fun isChangeEnabled(changeId: Long, uid: Int) = override fun isChangeEnabled(changeId: Long, uid: Int) =
changeId in enabledChangeIds 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) { inner class CSContext(base: Context) : BroadcastInterceptingContext(base) {
@@ -248,19 +269,6 @@ open class CSTest {
// Utility methods for subclasses to use // Utility methods for subclasses to use
fun waitForIdle() = csHandlerThread.waitForIdle(HANDLER_TIMEOUT_MS) 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>(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 // Network agents. See CSAgentWrapper. This class contains utility methods to simplify
// creation. // creation.
fun Agent( fun Agent(

View File

@@ -30,6 +30,13 @@ import android.content.pm.UserInfo
import android.content.res.Resources import android.content.res.Resources
import android.net.IDnsResolver import android.net.IDnsResolver
import android.net.INetd 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.net.metrics.IpConnectivityLog
import android.os.Handler import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
@@ -60,6 +67,22 @@ import kotlin.test.fail
internal inline fun <reified T> mock() = Mockito.mock(T::class.java) internal inline fun <reified T> mock() = Mockito.mock(T::class.java)
internal inline fun <reified T> any() = any(T::class.java) internal inline fun <reified T> 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 { internal fun makeMockContentResolver(context: Context) = MockContentResolver(context).apply {
addProvider(Settings.AUTHORITY, FakeSettingsProvider()) addProvider(Settings.AUTHORITY, FakeSettingsProvider())
} }