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";