Udpate Dagger tests to compile with java 8 and 11

Bug: b/225308844
Change-Id: I39dcfe0af5ac84cabfac7ac892e7025a5102e17f
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java
index 79c2abb..fd03050 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.utils.DaggerUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -25,14 +24,18 @@
   @Parameter(0)
   public TestParameters parameters;
 
-  @Parameters(name = "{0}")
+  @Parameter(1)
+  public String target;
+
+  @Parameters(name = "{0}, javac -target {1}")
   public static List<Object[]> data() {
     return buildParameters(
         getTestParameters()
             .withDexRuntimes()
             .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
             .withAllApiLevels()
-            .build());
+            .build(),
+        javacTargets);
   }
 
   @BeforeClass
@@ -48,9 +51,7 @@
   public void testJvm() throws Exception {
     assumeTrue(parameters.isCfRuntime());
     testForJvm()
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
@@ -59,9 +60,7 @@
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     testForD8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
@@ -74,9 +73,7 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(MAIN_CLASS)
         .run(parameters.getRuntime(), MAIN_CLASS)
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingProvidesTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingProvidesTest.java
index 9e0ed40..87ca11c 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingProvidesTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingProvidesTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.utils.DaggerUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -25,14 +24,18 @@
   @Parameter(0)
   public TestParameters parameters;
 
-  @Parameters(name = "{0}")
+  @Parameter(1)
+  public String target;
+
+  @Parameters(name = "{0}, javac -target {1}")
   public static List<Object[]> data() {
     return buildParameters(
         getTestParameters()
             .withDexRuntimes()
             .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
             .withAllApiLevels()
-            .build());
+            .build(),
+        javacTargets);
   }
 
   @BeforeClass
@@ -48,9 +51,7 @@
   public void testJvm() throws Exception {
     assumeTrue(parameters.isCfRuntime());
     testForJvm()
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
@@ -59,9 +60,7 @@
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     testForD8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
@@ -74,9 +73,7 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(MAIN_CLASS)
         .run(parameters.getRuntime(), MAIN_CLASS)
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
index 34e3b9e..36fcfaf 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.utils.DaggerUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
@@ -28,14 +27,18 @@
   @Parameter(0)
   public TestParameters parameters;
 
-  @Parameters(name = "{0}")
+  @Parameter(1)
+  public String target;
+
+  @Parameters(name = "{0}, javac -target {1}")
   public static List<Object[]> data() {
     return buildParameters(
         getTestParameters()
             .withDexRuntimes()
             .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
             .withAllApiLevels()
-            .build());
+            .build(),
+        javacTargets);
   }
 
   @BeforeClass
