Update test with JDK-27 code for serializable lambdas to use javac

Also add OpenJDK 27 EA Build 25 and remove OpenJDK 26.

Bug: b/521062024

Change-Id: Iff808bfeefb4c56879cf7b918f5d4679946f0279
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index 72f467c..bbcd4ec 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -59,7 +59,8 @@
   JDK_11("jdk-11", 11),
   JDK_17("jdk-17", 17),
   JDK_21("jdk-21", 21),
-  JDK_25("jdk-25", 25);
+  JDK_25("jdk-25", 25),
+  JDK_27("jdk-27", 27);
 
   public fun isJdk8(): Boolean {
     return this == JDK_8
diff --git a/src/test/java/com/android/tools/r8/cf/Jdk27DeserializeLambdaMethodsTest.java b/src/test/java/com/android/tools/r8/cf/Jdk27DeserializeLambdaMethodsTest.java
index 3e558a8..d4fdb1b 100644
--- a/src/test/java/com/android/tools/r8/cf/Jdk27DeserializeLambdaMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/cf/Jdk27DeserializeLambdaMethodsTest.java
@@ -10,19 +10,19 @@
 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.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.internal.FileUtils;
+import java.nio.file.Path;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Handle;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
 
 @RunWith(Parameterized.class)
 public class Jdk27DeserializeLambdaMethodsTest extends TestBase implements Opcodes {
@@ -32,13 +32,94 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withDexRuntimesAndAllApiLevels().build();
+    return getTestParameters().withDexRuntimesAndAllApiLevels().withNoneRuntime().build();
+  }
+
+  private static Path TEST_CLASS_FILE;
+
+  @BeforeClass
+  public static void compileTestClasses() throws Exception {
+    // Build test constants.
+    Path output = getStaticTemp().newFolder("output").toPath();
+    Path testJavaSource =
+        FileUtils.writeTextFile(
+            getStaticTemp().newFolder("src").toPath().resolve("Test.java"),
+            "import java.io.*;",
+            "import java.util.function.Supplier;",
+            "",
+            "class Test {",
+            "  private static Supplier<Integer> create0() {",
+            "    return (Supplier<Integer> & Serializable) () -> 0;",
+            "  }",
+            "  private static Supplier<Integer> create1() {",
+            "    return (Supplier<Integer> & Serializable) () -> 1;",
+            "  }",
+            "  private static void runTest(int expectedResult, Supplier<Integer> instance) throws"
+                + " Exception {",
+            "    ByteArrayOutputStream baos = new ByteArrayOutputStream();",
+            "    try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {",
+            "      oos.writeObject(instance);",
+            "      oos.close();",
+            "    }",
+            "    try (ByteArrayInputStream in = new ByteArrayInputStream(baos.toByteArray());",
+            "        ObjectInputStream ois = new ObjectInputStream(in)) {",
+            "      int actual = ((Supplier<Integer>) ois.readObject()).get();",
+            "      if (expectedResult != actual) {",
+            "        throw new AssertionError(\"Expected: \" + expectedResult + \", actual: \" +"
+                + " actual);",
+            "      }",
+            "    }",
+            "  }",
+            "  public static void main() throws Exception {",
+            "    runTest(0, create0());",
+            "    runTest(1, create1());",
+            "    System.err.println(\"OK\");",
+            "  }",
+            "}");
+    javac(TestRuntime.getCheckedInJdk27(), getStaticTemp())
+        .addSourceFiles(testJavaSource)
+        .setOutputPath(output)
+        .compile();
+    TEST_CLASS_FILE = output.resolve("Test.class");
+  }
+
+  @Test
+  public void testJdk27SerializeLambdaCodeGeneration() throws Exception {
+    parameters.assumeNoneRuntime();
+    CodeInspector inspector = new CodeInspector(TEST_CLASS_FILE);
+    ClassSubject clazz = inspector.clazz("Test");
+    assertTrue(clazz.isPresent());
+    assertEquals(
+        3,
+        clazz.allMethods().stream()
+            .filter(method -> method.getOriginalMethodName().startsWith("$deserializeLambda$"))
+            .count());
+    assertEquals(
+        2,
+        clazz
+            .uniqueMethodWithOriginalName("$deserializeLambda$")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeStatic)
+            .filter(
+                instruction -> instruction.getMethod().getHolderType().getTypeName().equals("Test"))
+            .map(instruction -> instruction.getMethod().getName())
+            .filter(name -> name.startsWith("$deserializeLambda$$"))
+            .count());
+    assertEquals(
+        2,
+        clazz.allMethods().stream()
+            .flatMap(MethodSubject::streamInstructions)
+            .filter(InstructionSubject::isInvokeVirtual)
+            .map(instruction -> instruction.getMethod().getName())
+            .filter(name -> name.isEqualTo("getInstantiatedMethodType"))
+            .count());
   }
 
   @Test
   public void testD8() throws Exception {
+    parameters.assumeDexRuntime();
     testForD8()
-        .addProgramClassFileData(dump())
+        .addProgramFiles(TEST_CLASS_FILE)
         .setMinApi(parameters)
         .compile()
         .inspect(
@@ -58,15 +139,16 @@
                   clazz.allMethods().stream()
                       .flatMap(MethodSubject::streamInstructions)
                       .filter(InstructionSubject::isInvokeVirtual)
-                      .map(instructionSubject -> instructionSubject.getMethod().getName())
+                      .map(instruction -> instruction.getMethod().getName())
                       .noneMatch(name -> name.isEqualTo("getInstantiatedMethodType")));
             });
   }
 
   @Test
   public void testR8() throws Exception {
+    parameters.assumeDexRuntime();
     testForR8(parameters)
-        .addProgramClassFileData(dump())
+        .addProgramFiles(TEST_CLASS_FILE)
         .setMinApi(parameters)
         .addKeepMainRule("Test")
         .compile()
@@ -85,831 +167,8 @@
                   clazz.allMethods().stream()
                       .flatMap(MethodSubject::streamInstructions)
                       .filter(InstructionSubject::isInvokeVirtual)
-                      .map(instructionSubject -> instructionSubject.getMethod().getName())
+                      .map(instruction -> instruction.getMethod().getName())
                       .noneMatch(name -> name.isEqualTo("getInstantiatedMethodType")));
             });
   }
