Reland "Add new profile inspection to compile results"

This reverts commit 172cfac106fb96a0f9d9a41af6a3bce824f921d0.

Change-Id: Ie455d1cb86bad24571c68d2c07d0df4be27202fe
diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index de0565f..c8c21fa 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -9,12 +9,16 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.profile.art.ArtProfileConsumer;
 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.startup.StartupProfileProvider;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -32,6 +36,7 @@
 
   private StringBuilder proguardMapOutputBuilder = null;
   private boolean enableMissingLibraryApiModeling = true;
+  private List<ExternalArtProfile> residualArtProfiles = new ArrayList<>();
 
   @Override
   public boolean isD8TestBuilder() {
@@ -134,6 +139,16 @@
     return self();
   }
 
+  public D8TestBuilder addArtProfileForRewriting(ArtProfileProvider artProfileProvider) {
+    return addArtProfileForRewriting(
+        artProfileProvider,
+        ArtProfileTestingUtils.createResidualArtProfileConsumer(residualArtProfiles::add));
+  }
+
+  public D8TestBuilder addArtProfileForRewriting(ExternalArtProfile artProfile) {
+    return addArtProfileForRewriting(ArtProfileTestingUtils.createArtProfileProvider(artProfile));
+  }
+
   public D8TestBuilder addArtProfileForRewriting(
       ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileConsumer) {
     builder.addArtProfileForRewriting(artProfileProvider, residualArtProfileConsumer);
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index a844c1f..34f8a0b 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -17,6 +17,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.profile.art.ArtProfileConsumer;
 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.shaking.CheckEnumUnboxedRule;
 import com.android.tools.r8.shaking.CollectingGraphConsumer;
 import com.android.tools.r8.shaking.KeepUnusedReturnValueRule;
@@ -68,6 +70,7 @@
   private boolean allowUnusedProguardConfigurationRules = false;
   private boolean enableMissingLibraryApiModeling = true;
   private CollectingGraphConsumer graphConsumer = null;
+  private List<ExternalArtProfile> residualArtProfiles = new ArrayList<>();
   private List<String> keepRules = new ArrayList<>();
   private List<Path> mainDexRulesFiles = new ArrayList<>();
   private List<String> applyMappingMaps = new ArrayList<>();
@@ -158,7 +161,8 @@
             createDefaultProguardMapConsumer ? proguardMapBuilder.toString() : null,
             graphConsumer,
             getMinApiLevel(),
-            features);
+            features,
+            residualArtProfiles);
     switch (allowedDiagnosticMessages) {
       case ALL:
         compileResult.getDiagnosticMessages().assertAllDiagnosticsMatch(new IsAnything<>());
@@ -782,6 +786,16 @@
     return self();
   }
 
