diff options
Diffstat (limited to 'src')
8 files changed, 376 insertions, 113 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java index 3e9cf4976b..2f73f5aa20 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java @@ -124,7 +124,7 @@ public class PlatformInfo extends NativeInfo implements PlatformInfoApi<Constrai public static class Builder { private Label label; private final List<ConstraintValueInfo> constraints = new ArrayList<>(); - private String remoteExecutionProperties; + private String remoteExecutionProperties = ""; private Location location = Location.BUILTIN; /** diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java new file mode 100644 index 0000000000..d9f998b803 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java @@ -0,0 +1,124 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.skyframe; + +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.platform.PlatformInfo; +import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.packages.NoSuchThingException; +import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException; +import com.google.devtools.build.skyframe.SkyFunction.Environment; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.ValueOrException3; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Nullable; + +/** Helper class that looks up {@link PlatformInfo} data. */ +public class PlatformLookupUtil { + + @Nullable + public static Map<ConfiguredTargetKey, PlatformInfo> getPlatformInfo( + Iterable<ConfiguredTargetKey> platformKeys, Environment env) + throws InterruptedException, InvalidPlatformException { + + Map< + SkyKey, + ValueOrException3< + ConfiguredValueCreationException, NoSuchThingException, ActionConflictException>> + values = + env.getValuesOrThrow( + platformKeys, + ConfiguredValueCreationException.class, + NoSuchThingException.class, + ActionConflictException.class); + boolean valuesMissing = env.valuesMissing(); + Map<ConfiguredTargetKey, PlatformInfo> platforms = valuesMissing ? null : new HashMap<>(); + for (ConfiguredTargetKey key : platformKeys) { + PlatformInfo platformInfo = findPlatformInfo(key, values.get(key)); + if (!valuesMissing && platformInfo != null) { + platforms.put(key, platformInfo); + } + } + if (valuesMissing) { + return null; + } + + return platforms; + } + + /** + * Returns the {@link PlatformInfo} provider from the {@link ConfiguredTarget} in the {@link + * ValueOrException3}, or {@code null} if the {@link ConfiguredTarget} is not present. If the + * {@link ConfiguredTarget} does not have a {@link PlatformInfo} provider, a {@link + * InvalidPlatformException} is thrown. + */ + @Nullable + private static PlatformInfo findPlatformInfo( + ConfiguredTargetKey key, + ValueOrException3< + ConfiguredValueCreationException, NoSuchThingException, ActionConflictException> + valueOrException) + throws InvalidPlatformException { + + try { + ConfiguredTargetValue ctv = (ConfiguredTargetValue) valueOrException.get(); + if (ctv == null) { + return null; + } + + ConfiguredTarget configuredTarget = ctv.getConfiguredTarget(); + PlatformInfo platformInfo = PlatformProviderUtils.platform(configuredTarget); + if (platformInfo == null) { + throw new InvalidPlatformException(configuredTarget.getLabel()); + } + + return platformInfo; + } catch (ConfiguredValueCreationException e) { + throw new InvalidPlatformException(key.getLabel(), e); + } catch (NoSuchThingException e) { + throw new InvalidPlatformException(key.getLabel(), e); + } catch (ActionConflictException e) { + throw new InvalidPlatformException(key.getLabel(), e); + } + } + + /** Exception used when a platform label is not a valid platform. */ + public static final class InvalidPlatformException extends ToolchainException { + InvalidPlatformException(Label label) { + super(formatError(label)); + } + + InvalidPlatformException(Label label, ConfiguredValueCreationException e) { + super(formatError(label), e); + } + + public InvalidPlatformException(Label label, NoSuchThingException e) { + // Just propagate the inner exception, because it's directly actionable. + super(e); + } + + public InvalidPlatformException(Label label, ActionConflictException e) { + super(formatError(label), e); + } + + private static String formatError(Label label) { + return String.format( + "Target %s was referenced as a platform, but does not provide PlatformInfo", label); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java index ad775ca9a5..4ec5e7faca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java @@ -20,21 +20,17 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.PlatformConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.platform.PlatformInfo; -import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; -import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException; -import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidPlatformException; +import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import com.google.devtools.build.skyframe.ValueOrException; import java.util.List; -import java.util.Map; import javax.annotation.Nullable; /** {@link SkyFunction} that returns all registered execution platforms available. */ @@ -122,38 +118,17 @@ public class RegisteredExecutionPlatformsFunction implements SkyFunction { .collect(ImmutableList.toImmutableList()); // Load the actual configured targets and ensure that they have real, valid PlatformInfo - // instances. These are loaded later during toolchain resolution (see - // ToolchainUtil#getPlatformInfo), so this is work that needs to be done anyway, but here we can - // fail fast on an error. - Map<SkyKey, ValueOrException<ConfiguredValueCreationException>> values = - env.getValuesOrThrow(keys, ConfiguredValueCreationException.class); - boolean valuesMissing = false; - for (SkyKey key : keys) { - ConfiguredTargetKey configuredTargetKey = (ConfiguredTargetKey) key.argument(); - Label platformLabel = configuredTargetKey.getLabel(); - try { - ValueOrException<ConfiguredValueCreationException> valueOrException = values.get(key); - if (valueOrException.get() == null) { - valuesMissing = true; - continue; - } - ConfiguredTarget target = - ((ConfiguredTargetValue) valueOrException.get()).getConfiguredTarget(); - PlatformInfo platformInfo = PlatformProviderUtils.platform(target); - - if (platformInfo == null) { - throw new RegisteredExecutionPlatformsFunctionException( - new InvalidPlatformException(platformLabel), Transience.PERSISTENT); - } - } catch (ConfiguredValueCreationException e) { - throw new RegisteredExecutionPlatformsFunctionException( - new InvalidPlatformException(platformLabel, e), Transience.PERSISTENT); + // instances. These are loaded later during toolchain resolution, so this is work that needs to + // be done anyway, but here we can fail fast on an error. + try { + PlatformLookupUtil.getPlatformInfo(keys, env); + if (env.valuesMissing()) { + return null; } + } catch (InvalidPlatformException e) { + throw new RegisteredExecutionPlatformsFunctionException(e, Transience.PERSISTENT); } - if (valuesMissing) { - return null; - } return keys; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java index 737bbd8982..0667d196b3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java @@ -27,8 +27,8 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.NoSuchThingException; +import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException; import com.google.devtools.build.lib.skyframe.RegisteredToolchainsFunction.InvalidToolchainLabelException; -import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidPlatformException; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyKey; @@ -111,14 +111,15 @@ public class ToolchainResolutionFunction implements SkyFunction { // Load the PlatformInfo needed to check constraints. Map<ConfiguredTargetKey, PlatformInfo> platforms; try { + platforms = - ToolchainUtil.getPlatformInfo( + PlatformLookupUtil.getPlatformInfo( new ImmutableList.Builder<ConfiguredTargetKey>() .add(targetPlatformKey) .addAll(availableExecutionPlatformKeys) .build(), env); - if (platforms == null) { + if (env.valuesMissing()) { return null; } } catch (InvalidPlatformException e) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java index 7f69391025..156f62e05c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java @@ -37,6 +37,7 @@ import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.pkgcache.FilteringPolicy; import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException; +import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException; import com.google.devtools.build.lib.skyframe.RegisteredToolchainsFunction.InvalidToolchainLabelException; import com.google.devtools.build.lib.skyframe.ToolchainResolutionFunction.NoToolchainFoundException; import com.google.devtools.build.skyframe.SkyFunction.Environment; @@ -44,7 +45,6 @@ import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.ValueOrException; import com.google.devtools.build.skyframe.ValueOrException2; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -120,7 +120,10 @@ public class ToolchainUtil { .collect(toImmutableList()); // Load the host and target platforms early, to check for errors. - getPlatformInfo(ImmutableList.of(hostPlatformKey, targetPlatformKey), env); + PlatformLookupUtil.getPlatformInfo(ImmutableList.of(hostPlatformKey, targetPlatformKey), env); + if (env.valuesMissing()) { + return null; + } // Load all available execution platform keys. This will find any errors in the execution // platform definitions. @@ -180,56 +183,6 @@ public class ToolchainUtil { return registeredExecutionPlatforms; } - @Nullable - static Map<ConfiguredTargetKey, PlatformInfo> getPlatformInfo( - Iterable<ConfiguredTargetKey> platformKeys, Environment env) - throws InterruptedException, InvalidPlatformException { - - Map<SkyKey, ValueOrException<ConfiguredValueCreationException>> values = - env.getValuesOrThrow(platformKeys, ConfiguredValueCreationException.class); - boolean valuesMissing = env.valuesMissing(); - Map<ConfiguredTargetKey, PlatformInfo> platforms = valuesMissing ? null : new HashMap<>(); - for (ConfiguredTargetKey key : platformKeys) { - PlatformInfo platformInfo = findPlatformInfo(key.getLabel(), values.get(key)); - if (!valuesMissing && platformInfo != null) { - platforms.put(key, platformInfo); - } - } - if (valuesMissing) { - return null; - } - return platforms; - } - - /** - * Returns the {@link PlatformInfo} provider from the {@link ConfiguredTarget} in the {@link - * ValueOrException}, or {@code null} if the {@link ConfiguredTarget} is not present. If the - * {@link ConfiguredTarget} does not have a {@link PlatformInfo} provider, a {@link - * InvalidPlatformException} is thrown. - */ - @Nullable - private static PlatformInfo findPlatformInfo( - Label label, ValueOrException<ConfiguredValueCreationException> valueOrException) - throws InvalidPlatformException { - - try { - ConfiguredTargetValue ctv = (ConfiguredTargetValue) valueOrException.get(); - if (ctv == null) { - return null; - } - - ConfiguredTarget configuredTarget = ctv.getConfiguredTarget(); - PlatformInfo platformInfo = PlatformProviderUtils.platform(configuredTarget); - if (platformInfo == null) { - throw new InvalidPlatformException(label); - } - - return platformInfo; - } catch (ConfiguredValueCreationException e) { - throw new InvalidPlatformException(label, e); - } - } - /** Data class to hold the result of resolving toolchain labels. */ @AutoValue protected abstract static class ResolvedToolchains { @@ -391,7 +344,8 @@ public class ToolchainUtil { throws InterruptedException, InvalidPlatformException { Map<ConfiguredTargetKey, PlatformInfo> platforms = - getPlatformInfo(ImmutableList.of(executionPlatformKey, targetPlatformKey), env); + PlatformLookupUtil.getPlatformInfo( + ImmutableList.of(executionPlatformKey, targetPlatformKey), env); if (platforms == null) { return null; @@ -460,7 +414,8 @@ public class ToolchainUtil { return platformKeys; } - Map<ConfiguredTargetKey, PlatformInfo> platformInfoMap = getPlatformInfo(platformKeys, env); + Map<ConfiguredTargetKey, PlatformInfo> platformInfoMap = + PlatformLookupUtil.getPlatformInfo(platformKeys, env); if (platformInfoMap == null) { return null; } @@ -611,22 +566,6 @@ public class ToolchainUtil { } } - /** Exception used when a platform label is not a valid platform. */ - static final class InvalidPlatformException extends ToolchainException { - InvalidPlatformException(Label label) { - super(formatError(label)); - } - - InvalidPlatformException(Label label, ConfiguredValueCreationException e) { - super(formatError(label), e); - } - - private static String formatError(Label label) { - return String.format( - "Target %s was referenced as a platform, but does not provide PlatformInfo", label); - } - } - /** Exception used when a constraint value label is not a valid constraint value. */ static final class InvalidConstraintValueException extends ToolchainException { InvalidConstraintValueException(Label label) { diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtilTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtilTest.java new file mode 100644 index 0000000000..cf3c5908a3 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtilTest.java @@ -0,0 +1,200 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.skyframe; + +import static com.google.common.truth.Truth.assertThat; +import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.analysis.platform.PlatformInfo; +import com.google.devtools.build.lib.analysis.util.AnalysisMock; +import com.google.devtools.build.lib.rules.platform.ToolchainTestCase; +import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException; +import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils; +import com.google.devtools.build.skyframe.EvaluationResult; +import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionException; +import com.google.devtools.build.skyframe.SkyFunctionName; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; +import java.util.Map; +import javax.annotation.Nullable; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link PlatformLookupUtil}. */ +@RunWith(JUnit4.class) +public class PlatformLookupUtilTest extends ToolchainTestCase { + + /** + * An {@link AnalysisMock} that injects {@link GetPlatformInfoFunction} into the Skyframe + * executor. + */ + private static final class AnalysisMockWithGetPlatformInfoFunction extends AnalysisMock.Delegate { + AnalysisMockWithGetPlatformInfoFunction() { + super(AnalysisMock.get()); + } + + @Override + public ImmutableMap<SkyFunctionName, SkyFunction> getSkyFunctions( + BlazeDirectories directories) { + return ImmutableMap.<SkyFunctionName, SkyFunction>builder() + .putAll(super.getSkyFunctions(directories)) + .put(GET_PLATFORM_INFO_FUNCTION, new GetPlatformInfoFunction()) + .build(); + } + } + + @Override + protected AnalysisMock getAnalysisMock() { + return new AnalysisMockWithGetPlatformInfoFunction(); + } + + @Test + public void testPlatformLookup() throws Exception { + ConfiguredTargetKey linuxKey = + ConfiguredTargetKey.of(makeLabel("//platforms:linux"), targetConfigKey, false); + ConfiguredTargetKey macKey = + ConfiguredTargetKey.of(makeLabel("//platforms:mac"), targetConfigKey, false); + GetPlatformInfoKey key = GetPlatformInfoKey.create(ImmutableList.of(linuxKey, macKey)); + + EvaluationResult<GetPlatformInfoValue> result = getPlatformInfo(key); + + assertThatEvaluationResult(result).hasNoError(); + assertThatEvaluationResult(result).hasEntryThat(key).isNotNull(); + + Map<ConfiguredTargetKey, PlatformInfo> platforms = result.get(key).platforms(); + assertThat(platforms).containsEntry(linuxKey, linuxPlatform); + assertThat(platforms).containsEntry(macKey, macPlatform); + assertThat(platforms).hasSize(2); + } + + @Test + public void testPlatformLookup_targetNotPlatform() throws Exception { + scratch.file("invalid/BUILD", "filegroup(name = 'not_a_platform')"); + + ConfiguredTargetKey targetKey = + ConfiguredTargetKey.of(makeLabel("//invalid:not_a_platform"), targetConfigKey, false); + GetPlatformInfoKey key = GetPlatformInfoKey.create(ImmutableList.of(targetKey)); + + EvaluationResult<GetPlatformInfoValue> result = getPlatformInfo(key); + + assertThatEvaluationResult(result).hasError(); + assertThatEvaluationResult(result) + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .isInstanceOf(InvalidPlatformException.class); + assertThatEvaluationResult(result) + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .hasMessageThat() + .contains("//invalid:not_a_platform"); + } + + @Test + public void testPlatformLookup_targetDoesNotExist() throws Exception { + ConfiguredTargetKey targetKey = + ConfiguredTargetKey.of(makeLabel("//fake:missing"), targetConfigKey, false); + GetPlatformInfoKey key = GetPlatformInfoKey.create(ImmutableList.of(targetKey)); + + EvaluationResult<GetPlatformInfoValue> result = getPlatformInfo(key); + + assertThatEvaluationResult(result).hasError(); + assertThatEvaluationResult(result) + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .isInstanceOf(InvalidPlatformException.class); + assertThatEvaluationResult(result) + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .hasMessageThat() + .contains("no such package 'fake': BUILD file not found on package path"); + } + + // Calls PlatformLookupUtil.getPlatformInfo. + private static final SkyFunctionName GET_PLATFORM_INFO_FUNCTION = + SkyFunctionName.createHermetic("GET_PLATFORM_INFO_FUNCTION"); + + @AutoValue + abstract static class GetPlatformInfoKey implements SkyKey { + @Override + public SkyFunctionName functionName() { + return GET_PLATFORM_INFO_FUNCTION; + } + + abstract Iterable<ConfiguredTargetKey> platformKeys(); + + public static GetPlatformInfoKey create(Iterable<ConfiguredTargetKey> platformKeys) { + return new AutoValue_PlatformLookupUtilTest_GetPlatformInfoKey(platformKeys); + } + } + + EvaluationResult<GetPlatformInfoValue> getPlatformInfo(GetPlatformInfoKey key) + throws InterruptedException { + try { + // Must re-enable analysis for Skyframe functions that create configured targets. + skyframeExecutor.getSkyframeBuildView().enableAnalysis(true); + return SkyframeExecutorTestUtils.evaluate( + skyframeExecutor, key, /*keepGoing=*/ false, reporter); + } finally { + skyframeExecutor.getSkyframeBuildView().enableAnalysis(false); + } + } + + @AutoValue + abstract static class GetPlatformInfoValue implements SkyValue { + abstract Map<ConfiguredTargetKey, PlatformInfo> platforms(); + + static GetPlatformInfoValue create(Map<ConfiguredTargetKey, PlatformInfo> platforms) { + return new AutoValue_PlatformLookupUtilTest_GetPlatformInfoValue(platforms); + } + } + + private static final class GetPlatformInfoFunction implements SkyFunction { + + @Nullable + @Override + public SkyValue compute(SkyKey skyKey, Environment env) + throws SkyFunctionException, InterruptedException { + GetPlatformInfoKey key = (GetPlatformInfoKey) skyKey; + try { + Map<ConfiguredTargetKey, PlatformInfo> platforms = + PlatformLookupUtil.getPlatformInfo(key.platformKeys(), env); + if (env.valuesMissing()) { + return null; + } + return GetPlatformInfoValue.create(platforms); + } catch (InvalidPlatformException e) { + throw new GetPlatformInfoFunctionException(e); + } + } + + @Nullable + @Override + public String extractTag(SkyKey skyKey) { + return null; + } + } + + private static class GetPlatformInfoFunctionException extends SkyFunctionException { + public GetPlatformInfoFunctionException(InvalidPlatformException e) { + super(e, Transience.PERSISTENT); + } + } +} diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java index 21d1229436..f09d1b0af4 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java @@ -23,7 +23,7 @@ import com.google.common.truth.IterableSubject; import com.google.devtools.build.lib.analysis.platform.PlatformInfo.DuplicateConstraintException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.platform.ToolchainTestCase; -import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidPlatformException; +import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException; import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils; import com.google.devtools.build.skyframe.EvaluationResult; import com.google.devtools.build.skyframe.SkyKey; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java index b431612a8a..7a7dbabf61 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainUtilTest.java @@ -26,8 +26,8 @@ import com.google.devtools.build.lib.analysis.ToolchainContext; import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.platform.ToolchainTestCase; +import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException; import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidConstraintValueException; -import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidPlatformException; import com.google.devtools.build.lib.skyframe.ToolchainUtil.NoMatchingPlatformException; import com.google.devtools.build.lib.skyframe.ToolchainUtil.UnresolvedToolchainsException; import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils; @@ -65,7 +65,7 @@ public class ToolchainUtilTest extends ToolchainTestCase { .put(CREATE_TOOLCHAIN_CONTEXT_FUNCTION, new CreateToolchainContextFunction()) .build(); } - }; + } @Override protected AnalysisMock getAnalysisMock() { @@ -236,7 +236,7 @@ public class ToolchainUtilTest extends ToolchainTestCase { } @Test - public void createToolchainContext_invalidTargetPlatform() throws Exception { + public void createToolchainContext_invalidTargetPlatform_badTarget() throws Exception { scratch.file("invalid/BUILD", "filegroup(name = 'not_a_platform')"); useConfiguration("--platforms=//invalid:not_a_platform"); CreateToolchainContextKey key = @@ -254,7 +254,31 @@ public class ToolchainUtilTest extends ToolchainTestCase { .hasErrorEntryForKeyThat(key) .hasExceptionThat() .hasMessageThat() - .contains("//invalid:not_a_platform"); + .contains( + "//invalid:not_a_platform was referenced as a platform, " + + "but does not provide PlatformInfo"); + } + + @Test + public void createToolchainContext_invalidTargetPlatform_badPackage() throws Exception { + scratch.resolve("invalid").delete(); + useConfiguration("--platforms=//invalid:not_a_platform"); + CreateToolchainContextKey key = + CreateToolchainContextKey.create( + "test", ImmutableSet.of(testToolchainType), targetConfigKey); + + EvaluationResult<CreateToolchainContextValue> result = createToolchainContext(key); + + assertThatEvaluationResult(result).hasError(); + assertThatEvaluationResult(result) + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .isInstanceOf(InvalidPlatformException.class); + assertThatEvaluationResult(result) + .hasErrorEntryForKeyThat(key) + .hasExceptionThat() + .hasMessageThat() + .contains("BUILD file not found"); } @Test |