Test varg variants of the command builders in API tests.

Change-Id: Ifffc262e20ca6affe8d85c3a58a144b712fdbc98
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
index 363b80c..4e080b7 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/D8ApiUsageSample.java
@@ -97,18 +97,19 @@
       throw new RuntimeException("Must supply main-dex-list inputs");
     }
 
-    useProgramFileBuilder(CompilationMode.DEBUG, minApiLevel, libraries, classpath, inputs);
-    useProgramFileBuilder(CompilationMode.RELEASE, minApiLevel, libraries, classpath, inputs);
-    useProgramDataBuilder(minApiLevel, libraries, classpath, inputs);
-    useProgramProvider(minApiLevel, libraries, classpath, inputs);
+    useProgramFileList(CompilationMode.DEBUG, minApiLevel, libraries, classpath, inputs);
+    useProgramFileList(CompilationMode.RELEASE, minApiLevel, libraries, classpath, inputs);
+    useProgramData(minApiLevel, libraries, classpath, inputs);
+    useProgramResourceProvider(minApiLevel, libraries, classpath, inputs);
     useLibraryAndClasspathProvider(minApiLevel, libraries, classpath, inputs);
     useMainDexListFiles(minApiLevel, libraries, classpath, inputs, mainDexList);
     useMainDexClasses(minApiLevel, libraries, classpath, inputs, mainDexList);
+    useVArgVariants(minApiLevel, libraries, classpath, inputs, mainDexList);
     incrementalCompileAndMerge(minApiLevel, libraries, classpath, inputs);
   }
 
   // Check API support for compiling Java class-files from the file system.
-  private static void useProgramFileBuilder(
+  private static void useProgramFileList(
       CompilationMode mode,
       int minApiLevel,
       Collection<Path> libraries,
@@ -130,7 +131,7 @@
   }
 
   // Check API support for compiling Java class-files from byte content.
-  private static void useProgramDataBuilder(
+  private static void useProgramData(
       int minApiLevel,
       Collection<Path> libraries,
       Collection<Path> classpath,
@@ -145,6 +146,11 @@
       for (ClassFileContent classfile : readClassFiles(inputs)) {
         builder.addClassProgramData(classfile.data, classfile.origin);
       }
+      for (Path input : inputs) {
+        if (isDexFile(input)) {
+          builder.addDexProgramData(Files.readAllBytes(input), new PathOrigin(input));
+        }
+      }
       D8.run(builder.build());
     } catch (CompilationFailedException e) {
       throw new RuntimeException("Unexpected compilation exceptions", e);
@@ -154,7 +160,7 @@
   }
 
   // Check API support for compiling Java class-files from a program provider abstraction.
-  private static void useProgramProvider(
+  private static void useProgramResourceProvider(
       int minApiLevel,
       Collection<Path> libraries,
       Collection<Path> classpath,
@@ -171,7 +177,7 @@
           builder.addProgramResourceProvider(
               ArchiveProgramResourceProvider.fromArchive(
                   input, ArchiveProgramResourceProvider::includeClassFileEntries));
-        } else {
+        } else if (isClassFile(input)) {
           builder.addProgramResourceProvider(
               new ProgramResourceProvider() {
                 @Override
@@ -179,6 +185,14 @@
                   return Collections.singleton(ProgramResource.fromFile(Kind.CF, input));
                 }
               });
+        } else if (isDexFile(input)) {
+          builder.addProgramResourceProvider(
+              new ProgramResourceProvider() {
+                @Override
+                public Collection<ProgramResource> getProgramResources() throws ResourceException {
+                  return Collections.singleton(ProgramResource.fromFile(Kind.DEX, input));
+                }
+              });
         }
       }
       D8.run(builder.build());
@@ -266,6 +280,32 @@
     }
   }
 
+  // Check API support for all the varg variants.
+  private static void useVArgVariants(
+      int minApiLevel,
+      List<Path> libraries,
+      List<Path> classpath,
+      List<Path> inputs,
+      List<Path> mainDexList) {
+    try {
+      D8.run(
+          D8Command.builder(handler)
+              .setMinApiLevel(minApiLevel)
+              .setProgramConsumer(new EnsureOutputConsumer())
+              .addLibraryFiles(libraries.get(0))
+              .addLibraryFiles(libraries.stream().skip(1).toArray(Path[]::new))
+              .addClasspathFiles(classpath.get(0))
+              .addClasspathFiles(classpath.stream().skip(1).toArray(Path[]::new))
+              .addProgramFiles(inputs.get(0))
+              .addProgramFiles(inputs.stream().skip(1).toArray(Path[]::new))
+              .addMainDexListFiles(mainDexList.get(0))
+              .addMainDexListFiles(mainDexList.stream().skip(1).toArray(Path[]::new))
+              .build());
+    } catch (CompilationFailedException e) {
+      throw new RuntimeException("Unexpected compilation exceptions", e);
+    }
+  }
+
   private static void incrementalCompileAndMerge(
       int minApiLevel,
       Collection<Path> libraries,
@@ -380,6 +420,15 @@
     return file.endsWith(".class");
   }
 