+  public T addArtProfileForRewriting(ArtProfileProvider artProfileProvider) {
+    return addArtProfileForRewriting(
+        artProfileProvider,
+        ArtProfileTestingUtils.createResidualArtProfileConsumer(residualArtProfiles::add));
+  }
+
+  public T addArtProfileForRewriting(ExternalArtProfile artProfile) {
+    return addArtProfileForRewriting(ArtProfileTestingUtils.createArtProfileProvider(artProfile));
+  }
+
   public T addArtProfileForRewriting(
       ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileConsumer) {
     builder.addArtProfileForRewriting(artProfileProvider, residualArtProfileConsumer);
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
index 688ab43..b3b6e31 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -9,11 +9,14 @@
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.dexsplitter.SplitterTestBase.SplitRunner;
+import com.android.tools.r8.profile.art.model.ExternalArtProfile;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.shaking.CollectingGraphConsumer;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.shaking.ProguardConfigurationRule;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.ThrowingBiConsumer;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -22,6 +25,7 @@
 import java.nio.file.Path;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 
 public class R8TestCompileResult extends TestCompileResult<R8TestCompileResult, R8TestRunResult> {
@@ -31,6 +35,7 @@
   private final String proguardMap;
   private final CollectingGraphConsumer graphConsumer;
   private final List<Path> features;
+  private final List<ExternalArtProfile> residualArtProfiles;
 
   R8TestCompileResult(
       TestState state,
@@ -42,13 +47,15 @@
       String proguardMap,
       CollectingGraphConsumer graphConsumer,
       int minApiLevel,
-      List<Path> features) {
+      List<Path> features,
+      List<ExternalArtProfile> residualArtProfiles) {
     super(state, app, minApiLevel, outputMode, libraryDesugaringTestConfiguration);
     this.proguardConfiguration = proguardConfiguration;
     this.syntheticProguardRules = syntheticProguardRules;
     this.proguardMap = proguardMap;
     this.graphConsumer = graphConsumer;
     this.features = features;
+    this.residualArtProfiles = residualArtProfiles;
   }
 
   @Override
@@ -124,6 +131,19 @@
     return self();
   }
 
+  public <E extends Throwable> R8TestCompileResult inspectResidualArtProfile(
+      ThrowingConsumer<ArtProfileInspector, E> consumer) throws E, IOException, ExecutionException {
+    return inspectResidualArtProfile(
+        (rewrittenArtProfile, inspector) -> consumer.accept(rewrittenArtProfile));
+  }
+
+  public <E extends Throwable> R8TestCompileResult inspectResidualArtProfile(
+      ThrowingBiConsumer<ArtProfileInspector, CodeInspector, E> consumer) throws E, IOException {
+    assertEquals(1, residualArtProfiles.size());
+    consumer.accept(new ArtProfileInspector(residualArtProfiles.iterator().next()), inspector());
+    return self();
+  }
+
   public GraphInspector graphInspector() throws IOException {
     assert graphConsumer != null;
     return new GraphInspector(graphConsumer, inspector());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index 4144aaa..ed81c32 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -27,6 +27,8 @@
 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;
@@ -58,6 +60,7 @@
 
   private CustomLibrarySpecification customLibrarySpecification = null;
   private TestingKeepRuleConsumer keepRuleConsumer = null;
+  private List<ExternalArtProfile> l8ResidualArtProfiles = new ArrayList<>();
 
   public DesugaredLibraryTestBuilder(
       T test,
@@ -378,7 +381,8 @@
         libraryDesugaringSpecification,
         compilationSpecification,
         customLibCompile,
-        l8Compile);
+        l8Compile,
+        l8ResidualArtProfiles);
   }
 
   private D8TestCompileResult compileCustomLib() throws CompilationFailedException {
@@ -501,7 +505,18 @@
     return this;
   }
 
-  public DesugaredLibraryTestBuilder<?> addL8ArtProfileForRewriting(
+  public DesugaredLibraryTestBuilder<T> addL8ArtProfileForRewriting(
+      ArtProfileProvider artProfileProvider) {
+    return addL8ArtProfileForRewriting(
+        artProfileProvider,
+        ArtProfileTestingUtils.createResidualArtProfileConsumer(l8ResidualArtProfiles::add));
+  }
+
+  public DesugaredLibraryTestBuilder<T> addL8ArtProfileForRewriting(ExternalArtProfile artProfile) {
+    return addL8ArtProfileForRewriting(ArtProfileTestingUtils.createArtProfileProvider(artProfile));
+  }
+
+  public DesugaredLibraryTestBuilder<T> addL8ArtProfileForRewriting(
       ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileConsumer) {
     l8ArtProfilesForRewriting.add(
         new ArtProfileForRewriting(artProfileProvider, residualArtProfileConsumer));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
index 3172876..d49f2ef 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary.test;
 
+import static org.junit.Assert.assertEquals;
+
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.L8TestCompileResult;
@@ -13,6 +15,9 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.profile.art.model.ExternalArtProfile;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
+import com.android.tools.r8.utils.ThrowingBiConsumer;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
@@ -30,6 +35,7 @@
   private final CompilationSpecification compilationSpecification;
   private final D8TestCompileResult customLibCompile;
   private final L8TestCompileResult l8Compile;
+  private final List<ExternalArtProfile> l8ResidualArtProfiles;
   // In case of Cf2Cf desugaring the run on dex, the compileResult is the Cf desugaring result
   // while the runnableCompiledResult is the dexed compiledResult used to run on dex.
   private final TestCompileResult<?, ? extends SingleTestRunResult<?>> runnableCompiledResult;
@@ -41,7 +47,8 @@
       LibraryDesugaringSpecification libraryDesugaringSpecification,
       CompilationSpecification compilationSpecification,
       D8TestCompileResult customLibCompile,
-      L8TestCompileResult l8Compile)
+      L8TestCompileResult l8Compile,
+      List<ExternalArtProfile> l8ResidualArtProfiles)
       throws CompilationFailedException, IOException {
     this.test = test;
     this.compileResult = compileResult;
@@ -50,6 +57,7 @@
     this.compilationSpecification = compilationSpecification;
     this.customLibCompile = customLibCompile;
     this.l8Compile = l8Compile;
+    this.l8ResidualArtProfiles = l8ResidualArtProfiles;
     this.runnableCompiledResult = computeRunnableCompiledResult();
   }
 
