blob: 19427ab87d860377cfbe66f82792ad35439b2056 [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* 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.facebook.buck.cli;
import static org.junit.Assert.assertEquals;
import com.facebook.buck.android.FakeAndroidDirectoryResolver;
import com.facebook.buck.event.BuckEventBus;
import com.facebook.buck.event.BuckEventBusFactory;
import com.facebook.buck.java.FakeJavaPackageFinder;
import com.facebook.buck.java.JavaLibraryBuilder;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.parser.ParserConfig;
import com.facebook.buck.rules.ArtifactCache;
import com.facebook.buck.rules.FakeRepositoryFactory;
import com.facebook.buck.rules.NoopArtifactCache;
import com.facebook.buck.rules.Repository;
import com.facebook.buck.rules.TargetGraph;
import com.facebook.buck.rules.TargetNode;
import com.facebook.buck.rules.TestRepositoryBuilder;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.facebook.buck.testutil.TargetGraphFactory;
import com.facebook.buck.testutil.TestConsole;
import com.facebook.buck.util.environment.Platform;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk7.Jdk7Module;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.io.IOException;
import java.nio.file.Paths;
public class AuditDependenciesCommandTest {
private TestConsole console;
private AuditDependenciesCommand auditDependenciesCommand;
@Rule
public ExpectedException thrown = ExpectedException.none();
@Before
public void setUp() throws IOException, InterruptedException{
console = new TestConsole();
FakeProjectFilesystem projectFilesystem = new FakeProjectFilesystem();
projectFilesystem.touch(Paths.get("src/com/facebook/TestAndroidLibrary.java"));
projectFilesystem.touch(Paths.get("src/com/facebook/TestAndroidLibraryTwo.java"));
projectFilesystem.touch(Paths.get("src/com/facebook/TestJavaLibrary.java"));
projectFilesystem.touch(Paths.get("src/com/facebook/TestJavaLibraryTwo.java"));
projectFilesystem.touch(Paths.get("src/com/facebook/TestJavaLibraryThree.java"));
Repository repository = new TestRepositoryBuilder().setFilesystem(projectFilesystem).build();
ArtifactCache artifactCache = new NoopArtifactCache();
BuckEventBus eventBus = BuckEventBusFactory.newInstance();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk7Module());
auditDependenciesCommand = new AuditDependenciesCommand(
CommandRunnerParamsForTesting.createCommandRunnerParamsForTesting(
console,
new FakeRepositoryFactory(),
repository,
new FakeAndroidDirectoryResolver(),
new InstanceArtifactCacheFactory(artifactCache),
eventBus,
new ParserConfig(new FakeBuckConfig()),
Platform.detect(),
ImmutableMap.copyOf(System.getenv()),
new FakeJavaPackageFinder(),
objectMapper));
}
@Test
public void testGetTransitiveDependenciesWalksTheGraph() throws IOException {
BuildTarget javaTarget = BuildTargetFactory.newInstance("//:test-java-library");
TargetNode<?> javaNode = JavaLibraryBuilder
.createBuilder(javaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibrary.java"))
.build();
BuildTarget secondLibraryTarget = BuildTargetFactory.newInstance("//:test-android-library-two");
TargetNode<?> secondLibraryNode = JavaLibraryBuilder
.createBuilder(secondLibraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibraryTwo.java"))
.addDep(javaTarget)
.build();
BuildTarget libraryTarget = BuildTargetFactory.newInstance("//:test-android-library");
TargetNode<?> libraryNode = JavaLibraryBuilder
.createBuilder(libraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibrary.java"))
.addDep(secondLibraryTarget)
.build();
ImmutableSet<TargetNode<?>> nodes = ImmutableSet.of(javaNode, libraryNode, secondLibraryNode);
TargetGraph targetGraph = TargetGraphFactory.newInstance(nodes);
ImmutableSet<BuildTarget> testInput = ImmutableSet.of(libraryTarget);
ImmutableSet<BuildTarget> transitiveDependencies =
auditDependenciesCommand.getTransitiveDependencies(testInput, targetGraph);
assertEquals(ImmutableSet.of(secondLibraryTarget, javaTarget), transitiveDependencies);
}
@Test
public void testGetImmediateDependenciesDoesntReturnTransitiveDependencies() throws IOException {
BuildTarget javaTarget = BuildTargetFactory.newInstance("//:test-java-library");
TargetNode<?> javaNode = JavaLibraryBuilder
.createBuilder(javaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibrary.java"))
.build();
BuildTarget secondLibraryTarget = BuildTargetFactory.newInstance("//:test-android-library-two");
TargetNode<?> secondLibraryNode = JavaLibraryBuilder
.createBuilder(secondLibraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibraryTwo.java"))
.addDep(javaTarget)
.build();
BuildTarget libraryTarget = BuildTargetFactory.newInstance("//:test-android-library");
TargetNode<?> libraryNode = JavaLibraryBuilder
.createBuilder(libraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibrary.java"))
.addDep(secondLibraryTarget)
.build();
ImmutableSet<TargetNode<?>> nodes = ImmutableSet.of(javaNode, libraryNode, secondLibraryNode);
TargetGraph targetGraph = TargetGraphFactory.newInstance(nodes);
ImmutableSet<BuildTarget> testInput = ImmutableSet.of(libraryTarget);
ImmutableSet<BuildTarget> immediateDependencies =
auditDependenciesCommand.getImmediateDependencies(testInput, targetGraph);
assertEquals(ImmutableSet.of(secondLibraryTarget), immediateDependencies);
}
@Test
public void testGetImmediateDependenciesWithMultipleInputsReturnsAllDependencies()
throws IOException {
BuildTarget secondJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-two");
TargetNode<?> secondJavaNode = JavaLibraryBuilder
.createBuilder(secondJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryTwo.java"))
.build();
BuildTarget javaTarget = BuildTargetFactory.newInstance("//:test-java-library");
TargetNode<?> javaNode = JavaLibraryBuilder
.createBuilder(javaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibrary.java"))
.addDep(secondJavaTarget)
.build();
BuildTarget secondLibraryTarget = BuildTargetFactory.newInstance("//:test-android-library-two");
TargetNode<?> secondLibraryNode = JavaLibraryBuilder
.createBuilder(secondLibraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibraryTwo.java"))
.build();
BuildTarget libraryTarget = BuildTargetFactory.newInstance("//:test-android-library");
TargetNode<?> libraryNode = JavaLibraryBuilder
.createBuilder(libraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibrary.java"))
.addDep(secondLibraryTarget)
.build();
ImmutableSet<TargetNode<?>> nodes =
ImmutableSet.of(javaNode, secondJavaNode, libraryNode, secondLibraryNode);
TargetGraph targetGraph = TargetGraphFactory.newInstance(nodes);
ImmutableSet<BuildTarget> testInput = ImmutableSet.of(libraryTarget, javaTarget);
ImmutableSet<BuildTarget> immediateDependencies =
auditDependenciesCommand.getImmediateDependencies(testInput, targetGraph);
assertEquals(ImmutableSet.of(secondLibraryTarget, secondJavaTarget), immediateDependencies);
}
@Test
public void testGetTransitiveDependenciesWithMultipleInputsReturnsAllDependencies()
throws IOException {
BuildTarget thirdJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-three");
TargetNode<?> thirdJavaNode = JavaLibraryBuilder
.createBuilder(thirdJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryThree.java"))
.build();
BuildTarget secondJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-two");
TargetNode<?> secondJavaNode = JavaLibraryBuilder
.createBuilder(secondJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryTwo.java"))
.addDep(thirdJavaTarget)
.build();
BuildTarget javaTarget = BuildTargetFactory.newInstance("//:test-java-library");
TargetNode<?> javaNode = JavaLibraryBuilder
.createBuilder(javaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibrary.java"))
.addDep(secondJavaTarget)
.build();
BuildTarget secondLibraryTarget = BuildTargetFactory.newInstance("//:test-android-library-two");
TargetNode<?> secondLibraryNode = JavaLibraryBuilder
.createBuilder(secondLibraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibraryTwo.java"))
.build();
BuildTarget libraryTarget = BuildTargetFactory.newInstance("//:test-android-library");
TargetNode<?> libraryNode = JavaLibraryBuilder
.createBuilder(libraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibrary.java"))
.addDep(secondLibraryTarget)
.build();
ImmutableSet<TargetNode<?>> nodes =
ImmutableSet.of(javaNode, secondJavaNode, thirdJavaNode, libraryNode, secondLibraryNode);
TargetGraph targetGraph = TargetGraphFactory.newInstance(nodes);
ImmutableSet<BuildTarget> testInput = ImmutableSet.of(libraryTarget, javaTarget);
ImmutableSet<BuildTarget> transitiveDependencies =
auditDependenciesCommand.getTransitiveDependencies(testInput, targetGraph);
ImmutableSet<BuildTarget> expectedOutput =
ImmutableSet.of(secondLibraryTarget, secondJavaTarget, thirdJavaTarget);
assertEquals(expectedOutput, transitiveDependencies);
}
@Test
public void testGetImmediateDependenciesIncludesExtraDependencies() throws IOException {
BuildTarget thirdJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-three");
TargetNode<?> thirdJavaNode = JavaLibraryBuilder
.createBuilder(thirdJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryThree.java"))
.build();
BuildTarget secondJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-two");
TargetNode<?> secondJavaNode = JavaLibraryBuilder
.createBuilder(secondJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryTwo.java"))
.build();
BuildTarget javaTarget = BuildTargetFactory.newInstance("//:test-java-library");
TargetNode<?> javaNode = JavaLibraryBuilder
.createBuilder(javaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibrary.java"))
.addExportedDep(thirdJavaTarget)
.addDep(secondJavaTarget)
.build();
ImmutableSet<TargetNode<?>> nodes =
ImmutableSet.of(javaNode, secondJavaNode, thirdJavaNode);
TargetGraph targetGraph = TargetGraphFactory.newInstance(nodes);
ImmutableSet<BuildTarget> testInput = ImmutableSet.of(javaTarget);
ImmutableSet<BuildTarget> transitiveDependencies =
auditDependenciesCommand.getImmediateDependencies(testInput, targetGraph);
ImmutableSet<BuildTarget> expectedOutput =
ImmutableSet.of(secondJavaTarget, thirdJavaTarget);
assertEquals(expectedOutput, transitiveDependencies);
}
@Test
public void testGetTransitiveDependenciesIncludesExtraDependencies() throws IOException {
BuildTarget thirdJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-three");
TargetNode<?> thirdJavaNode = JavaLibraryBuilder
.createBuilder(thirdJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryThree.java"))
.build();
BuildTarget secondJavaTarget = BuildTargetFactory.newInstance("//:test-java-library-two");
TargetNode<?> secondJavaNode = JavaLibraryBuilder
.createBuilder(secondJavaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibraryTwo.java"))
.build();
BuildTarget javaTarget = BuildTargetFactory.newInstance("//:test-java-library");
TargetNode<?> javaNode = JavaLibraryBuilder
.createBuilder(javaTarget)
.addSrc(Paths.get("src/com/facebook/TestJavaLibrary.java"))
.addExportedDep(thirdJavaTarget)
.addDep(secondJavaTarget)
.build();
BuildTarget secondLibraryTarget = BuildTargetFactory.newInstance("//:test-android-library-two");
TargetNode<?> secondLibraryNode = JavaLibraryBuilder
.createBuilder(secondLibraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibraryTwo.java"))
.addExportedDep(javaTarget)
.build();
BuildTarget libraryTarget = BuildTargetFactory.newInstance("//:test-android-library");
TargetNode<?> libraryNode = JavaLibraryBuilder
.createBuilder(libraryTarget)
.addSrc(Paths.get("src/com/facebook/TestAndroidLibrary.java"))
.addDep(secondLibraryTarget)
.build();
ImmutableSet<TargetNode<?>> nodes =
ImmutableSet.of(javaNode, secondJavaNode, thirdJavaNode, libraryNode, secondLibraryNode);
TargetGraph targetGraph = TargetGraphFactory.newInstance(nodes);
ImmutableSet<BuildTarget> testInput = ImmutableSet.of(libraryTarget);
ImmutableSet<BuildTarget> transitiveDependencies =
auditDependenciesCommand.getTransitiveDependencies(testInput, targetGraph);
ImmutableSet<BuildTarget> expectedOutput =
ImmutableSet.of(secondLibraryTarget, javaTarget, secondJavaTarget, thirdJavaTarget);
assertEquals(expectedOutput, transitiveDependencies);
}
}