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");
     }