+  private static boolean isDexFile(Path file) {
+    return isDexFile(file.toString());
+  }
+
+  private static boolean isDexFile(String file) {
+    file = file.toLowerCase();
+    return file.endsWith(".dex");
+  }
+
   private static boolean isArchive(Path file) {
     return isArchive(file.toString());
   }
diff --git a/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java b/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java
index d069d05..7230f55 100644
--- a/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java
+++ b/src/test/apiUsageSample/com/android/tools/apiusagesample/R8ApiUsageSample.java
@@ -101,21 +101,22 @@
       throw new RuntimeException("Must supply pg-conf inputs");
     }
 
-    useProgramFileBuilder(CompilationMode.DEBUG, minApiLevel, libraries, inputs);
-    useProgramFileBuilder(CompilationMode.RELEASE, minApiLevel, libraries, inputs);
-    useProgramDataBuilder(minApiLevel, libraries, inputs);
-    useProgramProvider(minApiLevel, libraries, inputs);
-    useLibraryProvider(minApiLevel, libraries, inputs);
+    useProgramFileList(CompilationMode.DEBUG, minApiLevel, libraries, inputs);
+    useProgramFileList(CompilationMode.RELEASE, minApiLevel, libraries, inputs);
+    useProgramData(minApiLevel, libraries, inputs);
+    useProgramResourceProvider(minApiLevel, libraries, inputs);
+    useLibraryResourceProvider(minApiLevel, libraries, inputs);
     useMainDexListFiles(minApiLevel, libraries, inputs, mainDexList);
     useMainDexClasses(minApiLevel, libraries, inputs, mainDexList);
     useMainDexRulesFiles(minApiLevel, libraries, inputs, mainDexRules);
     useMainDexRules(minApiLevel, libraries, inputs, mainDexRules);
     useProguardConfigFiles(minApiLevel, libraries, inputs, mainDexList, pgConf);
     useProguardConfigLines(minApiLevel, libraries, inputs, mainDexList, pgConf);
+    useVArgVariants(minApiLevel, libraries, inputs, mainDexList, mainDexRules, pgConf);
   }
 
   // Check API support for compiling Java class-files from the file system.
-  private static void useProgramFileBuilder(
+  private static void useProgramFileList(
       CompilationMode mode, int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8.run(
@@ -132,7 +133,7 @@
   }
 
   // Check API support for compiling Java class-files from byte content.
-  private static void useProgramDataBuilder(
+  private static void useProgramData(
       int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8Command.Builder builder =
@@ -152,7 +153,7 @@
   }
 
   // Check API support for compiling Java class-files from a program provider abstraction.
-  private static void useProgramProvider(
+  private static void useProgramResourceProvider(
       int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8Command.Builder builder =
@@ -181,7 +182,7 @@
     }
   }
 
-  private static void useLibraryProvider(
+  private static void useLibraryResourceProvider(
       int minApiLevel, Collection<Path> libraries, Collection<Path> inputs) {
     try {
       R8Command.Builder builder =
@@ -339,6 +340,35 @@
     }
   }
 
+  // Check API support for all the varg variants.
+  private static void useVArgVariants(
+      int minApiLevel,
+      List<Path> libraries,
+      List<Path> inputs,
+      List<Path> mainDexList,
+      List<Path> mainDexRules,
+      List<Path> pgConf) {
+    try {
+      R8.run(
+          R8Command.builder(handler)
+              .setMinApiLevel(minApiLevel)
+              .setProgramConsumer(new EnsureOutputConsumer())
+              .addLibraryFiles(libraries.get(0))
+              .addLibraryFiles(libraries.stream().skip(1).toArray(Path[]::new))
+              .addProgramFiles(inputs.get(0))
+              .addProgramFiles(inputs.stream().skip(1).toArray(Path[]::new))
+              .addMainDexListFiles(mainDexList.get(0))
+              .addMainDexListFiles(mainDexList.stream().skip(1).toArray(Path[]::new))
+              .addMainDexRulesFiles(mainDexRules.get(0))
+              .addMainDexRulesFiles(mainDexRules.stream().skip(1).toArray(Path[]::new))
+              .addProguardConfigurationFiles(pgConf.get(0))
+              .addProguardConfigurationFiles(pgConf.stream().skip(1).toArray(Path[]::new))
+              .build());
+    } catch (CompilationFailedException e) {
+      throw new RuntimeException("Unexpected compilation exceptions", e);
+    }
+  }
+
   // Helpers for tests.
   // Some of this reimplements stuff in R8 utils, but that is not public API and we should not
   // rely on it.