blob: a235e25a48e078d470c3cb9dcca7172aa7b1c7d5 [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 static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import com.facebook.buck.command.Project;
import com.facebook.buck.event.BuckEventBusFactory;
import com.facebook.buck.graph.MutableDirectedGraph;
import com.facebook.buck.java.DefaultJavaLibraryRule;
import com.facebook.buck.json.BuildFileParseException;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.parser.BuildTargetParser;
import com.facebook.buck.parser.NoSuchBuildTargetException;
import com.facebook.buck.parser.PartialGraph;
import com.facebook.buck.parser.PartialGraphFactory;
import com.facebook.buck.parser.RawRulePredicate;
import com.facebook.buck.rules.ArtifactCache;
import com.facebook.buck.rules.BuildRule;
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.rules.ProjectConfigRule;
import com.facebook.buck.testutil.BuckTestConstant;
import com.facebook.buck.testutil.MoreAsserts;
import com.facebook.buck.testutil.TestConsole;
import com.facebook.buck.util.ProcessExecutor;
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.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.easymock.EasyMock;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.List;
public class ProjectCommandTest {
private static final ImmutableMap<String, Object> EMPTY_PARSE_DATA = ImmutableMap.of();
private static final ArtifactCache artifactCache = new NoopArtifactCache();
@Test
public void testBasicProjectCommand() throws Exception {
BuildRuleResolver ruleResolver = new BuildRuleResolver();
BuildTarget javaLibraryTargetName = BuildTargetFactory.newInstance("//javasrc:java-library");
DefaultJavaLibraryRule javaLibraryRule = ruleResolver.buildAndAddToIndex(
DefaultJavaLibraryRule.newJavaLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(javaLibraryTargetName)
.addSrc("javasrc/JavaLibrary.java"));
String projectConfigTargetName = "//javasrc:project-config";
ProjectConfigRule ruleConfig = ruleResolver.buildAndAddToIndex(
ProjectConfigRule.newProjectConfigRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(BuildTargetFactory.newInstance(projectConfigTargetName))
.setSrcTarget(Optional.of(javaLibraryTargetName)));
BuckConfig buckConfig = createBuckConfig(
Joiner.on("\n").join(
"[project]",
"initial_targets = " + javaLibraryTargetName));
ProjectCommandForTest command = new ProjectCommandForTest();
command.createPartialGraphCallReturnValues.push(
createGraphFromBuildRules(ImmutableList.<BuildRule>of(ruleConfig)));
command.runCommandWithOptions(createOptions(buckConfig));
assertTrue(command.createPartialGraphCallReturnValues.isEmpty());
// The PartialGraph comprises build config rules.
RawRulePredicate projectConfigPredicate = command.createPartialGraphCallPredicates.get(0);
checkPredicate(projectConfigPredicate, EMPTY_PARSE_DATA, javaLibraryRule, false);
checkPredicate(projectConfigPredicate, EMPTY_PARSE_DATA, ruleConfig, true);
BuildCommandOptions buildOptions = command.buildCommandOptions;
MoreAsserts.assertContainsOne(
buildOptions.getArguments(), javaLibraryTargetName.getFullyQualifiedName());
}
BuckConfig createBuckConfig(String contents)
throws IOException, NoSuchBuildTargetException {
ProjectFilesystem dummyProjectFilesystem = EasyMock.createMock(ProjectFilesystem.class);
EasyMock.replay(dummyProjectFilesystem);
return BuckConfig.createFromReader(
new StringReader(contents),
dummyProjectFilesystem,
new BuildTargetParser(dummyProjectFilesystem),
Platform.detect());
}
private static void checkPredicate(
RawRulePredicate predicate,
ImmutableMap<String, Object> rawParseData,
BuildRule rule,
boolean expectMatch) {
assertEquals(
expectMatch,
predicate.isMatch(rawParseData, rule.getType(), rule.getBuildTarget()));
}
private ProjectCommandOptions createOptions(BuckConfig buckConfig) {
return new ProjectCommandOptions(buckConfig);
}
private PartialGraph createGraphFromBuildRules(List<BuildRule> rules) {
MutableDirectedGraph<BuildRule> graph = new MutableDirectedGraph<>();
for (BuildRule rule : rules) {
for (BuildRule dep : rule.getDeps()) {
graph.addEdge(rule, dep);
}
}
List<BuildTarget> buildTargets = Lists.transform(rules, new Function<BuildRule, BuildTarget>() {
@Override
public BuildTarget apply(BuildRule rule) {
return rule.getBuildTarget();
}
});
DependencyGraph dependencyGraph = new DependencyGraph(graph);
return PartialGraphFactory.newInstance(dependencyGraph, buildTargets);
}
/**
* A subclass of ProjectCommand that captures some of the calls we want to verify
* without actually running them.
*
* This code ends up being simpler than the equivalent EasyMock version. And I hit what
* appears to be a bug in EasyMock.
*/
private static class ProjectCommandForTest extends ProjectCommand {
private List<RawRulePredicate> createPartialGraphCallPredicates = Lists.newArrayList();
private LinkedList<PartialGraph> createPartialGraphCallReturnValues = Lists.newLinkedList();
private BuildCommandOptions buildCommandOptions;
ProjectCommandForTest() {
super(new CommandRunnerParams(
new TestConsole(),
new ProjectFilesystem(new File(".")),
new KnownBuildRuleTypes(),
new InstanceArtifactCacheFactory(artifactCache),
BuckEventBusFactory.newInstance(),
BuckTestConstant.PYTHON_INTERPRETER,
Platform.detect()));
}
@Override
PartialGraph createPartialGraph(RawRulePredicate rulePredicate, ProjectCommandOptions options)
throws BuildFileParseException, NoSuchBuildTargetException {
assertNotNull(options);
createPartialGraphCallPredicates.add(rulePredicate);
return createPartialGraphCallReturnValues.removeFirst();
}
@Override
int createIntellijProject(Project project,
File jsonTemplate,
ProcessExecutor processExecutor,
PrintStream stdOut,
PrintStream stdErr)
throws IOException {
assertNotNull(project);
assertNotNull(jsonTemplate);
assertNotNull(processExecutor);
assertNotNull(stdOut);
assertNotNull(stdErr);
return 0;
}
@Override
int runBuildCommand(BuildCommand buildCommand, BuildCommandOptions options)
throws IOException {
assertNotNull(buildCommand);
assertNotNull(options);
assertNull(buildCommandOptions);
buildCommandOptions = options;
return 0;
}
}
}