On test failure, dump logged but not yet asserted messages

This greatly helps debugging failing tests as one now sees what
messages are missing assertions.

Change-Id: Ibaa3c822dfe1f22c51a6c7aef8630441b7c70668
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
index e7a137a..2d456c0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
@@ -47,8 +47,7 @@
         }
       }
     }
-    assertNotNull("Could not find log message containing '" + needle + "'", hit);
-    assertTrue("Could not remove log message containing '" + needle + "'", records.remove(hit));
+    removeLogHit(hit, "containing '" + needle + "'");
   }
 
   protected final void assertLogMessageContains(String needle) {
@@ -66,10 +65,14 @@
         hit = record;
       }
     }
-    assertNotNull("Could not find log message with a Throwable containing '" + needle + "'", hit);
-    assertTrue(
-        "Could not remove log message with a Throwable containing '" + needle + "'",
-        records.remove(hit));
+    removeLogHit(hit, "with a Throwable containing '\" + needle + \"'");
+  }
+
+  private void removeLogHit(LogRecord hit, String description) {
+    if (hit == null) {
+      failWithUnassertedLogDump("Could not find log message " + description);
+    }
+    assertTrue("Could not remove log message " + description, records.remove(hit));
   }
 
   // As the PowerMock runner does not pass through runTest, we inject log
@@ -77,17 +80,27 @@
   @After
   public final void assertNoUnassertedLogEvents() {
     if (records.size() > 0) {
-      LogRecord record = records.iterator().next();
-      String msg = "Found untreated logged events. First one is:\n";
-      msg += record.getMessage();
-      Throwable t = record.getThrown();
-      if (t != null) {
-        msg += "\n" + t;
-      }
-      fail(msg);
+      failWithUnassertedLogDump("Found unasserted logged events.");
     }
   }
 
+  public final void failWithUnassertedLogDump(String msg) {
+    msg += "\n";
+    if (records.size() == 0) {
+      msg += "(All logged messages have already been asserted)";
+    } else {
+      msg += records.size() + " logged, but not yet asserted messages remain:";
+      for (LogRecord record : records) {
+        msg += "\n" + record.getMessage();
+        Throwable t = record.getThrown();
+        if (t != null) {
+          msg += "\n   with thrown " + t;
+        }
+      }
+    }
+    fail(msg);
+  }
+
   @Override
   public void setUp() throws Exception {
     super.setUp();