/* * Copyright 2016-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.model.BuildTarget; import com.facebook.buck.model.BuildTargetFactory; import com.facebook.buck.parser.NoSuchBuildTargetException; 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.FakeSourcePath; import com.facebook.buck.rules.SourcePathResolver; import com.facebook.buck.rules.SourcePathRuleFinder; import com.facebook.buck.rules.TargetGraph; import com.facebook.buck.util.HumanReadableException; import com.facebook.buck.util.MoreCollectors; import com.google.common.collect.ImmutableMap; import org.hamcrest.Matchers; import org.junit.Test; public class WorkerToolTest { @Test public void testCreateWorkerTool() throws NoSuchBuildTargetException { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver)); BuildRule shBinaryRule = new ShBinaryBuilder(BuildTargetFactory.newInstance("//:my_exe")) .setMain(new FakeSourcePath("bin/exe")) .build(resolver); BuildRule workerRule = WorkerToolBuilder.newWorkerToolBuilder(BuildTargetFactory.newInstance("//:worker_rule")) .setExe(shBinaryRule.getBuildTarget()) .setArgs("arg1", "arg2") .build(resolver); assertThat( "getArgs should return the args string supplied in the definition.", "arg1 arg2", Matchers.is(((WorkerTool) workerRule).getArgs(pathResolver))); } @Test public void testCreateWorkerToolWithBadExeValue() throws NoSuchBuildTargetException { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); BuildRule nonBinaryBuildRule = new FakeBuildRule( BuildTargetFactory.newInstance("//:fake"), new SourcePathResolver(new SourcePathRuleFinder(resolver))); resolver.addToIndex(nonBinaryBuildRule); BuildTarget workerTarget = BuildTargetFactory.newInstance("//:worker_rule"); try { WorkerToolBuilder.newWorkerToolBuilder(workerTarget) .setExe(nonBinaryBuildRule.getBuildTarget()) .build(resolver); } catch (HumanReadableException e) { assertThat( e.getHumanReadableErrorMessage(), Matchers.containsString("needs to correspond to a binary rule")); } } @Test public void testArgsWithLocationMacroAffectDependenciesAndExpands() throws Exception { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver)); BuildRule shBinaryRule = new ShBinaryBuilder(BuildTargetFactory.newInstance("//:my_exe")) .setMain(new FakeSourcePath("bin/exe")) .build(resolver); BuildRule exportFileRule = ExportFileBuilder.newExportFileBuilder(BuildTargetFactory.newInstance("//:file")) .setSrc(new FakeSourcePath("file.txt")) .build(resolver); WorkerToolBuilder workerToolBuilder = WorkerToolBuilder.newWorkerToolBuilder(BuildTargetFactory.newInstance("//:worker_rule")) .setExe(shBinaryRule.getBuildTarget()) .setArgs("--input $(location //:file)"); DefaultWorkerTool workerTool = workerToolBuilder.build(resolver); assertThat( workerToolBuilder.findImplicitDeps(), Matchers.hasItem(exportFileRule.getBuildTarget())); assertThat(workerTool.getBuildDeps(), Matchers.hasItems(shBinaryRule, exportFileRule)); assertThat( workerTool.getRuntimeDeps().collect(MoreCollectors.toImmutableSet()), Matchers.hasItems(shBinaryRule.getBuildTarget(), exportFileRule.getBuildTarget())); assertThat( workerTool.getArgs(pathResolver), Matchers.containsString( pathResolver.getAbsolutePath(exportFileRule.getSourcePathToOutput()).toString())); } @Test public void testEnvWithLocationMacroAffectDependenciesAndExpands() throws Exception { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver)); BuildRule shBinaryRule = new ShBinaryBuilder(BuildTargetFactory.newInstance("//:my_exe")) .setMain(new FakeSourcePath("bin/exe")) .build(resolver); BuildRule exportFileRule = ExportFileBuilder.newExportFileBuilder(BuildTargetFactory.newInstance("//:file")) .setSrc(new FakeSourcePath("file.txt")) .build(resolver); WorkerToolBuilder workerToolBuilder = WorkerToolBuilder.newWorkerToolBuilder(BuildTargetFactory.newInstance("//:worker_rule")) .setExe(shBinaryRule.getBuildTarget()) .setEnv(ImmutableMap.of("ENV_VAR_NAME", "$(location //:file)")); DefaultWorkerTool workerTool = workerToolBuilder.build(resolver); assertThat( workerToolBuilder.findImplicitDeps(), Matchers.hasItem(exportFileRule.getBuildTarget())); assertThat(workerTool.getBuildDeps(), Matchers.hasItems(shBinaryRule, exportFileRule)); assertThat( workerTool.getRuntimeDeps().collect(MoreCollectors.toImmutableSet()), Matchers.hasItems(shBinaryRule.getBuildTarget(), exportFileRule.getBuildTarget())); assertThat( workerTool.getTool().getEnvironment(pathResolver), Matchers.hasEntry( "ENV_VAR_NAME", pathResolver.getAbsolutePath(exportFileRule.getSourcePathToOutput()).toString())); } @Test public void testUnderlyingToolIncludesDependenciesAsInputs() throws Exception { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); BuildRule shBinaryRule = new ShBinaryBuilder(BuildTargetFactory.newInstance("//:my_exe")) .setMain(new FakeSourcePath("bin/exe")) .build(resolver); BuildRule exportFileRule = ExportFileBuilder.newExportFileBuilder(BuildTargetFactory.newInstance("//:file")) .setSrc(new FakeSourcePath("file.txt")) .build(resolver); WorkerToolBuilder workerToolBuilder = WorkerToolBuilder.newWorkerToolBuilder(BuildTargetFactory.newInstance("//:worker_rule")) .setExe(shBinaryRule.getBuildTarget()) .setArgs("--input", "$(location //:file)"); WorkerTool workerTool = workerToolBuilder.build(resolver); assertThat( workerTool.getTool().getInputs(), Matchers.hasItem(exportFileRule.getSourcePathToOutput())); } }