android / android/android-test

NullPointerException in AndroidGoogleTest.java

Open
#682 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
1.2k
Forks
342
Avg merge
11h 29m
Merged PRs (30d)
2

Description

### Description
When I execute my android integration test, I receive a `NullPointerException` in AndroidGoogleTest. It appears the `stackTraceFile` argument is `null`, which is pulled from `controller.getDeviceProperties().get("dalvik.vm.stack-trace-file")`

My build file
```
android_binary(
name = "euchrepay_googleplay_test_binary",
instruments = "//java/com/jeffreys/euchrepay/googleplay",
manifest = "AndroidManifest.xml",
custom_package = "com.jeffreys.euchrepay.googleplay.test",
deps = ["//javatests/com/jeffreys/common/euchre/ui:test_lib"],
)

android_instrumentation_test(
name = "euchrepay_googleplay_test",
target_device = "@android_test_support//tools/android/emulated_devices/generic_phone:google_27_x86_qemu2",
size = "large",
args = [
"--clear_package_data",
],
test_app = ":euchrepay_googleplay_test_binary",
flaky = True,
)
```

Sample test
```
package com.jeffreys.common.euchre.ui;

import static org.junit.Assert.assertNotNull;

import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import com.jeffreys.common.euchre.android.HelpActivity;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelpTest {
@Rule
public ActivityTestRule activityRule = new ActivityTestRule<>(HelpActivity.class);

@Test
public void verifyActivityCanBeCreated() {
assertNotNull(activityRule.getActivity());
}
}
```

### Steps to Reproduce

```
FLAGS="-c opt --incompatible_disable_deprecated_attr_params=false --incompatible_new_actions_api=false --host_force_python=PY2"

bazel test ${FLAGS} --spawn_strategy=standalone --test_timeout=300 //javatests/com/jeffreys/euchrepay/googleplay/...
```

This is on my system, though reproducing on another system is likely to be a challenge.

### Expected Results
Test runs and generates the proper pass/fail results

### Actual Results
```
There was 1 failure:
1) initializationError(com.google.android.apps.common.testing.suite.AndroidDeviceTestSuite)
java.lang.RuntimeException: Failed to create tests for given list of methods:
com.jeffreys.common.euchre.ui.HelpTest#verifyActivityCanBeCreated
com.jeffreys.common.euchre.ui.PreferencesTest#verifyActivityCanBeCreated
com.jeffreys.common.euchre.ui.TestGame#testCardLoader
com.jeffreys.common.euchre.ui.TestGame#testOnRestart
com.jeffreys.common.euchre.ui.TestGame#testPauseResume
com.jeffreys.common.euchre.ui.TestGame#verifyActivityCreated
com.jeffreys.common.euchre.ui.TestGame#verifyRestart
com.jeffreys.common.euchre.ui.UIUtilTest#verifyCardToDrawableId
com.jeffreys.common.euchre.ui.UIUtilTest#verifySVGLoading
com.jeffreys.common.euchre.ui.UIUtilTest#verifyUniqueIds
com.jeffreys.common.euchre.ui.ViewHandsTest#verifyActivityCreated
com.jeffreys.common.euchre.ui.ViewHandsTest#verifyCount
com.jeffreys.common.euchre.ui.ViewStatsTest#verifyActivityIsCreated
com.jeffreys.common.euchre.ui.ViewStatsTest#verifyListHasItems
com.jeffreys.common.euchre.ui.ViewStatsTest#verifyNumberOfGamesIsShown
at com.google.android.apps.common.testing.suite.AndroidDeviceTestSuite$Builder.makeNativeTestSuite(AndroidDeviceTe
stSuite.java:188)
at com.google.android.apps.common.testing.suite.AndroidDeviceTestSuite$Builder.build(AndroidDeviceTestSuite.java:1
03)
at com.google.android.apps.common.testing.suite.AndroidDeviceTestSuite.suite(AndroidDeviceTestSuite.java:64)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.internal.runners.SuiteMethod.testFromSuiteMethod(SuiteMethod.java:35)
at org.junit.internal.runners.SuiteMethod.(SuiteMethod.java:24)
at org.junit.internal.builders.SuiteMethodBuilder.runnerForClass(SuiteMethodBuilder.java:11)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:2
6)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at com.google.testing.junit.runner.internal.junit4.MemoizingRequest.createRunner(MemoizingRequest.java:48)
at com.google.testing.junit.runner.internal.junit4.MemoizingRequest.getRunner(MemoizingRequest.java:34)
at com.google.testing.junit.runner.junit4.JUnit4TestModelBuilder.get(JUnit4TestModelBuilder.java:49)
at com.google.testing.junit.runner.junit4.JUnit4TestModelBuilder.get(JUnit4TestModelBuilder.java:27)
at com.google.testing.junit.runner.util.MemoizingSupplier.get(MemoizingSupplier.java:44)
at com.google.testing.junit.runner.junit4.JUnit4Runner.run(JUnit4Runner.java:92)
at com.google.testing.junit.runner.BazelTestRunner.runTestsInSuite(BazelTestRunner.java:153)
at com.google.testing.junit.runner.BazelTestRunner.main(BazelTestRunner.java:84)
Caused by: java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:888)
at com.google.android.apps.common.testing.suite.AndroidGoogleTest.(AndroidGoogleTest.java:96)
at com.google.android.apps.common.testing.suite.AndroidGoogleTest.(AndroidGoogleTest.java:58)
at com.google.android.apps.common.testing.suite.AndroidGoogleTest$Builder.build(AndroidGoogleTest.java:162)
at com.google.android.apps.common.testing.suite.AndroidDeviceTestSuite$Builder.makeNativeTestSuite(AndroidDeviceTe
stSuite.java:181)
... 21 more
```

### AndroidX Test and Android OS Versions

bazel 3.3.1

```
android_sdk_repository(
name="androidsdk",
path="/var/lib/jenkins/tools/android-sdk",
api_level=29,
build_tools_version="29.0.3")
...

git_repository(
name = "android_test_support",
commit = "e694b99",
remote = "https://github.com/android/android-test",
)

maven_install(
artifacts = [
"androidx.annotation:annotation:1.1.0",
"androidx.appcompat:appcompat:1.1.0",
"androidx.fragment:fragment:1.1.0",
"androidx.preference:preference:1.1.0",
"androidx.core:core:1.1.0",
"androidx.test.espresso:espresso-core:3.3.0-rc01",
"androidx.test.espresso:espresso-idling-resource:3.3.0-rc01",
"androidx.test:core:1.3.0-rc01",
"androidx.test.ext:junit:1.1.2-rc01",
"androidx.test:monitor:1.3.0-rc01",
"androidx.test:rules:1.3.0-rc01",
"androidx.test:runner:1.3.0-rc01",
"com.google.android.gms:play-services-ads:18.2.0",
"com.google.android.gms:play-services-ads-lite:18.2.0",

...
]
)
```

### Link to a public git repo demonstrating the problem:
My repo is private

Contributor guide

Open the contributing guide

Research direction

Start by running the reported Bazel test target and inspect AndroidGoogleTest.java around the constructor at line 96. Trace the null stackTraceFile value from controller.getDeviceProperties() and determine how the Android device configuration produces it. Done means the instrumentation tests initialize and report their pass/fail results without this NullPointerException.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java
Domain
mobile, testing-qa
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.