Update ToolchainResolutionFunction to consider multiple available
execution platforms.

Part of #4442.

Change-Id: I6678d57f4aaadcb19032bf58820606242ba66a25
PiperOrigin-RevId: 184707708
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
index 9d44e05..92f24ed 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
@@ -18,12 +18,8 @@
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.testing.EqualsTester;
-import com.google.common.truth.DefaultSubject;
-import com.google.common.truth.Subject;
-import com.google.devtools.build.lib.analysis.platform.ConstraintSettingInfo;
-import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
-import com.google.devtools.build.lib.analysis.platform.DeclaredToolchainInfo;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.rules.platform.ToolchainTestCase;
@@ -51,16 +47,50 @@
   }
 
   @Test
-  public void testResolution() throws Exception {
+  public void testResolution_singleExecutionPlatform() throws Exception {
     SkyKey key =
-        ToolchainResolutionValue.key(targetConfig, testToolchainType, linuxPlatform, macPlatform);
+        ToolchainResolutionValue.key(
+            targetConfig, testToolchainType, linuxPlatform, ImmutableList.of(macPlatform));
     EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
 
     assertThatEvaluationResult(result).hasNoError();
 
     ToolchainResolutionValue toolchainResolutionValue = result.get(key);
-    assertThat(toolchainResolutionValue.toolchainLabel())
-        .isEqualTo(makeLabel("//toolchain:toolchain_2_impl"));
+    assertThat(toolchainResolutionValue.availableToolchainLabels())
+        .containsExactly(macPlatform, makeLabel("//toolchain:toolchain_2_impl"));
+  }
+
+  @Test
+  public void testResolution_multipleExecutionPlatforms() throws Exception {
+    addToolchain(
+        "extra",
+        "extra_toolchain",
+        ImmutableList.of("//constraints:linux"),
+        ImmutableList.of("//constraints:linux"),
+        "baz");
+    rewriteWorkspace(
+        "register_toolchains(",
+        "'//toolchain:toolchain_1',",
+        "'//toolchain:toolchain_2',",
+        "'//extra:extra_toolchain')");
+
+    SkyKey key =
+        ToolchainResolutionValue.key(
+            targetConfig,
+            testToolchainType,
+            linuxPlatform,
+            ImmutableList.of(linuxPlatform, macPlatform));
+    EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
+
+    assertThatEvaluationResult(result).hasNoError();
+
+    ToolchainResolutionValue toolchainResolutionValue = result.get(key);
+    assertThat(toolchainResolutionValue.availableToolchainLabels())
+        .containsExactly(
+            linuxPlatform,
+            makeLabel("//extra:extra_toolchain_impl"),
+            macPlatform,
+            makeLabel("//toolchain:toolchain_2_impl"));
   }
 
   @Test
@@ -69,7 +99,8 @@
     rewriteWorkspace();
 
     SkyKey key =
-        ToolchainResolutionValue.key(targetConfig, testToolchainType, linuxPlatform, macPlatform);
+        ToolchainResolutionValue.key(
+            targetConfig, testToolchainType, linuxPlatform, ImmutableList.of(macPlatform));
     EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
 
     assertThatEvaluationResult(result)
@@ -80,117 +111,41 @@
   }
 
   @Test
