Add usage of main-dex rules to D8 API test.

Bug: 176880642
Change-Id: Ibd6c56da0ca933b4b65309fd58768f9a3ce52bc6
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
index 642a4ab..27dbc0f 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
@@ -71,6 +71,7 @@
     List<Path> libraries = new ArrayList<>(1);
     List<Path> classpath = new ArrayList<>(args.length);
     List<Path> mainDexList = new ArrayList<>(1);
+    List<Path> mainDexRules = new ArrayList<>(1);
     List<Path> inputs = new ArrayList<>(args.length);
     for (int i = 0; i < args.length; i++) {
       if (args[i].equals("--lib")) {
@@ -79,6 +80,8 @@
         classpath.add(Paths.get(args[++i]));
       } else if (args[i].equals("--main-dex-list")) {
         mainDexList.add(Paths.get(args[++i]));
+      } else if (args[i].equals("--main-dex-rules")) {
+        mainDexRules.add(Paths.get(args[++i]));
       } else if (isArchive(args[i]) || isClassFile(args[i])) {
         inputs.add(Paths.get(args[i]));
       }
@@ -98,6 +101,9 @@
     if (mainDexList.isEmpty()) {
       throw new RuntimeException("Must supply main-dex-list inputs");
     }
+    if (mainDexRules.isEmpty()) {
+      throw new RuntimeException("Must supply main-dex-rules inputs");
+    }
 
     useProgramFileList(CompilationMode.DEBUG, minApiLevel, libraries, classpath, inputs);
     useProgramFileList(CompilationMode.RELEASE, minApiLevel, libraries, classpath, inputs);
@@ -106,6 +112,8 @@
     useLibraryAndClasspathProvider(minApiLevel, libraries, classpath, inputs);
     useMainDexListFiles(minApiLevel, libraries, classpath, inputs, mainDexList);
     useMainDexClasses(minApiLevel, libraries, classpath, inputs, mainDexList);
+    useMainDexRulesFiles(minApiLevel, libraries, classpath, inputs, mainDexRules);
+    useMainDexRules(minApiLevel, libraries, classpath, inputs, mainDexRules);
     useAssertionConfig(minApiLevel, libraries, classpath, inputs);
     useVArgVariants(minApiLevel, libraries, classpath, inputs, mainDexList);
     incrementalCompileAndMerge(minApiLevel, libraries, classpath, inputs);
@@ -283,6 +291,53 @@
     }
   }
 
+  private static void useMainDexRulesFiles(
+      int minApiLevel,
+      Collection<Path> libraries,
+      Collection<Path> classpath,
+      Collection<Path> inputs,
+      Collection<Path> mainDexRules) {
+    try {
+      D8.run(
+          D8Command.builder(handler)
+              .setMinApiLevel(minApiLevel)
+              .setProgramConsumer(new EnsureOutputConsumer())
+              .addLibraryFiles(libraries)
+              .addClasspathFiles(classpath)
+              .addProgramFiles(inputs)
+              .addMainDexRulesFiles(mainDexRules)
+              .build());
+    } catch (CompilationFailedException e) {
+      throw new RuntimeException("Unexpected compilation exceptions", e);
+    }
+  }
+
+  private static void useMainDexRules(
+      int minApiLevel,
+      Collection<Path> libraries,
+      Collection<Path> classpath,
+      Collection<Path> inputs,
+      Collection<Path> mainDexRulesFiles) {
+    try {
+      D8Command.Builder builder =
+          D8Command.builder(handler)
+              .setMinApiLevel(minApiLevel)
+              .setProgramConsumer(new EnsureOutputConsumer())
+              .addLibraryFiles(libraries)
+              .addClasspathFiles(classpath)
+              .addProgramFiles(inputs);
+      for (Path mainDexRulesFile : mainDexRulesFiles) {
+        builder.addMainDexRules(
+            Files.readAllLines(mainDexRulesFile), new PathOrigin(mainDexRulesFile));
+      }
+      D8.run(builder.build());
+    } catch (CompilationFailedException e) {
+      throw new RuntimeException("Unexpected compilation exceptions", e);
+    } catch (IOException e) {
+      throw new RuntimeException("Unexpected IO exception", e);
+    }
+  }
+
   private static void useAssertionConfig(
       int minApiLevel,
       Collection<Path> libraries,
diff --git a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
index 2c53667..8e33480 100644
--- a/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
+++ b/src/test/java/com/android/tools/r8/D8ApiBinaryCompatibilityTests.java
@@ -58,6 +58,9 @@
     Path mainDexList = temp.getRoot().toPath().resolve("maindexlist.txt");
     FileUtils.writeTextFile(mainDexList, "desugaringwithmissingclasstest1/Main.class");
 
+    Path mainDexRules = temp.getRoot().toPath().resolve("maindex.rules");
+    FileUtils.writeTextFile(mainDexRules, "# empty file");
+
     // It is important to place the api usage sample jar after the current classpath because we want
     // to find D8/R8 classes before the ones in the jar, otherwise renamed classes and fields cannot
     // be found.
@@ -67,7 +70,8 @@
             .addAll(
                 ImmutableList.of(
                     ToolHelper.getJavaExecutable(),
-                    "-cp", classPath,
+                    "-cp",
+                    classPath,
                     main,
                     // Compiler arguments.
                     "--output",
@@ -76,9 +80,11 @@
                     Integer.toString(minApiLevel),
                     "--main-dex-list",
                     mainDexList.toString(),
+                    "--main-dex-rules",
+                    mainDexRules.toString(),
                     "--lib",
-                    ToolHelper.getAndroidJar(
-                        AndroidApiLevel.getAndroidApiLevel(minApiLevel)).toString(),
+                    ToolHelper.getAndroidJar(AndroidApiLevel.getAndroidApiLevel(minApiLevel))
+                        .toString(),
                     "--classpath",
                     lib1.toString(),
                     "--classpath",
diff --git a/tests/r8_api_usage_sample.jar b/tests/r8_api_usage_sample.jar
index c50e110..65070f5 100644
--- a/tests/r8_api_usage_sample.jar
+++ b/tests/r8_api_usage_sample.jar
Binary files differ