blob: a0fc18ae5296ffd52d716e762a38ffdec78862a2 [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 com.facebook.buck.util.BuckConstant.GEN_DIR;
import static org.junit.Assert.assertEquals;
import com.facebook.buck.android.AndroidBinaryRule;
import com.facebook.buck.event.BuckEventBus;
import com.facebook.buck.event.BuckEventBusFactory;
import com.facebook.buck.java.DefaultJavaLibraryRule;
import com.facebook.buck.java.JavaTestRule;
import com.facebook.buck.java.Keystore;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.parser.PartialGraph;
import com.facebook.buck.parser.PartialGraphFactory;
import com.facebook.buck.rules.ArtifactCache;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.DependencyGraph;
import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
import com.facebook.buck.rules.KnownBuildRuleTypes;
import com.facebook.buck.rules.NoopArtifactCache;
import com.facebook.buck.testutil.BuckTestConstant;
import com.facebook.buck.testutil.RuleMap;
import com.facebook.buck.testutil.TestConsole;
import com.facebook.buck.util.ProjectFilesystem;
import com.facebook.buck.util.environment.Platform;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.SortedSet;
public class AuditClasspathCommandTest {
private final String projectRootPath = ".";
private final File projectRoot = new File(projectRootPath);
private TestConsole console;
private AuditClasspathCommand auditClasspathCommand;
@Before
public void setUp() {
console = new TestConsole();
ProjectFilesystem projectFilesystem = new ProjectFilesystem(projectRoot);
KnownBuildRuleTypes buildRuleTypes = new KnownBuildRuleTypes();
ArtifactCache artifactCache = new NoopArtifactCache();
BuckEventBus eventBus = BuckEventBusFactory.newInstance();
auditClasspathCommand = new AuditClasspathCommand(new CommandRunnerParams(
console,
projectFilesystem,
buildRuleTypes,
new InstanceArtifactCacheFactory(artifactCache),
eventBus,
BuckTestConstant.PYTHON_INTERPRETER,
Platform.detect()));
}
private PartialGraph createGraphFromBuildRules(BuildRuleResolver ruleResolver,
List<String> targets) {
List<BuildTarget> buildTargets = Lists.transform(targets, new Function<String, BuildTarget>() {
@Override
public BuildTarget apply(String target) {
return BuildTargetFactory.newInstance(target);
}
});
DependencyGraph dependencyGraph = RuleMap.createGraphFromBuildRules(ruleResolver);
return PartialGraphFactory.newInstance(dependencyGraph, buildTargets);
}
@Test
public void testClassPathOutput() {
// Build a DependencyGraph of build rules manually.
BuildRuleResolver ruleResolver = new BuildRuleResolver();
List<String> targets = Lists.newArrayList();
// Test that no output is created.
PartialGraph partialGraph1 = createGraphFromBuildRules(ruleResolver, targets);
auditClasspathCommand.printClasspath(partialGraph1);
assertEquals("", console.getTextWrittenToStdOut());
assertEquals("", console.getTextWrittenToStdErr());
// Add build rules such that all implementations of HasClasspathEntries are tested.
ruleResolver.buildAndAddToIndex(
DefaultJavaLibraryRule.newJavaLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(BuildTargetFactory.newInstance("//:test-java-library"))
.addSrc("src/com/facebook/TestJavaLibrary.java"));
ruleResolver.buildAndAddToIndex(
DefaultJavaLibraryRule.newJavaLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(BuildTargetFactory.newInstance("//:test-android-library"))
.addSrc("src/com/facebook/TestAndroidLibrary.java")
.addDep(BuildTargetFactory.newInstance("//:test-java-library")));
BuildTarget keystoreBuildTarget = BuildTargetFactory.newInstance("//:keystore");
ruleResolver.buildAndAddToIndex(
Keystore.newKeystoreBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(keystoreBuildTarget)
.setStore("debug.keystore")
.setProperties("keystore.properties"));
ruleResolver.buildAndAddToIndex(
AndroidBinaryRule.newAndroidBinaryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(BuildTargetFactory.newInstance("//:test-android-binary"))
.setManifest("AndroidManifest.xml")
.setTarget("Google Inc.:Google APIs:16")
.setKeystore(keystoreBuildTarget)
.addClasspathDep(BuildTargetFactory.newInstance("//:test-android-library"))
.addClasspathDep(BuildTargetFactory.newInstance("//:test-java-library")));
ruleResolver.buildAndAddToIndex(
JavaTestRule.newJavaTestRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(BuildTargetFactory.newInstance("//:project-tests"))
.addDep(BuildTargetFactory.newInstance("//:test-java-library"))
.setSourceUnderTest(ImmutableSet.of(BuildTargetFactory.newInstance("//:test-java-library")))
.addSrc("src/com/facebook/test/ProjectTests.java"));
PartialGraph partialGraph2 = createGraphFromBuildRules(ruleResolver, targets);
auditClasspathCommand.printClasspath(partialGraph2);
// Still empty.
assertEquals("", console.getTextWrittenToStdOut());
assertEquals("", console.getTextWrittenToStdErr());
// Request the top build target. This will test the following:
// - paths don't appear multiple times when dependencies are referenced multiple times.
// - dependencies are walked
// - independent targets in the same BUCK file are not included in the output
targets.add("//:test-android-binary");
PartialGraph partialGraph3 = createGraphFromBuildRules(ruleResolver, targets);
auditClasspathCommand.printClasspath(partialGraph3);
SortedSet<String> expectedPaths = Sets.newTreeSet(
Arrays.asList(
GEN_DIR + "/lib__test-android-library__output/test-android-library.jar",
GEN_DIR + "/lib__test-java-library__output/test-java-library.jar"
)
);
String expectedClasspath = Joiner.on("\n").join(expectedPaths) + "\n";
assertEquals(expectedClasspath, console.getTextWrittenToStdOut());
assertEquals("", console.getTextWrittenToStdErr());
// Add independent test target. This will test:
// - the union of the classpath is output.
// - all rules have implemented HasClasspathEntries.
// Note that the output streams are reset.
setUp();
targets.add("//:test-java-library");
targets.add("//:test-android-library");
targets.add("//:project-tests");
PartialGraph partialGraph4 = createGraphFromBuildRules(ruleResolver, targets);
auditClasspathCommand.printClasspath(partialGraph4);
expectedPaths.add(GEN_DIR + "/lib__project-tests__output/project-tests.jar");
expectedClasspath = Joiner.on("\n").join(expectedPaths) + "\n";
assertEquals(expectedClasspath, console.getTextWrittenToStdOut());
assertEquals("", console.getTextWrittenToStdErr());
}
}