/*
* Copyright 2015-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.shell;
import static org.junit.Assert.assertThat;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer;
import com.facebook.buck.rules.FakeSourcePath;
import com.facebook.buck.rules.RuleKey;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePathRuleFinder;
import com.facebook.buck.rules.TargetGraph;
import com.facebook.buck.rules.TargetNode;
import com.facebook.buck.rules.args.Arg;
import com.facebook.buck.rules.keys.DefaultRuleKeyFactory;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.facebook.buck.util.cache.DefaultFileHashCache;
import com.facebook.buck.util.cache.FileHashCache;
import com.facebook.buck.util.cache.StackedFileHashCache;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedSet;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.hamcrest.Matchers;
import org.junit.Test;
public class ShTestDescriptionTest {
@Test
public void argsWithLocationMacro() throws Exception {
BuildRuleResolver resolver =
new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver));
BuildRule dep =
GenruleBuilder.newGenruleBuilder(BuildTargetFactory.newInstance("//:dep"))
.setOut("out")
.build(resolver);
ShTestBuilder shTestBuilder =
new ShTestBuilder(BuildTargetFactory.newInstance("//:rule"))
.setTest(new FakeSourcePath("test.sh"))
.setArgs(ImmutableList.of("$(location //:dep)"));
assertThat(shTestBuilder.findImplicitDeps(), Matchers.hasItem(dep.getBuildTarget()));
ShTest shTest = shTestBuilder.build(resolver);
assertThat(shTest.getBuildDeps(), Matchers.contains(dep));
assertThat(
Arg.stringify(shTest.getArgs(), pathResolver),
Matchers.hasItem(pathResolver.getAbsolutePath(dep.getSourcePathToOutput()).toString()));
}
@Test
public void envWithLocationMacro() throws Exception {
BuildRuleResolver resolver =
new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver));
BuildRule dep =
GenruleBuilder.newGenruleBuilder(BuildTargetFactory.newInstance("//:dep"))
.setOut("out")
.build(resolver);
ShTestBuilder shTestBuilder =
new ShTestBuilder(BuildTargetFactory.newInstance("//:rule"))
.setTest(new FakeSourcePath("test.sh"))
.setEnv(ImmutableMap.of("LOC", "$(location //:dep)"));
assertThat(shTestBuilder.findImplicitDeps(), Matchers.hasItem(dep.getBuildTarget()));
ShTest shTest = shTestBuilder.build(resolver);
assertThat(shTest.getBuildDeps(), Matchers.contains(dep));
assertThat(
Arg.stringify(shTest.getEnv(), pathResolver),
Matchers.equalTo(
ImmutableMap.of(
"LOC", pathResolver.getAbsolutePath(dep.getSourcePathToOutput()).toString())));
}
@Test
public void resourcesAffectRuleKey() throws Exception {
BuildTarget target = BuildTargetFactory.newInstance("//:rule");
ProjectFilesystem filesystem = new FakeProjectFilesystem();
Path resource = filesystem.getPath("resource");
filesystem.touch(resource);
SourcePath test = new FakeSourcePath(filesystem, "some_test");
filesystem.touch(Paths.get("some_test"));
// Create a test rule without resources attached.
BuildRuleResolver resolver =
new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
ShTest shTestWithoutResources =
new ShTestBuilder(target).setTest(test).build(resolver, filesystem);
RuleKey ruleKeyWithoutResource = getRuleKey(shTestWithoutResources);
// Create a rule with a resource attached.
resolver =
new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
ShTest shTestWithResources =
new ShTestBuilder(target)
.setTest(test)
.setResources(ImmutableSortedSet.of(resource))
.build(resolver, filesystem);
RuleKey ruleKeyWithResource = getRuleKey(shTestWithResources);
// Verify that their rule keys are different.
assertThat(ruleKeyWithoutResource, Matchers.not(Matchers.equalTo(ruleKeyWithResource)));
}
@Test
public void resourcesAreInputs() throws Exception {
BuildTarget target = BuildTargetFactory.newInstance("//:rule");
ProjectFilesystem filesystem = new FakeProjectFilesystem();
Path resource = filesystem.getPath("resource");
filesystem.touch(resource);
TargetNode<?, ?> shTestWithResources =
new ShTestBuilder(target)
.setTest(new FakeSourcePath(filesystem, "some_test"))
.setResources(ImmutableSortedSet.of(resource))
.build();
assertThat(shTestWithResources.getInputs(), Matchers.hasItem(resource));
}
private RuleKey getRuleKey(BuildRule rule) {
BuildRuleResolver resolver =
new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(resolver);
SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder);
FileHashCache fileHashCache =
new StackedFileHashCache(
ImmutableList.of(
DefaultFileHashCache.createDefaultFileHashCache(rule.getProjectFilesystem())));
DefaultRuleKeyFactory factory =
new DefaultRuleKeyFactory(0, fileHashCache, pathResolver, ruleFinder);
return factory.build(rule);
}
}