Update class init debug test and remove assume check.
Bug: b/65148874
Change-Id: I97bce1e50cba034145f88b80999ea1b0e61e837e
diff --git a/src/test/debugTestResources/ClassInitializerEmpty.java b/src/test/debugTestResources/ClassInitializerEmpty.java
deleted file mode 100644
index 9062d62..0000000
--- a/src/test/debugTestResources/ClassInitializerEmpty.java
+++ /dev/null
@@ -1,12 +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.
-
-public class ClassInitializerEmpty {
-
- static {
- }
-
- public static void main(String[] args) {
- }
-}
diff --git a/src/test/java/com/android/tools/r8/debug/ClassInitializationTest.java b/src/test/java/com/android/tools/r8/debug/ClassInitializationTest.java
deleted file mode 100644
index 8931c9d..0000000
--- a/src/test/java/com/android/tools/r8/debug/ClassInitializationTest.java
+++ /dev/null
@@ -1,126 +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.debug;
-
-import org.apache.harmony.jpda.tests.framework.jdwp.Value;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class ClassInitializationTest extends DebugTestBase {
-
- private static DebugTestConfig config;
-
- @BeforeClass
- public static void setup() {
- config = new D8DebugTestResourcesConfig(temp);
- }
-
- @Test
- public void testStaticAssingmentInitialization() throws Throwable {
- final String SOURCE_FILE = "ClassInitializerAssignmentInitialization.java";
- final String CLASS = "ClassInitializerAssignmentInitialization";
-
- runDebugTest(
- config,
- CLASS,
- breakpoint(CLASS, "<clinit>"),
- run(),
- checkLine(SOURCE_FILE, 7),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(0)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
- checkStaticFieldClinitSafe(CLASS, "z", null, Value.createInt(0)),
- stepOver(),
- checkLine(SOURCE_FILE, 10),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(1)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
- checkStaticFieldClinitSafe(CLASS, "z", null, Value.createInt(0)),
- breakpoint(CLASS, "main"),
- run(),
- checkStaticField(CLASS, "x", null, Value.createInt(1)),
- checkStaticField(CLASS, "y", null, Value.createInt(0)),
- checkStaticField(CLASS, "z", null, Value.createInt(2)),
- run());
- }
-
- @Test
- public void testBreakpointInEmptyClassInitializer() throws Throwable {
- final String SOURCE_FILE = "ClassInitializerEmpty.java";
- final String CLASS = "ClassInitializerEmpty";
-
- runDebugTest(
- config,
- CLASS,
- breakpoint(CLASS, "<clinit>"),
- run(),
- checkLine(SOURCE_FILE, 8),
- run());
- }
-
- @Test
- public void testStaticBlockInitialization() throws Throwable {
- final String SOURCE_FILE = "ClassInitializerStaticBlockInitialization.java";
- final String CLASS = "ClassInitializerStaticBlockInitialization";
-
- runDebugTest(
- config,
- CLASS,
- breakpoint(CLASS, "<clinit>"),
- run(),
- checkLine(SOURCE_FILE, 12),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(0)),
- stepOver(),
- checkLine(SOURCE_FILE, 13),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(1)),
- stepOver(),
- checkLine(SOURCE_FILE, 14),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
- stepOver(),
- checkLine(SOURCE_FILE, 17),
- stepOver(),
- checkLine(SOURCE_FILE, 19),
- breakpoint(CLASS, "main"),
- run(),
- checkLine(SOURCE_FILE, 23),
- checkStaticField(CLASS, "x", null, Value.createInt(3)),
- run());
- }
-
- @Test
- public void testStaticMixedInitialization() throws Throwable {
- final String SOURCE_FILE = "ClassInitializerMixedInitialization.java";
- final String CLASS = "ClassInitializerMixedInitialization";
-
- runDebugTest(
- config,
- CLASS,
- breakpoint(CLASS, "<clinit>"),
- run(),
- checkLine(SOURCE_FILE, 8),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(0)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
- stepOver(),
- checkLine(SOURCE_FILE, 12),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(1)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
- stepOver(),
- checkLine(SOURCE_FILE, 13),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
- stepOver(),
- checkLine(SOURCE_FILE, 16),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
- stepOver(),
- checkLine(SOURCE_FILE, 18),
- checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
- checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(2)),
- breakpoint(CLASS, "main"),
- run(),
- checkLine(SOURCE_FILE, 22),
- checkStaticField(CLASS, "x", null, Value.createInt(3)),
- checkStaticField(CLASS, "y", null, Value.createInt(2)),
- run());
- }
-}
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index 726bd4b..c0f7ea3 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -543,16 +543,7 @@
protected final JUnit3Wrapper.Command checkStaticFieldClinitSafe(
String className, String fieldName, String fieldSignature, Value expectedValue) {
- return inspect(
- t -> {
- // TODO(65148874): The current Art from AOSP master hangs when requesting static fields
- // when breaking in <clinit>. Last known good version is 7.0.0.
- TestRuntime runtime = t.getRuntime();
- Assume.assumeTrue(
- "Skipping test " + testName.getMethodName() + " because ART version is not supported",
- runtime.isCf() || runtime.asDex().getVersion().isOlderThanOrEqual(Version.V7_0_0));
- checkStaticField(className, fieldName, fieldSignature, expectedValue);
- });
+ return inspect(t -> checkStaticField(className, fieldName, fieldSignature, expectedValue));
}
protected final JUnit3Wrapper.Command checkStaticField(
diff --git a/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializationTest.java b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializationTest.java
new file mode 100644
index 0000000..1abe558
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializationTest.java
@@ -0,0 +1,172 @@
+// Copyright (c) 2022, 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.debug.classinit;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.debug.DebugTestBase;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.apache.harmony.jpda.tests.framework.jdwp.Value;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+// Appears to have been a regression for b/65148874, but reproduction was not possible recently.
+@RunWith(Parameterized.class)
+public class ClassInitializationTest extends DebugTestBase {
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters()
+ .withAllRuntimes()
+ .withApiLevel(AndroidApiLevel.B)
+ .enableApiLevelsForCf()
+ .build();
+ }
+
+ private final TestParameters parameters;
+
+ public ClassInitializationTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ private String fileName(Class<?> clazz) {
+ return clazz.getSimpleName() + ".java";
+ }
+
+ @Test
+ public void testStaticAssignmentInitialization() throws Throwable {
+ Class<?> clazz = ClassInitializerAssignmentInitialization.class;
+ final String SOURCE_FILE = fileName(clazz);
+ final String CLASS = typeName(clazz);
+ testForD8(parameters.getBackend())
+ .addProgramClasses(clazz)
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), clazz)
+ .debugger(
+ config ->
+ runDebugTest(
+ config,
+ clazz,
+ breakpoint(CLASS, "<clinit>"),
+ run(),
+ checkLine(SOURCE_FILE, 8),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(0)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
+ checkStaticFieldClinitSafe(CLASS, "z", null, Value.createInt(0)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 11),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(1)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
+ checkStaticFieldClinitSafe(CLASS, "z", null, Value.createInt(0)),
+ breakpoint(CLASS, "main"),
+ run(),
+ checkStaticField(CLASS, "x", null, Value.createInt(1)),
+ checkStaticField(CLASS, "y", null, Value.createInt(0)),
+ checkStaticField(CLASS, "z", null, Value.createInt(2)),
+ run()));
+ }
+
+ @Test
+ public void testBreakpointInEmptyClassInitializer() throws Throwable {
+ Class<?> clazz = ClassInitializerEmpty.class;
+ final String SOURCE_FILE = fileName(clazz);
+ final String CLASS = typeName(clazz);
+ testForD8(parameters.getBackend())
+ .addProgramClasses(clazz)
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), clazz)
+ .debugger(
+ config ->
+ runDebugTest(
+ config,
+ clazz,
+ breakpoint(CLASS, "<clinit>"),
+ run(),
+ checkLine(SOURCE_FILE, 9),
+ run()));
+ }
+
+ @Test
+ public void testStaticBlockInitialization() throws Throwable {
+ Class<?> clazz = ClassInitializerStaticBlockInitialization.class;
+ final String SOURCE_FILE = fileName(clazz);
+ final String CLASS = typeName(clazz);
+
+ testForD8(parameters.getBackend())
+ .addProgramClasses(clazz)
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), clazz)
+ .debugger(
+ config ->
+ runDebugTest(
+ config,
+ CLASS,
+ breakpoint(CLASS, "<clinit>"),
+ run(),
+ checkLine(SOURCE_FILE, 13),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(0)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 14),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(1)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 15),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 18),
+ stepOver(),
+ checkLine(SOURCE_FILE, 20),
+ breakpoint(CLASS, "main"),
+ run(),
+ checkLine(SOURCE_FILE, 24),
+ checkStaticField(CLASS, "x", null, Value.createInt(3)),
+ run()));
+ }
+
+ @Test
+ public void testStaticMixedInitialization() throws Throwable {
+ Class<?> clazz = ClassInitializerMixedInitialization.class;
+ final String SOURCE_FILE = fileName(clazz);
+ final String CLASS = typeName(clazz);
+
+ testForD8(parameters.getBackend())
+ .addProgramClasses(clazz)
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), clazz)
+ .debugger(
+ config ->
+ runDebugTest(
+ config,
+ CLASS,
+ breakpoint(CLASS, "<clinit>"),
+ run(),
+ checkLine(SOURCE_FILE, 9),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(0)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 13),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(1)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 14),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 17),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(0)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 19),
+ checkStaticFieldClinitSafe(CLASS, "x", null, Value.createInt(2)),
+ checkStaticFieldClinitSafe(CLASS, "y", null, Value.createInt(2)),
+ breakpoint(CLASS, "main"),
+ run(),
+ checkLine(SOURCE_FILE, 23),
+ checkStaticField(CLASS, "x", null, Value.createInt(3)),
+ checkStaticField(CLASS, "y", null, Value.createInt(2)),
+ run()));
+ }
+}
diff --git a/src/test/debugTestResources/ClassInitializerAssignmentInitialization.java b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerAssignmentInitialization.java
similarity index 77%
rename from src/test/debugTestResources/ClassInitializerAssignmentInitialization.java
rename to src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerAssignmentInitialization.java
index fa6078a..2044905 100644
--- a/src/test/debugTestResources/ClassInitializerAssignmentInitialization.java
+++ b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerAssignmentInitialization.java
@@ -1,6 +1,7 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2022, 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.debug.classinit;
public class ClassInitializerAssignmentInitialization {
diff --git a/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerEmpty.java b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerEmpty.java
new file mode 100644
index 0000000..62cacf3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerEmpty.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2022, 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.debug.classinit;
+
+public class ClassInitializerEmpty {
+
+ static {
+ }
+
+ public static void main(String[] args) {}
+}
diff --git a/src/test/debugTestResources/ClassInitializerMixedInitialization.java b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerMixedInitialization.java
similarity index 80%
rename from src/test/debugTestResources/ClassInitializerMixedInitialization.java
rename to src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerMixedInitialization.java
index 504db6c..9d11f9d 100644
--- a/src/test/debugTestResources/ClassInitializerMixedInitialization.java
+++ b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerMixedInitialization.java
@@ -1,6 +1,7 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2022, 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.debug.classinit;
public class ClassInitializerMixedInitialization {
diff --git a/src/test/debugTestResources/ClassInitializerStaticBlockInitialization.java b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerStaticBlockInitialization.java
similarity index 81%
rename from src/test/debugTestResources/ClassInitializerStaticBlockInitialization.java
rename to src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerStaticBlockInitialization.java
index 78fe9a0..d79ff7e 100644
--- a/src/test/debugTestResources/ClassInitializerStaticBlockInitialization.java
+++ b/src/test/java/com/android/tools/r8/debug/classinit/ClassInitializerStaticBlockInitialization.java
@@ -1,6 +1,7 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2022, 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.debug.classinit;
public class ClassInitializerStaticBlockInitialization {
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
index 87a2fb2..98ab165 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.debug.DebugTestBase;
import com.android.tools.r8.debug.DebugTestConfig;
import com.android.tools.r8.debug.DexDebugTestConfig;
+import com.android.tools.r8.debug.classinit.ClassInitializationTest;
import com.android.tools.r8.shaking.ProguardKeepRule;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
@@ -82,10 +83,7 @@
this.backend = backend;
}
- /**
- * replica of {@link
- * com.android.tools.r8.debug.ClassInitializationTest#testBreakpointInEmptyClassInitializer}
- */
+ /** replica of {@link ClassInitializationTest#testBreakpointInEmptyClassInitializer} */
@Test
public void testBreakpointInEmptyClassInitializer() throws Throwable {
final String CLASS = "ClassInitializerEmpty";