Add new assertion failure messages

Change-Id: I00b7ac5ef60019e4c337e522325ad61b842db8ed
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java
index c266f7f..8fad352 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversion.java
@@ -20,7 +20,10 @@
 import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Map;
 import java.util.zip.CRC32;
 import java.util.zip.ZipEntry;
@@ -37,16 +40,19 @@
   private final Map<String, String> wrapConvertOwnerMap =
       CustomConversionAsmRewriteDescription.getWrapConvertOwnerMap();
 
-  public static void generateJars(Path jar, Path outputDirectory) throws IOException {
+  public static Collection<Path> generateJars(Path jar, Path outputDirectory) throws IOException {
+    List<Path> generatedJars = new ArrayList<>();
     for (CustomConversionVersion version : CustomConversionVersion.values()) {
-      new GenerateCustomConversion(version).convert(jar, outputDirectory);
+      generatedJars.add(new GenerateCustomConversion(version).convert(jar, outputDirectory));
     }
+    return generatedJars;
   }
 
-  private void convert(Path jar, Path outputDirectory) throws IOException {
+  private Path convert(Path jar, Path outputDirectory) throws IOException {
     Path convertedJar = outputDirectory.resolve(version.getFileName());
     internalConvert(jar, convertedJar);
     assert Files.exists(convertedJar) : "Custom conversion generation did not generate anything.";
+    return convertedJar;
   }
 
   private void internalConvert(Path jar, Path convertedJar) throws IOException {
@@ -55,33 +61,30 @@
     try (ZipOutputStream out =
         new ZipOutputStream(
             new BufferedOutputStream(Files.newOutputStream(convertedJar, options)))) {
-      new GenerateCustomConversion(version).convert(jar, out, version);
+      new GenerateCustomConversion(version).convert(jar, out);
     }
   }
 
-  private void convert(
-      Path desugaredLibraryFiles, ZipOutputStream out, CustomConversionVersion legacy)
-      throws IOException {
+  private void convert(Path desugaredLibraryFiles, ZipOutputStream out) throws IOException {
     boolean fileGotWritten = false;
     try (ZipFile zipFile = new ZipFile(desugaredLibraryFiles.toFile(), StandardCharsets.UTF_8)) {
       final Enumeration<? extends ZipEntry> entries = zipFile.entries();
       while (entries.hasMoreElements()) {
         ZipEntry entry = entries.nextElement();
         try (InputStream entryStream = zipFile.getInputStream(entry)) {
-          fileGotWritten |= handleFile(entry, entryStream, out, legacy);
+          fileGotWritten |= handleFile(entry, entryStream, out);
         }
       }
     }
     assert fileGotWritten : "No files were written when converting custom conversions.";
   }
 
-  private boolean handleFile(
-      ZipEntry entry, InputStream input, ZipOutputStream out, CustomConversionVersion legacy)
+  private boolean handleFile(ZipEntry entry, InputStream input, ZipOutputStream out)
       throws IOException {
     if (!entry.getName().endsWith(".class")) {
       return false;
     }
-    if (legacy == CustomConversionVersion.LEGACY
+    if (version == CustomConversionVersion.LEGACY
         && (entry.getName().contains("java/nio/file")
             || entry.getName().contains("ApiFlips")
             || entry.getName().contains("java/adapter"))) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java
index 0f203a8..fc8552b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/customconversion/GenerateCustomConversionTest.java
@@ -17,11 +17,15 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.CustomConversionVersion;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Sets.SetView;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.Enumeration;
+import java.util.Set;
 import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
@@ -47,21 +51,55 @@
   }
 
   @Test
-  public void testCustomConversionIsUpToDate() throws IOException {
+  public void testCustomConversionIsUpToDate() throws Exception {
     Assume.assumeFalse("JDK8 not present on windows", ToolHelper.isWindows());
 
     // Regenerate the files in a temp directory.
     Path customConversionDir = temp.newFolder("custom_conversion").toPath();
-    generateCustomConversions(temp, customConversionDir);
+    Collection<Path> generatedJars = generateCustomConversions(temp, customConversionDir);
 
     for (CustomConversionVersion version : CustomConversionVersion.values()) {
       // Assert the file is generated.
       Path newFile = customConversionDir.resolve(version.getFileName());
-      assertTrue(Files.exists(newFile));
+      String message =
+          "File " + newFile + " was not generated, but " + generatedJars + " were generated.";
+      assertTrue(message, generatedJars.contains(newFile));
+      assertTrue(message, Files.exists(newFile));
 
       // Assert the file matches the one in third_party.
       Path thirdPartyFile = ToolHelper.getDesugarLibConversions(version);
-      assertTrue(filesAreEqual(newFile, thirdPartyFile));
+      uploadJarsToCloudStorageIfTestFails(
+          (file1, file2) -> {
+            verifySameFilesInJar(file1, file2);
+            assertProgramsEqual(file1, file2);
+            return filesAreEqual(file1, file2);
+          },
+          newFile,
+          thirdPartyFile);
+    }
+  }
+
+  private static void verifySameFilesInJar(Path file1, Path file2) throws IOException {
+    try (ZipFile zipFile1 = new ZipFile(file1.toFile())) {
+      try (ZipFile zipFile2 = new ZipFile(file2.toFile())) {
+        Enumeration<? extends ZipEntry> entries1 = zipFile1.entries();
+        Enumeration<? extends ZipEntry> entries2 = zipFile2.entries();
+        Set<String> s1 = Sets.newHashSet();
+        while (entries1.hasMoreElements()) {
+          ZipEntry entry = entries1.nextElement();
+          s1.add(entry.getName());
+        }
+        Set<String> s2 = Sets.newHashSet();
+        while (entries2.hasMoreElements()) {
+          ZipEntry entry = entries2.nextElement();
+          s2.add(entry.getName());
+        }
+        SetView<String> intersection = Sets.intersection(s1, s2);
+        Set<String> inter = Sets.newHashSet(intersection);
+        s1.removeAll(inter);
+        s2.removeAll(inter);
+        assert s1.isEmpty() && s2.isEmpty() : "Extra files in " + s1 + " or " + s2;
+      }
     }
   }
 
@@ -75,8 +113,8 @@
     }
   }
 
-  private static void generateCustomConversions(TemporaryFolder temp, Path destinationDir)
-      throws IOException {
+  private static Collection<Path> generateCustomConversions(
+      TemporaryFolder temp, Path destinationDir) throws IOException {
     temp.create();
     Files.createDirectories(destinationDir);
 
@@ -103,10 +141,12 @@
     assert verifyRawOutput(raw);
 
     // Asm rewrite the jar.
-    GenerateCustomConversion.generateJars(raw, destinationDir);
+    Collection<Path> generateJars = GenerateCustomConversion.generateJars(raw, destinationDir);
 
     // No need to keep the raw jar.
     Files.delete(raw);
+
+    return generateJars;
   }
 
   private static boolean verifyRawOutput(Path output) throws IOException {