| // 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.retrace; |
| |
| import static com.android.tools.r8.KotlinCompilerTool.KOTLINC; |
| import static com.android.tools.r8.ToolHelper.getFilesInTestFolderRelativeToClass; |
| import static org.hamcrest.core.StringContains.containsString; |
| |
| import com.android.tools.r8.CompilationFailedException; |
| import com.android.tools.r8.CompilationMode; |
| import com.android.tools.r8.R8TestRunResult; |
| import com.android.tools.r8.TestBase; |
| import com.android.tools.r8.TestParameters; |
| import com.android.tools.r8.TestParametersCollection; |
| import com.android.tools.r8.TestRuntime; |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.ToolHelper.KotlinTargetVersion; |
| import java.io.IOException; |
| import java.util.List; |
| import java.util.concurrent.ExecutionException; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.Parameterized; |
| import org.junit.runners.Parameterized.Parameters; |
| |
| @RunWith(Parameterized.class) |
| public class KotlinInlineFunctionRetraceTest extends TestBase { |
| |
| private final TestParameters parameters; |
| |
| @Parameters(name = "{0}") |
| public static TestParametersCollection data() { |
| // TODO(b/141817471): Extend with compilation modes. |
| return getTestParameters().withAllRuntimesAndApiLevels().build(); |
| } |
| |
| public KotlinInlineFunctionRetraceTest(TestParameters parameters) { |
| this.parameters = parameters; |
| } |
| |
| @Test |
| public void testRuntime() throws ExecutionException, CompilationFailedException, IOException { |
| testForRuntime(parameters) |
| .addProgramFiles( |
| kotlinc(TestRuntime.getCheckedInJdk8(), KOTLINC, KotlinTargetVersion.JAVA_8) |
| .addSourceFiles( |
| getFilesInTestFolderRelativeToClass( |
| KotlinInlineFunctionRetraceTest.class, "kt", ".kt")) |
| .compile()) |
| .addRunClasspathFiles(buildOnDexRuntime(parameters, ToolHelper.getKotlinStdlibJar())) |
| .run(parameters.getRuntime(), "retrace.MainKt") |
| .assertFailureWithErrorThatMatches(containsString("inlineExceptionStatic")) |
| .assertFailureWithErrorThatMatches(containsString("at retrace.MainKt.main(Main.kt:15)")); |
| } |
| |
| @Test |
| public void testRetraceKotlinInlineStaticFunction() |
| throws ExecutionException, CompilationFailedException, IOException { |
| String main = "retrace.MainKt"; |
| R8TestRunResult result = |
| testForR8(parameters.getBackend()) |
| .addProgramFiles( |
| kotlinc(TestRuntime.getCheckedInJdk8(), KOTLINC, KotlinTargetVersion.JAVA_8) |
| .addSourceFiles( |
| getFilesInTestFolderRelativeToClass( |
| KotlinInlineFunctionRetraceTest.class, "kt", ".kt")) |
| .compile()) |
| .addProgramFiles(ToolHelper.getKotlinStdlibJar()) |
| .addKeepAttributes("SourceFile", "LineNumberTable") |
| .setMode(CompilationMode.RELEASE) |
| .addKeepMainRule(main) |
| .setMinApi(parameters.getApiLevel()) |
| .run(parameters.getRuntime(), main) |
| .assertFailureWithErrorThatMatches(containsString("inlineExceptionStatic")) |
| .assertFailureWithErrorThatMatches(containsString("at retrace.MainKt.main(Main.kt:2)")); |
| List<String> retrace = result.retrace(); |
| // TODO(b/141817471): Change the tracing information when solved. |
| // assertThat(retrace.get(1), containsString("at retrace.MainKt.main(Main.kt:15)")); |
| } |
| |
| @Test |
| public void testRetraceKotlinInlineInstanceFunction() |
| throws ExecutionException, CompilationFailedException, IOException { |
| String main = "retrace.MainInstanceKt"; |
| R8TestRunResult result = |
| testForR8(parameters.getBackend()) |
| .addProgramFiles( |
| kotlinc(TestRuntime.getCheckedInJdk8(), KOTLINC, KotlinTargetVersion.JAVA_8) |
| .addSourceFiles( |
| getFilesInTestFolderRelativeToClass( |
| KotlinInlineFunctionRetraceTest.class, "kt", ".kt")) |
| .compile()) |
| .addProgramFiles(ToolHelper.getKotlinStdlibJar()) |
| .addKeepAttributes("SourceFile", "LineNumberTable") |
| .setMode(CompilationMode.RELEASE) |
| .addKeepMainRule(main) |
| .setMinApi(parameters.getApiLevel()) |
| .run(parameters.getRuntime(), main) |
| .assertFailureWithErrorThatMatches(containsString("inlineExceptionInstance")) |
| .assertFailureWithErrorThatMatches( |
| containsString("at retrace.MainInstanceKt.main(MainInstance.kt:2)")); |
| List<String> retrace = result.retrace(); |
| // TODO(b/141817471): Change the tracing information when solved. |
| // assertThat(retrace.get(1), containsString("at |
| // retrace.MainInstanceKt.main(MainInstance.kt:13)")); |
| } |
| |
| @Test |
| public void testRetraceKotlinNestedInlineFunction() |
| throws ExecutionException, CompilationFailedException, IOException { |
| // TODO(b/141817471): Change the tracing information when solved. |
| int lineNumber = parameters.isCfRuntime() ? 4 : 3; |
| String main = "retrace.MainNestedKt"; |
| R8TestRunResult result = |
| testForR8(parameters.getBackend()) |
| .addProgramFiles( |
| kotlinc(TestRuntime.getCheckedInJdk8(), KOTLINC, KotlinTargetVersion.JAVA_8) |
| .addSourceFiles( |
| getFilesInTestFolderRelativeToClass( |
| KotlinInlineFunctionRetraceTest.class, "kt", ".kt")) |
| .compile()) |
| .addProgramFiles(ToolHelper.getKotlinStdlibJar()) |
| .addKeepAttributes("SourceFile", "LineNumberTable") |
| .setMode(CompilationMode.RELEASE) |
| .addKeepMainRule(main) |
| .setMinApi(parameters.getApiLevel()) |
| .run(parameters.getRuntime(), main) |
| .assertFailureWithErrorThatMatches(containsString("inlineExceptionStatic")) |
| .assertFailureWithErrorThatMatches( |
| containsString("at retrace.MainNestedKt.main(MainNested.kt:" + lineNumber + ")")); |
| List<String> retrace = result.retrace(); |
| // TODO(b/141817471): Change the tracing information when solved. |
| // assertThat(retrace.get(1), containsString("at retrace.MainNestedKt.main(MainNested.kt:19)")); |
| } |
| } |