Why is the main activity not maintained throughout the entire test?

578 views Asked by At

So I'm having some issues with the login of an app.

I've been trying to write an integration test for it...

class LoginIT : AndroidIntegrationTest() {

    @get:Rule
    var loginActivityRule = activityScenarioRule<LoginActivity>()

    var done = false;

    @Test
    fun login_setsUser() {
        loginActivityRule.scenario.onActivity { loginActivity ->
            loginActivity.onLoginRequestCompleted(checkUser)
            loginActivity.usernameEditText.setText("Test001")
            loginActivity.passwordEditText.setText("0000")
            loginActivity.loginButton.performClick()
        }

        while (!done) {
        }
    }

    val checkUser = { succeeded: Boolean ->
        assertThat(succeeded).isTrue()

        mainActivityRule.scenario.onActivity { mainActivity ->
            val userManager = mainActivity.userManager.getActiveUser()
            assertThat { userManager.creds }.isInstanceOf(Valid::class.java)
            assertThat { userManager.name }.isEqualTo("Test001")
        }
        done = true
    }
}

where

@RunWith(AndroidJUnit4::class)
abstract class AndroidIntegrationTest {

    @get:Rule
    var mainActivityRule = activityScenarioRule<MainActivity>()

    @get:Rule
    val serviceRule = ServiceTestRule()
}

That failed with

java.lang.NullPointerException: Cannot run onActivity since Activity has been destroyed already

in the checkUser body. So I tossed in a

assertThat { mainActivityRule.scenario.state }.isEqualTo(STARTED)

as the very first statement in login_setsUser...

Which also fails because

org.opentest4j.AssertionFailedError: expected:<S[TARTED]> but was:<S[uccess(DESTROYED)]>

Now the fact that it's Success(DESTROYED) rather than DESTROYED tells me I'm using the state wrong anyway, but what I'm more concerned with is that it does say DESTROYEDright at the very beginning of the test.

So why is the activity being destroyed and how do I keep it alive?

The logs, for howevermuch they're worth:

I/TestRunner: started: login_setsUser()
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: PRE_ON_CREATE
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
W/m.u.in: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
W/m.u.in: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
W/m.u.in: Accessing hidden field Landroid/view/View;->mAccessibilityDelegate:Landroid/view/View$AccessibilityDelegate; (greylist, reflection, allowed)
I/System.out: MainActivity::onCreate completed in 1058603300 ns = 1058.6033ms
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: CREATED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: STARTED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: RESUMED
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: PAUSED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
W/Settings: Setting always_finish_activities has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value.
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@ee392ab
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@346ae87 in: PRE_ON_CREATE
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@346ae87 in: CREATED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@346ae87 in: STARTED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@346ae87 in: RESUMED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/HostConnection: HostConnection::get() New Host Connection established 0xd54e0ec0, tid 9260
D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer ANDROID_EMU_vulkan_ignored_handles GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_1 
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/EGL_emulation: eglCreateContext: 0xbb3f60e0: maj 3 min 1 rcv 4
D/EGL_emulation: eglMakeCurrent: 0xbb3f60e0: ver 3 1 (tinfo 0xbb4924d0)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
W/Gralloc3: mapper 3.x is not supported
D/HostConnection: createUnique: call
    HostConnection::get() New Host Connection established 0xbb4d1140, tid 9260
D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer ANDROID_EMU_vulkan_ignored_handles GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_1 
D/eglCodecCommon: allocate: Ask for block of size 0x1000
D/eglCodecCommon: allocate: ioctl allocate returned offset 0x3ffff6000 size 0x2000
D/EGL_emulation: eglMakeCurrent: 0xbb3f60e0: ver 3 1 (tinfo 0xbb4924d0)
I/OpenGLRenderer: Davey! duration=2296ms; Flags=1, IntendedVsync=2400399771696, Vsync=2402283104954, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=2402290151800, AnimationStart=2402290416600, PerformTraversalsStart=2402294169900, DrawStart=2402612162700, SyncQueued=2402653256800, SyncStart=2402655900200, IssueDrawCommandsStart=2402655952000, SwapBuffers=2402679617700, FrameCompleted=2402698544800, DequeueBufferDuration=57000, QueueBufferDuration=404000, 
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: STOPPED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
    running callback: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: Lifecycle status change: my.user.app.ui.MainActivity@3b19973 in: DESTROYED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
    running callback: androidx.test.core.app.ActivityScenario$1@96310a4
    callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@346ae87 in: PAUSED
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@96310a4
    callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@c50e4e9
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@a161c9c in: PRE_ON_CREATE
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@96310a4
    callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@a161c9c in: CREATED
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@96310a4
    callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@a161c9c in: STARTED
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
    callback completes: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: running callback: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@a161c9c in: RESUMED
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
    running callback: androidx.test.core.app.ActivityScenario$1@96310a4
    callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/EGL_emulation: eglMakeCurrent: 0xbb3f60e0: ver 3 1 (tinfo 0xbb4924d0)
D/[VOLLEY REQ DISPATCHER]: [VOLLEY REQUEST] VolleyLoginRequest
D/Volley: [546] WaitingRequestManager.maybeAddToWaitingRequests: new request, sending to network 1-https://user.my/login
D/LifecycleMonitor: Lifecycle status change: my.user.ui.ui.LoginActivity@346ae87 in: STOPPED
    running callback: androidx.test.core.app.ActivityScenario$1@1519030
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@1519030
    running callback: androidx.test.core.app.ActivityScenario$1@96310a4
D/LifecycleMonitor: callback completes: androidx.test.core.app.ActivityScenario$1@96310a4
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: my.user, PID: 9189
    java.lang.NullPointerException: Cannot run onActivity since Activity has been destroyed already
0

There are 0 answers