Update all tests so that they use a cc_toolchain_suite instead of a filegroup to declare C++ toolchains.

Tested by actually removing support for filegroups; it's a ~5-line change, but it's better to do that separately so that it can be rolled back easily if need be.

--
MOS_MIGRATED_REVID=132320198
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index 15e4e68..af92ecf 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -75,6 +75,7 @@
     public List<String> multiCpus;
   }
 
+  protected MockToolsConfig mockToolsConfig;
   protected Path workspace;
   protected AnalysisMock analysisMock;
   protected SequencedSkyframeExecutor skyframeExecutor;
@@ -123,7 +124,8 @@
         UUID.randomUUID(),
         new TimestampGranularityMonitor(BlazeClock.instance()));
 
-    analysisMock.setupMockClient(new MockToolsConfig(rootDirectory));
+    mockToolsConfig = new MockToolsConfig(rootDirectory);
+    analysisMock.setupMockClient(mockToolsConfig);
     analysisMock.setupMockWorkspaceFiles(directories.getEmbeddedBinariesRoot());
     configurationFactory = analysisMock.createConfigurationFactory();
     buildOptionClasses = ruleClassProvider.getConfigurationOptions();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index d43ce9a..192ce19 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -81,10 +81,16 @@
         "/bazel_tools_workspace/tools/cpp/BUILD",
         "cc_library(name = 'stl')",
         "cc_library(name = 'malloc')",
-        "filegroup(name = 'toolchain', ",
-        "    srcs = [':cc-compiler-local', ':cc-compiler-darwin', ':cc-compiler-piii',",
-        "            ':cc-compiler-armeabi-v7a', ':empty'],",
-        ")",
+        "cc_toolchain_suite(",
+        "    name = 'toolchain',",
+        "    toolchains = {",
+        "      'local|compiler': ':cc-compiler-local',",
+        "      'k8|compiler': ':cc-compiler-k8',",
+        "      'piii|compiler': ':cc-compiler-piii',",
+        "      'darwin|compiler': ':cc-compiler-darwin',",
+        "      'armeabi-v7a|compiler': ':cc-compiler-armeabi-v7a',",
+        "      'x64_windows|compiler': ':cc-compiler-x64_windows',",
+        "    })",
         "cc_toolchain(name = 'cc-compiler-k8', all_files = ':empty', compiler_files = ':empty',",
         "    cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
         "    linker_files = ':empty',",
@@ -132,7 +138,7 @@
   }
 
   @Override
-  protected String readCrosstoolFile() throws IOException {
+  public String readCrosstoolFile() throws IOException {
     return readFromResources(MOCK_CROSSTOOL_PATH);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
index cddecfa..ddd5b58 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/Crosstool.java
@@ -15,12 +15,11 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
+import com.google.protobuf.TextFormat;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 
 /**
  * A helper class to create a crosstool package containing a CROSSTOOL file, and the various
@@ -108,7 +107,14 @@
       }
     }
 
-    List<String> compilerRules = Lists.newArrayList();
+    CrosstoolConfig.CrosstoolRelease.Builder configBuilder =
+        CrosstoolConfig.CrosstoolRelease.newBuilder();
+    TextFormat.merge(crosstoolFileContents, configBuilder);
+    StringBuilder compilerMap = new StringBuilder();
+    for (CrosstoolConfig.CToolchain toolchain : configBuilder.build().getToolchainList()) {
+      compilerMap.append(String.format("'%s|%s': ':cc-compiler-%s',\n",
+          toolchain.getTargetCpu(), toolchain.getCompiler(), toolchain.getTargetCpu()));
+    }
 
     for (String arch : archs) {
       String compilerRule;
@@ -145,7 +151,6 @@
                       + "])");
 
       compilationTools.append(compilerRule + "\n");
-      compilerRules.add(":cc-compiler-" + arch);
     }
 
     String build =
@@ -154,14 +159,14 @@
                 "package(default_visibility=['//visibility:public'])",
                 "licenses(['restricted'])",
                 "",
+                "alias(name = 'toolchain', actual = 'everything')",
                 "filegroup(name = 'everything-multilib',",
                 "          srcs = glob(['" + version + "/**/*'],",
                 "              exclude_directories = 1),",
                 "          output_licenses = ['unencumbered'])",
                 "",
                 String.format(
-                    "filegroup(name = 'everything', srcs = ['%s', ':every-file'])",
-                    Joiner.on("', '").join(compilerRules)),
+                    "cc_toolchain_suite(name = 'everything', toolchains = {%s})", compilerMap),
                 "",
                 String.format(
                     "filegroup(name = 'every-file', srcs = ['%s'%s%s])",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index 8dbe6e9..9da6514 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -367,6 +367,11 @@
     setupCrosstool(config, toolchainBuilder.buildPartial());
   }
 
+  public void setupCrosstoolWithRelease(MockToolsConfig config, String crosstool)
+      throws IOException {
+    createCrosstoolPackage(config, false, true, null, null, crosstool);
+  }
+
   /**
    * Creates a crosstool package by merging {@code toolchain} with the default mock CROSSTOOL file.
    */
@@ -389,8 +394,7 @@
       boolean addModuleMap,
       String staticRuntimesLabel,
       String dynamicRuntimesLabel,
-      CToolchain toolchain)
-      throws IOException {
+      CToolchain toolchain) throws IOException {
     createCrosstoolPackage(
         config,
         addEmbeddedRuntimes,
@@ -400,6 +404,23 @@
         toolchain);
   }
 