-  public void testResolveConstraints() throws Exception {
-    ConstraintSettingInfo setting1 =
-        ConstraintSettingInfo.create(makeLabel("//constraint:setting1"));
-    ConstraintSettingInfo setting2 =
-        ConstraintSettingInfo.create(makeLabel("//constraint:setting2"));
-    ConstraintValueInfo constraint1a =
-        ConstraintValueInfo.create(setting1, makeLabel("//constraint:value1a"));
-    ConstraintValueInfo constraint1b =
-        ConstraintValueInfo.create(setting1, makeLabel("//constraint:value1b"));
-    ConstraintValueInfo constraint2a =
-        ConstraintValueInfo.create(setting2, makeLabel("//constraint:value2a"));
-    ConstraintValueInfo constraint2b =
-        ConstraintValueInfo.create(setting2, makeLabel("//constraint:value2b"));
-
-    Label toolchainType1 = makeLabel("//toolchain:type1");
-    Label toolchainType2 = makeLabel("//toolchain:type2");
-
-    DeclaredToolchainInfo toolchain1a =
-        DeclaredToolchainInfo.create(
-            toolchainType1,
-            ImmutableList.of(constraint1a, constraint2a),
-            ImmutableList.of(constraint1a, constraint2a),
-            makeLabel("//toolchain:toolchain1a"));
-    DeclaredToolchainInfo toolchain1b =
-        DeclaredToolchainInfo.create(
-            toolchainType1,
-            ImmutableList.of(constraint1a, constraint2b),
-            ImmutableList.of(constraint1a, constraint2b),
-            makeLabel("//toolchain:toolchain1b"));
-    DeclaredToolchainInfo toolchain2a =
-        DeclaredToolchainInfo.create(
-            toolchainType2,
-            ImmutableList.of(constraint1b, constraint2a),
-            ImmutableList.of(constraint1b, constraint2a),
-            makeLabel("//toolchain:toolchain2a"));
-    DeclaredToolchainInfo toolchain2b =
-        DeclaredToolchainInfo.create(
-            toolchainType2,
-            ImmutableList.of(constraint1b, constraint2b),
-            ImmutableList.of(constraint1b, constraint2b),
-            makeLabel("//toolchain:toolchain2b"));
-
-    ImmutableList<DeclaredToolchainInfo> allToolchains =
-        ImmutableList.of(toolchain1a, toolchain1b, toolchain2a, toolchain2b);
-
-    assertToolchainResolution(
-            toolchainType1,
-            ImmutableList.of(constraint1a, constraint2a),
-            ImmutableList.of(constraint1a, constraint2a),
-            allToolchains)
-        .isEqualTo(toolchain1a);
-    assertToolchainResolution(
-            toolchainType1,
-            ImmutableList.of(constraint1a, constraint2b),
-            ImmutableList.of(constraint1a, constraint2b),
-            allToolchains)
-        .isEqualTo(toolchain1b);
-    assertToolchainResolution(
-            toolchainType2,
-            ImmutableList.of(constraint1b, constraint2a),
-            ImmutableList.of(constraint1b, constraint2a),
-            allToolchains)
-        .isEqualTo(toolchain2a);
-    assertToolchainResolution(
-            toolchainType2,
-            ImmutableList.of(constraint1b, constraint2b),
-            ImmutableList.of(constraint1b, constraint2b),
-            allToolchains)
-        .isEqualTo(toolchain2b);
-
-    // No toolchains of type.
-    assertToolchainResolution(
-            makeLabel("//toolchain:type3"),
-            ImmutableList.of(constraint1a, constraint2a),
-            ImmutableList.of(constraint1a, constraint2a),
-            allToolchains)
-        .isNull();
-  }
-
-  private Subject<DefaultSubject, Object> assertToolchainResolution(
-      Label toolchainType,
-      Iterable<ConstraintValueInfo> targetConstraints,
-      Iterable<ConstraintValueInfo> execConstraints,
-      ImmutableList<DeclaredToolchainInfo> toolchains)
-      throws Exception {
-
-    PlatformInfo execPlatform =
-        PlatformInfo.builder()
-            .setLabel(makeLabel("//platform:exec"))
-            .addConstraints(execConstraints)
-            .build();
-    PlatformInfo targetPlatform =
-        PlatformInfo.builder()
-            .setLabel(makeLabel("//platform:target"))
-            .addConstraints(targetConstraints)
-            .build();
-
-    DeclaredToolchainInfo resolvedToolchain =
-        ToolchainResolutionFunction.resolveConstraints(
-            toolchainType, execPlatform, targetPlatform, toolchains, null);
-    return assertThat(resolvedToolchain);
-  }
-
-  @Test
   public void testToolchainResolutionValue_equalsAndHashCode() {
     new EqualsTester()
         .addEqualityGroup(
-            ToolchainResolutionValue.create(makeLabel("//test:toolchain_impl_1")),
-            ToolchainResolutionValue.create(makeLabel("//test:toolchain_impl_1")))
+            ToolchainResolutionValue.create(
+                ImmutableMap.<PlatformInfo, Label>builder()
+                    .put(linuxPlatform, makeLabel("//test:toolchain_impl_1"))
+                    .build()),
+            ToolchainResolutionValue.create(
+                ImmutableMap.<PlatformInfo, Label>builder()
+                    .put(linuxPlatform, makeLabel("//test:toolchain_impl_1"))
+                    .build()))
+        // Different execution platform, same label.
         .addEqualityGroup(
-            ToolchainResolutionValue.create(makeLabel("//test:toolchain_impl_2")),
-            ToolchainResolutionValue.create(makeLabel("//test:toolchain_impl_2")));
+            ToolchainResolutionValue.create(
+                ImmutableMap.<PlatformInfo, Label>builder()
+                    .put(macPlatform, makeLabel("//test:toolchain_impl_1"))
+                    .build()))
+        // Same execution platform, different label.
+        .addEqualityGroup(
+            ToolchainResolutionValue.create(
+                ImmutableMap.<PlatformInfo, Label>builder()
+                    .put(linuxPlatform, makeLabel("//test:toolchain_impl_2"))
+                    .build()))
+        // Different execution platform, different label.
+        .addEqualityGroup(
+            ToolchainResolutionValue.create(
+                ImmutableMap.<PlatformInfo, Label>builder()
+                    .put(macPlatform, makeLabel("//test:toolchain_impl_2"))
+                    .build()))
+        // Multiple execution platforms.
+        .addEqualityGroup(
+            ToolchainResolutionValue.create(
+                ImmutableMap.<PlatformInfo, Label>builder()
+                    .put(linuxPlatform, makeLabel("//test:toolchain_impl_1"))
+                    .put(macPlatform, makeLabel("//test:toolchain_impl_1"))
+                    .build()));
   }
 }