blob: 727fae2958698c69b5b5fb49a136315eb49e4031 [file] [log] [blame]
// Copyright 2017 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.rules.platform;
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
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.PlatformProviderUtils;
import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests of {@link Toolchain}. */
@RunWith(JUnit4.class)
public class ToolchainTest extends BuildViewTestCase {
@Before
public void createConstraints() throws Exception {
scratch.file(
"constraint/BUILD",
"constraint_setting(name = 'basic')",
"constraint_value(name = 'foo',",
" constraint_setting = ':basic',",
" )",
"constraint_value(name = 'bar',",
" constraint_setting = ':basic',",
" )");
}
@Test
public void testToolchain() throws Exception {
scratch.file(
"toolchain/toolchain_def.bzl",
"def _impl(ctx):",
" toolchain = platform_common.ToolchainInfo(",
" data = ctx.attr.data)",
" return [toolchain]",
"toolchain_def = rule(",
" implementation = _impl,",
" attrs = {",
" 'data': attr.string()})");
scratch.file(
"toolchain/BUILD",
"load(':toolchain_def.bzl', 'toolchain_def')",
"toolchain_type(name = 'demo_toolchain')",
"toolchain(",
" name = 'toolchain1',",
" toolchain_type = ':demo_toolchain',",
" exec_compatible_with = ['//constraint:foo'],",
" target_compatible_with = ['//constraint:bar'],",
" toolchain = ':toolchain_def1')",
"toolchain_def(",
" name = 'toolchain_def1',",
" data = 'foo')");
ConfiguredTarget target = getConfiguredTarget("//toolchain:toolchain1");
assertThat(target).isNotNull();
DeclaredToolchainInfo provider = PlatformProviderUtils.declaredToolchainInfo(target);
assertThat(provider).isNotNull();
assertThat(provider.toolchainType())
.isEqualTo(ToolchainTypeInfo.create(makeLabel("//toolchain:demo_toolchain")));
ConstraintSettingInfo basicConstraintSetting =
ConstraintSettingInfo.create(makeLabel("//constraint:basic"));
assertThat(provider.execConstraints().get(basicConstraintSetting))
.isEqualTo(
ConstraintValueInfo.create(basicConstraintSetting, makeLabel("//constraint:foo")));
assertThat(provider.targetConstraints().get(basicConstraintSetting))
.isEqualTo(
ConstraintValueInfo.create(basicConstraintSetting, makeLabel("//constraint:bar")));
assertThat(provider.toolchainLabel()).isEqualTo(makeLabel("//toolchain:toolchain_def1"));
}
@Test
public void ruleDefinitionIncorrectlyDependsOnToolchainInstance() throws Exception {
scratch.file(
"toolchain/toolchain_def.bzl",
"def _impl(ctx):",
" return [platform_common.ToolchainInfo()]",
"toolchain_def = rule(",
" implementation = _impl,",
" attrs = {})");
scratch.file(
"toolchain/BUILD",
"load(':toolchain_def.bzl', 'toolchain_def')",
"toolchain_type(name = 'demo_toolchain')",
"toolchain(",
" name = 'toolchain1',",
" toolchain_type = ':demo_toolchain',",
" exec_compatible_with = ['//constraint:foo'],",
" target_compatible_with = ['//constraint:bar'],",
" toolchain = ':toolchain_def1')",
"toolchain_def(name = 'toolchain_def1')");
scratch.file(
"rule/rule_def.bzl",
"def _impl(ctx):",
" pass",
"my_rule = rule(",
" implementation = _impl,",
" toolchains = ['//toolchain:toolchain1'])");
scratch.file("rule/BUILD", "load('//rule:rule_def.bzl', 'my_rule')", "my_rule(name = 'me')");
reporter.removeHandler(failFastHandler); // expect errors
ConfiguredTarget target = getConfiguredTarget("//rule:me");
assertThat(target).isNull();
assertContainsEvent(
"Target //toolchain:toolchain1 was referenced as a toolchain type, but is a toolchain "
+ "instance. Is the rule definition for the target you're building setting "
+ "\"toolchains =\" to a toolchain() instead of the expected toolchain_type()?");
}
}