| // 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.analysis; |
| |
| import static com.google.common.base.Preconditions.checkNotNull; |
| import static com.google.common.truth.Truth.assertThat; |
| import static com.google.devtools.build.lib.analysis.OutputGroupInfo.HIDDEN_OUTPUT_GROUP_PREFIX; |
| import static com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.getAllArtifactsToBuild; |
| import static java.util.Arrays.asList; |
| |
| import com.google.common.collect.ImmutableMap; |
| import com.google.common.collect.ImmutableSortedSet; |
| import com.google.devtools.build.lib.actions.Artifact; |
| import com.google.devtools.build.lib.actions.ArtifactRoot; |
| import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup; |
| import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsToBuild; |
| import com.google.devtools.build.lib.collect.nestedset.NestedSet; |
| import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; |
| import com.google.devtools.build.lib.collect.nestedset.Order; |
| import com.google.devtools.build.lib.testutil.Scratch; |
| import com.google.devtools.build.lib.util.Pair; |
| import com.google.devtools.build.lib.vfs.Path; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| /** Tests for {@link TopLevelArtifactHelper}. */ |
| @RunWith(JUnit4.class) |
| public class TopLevelArtifactHelperTest { |
| |
| private TopLevelArtifactContext ctx; |
| private OutputGroupInfo groupProvider; |
| |
| private Path path; |
| private ArtifactRoot root; |
| private int artifactIdx; |
| |
| @Before |
| public final void setRootDir() throws Exception { |
| Scratch scratch = new Scratch(); |
| Path execRoot = scratch.getFileSystem().getPath("/"); |
| root = ArtifactRoot.asDerivedRoot(execRoot, scratch.dir("/blaze-out")); |
| path = scratch.dir("/blaze-out/foo"); |
| } |
| |
| private void setup(Iterable<Pair<String, Integer>> groupArtifacts) { |
| ImmutableSortedSet.Builder<String> setBuilder = ImmutableSortedSet.naturalOrder(); |
| ImmutableMap.Builder<String, NestedSet<Artifact>> mapBuilder = ImmutableMap.builder(); |
| for (Pair<String, Integer> groupArtifact : groupArtifacts) { |
| setBuilder.add(checkNotNull(groupArtifact.getFirst())); |
| mapBuilder.put( |
| groupArtifact.getFirst(), newArtifacts(checkNotNull(groupArtifact.getSecond()))); |
| } |
| ctx = new TopLevelArtifactContext(false, setBuilder.build()); |
| groupProvider = new OutputGroupInfo(mapBuilder.build()); |
| } |
| |
| @Test |
| public void artifactsShouldBeSeparateByGroup() { |
| setup(asList(Pair.of("foo", 3), Pair.of("bar", 2))); |
| |
| ArtifactsToBuild allArtifacts = getAllArtifactsToBuild(groupProvider, null, ctx); |
| assertThat(allArtifacts.getAllArtifacts()).hasSize(5); |
| assertThat(allArtifacts.getImportantArtifacts()).hasSize(5); |
| |
| NestedSet<ArtifactsInOutputGroup> artifactsByGroup = |
| allArtifacts.getAllArtifactsByOutputGroup(); |
| // Two groups |
| assertThat(artifactsByGroup).hasSize(2); |
| |
| for (ArtifactsInOutputGroup artifacts : artifactsByGroup) { |
| String outputGroup = artifacts.getOutputGroup(); |
| if ("foo".equals(outputGroup)) { |
| assertThat(artifacts.getArtifacts()).hasSize(3); |
| } else if ("bar".equals(outputGroup)) { |
| assertThat(artifacts.getArtifacts()).hasSize(2); |
| } |
| } |
| } |
| |
| @Test |
| public void emptyGroupsShouldBeIgnored() { |
| setup(asList(Pair.of("foo", 1), Pair.of("bar", 0))); |
| |
| ArtifactsToBuild allArtifacts = getAllArtifactsToBuild(groupProvider, null, ctx); |
| assertThat(allArtifacts.getAllArtifacts()).hasSize(1); |
| assertThat(allArtifacts.getImportantArtifacts()).hasSize(1); |
| |
| NestedSet<ArtifactsInOutputGroup> artifactsByGroup = |
| allArtifacts.getAllArtifactsByOutputGroup(); |
| // The bar list should not appear here, as it contains no artifacts. |
| assertThat(artifactsByGroup).hasSize(1); |
| assertThat(artifactsByGroup.toList().get(0).getOutputGroup()).isEqualTo("foo"); |
| } |
| |
| @Test |
| public void importantArtifacts() { |
| setup(asList(Pair.of(HIDDEN_OUTPUT_GROUP_PREFIX + "notimportant", 1), Pair.of("important", 2))); |
| |
| ArtifactsToBuild allArtifacts = getAllArtifactsToBuild(groupProvider, null, ctx); |
| assertThat(allArtifacts.getAllArtifacts()).hasSize(3); |
| assertThat(allArtifacts.getImportantArtifacts()).hasSize(2); |
| } |
| |
| private NestedSet<Artifact> newArtifacts(int num) { |
| NestedSetBuilder<Artifact> builder = new NestedSetBuilder<>(Order.STABLE_ORDER); |
| for (int i = 0; i < num; i++) { |
| builder.add(newArtifact()); |
| } |
| return builder.build(); |
| } |
| |
| private Artifact newArtifact() { |
| return new Artifact(path.getRelative(Integer.toString(artifactIdx++)), root); |
| } |
| } |