| // 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.ir.optimize; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.fail; |
| |
| import com.android.tools.r8.OutputMode; |
| import com.android.tools.r8.TestBase; |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.utils.AndroidApp; |
| import com.android.tools.r8.utils.FileUtils; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import org.junit.Assume; |
| import org.junit.Test; |
| |
| /** |
| * This test verifies that semantic of class initialization is preserved when a static method |
| * invocation is inlined. |
| */ |
| // TODO(shertz) add CF output |
| public class R8InliningRegressionTests extends TestBase { |
| |
| @Test |
| public void testStaticInlining_b71524812() throws Exception { |
| buildAndTest("staticinlining", "staticinlining.Main"); |
| } |
| |
| @Test |
| public void testInterfaceInlining_b71629503() throws Exception { |
| buildAndTest("inlining_with_proxy", "inlining_with_proxy.Main"); |
| } |
| |
| private void buildAndTest(String folder, String mainClass) throws Exception { |
| Assume.assumeTrue(ToolHelper.artSupported() || ToolHelper.compareAgaintsGoldenFiles()); |
| |
| Path proguardRules = Paths.get(ToolHelper.EXAMPLES_DIR, folder, "keep-rules.txt"); |
| Path jarFile = |
| Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, folder + FileUtils.JAR_EXTENSION); |
| |
| // Build with R8 |
| AndroidApp.Builder builder = AndroidApp.builder(); |
| builder.addProgramFiles(jarFile); |
| AndroidApp app = compileWithR8(builder.build(), proguardRules); |
| |
| // Compare original and generated DEX files. |
| String originalDexFile = Paths |
| .get(ToolHelper.EXAMPLES_BUILD_DIR, folder, ToolHelper.DEFAULT_DEX_FILENAME).toString(); |
| Path generatedDexFile = temp.getRoot().toPath().resolve("classes.jar"); |
| app.writeToZip(generatedDexFile, OutputMode.DexIndexed); |
| String artOutput = ToolHelper |
| .checkArtOutputIdentical(originalDexFile, generatedDexFile.toString(), mainClass, |
| ToolHelper.getDexVm()); |
| |
| // Compare with Java. |
| ToolHelper.ProcessResult javaResult = ToolHelper.runJava(jarFile, mainClass); |
| if (javaResult.exitCode != 0) { |
| System.out.println(javaResult.stdout); |
| System.err.println(javaResult.stderr); |
| fail("JVM failed for: " + mainClass); |
| } |
| assertEquals("JVM and ART output differ", javaResult.stdout, artOutput); |
| } |
| |
| } |