diff options
Diffstat (limited to 'src/test/java/com/google/devtools')
3 files changed, 229 insertions, 5 deletions
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 |