| // 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; | 
 |  | 
 | import static org.hamcrest.MatcherAssert.assertThat; | 
 | import static org.hamcrest.core.StringContains.containsString; | 
 |  | 
 | import com.android.tools.r8.ToolHelper.ProcessResult; | 
 | import com.android.tools.r8.utils.FileUtils; | 
 | import com.google.common.collect.ImmutableList; | 
 | import java.io.IOException; | 
 | import java.nio.file.Files; | 
 | import java.nio.file.Path; | 
 | import java.nio.file.Paths; | 
 | import java.util.concurrent.ExecutorService; | 
 | import java.util.concurrent.Executors; | 
 | import org.junit.Assert; | 
 | import org.junit.Before; | 
 | import org.junit.Test; | 
 |  | 
 | public class R8EntryPointTests extends TestBase { | 
 |  | 
 |   private static final String MAPPING = "mapping.txt"; | 
 |   private static final String SEEDS = "seeds.txt"; | 
 |   private static final Path INPUT_JAR = | 
 |       Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, "minification" + FileUtils.JAR_EXTENSION); | 
 |   private static final Path PROGUARD_FLAGS = | 
 |       Paths.get(ToolHelper.EXAMPLES_DIR, "minification",  "keep-rules.txt"); | 
 |  | 
 |   private Path testFlags; | 
 |  | 
 |   @Before | 
 |   public void setup() throws IOException { | 
 |     testFlags = temp.newFile("local.flags").toPath(); | 
 |     FileUtils.writeTextFile(testFlags, ImmutableList.of( | 
 |         "-printseeds " + SEEDS, | 
 |         "-printmapping " + MAPPING)); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testRun1Dir() throws Exception { | 
 |     Path out = temp.newFolder("outdex").toPath(); | 
 |     R8.run(getCommand(out)); | 
 |     Assert.assertTrue(Files.isRegularFile(out.resolve(ToolHelper.DEFAULT_DEX_FILENAME))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testRun1Zip() throws Exception { | 
 |     Path out = temp.newFolder("outdex").toPath().resolve("dex.zip"); | 
 |     R8.run(getCommand(out)); | 
 |     Assert.assertTrue(Files.isRegularFile(out)); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testRun2Dir() throws Exception { | 
 |     Path out = temp.newFolder("outdex").toPath(); | 
 |     ExecutorService executor = Executors.newWorkStealingPool(2); | 
 |     try { | 
 |       R8.run(getCommand(out), executor); | 
 |     } finally { | 
 |       executor.shutdown(); | 
 |     } | 
 |     Assert.assertTrue(Files.isRegularFile(out.resolve(ToolHelper.DEFAULT_DEX_FILENAME))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testRun2Zip() throws Exception { | 
 |     Path out = temp.newFolder("outdex").toPath().resolve("dex.zip"); | 
 |     ExecutorService executor = Executors.newWorkStealingPool(2); | 
 |     try { | 
 |       R8.run(getCommand(out), executor); | 
 |     } finally { | 
 |       executor.shutdown(); | 
 |     } | 
 |     Assert.assertTrue(Files.isRegularFile(out)); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testMainDir() throws IOException, InterruptedException { | 
 |     Path out = temp.newFolder("outdex").toPath(); | 
 |     ProcessResult r8 = ToolHelper.forkR8(Paths.get("."), | 
 |         "--lib", ToolHelper.getDefaultAndroidJar().toString(), | 
 |         "--output", out.toString(), | 
 |         "--pg-conf", PROGUARD_FLAGS.toString(), | 
 |         "--pg-conf", testFlags.toString(), | 
 |         INPUT_JAR.toString()); | 
 |     Assert.assertEquals(0, r8.exitCode); | 
 |     Assert.assertTrue(Files.isRegularFile(out.resolve(ToolHelper.DEFAULT_DEX_FILENAME))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testMainRelativeDir() throws IOException, InterruptedException { | 
 |     temp.newFolder("outdex"); | 
 |     Path out = Paths.get("outdex"); | 
 |     Path workingDir = temp.getRoot().toPath(); | 
 |     ProcessResult r8 = ToolHelper.forkR8(workingDir, | 
 |         "--lib", ToolHelper.getDefaultAndroidJar().toAbsolutePath().toString(), | 
 |         "--output", out.toString(), | 
 |         "--pg-conf", PROGUARD_FLAGS.toAbsolutePath().toString(), | 
 |         "--pg-conf", testFlags.toAbsolutePath().toString(), | 
 |         INPUT_JAR.toAbsolutePath().toString()); | 
 |     Assert.assertEquals(0, r8.exitCode); | 
 |     Assert.assertTrue( | 
 |         Files.isRegularFile(workingDir.resolve(out).resolve(ToolHelper.DEFAULT_DEX_FILENAME))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |  | 
 |   @Test | 
 |   public void testMainZip() throws IOException, InterruptedException { | 
 |     Path out = temp.newFolder("outdex").toPath().resolve("dex.zip"); | 
 |     ProcessResult r8 = ToolHelper.forkR8(Paths.get("."), | 
 |         "--lib", ToolHelper.getDefaultAndroidJar().toString(), | 
 |         "--output", out.toString(), | 
 |         "--pg-conf", PROGUARD_FLAGS.toString(), | 
 |         "--pg-conf", testFlags.toString(), | 
 |         INPUT_JAR.toString()); | 
 |     Assert.assertEquals(0, r8.exitCode); | 
 |     Assert.assertTrue(Files.isRegularFile(out)); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(MAPPING))); | 
 |     Assert.assertTrue(Files.isRegularFile(testFlags.getParent().resolve(SEEDS))); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testSpecifyClassfile() throws IOException, InterruptedException { | 
 |     Path out = temp.newFile("classfile.zip").toPath(); | 
 |     ProcessResult r8 = | 
 |         ToolHelper.forkR8( | 
 |             Paths.get("."), | 
 |             "--lib", | 
 |             ToolHelper.getJava8RuntimeJar().toString(), | 
 |             "--classfile", | 
 |             "--output", | 
 |             out.toString(), | 
 |             "--pg-conf", | 
 |             PROGUARD_FLAGS.toString(), | 
 |             "--pg-conf", | 
 |             testFlags.toString(), | 
 |             INPUT_JAR.toString()); | 
 |     Assert.assertEquals(0, r8.exitCode); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testSpecifyDex() throws IOException, InterruptedException { | 
 |     Path out = temp.newFile("dex.zip").toPath(); | 
 |     ProcessResult r8 = | 
 |         ToolHelper.forkR8( | 
 |             Paths.get("."), | 
 |             "--lib", | 
 |             ToolHelper.getDefaultAndroidJar().toString(), | 
 |             "--dex", | 
 |             "--output", | 
 |             out.toString(), | 
 |             "--pg-conf", | 
 |             PROGUARD_FLAGS.toString(), | 
 |             "--pg-conf", | 
 |             testFlags.toString(), | 
 |             INPUT_JAR.toString()); | 
 |     Assert.assertEquals(0, r8.exitCode); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testSpecifyDexAndClassfileNotAllowed() throws IOException, InterruptedException { | 
 |     Path out = temp.newFile("dex.zip").toPath(); | 
 |     ProcessResult r8 = | 
 |         ToolHelper.forkR8( | 
 |             Paths.get("."), | 
 |             "--lib", | 
 |             ToolHelper.getDefaultAndroidJar().toString(), | 
 |             "--dex", | 
 |             "--classfile", | 
 |             "--output", | 
 |             out.toString(), | 
 |             "--pg-conf", | 
 |             PROGUARD_FLAGS.toString(), | 
 |             "--pg-conf", | 
 |             testFlags.toString(), | 
 |             INPUT_JAR.toString()); | 
 |     Assert.assertEquals(1, r8.exitCode); | 
 |     assertThat( | 
 |         r8.stderr, containsString("Cannot compile in both --dex and --classfile output mode")); | 
 |   } | 
 |  | 
 |   private R8Command getCommand(Path out) throws IOException, CompilationFailedException { | 
 |     return R8Command.builder() | 
 |         .addLibraryFiles(ToolHelper.getDefaultAndroidJar()) | 
 |         .addProgramFiles(INPUT_JAR) | 
 |         .setOutput(out, OutputMode.DexIndexed) | 
 |         .addProguardConfigurationFiles(PROGUARD_FLAGS, testFlags) | 
 |         .build(); | 
 |   } | 
 | } |