|  | // Copyright (c) 2019, 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.CoreMatchers.containsString; | 
|  | import static org.junit.Assert.assertTrue; | 
|  | import static org.junit.Assert.fail; | 
|  |  | 
|  | import com.android.tools.r8.TestRuntime.CfVm; | 
|  | import com.android.tools.r8.utils.DescriptorUtils; | 
|  | import com.android.tools.r8.utils.ZipUtils; | 
|  | import java.io.IOException; | 
|  | import java.nio.file.Files; | 
|  | import java.nio.file.Path; | 
|  | import java.util.HashSet; | 
|  | import java.util.List; | 
|  | import java.util.Set; | 
|  | import java.util.stream.Collectors; | 
|  | import org.junit.Test; | 
|  | import org.junit.runner.RunWith; | 
|  | import org.junit.runners.Parameterized; | 
|  |  | 
|  | @RunWith(Parameterized.class) | 
|  | public class DumpInputsTest extends TestBase { | 
|  |  | 
|  | private final TestParameters parameters; | 
|  |  | 
|  | @Parameterized.Parameters(name = "{0}") | 
|  | public static TestParametersCollection data() { | 
|  | return getTestParameters().withCfRuntime(CfVm.JDK9).build(); | 
|  | } | 
|  |  | 
|  | public DumpInputsTest(TestParameters parameters) { | 
|  | this.parameters = parameters; | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testDumpToFile() throws Exception { | 
|  | Path dump = temp.newFolder().toPath().resolve("dump.zip"); | 
|  | try { | 
|  | testForExternalR8(parameters.getBackend(), parameters.getRuntime()) | 
|  | .addJvmFlag("-Dcom.android.tools.r8.dumpinputtofile=" + dump) | 
|  | .addProgramClasses(TestClass.class) | 
|  | .compile(); | 
|  | } catch (AssertionError e) { | 
|  | verifyDump(dump, false, true); | 
|  | return; | 
|  | } | 
|  | fail("Expected external compilation to exit"); | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testDumpToDirectory() throws Exception { | 
|  | Path dumpDir = temp.newFolder().toPath(); | 
|  | testForR8(parameters.getBackend()) | 
|  | .addProgramClasses(TestClass.class) | 
|  | // Setting a directory will allow compilation to continue. | 
|  | // Ensure the compilation and run can actually succeed. | 
|  | .addLibraryFiles(ToolHelper.getJava8RuntimeJar()) | 
|  | .addKeepMainRule(TestClass.class) | 
|  | .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString()) | 
|  | .allowDiagnosticInfoMessages() | 
|  | .compile() | 
|  | .assertAllInfoMessagesMatch(containsString("Dumped compilation inputs to:")) | 
|  | .run(parameters.getRuntime(), TestClass.class) | 
|  | .assertSuccessWithOutputLines("Hello, world"); | 
|  | assertTrue(Files.isDirectory(dumpDir)); | 
|  | List<Path> paths = Files.walk(dumpDir, 1).collect(Collectors.toList()); | 
|  | boolean hasVerified = false; | 
|  | for (Path path : paths) { | 
|  | if (!path.equals(dumpDir)) { | 
|  | // The non-external run here results in assert code calling application read. | 
|  | verifyDump(path, false, false); | 
|  | hasVerified = true; | 
|  | } | 
|  | } | 
|  | assertTrue(hasVerified); | 
|  | } | 
|  |  | 
|  | private void verifyDump(Path dumpFile, boolean hasClasspath, boolean hasProguardConfig) | 
|  | throws IOException { | 
|  | assertTrue(Files.exists(dumpFile)); | 
|  | Path unzipped = temp.newFolder().toPath(); | 
|  | ZipUtils.unzip(dumpFile.toString(), unzipped.toFile()); | 
|  | assertTrue(Files.exists(unzipped.resolve("r8-version"))); | 
|  | assertTrue(Files.exists(unzipped.resolve("program.jar"))); | 
|  | assertTrue(Files.exists(unzipped.resolve("library.jar"))); | 
|  | if (hasClasspath) { | 
|  | assertTrue(Files.exists(unzipped.resolve("classpath.jar"))); | 
|  | } | 
|  | if (hasProguardConfig) { | 
|  | assertTrue(Files.exists(unzipped.resolve("proguard.config"))); | 
|  | } | 
|  | Set<String> entries = new HashSet<>(); | 
|  | ZipUtils.iter( | 
|  | unzipped.resolve("program.jar").toString(), (entry, input) -> entries.add(entry.getName())); | 
|  | assertTrue( | 
|  | entries.contains( | 
|  | DescriptorUtils.getClassFileName( | 
|  | DescriptorUtils.javaTypeToDescriptor(TestClass.class.getTypeName())))); | 
|  | } | 
|  |  | 
|  | static class TestClass { | 
|  | public static void main(String[] args) { | 
|  | System.out.println("Hello, world"); | 
|  | } | 
|  | } | 
|  | } |