Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

setScreenOrientation() fails test when trying to restore screen orientation (after a successful usage earlier) #2279

Open
jdkoren opened this issue Sep 4, 2024 · 0 comments

Comments

@jdkoren
Copy link

jdkoren commented Sep 4, 2024

Description

onDevice().setScreenOrientation() is failing in an instrumented test, even after calling it once successfully earlier in the test. This can happen inside of ScreenOrientationRule as well.

Steps to Reproduce

Create a test in androidTest like the following and run it on a device.

@RunWith(AndroidJUnit4::class)
class EspressoOnDeviceTest {

    @get:Rule
    val screenOrientationRule = ScreenOrientationRule()

    // NOTE: assumes starting the test with the device in portrait.
    @Test
    fun setScreenOrientation_configUpdated() {
        val scenario = ActivityScenario.launch(MainActivity::class.java)

        scenario.onActivity { activity ->
            with(activity.resources.configuration) {
                assertThat(orientation).isEqualTo(Configuration.ORIENTATION_PORTRAIT)
            }
        }

        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)

        scenario.onActivity { activity ->
            with(activity.resources.configuration) {
                assertThat(orientation).isEqualTo(Configuration.ORIENTATION_LANDSCAPE)
            }
        }
    }
}

Expected Results

Test should pass.

Actual Results

Test fails with a stack trace pointing to a line in ScreenOrientationRule where it tries to restore the original screen orientation:

androidx.test.espresso.device.controller.DeviceControllerOperationException: Device could not be set to the requested screen orientation.
at androidx.test.espresso.device.action.ScreenOrientationAction.perform(ScreenOrientationAction.kt:154)
at androidx.test.espresso.device.DeviceInteraction.perform(DeviceInteraction.kt:45)
at androidx.test.espresso.device.rules.ScreenOrientationRule$apply$1.evaluate(ScreenOrientationRule.kt:41)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:162)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:68)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:463)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2596)

If I remove the test rule in this file, then the test passes, so the test itself is not broken.

As an experiment, I tried adding this line to the end of the test:

onDevice().setScreenOrientation(ScreenOrientation.PORTRAIT)

This also failed, with a stack trace pointing to this new line, which leads me to think the issue is something in ScreenOrientationAction.

AndroidX Test and Android OS Versions

androidx.test.espresso:espresso-core:3.6.1
androidx.test.espresso:espresso-device:1.0.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant