Merge "Rename serial number environment variable to ANDROID_SERIAL"
diff --git a/test_framework/com/android/tradefed/testtype/GTestListener.java b/test_framework/com/android/tradefed/testtype/GTestListener.java
index c967d06..38c6498 100644
--- a/test_framework/com/android/tradefed/testtype/GTestListener.java
+++ b/test_framework/com/android/tradefed/testtype/GTestListener.java
@@ -22,8 +22,10 @@
 import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.result.proto.TestRecordProto.FailureStatus;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -32,6 +34,7 @@
  */
 final class GTestListener extends ResultForwarder {
 
+    private static final int MAX_PARTIAL_SET_SIZE = 20;
     private Set<TestDescription> mTests = new HashSet<>();
     private Set<TestDescription> mDuplicateTests = new HashSet<>();
 
@@ -50,11 +53,19 @@
     @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
         if (!mDuplicateTests.isEmpty()) {
-            FailureDescription error =
-                    FailureDescription.create(
-                            String.format(
-                                    "The following tests ran more than once: %s.",
-                                    mDuplicateTests));
+            StringBuilder errorMessage = new StringBuilder();
+            errorMessage.append(
+                    String.format("%s tests ran more than once.", mDuplicateTests.size()));
+            if (mDuplicateTests.size() > MAX_PARTIAL_SET_SIZE) {
+                List<TestDescription> partialDuplicateSet = new ArrayList<>(mDuplicateTests);
+                while (partialDuplicateSet.size() > MAX_PARTIAL_SET_SIZE) {
+                    partialDuplicateSet.remove(0);
+                }
+                errorMessage.append(String.format(" Partial list: %s", partialDuplicateSet));
+            } else {
+                errorMessage.append(String.format(" Full list: %s", mDuplicateTests));
+            }
+            FailureDescription error = FailureDescription.create(errorMessage.toString());
             error.setFailureStatus(FailureStatus.TEST_FAILURE);
             super.testRunFailed(error);
         }
diff --git a/tests/src/com/android/tradefed/testtype/GTestListenerTest.java b/tests/src/com/android/tradefed/testtype/GTestListenerTest.java
index 392ee75..d05f3fb 100644
--- a/tests/src/com/android/tradefed/testtype/GTestListenerTest.java
+++ b/tests/src/com/android/tradefed/testtype/GTestListenerTest.java
@@ -96,7 +96,7 @@
         String moduleName = "testWithDuplicateTests";
         String testClass = "testClass";
         String testName1 = "testName1";
-        String duplicateTestsMessage = "The following tests ran more than once: ";
+        String duplicateTestsMessage = "1 tests ran more than once. Full list:";
         TestDescription testId1 = new TestDescription(testClass, testName1);
 
         mMockListener.testRunStarted(EasyMock.eq(moduleName), EasyMock.eq(2));