include test-case resolution at the end of the build log

Added test-case resolution in all log modes.
https://github.com/bazelbuild/bazel/issues/1506

Closes #5429.

PiperOrigin-RevId: 210362746
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java b/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
index ee0f08c..c48ebbc 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
@@ -108,7 +108,7 @@
     TestSummary summary = createTestSummary(stubTarget, BlazeTestStatus.PASSED, NOT_CACHED);
     TestSummaryPrinter.print(summary, terminalPrinter, true, false);
 
-    terminalPrinter.print(find(expectedString));
+    verify(terminalPrinter).print(find(expectedString));
   }
 
   @Test
@@ -224,6 +224,7 @@
         .build();
     assertThat(failedCacheTemplate.numCached()).isEqualTo(50);
     assertThat(failedCacheTemplate.getStatus()).isEqualTo(BlazeTestStatus.FAILED);
+    assertThat(failedCacheTemplate.getTotalTestCases()).isEqualTo(fiftyCached.getTotalTestCases());
   }
 
   @Test
@@ -437,6 +438,7 @@
   public void testCollectingFailedDetails() throws Exception {
     TestCase rootCase = TestCase.newBuilder()
         .setName("tests")
+        .setClassName("testclass")
         .setRunDurationMillis(5000L)
         .addChild(newDetail("apple", TestCase.Status.FAILED, 1000L))
         .addChild(newDetail("banana", TestCase.Status.PASSED, 1000L))
@@ -455,6 +457,57 @@
     verify(printer).print(find("ERROR.*cherry"));
   }
 
+  @Test
+  public void countTotalTestCases() throws Exception {
+    TestCase rootCase =
+        TestCase.newBuilder()
+            .setName("tests")
+            .setRunDurationMillis(5000L)
+            .addChild(newDetail("apple", TestCase.Status.FAILED, 1000L))
+            .addChild(newDetail("banana", TestCase.Status.PASSED, 1000L))
+            .addChild(newDetail("cherry", TestCase.Status.ERROR, 1000L))
+            .build();
+
+    TestSummary summary =
+        getTemplateBuilder()
+            .countTotalTestCases(rootCase)
+            .setStatus(BlazeTestStatus.FAILED)
+            .build();
+
+    assertThat(summary.getTotalTestCases()).isEqualTo(3);
+  }
+
+  @Test
+  public void countTotalTestCasesInNestedTree() throws Exception {
+    TestCase aCase =
+        TestCase.newBuilder()
+            .setName("tests-1")
+            .setRunDurationMillis(5000L)
+            .addChild(newDetail("apple", TestCase.Status.FAILED, 1000L))
+            .addChild(newDetail("banana", TestCase.Status.PASSED, 1000L))
+            .addChild(newDetail("cherry", TestCase.Status.ERROR, 1000L))
+            .build();
+    TestCase anotherCase =
+        TestCase.newBuilder()
+            .setName("tests-2")
+            .setRunDurationMillis(5000L)
+            .addChild(newDetail("apple", TestCase.Status.FAILED, 1000L))
+            .addChild(newDetail("banana", TestCase.Status.PASSED, 1000L))
+            .addChild(newDetail("cherry", TestCase.Status.ERROR, 1000L))
+            .build();
+
+    TestCase rootCase =
+        TestCase.newBuilder().setName("tests").addChild(aCase).addChild(anotherCase).build();
+
+    TestSummary summary =
+        getTemplateBuilder()
+            .countTotalTestCases(rootCase)
+            .setStatus(BlazeTestStatus.FAILED)
+            .build();
+
+    assertThat(summary.getTotalTestCases()).isEqualTo(6);
+  }
+
   private ConfiguredTarget target(String path, String targetName) throws Exception {
     ConfiguredTarget target = Mockito.mock(ConfiguredTarget.class);
     when(target.getLabel()).thenReturn(Label.create(path, targetName));