diff options
author | 2015-04-17 13:16:51 +0000 | |
---|---|---|
committer | 2015-04-17 15:42:49 +0000 | |
commit | d87465e66cd282c99496dc68cf94f7de5f04ab90 (patch) | |
tree | 4c8640846dc03b62f9174998c147143e9c41f6dd /src/test/java/com/google/devtools/build/lib/analysis/config/ConfigSettingTest.java | |
parent | 8b5cb2e076378572219cabdb088e8dddd679d0a0 (diff) |
Open source the configuration tests.
- update the MOCK_CROSSTOOL to provide more stuff needed by tests
- add a THIS_IS_BAZEL constant to allow disabling individual test cases
- disable some tests in Bazel
The disabled tests are mainly due to differences in the test setup - making
the test setups more similar will largely fix that. I think we'll make some
changes to our internal setup, too, not just the external one. For example,
the use of 'k8' and 'piii' to refer to 'x86_64' and 'x86' seems archaic.
I decided to leave the dependency on the C++ and Java configurations rather
than rewriting the tests to use mock configurations. That would be nicer, but
also requires significantly more work.
--
MOS_MIGRATED_REVID=91399406
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/analysis/config/ConfigSettingTest.java')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/analysis/config/ConfigSettingTest.java | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/ConfigSettingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/ConfigSettingTest.java new file mode 100644 index 0000000000..e9e89f20b9 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/analysis/config/ConfigSettingTest.java @@ -0,0 +1,183 @@ +// Copyright 2015 Google Inc. 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.config; + +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.syntax.Label; + +/** + * Tests for {@link ConfigSetting}. + */ +public class ConfigSettingTest extends BuildViewTestCase { + + private void writeSimpleExample() throws Exception { + scratchFile("pkg/BUILD", + "config_setting(", + " name = 'foo',", + " values = {", + " 'compilation_mode': 'dbg',", + " 'stamp': '1',", + " })"); + } + + private ConfigMatchingProvider getConfigMatchingProvider(String label) throws Exception { + return getConfiguredTarget(label).getProvider(ConfigMatchingProvider.class); + } + + /** + * Tests that a config_setting only matches build configurations where *all* of + * its flag specifications match. + */ + public void testMatchingCriteria() throws Exception { + writeSimpleExample(); + + // First flag mismatches: + useConfiguration("-c", "opt", "--stamp"); + assertFalse(getConfigMatchingProvider("//pkg:foo").matches()); + + // Second flag mismatches: + useConfiguration("-c", "dbg", "--nostamp"); + assertFalse(getConfigMatchingProvider("//pkg:foo").matches()); + + // Both flags mismatch: + useConfiguration("-c", "opt", "--nostamp"); + assertFalse(getConfigMatchingProvider("//pkg:foo").matches()); + + // Both flags match: + useConfiguration("-c", "dbg", "--stamp"); + assertTrue(getConfigMatchingProvider("//pkg:foo").matches()); + } + + /** + * Tests that {@link ConfigMatchingProvider#label} is correct. + */ + public void testLabel() throws Exception { + writeSimpleExample(); + assertEquals( + Label.parseAbsolute("//pkg:foo"), + getConfigMatchingProvider("//pkg:foo").label()); + } + + /** + * Tests that rule analysis fails on unknown options. + */ + public void testUnknownOption() throws Exception { + checkError("foo", "badoption", + "unknown option: 'not_an_option'", + "config_setting(", + " name = 'badoption',", + " values = {'not_an_option': 'bar'})"); + } + + /** + * Tests that rule analysis fails on invalid option values. + */ + public void testInvalidOptionValue() throws Exception { + checkError("foo", "badvalue", + "Not a valid compilation mode: 'baz'", + "config_setting(", + " name = 'badvalue',", + " values = {'compilation_mode': 'baz'})"); + } + + /** + * Tests that when the first option is valid but the config_setting doesn't match, + * remaining options are still validity-checked. + */ + public void testInvalidOptionFartherDown() throws Exception { + checkError("foo", "badoption", + "unknown option: 'not_an_option'", + "config_setting(", + " name = 'badoption',", + " values = {", + " 'compilation_mode': 'opt',", + " 'not_an_option': 'bar',", + " })"); + } + + /** + * Tests that *some* settings must be specified. + */ + public void testEmptySettings() throws Exception { + checkError("foo", "empty", + "//foo:empty: no settings specified", + "config_setting(", + " name = 'empty',", + " values = {})"); + } + + /** + * Tests {@link BuildConfiguration.Fragment#lateBoundOptionDefaults} options (options + * that take alternative defaults from what's specified in {@link + * com.google.devtools.common.options.Option#defaultValue}). + */ + public void testLateBoundOptionDefaults() throws Exception { + scratchFile("test/BUILD", + "config_setting(", + " name = 'match',", + " values = {", + " 'cpu': 'k8',", + " })"); + useConfiguration("--cpu=k8"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + } + + /** + * Tests matching on multi-value attributes with key=value entries (e.g. --define). + */ + public void testMultiValueDict() throws Exception { + scratchFile("test/BUILD", + "config_setting(", + " name = 'match',", + " values = {", + " 'define': 'foo=bar',", + " })"); + + useConfiguration(""); + assertFalse(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--define", "foo=bar"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--define", "foo=baz"); + assertFalse(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--define", "foo=bar", "--define", "bar=baz"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--define", "foo=bar", "--define", "bar=baz", "--define", "foo=nope"); + assertFalse(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--define", "foo=nope", "--define", "bar=baz", "--define", "foo=bar"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + } + + /** + * Tests matching on multi-value attributes with primitive values. + */ + public void testMultiValueList() throws Exception { + scratchFile("test/BUILD", + "config_setting(", + " name = 'match',", + " values = {", + " 'copt': '-Dfoo',", + " })"); + + useConfiguration(""); + assertFalse(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--copt", "-Dfoo"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--copt", "-Dbar"); + assertFalse(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--copt", "-Dfoo", "--copt", "-Dbar"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + useConfiguration("--copt", "-Dbar", "--copt", "-Dfoo"); + assertTrue(getConfigMatchingProvider("//test:match").matches()); + } +} |