diff options
author | 2018-04-23 12:40:43 -0700 | |
---|---|---|
committer | 2018-04-23 12:42:26 -0700 | |
commit | 060b1624e4d64dbdbeb375f9a55a3da9bd055a54 (patch) | |
tree | 70c811913cf3cc56d37505a54c5959923b03525f /src/test | |
parent | a7c6786f32d8dd96a23fc23f61381b550a792fc1 (diff) |
Accept included headers which are provided by tree artifacts.
This allows a C++ file to include headers from a tree artifact, and pass header inclusion checks.
RELNOTES: None.
PiperOrigin-RevId: 193967617
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD | 1 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/cpp/HeaderDiscoveryTest.java | 101 |
2 files changed, 102 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD index 9d5482bada..c3b8be1ac1 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD @@ -53,6 +53,7 @@ java_test( "//third_party:guava-testlib", "//third_party:jsr305", "//third_party:junit4", + "//third_party:mockito", "//third_party:truth", "//third_party/protobuf:protobuf_java", ], diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/HeaderDiscoveryTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/HeaderDiscoveryTest.java new file mode 100644 index 0000000000..831cf95350 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/HeaderDiscoveryTest.java @@ -0,0 +1,101 @@ +// Copyright 2016 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.devtools.build.lib.testutil.MoreAsserts.assertThrows; +import static org.mockito.Mockito.mock; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.ActionExecutionException; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact; +import com.google.devtools.build.lib.actions.ArtifactOwner; +import com.google.devtools.build.lib.actions.ArtifactResolver; +import com.google.devtools.build.lib.actions.ArtifactRoot; +import com.google.devtools.build.lib.actions.util.ActionsTestUtil; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.vfs.FileSystem; +import com.google.devtools.build.lib.vfs.Path; +import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Test. */ +@RunWith(JUnit4.class) +public class HeaderDiscoveryTest { + + private final FileSystem fs = new InMemoryFileSystem(); + private final Path execRoot = fs.getPath("/execroot"); + private final Path derivedRoot = execRoot.getRelative("derived"); + private final ArtifactRoot artifactRoot = ArtifactRoot.asDerivedRoot(execRoot, derivedRoot); + + /** + * Test that an included header is satisfied (=doesn't cause an error) if it provided by a tree + * artifact. + */ + @Test + public void treeArtifactInclusionCheck() throws Exception { + ArtifactResolver artifactResolver = mock(ArtifactResolver.class); + + checkHeaderInclusion( + artifactResolver, + ImmutableList.of( + derivedRoot.getRelative("tree_artifact/foo.h"), + derivedRoot.getRelative("tree_artifact/subdir/foo.h")), + ImmutableList.of(treeArtifact(derivedRoot.getRelative("tree_artifact")))); + + // Implicitly check that there are no exceptions thrown. + } + + @Test + public void errorsWhenMissingHeaders() { + ArtifactResolver artifactResolver = mock(ArtifactResolver.class); + + assertThrows( + ActionExecutionException.class, + () -> + checkHeaderInclusion( + artifactResolver, + ImmutableList.of( + derivedRoot.getRelative("tree_artifact1/foo.h"), + derivedRoot.getRelative("tree_artifact1/subdir/foo.h")), + ImmutableList.of(treeArtifact(derivedRoot.getRelative("tree_artifact2"))))); + } + + private NestedSet<Artifact> checkHeaderInclusion( + ArtifactResolver artifactResolver, + ImmutableList<Path> dependencies, + ImmutableList<Artifact> includedHeaders) + throws ActionExecutionException { + return new HeaderDiscovery.Builder() + .shouldValidateInclusions() + .setAction(new ActionsTestUtil.NullAction()) + .setPermittedSystemIncludePrefixes(ImmutableList.of()) + .setSourceFile(new Artifact(derivedRoot.getRelative("foo.cc"), artifactRoot)) + .setDependencies(dependencies) + .setAllowedDerivedinputs(includedHeaders) + .build() + .discoverInputsFromDependencies(execRoot, artifactResolver); + } + + private SpecialArtifact treeArtifact(Path path) { + return new SpecialArtifact( + artifactRoot, + artifactRoot.getExecPath().getRelative(artifactRoot.getRoot().relativize(path)), + ArtifactOwner.NullArtifactOwner.INSTANCE, + Artifact.SpecialArtifactType.TREE); + } +} |