// Copyright 2015 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.analysis; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.syntax.Type; import java.util.ArrayList; import java.util.List; /** * Unit tests for {@link ConfiguredAttributeMapper}. * *

This is distinct from {@link * com.google.devtools.build.lib.analysis.select.ConfiguredAttributeMapperCommonTest} because the * latter needs to inherit from {@link * com.google.devtools.build.lib.analysis.select.AbstractAttributeMapperTest} to run tests common to * all attribute mappers. */ public class ConfiguredAttributeMapperTest extends BuildViewTestCase { /** * Returns a ConfiguredAttributeMapper bound to the given rule with the target configuration. */ private ConfiguredAttributeMapper getMapper(String label) throws Exception { return ConfiguredAttributeMapper.of( (RuleConfiguredTarget) getConfiguredTarget(label)); } private void writeConfigRules() throws Exception { scratch.file("conditions/BUILD", "config_setting(", " name = 'a',", " values = {'compilation_mode': 'opt'})", "config_setting(", " name = 'b',", " values = {'compilation_mode': 'dbg'})"); } /** * Tests that {@link ConfiguredAttributeMapper#get} only gets the configuration-appropriate * value. */ public void testGetAttribute() throws Exception { writeConfigRules(); scratch.file("a/BUILD", "genrule(", " name = 'gen',", " srcs = [],", " outs = ['out'],", " cmd = select({", " '//conditions:a': 'a command',", " '//conditions:b': 'b command',", " '" + BuildType.Selector.DEFAULT_CONDITION_KEY + "': 'default command',", " }))"); useConfiguration("-c", "opt"); assertEquals("a command", getMapper("//a:gen").get("cmd", Type.STRING)); useConfiguration("-c", "dbg"); assertEquals("b command", getMapper("//a:gen").get("cmd", Type.STRING)); useConfiguration("-c", "fastbuild"); assertEquals("default command", getMapper("//a:gen").get("cmd", Type.STRING)); } /** * Tests that label visitation only travels down configuration-appropriate paths. */ public void testLabelVisitation() throws Exception { writeConfigRules(); scratch.file("a/BUILD", "sh_binary(", " name = 'bin',", " srcs = ['bin.sh'],", " deps = select({", " '//conditions:a': [':adep'],", " '//conditions:b': [':bdep'],", " '" + BuildType.Selector.DEFAULT_CONDITION_KEY + "': [':defaultdep'],", " }))", "sh_library(", " name = 'adep',", " srcs = ['adep.sh'])", "sh_library(", " name = 'bdep',", " srcs = ['bdep.sh'])", "sh_library(", " name = 'defaultdep',", " srcs = ['defaultdep.sh'])"); final List