@@ -66,6 +74,20 @@
     return this;
   }
 
+  public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectL8ResidualArtProfile(
+      ThrowingConsumer<ArtProfileInspector, E> consumer) throws E, IOException, ExecutionException {
+    return inspectL8ResidualArtProfile(
+        (rewrittenArtProfile, inspector) -> consumer.accept(rewrittenArtProfile));
+  }
+
+  public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectL8ResidualArtProfile(
+      ThrowingBiConsumer<ArtProfileInspector, CodeInspector, E> consumer) throws E, IOException {
+    assertEquals(1, l8ResidualArtProfiles.size());
+    consumer.accept(
+        new ArtProfileInspector(l8ResidualArtProfiles.iterator().next()), l8Inspector());
+    return this;
+  }
+
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspect(
       ThrowingConsumer<CodeInspector, E> consumer) throws IOException, E {
     compileResult.inspect(consumer);
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
index 922cae7..e192b41 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
@@ -6,7 +6,6 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
@@ -15,12 +14,11 @@
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.model.ExternalArtProfileClassRule;
 import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
-import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -56,21 +54,17 @@
 
   @Test
   public void test() throws Exception {
-    Box<ExternalArtProfile> residualArtProfile = new Box<>();
     testForR8(Backend.DEX)
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
         .addHorizontallyMergedClassesInspector(
             inspector ->
                 inspector.assertMergedInto(Foo.class, Bar.class).assertNoOtherClassesMerged())
-        .apply(
-            testBuilder ->
-                ArtProfileTestingUtils.addArtProfileForRewriting(
-                    getArtProfile(), residualArtProfile::set, testBuilder))
+        .addArtProfileForRewriting(getArtProfile())
         .enableInliningAnnotations()
         .setMinApi(AndroidApiLevel.LATEST)
         .compile()
-        .inspect(inspector -> inspect(inspector, residualArtProfile.get()));
+        .inspectResidualArtProfile(this::inspect);
   }
 
   public ExternalArtProfile getArtProfile() {
@@ -111,8 +105,8 @@
         .build();
   }
 
-  private void inspect(CodeInspector inspector, ExternalArtProfile residualArtProfile) {
-    assertEquals(getExpectedResidualArtProfile(inspector), residualArtProfile);
+  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
+    profileInspector.assertEqualTo(getExpectedResidualArtProfile(inspector));
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
index c5fb462..c68b02f 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
@@ -6,7 +6,6 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
@@ -15,12 +14,11 @@
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.model.ExternalArtProfileClassRule;
 import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
-import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -53,18 +51,14 @@
 
   @Test
   public void test() throws Exception {
-    Box<ExternalArtProfile> residualArtProfile = new Box<>();
     testForR8(Backend.DEX)
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
-        .apply(
-            testBuilder ->
-                ArtProfileTestingUtils.addArtProfileForRewriting(
-                    getArtProfile(), residualArtProfile::set, testBuilder))
+        .addArtProfileForRewriting(getArtProfile())
         .enableInliningAnnotations()
         .setMinApi(AndroidApiLevel.LATEST)
         .compile()
-        .inspect(inspector -> inspect(inspector, residualArtProfile.get()));
+        .inspectResidualArtProfile(this::inspect);
   }
 
   private ExternalArtProfile getArtProfile() {
@@ -109,8 +103,8 @@
         .build();
   }
 
-  private void inspect(CodeInspector inspector, ExternalArtProfile residualArtProfile) {
-    assertEquals(getExpectedResidualArtProfile(inspector), residualArtProfile);
+  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
+    profileInspector.assertEqualTo(getExpectedResidualArtProfile(inspector));
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
index 52e0beb..1a4bfda 100644
--- a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
@@ -18,10 +18,9 @@
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
-import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
@@ -59,16 +58,12 @@
   @Test
   public void test() throws Throwable {
     Assume.assumeTrue(libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters));
-    Box<ExternalArtProfile> residualArtProfile = new Box<>();
     testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
-        .apply(
-            testBuilder ->
-                ArtProfileTestingUtils.addArtProfileForRewriting(
-                    getArtProfile(), residualArtProfile::set, testBuilder))
+        .addL8ArtProfileForRewriting(getArtProfile())
         .compile()
-        .inspectL8(inspector -> inspect(inspector, residualArtProfile.get()))
+        .inspectL8ResidualArtProfile(this::inspect)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("0");
   }
@@ -100,7 +95,7 @@
         .build();
   }
 
-  private void inspect(CodeInspector inspector, ExternalArtProfile residualArtProfile) {
+  private void inspect(ArtProfileInspector profileInspector, CodeInspector inspector) {
     ClassSubject consumerClassSubject =
         inspector.clazz(
             libraryDesugaringSpecification.functionPrefix(parameters) + ".util.function.Consumer");
@@ -117,7 +112,7 @@
                 && libraryDesugaringSpecification == LibraryDesugaringSpecification.JDK8));
     assertEquals(consumerClassSubject.asTypeSubject(), forEachMethodSubject.getParameter(0));
 
-    assertEquals(getExpectedResidualArtProfile(forEachMethodSubject), residualArtProfile);
+    profileInspector.assertEqualTo(getExpectedResidualArtProfile(forEachMethodSubject));
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/NoSuchClassAndMethodProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/NoSuchClassAndMethodProfileRewritingTest.java
index ea4933c..7b598a1 100644
--- a/src/test/java/com/android/tools/r8/profile/art/NoSuchClassAndMethodProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/NoSuchClassAndMethodProfileRewritingTest.java
@@ -4,14 +4,13 @@
 
 package com.android.tools.r8.profile.art;
 
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
-import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
 import org.junit.Test;
@@ -36,12 +35,11 @@
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
-        .apply(
-            ArtProfileTestingUtils.addArtProfileForRewriting(
-                getArtProfile(), this::inspectResidualArtProfile))
+        .addArtProfileForRewriting(getArtProfile())
         .setMinApi(parameters.getApiLevel())
         // TODO(b/266178791): Emit a warning for each discarded item.
         .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages)
