Do not compute global synthetics for all tests

Fixes: b/306104021
Change-Id: I88713bfde91898217235e4928b3d21f547672ba3
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
index fc2188f..41f4db1 100644
--- a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
@@ -127,6 +127,8 @@
               createGlobalSynthetics(appView, timing, executorService);
               timing.end();
 
+              assert GlobalSyntheticsGeneratorVerifier.verifyExpectedClassesArePresent(appView);
+
               ApplicationWriter.create(appView, options.getMarker()).write(executorService, app);
             } catch (ExecutionException e) {
               throw unwrapExecutionException(e);
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGeneratorVerifier.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGeneratorVerifier.java
new file mode 100644
index 0000000..c0197ae
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGeneratorVerifier.java
@@ -0,0 +1,30 @@
+// 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;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import java.util.function.Consumer;
+
+public class GlobalSyntheticsGeneratorVerifier {
+
+  public static void forEachExpectedClass(
+      DexItemFactory dexItemFactory, int minApi, Consumer<DexType> consumer) {
+    consumer.accept(dexItemFactory.methodHandlesType);
+    consumer.accept(dexItemFactory.methodHandlesLookupType);
+    consumer.accept(dexItemFactory.recordType);
+    consumer.accept(dexItemFactory.varHandleType);
+  }
+
+  public static boolean verifyExpectedClassesArePresent(AppView<?> appView) {
+    forEachExpectedClass(
+        appView.dexItemFactory(),
+        appView.options().getMinApiLevel().getLevel(),
+        type -> {
+          assert appView.hasDefinitionFor(type);
+        });
+    return true;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index 3e17faf..7db5069 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -27,6 +27,7 @@
 import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector;
 import com.android.tools.r8.utils.codeinspector.VerticallyMergedClassesInspector;
 import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
@@ -93,7 +94,9 @@
 
   private Optional<Integer> isAndroidBuildVersionAdded = null;
 
-  private static final Map<Integer, Set<String>> allowedGlobalSynthetics =
+  private static final Map<Integer, Set<String>> allGlobalSynthetics = new ConcurrentHashMap<>();
+
+  private static final Map<Integer, Set<String>> definiteGlobalSynthetics =
       new ConcurrentHashMap<>();
 
   LibraryDesugaringTestConfiguration libraryDesugaringTestConfiguration =
@@ -270,17 +273,22 @@
         && (isD8TestBuilder() || isR8TestBuilder())
         && !isBenchmarkRunner) {
       int minApiLevel = builder.getMinApiLevel();
-      allowedGlobalSynthetics.computeIfAbsent(
-          minApiLevel, TestCompilerBuilder::computeAllGlobalSynthetics);
       Consumer<InternalOptions> previousConsumer = optionsConsumer;
       optionsConsumer =
           options -> {
             options.testing.globalSyntheticCreatedCallback =
                 programClass -> {
-                  assertTrue(
-                      allowedGlobalSynthetics
-                          .get(minApiLevel)
-                          .contains(programClass.getType().toDescriptorString()));
+                  String descriptor = programClass.getType().toDescriptorString();
+                  boolean isGlobalSynthetic =
+                      definiteGlobalSynthetics
+                              .computeIfAbsent(
+                                  minApiLevel, computeDefiniteGlobalSynthetics(options))
+                              .contains(descriptor)
+                          || allGlobalSynthetics
+                              .computeIfAbsent(
+                                  minApiLevel, TestCompilerBuilder::computeAllGlobalSynthetics)
+                              .contains(descriptor);
+                  assertTrue(isGlobalSynthetic);
                 };
             if (previousConsumer != null) {
               previousConsumer.accept(options);
@@ -604,6 +612,16 @@
     }
   }
 
+  private static Function<Integer, Set<String>> computeDefiniteGlobalSynthetics(
+      InternalOptions options) {
+    return minApiLevel -> {
+      ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+      GlobalSyntheticsGeneratorVerifier.forEachExpectedClass(
+          options.dexItemFactory(), minApiLevel, type -> builder.add(type.toDescriptorString()));
+      return builder.build();
+    };
+  }
+
   private static class ChainedStringConsumer implements StringConsumer {
 
     private final List<StringConsumer> consumers;