@@ -51,9 +54,7 @@
   public void testJvm() throws Exception {
     assumeTrue(parameters.isCfRuntime());
     testForJvm()
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
@@ -62,9 +63,7 @@
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     testForD8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
@@ -89,20 +88,26 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(MAIN_CLASS)
         .addHorizontallyMergedClassesInspector(
             inspector -> {
               inspector
-                  .assertIsCompleteMergeGroup(
-                      "basic.I1Impl1_Factory", "basic.I2Impl1_Factory", "basic.I3Impl1_Factory")
-                  .assertIsCompleteMergeGroup(
-                      "basic.I1Impl1_Factory$InstanceHolder",
-                      "basic.I2Impl1_Factory$InstanceHolder",
-                      "basic.I3Impl1_Factory$InstanceHolder")
+                  .applyIf(
+                      target.equals("1.8") || parameters.isDexRuntime(),
+                      i ->
+                          i.assertIsCompleteMergeGroup(
+                              "basic.I1Impl1_Factory",
+                              "basic.I2Impl1_Factory",
+                              "basic.I3Impl1_Factory"))
+                  .applyIf(
+                      target.equals("1.8") || parameters.isDexRuntime(),
+                      i ->
+                          i.assertIsCompleteMergeGroup(
+                              "basic.I1Impl1_Factory$InstanceHolder",
+                              "basic.I2Impl1_Factory$InstanceHolder",
+                              "basic.I3Impl1_Factory$InstanceHolder"))
                   .assertNoOtherClassesMerged();
             })
         .addVerticallyMergedClassesInspector(
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
index 0ad12d6..c7d75f1 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.utils.DaggerUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
@@ -28,14 +27,18 @@
   @Parameter(0)
   public TestParameters parameters;
 
-  @Parameters(name = "{0}")
+  @Parameter(1)
+  public String target;
+
+  @Parameters(name = "{0}, javac -target {1}")
   public static List<Object[]> data() {
     return buildParameters(
         getTestParameters()
             .withDexRuntimes()
             .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
             .withAllApiLevels()
-            .build());
+            .build(),
+        javacTargets);
   }
 
   @BeforeClass
@@ -67,9 +70,7 @@
   public void testJvm() throws Exception {
     assumeTrue(parameters.isCfRuntime());
     testForJvm()
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
   }
@@ -78,9 +79,7 @@
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     testForD8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
@@ -89,24 +88,33 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramNotDependingOnDagger)
-        .addProgramFiles(DaggerBasicTestBase.compiledProgramDependingOnDagger)
-        .addProgramFiles(DaggerUtils.getDaggerRuntime())
+        .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(MAIN_CLASS)
+        .allowStdoutMessages()
         .addHorizontallyMergedClassesInspector(
             inspector -> {
               inspector
-                  .assertIsCompleteMergeGroup(
-                      "basic.ModuleUsingProvides_I1Factory",
-                      "basic.ModuleUsingProvides_I2Factory",
-                      "basic.ModuleUsingProvides_I3Factory")
-                  .assertIsCompleteMergeGroup(
-                      "basic.ModuleUsingProvides_I1Factory$InstanceHolder",
-                      "basic.ModuleUsingProvides_I2Factory$InstanceHolder",
-                      "basic.ModuleUsingProvides_I3Factory$InstanceHolder")
-                  .assertIsCompleteMergeGroup(
-                      "basic.ModuleUsingProvides", "basic.DaggerMainComponentUsingProvides$1")
+                  .applyIf(
+                      target.equals("1.8") || parameters.isDexRuntime(),
+                      i ->
+                          i.assertIsCompleteMergeGroup(
+                              "basic.ModuleUsingProvides_I1Factory",
+                              "basic.ModuleUsingProvides_I2Factory",
+                              "basic.ModuleUsingProvides_I3Factory"))
+                  .applyIf(
+                      target.equals("1.8") || parameters.isDexRuntime(),
+                      i ->
+                          i.assertIsCompleteMergeGroup(
+                              "basic.ModuleUsingProvides_I1Factory$InstanceHolder",
+                              "basic.ModuleUsingProvides_I2Factory$InstanceHolder",
+                              "basic.ModuleUsingProvides_I3Factory$InstanceHolder"))
+                  .applyIf(
+                      target.equals("1.8"),
+                      i ->
+                          i.assertIsCompleteMergeGroup(
+                              "basic.ModuleUsingProvides",
+                              "basic.DaggerMainComponentUsingProvides$1"))
                   .assertNoOtherClassesMerged();
             })
         .addVerticallyMergedClassesInspector(
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicTestBase.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicTestBase.java
index 3f56ab1..81d71f5 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicTestBase.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicTestBase.java
@@ -14,12 +14,15 @@
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.ZipUtils;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.function.BiFunction;
 import java.util.function.Predicate;
@@ -28,61 +31,88 @@
 
 public class DaggerBasicTestBase extends TestBase {
 
-  public static Path compiledProgramNotDependingOnDagger;
-  public static Path compiledProgramDependingOnDagger;
-  public static Path daggerGeneratedSourceFiles;
+  public static class CompiledCode {
+    public final Path compiledProgramNotDependingOnDagger;
+    public final Path compiledProgramDependingOnDagger;
+    public final Path daggerGeneratedSourceFiles;
+
+    public CompiledCode(
+        Path compiledProgramNotDependingOnDagger,
+        Path compiledProgramDependingOnDagger,
+        Path daggerGeneratedSourceFiles) {
+      this.compiledProgramNotDependingOnDagger = compiledProgramNotDependingOnDagger;
+      this.compiledProgramDependingOnDagger = compiledProgramDependingOnDagger;
+      this.daggerGeneratedSourceFiles = daggerGeneratedSourceFiles;
+    }
+  }
+
+  public static final List<String> javacTargets = ImmutableList.of("1.8", "11");
+
+  private static Map<String, CompiledCode> compilerCode;
 
   private static void compile(
       List<Path> sourceNotDependingOnDagger,
       List<Path> sourceDependingOnDagger,
       BiFunction<String, byte[], byte[]> transformer)
       throws Exception {
-    compiledProgramNotDependingOnDagger =
-        DaggerUtils.compileWithoutAnnotationProcessing(sourceNotDependingOnDagger);
-    // Use transformer on code not depending on Dagger.
-    if (transformer != null) {
-      compiledProgramNotDependingOnDagger =
-          ZipUtils.map(
+    ImmutableMap.Builder<String, CompiledCode> builder = ImmutableMap.builder();
+    for (String target : javacTargets) {
+      Path compiledProgramNotDependingOnDagger =
+          DaggerUtils.compileWithoutAnnotationProcessing(target, sourceNotDependingOnDagger);
+      // Use transformer on code not depending on Dagger.
+      if (transformer != null) {
+        compiledProgramNotDependingOnDagger =
+            ZipUtils.map(
+                compiledProgramNotDependingOnDagger,
+                getStaticTemp().newFolder().toPath().resolve("transformed.jar"),
+                (entry, bytes) ->
+                    FileUtils.isClassFile(entry.getName())
+                        ? transformer.apply(
+                            entry
+                                .getName()
+                                .substring(
+                                    0,
+                                    entry.getName().length() - FileUtils.CLASS_EXTENSION.length()),
+                            bytes)
+                        : bytes);
+      }
+      // Compile with Dagger annotation processor. The part of the program not relying on dagger
+      // generated types are passed as class files (potentially after transformation) and on command
+      // line for being included in annotation processing.
+      Path compiledProgramDependingOnDagger =
+          DaggerUtils.compileWithAnnotationProcessing(
+              target,
+              sourceDependingOnDagger,
+              ImmutableList.of(compiledProgramNotDependingOnDagger));
+      Path daggerGeneratedSourceFiles =
+          ZipUtils.filter(
+              compiledProgramDependingOnDagger,
+              getStaticTemp().newFolder().toPath().resolve("source.jar"),
+              entry -> entry.getName().endsWith(".java"));
+      // Check the generated Dagger source files.
+      Set<String> generatedFiles = new HashSet<>();
+      ZipUtils.iter(
+          daggerGeneratedSourceFiles, (entry, unused) -> generatedFiles.add(entry.getName()));
+      assertEquals(
+          ImmutableSet.of(
+              "basic/I1Impl1_Factory.java",
+              "basic/I2Impl1_Factory.java",
+              "basic/I3Impl1_Factory.java",
+              "basic/ModuleUsingProvides_I1Factory.java",
+              "basic/ModuleUsingProvides_I2Factory.java",
+              "basic/ModuleUsingProvides_I3Factory.java",
+              "basic/ModuleUsingProvides_Proxy.java",
+              "basic/DaggerMainComponentUsingBinds.java",
+              "basic/DaggerMainComponentUsingProvides.java"),
+          generatedFiles);
+      builder.put(
+          target,
+          new CompiledCode(
               compiledProgramNotDependingOnDagger,
-              getStaticTemp().newFolder().toPath().resolve("transformed.jar"),
-              (entry, bytes) ->
-                  FileUtils.isClassFile(entry.getName())
-                      ? transformer.apply(
-                          entry
-                              .getName()
-                              .substring(
-                                  0, entry.getName().length() - FileUtils.CLASS_EXTENSION.length()),
-                          bytes)
-                      : bytes);
+              compiledProgramDependingOnDagger,
+              daggerGeneratedSourceFiles));
     }
-    // Compile with Dagger annotation processor. The part of the program not relying on dagger
-    // generated types are passed as class files (potentially after transformation) and on command
-    // line for being included in annotation processing.
-    compiledProgramDependingOnDagger =
-        DaggerUtils.compileWithAnnotationProcessing(
-            sourceDependingOnDagger, ImmutableList.of(compiledProgramNotDependingOnDagger));
-    daggerGeneratedSourceFiles =
-        ZipUtils.filter(
-            compiledProgramDependingOnDagger,
-            getStaticTemp().newFolder().toPath().resolve("source.jar"),
-            entry -> entry.getName().endsWith(".java"));
-    // Check the generated Dagger source files.
-    Set<String> generatedFiles = new HashSet<>();
-    ZipUtils.iter(
-        DaggerBasicTestBase.daggerGeneratedSourceFiles,
-        (entry, unused) -> generatedFiles.add(entry.getName()));
-    assertEquals(
-        ImmutableSet.of(
-            "basic/I1Impl1_Factory.java",
-            "basic/I2Impl1_Factory.java",
-            "basic/I3Impl1_Factory.java",
-            "basic/ModuleUsingProvides_I1Factory.java",
-            "basic/ModuleUsingProvides_I2Factory.java",
-            "basic/ModuleUsingProvides_I3Factory.java",
-            "basic/ModuleUsingProvides_Proxy.java",
-            "basic/DaggerMainComponentUsingBinds.java",
-            "basic/DaggerMainComponentUsingProvides.java"),
-        generatedFiles);
+    compilerCode = builder.build();
   }
 
   private static boolean sourceFileReferingDaggerGeneratedClasses(Path file) {
@@ -131,11 +161,18 @@
     return bytes;
   }
 
-  public static List<Path> javaSourceFiles(String testDir, Predicate<Path> filter)
-      throws Exception {
+  static List<Path> javaSourceFiles(String testDir, Predicate<Path> filter) throws Exception {
     try (Stream<Path> walk =
         Files.walk(Paths.get(ToolHelper.TESTS_DIR, "examplesDagger", testDir))) {
       return walk.filter(filter).filter(FileUtils::isJavaFile).collect(Collectors.toList());
     }
   }
+
+  Collection<Path> getProgramFiles(String target) {
+    ImmutableList.Builder<Path> builder = ImmutableList.builder();
+    builder.add(compilerCode.get(target).compiledProgramDependingOnDagger);
+    builder.add(compilerCode.get(target).compiledProgramNotDependingOnDagger);
+    builder.addAll(DaggerUtils.getDaggerRuntime());
+    return builder.build();
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/DaggerUtils.java b/src/test/java/com/android/tools/r8/utils/DaggerUtils.java
index e0a4871..f69ec51 100644
--- a/src/test/java/com/android/tools/r8/utils/DaggerUtils.java
+++ b/src/test/java/com/android/tools/r8/utils/DaggerUtils.java
@@ -59,7 +59,7 @@
   }
 
   public static Path compileWithAnnotationProcessing(
-      Collection<Path> sourceFiles, Collection<Path> classFiles) throws Exception {
+      String target, Collection<Path> sourceFiles, Collection<Path> classFiles) throws Exception {
     // Class files are provided in JAR files. Extract all the class names to pass to javac for
     // annotation processing.
     List<String> classNames = new ArrayList<>();
@@ -75,8 +75,8 @@
           });
     }
     return TestBase.javac(getJdk(), TestBase.getStaticTemp())
-        .setSource("1.8")
-        .setTarget("1.8")
+        .setSource(target)
+        .setTarget(target)
         .addSourceFiles(sourceFiles)
         .addClassNames(classNames)
         .addClasspathFiles(classFiles)
@@ -86,7 +86,8 @@
         .compile();
   }
 
-  public static Path compileWithAnnotationProcessing(Collection<Path> files) throws Exception {
+  public static Path compileWithAnnotationProcessing(String target, Collection<Path> files)
+      throws Exception {
     // Split the files passed into source files and class files. Class files are expected to be in
     // JARs.
     List<Path> sourceFiles =
@@ -94,24 +95,25 @@
     List<Path> classFiles =
         files.stream().filter(FileUtils::isJarFile).collect(Collectors.toList());
     assertEquals(files.size(), sourceFiles.size() + classFiles.size());
-    return compileWithAnnotationProcessing(sourceFiles, classFiles);
+    return compileWithAnnotationProcessing(target, sourceFiles, classFiles);
   }
 
-  public static Path compileWithoutAnnotationProcessing(Collection<Path> files) throws Exception {
+  public static Path compileWithoutAnnotationProcessing(String target, Collection<Path> files)
+      throws Exception {
     return TestBase.javac(getJdk(), TestBase.getStaticTemp())
-        .setSource("1.8")
-        .setTarget("1.8")
         .addSourceFiles(files)
         .addClasspathFiles(getDaggerRuntime())
         .compile();
   }
 
-  public static Path compileWithoutAnnotationProcessing(Path... files) throws Exception {
-    return compileWithoutAnnotationProcessing(Arrays.asList(files));
+  public static Path compileWithoutAnnotationProcessing(String target, Path... files)
+      throws Exception {
+    return compileWithoutAnnotationProcessing(target, Arrays.asList(files));
   }
 
-  public static Path compileWithAnnotationProcessing(Path... files) throws Exception {
-    return compileWithAnnotationProcessing(Arrays.asList(files));
+  public static Path compileWithAnnotationProcessing(String target, Path... files)
+      throws Exception {
+    return compileWithAnnotationProcessing(target, Arrays.asList(files));
   }
 
   private static CfRuntime getJdk() {