-
-  /*
-
-  Byte code for the following Java code compiled with javac HEAD
-  (commit 8b2b3c84c59c79362d1a9b8a839edb5999999932) with option --release 27.
-
-  The difference from JDK 26 is that the synthetic method $deserializeLambda$ now has outlines
-  for each lambda to deserialize. All the outline method names has prefix $deserializeLambda$.
-    class Test {
-      private static Supplier<Integer> create0() {
-        return (Supplier<Integer> & Serializable) () -> 0;
-      }
-      private static Supplier<Integer> create1() {
-        return (Supplier<Integer> & Serializable) () -> 1;
-      }
-      private static void runTest(int expectedResult, Supplier<Integer> instance) throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
-          oos.writeObject(instance);
-          oos.close();
-        }
-        try (ByteArrayInputStream in = new ByteArrayInputStream(baos.toByteArray());
-           ObjectInputStream ois = new ObjectInputStream(in)) {
-          int actual = ((Supplier<Integer>) ois.readObject()).get();
-          if (expectedResult != actual) {
-              throw new AssertionError("Expected: " + expectedResult + ", actual: " + actual);
-          }
-        }
-      }
-      public static void main() throws Exception {
-        runTest(0, create0());
-        runTest(1, create1());
-        System.err.println("OK");
-      }
-    }
-
-  */
-  public static byte[] dump() throws Exception {
-
-    ClassWriter classWriter = new ClassWriter(0);
-    MethodVisitor methodVisitor;
-
-    // Changed from V27 to V26 as ASM 9.9 does not support V27.
-    classWriter.visit(V26, ACC_SUPER, "Test", null, "java/lang/Object", null);
-
-    classWriter.visitSource("Test.java", null);
-
-    classWriter.visitInnerClass(
-        "java/lang/invoke/MethodHandles$Lookup",
-        "java/lang/invoke/MethodHandles",
-        "Lookup",
-        ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
-
-    {
-      methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(3, label0);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
-      methodVisitor.visitInsn(RETURN);
-      methodVisitor.visitMaxs(1, 1);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC,
-              "create0",
-              "()Ljava/util/function/Supplier;",
-              "()Ljava/util/function/Supplier<Ljava/lang/Integer;>;",
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(5, label0);
-      methodVisitor.visitInvokeDynamicInsn(
-          "get",
-          "()Ljava/util/function/Supplier;",
-          new Handle(
-              Opcodes.H_INVOKESTATIC,
-              "java/lang/invoke/LambdaMetafactory",
-              "altMetafactory",
-              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
-              false),
-          new Object[] {
-            Type.getType("()Ljava/lang/Object;"),
-            new Handle(
-                Opcodes.H_INVOKESTATIC,
-                "Test",
-                "lambda$create0$66102042$1",
-                "()Ljava/lang/Integer;",
-                false),
-            Type.getType("()Ljava/lang/Integer;"),
-            Integer.valueOf(5),
-            Integer.valueOf(0)
-          });
-      methodVisitor.visitTypeInsn(CHECKCAST, "java/io/Serializable");
-      methodVisitor.visitTypeInsn(CHECKCAST, "java/util/function/Supplier");
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitMaxs(1, 0);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC,
-              "create1",
-              "()Ljava/util/function/Supplier;",
-              "()Ljava/util/function/Supplier<Ljava/lang/Integer;>;",
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(8, label0);
-      methodVisitor.visitInvokeDynamicInsn(
-          "get",
-          "()Ljava/util/function/Supplier;",
-          new Handle(
-              Opcodes.H_INVOKESTATIC,
-              "java/lang/invoke/LambdaMetafactory",
-              "altMetafactory",
-              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
-              false),
-          new Object[] {
-            Type.getType("()Ljava/lang/Object;"),
-            new Handle(
-                Opcodes.H_INVOKESTATIC,
-                "Test",
-                "lambda$create1$66102042$1",
-                "()Ljava/lang/Integer;",
-                false),
-            Type.getType("()Ljava/lang/Integer;"),
-            Integer.valueOf(5),
-            Integer.valueOf(0)
-          });
-      methodVisitor.visitTypeInsn(CHECKCAST, "java/io/Serializable");
-      methodVisitor.visitTypeInsn(CHECKCAST, "java/util/function/Supplier");
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitMaxs(1, 0);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC,
-              "runTest",
-              "(ILjava/util/function/Supplier;)V",
-              "(ILjava/util/function/Supplier<Ljava/lang/Integer;>;)V",
-              new String[] {"java/lang/Exception"});
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      Label label1 = new Label();
-      Label label2 = new Label();
-      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
-      Label label3 = new Label();
-      Label label4 = new Label();
-      Label label5 = new Label();
-      methodVisitor.visitTryCatchBlock(label3, label4, label5, "java/lang/Throwable");
-      Label label6 = new Label();
-      Label label7 = new Label();
-      Label label8 = new Label();
-      methodVisitor.visitTryCatchBlock(label6, label7, label8, "java/lang/Throwable");
-      Label label9 = new Label();
-      Label label10 = new Label();
-      Label label11 = new Label();
-      methodVisitor.visitTryCatchBlock(label9, label10, label11, "java/lang/Throwable");
-      Label label12 = new Label();
-      Label label13 = new Label();
-      Label label14 = new Label();
-      methodVisitor.visitTryCatchBlock(label12, label13, label14, "java/lang/Throwable");
-      Label label15 = new Label();
-      Label label16 = new Label();
-      Label label17 = new Label();
-      methodVisitor.visitTryCatchBlock(label15, label16, label17, "java/lang/Throwable");
-      Label label18 = new Label();
-      methodVisitor.visitLabel(label18);
-      methodVisitor.visitLineNumber(11, label18);
-      methodVisitor.visitTypeInsn(NEW, "java/io/ByteArrayOutputStream");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL, "java/io/ByteArrayOutputStream", "<init>", "()V", false);
-      methodVisitor.visitVarInsn(ASTORE, 2);
-      Label label19 = new Label();
-      methodVisitor.visitLabel(label19);
-      methodVisitor.visitLineNumber(12, label19);
-      methodVisitor.visitTypeInsn(NEW, "java/io/ObjectOutputStream");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitVarInsn(ALOAD, 2);
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL,
-          "java/io/ObjectOutputStream",
-          "<init>",
-          "(Ljava/io/OutputStream;)V",
-          false);
-      methodVisitor.visitVarInsn(ASTORE, 3);
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(13, label0);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitVarInsn(ALOAD, 1);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/io/ObjectOutputStream",
-          "writeObject",
-          "(Ljava/lang/Object;)V",
-          false);
-      Label label20 = new Label();
-      methodVisitor.visitLabel(label20);
-      methodVisitor.visitLineNumber(14, label20);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ObjectOutputStream", "close", "()V", false);
-      methodVisitor.visitLabel(label1);
-      methodVisitor.visitLineNumber(15, label1);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ObjectOutputStream", "close", "()V", false);
-      Label label21 = new Label();
-      methodVisitor.visitJumpInsn(GOTO, label21);
-      methodVisitor.visitLabel(label2);
-      methodVisitor.visitLineNumber(12, label2);
-      methodVisitor.visitFrame(
-          Opcodes.F_FULL,
-          4,
-          new Object[] {
-            Opcodes.INTEGER,
-            "java/util/function/Supplier",
-            "java/io/ByteArrayOutputStream",
-            "java/io/ObjectOutputStream"
-          },
-          1,
-          new Object[] {"java/lang/Throwable"});
-      methodVisitor.visitVarInsn(ASTORE, 4);
-      methodVisitor.visitLabel(label3);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ObjectOutputStream", "close", "()V", false);
-      methodVisitor.visitLabel(label4);
-      Label label22 = new Label();
-      methodVisitor.visitJumpInsn(GOTO, label22);
-      methodVisitor.visitLabel(label5);
-      methodVisitor.visitFrame(
-          Opcodes.F_FULL,
-          5,
-          new Object[] {
-            Opcodes.INTEGER,
-            "java/util/function/Supplier",
-            "java/io/ByteArrayOutputStream",
-            "java/io/ObjectOutputStream",
-            "java/lang/Throwable"
-          },
-          1,
-          new Object[] {"java/lang/Throwable"});
-      methodVisitor.visitVarInsn(ASTORE, 5);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitVarInsn(ALOAD, 5);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
-      methodVisitor.visitLabel(label22);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitLabel(label21);
-      methodVisitor.visitLineNumber(16, label21);
-      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
-      methodVisitor.visitTypeInsn(NEW, "java/io/ByteArrayInputStream");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitVarInsn(ALOAD, 2);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ByteArrayOutputStream", "toByteArray", "()[B", false);
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL, "java/io/ByteArrayInputStream", "<init>", "([B)V", false);
-      methodVisitor.visitVarInsn(ASTORE, 3);
-      methodVisitor.visitLabel(label12);
-      methodVisitor.visitLineNumber(17, label12);
-      methodVisitor.visitTypeInsn(NEW, "java/io/ObjectInputStream");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL, "java/io/ObjectInputStream", "<init>", "(Ljava/io/InputStream;)V", false);
-      methodVisitor.visitVarInsn(ASTORE, 4);
-      methodVisitor.visitLabel(label6);
-      methodVisitor.visitLineNumber(18, label6);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ObjectInputStream", "readObject", "()Ljava/lang/Object;", false);
-      methodVisitor.visitTypeInsn(CHECKCAST, "java/util/function/Supplier");
-      methodVisitor.visitMethodInsn(
-          INVOKEINTERFACE, "java/util/function/Supplier", "get", "()Ljava/lang/Object;", true);
-      methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/Integer");
-      methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false);
-      methodVisitor.visitVarInsn(ISTORE, 5);
-      Label label23 = new Label();
-      methodVisitor.visitLabel(label23);
-      methodVisitor.visitLineNumber(19, label23);
-      methodVisitor.visitVarInsn(ILOAD, 0);
-      methodVisitor.visitVarInsn(ILOAD, 5);
-      methodVisitor.visitJumpInsn(IF_ICMPEQ, label7);
-      Label label24 = new Label();
-      methodVisitor.visitLabel(label24);
-      methodVisitor.visitLineNumber(20, label24);
-      methodVisitor.visitTypeInsn(NEW, "java/lang/AssertionError");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitVarInsn(ILOAD, 0);
-      methodVisitor.visitVarInsn(ILOAD, 5);
-      methodVisitor.visitInvokeDynamicInsn(
-          "makeConcatWithConstants",
-          "(II)Ljava/lang/String;",
-          new Handle(
-              Opcodes.H_INVOKESTATIC,
-              "java/lang/invoke/StringConcatFactory",
-              "makeConcatWithConstants",
-              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
-              false),
-          new Object[] {"Expected: \u0001, actual: \u0001"});
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL, "java/lang/AssertionError", "<init>", "(Ljava/lang/Object;)V", false);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitLabel(label7);
-      methodVisitor.visitLineNumber(22, label7);
-      methodVisitor.visitFrame(
-          Opcodes.F_APPEND,
-          2,
-          new Object[] {"java/io/ByteArrayInputStream", "java/io/ObjectInputStream"},
-          0,
-          null);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ObjectInputStream", "close", "()V", false);
-      methodVisitor.visitJumpInsn(GOTO, label13);
-      methodVisitor.visitLabel(label8);
-      methodVisitor.visitLineNumber(16, label8);
-      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
-      methodVisitor.visitVarInsn(ASTORE, 5);
-      methodVisitor.visitLabel(label9);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ObjectInputStream", "close", "()V", false);
-      methodVisitor.visitLabel(label10);
-      Label label25 = new Label();
-      methodVisitor.visitJumpInsn(GOTO, label25);
-      methodVisitor.visitLabel(label11);
-      methodVisitor.visitFrame(
-          Opcodes.F_FULL,
-          6,
-          new Object[] {
-            Opcodes.INTEGER,
-            "java/util/function/Supplier",
-            "java/io/ByteArrayOutputStream",
-            "java/io/ByteArrayInputStream",
-            "java/io/ObjectInputStream",
-            "java/lang/Throwable"
-          },
-          1,
-          new Object[] {"java/lang/Throwable"});
-      methodVisitor.visitVarInsn(ASTORE, 6);
-      methodVisitor.visitVarInsn(ALOAD, 5);
-      methodVisitor.visitVarInsn(ALOAD, 6);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
-      methodVisitor.visitLabel(label25);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 5);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitLabel(label13);
-      methodVisitor.visitLineNumber(22, label13);
-      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ByteArrayInputStream", "close", "()V", false);
-      Label label26 = new Label();
-      methodVisitor.visitJumpInsn(GOTO, label26);
-      methodVisitor.visitLabel(label14);
-      methodVisitor.visitLineNumber(16, label14);
-      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
-      methodVisitor.visitVarInsn(ASTORE, 4);
-      methodVisitor.visitLabel(label15);
-      methodVisitor.visitVarInsn(ALOAD, 3);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/ByteArrayInputStream", "close", "()V", false);
-      methodVisitor.visitLabel(label16);
-      Label label27 = new Label();
-      methodVisitor.visitJumpInsn(GOTO, label27);
-      methodVisitor.visitLabel(label17);
-      methodVisitor.visitFrame(
-          Opcodes.F_FULL,
-          5,
-          new Object[] {
-            Opcodes.INTEGER,
-            "java/util/function/Supplier",
-            "java/io/ByteArrayOutputStream",
-            "java/io/ByteArrayInputStream",
-            "java/lang/Throwable"
-          },
-          1,
-          new Object[] {"java/lang/Throwable"});
-      methodVisitor.visitVarInsn(ASTORE, 5);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitVarInsn(ALOAD, 5);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
-      methodVisitor.visitLabel(label27);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 4);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitLabel(label26);
-      methodVisitor.visitLineNumber(23, label26);
-      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
-      methodVisitor.visitInsn(RETURN);
-      methodVisitor.visitMaxs(4, 7);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PUBLIC | ACC_STATIC, "main", "()V", null, new String[] {"java/lang/Exception"});
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(25, label0);
-      methodVisitor.visitInsn(ICONST_0);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC, "Test", "create0", "()Ljava/util/function/Supplier;", false);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC, "Test", "runTest", "(ILjava/util/function/Supplier;)V", false);
-      Label label1 = new Label();
-      methodVisitor.visitLabel(label1);
-      methodVisitor.visitLineNumber(26, label1);
-      methodVisitor.visitInsn(ICONST_1);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC, "Test", "create1", "()Ljava/util/function/Supplier;", false);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC, "Test", "runTest", "(ILjava/util/function/Supplier;)V", false);
-      Label label2 = new Label();
-      methodVisitor.visitLabel(label2);
-      methodVisitor.visitLineNumber(27, label2);
-      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
-      methodVisitor.visitLdcInsn("OK");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
-      Label label3 = new Label();
-      methodVisitor.visitLabel(label3);
-      methodVisitor.visitLineNumber(28, label3);
-      methodVisitor.visitInsn(RETURN);
-      methodVisitor.visitMaxs(2, 0);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
-              "$deserializeLambda$",
-              "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;",
-              null,
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(3, label0);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getImplMethodName",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitVarInsn(ASTORE, 1);
-      methodVisitor.visitInsn(ICONST_M1);
-      methodVisitor.visitVarInsn(ISTORE, 2);
-      methodVisitor.visitVarInsn(ALOAD, 1);
-      methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "hashCode", "()I", false);
-      Label label1 = new Label();
-      Label label2 = new Label();
-      Label label3 = new Label();
-      methodVisitor.visitLookupSwitchInsn(
-          label3, new int[] {-1258786731, -1129704012}, new Label[] {label1, label2});
-      methodVisitor.visitLabel(label1);
-      methodVisitor.visitFrame(
-          Opcodes.F_APPEND, 2, new Object[] {"java/lang/String", Opcodes.INTEGER}, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 1);
-      methodVisitor.visitLdcInsn("lambda$create0$66102042$1");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label3);
-      methodVisitor.visitInsn(ICONST_0);
-      methodVisitor.visitVarInsn(ISTORE, 2);
-      methodVisitor.visitJumpInsn(GOTO, label3);
-      methodVisitor.visitLabel(label2);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 1);
-      methodVisitor.visitLdcInsn("lambda$create1$66102042$1");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label3);
-      methodVisitor.visitInsn(ICONST_1);
-      methodVisitor.visitVarInsn(ISTORE, 2);
-      methodVisitor.visitLabel(label3);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ILOAD, 2);
-      Label label4 = new Label();
-      Label label5 = new Label();
-      Label label6 = new Label();
-      methodVisitor.visitLookupSwitchInsn(label6, new int[] {0, 1}, new Label[] {label4, label5});
-      methodVisitor.visitLabel(label4);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC,
-          "Test",
-          "$deserializeLambda$$lambda$create0$66102042$1",
-          "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;",
-          false);
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitLabel(label5);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC,
-          "Test",
-          "$deserializeLambda$$lambda$create1$66102042$1",
-          "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;",
-          false);
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitLabel(label6);
-      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
-      methodVisitor.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitLdcInsn("Invalid lambda deserialization");
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL,
-          "java/lang/IllegalArgumentException",
-          "<init>",
-          "(Ljava/lang/String;)V",
-          false);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitMaxs(3, 3);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
-              "$deserializeLambda$$lambda$create1$66102042$1",
-              "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;",
-              null,
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(3, label0);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/invoke/SerializedLambda", "getImplMethodKind", "()I", false);
-      methodVisitor.visitIntInsn(BIPUSH, 6);
-      Label label1 = new Label();
-      methodVisitor.visitJumpInsn(IF_ICMPNE, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getFunctionalInterfaceClass",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("java/util/function/Supplier");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getFunctionalInterfaceMethodName",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("get");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getFunctionalInterfaceMethodSignature",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("()Ljava/lang/Object;");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getImplClass",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("Test");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getImplMethodSignature",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("()Ljava/lang/Integer;");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getInstantiatedMethodType",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("()Ljava/lang/Integer;");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitInvokeDynamicInsn(
-          "get",
-          "()Ljava/util/function/Supplier;",
-          new Handle(
-              Opcodes.H_INVOKESTATIC,
-              "java/lang/invoke/LambdaMetafactory",
-              "altMetafactory",
-              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
-              false),
-          new Object[] {
-            Type.getType("()Ljava/lang/Object;"),
-            new Handle(
-                Opcodes.H_INVOKESTATIC,
-                "Test",
-                "lambda$create1$66102042$1",
-                "()Ljava/lang/Integer;",
-                false),
-            Type.getType("()Ljava/lang/Integer;"),
-            Integer.valueOf(5),
-            Integer.valueOf(0)
-          });
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitLabel(label1);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitLdcInsn("Invalid lambda deserialization");
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL,
-          "java/lang/IllegalArgumentException",
-          "<init>",
-          "(Ljava/lang/String;)V",
-          false);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitMaxs(3, 1);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
-              "$deserializeLambda$$lambda$create0$66102042$1",
-              "(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object;",
-              null,
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(3, label0);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/invoke/SerializedLambda", "getImplMethodKind", "()I", false);
-      methodVisitor.visitIntInsn(BIPUSH, 6);
-      Label label1 = new Label();
-      methodVisitor.visitJumpInsn(IF_ICMPNE, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getFunctionalInterfaceClass",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("java/util/function/Supplier");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getFunctionalInterfaceMethodName",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("get");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getFunctionalInterfaceMethodSignature",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("()Ljava/lang/Object;");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getImplClass",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("Test");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getImplMethodSignature",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("()Ljava/lang/Integer;");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitVarInsn(ALOAD, 0);
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL,
-          "java/lang/invoke/SerializedLambda",
-          "getInstantiatedMethodType",
-          "()Ljava/lang/String;",
-          false);
-      methodVisitor.visitLdcInsn("()Ljava/lang/Integer;");
-      methodVisitor.visitMethodInsn(
-          INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
-      methodVisitor.visitJumpInsn(IFEQ, label1);
-      methodVisitor.visitInvokeDynamicInsn(
-          "get",
-          "()Ljava/util/function/Supplier;",
-          new Handle(
-              Opcodes.H_INVOKESTATIC,
-              "java/lang/invoke/LambdaMetafactory",
-              "altMetafactory",
-              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
-              false),
-          new Object[] {
-            Type.getType("()Ljava/lang/Object;"),
-            new Handle(
-                Opcodes.H_INVOKESTATIC,
-                "Test",
-                "lambda$create0$66102042$1",
-                "()Ljava/lang/Integer;",
-                false),
-            Type.getType("()Ljava/lang/Integer;"),
-            Integer.valueOf(5),
-            Integer.valueOf(0)
-          });
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitLabel(label1);
-      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
-      methodVisitor.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
-      methodVisitor.visitInsn(DUP);
-      methodVisitor.visitLdcInsn("Invalid lambda deserialization");
-      methodVisitor.visitMethodInsn(
-          INVOKESPECIAL,
-          "java/lang/IllegalArgumentException",
-          "<init>",
-          "(Ljava/lang/String;)V",
-          false);
-      methodVisitor.visitInsn(ATHROW);
-      methodVisitor.visitMaxs(3, 1);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
-              "lambda$create1$66102042$1",
-              "()Ljava/lang/Integer;",
-              null,
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(8, label0);
-      methodVisitor.visitInsn(ICONST_1);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false);
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitMaxs(1, 0);
-      methodVisitor.visitEnd();
-    }
-    {
-      methodVisitor =
-          classWriter.visitMethod(
-              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
-              "lambda$create0$66102042$1",
-              "()Ljava/lang/Integer;",
-              null,
-              null);
-      methodVisitor.visitCode();
-      Label label0 = new Label();
-      methodVisitor.visitLabel(label0);
-      methodVisitor.visitLineNumber(5, label0);
-      methodVisitor.visitInsn(ICONST_0);
-      methodVisitor.visitMethodInsn(
-          INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false);
-      methodVisitor.visitInsn(ARETURN);
-      methodVisitor.visitMaxs(1, 0);
-      methodVisitor.visitEnd();
-    }
-    classWriter.visitEnd();
-
-    return classWriter.toByteArray();
-  }
 }
