Mock connectivity resources in integration tests

The resources may have different values depending on devices, and
resources IDs may mismatch if the test was not built at the same time as
the installed module, so mock the resources to allow running the
integration tests on more builds.

Bug: 193847396
Test: atest FrameworksNetIntegrationTests
Ignore-AOSP-First: cherry-pick created
Change-Id: Ic33d897690a8ea84a78c01dc5f2b2e2c473d57df
This commit is contained in:
Remi NGUYEN VAN
2021-08-04 19:19:49 +09:00
parent 893494289b
commit 0a37e72f0c
2 changed files with 42 additions and 2 deletions

View File

@@ -30,6 +30,7 @@ android_test {
], ],
libs: [ libs: [
"android.test.mock", "android.test.mock",
"ServiceConnectivityResources",
], ],
static_libs: [ static_libs: [
"NetworkStackApiStableLib", "NetworkStackApiStableLib",

View File

@@ -23,7 +23,9 @@ import android.content.Context.BIND_AUTO_CREATE
import android.content.Context.BIND_IMPORTANT import android.content.Context.BIND_IMPORTANT
import android.content.Intent import android.content.Intent
import android.content.ServiceConnection import android.content.ServiceConnection
import android.content.res.Resources
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.ConnectivityResources
import android.net.IDnsResolver import android.net.IDnsResolver
import android.net.INetd import android.net.INetd
import android.net.LinkProperties import android.net.LinkProperties
@@ -35,6 +37,7 @@ import android.net.NetworkRequest
import android.net.TestNetworkStackClient import android.net.TestNetworkStackClient
import android.net.Uri import android.net.Uri
import android.net.metrics.IpConnectivityLog import android.net.metrics.IpConnectivityLog
import android.net.util.MultinetworkPolicyTracker
import android.os.ConditionVariable import android.os.ConditionVariable
import android.os.IBinder import android.os.IBinder
import android.os.SystemConfigManager import android.os.SystemConfigManager
@@ -43,6 +46,7 @@ import android.testing.TestableContext
import android.util.Log import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import com.android.connectivity.resources.R
import com.android.server.ConnectivityService import com.android.server.ConnectivityService
import com.android.server.NetworkAgentWrapper import com.android.server.NetworkAgentWrapper
import com.android.server.TestNetIdManager import com.android.server.TestNetIdManager
@@ -59,6 +63,7 @@ import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.any import org.mockito.Mockito.any
import org.mockito.Mockito.anyInt import org.mockito.Mockito.anyInt
import org.mockito.Mockito.doAnswer
import org.mockito.Mockito.doNothing import org.mockito.Mockito.doNothing
import org.mockito.Mockito.doReturn import org.mockito.Mockito.doReturn
import org.mockito.Mockito.eq import org.mockito.Mockito.eq
@@ -93,6 +98,10 @@ class ConnectivityServiceIntegrationTest {
private lateinit var dnsResolver: IDnsResolver private lateinit var dnsResolver: IDnsResolver
@Mock @Mock
private lateinit var systemConfigManager: SystemConfigManager private lateinit var systemConfigManager: SystemConfigManager
@Mock
private lateinit var resources: Resources
@Mock
private lateinit var resourcesContext: Context
@Spy @Spy
private var context = TestableContext(realContext) private var context = TestableContext(realContext)
@@ -110,9 +119,11 @@ class ConnectivityServiceIntegrationTest {
private val realContext get() = InstrumentationRegistry.getInstrumentation().context private val realContext get() = InstrumentationRegistry.getInstrumentation().context
private val httpProbeUrl get() = private val httpProbeUrl get() =
realContext.getResources().getString(R.string.config_captive_portal_http_url) realContext.getResources().getString(com.android.server.net.integrationtests.R.string
.config_captive_portal_http_url)
private val httpsProbeUrl get() = private val httpsProbeUrl get() =
realContext.getResources().getString(R.string.config_captive_portal_https_url) realContext.getResources().getString(com.android.server.net.integrationtests.R.string
.config_captive_portal_https_url)
private class InstrumentationServiceConnection : ServiceConnection { private class InstrumentationServiceConnection : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) { override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
@@ -156,6 +167,27 @@ class ConnectivityServiceIntegrationTest {
.getSystemService(Context.SYSTEM_CONFIG_SERVICE) .getSystemService(Context.SYSTEM_CONFIG_SERVICE)
doReturn(IntArray(0)).`when`(systemConfigManager).getSystemPermissionUids(anyString()) doReturn(IntArray(0)).`when`(systemConfigManager).getSystemPermissionUids(anyString())
doReturn(60000).`when`(resources).getInteger(R.integer.config_networkTransitionTimeout)
doReturn("").`when`(resources).getString(R.string.config_networkCaptivePortalServerUrl)
doReturn(arrayOf<String>("test_wlan_wol")).`when`(resources)
.getStringArray(R.array.config_wakeonlan_supported_interfaces)
doReturn(arrayOf("0,1", "1,3")).`when`(resources)
.getStringArray(R.array.config_networkSupportedKeepaliveCount)
doReturn(emptyArray<String>()).`when`(resources)
.getStringArray(R.array.config_networkNotifySwitches)
doReturn(intArrayOf(10, 11, 12, 14, 15)).`when`(resources)
.getIntArray(R.array.config_protectedNetworks)
// We don't test the actual notification value strings, so just return an empty array.
// It doesn't matter what the values are as long as it's not null.
doReturn(emptyArray<String>()).`when`(resources).getStringArray(
R.array.network_switch_type_name)
doReturn(1).`when`(resources).getInteger(R.integer.config_networkAvoidBadWifi)
doReturn(R.array.config_networkSupportedKeepaliveCount).`when`(resources)
.getIdentifier(eq("config_networkSupportedKeepaliveCount"), eq("array"), any())
doReturn(resources).`when`(resourcesContext).getResources()
ConnectivityResources.setResourcesContextForTest(resourcesContext)
networkStackClient = TestNetworkStackClient(realContext) networkStackClient = TestNetworkStackClient(realContext)
networkStackClient.start() networkStackClient.start()
@@ -176,12 +208,19 @@ class ConnectivityServiceIntegrationTest {
doReturn(mock(ProxyTracker::class.java)).`when`(deps).makeProxyTracker(any(), any()) doReturn(mock(ProxyTracker::class.java)).`when`(deps).makeProxyTracker(any(), any())
doReturn(mock(MockableSystemProperties::class.java)).`when`(deps).systemProperties doReturn(mock(MockableSystemProperties::class.java)).`when`(deps).systemProperties
doReturn(TestNetIdManager()).`when`(deps).makeNetIdManager() doReturn(TestNetIdManager()).`when`(deps).makeNetIdManager()
doAnswer { inv ->
object : MultinetworkPolicyTracker(inv.getArgument(0), inv.getArgument(1),
inv.getArgument(2)) {
override fun getResourcesForActiveSubId() = resources
}
}.`when`(deps).makeMultinetworkPolicyTracker(any(), any(), any())
return deps return deps
} }
@After @After
fun tearDown() { fun tearDown() {
nsInstrumentation.clearAllState() nsInstrumentation.clearAllState()
ConnectivityResources.setResourcesContextForTest(null)
} }
@Test @Test