Extend test infrastructure to test JDK 17

Change-Id: I6c15a21ef2ac8ccff65ff82738c02adc38479672
diff --git a/build.gradle b/build.gradle
index 5b9c8df..a138d84 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,9 +2,10 @@
 // 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.
 
+
+import desugaredlibrary.CustomConversionAsmRewriterTask
 import dx.DexMergerTask
 import dx.DxTask
-import desugaredlibrary.CustomConversionAsmRewriterTask
 import net.ltgt.gradle.errorprone.CheckSeverity
 import org.gradle.internal.os.OperatingSystem
 import smali.SmaliTask
@@ -79,6 +80,14 @@
             srcDirs "third_party/api_database/api_database"
         }
     }
+    main17 {
+        java {
+            srcDirs = ['src/main/java']
+        }
+        resources {
+            srcDirs "third_party/api_database/api_database"
+        }
+    }
     test {
         java {
             srcDirs = [
@@ -252,6 +261,25 @@
     main11Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
     main11Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
 
+    main17Implementation "net.sf.jopt-simple:jopt-simple:$joptSimpleVersion"
+    main17Implementation "com.google.code.gson:gson:$gsonVersion"
+    // Include all of guava when compiling the code, but exclude annotations that we don't
+    // need from the packaging.
+    main17CompileOnly("com.google.guava:guava:$guavaVersion")
+    main17Implementation("com.google.guava:guava:$guavaVersion", {
+        exclude group: 'com.google.errorprone'
+        exclude group: 'com.google.code.findbugs'
+        exclude group: 'com.google.j2objc'
+        exclude group: 'org.codehaus.mojo'
+    })
+    main17Implementation group: 'it.unimi.dsi', name: 'fastutil', version: fastutilVersion
+    main17Implementation "org.jetbrains.kotlinx:kotlinx-metadata-jvm:$kotlinExtMetadataJVMVersion"
+    main17Implementation group: 'org.ow2.asm', name: 'asm', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-commons', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
+    
     examplesTestNGRunnerCompile group: 'org.testng', name: 'testng', version: testngVersion
 
     testCompile sourceSets.examples.output
@@ -630,6 +658,11 @@
         JavaVersion.VERSION_11,
         false)
 setJdkCompilationWithCompatibility(
+        sourceSets.main17.compileJavaTaskName,
+        'jdk-17',
+        JavaVersion.VERSION_17,
+        false)
+setJdkCompilationWithCompatibility(
         sourceSets.examplesJava11.compileJavaTaskName,
         'jdk-11',
         JavaVersion.VERSION_11,
@@ -782,6 +815,11 @@
     archiveFileName = 'sources_main_11.jar'
 }
 
+task repackageSources17(type: Jar) {
+    from sourceSets.main17.output
+    archiveFileName = 'sources_main_17.jar'
+}
+
 def r8CreateTask(name, baseName, sources, includeLibraryLicenses, includeSwissArmyKnife) {
     return tasks.create("r8Create${name}", Jar) {
         entryCompression ZipEntryCompression.STORED
@@ -872,6 +910,20 @@
     outputs.files r8Task.outputs.files
 }
 
+task r8WithDeps17 {
+    dependsOn repackageSources17
+    dependsOn repackageDeps
+    inputs.files ([repackageSources17.outputs, repackageDeps.outputs])
+    def r8Task = r8CreateTask(
+            'WithDeps17',
+            'r8_with_deps_17.jar',
+            repackageSources17.outputs.files + repackageDeps.outputs.files,
+            true,
+            true)
+    dependsOn r8Task
+    outputs.files r8Task.outputs.files
+}
+
 task r8WithRelocatedDeps {
     def output = "${buildDir}/libs/r8_with_relocated_deps.jar"
     dependsOn r8RelocateTask(r8WithDeps, output)
@@ -886,6 +938,13 @@
     outputs.file output
 }
 
+task r8WithRelocatedDeps17 {
+    def output = "${buildDir}/libs/r8_with_relocated_deps_17.jar"
+    dependsOn r8RelocateTask(r8WithDeps17, output)
+    inputs.files r8WithDeps17.outputs.files
+    outputs.file output
+}
+
 task r8WithoutDeps {
     dependsOn repackageSources
     inputs.files repackageSources.outputs
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 69f2167..4413de7 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -171,6 +171,8 @@
   public static final Path R8_WITH_DEPS_11_JAR = Paths.get(LIBS_DIR, "r8_with_deps_11.jar");
   public static final Path R8_WITH_RELOCATED_DEPS_11_JAR =
       Paths.get(LIBS_DIR, "r8_with_relocated_deps_11.jar");
+  public static final Path R8_WITH_RELOCATED_DEPS_17_JAR =
+      Paths.get(LIBS_DIR, "r8_with_relocated_deps_17.jar");
   public static final Path R8LIB_JAR = Paths.get(LIBS_DIR, "r8lib.jar");
   public static final Path R8LIB_MAP = Paths.get(LIBS_DIR, "r8lib.jar.map");
   public static final Path R8LIB_EXCLUDE_DEPS_JAR = Paths.get(LIBS_DIR, "r8lib-exclude-deps.jar");
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java
deleted file mode 100644
index cb549f5..0000000
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8CompilationTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
-
-import static junit.framework.TestCase.assertTrue;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class Java11R8CompilationTest extends TestBase {
-
-  public Java11R8CompilationTest(TestParameters parameters) {
-    this.parameters = parameters;
-  }
-
-  private final TestParameters parameters;
-
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters()
-        // Use of APIs, such as java.nio.file.* are only available from 26+.
-        .withApiLevelsStartingAtIncluding(AndroidApiLevel.O)
-        .withDexRuntimes()
-        .build();
-  }
-
-  private static final Path MAIN_KEEP = Paths.get("src/main/keep.txt");
-
-  private static void assertNoNests(CodeInspector inspector) {
-    assertTrue(
-        inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
-  }
-
-  @Test
-  public void testR8CompiledWithR8() throws Exception {
-    testForR8(parameters.getBackend())
-        .setMinApi(parameters.getApiLevel())
-        .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR)
-        .addKeepRuleFiles(MAIN_KEEP)
-        .compile()
-        .inspect(this::assertNotEmpty)
-        .inspect(Java11R8CompilationTest::assertNoNests);
-  }
-
-  private void assertNotEmpty(CodeInspector inspector) {
-    assertTrue(inspector.allClasses().size() > 0);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java11R8BootstrapTest.java
similarity index 75%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
rename to src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java11R8BootstrapTest.java
index 04e2842..b3a9adf 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java11R8BootstrapTest.java
@@ -1,12 +1,12 @@
-// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.desugar.r8bootstrap;
 
+import static com.android.tools.r8.desugar.r8bootstrap.JavaBootstrapUtils.MAIN_KEEP;
 import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
 
 import com.android.tools.r8.Jdk11TestUtils;
 import com.android.tools.r8.TestBase;
@@ -15,8 +15,6 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.cf.bootstrap.BootstrapCurrentEqualityTest;
-import com.android.tools.r8.utils.InternalOptions.DesugarState;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -37,7 +35,6 @@
 @RunWith(Parameterized.class)
 public class Java11R8BootstrapTest extends TestBase {
 
-  private static final Path MAIN_KEEP = Paths.get("src/main/keep.txt");
   private static final String[] HELLO_KEEP = {
     "-keep class hello.Hello {  public static void main(...);}"
   };
@@ -63,31 +60,10 @@
   }
 
   private static Path compileR8(boolean desugar) throws Exception {
-    // Shrink R8 11 with R8
-    return testForR8(TestBase.getStaticTemp(), Backend.CF)
-        .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR)
-        .addLibraryFiles(Jdk11TestUtils.getJdk11LibraryFiles(getStaticTemp()))
-        .addKeepRuleFiles(MAIN_KEEP)
-        .applyIf(
-            desugar,
-            builder ->
-                builder.addOptionsModification(
-                    options -> {
-                      options.desugarState = DesugarState.ON;
-                    }))
-        .compile()
-        .inspect(inspector -> assertNests(inspector, desugar))
-        .writeToZip();
-  }
-
-  private static void assertNests(CodeInspector inspector, boolean desugar) {
-    if (desugar) {
-      assertTrue(
-          inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
-    } else {
-      assertTrue(
-          inspector.allClasses().stream().anyMatch(subj -> subj.getDexProgramClass().isInANest()));
-    }
+    return JavaBootstrapUtils.compileR8(
+        ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR,
+        Jdk11TestUtils.getJdk11LibraryFiles(getStaticTemp()),
+        desugar);
   }
 
   private Path[] jarsToCompare() {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java
similarity index 65%
copy from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
copy to src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java
index 04e2842..2ed69e1 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11R8BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java
@@ -1,12 +1,12 @@
-// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.desugar.r8bootstrap;
 
+import static com.android.tools.r8.desugar.r8bootstrap.JavaBootstrapUtils.MAIN_KEEP;
 import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
 
 import com.android.tools.r8.Jdk11TestUtils;
 import com.android.tools.r8.TestBase;
@@ -15,8 +15,6 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.cf.bootstrap.BootstrapCurrentEqualityTest;
-import com.android.tools.r8.utils.InternalOptions.DesugarState;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -28,24 +26,23 @@
 import org.junit.runners.Parameterized.Parameters;
 
 /**
- * This test relies on a freshly built build/libs/r8_with_relocated_deps_11.jar.
+ * This test relies on a freshly built build/libs/r8_with_relocated_deps_17.jar.
  *
- * <p>The test compiles Hello/R8 with the same settings using R8 compiled with Java 11 (non shrunk),
+ * <p>The test compiles Hello/R8 with the same settings using R8 compiled with Java 17 (non shrunk),
  * and the same but shrunk with/without nest desugaring. All generated jars should be run correctly
  * and identical.
  */
 @RunWith(Parameterized.class)
-public class Java11R8BootstrapTest extends TestBase {
+public class Java17R8BootstrapTest extends TestBase {
 
-  private static final Path MAIN_KEEP = Paths.get("src/main/keep.txt");
   private static final String[] HELLO_KEEP = {
     "-keep class hello.Hello {  public static void main(...);}"
   };
 
-  private static Path r8Lib11NoDesugar;
-  private static Path r8Lib11Desugar;
+  private static Path r8Lib17NoDesugar;
+  private static Path r8Lib17Desugar;
 
-  public Java11R8BootstrapTest(TestParameters parameters) {
+  public Java17R8BootstrapTest(TestParameters parameters) {
     this.parameters = parameters;
   }
 
@@ -53,54 +50,39 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntimesStartingFromIncluding(CfVm.JDK11).build();
+    return getTestParameters().withCfRuntimesStartingFromIncluding(CfVm.JDK17).build();
+  }
+
+  private static boolean supportsSealedClassesWhenGeneratingCf() {
+    // TODO(b/227160052): When this is true enable this test.
+    return false;
   }
 
   @BeforeClass
   public static void beforeAll() throws Exception {
-    r8Lib11NoDesugar = compileR8(false);
-    r8Lib11Desugar = compileR8(true);
+    if (!supportsSealedClassesWhenGeneratingCf()) {
+      return;
+    }
+    r8Lib17NoDesugar = compileR8(false);
+    r8Lib17Desugar = compileR8(true);
   }
 
   private static Path compileR8(boolean desugar) throws Exception {
-    // Shrink R8 11 with R8
-    return testForR8(TestBase.getStaticTemp(), Backend.CF)
-        .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR)
-        .addLibraryFiles(Jdk11TestUtils.getJdk11LibraryFiles(getStaticTemp()))
-        .addKeepRuleFiles(MAIN_KEEP)
-        .applyIf(
-            desugar,
-            builder ->
-                builder.addOptionsModification(
-                    options -> {
-                      options.desugarState = DesugarState.ON;
-                    }))
-        .compile()
-        .inspect(inspector -> assertNests(inspector, desugar))
-        .writeToZip();
-  }
-
-  private static void assertNests(CodeInspector inspector, boolean desugar) {
-    if (desugar) {
-      assertTrue(
-          inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
-    } else {
-      assertTrue(
-          inspector.allClasses().stream().anyMatch(subj -> subj.getDexProgramClass().isInANest()));
-    }
+    return JavaBootstrapUtils.compileR8(
+        ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR,
+        Jdk11TestUtils.getJdk11LibraryFiles(getStaticTemp()),
+        desugar);
   }
 
   private Path[] jarsToCompare() {
-    return new Path[] {
-      ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR,
-      r8Lib11NoDesugar,
-      r8Lib11Desugar
-    };
+    return new Path[] {ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR, r8Lib17NoDesugar, r8Lib17Desugar};
   }
 
   @Test
   public void testHello() throws Exception {
     Assume.assumeTrue(!ToolHelper.isWindows());
+    Assume.assumeTrue(JavaBootstrapUtils.exists(ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR));
+    Assume.assumeTrue(supportsSealedClassesWhenGeneratingCf());
     Path prevGeneratedJar = null;
     String prevRunResult = null;
     for (Path jar : jarsToCompare()) {
@@ -131,7 +113,9 @@
   public void testR8() throws Exception {
     Assume.assumeTrue(!ToolHelper.isWindows());
     Assume.assumeTrue(parameters.isCfRuntime());
-    Assume.assumeTrue(CfVm.JDK11.lessThanOrEqual(parameters.getRuntime().asCf().getVm()));
+    Assume.assumeTrue(CfVm.JDK17.lessThanOrEqual(parameters.getRuntime().asCf().getVm()));
+    Assume.assumeTrue(JavaBootstrapUtils.exists(ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR));
+    Assume.assumeTrue(supportsSealedClassesWhenGeneratingCf());
     Path prevGeneratedJar = null;
     for (Path jar : jarsToCompare()) {
       Path generatedJar =
diff --git a/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaBootstrapUtils.java b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaBootstrapUtils.java
new file mode 100644
index 0000000..63d7dde
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaBootstrapUtils.java
@@ -0,0 +1,57 @@
+// 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.desugar.r8bootstrap;
+
+import static junit.framework.TestCase.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.InternalOptions.DesugarState;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class JavaBootstrapUtils extends TestBase {
+
+  static final Path MAIN_KEEP = Paths.get("src/main/keep.txt");
+
+  static boolean exists(Path r8WithRelocatedDeps) {
+    // This test runs only if the dependencies have been generated using:
+    // <code> tools/gradle.py r8WithRelocatedDeps17 r8WithRelocatedDeps11 </code>
+    return Files.exists(r8WithRelocatedDeps);
+  }
+
+  static Path compileR8(Path r8WithRelocatedDeps, Path[] libraryFiles, boolean desugar)
+      throws Exception {
+    if (!exists(r8WithRelocatedDeps)) {
+      return null;
+    }
+    // Shrink R8 11 with R8
+    return testForR8(getStaticTemp(), Backend.CF)
+        .addProgramFiles(r8WithRelocatedDeps)
+        .addLibraryFiles(libraryFiles)
+        .addKeepRuleFiles(MAIN_KEEP)
+        .applyIf(
+            desugar,
+            builder ->
+                builder.addOptionsModification(
+                    options -> {
+                      options.desugarState = DesugarState.ON;
+                    }))
+        .compile()
+        .inspect(inspector -> assertNests(inspector, desugar))
+        .writeToZip();
+  }
+
+  private static void assertNests(CodeInspector inspector, boolean desugar) {
+    if (desugar) {
+      assertTrue(
+          inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
+    } else {
+      assertTrue(
+          inspector.allClasses().stream().anyMatch(subj -> subj.getDexProgramClass().isInANest()));
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaD8CompilationTest.java
similarity index 78%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java
rename to src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaD8CompilationTest.java
index a4c0ca7..1970880 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/Java11D8CompilationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaD8CompilationTest.java
@@ -1,8 +1,8 @@
-// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
+package com.android.tools.r8.desugar.r8bootstrap;
 
 import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
 import static com.android.tools.r8.utils.InternalOptions.ASM_VERSION;
@@ -12,7 +12,6 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.cf.CfVersion;
 import com.android.tools.r8.references.Reference;
@@ -20,9 +19,12 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ZipUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Path;
+import java.util.List;
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -32,15 +34,21 @@
 import org.objectweb.asm.ClassVisitor;
 
 @RunWith(Parameterized.class)
-public class Java11D8CompilationTest extends TestBase {
+public class JavaD8CompilationTest extends TestBase {
 
-  public Java11D8CompilationTest(TestParameters parameters) {
+  private final Path r8WithRelocatedDeps;
+
+  public JavaD8CompilationTest(TestParameters parameters, Path r8WithRelocatedDeps) {
     parameters.assertNoneRuntime();
+    this.r8WithRelocatedDeps = r8WithRelocatedDeps;
   }
 
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
+  @Parameters(name = "{0}, java: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withNoneRuntime().build(),
+        ImmutableList.of(
+            ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR, ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR));
   }
 
   private static void assertNoNests(CodeInspector inspector) {
@@ -50,22 +58,24 @@
 
   @Test
   public void testR8CompiledWithD8() throws Exception {
+    Assume.assumeTrue(JavaBootstrapUtils.exists(r8WithRelocatedDeps));
     testForD8()
-        .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR)
+        .addProgramFiles(r8WithRelocatedDeps)
         .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
         .compile()
-        .inspect(Java11D8CompilationTest::assertNoNests);
+        .inspect(JavaD8CompilationTest::assertNoNests);
   }
 
   @Test
   public void testR8CompiledWithD8ToCf() throws Exception {
+    Assume.assumeTrue(JavaBootstrapUtils.exists(r8WithRelocatedDeps));
     Path r8Desugared =
         testForD8(Backend.CF)
-            .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR)
+            .addProgramFiles(r8WithRelocatedDeps)
             .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMinApi(AndroidApiLevel.B)
             .compile()
-            .inspect(Java11D8CompilationTest::assertNoNests)
+            .inspect(JavaD8CompilationTest::assertNoNests)
             .writeToZip();
 
     // Check that the desugared classes has the expected class file versions and that no nest
diff --git a/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaR8CompilationTest.java b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaR8CompilationTest.java
new file mode 100644
index 0000000..09cb049
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/JavaR8CompilationTest.java
@@ -0,0 +1,69 @@
+// 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.desugar.r8bootstrap;
+
+import static junit.framework.TestCase.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class JavaR8CompilationTest extends TestBase {
+
+  private final TestParameters parameters;
+  private final Path r8WithRelocatedDeps;
+
+  public JavaR8CompilationTest(TestParameters parameters, Path r8WithRelocatedDeps) {
+    this.parameters = parameters;
+    this.r8WithRelocatedDeps = r8WithRelocatedDeps;
+  }
+
+  @Parameters(name = "{0}, java: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters()
+            // Use of APIs, such as java.nio.file.* are only available from 26+.
+            .withApiLevelsStartingAtIncluding(AndroidApiLevel.O)
+            .withDexRuntimes()
+            .build(),
+        ImmutableList.of(
+            ToolHelper.R8_WITH_RELOCATED_DEPS_11_JAR, ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR));
+  }
+
+  private static final Path MAIN_KEEP = Paths.get("src/main/keep.txt");
+
+  private static void assertNoNests(CodeInspector inspector) {
+    assertTrue(
+        inspector.allClasses().stream().noneMatch(subj -> subj.getDexProgramClass().isInANest()));
+  }
+
+  @Test
+  public void testR8CompiledWithR8() throws Exception {
+    Assume.assumeTrue(JavaBootstrapUtils.exists(r8WithRelocatedDeps));
+    testForR8(parameters.getBackend())
+        .setMinApi(parameters.getApiLevel())
+        .addProgramFiles(r8WithRelocatedDeps)
+        .addKeepRuleFiles(MAIN_KEEP)
+        .compile()
+        .inspect(this::assertNotEmpty)
+        .inspect(JavaR8CompilationTest::assertNoNests);
+  }
+
+  private void assertNotEmpty(CodeInspector inspector) {
+    assertTrue(inspector.allClasses().size() > 0);
+  }
+}
diff --git a/tools/test.py b/tools/test.py
index 570da44..a2a1ba7 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -359,10 +359,8 @@
     gradle_args.append('-Ptesting-state-name=' + options.testing_state_name)
 
   # Build an R8 with dependencies for bootstrapping tests before adding test sources.
-  gradle_args.append('r8WithDeps')
-  gradle_args.append('r8WithDeps11')
   gradle_args.append('r8WithRelocatedDeps')
-  gradle_args.append('r8WithRelocatedDeps11')
+  gradle_args.append('r8WithRelocatedDeps17')
 
   # Add Gradle tasks
   gradle_args.append('cleanTest')