| // Copyright (c) 2018, 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.debuginfo; |
| |
| import static org.junit.Assert.assertNotEquals; |
| import static org.junit.Assert.assertTrue; |
| |
| import com.android.tools.r8.CompilationMode; |
| import com.android.tools.r8.D8Command; |
| import com.android.tools.r8.OutputMode; |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.ToolHelper.ArtCommandBuilder; |
| import com.android.tools.r8.ToolHelper.ProcessResult; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import org.junit.ClassRule; |
| import org.junit.Test; |
| import org.junit.rules.TemporaryFolder; |
| |
| public class PreamblePositionTestRunner { |
| |
| private static final String TEST_CLASS = "PreamblePositionTestSource"; |
| private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo"; |
| |
| @ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest(); |
| |
| @Test |
| public void testBothBranchesDefaultConditionals() throws Exception { |
| testBothBranches(false); |
| } |
| |
| @Test |
| public void testBothBranchesInvertConditionals() throws Exception { |
| testBothBranches(true); |
| } |
| |
| private void testBothBranches(boolean invertConditionals) throws Exception { |
| Path testClassPath = temp.newFolder().toPath().resolve(TEST_CLASS + ".class"); |
| Path outputDexPath = temp.newFolder().toPath(); |
| |
| Files.write(testClassPath, PreamblePositionTestSourceDump.dump()); |
| |
| ToolHelper.runD8( |
| D8Command.builder() |
| .addProgramFiles(testClassPath) |
| .setOutput(outputDexPath, OutputMode.DexIndexed) |
| .setMode(CompilationMode.RELEASE), |
| options -> { |
| options.testing.invertConditionals = invertConditionals; |
| }); |
| |
| String fileName = TEST_CLASS + ".java"; |
| |
| for (boolean testTrueBranch : new boolean[] {false, true}) { |
| ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder(); |
| artCommandBuilder.appendClasspath(outputDexPath.resolve("classes.dex").toString()); |
| artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS); |
| if (!testTrueBranch) { |
| artCommandBuilder.appendProgramArgument("1"); |
| } |
| |
| ProcessResult result = ToolHelper.runArtRaw(artCommandBuilder); |
| |
| assertNotEquals(result.exitCode, 0); |
| if (testTrueBranch) { |
| assertTrue(result.stderr.contains("<true-branch-exception>")); |
| // Must have either explicit line = 0 or no line info at all. |
| assertTrue( |
| result.stderr.contains(fileName + ":0") |
| || (result.stderr.contains("at " + TEST_PACKAGE + "." + TEST_CLASS + ".main") |
| && !result.stderr.contains(fileName + ":"))); |
| } else { |
| assertTrue(result.stderr.contains("<false-branch-exception>")); |
| assertTrue( |
| result.stderr.contains( |
| fileName + ":" + PreamblePositionTestSourceDump.FALSE_BRANCH_LINE_NUMBER)); |
| } |
| } |
| } |
| } |