+        .inspectResidualArtProfile(this::inspectResidualArtProfile)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello, world!");
   }
@@ -54,10 +52,10 @@
         .build();
   }
 
-  private void inspectResidualArtProfile(ExternalArtProfile residualArtProfile) {
+  private void inspectResidualArtProfile(ArtProfileInspector profileInspector) {
     // None of the items in the profile exist in the input.
     // TODO(b/266178791): Discard items from profile that is not in the input app.
-    assertEquals(getArtProfile(), residualArtProfile);
+    profileInspector.assertNotEmpty();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/NonEmptyToEmptyProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/NonEmptyToEmptyProfileRewritingTest.java
index 4fb34a0..60e14df 100644
--- a/src/test/java/com/android/tools/r8/profile/art/NonEmptyToEmptyProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/NonEmptyToEmptyProfileRewritingTest.java
@@ -7,13 +7,12 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
-import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -39,12 +38,11 @@
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
-        .apply(
-            ArtProfileTestingUtils.addArtProfileForRewriting(
-                getArtProfile(), this::inspectResidualArtProfile))
+        .addArtProfileForRewriting(getArtProfile())
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::inspect)
+        .inspectResidualArtProfile(this::inspectResidualArtProfile)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello, world!");
   }
@@ -62,9 +60,9 @@
     assertThat(mainClassSubject.uniqueMethodWithOriginalName("dead"), isAbsent());
   }
 
