/*
* 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.rules;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assume.assumeTrue;
import com.facebook.buck.rules.keys.DefaultRuleKeyFactory;
import com.facebook.buck.testutil.FakeFileHashCache;
import com.facebook.buck.util.environment.Platform;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.common.hash.HashCode;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.Test;
public class ToolTest {
@Test
public void hashFileToolsCreatedWithTheSamePathAreEqual() {
SourcePathRuleFinder ruleFinder =
new SourcePathRuleFinder(
new BuildRuleResolver(
TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()));
SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder);
DefaultRuleKeyFactory ruleKeyFactory =
new DefaultRuleKeyFactory(
0,
FakeFileHashCache.createFromStrings(
ImmutableMap.<String, String>builder()
.put("path", Strings.repeat("a", 40))
.put("other-path", Strings.repeat("b", 40))
.put("same", Strings.repeat("a", 40))
.build()),
pathResolver,
ruleFinder);
Path path = Paths.get("path");
Path otherPath = Paths.get("other-path");
Path same = Paths.get("same");
Tool tool1 = new HashedFileTool(path);
RuleKey tool1RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool1)
.build(RuleKey::new);
Tool tool2 = new HashedFileTool(path);
RuleKey tool2RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool2)
.build(RuleKey::new);
// Same name, same sha1
assertEquals(tool1RuleKey, tool2RuleKey);
Tool tool3 = new HashedFileTool(otherPath);
RuleKey tool3RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool3)
.build(RuleKey::new);
// Different name, different sha1
assertNotEquals(tool1RuleKey, tool3RuleKey);
Tool tool4 = new HashedFileTool(same);
RuleKey tool4RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool4)
.build(RuleKey::new);
// Different name, same sha1
assertNotEquals(tool1RuleKey, tool4RuleKey);
}
@Test
public void customVersion() {
SourcePathRuleFinder ruleFinder =
new SourcePathRuleFinder(
new BuildRuleResolver(
TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()));
SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder);
DefaultRuleKeyFactory ruleKeyFactory =
new DefaultRuleKeyFactory(
0, FakeFileHashCache.createFromStrings(ImmutableMap.of()), pathResolver, ruleFinder);
String tool = "tool";
String version = "version";
Tool tool1 = VersionedTool.of(Paths.get("something"), tool, version);
RuleKey tool1RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool1)
.build(RuleKey::new);
Tool tool2 = VersionedTool.of(Paths.get("something-else"), tool, version);
RuleKey tool2RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool2)
.build(RuleKey::new);
assertEquals(tool1RuleKey, tool2RuleKey);
}
@Test
public void shouldAssumeThatToolsInDifferentAbsoluteLocationsWithTheSameNameAreTheSame() {
assumeTrue(Platform.detect() == Platform.MACOS || Platform.detect() == Platform.LINUX);
// Note: both file names are the same
HashedFileTool tool1 = new HashedFileTool(Paths.get("/usr/local/bin/python2.7"));
HashedFileTool tool2 = new HashedFileTool(Paths.get("/opt/bin/python2.7"));
SourcePathRuleFinder ruleFinder =
new SourcePathRuleFinder(
new BuildRuleResolver(
TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()));
SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder);
DefaultRuleKeyFactory ruleKeyFactory =
new DefaultRuleKeyFactory(
0,
FakeFileHashCache.createFromStrings(
ImmutableMap.<String, String>builder()
// Note: the hashes of both files are the same
.put("/usr/local/bin/python2.7", Strings.repeat("a", 40))
.put("/opt/bin/python2.7", Strings.repeat("a", 40))
.build()),
pathResolver,
ruleFinder);
RuleKey tool1RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool1)
.build(RuleKey::new);
RuleKey tool2RuleKey =
createRuleKeyBuilder(ruleKeyFactory, pathResolver)
.setReflectively("tool", tool2)
.build(RuleKey::new);
assertEquals(tool1RuleKey, tool2RuleKey);
}
private DefaultRuleKeyFactory.Builder<HashCode> createRuleKeyBuilder(
DefaultRuleKeyFactory factory, SourcePathResolver resolver) {
return factory.newBuilderForTesting(new FakeBuildRule("//:test", resolver));
}
}