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

Espresso test failed, no feedback to help me figure out why #1893

Open
JordanLongstaff opened this issue Aug 18, 2023 · 14 comments
Open

Espresso test failed, no feedback to help me figure out why #1893

JordanLongstaff opened this issue Aug 18, 2023 · 14 comments

Comments

@JordanLongstaff
Copy link

Description

As far as I know, I'm writing my Espresso tests correctly. However, they fail when I run them, and there's nothing that's telling me why they fail so I can fix them. There's no stack trace, no assertion errors in logs, nothing.

Expected Results

In theory, my test should pass.

Actual Results

The test fails, with no information or indication of why it failed.

Here are my only logs. Good luck finding the cause from them.
connected.zip

AndroidX Test and Android OS Versions

androidx.test:core:1.5.0
androidx.test.espresso:espresso-core:3.4.0
androidx.test.ext:junit-ktx:1.1.5
androidx.test:runner:1.5.2
androidx.test:rules:1.5.0

Android 10, Android 13

@brettchabot
Copy link
Collaborator

Sorry without more info its going to difficult for us to help.

Have you tried looking at logcat output to see if there are any errors there? Can you share a sample project + steps to reproduce the problem?

@JordanLongstaff
Copy link
Author

The logcat output is in the attached ZIP file. Like I said, there are no errors there to signify a failed assertion or anything.

Our project is not publicly shared, so I can't share it with you. I can tell you, just for testing purposes, I made a test that does literally nothing and still fails.

@brettchabot
Copy link
Collaborator

Please tell me if I'm missing something, but I don't see the logcat file.

~/Downloads$ unzip -l connected.zip
Archive:  connected.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  08-18-2023 14:19   connected/
      163  08-18-2023 14:19   __MACOSX/._connected
     2585  08-18-2023 14:14   connected/index.html
      163  08-18-2023 14:14   __MACOSX/connected/._index.html
        0  08-18-2023 14:14   connected/css/
      163  08-18-2023 14:14   __MACOSX/connected/._css
        0  08-18-2023 14:14   connected/js/
      163  08-18-2023 14:14   __MACOSX/connected/._js
     1951  08-18-2023 14:14   connected/com.encircle.espresso.LoginTest.html
      163  08-18-2023 14:14   __MACOSX/connected/._com.encircle.espresso.LoginTest.html
     2232  08-18-2023 14:14   connected/com.encircle.espresso.html
      163  08-18-2023 14:14   __MACOSX/connected/._com.encircle.espresso.html
   270551  08-18-2023 14:19   connected/Test Results - canLogOut.html
      219  08-18-2023 14:19   __MACOSX/connected/._Test Results - canLogOut.html
     2428  08-18-2023 14:14   connected/css/base-style.css
      163  08-18-2023 14:14   __MACOSX/connected/css/._base-style.css
     1131  08-18-2023 14:14   connected/css/style.css
      163  08-18-2023 14:14   __MACOSX/connected/css/._style.css
     2933  08-18-2023 14:14   connected/js/report.js
      163  08-18-2023 14:14   __MACOSX/connected/js/._report.js

FWIW, there is some working samples at github.com/android/testing-samples if you need a sample project to start from - either to compare setup or build up a repro case.

@JordanLongstaff
Copy link
Author

Test Results - canLogOut.html contains the logcat output.

@brettchabot
Copy link
Collaborator

Ah thank you.

I see this in the log when the test starts:

08-18 17:08:01.958 23848 23908 I TestRunner: started: canLogOut(com.encircle.espresso.LoginTest)

So the test is running in process ID 23848, and that is the last log line for the TestRunner, so the test never finishes.

One of the last log lines I see from process 23848 is:

08-18 17:08:13.968 23848 23848 I Process : Sending signal. PID: 23848 SIG: 9

I could be wrong but this seems to indicate the app process under test is exiting itself. Is it possible there is a System.exit or Process.killProcess call or similar somewhere that is being triggered?

