/*
* Copyright 2014-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.rules.BuildRuleSuccessType.BUILT_LOCALLY;
import static com.facebook.buck.rules.BuildRuleSuccessType.FETCHED_FROM_CACHE;
import static org.junit.Assert.assertEquals;
import com.facebook.buck.artifact_cache.CacheResult;
import com.facebook.buck.command.BuildExecutionResult;
import com.facebook.buck.command.BuildReport;
import com.facebook.buck.io.MorePaths;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.BuildResult;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer;
import com.facebook.buck.rules.FakeBuildRule;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePathRuleFinder;
import com.facebook.buck.rules.TargetGraph;
import com.facebook.buck.testutil.TestConsole;
import com.facebook.buck.util.Ansi;
import com.facebook.buck.util.CapturingPrintStream;
import com.facebook.buck.util.Console;
import com.facebook.buck.util.ObjectMappers;
import com.facebook.buck.util.Verbosity;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
public class BuildCommandTest {
private BuildExecutionResult buildExecutionResult;
private SourcePathResolver resolver;
@Before
public void setUp() {
BuildRuleResolver ruleResolver =
new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
resolver = new SourcePathResolver(new SourcePathRuleFinder(ruleResolver));
LinkedHashMap<BuildRule, Optional<BuildResult>> ruleToResult = new LinkedHashMap<>();
FakeBuildRule rule1 =
new FakeBuildRule(BuildTargetFactory.newInstance("//fake:rule1"), resolver);
rule1.setOutputFile("buck-out/gen/fake/rule1.txt");
ruleResolver.addToIndex(rule1);
ruleToResult.put(
rule1, Optional.of(BuildResult.success(rule1, BUILT_LOCALLY, CacheResult.miss())));
BuildRule rule2 = new FakeBuildRule(BuildTargetFactory.newInstance("//fake:rule2"), resolver);
BuildResult rule2Failure = BuildResult.failure(rule2, new RuntimeException("some"));
ruleToResult.put(rule2, Optional.of(rule2Failure));
ruleResolver.addToIndex(rule2);
BuildRule rule3 = new FakeBuildRule(BuildTargetFactory.newInstance("//fake:rule3"), resolver);
ruleToResult.put(
rule3, Optional.of(BuildResult.success(rule3, FETCHED_FROM_CACHE, CacheResult.hit("dir"))));
ruleResolver.addToIndex(rule3);
BuildRule rule4 = new FakeBuildRule(BuildTargetFactory.newInstance("//fake:rule4"), resolver);
ruleToResult.put(rule4, Optional.empty());
ruleResolver.addToIndex(rule4);
buildExecutionResult =
BuildExecutionResult.builder()
.setResults(ruleToResult)
.setFailures(ImmutableSet.of(rule2Failure))
.build();
}
@Test
public void testGenerateBuildReportForConsole() {
String expectedReport =
"\u001B[1m\u001B[42m\u001B[30mOK \u001B[0m //fake:rule1 "
+ "BUILT_LOCALLY "
+ MorePaths.pathWithPlatformSeparators("buck-out/gen/fake/rule1.txt")
+ "\n"
+ "\u001B[31mFAIL\u001B[0m //fake:rule2\n"
+ "\u001B[1m\u001B[42m\u001B[30mOK \u001B[0m //fake:rule3 FETCHED_FROM_CACHE\n"
+ "\u001B[31mFAIL\u001B[0m //fake:rule4\n";
String observedReport =
new BuildReport(buildExecutionResult, resolver)
.generateForConsole(
new Console(
Verbosity.STANDARD_INFORMATION,
new CapturingPrintStream(),
new CapturingPrintStream(),
Ansi.forceTty()));
assertEquals(expectedReport, observedReport);
}
@Test
public void testGenerateVerboseBuildReportForConsole() {
String expectedReport =
"OK //fake:rule1 BUILT_LOCALLY "
+ MorePaths.pathWithPlatformSeparators("buck-out/gen/fake/rule1.txt")
+ "\n"
+ "FAIL //fake:rule2\n"
+ "OK //fake:rule3 FETCHED_FROM_CACHE\n"
+ "FAIL //fake:rule4\n\n"
+ " ** Summary of failures encountered during the build **\n"
+ "Rule //fake:rule2 FAILED because some.\n";
String observedReport =
new BuildReport(buildExecutionResult, resolver)
.generateForConsole(new TestConsole(Verbosity.COMMANDS));
assertEquals(expectedReport, observedReport);
}
@Test
public void testGenerateJsonBuildReport() throws IOException {
String rule1TxtPath =
ObjectMappers.legacyCreate()
.valueToTree(MorePaths.pathWithPlatformSeparators("buck-out/gen/fake/rule1.txt"))
.toString();
String expectedReport =
Joiner.on(System.lineSeparator())
.join(
"{",
" \"success\" : false,",
" \"results\" : {",
" \"//fake:rule1\" : {",
" \"success\" : true,",
" \"type\" : \"BUILT_LOCALLY\",",
" \"output\" : " + rule1TxtPath,
" },",
" \"//fake:rule2\" : {",
" \"success\" : false",
" },",
" \"//fake:rule3\" : {",
" \"success\" : true,",
" \"type\" : \"FETCHED_FROM_CACHE\",",
" \"output\" : null",
" },",
" \"//fake:rule4\" : {",
" \"success\" : false",
" }",
" },",
" \"failures\" : {",
" \"//fake:rule2\" : \"some\"",
" }",
"}");
String observedReport =
new BuildReport(buildExecutionResult, resolver).generateJsonBuildReport();
assertEquals(expectedReport, observedReport);
}
}