diff options
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtilTest.java')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtilTest.java | 200 |
1 files changed, 200 insertions, 0 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); + } + } +} |