-  private void inspectResidualArtProfile(ExternalArtProfile residualArtProfile) {
+  private void inspectResidualArtProfile(ArtProfileInspector profileInspector) {
     // After shaking of Main.dead() the ART profile should become empty.
-    assertEquals(ExternalArtProfile.builder().build(), residualArtProfile);
+    profileInspector.assertEmpty();
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
index 3e9ef1c..5b23bff 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
@@ -7,14 +7,13 @@
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.onlyIf;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
-import com.android.tools.r8.profile.art.utils.ArtProfileTestingUtils;
+import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -40,14 +39,12 @@
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
-        .apply(
-            testBuilder ->
-                ArtProfileTestingUtils.addArtProfileForRewriting(
-                    getArtProfile(), this::inspectResidualArtProfile, testBuilder))
+        .addArtProfileForRewriting(getArtProfile())
         .noHorizontalClassMergingOfSynthetics()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::inspect)
+        .inspectResidualArtProfile(this::inspectResidualArtProfile)
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello, world!");
   }
@@ -71,14 +68,14 @@
         onlyIf(parameters.isDexRuntime(), isPresent()));
   }
 
-  private void inspectResidualArtProfile(ExternalArtProfile residualArtProfile) {
+  private void inspectResidualArtProfile(ArtProfileInspector profileInspector) {
     if (parameters.isCfRuntime()) {
-      assertEquals(getArtProfile(), residualArtProfile);
+      profileInspector.assertEqualTo(getArtProfile());
     } else {
       assert parameters.isDexRuntime();
       // TODO(b/265729283): Since Main.main() is in the art profile, so should the two synthetic
       //  lambdas be.
-      assertEquals(getArtProfile(), residualArtProfile);
+      profileInspector.assertEqualTo(getArtProfile());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/profile/art/diagnostic/HumanReadableArtProfileParserErrorDiagnosticFromArtProfileTest.java b/src/test/java/com/android/tools/r8/profile/art/diagnostic/HumanReadableArtProfileParserErrorDiagnosticFromArtProfileTest.java
index ba3a623..c22ad2a 100644
--- a/src/test/java/com/android/tools/r8/profile/art/diagnostic/HumanReadableArtProfileParserErrorDiagnosticFromArtProfileTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/diagnostic/HumanReadableArtProfileParserErrorDiagnosticFromArtProfileTest.java
@@ -10,20 +10,13 @@
 import static org.hamcrest.CoreMatchers.equalTo;
 
 import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.profile.art.ArtProfileBuilder;
-import com.android.tools.r8.profile.art.ArtProfileClassRuleInfo;
-import com.android.tools.r8.profile.art.ArtProfileConsumer;
-import com.android.tools.r8.profile.art.ArtProfileMethodRuleInfo;
 import com.android.tools.r8.profile.art.ArtProfileProvider;
-import com.android.tools.r8.profile.art.ArtProfileRuleConsumer;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ConsumerUtils;
 import com.android.tools.r8.utils.UTF8TextInputStream;
@@ -49,7 +42,7 @@
   public void testD8() throws Exception {
     testForD8()
         .addProgramClasses(Main.class)
-        .addArtProfileForRewriting(createArtProfileProvider(), createArtProfileConsumer())
+        .addArtProfileForRewriting(createArtProfileProvider())
         .release()
         .setMinApi(AndroidApiLevel.LATEST)
         .compileWithExpectedDiagnostics(this::inspectDiagnostics);
@@ -60,7 +53,7 @@
     testForR8(Backend.DEX)
         .addProgramClasses(Main.class)
         .addKeepMainRule(Main.class)
-        .addArtProfileForRewriting(createArtProfileProvider(), createArtProfileConsumer())
+        .addArtProfileForRewriting(createArtProfileProvider())
         .release()
         .setMinApi(AndroidApiLevel.LATEST)
         .compileWithExpectedDiagnostics(this::inspectDiagnostics);
@@ -83,34 +76,6 @@
     };
   }
 
-  private ArtProfileConsumer createArtProfileConsumer() {
-    return new ArtProfileConsumer() {
-
-      @Override
-      public ArtProfileRuleConsumer getRuleConsumer() {
-        return new ArtProfileRuleConsumer() {
-
-          @Override
-          public void acceptClassRule(
-              ClassReference classReference, ArtProfileClassRuleInfo classRuleInfo) {
-            // Ignore.
-          }
-
-          @Override
-          public void acceptMethodRule(
-              MethodReference methodReference, ArtProfileMethodRuleInfo methodRuleInfo) {
-            // Ignore.
-          }
-        };
-      }
-
-      @Override
-      public void finished(DiagnosticsHandler handler) {
-        // Ignore.
-      }
-    };
-  }
-
   private void inspectDiagnostics(TestDiagnosticMessages diagnostics) {
     diagnostics.assertErrorsMatch(
         allOf(
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
index 0c3ae80..9dd4d42 100644
--- a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
+++ b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
@@ -42,6 +42,10 @@
     }
   }
 
+  public int size() {
+    return rules.size();
+  }
+
   @Override
   public boolean equals(Object obj) {
     if (this == obj) {
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
new file mode 100644
index 0000000..af0a9a9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileInspector.java
@@ -0,0 +1,34 @@
+// Copyright (c) 2023, 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.profile.art.utils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import com.android.tools.r8.profile.art.model.ExternalArtProfile;
+
+public class ArtProfileInspector {
+
+  private final ExternalArtProfile artProfile;
+
+  public ArtProfileInspector(ExternalArtProfile artProfile) {
+    this.artProfile = artProfile;
+  }
+
+  public ArtProfileInspector assertEmpty() {
+    assertEquals(0, artProfile.size());
+    return this;
+  }
+
+  public ArtProfileInspector assertEqualTo(ExternalArtProfile otherArtProfile) {
+    assertEquals(otherArtProfile, artProfile);
+    return this;
+  }
+
+  public ArtProfileInspector assertNotEmpty() {
+    assertNotEquals(0, artProfile.size());
+    return this;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java
index 697cb87..c86ad4d 100644
--- a/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java
+++ b/src/test/java/com/android/tools/r8/profile/art/utils/ArtProfileTestingUtils.java
@@ -5,9 +5,6 @@
 package com.android.tools.r8.profile.art.utils;
 
 import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.R8TestBuilder;
-import com.android.tools.r8.ThrowableConsumer;
-import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestBuilder;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.profile.art.ArtProfileBuilder;
 import com.android.tools.r8.profile.art.ArtProfileClassRuleInfo;
@@ -24,38 +21,8 @@
 
 public class ArtProfileTestingUtils {
 
-  public static <B extends R8TestBuilder<?>> ThrowableConsumer<B> addArtProfileForRewriting(
-      ExternalArtProfile artProfile, Consumer<ExternalArtProfile> residualArtProfileInspector) {
-    return testBuilder ->
-        testBuilder.addArtProfileForRewriting(
-            createArtProfileProvider(artProfile),
-            createResidualArtProfileConsumer(residualArtProfileInspector));
-  }
-
-  /**
-   * Adds the given {@param artProfile} as an ART profile for rewriting. The residual ART profile
-   * will be forwarded to the given test inspector, {@param residualArtProfileInspector}.
-   */
-  public static void addArtProfileForRewriting(
-      ExternalArtProfile artProfile,
-      Consumer<ExternalArtProfile> residualArtProfileInspector,
-      R8TestBuilder<?> testBuilder) {
-    testBuilder.addArtProfileForRewriting(
-        createArtProfileProvider(artProfile),
-        createResidualArtProfileConsumer(residualArtProfileInspector));
-  }
-
-  public static void addArtProfileForRewriting(
-      ExternalArtProfile artProfile,
-      Consumer<ExternalArtProfile> residualArtProfileInspector,
-      DesugaredLibraryTestBuilder<?> testBuilder) {
-    testBuilder.addL8ArtProfileForRewriting(
-        createArtProfileProvider(artProfile),
-        createResidualArtProfileConsumer(residualArtProfileInspector));
-  }
-
   // Creates an ArtProfileProvider for passing the given ART profile to a D8/L8/R8 compilation.
-  private static ArtProfileProvider createArtProfileProvider(ExternalArtProfile artProfile) {
+  public static ArtProfileProvider createArtProfileProvider(ExternalArtProfile artProfile) {
     return new ArtProfileProvider() {
 
       @Override
@@ -87,7 +54,7 @@
   }
 
   // Creates an ArtProfileConsumer for accepting the residual ART profile from the compilation.
-  private static ArtProfileConsumer createResidualArtProfileConsumer(
+  public static ArtProfileConsumer createResidualArtProfileConsumer(
       Consumer<ExternalArtProfile> residualArtProfileInspector) {
     return new ArtProfileConsumer() {