I cannot explain why you would still see no output in this case - the test runner should tell you that the process died and clearly it is unacceptable to report no output even in an abnormal circumstance.

Are you running the test through Android Studio or gradle? What versions?
Is it possible to run the test manually and see what output is produced?

After installing the apks, do something like
'adb shell pm list instrumentation' to find out your component/runner class na,e
'adb shell am instrument -w "component/runner"'

@JordanLongstaff
Copy link
Author

Sorry for the delayed response.

Is it possible there is a System.exit or Process.killProcess call or similar somewhere that is being triggered?

If there is, it's not one I know about. 🤷 However, I tried running the tests from the CLI and saw this:

Tests on MAR-LX3A - 10 failed: There was 1 failure(s).
Test run failed to complete. Instrumentation run failed due to Process crashed.

I should probably mention, I have three different phones to test with (a Huawei P30 Lite running Android 10, a Samsung Galaxy A32 running Android 13, and a Google Pixel 7 running Android 13), and they're all consistently yielding the same results for everything I try.

Are you running the test through Android Studio or gradle? What versions?

I've been running it through Android Studio. I have the latest version (Giraffe) and I'm using AGP version 8.0.0.

Is it possible to run the test manually and see what output is produced?

Here's a stack trace from running the tests with Gradle, if it helps:

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:connectedDebugAndroidTest'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:147)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: org.gradle.api.GradleException: There were failing tests. See the report at: file:///Users/jordanlongstaff/encircle/android/app/build/reports/androidTests/connected/index.html
        at com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.doTaskAction(DeviceProviderInstrumentTestTask.java:414)
        at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:66)
        at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
        at com.android.build.gradle.internal.tasks.NonIncrementalTask.taskAction(NonIncrementalTask.kt:97)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
        at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
        at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:166)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:93)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:57)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:54)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:28)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.executeDelegateBroadcastingChanges(CaptureStateAfterExecutionStep.java:100)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:72)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:50)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:166)
        at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:70)
        at org.gradle.internal.Either$Right.fold(Either.java:175)
        at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:68)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:46)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:91)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:37)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:76)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:37)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:94)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:71)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:45)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNonEmptySources(SkipEmptyWorkStep.java:177)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:81)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:53)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:75)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:41)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:32)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:21)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:42)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:31)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:135)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:325)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:304)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)

After installing the apks, do something like
'adb shell pm list instrumentation' to find out your component/runner class na,e
'adb shell am instrument -w "component/runner"'

$ adb shell am instrument -w "com.encircle.test/androidx.test.runner.AndroidJUnitRunner"

com.encircle.espresso.LoginTest:INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0

@brettchabot
Copy link
Collaborator

Is there a stack trace outputted on either the 'adb shell am instrument -w "com.encircle.test/androidx.test.runner.AndroidJUnitRunner' command or in logcat

@JordanLongstaff
Copy link
Author

No stack trace from the adb shell am instrument -w ... command, but I've been looking into the Process crashed message and found stack trace messages like this in logcat:

08-21 14:48:35.466 20856 20856 D StrictMode: StrictMode policy violation; ~duration=6 ms: android.os.strictmode.DiskReadViolation
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1556)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at libcore.io.BlockGuardOs.access(BlockGuardOs.java:69)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at libcore.io.ForwardingOs.access(ForwardingOs.java:73)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:8037)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at java.io.File.exists(File.java:815)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.app.ContextImpl.getDataDir(ContextImpl.java:2470)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.app.ContextImpl.getCacheDir(ContextImpl.java:789)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.content.ContextWrapper.getCacheDir(ContextWrapper.java:273)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.content.ContextWrapper.getCacheDir(ContextWrapper.java:273)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.jsenv.EnFileManager.<init>(EnFileManager.kt:54)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.jsenv.EventLoop.<init>(EventLoop.java:145)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.jsenv.EventLoop.create(EventLoop.java:75)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.Encircle.lambda$onCreate$1(Encircle.java:220)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.Encircle.$r8$lambda$G81GPelK8dhlplDvdXpQkdW_mP8(Unknown Source:0)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.Encircle$$ExternalSyntheticLambda8.call(Unknown Source:4)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.util.Deferred.resolve(Deferred.java:47)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.util.DiskCleanup$DiskCleanupTask.onPostExecute(DiskCleanup.kt:92)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.encircle.util.DiskCleanup$DiskCleanupTask.onPostExecute(DiskCleanup.kt:28)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.os.AsyncTask.finish(AsyncTask.java:755)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.os.AsyncTask.access$900(AsyncTask.java:192)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.os.Handler.dispatchMessage(Handler.java:107)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.os.Looper.loop(Looper.java:213)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at android.app.ActivityThread.main(ActivityThread.java:8178)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at java.lang.reflect.Method.invoke(Native Method)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
08-21 14:48:35.466 20856 20856 D StrictMode: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)

