Merge "Revert "Tests for handle missing fields in static initializer rewriting""
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 89a7a26..e46ff48 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -101,15 +101,6 @@
}
/**
- * Compile an application with D8.
- */
- protected AndroidApp compileWithD8(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
- throws CompilationException, ExecutionException, IOException {
- D8Command command = ToolHelper.prepareD8CommandBuilder(app).build();
- return ToolHelper.runD8(command, optionsConsumer);
- }
-
- /**
* Compile an application with R8.
*/
protected AndroidApp compileWithR8(Class... classes)
@@ -258,25 +249,11 @@
/**
* Run application on Art with the specified main class.
*/
- protected ProcessResult runOnArtRaw(AndroidApp app, String mainClass) throws IOException {
+ protected String runOnArt(AndroidApp app, Class mainClass) throws IOException {
Path out = File.createTempFile("junit", ".zip", temp.getRoot()).toPath();
app.writeToZip(out, OutputMode.Indexed);
- return ToolHelper.runArtNoVerificationErrorsRaw(
- ImmutableList.of(out.toString()), mainClass, null);
- }
-
- /**
- * Run application on Art with the specified main class.
- */
- protected ProcessResult runOnArtRaw(AndroidApp app, Class mainClass) throws IOException {
- return runOnArtRaw(app, mainClass.getCanonicalName());
- }
-
- /**
- * Run application on Art with the specified main class.
- */
- protected String runOnArt(AndroidApp app, Class mainClass) throws IOException {
- return runOnArtRaw(app, mainClass).stdout;
+ return ToolHelper.runArtNoVerificationErrors(
+ ImmutableList.of(out.toString()), mainClass.getCanonicalName(), null);
}
/**
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index d435ae5..79be8a8 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.DeviceRunner.DeviceRunnerConfigurationException;
import com.android.tools.r8.ToolHelper.DexVm.Kind;
import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexItemFactory;
@@ -772,29 +773,18 @@
return Paths.get(System.getProperty("java.home"), "bin", "java").toString();
}
- public static ProcessResult runArtNoVerificationErrorsRaw(String file, String mainClass)
- throws IOException {
- return runArtNoVerificationErrorsRaw(Collections.singletonList(file), mainClass, null);
- }
-
public static String runArtNoVerificationErrors(String file, String mainClass)
throws IOException {
- return runArtNoVerificationErrorsRaw(file, mainClass).stdout;
- }
-
- public static ProcessResult runArtNoVerificationErrorsRaw(List<String> files, String mainClass,
- Consumer<ArtCommandBuilder> extras)
- throws IOException {
- return runArtNoVerificationErrorsRaw(files, mainClass, extras, null);
+ return runArtNoVerificationErrors(Collections.singletonList(file), mainClass, null);
}
public static String runArtNoVerificationErrors(List<String> files, String mainClass,
Consumer<ArtCommandBuilder> extras)
throws IOException {
- return runArtNoVerificationErrorsRaw(files, mainClass, extras).stdout;
+ return runArtNoVerificationErrors(files, mainClass, extras, null);
}
- public static ProcessResult runArtNoVerificationErrorsRaw(List<String> files, String mainClass,
+ public static String runArtNoVerificationErrors(List<String> files, String mainClass,
Consumer<ArtCommandBuilder> extras,
DexVm version)
throws IOException {
@@ -805,30 +795,18 @@
if (extras != null) {
extras.accept(builder);
}
- return runArtNoVerificationErrorsRaw(builder);
- }
-
- public static String runArtNoVerificationErrors(List<String> files, String mainClass,
- Consumer<ArtCommandBuilder> extras,
- DexVm version)
- throws IOException {
- return runArtNoVerificationErrorsRaw(files, mainClass, extras, version).stdout;
- }
-
- public static ProcessResult runArtNoVerificationErrorsRaw(ArtCommandBuilder builder)
- throws IOException {
- ProcessResult result = runArtProcessRaw(builder);
- if (result.stderr.contains("Verification error")) {
- fail("Verification error: \n" + result.stderr);
- }
- return result;
+ return runArtNoVerificationErrors(builder);
}
public static String runArtNoVerificationErrors(ArtCommandBuilder builder) throws IOException {
- return runArtNoVerificationErrorsRaw(builder).stdout;
+ ProcessResult result = runArtProcess(builder);
+ if (result.stderr.contains("Verification error")) {
+ fail("Verification error: \n" + result.stderr);
+ }
+ return result.stdout;
}
- private static ProcessResult runArtProcessRaw(ArtCommandBuilder builder) throws IOException {
+ private static ProcessResult runArtProcess(ArtCommandBuilder builder) throws IOException {
Assume.assumeTrue(ToolHelper.artSupported());
ProcessResult result;
if (builder.isForDevice()) {
@@ -840,11 +818,6 @@
} else {
result = runProcess(builder.asProcessBuilder());
}
- return result;
- }
-
- private static ProcessResult runArtProcess(ArtCommandBuilder builder) throws IOException {
- ProcessResult result = runArtProcessRaw(builder);
if (result.exitCode != 0) {
fail("Unexpected art failure: '" + result.stderr + "'\n" + result.stdout);
}
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index ab94090..8cf6e9b 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -39,7 +39,6 @@
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
-import java.util.function.Consumer;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
@@ -81,11 +80,6 @@
return ToolHelper.runD8(builder.build());
}
- protected AndroidApp compileWithD8(
- JasminBuilder builder, Consumer<InternalOptions> optionsConsumer) throws Exception {
- return ToolHelper.runD8(builder.build(), optionsConsumer);
- }
-
protected String runOnArtD8(JasminBuilder builder, String main) throws Exception {
return runOnArt(compileWithD8(builder), main);
}
@@ -138,16 +132,10 @@
return ToolHelper.runArtNoVerificationErrors(dex.toString(), main);
}
- protected ProcessResult runOnArtRaw(AndroidApp app, String main) throws IOException {
- Path out = temp.getRoot().toPath().resolve("out.zip");
- app.writeToZip(out, OutputMode.Indexed);
- return ToolHelper.runArtNoVerificationErrorsRaw(out.toString(), main);
- }
-
protected String runOnArt(AndroidApp app, String main) throws IOException {
Path out = temp.getRoot().toPath().resolve("out.zip");
app.writeToZip(out, OutputMode.Indexed);
- return ToolHelper.runArtNoVerificationErrors(out.toString(), main);
+ return ToolHelper.runArtNoVerificationErrors(ImmutableList.of(out.toString()), main, null);
}
protected static DexApplication process(DexApplication app, InternalOptions options)
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/B67468748.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/B67468748.java
deleted file mode 100644
index 6d9f582..0000000
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/B67468748.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// 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.rewrite.staticvalues;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.jasmin.JasminBuilder;
-import com.android.tools.r8.jasmin.JasminTestBase;
-import com.android.tools.r8.utils.AndroidApp;
-import com.google.common.collect.ImmutableList;
-import org.junit.Test;
-
-public class B67468748 extends JasminTestBase {
-
- @Test
- public void jarInput() throws Exception {
- final String CLASS_NAME = "Test";
-
- JasminBuilder builder = new JasminBuilder();
- JasminBuilder.ClassBuilder clazz = builder.addClass(CLASS_NAME);
-
- // The static field Test/intField is not defined even though it is written in the
- // <clinit> code. This class cannot load, but we can still process it to dex, where Art also
- // cannot load the class.
- clazz.addStaticMethod("<clinit>", ImmutableList.of(), "V",
- ".limit stack 1",
- ".limit locals 1",
- "iconst_1",
- "putstatic Test/intField I",
- "return");
-
- clazz.addMainMethod(
- ".limit stack 2",
- ".limit locals 1",
- "getstatic java/lang/System/out Ljava/io/PrintStream;",
- "getstatic Test/intField I",
- "invokevirtual java/io/PrintStream/print(I)V",
- "return");
-
- // The code does not run on the Java VM, as there is a missing field.
- ProcessResult result = runOnJavaRaw(builder, CLASS_NAME);
- assertEquals(1, result.exitCode);
- assertTrue(result.stderr.contains("java.lang.NoSuchFieldError"));
-
- // Run in release mode to turn on initializer defaults rewriting.
- AndroidApp application = compileWithD8(builder, options -> options.debug = false);
-
- // The code does not run on Art, as there is a missing field.
- result = runOnArtRaw(application, CLASS_NAME);
- assertEquals(1, result.exitCode);
- assertTrue(result.stderr.contains("java.lang.NoSuchFieldError"));
- }
-
- // Test with dex input is in StaticValuesTest.
-}
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
index 1d26039..9e5a839 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
@@ -7,7 +7,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.code.Sput;
import com.android.tools.r8.code.SputObject;
@@ -24,7 +24,6 @@
import com.android.tools.r8.graph.DexValue.DexValueShort;
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.MethodSubject;
import com.android.tools.r8.utils.InternalOptions;
@@ -573,43 +572,4 @@
assertEquals(StringUtils.lines("2"), result);
}
- @Test
- public void b67468748() throws Exception {
- final String CLASS_NAME = "Test";
-
- SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
-
- // The static field LTest;->intField:I is not defined even though it is written in the
- // <clinit> code. This class cannot load, but we can still process it to output which still
- // cannot load.
- builder.addStaticInitializer(
- 2,
- "const v0, 3",
- "sput v0, LTest;->intField:I",
- "return-void"
- );
- builder.addMainMethod(
- 3,
- "sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;",
- "sget v1, LTest;->intField:I",
- "invoke-virtual { v0, v1 }, Ljava/io/PrintStream;->println(I)V",
- "return-void"
- );
-
- AndroidApp application = builder.build();
-
- // The code does not run on Art, as there is a missing field.
- ProcessResult result = runOnArtRaw(application, CLASS_NAME);
- assertEquals(1, result.exitCode);
- assertTrue(result.stderr.contains("java.lang.NoSuchFieldError"));
-
- // Run in release mode to turn on initializer defaults rewriting.
- application = compileWithD8(application, options -> options.debug = false);
-
- // The code does still not run on Art, as there is still a missing field.
- result = runOnArtRaw(application, CLASS_NAME);
- assertEquals(1, result.exitCode);
- assertTrue(result.stderr.contains("java.lang.NoSuchFieldError"));
- }
-
}
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 41f73d1..f2f1220 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -361,7 +361,7 @@
getSource(currentClassName).add(builder.toString());
}
- public List<String> buildSource() {
+ public List<String> build() {
List<String> result = new ArrayList<>(classes.size());
for (String clazz : classes.keySet()) {
Builder classBuilder = classes.get(clazz);
@@ -372,18 +372,12 @@
public byte[] compile()
throws IOException, RecognitionException, DexOverflowException, ExecutionException {
- return Smali.compile(buildSource());
+ return Smali.compile(build());
}
- public AndroidApp build()
- throws IOException, RecognitionException, DexOverflowException, ExecutionException {
- return AndroidApp.fromDexProgramData(compile());
- }
-
-
@Override
public String toString() {
- return String.join("\n\n", buildSource());
+ return String.join("\n\n", build());
}
}