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.