Prepare DesugaredLibraryTestBuilder for R8 partial

Change-Id: I653994b9866a4982e6838a3fde450de880f0ce15
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java b/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
index 5bad2e8..c1ec90c 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
@@ -101,6 +101,11 @@
       return this;
     }
 
+    public Builder excludeAll() {
+      excludePredicates.add(new AllClassesMatcher());
+      return this;
+    }
+
     public Builder addJavaTypeIncludePattern(String pattern) {
       includePredicates.add(
           createPredicate("L" + DescriptorUtils.getBinaryNameFromJavaType(pattern)));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index df487eb..cd14e2f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -86,11 +86,9 @@
         .addKeepMainRule(TestClass.class)
         .enableNoVerticalClassMergingAnnotations()
         .enableInliningAnnotations()
-        .addOptionsModification(
-            options -> {
-              // The check for $default$query relies on inlining.
-              options.inlinerOptions().simpleInliningInstructionLimit = 5;
-            })
+        // The check for $default$query relies on inlining.
+        .addR8OptionsModification(
+            options -> options.inlinerOptions().simpleInliningInstructionLimit = 5)
         .compile()
         .inspect(i -> checkRewrittenInvokes(i, compilationSpecification.isProgramShrink()))
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index 570ac97..77c4421 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary.test;
 
+import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
+
 import com.android.tools.r8.ClassFileResourceProvider;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
@@ -25,13 +27,13 @@
 import com.android.tools.r8.TestShrinkerBuilder;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
+import com.android.tools.r8.partial.R8PartialCompilationConfiguration.Builder;
 import com.android.tools.r8.profile.art.ArtProfileConsumer;
 import com.android.tools.r8.profile.art.ArtProfileForRewriting;
 import com.android.tools.r8.profile.art.ArtProfileProvider;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
 import com.android.tools.r8.tracereferences.TraceReferences;
-import com.android.tools.r8.utils.ConsumerUtils;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.StringUtils;
@@ -47,7 +49,6 @@
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
-import org.junit.Assume;
 
 public class DesugaredLibraryTestBuilder<T extends DesugaredLibraryTestBase> {
 
@@ -56,13 +57,13 @@
   private final LibraryDesugaringSpecification libraryDesugaringSpecification;
   private final CompilationSpecification compilationSpecification;
   private final TestCompilerBuilder<?, ?, ?, ? extends SingleTestRunResult<?>, ?> builder;
-  private List<ArtProfileForRewriting> l8ArtProfilesForRewriting = new ArrayList<>();
-  private List<String> l8ExtraKeepRules = new ArrayList<>();
-  private Consumer<InternalOptions> l8OptionModifier = ConsumerUtils.emptyConsumer();
+  private final List<ArtProfileForRewriting> l8ArtProfilesForRewriting = new ArrayList<>();
+  private final List<String> l8ExtraKeepRules = new ArrayList<>();
+  private Consumer<InternalOptions> l8OptionModifier = emptyConsumer();
   private boolean l8FinalPrefixVerification = true;
   private boolean overrideDefaultLibrary = false;
   private CustomLibrarySpecification customLibrarySpecification = null;
-  private List<ExternalArtProfile> l8ResidualArtProfiles = new ArrayList<>();
+  private final List<ExternalArtProfile> l8ResidualArtProfiles = new ArrayList<>();
   private boolean managedPostPrefix = false;
 
   public DesugaredLibraryTestBuilder(
@@ -92,16 +93,29 @@
       assert !compilationSpecification.isProgramShrink();
       if (compilationSpecification.isL8Shrink()) {
         // L8 with Cf backend and shrinking is not a supported pipeline.
-        Assume.assumeTrue(parameters.getBackend().isDex());
+        parameters.assumeDexRuntime();
       }
       return test.testForD8(Backend.CF);
     }
     // Cf back-end is only allowed in Cf to cf compilations.
-    Assume.assumeTrue(parameters.getBackend().isDex());
+    parameters.assumeDexRuntime();
     if (compilationSpecification.isProgramShrink()) {
-      return test.testForR8(parameters.getBackend());
+      if (compilationSpecification == CompilationSpecification.R8_PARTIAL_INCLUDE_L8SHRINK) {
+        parameters.assumeR8PartialTestParameters();
+        return test.testForR8Partial(parameters.getBackend())
+            .setR8PartialConfiguration(Builder::includeAll);
+      } else {
+        return test.testForR8(parameters.getBackend());
+      }
+    } else {
+      if (compilationSpecification == CompilationSpecification.R8_PARTIAL_EXCLUDE_L8SHRINK) {
+        parameters.assumeR8PartialTestParameters();
+        return test.testForR8Partial(parameters.getBackend())
+            .setR8PartialConfiguration(Builder::excludeAll);
+      } else {
+        return test.testForD8(parameters.getBackend());
+      }
     }
-    return test.testForD8(Backend.DEX);
   }
 
   public DesugaredLibraryTestBuilder<T> setCustomLibrarySpecification(
@@ -134,6 +148,14 @@
     return this;
   }
 
+  public DesugaredLibraryTestBuilder<T> addR8OptionsModification(
+      Consumer<InternalOptions> optionModifier) {
+    return applyIfR8PartialTestBuilder(
+        builder -> builder.addR8PartialR8OptionsModification(optionModifier),
+        builder.isR8TestBuilder(),
+        builder -> builder.addOptionsModification(optionModifier));
+  }
+
   public DesugaredLibraryTestBuilder<T> addLibraryDesugaringOptionsModification(
       Consumer<InternalOptions> optionModifier) {
     return applyIfR8PartialTestBuilder(
@@ -301,6 +323,20 @@
     return this;
   }
 
+  public <E1 extends Throwable, E2 extends Throwable>
+      DesugaredLibraryTestBuilder<T> applyIfR8PartialTestBuilder(
+          ThrowingConsumer<R8PartialTestBuilder, E1> thenConsumer,
+          boolean elseCondition,
+          ThrowingConsumer<DesugaredLibraryTestBuilder<T>, E2> elseConsumer)
+          throws E1, E2 {
+    if (builder.isR8PartialTestBuilder()) {
+      withR8PartialTestBuilder(thenConsumer);
+    } else if (elseCondition) {
+      elseConsumer.accept(this);
+    }
+    return this;
+  }
+
   public DesugaredLibraryTestBuilder<T> allowDiagnosticWarningMessages() {
     withR8TestBuilder(R8TestBuilder::allowDiagnosticWarningMessages);
     return this;
@@ -312,7 +348,9 @@
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepRules(String keepRules) {
-    withR8TestBuilder(b -> b.addKeepRules(keepRules));
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(b -> b.addKeepRules(keepRules));
+    }
     return this;
   }
 
@@ -324,37 +362,51 @@
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepClassAndMembersRules(Class<?>... clazz) {
-    withR8TestBuilder(b -> b.addKeepClassAndMembersRules(clazz));
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(b -> b.addKeepClassAndMembersRules(clazz));
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepAttributes(String... attributes) {
-    withR8TestBuilder(b -> b.addKeepAttributes(attributes));
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(b -> b.addKeepAttributes(attributes));
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepAllClassesRuleWithAllowObfuscation() {
-    withR8TestBuilder(TestShrinkerBuilder::addKeepAllClassesRuleWithAllowObfuscation);
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(TestShrinkerBuilder::addKeepAllClassesRuleWithAllowObfuscation);
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepAllClassesRule() {
-    withR8TestBuilder(TestShrinkerBuilder::addKeepAllClassesRule);
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(TestShrinkerBuilder::addKeepAllClassesRule);
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepMainRule(Class<?> clazz) {
-    withR8TestBuilder(b -> b.addKeepMainRule(clazz));
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(b -> b.addKeepMainRule(clazz));
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepMainRule(String mainClass) {
-    withR8TestBuilder(b -> b.addKeepMainRule(mainClass));
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(b -> b.addKeepMainRule(mainClass));
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> addKeepRuleFiles(Path... files) {
-    withR8TestBuilder(b -> b.addKeepRuleFiles(files));
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(b -> b.addKeepRuleFiles(files));
+    }
     return this;
   }
 
@@ -364,17 +416,29 @@
   }
 
   public DesugaredLibraryTestBuilder<T> enableNeverClassInliningAnnotations() {
-    withR8TestBuilder(R8TestBuilder::enableNeverClassInliningAnnotations);
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(R8TestBuilder::enableNeverClassInliningAnnotations);
+    } else {
+      withR8TestBuilder(R8TestBuilder::addNeverClassInliningAnnotations);
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> enableInliningAnnotations() {
-    withR8TestBuilder(R8TestBuilder::enableInliningAnnotations);
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(R8TestBuilder::enableInliningAnnotations);
+    } else {
+      withR8TestBuilder(R8TestBuilder::addInliningAnnotations);
+    }
     return this;
   }
 
   public DesugaredLibraryTestBuilder<T> enableNoVerticalClassMergingAnnotations() {
-    withR8TestBuilder(R8TestBuilder::enableNoVerticalClassMergingAnnotations);
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(R8TestBuilder::enableNoVerticalClassMergingAnnotations);
+    } else {
+      withR8TestBuilder(R8TestBuilder::addNoVerticalClassMergingAnnotations);
+    }
     return this;
   }
 
@@ -390,7 +454,11 @@
   }
 
   public DesugaredLibraryTestBuilder<T> enableConstantArgumentAnnotations() {
-    withR8TestBuilder(R8TestBuilder::enableConstantArgumentAnnotations);
+    if (compilationSpecification.isProgramShrink()) {
+      withR8TestBuilder(R8TestBuilder::enableConstantArgumentAnnotations);
+    } else {
+      withR8TestBuilder(R8TestBuilder::addConstantArgumentAnnotations);
+    }
     return this;
   }
 
@@ -406,9 +474,18 @@
   }
 
   public DesugaredLibraryTestBuilder<T> applyIf(
-      boolean apply, Consumer<DesugaredLibraryTestBuilder<T>> consumer) {
-    if (apply) {
-      return apply(consumer);
+      boolean condition, Consumer<DesugaredLibraryTestBuilder<T>> consumer) {
+    return applyIf(condition, consumer, emptyConsumer());
+  }
+
+  public DesugaredLibraryTestBuilder<T> applyIf(
+      boolean condition,
+      Consumer<DesugaredLibraryTestBuilder<T>> thenConsumer,
+      Consumer<DesugaredLibraryTestBuilder<T>> elseConsumer) {
+    if (condition) {
+      thenConsumer.accept(this);
+    } else {
+      elseConsumer.accept(this);
     }
     return this;
   }
@@ -556,10 +633,10 @@
 
   public DesugaredLibraryTestBuilder<T> supportAllCallbacksFromLibrary(
       boolean supportAllCallbacksFromLibrary) {
-    addL8OptionsModification(supportLibraryCallbackConsumer(supportAllCallbacksFromLibrary, true));
-    builder.addOptionsModification(
-        supportLibraryCallbackConsumer(supportAllCallbacksFromLibrary, false));
-    return this;
+    return addL8OptionsModification(
+            supportLibraryCallbackConsumer(supportAllCallbacksFromLibrary, true))
+        .addLibraryDesugaringOptionsModification(
+            supportLibraryCallbackConsumer(supportAllCallbacksFromLibrary, false));
   }
 
   private Consumer<InternalOptions> supportLibraryCallbackConsumer(