Support for setting partial compilation seed on test builder

Change-Id: I5d77c88f1cf191843a88016426a7c1ac9c8bc331
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 22b2096..e24bc9b 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.partial;
 
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.partial.predicate.AllClassesMatcher;
 import com.android.tools.r8.partial.predicate.ClassNameMatcher;
 import com.android.tools.r8.partial.predicate.ClassPrefixMatcher;
@@ -55,7 +56,22 @@
     return excludePredicates;
   }
 
-  public boolean test(DexProgramClass clazz) {
+  public void partition(
+      DirectMappedDexApplication app,
+      Consumer<DexProgramClass> d8ClassConsumer,
+      Consumer<DexProgramClass> r8ClassConsumer) {
+    Collection<DexProgramClass> classes =
+        randomizeForTesting != null ? app.classesWithDeterministicOrder() : app.classes();
+    for (DexProgramClass clazz : classes) {
+      if (test(clazz)) {
+        r8ClassConsumer.accept(clazz);
+      } else {
+        d8ClassConsumer.accept(clazz);
+      }
+    }
+  }
+
+  private boolean test(DexProgramClass clazz) {
     if (randomizeForTesting != null) {
       return randomizeForTesting.nextBoolean();
     }
@@ -119,8 +135,11 @@
     }
 
     public Builder randomizeForTesting() {
+      return randomizeForTesting(System.currentTimeMillis());
+    }
+
+    public Builder randomizeForTesting(long seed) {
       randomizeForTesting = new Random();
-      long seed = System.currentTimeMillis();
       randomizeForTesting.setSeed(seed);
       System.out.println("Partial compilation seed: " + seed);
       return this;
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java b/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java
index 9f6f2dd..7b8af2b 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java
@@ -19,16 +19,11 @@
   private R8PartialProgramPartioning() {}
 
   public static R8PartialProgramPartioning create(DirectMappedDexApplication app) {
-    R8PartialProgramPartioning partioning = new R8PartialProgramPartioning();
     R8PartialCompilationConfiguration partialCompilationConfiguration =
         app.options.partialCompilationConfiguration;
-    for (DexProgramClass clazz : app.classes()) {
-      if (partialCompilationConfiguration.test(clazz)) {
-        partioning.r8Classes.add(clazz);
-      } else {
-        partioning.d8Classes.add(clazz);
-      }
-    }
+    R8PartialProgramPartioning partioning = new R8PartialProgramPartioning();
+    partialCompilationConfiguration.partition(
+        app, partioning.d8Classes::add, partioning.r8Classes::add);
     // Collect all transitive superclasses of all D8 classes and treat these as D8 classes.
     WorkList<DexClass> worklist = WorkList.newIdentityWorkList(partioning.d8Classes);
     worklist.process(
diff --git a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
index 7687324..c16f328 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
@@ -222,4 +222,13 @@
             o -> o.getTestingOptions().enableEmbeddedKeepAnnotations = true)
         .addKeepAnnoLibToClasspath(keepAnnotationLibrary);
   }
+
+  @Override
+  public R8PartialTestBuilder setPartialCompilationSeed(TestParameters parameters, long seed) {
+    if (parameters.getPartialCompilationTestParameters().isRandom()) {
+      r8PartialConfiguration =
+          R8PartialCompilationConfiguration.builder().randomizeForTesting(seed).build();
+    }
+    return this;
+  }
 }
diff --git a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
index bdcbe32..49cccce 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
@@ -1111,4 +1111,9 @@
     androidPlatformBuild = true;
     return self();
   }
+
+  public T setPartialCompilationSeed(TestParameters parameters, long seed) {
+    // Intentionally empty. Implemented In R8PartialTestBuilder.
+    return self();
+  }
 }