I haven't found the fix for this yet, but it might have something to do with my issue.

@brettchabot
Copy link
Collaborator

My guess is StrictMode violations like this aren't the cause.

@JordanLongstaff
Copy link
Author

OK, maybe I should put in a qualifier about my test results, because I just discovered something else weird. Let me show you one of the tests that I'm trying to run:

@Test
fun canLogOut() {
    sleep(10, TimeUnit.SECONDS)

    try {
        clickOn(R.id.page_great_hall_button_login)
        writeTo(R.id.page_login_email, "username@example.com")
        writeTo(R.id.page_login_password, "password123")
        clickOn(R.id.page_login_button_login)
        sleep(10, TimeUnit.SECONDS)
    } catch (_: NoMatchingViewException) {
        // We should be logged in already in this case
    }

    assertDisplayed(R.id.page_paginated_inbox_input)

    openDrawer()
    clickOn("Logout")

    assertDisplayed(R.id.page_great_hall_button_login)
}

And here's how the result looks in Android Studio.

Screenshot 2023-08-22 at 10 49 51 AM

If I change the first assertDisplayed to an assertNotDisplayed, I'd expected the test to validly fail there. I say validly because it's a false assertion; R.id.page_paginated_inbox_input should be visible on the screen. Instead, I just get the same result as usual.

It's really weird, because these tests aren't complete duds. I was thinking that that first assertDisplayed wasn't even being reached somehow, because that was where the test consistently kept crashing. Turns out my setup for the test was wrong; the try-catch is supposed to detect if a user's already logged in, but it doesn't work (not that I'd know why, since Espresso isn't telling me anything). If I start the test without already being logged in, it completes exactly as I'd expect it to (but still reports as a failure as in the screenshot). Changing it to assertNotDisplayed does halt the test there as I'd expect to, but again, the reporting is in exactly the same way.

So, the behaviour of the test might be correct, but that yellow exclamation mark is obscuring all feedback somehow.

These functions I'm calling in the test plan come from Barista, in case you're wondering. I don't think Barista is the problem because I'm using it in another project and it works just fine there.

@JordanLongstaff
Copy link
Author

Turns out my setup for the test was wrong; the try-catch is supposed to detect if a user's already logged in, but it doesn't work (not that I'd know why, since Espresso isn't telling me anything).

Update: I managed to fix this.

@TWiStErRob

This comment was marked as off-topic.

@JordanLongstaff
Copy link
Author

I used ViewInteraction.withFailureHandler as explained in one of the answers here. I checked for the login button to not exist if a user's already logged in, and added the login logic to the failure handler in the case that the button exists.

@JordanLongstaff
Copy link
Author

Here's a logcat dump from the device. To make it easier to digest, I cut it down to start from after the last log entry that comes directly from the app I'm testing, to end at a log entry that specifically mentions a crash. In other words, it's a recording from the last step of the test while it's running, to the supposed abnormality of its closure. If there's anything that would suggest a fault, it'll probably be in here.

logcat.txt

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

3 participants