Add CompatDexBuilderTests.
Bug:
Change-Id: I10688ff9e4363ff5e8e020516e25ffbf6d5088fb
diff --git a/src/test/java/com/android/tools/r8/dexmerger/Class1.java b/src/test/examples/dexmergesample/Class1.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/dexmerger/Class1.java
rename to src/test/examples/dexmergesample/Class1.java
index e87a0e8..18084b2 100644
--- a/src/test/java/com/android/tools/r8/dexmerger/Class1.java
+++ b/src/test/examples/dexmergesample/Class1.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.dexmerger;
+package dexmergesample;
public class Class1 {
public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/dexmerger/Class2.java b/src/test/examples/dexmergesample/Class2.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/dexmerger/Class2.java
rename to src/test/examples/dexmergesample/Class2.java
index fe9c125..eaec61f 100644
--- a/src/test/java/com/android/tools/r8/dexmerger/Class2.java
+++ b/src/test/examples/dexmergesample/Class2.java
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.dexmerger;
+package dexmergesample;
public class Class2 {
public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilderTests.java b/src/test/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilderTests.java
new file mode 100644
index 0000000..2ab7a0c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilderTests.java
@@ -0,0 +1,102 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.compatdexbuilder;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.D8;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.D8Output;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class CompatDexBuilderTests {
+
+ @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+
+ @Test
+ public void compileManyClasses() throws IOException, InterruptedException, ExecutionException {
+ final String SUBDIR = "naming001";
+ final String INPUT_JAR = ToolHelper.TESTS_BUILD_DIR + "examples/" + SUBDIR + ".jar";
+ final List<String> CLASS_NAMES =
+ ImmutableList.of(
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "Reflect2$A",
+ "Reflect2$B",
+ "Reflect2",
+ "Reflect");
+
+ // Run CompatDexBuilder on naming001.jar
+ Path outputZip = temp.getRoot().toPath().resolve("out.zip");
+ CompatDexBuilder.main(
+ new String[] {"--input_jar", INPUT_JAR, "--output_zip", outputZip.toString()});
+ assertTrue(outputZip.toFile().exists());
+
+ // Verify if all the classes have their corresponding ".class.dex" files in the zip.
+ Set<String> expectedNames = new HashSet<>();
+ for (String className : CLASS_NAMES) {
+ expectedNames.add(SUBDIR + "/" + className + ".class.dex");
+ }
+ try (ZipFile zipFile = new ZipFile(outputZip.toFile())) {
+ for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) {
+ ZipEntry ze = e.nextElement();
+ expectedNames.remove(ze.getName());
+ }
+ }
+ assertTrue(expectedNames.isEmpty());
+ }
+
+ @Test
+ public void compileTwoClassesAndRun()
+ throws IOException, InterruptedException, ExecutionException, CompilationFailedException {
+ // Run CompatDexBuilder on dexMergeSample.jar
+ final String INPUT_JAR = ToolHelper.EXAMPLES_BUILD_DIR + "dexmergesample.jar";
+ Path outputZip = temp.getRoot().toPath().resolve("out.zip");
+ CompatDexBuilder.main(
+ new String[] {"--input_jar", INPUT_JAR, "--output_zip", outputZip.toString()});
+
+ // Merge zip content into a single dex file.
+ Path d8OutDir = temp.newFolder().toPath();
+ D8Command.Builder d8CommandBuilder = D8Command.builder().setOutputPath(d8OutDir);
+ d8CommandBuilder.addProgramFiles(outputZip);
+ D8Output d8Output = D8.run(d8CommandBuilder.build());
+ assertEquals(d8Output.getDexResources().size(), 1);
+
+ // Validate by running methods of Class1 and Class2
+ for (String className : new String[] {"Class1", "Class2"}) {
+ ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
+ artCommandBuilder.appendClasspath(d8OutDir.resolve("classes.dex").toString());
+ artCommandBuilder.setMainClass("dexmergesample." + className);
+ String out = ToolHelper.runArt(artCommandBuilder);
+ assertEquals(out, className + "\n");
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java b/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java
index f741c91..cddb42d 100644
--- a/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java
+++ b/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java
@@ -29,8 +29,7 @@
public class DexMergerTests {
- private static final String CLASS_DIR =
- ToolHelper.TESTS_BUILD_DIR + "../classes/test/com/android/tools/r8/dexmerger";
+ private static final String CLASS_DIR = ToolHelper.EXAMPLES_BUILD_DIR + "classes/dexmergesample";
private static final String CLASS1_CLASS = CLASS_DIR + "/Class1.class";
private static final String CLASS2_CLASS = CLASS_DIR + "/Class2.class";
private static final int MAX_METHOD_COUNT = Constants.U16BIT_MAX;
@@ -63,7 +62,7 @@
for (String className : new String[] {"Class1", "Class2"}) {
ArtCommandBuilder builder = new ArtCommandBuilder();
builder.appendClasspath(outDex.toString());
- builder.setMainClass("com.android.tools.r8.dexmerger." + className);
+ builder.setMainClass("dexmergesample." + className);
String out = ToolHelper.runArt(builder);
assertEquals(out, className + "\n");
}