+  public void setupCrosstool(
+      MockToolsConfig config,
+      boolean addEmbeddedRuntimes,
+      boolean addModuleMap,
+      String staticRuntimesLabel,
+      String dynamicRuntimesLabel,
+      String crosstool)
+      throws IOException {
+    createCrosstoolPackage(
+        config,
+        addEmbeddedRuntimes,
+        addModuleMap,
+        staticRuntimesLabel,
+        dynamicRuntimesLabel,
+        crosstool);
+  }
+
   protected static void createToolsCppPackage(MockToolsConfig config) throws IOException {
     config.create(
         "tools/cpp/BUILD",
@@ -409,7 +430,7 @@
 
   protected void createCrosstoolPackage(MockToolsConfig config, boolean addEmbeddedRuntimes)
       throws IOException {
-    createCrosstoolPackage(config, addEmbeddedRuntimes, /*addModuleMap=*/ true, null, null, null);
+    createCrosstoolPackage(config, addEmbeddedRuntimes, /*addModuleMap=*/ true, null, null);
   }
 
   protected String getCrosstoolTopPathForConfig(MockToolsConfig config) {
@@ -433,7 +454,18 @@
     }
   }
 
-  protected void createCrosstoolPackage(
+  private void createCrosstoolPackage(
+      MockToolsConfig config,
+      boolean addEmbeddedRuntimes,
+      boolean addModuleMap,
+      String staticRuntimesLabel,
+      String dynamicRuntimesLabel)
+      throws IOException {
+    createCrosstoolPackage(config, addEmbeddedRuntimes, addModuleMap, staticRuntimesLabel,
+        dynamicRuntimesLabel, readCrosstoolFile());
+  }
+
+  private void createCrosstoolPackage(
       MockToolsConfig config,
       boolean addEmbeddedRuntimes,
       boolean addModuleMap,
@@ -441,14 +473,23 @@
       String dynamicRuntimesLabel,
       CToolchain toolchain)
       throws IOException {
+    String crosstoolFile = mergeCrosstoolConfig(readCrosstoolFile(), toolchain);
+    createCrosstoolPackage(config, addEmbeddedRuntimes, addModuleMap, staticRuntimesLabel,
+        dynamicRuntimesLabel, crosstoolFile);
+  }
+
+  protected void createCrosstoolPackage(
+      MockToolsConfig config,
+      boolean addEmbeddedRuntimes,
+      boolean addModuleMap,
+      String staticRuntimesLabel,
+      String dynamicRuntimesLabel,
+      String crosstoolFile)
+      throws IOException {
     String crosstoolTop = getCrosstoolTopPathForConfig(config);
     if (config.isRealFileSystem()) {
       config.linkTools(getRealFilesystemTools(crosstoolTop));
     } else {
-      String crosstoolFile = readCrosstoolFile();
-      if (toolchain != null) {
-        crosstoolFile = mergeCrosstoolConfig(crosstoolFile, toolchain);
-      }
       new Crosstool(config, crosstoolTop)
           .setEmbeddedRuntimes(addEmbeddedRuntimes, staticRuntimesLabel, dynamicRuntimesLabel)
           .setCrosstoolFile(getMockCrosstoolVersion(), crosstoolFile)
@@ -461,7 +502,7 @@
 
   protected abstract String getMockCrosstoolVersion();
 
-  protected abstract String readCrosstoolFile() throws IOException;
+  public abstract String readCrosstoolFile() throws IOException;
 
   protected abstract ImmutableList<String> getCrosstoolArchs();
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index 9896392..1454940 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -242,8 +242,7 @@
 
   @Test
   public void testStartEndLib() throws Exception {
-    CrosstoolConfigurationHelper.overwriteCrosstoolWithToolchain(
-        directories.getWorkspace(),
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig,
         CrosstoolConfig.CToolchain.newBuilder().setSupportsStartEndLib(true).buildPartial());
     useConfiguration(
         // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu.
@@ -356,13 +355,12 @@
 
   /**
    * Tests that nocopts= "-fPIC" takes '-fPIC' out of a compile invocation even if the crosstool
-   * requires fPIC compilation (i.e. nocoopts overrides crosstool settings on a rule-specific
+   * requires fPIC compilation (i.e. nocopts overrides crosstool settings on a rule-specific
    * basis).
    */
   @Test
   public void testNoCoptfPicOverride() throws Exception {
-    CrosstoolConfigurationHelper.overwriteCrosstoolWithToolchain(
-        directories.getWorkspace(),
+    getAnalysisMock().ccSupport().setupCrosstool(mockToolsConfig,
         CrosstoolConfig.CToolchain.newBuilder().setNeedsPic(true).buildPartial());
     useConfiguration(
         // Prevent Android from trying to setup ARM crosstool by forcing it on system cpu.
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index 34efc43..65ec00d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -44,6 +44,8 @@
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
+import com.google.protobuf.TextFormat;
 import java.util.ArrayList;
 import java.util.List;
 import org.junit.Before;
@@ -116,8 +118,36 @@
 
   @Test
   public void testFilesToBuildWithoutDSO() throws Exception {
+    CrosstoolConfig.CrosstoolRelease.Builder release = CrosstoolConfig.CrosstoolRelease.newBuilder()
+        .mergeFrom(CrosstoolConfigurationHelper.simpleCompleteToolchainProto());
+    release.getToolchainBuilder(0)
+        .setTargetCpu("k8")
+        .setCompiler("compiler")
+        .clearLinkingModeFlags();
+
+    scratch.file("crosstool/BUILD",
+        "cc_toolchain_suite(",
+        "    name = 'crosstool',",
+        "    toolchains = {'k8|compiler': ':cc-compiler-k8'})",
+        "filegroup(name = 'empty')",
+        "cc_toolchain(",
+        "    name = 'cc-compiler-k8',",
+        "    output_licenses = ['unencumbered'],",
+        "    cpu = 'k8',",
+        "    compiler_files = ':empty',",
+        "    dwp_files = ':empty',",
+        "    linker_files = ':empty',",
+        "    strip_files = ':empty',",
+        "    objcopy_files = ':empty',",
+        "    static_runtime_libs = [':empty'],",
+        "    dynamic_runtime_libs = [':empty'],",
+        "    all_files = ':empty',",
+        "    licenses = ['unencumbered'])");
+    scratch.file("crosstool/CROSSTOOL", TextFormat.printToString(release));
+
     // This is like the preceding test, but with a toolchain that can't build '.so' files
-    useConfiguration("--compiler=compiler_no_dyn_linker");
+    useConfiguration("--crosstool_top=//crosstool:crosstool", "--compiler=compiler",
+        "--cpu=k8", "--host_cpu=k8");
     ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
     Artifact archive = getBinArtifact("libhello.a", hello);
     assertThat(getFilesToBuild(hello)).containsExactly(archive);
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java
index 0b80265..cf858ac 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationHelper.java
@@ -63,15 +63,7 @@
     return OS.getCurrent() == OS.DARWIN ? "darwin" : "k8";
   }
 
-  /**
-   * Overwrites the default CROSSTOOL file with a reasonable toolchain.
-   */
-  public static void overwriteCrosstoolWithSimpleCompleteToolchain(Path workspace)
-      throws IOException {
-    overwriteCrosstoolFile(workspace, TextFormat.printToString(simpleCompleteToolchainProto()));
-  }
-
-  private static CrosstoolConfig.CrosstoolRelease simpleCompleteToolchainProto() {
+  public static CrosstoolConfig.CrosstoolRelease simpleCompleteToolchainProto() {
     CrosstoolConfig.CrosstoolRelease.Builder builder =
         CrosstoolConfig.CrosstoolRelease.newBuilder()
             .setMajorVersion("12")
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
index a1bfaaf..b207a13 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CrosstoolConfigurationLoaderTest.java
@@ -43,15 +43,13 @@
 import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsParsingException;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for {@link CppConfigurationLoader}.
@@ -82,8 +80,7 @@
   }
 
   private CppConfigurationLoader loader(String crosstoolFileContents) throws IOException {
-    CrosstoolConfigurationHelper.overwriteCrosstoolFile(
-        directories.getWorkspace(), crosstoolFileContents);
+    getAnalysisMock().ccSupport().setupCrosstoolWithRelease(mockToolsConfig, crosstoolFileContents);
     return new CppConfigurationLoader(Functions.<String>identity());
   }
 
diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD
index b121ddc..f693fe7 100644
--- a/tools/cpp/BUILD
+++ b/tools/cpp/BUILD
@@ -29,17 +29,16 @@
 )
 
 # Hardcoded toolchain, legacy behaviour.
-filegroup(
+cc_toolchain_suite(
     name = "default-toolchain",
-    srcs = [
-        ":cc-compiler-armeabi-v7a",
-        ":cc-compiler-darwin",
-        ":cc-compiler-freebsd",
-        ":cc-compiler-local",
-        ":cc-compiler-x64_windows",
-        ":cc-compiler-x64_windows_msvc",
-        ":empty",
-    ],
+    toolchains = {
+        "armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a",
+        "darwin|compiler": ":cc-compiler-darwin",
+        "freebsd|compiler": ":cc-compiler-freebsd",
+        "local|compiler": ":cc-compiler-local",
+        "x64_windows|compiler": ":cc-compiler-x64_windows",
+        "x64_windows_msvc|compiler": ":cc-compiler-x64_windows_msvc",
+    },
 )
 
 cc_toolchain(