diff options
author | hlopko <hlopko@google.com> | 2017-06-12 14:42:05 +0200 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2017-06-12 17:39:55 +0200 |
commit | d333e811f9a30f74375295cf12afaf3b16a1de7a (patch) | |
tree | 2f910531f65fda8b91b6bc31f018dd0651183bee /src/test/java/com | |
parent | 9c4c60d39204ad4bd1c2ef749221423f0d429e1c (diff) |
Introduce CompileCommandLineBuilder and CompileCommandLineTest
RELNOTES: NONE.
PiperOrigin-RevId: 158703123
Diffstat (limited to 'src/test/java/com')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java | 65 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java | 120 |
2 files changed, 185 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java new file mode 100644 index 0000000000..1324c6c802 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileBuildVariablesTest.java @@ -0,0 +1,65 @@ +// 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.cpp; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests that {@code CppCompileAction} is populated with the correct build variables. */ +@RunWith(JUnit4.class) +public class CompileBuildVariablesTest extends BuildViewTestCase { + + private CppCompileAction getCppCompileAction(final String label, final String name) throws + Exception { + return (CppCompileAction) + getGeneratingAction( + Iterables.find( + getGeneratingAction( + Iterables.getOnlyElement(getFilesToBuild(getConfiguredTarget(label)))) + .getInputs(), + new Predicate<Artifact>() { + @Override + public boolean apply(Artifact artifact) { + return artifact.getExecPath().getBaseName().startsWith(name); + } + })); + } + + /** Returns active build variables for a compile action of given type for given target. */ + protected Variables getCompileBuildVariables(String label, String name) throws Exception { + return getCppCompileAction(label, name).getCompileCommandLine().getVariables(); + } + + @Test + public void testPresenceOfBasicVariables() throws Exception { + scratch.file("x/BUILD", "cc_binary(name = 'bin', srcs = ['bin.cc'])"); + scratch.file("x/bin.cc"); + + Variables variables = getCompileBuildVariables("//x:bin", "bin"); + + assertThat(variables.getStringVariable(CppModel.SOURCE_FILE_VARIABLE_NAME)) + .contains("x/bin.cc"); + assertThat(variables.getStringVariable(CppModel.OUTPUT_FILE_VARIABLE_NAME)) + .contains("x/bin"); + } +} diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java new file mode 100644 index 0000000000..141aacf54f --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CompileCommandLineTest.java @@ -0,0 +1,120 @@ +// 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.cpp; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.Root; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; +import com.google.devtools.build.lib.rules.cpp.CompileCommandLine.Builder; +import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile; +import java.io.IOException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Tests for {@link CompileCommandLine}, for example testing the ordering of individual command + * line flags, or that command line is emitted differently subject to the presence of certain + * build variables. Also used to test migration logic (removing hardcoded flags and expressing + * them using feature configuration. + */ +@RunWith(JUnit4.class) +public class CompileCommandLineTest extends BuildViewTestCase { + + private Artifact scratchArtifact(String s) { + try { + return new Artifact( + scratch.overwriteFile( + outputBase.getRelative("compile_command_line").getRelative(s).toString()), + Root.asDerivedRoot( + scratch.dir(outputBase.getRelative("compile_command_line").toString()))); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static FeatureConfiguration getMockFeatureConfiguration(String... crosstool) + throws Exception { + return CcToolchainFeaturesTest.buildFeatures(crosstool) + .getFeatureConfiguration( + FeatureSpecification.create( + ImmutableSet.of( + CppCompileAction.ASSEMBLE, + CppCompileAction.PREPROCESS_ASSEMBLE, + CppCompileAction.C_COMPILE, + CppCompileAction.CPP_COMPILE, + CppCompileAction.CPP_HEADER_PARSING, + CppCompileAction.CPP_HEADER_PREPROCESSING, + CppCompileAction.CPP_MODULE_CODEGEN, + CppCompileAction.CPP_MODULE_COMPILE), + ImmutableSet.<String>of())); + } + + @Test + public void testFeatureConfigurationCommandLineIsUsed() throws Exception { + CompileCommandLine compileCommandLine = + makeCompileCommandLineBuilder() + .setFeatureConfiguration( + getMockFeatureConfiguration( + "", + "action_config {", + " config_name: 'c++-compile'", + " action_name: 'c++-compile'", + " implies: 'some_foo_feature'", + " tool {", + " tool_path: 'foo/bar/DUMMY_COMPILER'", + " }", + "}", + "feature {", + " name: 'some_foo_feature'", + " flag_set {", + " action: 'c++-compile'", + " flag_group {", + " flag: '-some_foo_flag'", + " }", + " }", + "}")) + .build(); + assertThat(compileCommandLine.getArgv(scratchArtifact("a/FakeOutput").getExecPath(), null)) + .contains("-some_foo_flag"); + } + + private Builder makeCompileCommandLineBuilder() throws Exception { + ConfiguredTarget dummyTarget = + scratchConfiguredTarget("a", "a", "cc_binary(name='a', srcs=['a.cc'])"); + return CompileCommandLine.builder( + scratchArtifact("a/FakeInput"), + scratchArtifact("a/FakeOutput"), + makeLabel("//a:FakeInput"), + ImmutableList.<String>of(), + new Predicate<String>() { + @Override + public boolean apply(String s) { + return true; + } + }, + ImmutableList.<String>of(), + "c++-compile", + getTargetConfiguration().getFragment(CppConfiguration.class), + new DotdFile(scratchArtifact("a/dotD")), + CppHelper.getToolchainUsingDefaultCcToolchainAttribute(getRuleContext(dummyTarget))); + } +} |