diff --git a/src/test/testbase/java/com/android/tools/r8/TestParameters.java b/src/test/testbase/java/com/android/tools/r8/TestParameters.java
index 3c553e8..ab2e7aa 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestParameters.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestParameters.java
@@ -312,6 +312,11 @@
     return this;
   }
 
+  public TestParameters assumeNoneRuntime() {
+    assumeTrue(isNoneRuntime());
+    return this;
+  }
+
   public TestParameters assumeIsOrSimulateNoneRuntime() {
     assumeTrue(isOrSimulateNoneRuntime());
     return this;
diff --git a/src/test/testbase/java/com/android/tools/r8/TestRuntime.java b/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
index 58c816d..9af9dc4 100644
--- a/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
+++ b/src/test/testbase/java/com/android/tools/r8/TestRuntime.java
@@ -38,7 +38,8 @@
     JDK11("jdk11", 55),
     JDK17("jdk17", 61),
     JDK21("jdk21", 65),
-    JDK25("jdk25", 69); // Keep JDK-25 (LTS) when adding JDK-26.
+    JDK25("jdk25", 69),
+    JDK27("jdk27", 71);
 
     /** This should generally be the latest checked in CF runtime we fully support. */
     private static final CfVm DEFAULT = JDK11;
@@ -98,6 +99,7 @@
   private static final Path JDK17_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-17");
   private static final Path JDK21_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-21");
   private static final Path JDK25_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-25");
+  private static final Path JDK27_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-27");
   private static final Map<CfVm, Path> jdkPaths =
       ImmutableMap.of(
           CfVm.JDK8, JDK8_PATH,
@@ -105,7 +107,8 @@
           CfVm.JDK11, JDK11_PATH,
           CfVm.JDK17, JDK17_PATH,
           CfVm.JDK21, JDK21_PATH,
-          CfVm.JDK25, JDK25_PATH);
+          CfVm.JDK25, JDK25_PATH,
+          CfVm.JDK27, JDK27_PATH);
 
   public static CfRuntime getCheckedInJdk(CfVm vm) {
     if (vm == CfVm.JDK8) {
@@ -162,6 +165,10 @@
     return new CfRuntime(CfVm.JDK25, getCheckedInJdkHome(CfVm.JDK25));
   }
 
+  public static CfRuntime getCheckedInJdk27() {
+    return new CfRuntime(CfVm.JDK27, getCheckedInJdkHome(CfVm.JDK27));
+  }
+
   public static List<CfRuntime> getCheckedInCfRuntimes() {
     CfRuntime[] jdks =
         new CfRuntime[] {
diff --git a/third_party/openjdk/jdk-26/linux.tar.gz.sha1 b/third_party/openjdk/jdk-26/linux.tar.gz.sha1
deleted file mode 100644
index 7fb9d71..0000000
--- a/third_party/openjdk/jdk-26/linux.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-ecb6ebcd936be78b3cda49ed1a8e4b5238098820
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-26/osx.tar.gz.sha1 b/third_party/openjdk/jdk-26/osx.tar.gz.sha1
deleted file mode 100644
index 44da718..0000000
--- a/third_party/openjdk/jdk-26/osx.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d6680739544dd382025d7ff99a9abaa7ffe0e033
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-26/windows.tar.gz.sha1 b/third_party/openjdk/jdk-26/windows.tar.gz.sha1
deleted file mode 100644
index 35aca55..0000000
--- a/third_party/openjdk/jdk-26/windows.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e5c439bb8a3f64529d6b39ab970d84a30fe1f4dd
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-27/linux.tar.gz.sha1 b/third_party/openjdk/jdk-27/linux.tar.gz.sha1
new file mode 100644
index 0000000..ea36505
--- /dev/null
+++ b/third_party/openjdk/jdk-27/linux.tar.gz.sha1
@@ -0,0 +1 @@
+486b0c3f2af792f9ed1393bf1e8f2706520e0827
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-27/osx.tar.gz.sha1 b/third_party/openjdk/jdk-27/osx.tar.gz.sha1
new file mode 100644
index 0000000..b7b51a5
--- /dev/null
+++ b/third_party/openjdk/jdk-27/osx.tar.gz.sha1
@@ -0,0 +1 @@
+a59646eb49ebcf9da842128099e628d19e96d3ef
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-27/windows.tar.gz.sha1 b/third_party/openjdk/jdk-27/windows.tar.gz.sha1
new file mode 100644
index 0000000..b732e19
--- /dev/null
+++ b/third_party/openjdk/jdk-27/windows.tar.gz.sha1
@@ -0,0 +1 @@
+cc2b6369bd06c9536c9a454fe6c124ceb24ee9ba
\ No newline at end of file