diff options
2 files changed, 29 insertions, 11 deletions
diff --git a/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java b/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java index d0eebb380..cd0527878 100644 --- a/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java +++ b/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java @@ -281,8 +281,11 @@ public class StatsdListener extends BaseMetricListener { /** Format a JUnit {@link Description} to a desired string format. */ @VisibleForTesting String formatDescription(Description description) { - return String.join( - "#", description.getTestClass().getCanonicalName(), description.getMethodName()); + // Use String.valueOf() to guard agaist a null class name. This normally should not happen + // but the Description class does not explicitly guarantee it. + String className = String.valueOf(description.getClassName()); + String methodName = description.getMethodName(); + return methodName == null ? className : String.join("#", className, methodName); } /** diff --git a/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java b/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java index e63fa976a..731f3de79 100644 --- a/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java +++ b/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java @@ -236,7 +236,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), StatsdListener.REPORT_FILENAME_PREFIX, - TEST_CLASS.getCanonicalName(), + description.getClassName(), TEST_METHOD_NAME_1, CONFIG_NAME_1, StatsdListener.PROTO_EXTENSION), @@ -250,7 +250,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), StatsdListener.REPORT_FILENAME_PREFIX, - TEST_CLASS.getCanonicalName(), + description.getClassName(), TEST_METHOD_NAME_1, CONFIG_NAME_1, StatsdListener.PROTO_EXTENSION)); @@ -262,7 +262,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), StatsdListener.REPORT_FILENAME_PREFIX, - TEST_CLASS.getCanonicalName(), + description.getClassName(), TEST_METHOD_NAME_1, CONFIG_NAME_2, StatsdListener.PROTO_EXTENSION), @@ -276,7 +276,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), StatsdListener.REPORT_FILENAME_PREFIX, - TEST_CLASS.getCanonicalName(), + description.getClassName(), TEST_METHOD_NAME_1, CONFIG_NAME_2, StatsdListener.PROTO_EXTENSION)); @@ -310,7 +310,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_ROOT, StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), - TEST_CLASS.getCanonicalName(), + description1.getClassName(), TEST_METHOD_NAME_1, String.valueOf(1))); @@ -329,7 +329,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_ROOT, StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), - TEST_CLASS.getCanonicalName(), + description2.getClassName(), TEST_METHOD_NAME_2, String.valueOf(1))); @@ -363,7 +363,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_ROOT, StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), - TEST_CLASS.getCanonicalName(), + description1.getClassName(), TEST_METHOD_NAME_1, String.valueOf(1))); @@ -383,7 +383,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_ROOT, StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), - TEST_CLASS.getCanonicalName(), + description2.getClassName(), TEST_METHOD_NAME_1, String.valueOf(2))); @@ -420,7 +420,7 @@ public class StatsdListenerTest { StatsdListener.REPORT_PATH_ROOT, StatsdListener.REPORT_PATH_TEST_LEVEL) .toString(), - TEST_CLASS.getCanonicalName(), + testDescription.getClassName(), TEST_METHOD_NAME_1, String.valueOf(1))); @@ -516,6 +516,21 @@ public class StatsdListenerTest { verify(mListener, never()).removeStatsConfig(anyLong()); } + /** + * Test that the collector can work with arbitrarily constructed test descriptions. + * + * <p>This test was created as some runners will create new descriptions on the fly. + */ + @Test + public void testArbitraryTestDescription() { + // Creates a description with no test class and method. + Description arbitraryDescription = Description.createSuiteDescription("some_test"); + + // The test passes if no exceptions are thrown in these callbacks. + mListener.onTestStart(mock(DataRecord.class), arbitraryDescription); + mListener.onTestEnd(mock(DataRecord.class), arbitraryDescription); + } + /** Returns a Mockito argument matcher that matches the exact file name. */ private File getExactFileNameMatcher(String parentName, String filename) { return argThat(f -> f.getParent().contains(parentName) && f.getName().equals(filename)); |