blob: 4bb3e6a7cd248ad607c881b002c20cb6864352d9 [file] [log] [blame]
// 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.rules.cpp;
import com.google.common.base.Joiner;
import com.google.devtools.build.lib.packages.util.ResourceLoader;
import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.testutil.TestConstants;
import java.io.IOException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for cc autoconfiguration. */
@RunWith(JUnit4.class)
public class SkylarkCcToolchainConfigureTest extends EvaluationTestCase {
@Test
public void testActionNames() throws Exception {
newTest()
.testStatement("COMPILE_ACTIONS", MutableList.copyOf(env, CcCommon.ALL_COMPILE_ACTIONS))
.testStatement("LINK_ACTIONS", MutableList.copyOf(env, CcCommon.ALL_LINK_ACTIONS))
.testStatement("ARCHIVE_ACTIONS", MutableList.copyOf(env, CcCommon.ALL_ARCHIVE_ACTIONS))
.testStatement("OTHER_ACTIONS", MutableList.copyOf(env, CcCommon.ALL_OTHER_ACTIONS));
}
@Test
public void testSplitEscaped() throws Exception {
newTest()
.testStatement("split_escaped('a:b:c', ':')", MutableList.of(env, "a", "b", "c"))
.testStatement("split_escaped('a%:b', ':')", MutableList.of(env, "a:b"))
.testStatement("split_escaped('a%%b', ':')", MutableList.of(env, "a%b"))
.testStatement("split_escaped('a:::b', ':')", MutableList.of(env, "a", "", "", "b"))
.testStatement("split_escaped('a:b%:c', ':')", MutableList.of(env, "a", "b:c"))
.testStatement("split_escaped('a%%:b:c', ':')", MutableList.of(env, "a%", "b", "c"))
.testStatement("split_escaped(':a', ':')", MutableList.of(env, "", "a"))
.testStatement("split_escaped('a:', ':')", MutableList.of(env, "a", ""))
.testStatement("split_escaped('::a::', ':')", MutableList.of(env, "", "", "a", "", ""))
.testStatement("split_escaped('%%%:a%%%%:b', ':')", MutableList.of(env, "%:a%%", "b"))
.testStatement("split_escaped('', ':')", MutableList.of(env, ""))
.testStatement("split_escaped('%', ':')", MutableList.of(env, "%"))
.testStatement("split_escaped('%%', ':')", MutableList.of(env, "%"))
.testStatement("split_escaped('%:', ':')", MutableList.of(env, ":"))
.testStatement("split_escaped(':', ':')", MutableList.of(env, "", ""))
.testStatement("split_escaped('a%%b', ':')", MutableList.of(env, "a%b"))
.testStatement("split_escaped('a%:', ':')", MutableList.of(env, "a:"));
}
@Test
public void testActionConfig() throws Exception {
testStatementWithMultilineOutput(
"action_config('c++-compile', '/usr/bin/gcc')",
"",
" action_config {",
" config_name: 'c++-compile'",
" action_name: 'c++-compile'",
" tool {",
" tool_path: '/usr/bin/gcc'",
" }",
" }");
}
@Test
public void testFeature() throws Exception {
testStatementWithMultilineOutput(
"feature("
+ "'fully_static_link', "
+ " [ "
+ " flag_set("
+ " ['c++-link-dynamic-library', 'c++-link-nodeps-dynamic-library'], "
+ " [flag_group([flag('-a'), flag('-b'), flag('-c')])])])",
"",
" feature {",
" name: 'fully_static_link'",
" enabled: true",
" flag_set {",
" action: 'c++-link-dynamic-library'",
" action: 'c++-link-nodeps-dynamic-library'",
" flag_group {",
" flag: '-a'",
" flag: '-b'",
" flag: '-c'",
" }",
" }",
" }");
}
@Test
public void testFeatureThoroughly() throws Exception {
testStatementWithMultilineOutput(
"feature("
+ "'fully_static_link', "
+ " [ "
+ " flag_set("
+ " ['c++-link-dynamic-library'], "
+ " [flag_group([flag('-a')])]),"
+ " flag_set("
+ " ['c++-link-dynamic-library'],"
+ " ["
+ " flag_group("
+ " [flag('-a')],"
+ " iterate_over='a'),"
+ " flag_group("
+ " [flag('-c')],"
+ " expand_if_all_available=['a','b'],"
+ " expand_if_none_available=['a'],"
+ " expand_if_true=['a','b'],"
+ " expand_if_false=['a'],"
+ " expand_if_equal=[['a','val']],"
+ " ),"
+ " flag_group("
+ " [flag('-c')],"
+ " iterate_over='a',"
+ " expand_if_all_available=['a','b'],"
+ " expand_if_none_available=['a'],"
+ " expand_if_true=['a','b'],"
+ " expand_if_false=['a'],"
+ " expand_if_equal=[['a','val']],"
+ " )"
+ " ]),"
+ " flag_set("
+ " ['c++-link-dynamic-library'], "
+ " [flag_group([flag_group([flag('-a')])])])"
+ " ])",
"",
" feature {",
" name: 'fully_static_link'",
" enabled: true",
" flag_set {",
" action: 'c++-link-dynamic-library'",
" flag_group {",
" flag: '-a'",
" }",
" }",
" flag_set {",
" action: 'c++-link-dynamic-library'",
" flag_group {",
" iterate_over: 'a'",
" flag: '-a'",
" }",
" flag_group {",
" expand_if_all_available: 'a'",
" expand_if_all_available: 'b'",
" expand_if_none_available: 'a'",
" expand_if_true: 'a'",
" expand_if_true: 'b'",
" expand_if_false: 'a'",
" expand_if_equal { variable: 'a' value: 'val' }",
" flag: '-c'",
" }",
" flag_group {",
" expand_if_all_available: 'a'",
" expand_if_all_available: 'b'",
" expand_if_none_available: 'a'",
" expand_if_true: 'a'",
" expand_if_true: 'b'",
" expand_if_false: 'a'",
" expand_if_equal { variable: 'a' value: 'val' }",
" iterate_over: 'a'",
" flag: '-c'",
" }",
" }",
" flag_set {",
" action: 'c++-link-dynamic-library'",
" flag_group {",
" flag_group {",
" flag: '-a'",
" }",
" }",
" }",
" }");
}
private ModalTestCase newTest(String... skylarkOptions) throws IOException {
return new SkylarkTest(skylarkOptions)
// A mock implementation of Label to be able to parse lib_cc_configure under default
// Skylark environment (lib_cc_configure is meant to be used from the repository
// environment).
.setUp("def Label(arg):\n return 42")
.setUp(
ResourceLoader.readFromResources(
TestConstants.BAZEL_REPO_PATH + "tools/cpp/lib_cc_configure.bzl"))
.setUp(
ResourceLoader.readFromResources(
TestConstants.BAZEL_REPO_PATH + "tools/cpp/crosstool_utils.bzl"));
}
private void testStatementWithMultilineOutput(String skylarkCode, String... expectedOutput)
throws IOException {
newTest(skylarkCode, Joiner.on(System.getProperty("line.separator")).join(expectedOutput));
}
}