blob: 0bbc7bc51503b6e71a38af4121d71022afadc2b5 [file] [log] [blame]
// 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();
}
}