diff --git a/staticlibs/testutils/app/connectivitychecker/src/com/android/testutils/connectivitypreparer/ConnectivityCheckTest.kt b/staticlibs/testutils/app/connectivitychecker/src/com/android/testutils/connectivitypreparer/ConnectivityCheckTest.kt index df6067dda6..e634f0e20b 100644 --- a/staticlibs/testutils/app/connectivitychecker/src/com/android/testutils/connectivitypreparer/ConnectivityCheckTest.kt +++ b/staticlibs/testutils/app/connectivitychecker/src/com/android/testutils/connectivitypreparer/ConnectivityCheckTest.kt @@ -34,17 +34,13 @@ class ConnectivityCheckTest { private val connectUtil by lazy { ConnectUtil(context) } @Test - fun testCheckConnectivity() { - checkWifiSetup() - checkTelephonySetup() - } - - private fun checkWifiSetup() { + fun testCheckWifiSetup() { if (!pm.hasSystemFeature(FEATURE_WIFI)) return connectUtil.ensureWifiValidated() } - private fun checkTelephonySetup() { + @Test + fun testCheckTelephonySetup() { if (!pm.hasSystemFeature(FEATURE_TELEPHONY)) return val tm = context.getSystemService(TelephonyManager::class.java) ?: fail("Could not get telephony service") @@ -52,7 +48,7 @@ class ConnectivityCheckTest { val commonError = "Check the test bench. To run the tests anyway for quick & dirty local " + "testing, you can use atest X -- " + "--test-arg com.android.testutils.ConnectivityTestTargetPreparer" + - ":ignore-connectivity-check:true" + ":ignore-mobile-data-check:true" // Do not use assertEquals: it outputs "expected X, was Y", which looks like a test failure if (tm.simState == TelephonyManager.SIM_STATE_ABSENT) { fail("The device has no SIM card inserted. $commonError") diff --git a/staticlibs/testutils/host/com/android/testutils/ConnectivityTestTargetPreparer.kt b/staticlibs/testutils/host/com/android/testutils/ConnectivityTestTargetPreparer.kt index 6d03042dc1..435fdd865c 100644 --- a/staticlibs/testutils/host/com/android/testutils/ConnectivityTestTargetPreparer.kt +++ b/staticlibs/testutils/host/com/android/testutils/ConnectivityTestTargetPreparer.kt @@ -28,9 +28,11 @@ import com.android.tradefed.targetprep.suite.SuiteApkInstaller private const val CONNECTIVITY_CHECKER_APK = "ConnectivityTestPreparer.apk" private const val CONNECTIVITY_PKG_NAME = "com.android.testutils.connectivitypreparer" private const val CONNECTIVITY_CHECK_CLASS = "$CONNECTIVITY_PKG_NAME.ConnectivityCheckTest" + // As per the defined in the checker manifest private const val CONNECTIVITY_CHECK_RUNNER_NAME = "androidx.test.runner.AndroidJUnitRunner" -private const val IGNORE_CONN_CHECK_OPTION = "ignore-connectivity-check" +private const val IGNORE_WIFI_CHECK = "ignore-wifi-check" +private const val IGNORE_MOBILE_DATA_CHECK = "ignore-mobile-data-check" // The default updater package names, which might be updating packages while the CTS // are running @@ -41,14 +43,23 @@ private val UPDATER_PKGS = arrayOf("com.google.android.gms", "com.android.vendin * * For quick and dirty local testing, the connectivity check can be disabled by running tests with * "atest -- \ - * --test-arg com.android.testutils.ConnectivityTestTargetPreparer:ignore-connectivity-check:true". + * --test-arg com.android.testutils.ConnectivityTestTargetPreparer:ignore-mobile-data-check:true". \ + * --test-arg com.android.testutils.ConnectivityTestTargetPreparer:ignore-wifi-check:true". */ open class ConnectivityTestTargetPreparer : BaseTargetPreparer() { private val installer = SuiteApkInstaller() - @Option(name = IGNORE_CONN_CHECK_OPTION, - description = "Disables the check for mobile data and wifi") - private var ignoreConnectivityCheck = false + @Option( + name = IGNORE_WIFI_CHECK, + description = "Disables the check for wifi" + ) + private var ignoreWifiCheck = false + @Option( + name = IGNORE_MOBILE_DATA_CHECK, + description = "Disables the check for mobile data" + ) + private var ignoreMobileDataCheck = false + // The default value is never used, but false is a reasonable default private var originalTestChainEnabled = false private val originalUpdaterPkgsStatus = HashMap() @@ -58,44 +69,62 @@ open class ConnectivityTestTargetPreparer : BaseTargetPreparer() { disableGmsUpdate(testInfo) originalTestChainEnabled = getTestChainEnabled(testInfo) originalUpdaterPkgsStatus.putAll(getUpdaterPkgsStatus(testInfo)) - setUpdaterNetworkingEnabled(testInfo, enableChain = true, - enablePkgs = UPDATER_PKGS.associateWith { false }) - runPreparerApk(testInfo) + setUpdaterNetworkingEnabled( + testInfo, + enableChain = true, + enablePkgs = UPDATER_PKGS.associateWith { false } + ) + runConnectivityCheckApk(testInfo) refreshTime(testInfo) } - private fun runPreparerApk(testInfo: TestInformation) { + private fun runConnectivityCheckApk(testInfo: TestInformation) { installer.setCleanApk(true) installer.addTestFileName(CONNECTIVITY_CHECKER_APK) installer.setShouldGrantPermission(true) installer.setUp(testInfo) + val testMethods = mutableListOf() + if (!ignoreWifiCheck) { + testMethods.add("testCheckWifiSetup") + } + if (!ignoreMobileDataCheck) { + testMethods.add("testCheckTelephonySetup") + } + + testMethods.forEach { + runTestMethod(testInfo, it) + } + } + + private fun runTestMethod(testInfo: TestInformation, method: String) { val runner = DefaultRemoteAndroidTestRunner( - CONNECTIVITY_PKG_NAME, - CONNECTIVITY_CHECK_RUNNER_NAME, - testInfo.device.iDevice) + CONNECTIVITY_PKG_NAME, + CONNECTIVITY_CHECK_RUNNER_NAME, + testInfo.device.iDevice + ) runner.runOptions = "--no-hidden-api-checks" + runner.setMethodName(CONNECTIVITY_CHECK_CLASS, method) val receiver = CollectingTestListener() if (!testInfo.device.runInstrumentationTests(runner, receiver)) { - throw TargetSetupError("Device state check failed to complete", - testInfo.device.deviceDescriptor) + throw TargetSetupError( + "Device state check failed to complete", + testInfo.device.deviceDescriptor + ) } val runResult = receiver.currentRunResults if (runResult.isRunFailure) { - throw TargetSetupError("Failed to check device state before the test: " + - runResult.runFailureMessage, testInfo.device.deviceDescriptor) - } - - val ignoredTestClasses = mutableSetOf() - if (ignoreConnectivityCheck) { - ignoredTestClasses.add(CONNECTIVITY_CHECK_CLASS) + throw TargetSetupError( + "Failed to check device state before the test: " + + runResult.runFailureMessage, + testInfo.device.deviceDescriptor + ) } val errorMsg = runResult.testResults.mapNotNull { (testDescription, testResult) -> - if (TestResult.TestStatus.FAILURE != testResult.status || - ignoredTestClasses.contains(testDescription.className)) { + if (TestResult.TestStatus.FAILURE != testResult.status) { null } else { "$testDescription: ${testResult.stackTrace}" @@ -103,21 +132,27 @@ open class ConnectivityTestTargetPreparer : BaseTargetPreparer() { }.joinToString("\n") if (errorMsg.isBlank()) return - throw TargetSetupError("Device setup checks failed. Check the test bench: \n$errorMsg", - testInfo.device.deviceDescriptor) + throw TargetSetupError( + "Device setup checks failed. Check the test bench: \n$errorMsg", + testInfo.device.deviceDescriptor + ) } private fun disableGmsUpdate(testInfo: TestInformation) { // This will be a no-op on devices without root (su) or not using gservices, but that's OK. - testInfo.exec("su 0 am broadcast " + + testInfo.exec( + "su 0 am broadcast " + "-a com.google.gservices.intent.action.GSERVICES_OVERRIDE " + - "-e finsky.play_services_auto_update_enabled false") + "-e finsky.play_services_auto_update_enabled false" + ) } private fun clearGmsUpdateOverride(testInfo: TestInformation) { - testInfo.exec("su 0 am broadcast " + + testInfo.exec( + "su 0 am broadcast " + "-a com.google.gservices.intent.action.GSERVICES_OVERRIDE " + - "--esn finsky.play_services_auto_update_enabled") + "--esn finsky.play_services_auto_update_enabled" + ) } private fun setUpdaterNetworkingEnabled( @@ -137,10 +172,10 @@ open class ConnectivityTestTargetPreparer : BaseTargetPreparer() { testInfo.exec("cmd connectivity get-chain3-enabled").contains("chain:enabled") private fun getUpdaterPkgsStatus(testInfo: TestInformation) = - UPDATER_PKGS.associateWith { pkg -> - !testInfo.exec("cmd connectivity get-package-networking-enabled $pkg") - .contains(":deny") - } + UPDATER_PKGS.associateWith { pkg -> + !testInfo.exec("cmd connectivity get-package-networking-enabled $pkg") + .contains(":deny") + } private fun refreshTime(testInfo: TestInformation,) { // Forces a synchronous time refresh using the network. Time is fetched synchronously but @@ -153,9 +188,11 @@ open class ConnectivityTestTargetPreparer : BaseTargetPreparer() { override fun tearDown(testInfo: TestInformation, e: Throwable?) { if (isTearDownDisabled) return installer.tearDown(testInfo, e) - setUpdaterNetworkingEnabled(testInfo, - enableChain = originalTestChainEnabled, - enablePkgs = originalUpdaterPkgsStatus) + setUpdaterNetworkingEnabled( + testInfo, + enableChain = originalTestChainEnabled, + enablePkgs = originalUpdaterPkgsStatus + ) clearGmsUpdateOverride(testInfo) } }