use of com.facebook.buck.rules.FakeBuildableContext in project buck by facebook.
the class GenAidlTest method testSimpleGenAidlRule.
@Test
public void testSimpleGenAidlRule() throws IOException {
ProjectFilesystem stubFilesystem = FakeProjectFilesystem.createJavaOnlyFilesystem();
Files.createDirectories(stubFilesystem.getRootPath().resolve("java/com/example/base"));
FakeSourcePath pathToAidl = new FakeSourcePath(stubFilesystem, "java/com/example/base/IWhateverService.aidl");
String importPath = Paths.get("java/com/example/base").toString();
BuildTarget target = BuildTargetFactory.newInstance(stubFilesystem.getRootPath(), "//java/com/example/base:IWhateverService");
BuildRuleParams params = new FakeBuildRuleParamsBuilder(target).setProjectFilesystem(stubFilesystem).build();
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer())));
GenAidl genAidlRule = new GenAidl(params, pathToAidl, importPath);
GenAidlDescription description = new GenAidlDescription();
assertEquals(Description.getBuildRuleType(GenAidlDescription.class), Description.getBuildRuleType(description));
assertTrue(genAidlRule.getProperties().is(ANDROID));
List<Step> steps = genAidlRule.getBuildSteps(FakeBuildContext.withSourcePathResolver(pathResolver), new FakeBuildableContext());
final String pathToAidlExecutable = Paths.get("/usr/local/bin/aidl").toString();
final String pathToFrameworkAidl = Paths.get("/home/root/android/platforms/android-16/framework.aidl").toString();
final AndroidPlatformTarget androidPlatformTarget = createMock(AndroidPlatformTarget.class);
expect(androidPlatformTarget.getAidlExecutable()).andReturn(Paths.get(pathToAidlExecutable));
expect(androidPlatformTarget.getAndroidFrameworkIdlFile()).andReturn(Paths.get(pathToFrameworkAidl));
replay(androidPlatformTarget);
ExecutionContext executionContext = TestExecutionContext.newBuilder().setAndroidPlatformTargetSupplier(Suppliers.ofInstance(androidPlatformTarget)).build();
assertEquals(executionContext.getAndroidPlatformTarget(), androidPlatformTarget);
Path outputDirectory = BuildTargets.getScratchPath(stubFilesystem, target, "__%s.aidl");
MakeCleanDirectoryStep mkdirStep = (MakeCleanDirectoryStep) steps.get(1);
assertEquals("gen_aidl() should make a directory at " + outputDirectory, outputDirectory, mkdirStep.getPath());
ShellStep aidlStep = (ShellStep) steps.get(2);
assertEquals("gen_aidl() should use the aidl binary to write .java files.", String.format("(cd %s && %s -p%s -I%s -o%s %s)", stubFilesystem.getRootPath(), pathToAidlExecutable, pathToFrameworkAidl, stubFilesystem.resolve(importPath), stubFilesystem.resolve(outputDirectory), pathToAidl.getRelativePath()), aidlStep.getDescription(executionContext));
assertEquals(5, steps.size());
verify(androidPlatformTarget);
}
use of com.facebook.buck.rules.FakeBuildableContext in project buck by facebook.
the class ApkGenruleTest method testCreateAndRunApkGenrule.
@Test
@SuppressWarnings("PMD.AvoidUsingHardCodedIP")
public void testCreateAndRunApkGenrule() throws IOException, NoSuchBuildTargetException {
ProjectFilesystem projectFilesystem = FakeProjectFilesystem.createJavaOnlyFilesystem();
FileSystem fileSystem = projectFilesystem.getRootPath().getFileSystem();
BuildRuleResolver ruleResolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
createSampleAndroidBinaryRule(ruleResolver, projectFilesystem);
// From the Python object, create a ApkGenruleBuildRuleFactory to create a ApkGenrule.Builder
// that builds a ApkGenrule from the Python object.
BuildTargetParser parser = EasyMock.createNiceMock(BuildTargetParser.class);
final BuildTarget apkTarget = BuildTargetFactory.newInstance(projectFilesystem.getRootPath(), "//:fb4a");
EasyMock.expect(parser.parse(EasyMock.eq(":fb4a"), EasyMock.anyObject(BuildTargetPatternParser.class), EasyMock.anyObject())).andStubReturn(apkTarget);
EasyMock.replay(parser);
BuildTarget buildTarget = BuildTargetFactory.newInstance(projectFilesystem.getRootPath(), "//src/com/facebook:sign_fb4a");
ApkGenruleDescription description = new ApkGenruleDescription();
ApkGenruleDescription.Arg arg = description.createUnpopulatedConstructorArg();
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(ruleResolver));
arg.apk = new FakeInstallable(apkTarget, pathResolver).getBuildTarget();
arg.bash = Optional.of("");
arg.cmd = Optional.of("python signer.py $APK key.properties > $OUT");
arg.cmdExe = Optional.of("");
arg.type = Optional.empty();
arg.out = "signed_fb4a.apk";
arg.srcs = ImmutableList.of(new PathSourcePath(projectFilesystem, fileSystem.getPath("src/com/facebook/signer.py")), new PathSourcePath(projectFilesystem, fileSystem.getPath("src/com/facebook/key.properties")));
arg.tests = ImmutableSortedSet.of();
BuildRuleParams params = new FakeBuildRuleParamsBuilder(buildTarget).setProjectFilesystem(projectFilesystem).build();
ApkGenrule apkGenrule = (ApkGenrule) description.createBuildRule(TargetGraph.EMPTY, params, ruleResolver, arg);
ruleResolver.addToIndex(apkGenrule);
// Verify all of the observers of the Genrule.
String expectedApkOutput = projectFilesystem.resolve(projectFilesystem.getBuckPaths().getGenDir().toString() + "/src/com/facebook/sign_fb4a/sign_fb4a.apk").toString();
assertEquals(expectedApkOutput, apkGenrule.getAbsoluteOutputFilePath(pathResolver));
assertEquals("The apk that this rule is modifying must have the apk in its deps.", ImmutableSet.of(apkTarget.toString()), apkGenrule.getDeps().stream().map(Object::toString).collect(MoreCollectors.toImmutableSet()));
BuildContext buildContext = FakeBuildContext.withSourcePathResolver(pathResolver);
Iterable<Path> expectedInputsToCompareToOutputs = ImmutableList.of(fileSystem.getPath("src/com/facebook/signer.py"), fileSystem.getPath("src/com/facebook/key.properties"));
MoreAsserts.assertIterablesEquals(expectedInputsToCompareToOutputs, pathResolver.filterInputsToCompareToOutput(apkGenrule.getSrcs()));
// Verify that the shell commands that the genrule produces are correct.
List<Step> steps = apkGenrule.getBuildSteps(buildContext, new FakeBuildableContext());
assertEquals(6, steps.size());
ExecutionContext executionContext = newEmptyExecutionContext();
Step firstStep = steps.get(0);
assertTrue(firstStep instanceof MakeCleanDirectoryStep);
MakeCleanDirectoryStep mkdirCommand = (MakeCleanDirectoryStep) firstStep;
Path mkdirDir = projectFilesystem.getBuckPaths().getGenDir().resolve("src/com/facebook/sign_fb4a");
assertEquals("First command should make sure the output directory exists and is empty.", mkdirDir, mkdirCommand.getPath());
Step secondStep = steps.get(1);
assertTrue(secondStep instanceof MakeCleanDirectoryStep);
MakeCleanDirectoryStep secondMkdirCommand = (MakeCleanDirectoryStep) secondStep;
Path relativePathToTmpDir = projectFilesystem.getBuckPaths().getGenDir().resolve("src/com/facebook/sign_fb4a__tmp");
assertEquals("Second command should make sure the temp directory exists.", relativePathToTmpDir, secondMkdirCommand.getPath());
Step thirdStep = steps.get(2);
assertTrue(thirdStep instanceof MakeCleanDirectoryStep);
MakeCleanDirectoryStep thirdMkdirCommand = (MakeCleanDirectoryStep) thirdStep;
Path relativePathToSrcDir = projectFilesystem.getBuckPaths().getGenDir().resolve("src/com/facebook/sign_fb4a__srcs");
assertEquals("Third command should make sure the temp directory exists.", relativePathToSrcDir, thirdMkdirCommand.getPath());
MkdirAndSymlinkFileStep linkSource1 = (MkdirAndSymlinkFileStep) steps.get(3);
assertEquals(fileSystem.getPath("src/com/facebook/signer.py"), linkSource1.getSource());
assertEquals(fileSystem.getPath(relativePathToSrcDir + "/signer.py"), linkSource1.getTarget());
MkdirAndSymlinkFileStep linkSource2 = (MkdirAndSymlinkFileStep) steps.get(4);
assertEquals(fileSystem.getPath("src/com/facebook/key.properties"), linkSource2.getSource());
assertEquals(fileSystem.getPath(relativePathToSrcDir + "/key.properties"), linkSource2.getTarget());
Step sixthStep = steps.get(5);
assertTrue(sixthStep instanceof AbstractGenruleStep);
AbstractGenruleStep genruleCommand = (AbstractGenruleStep) sixthStep;
assertEquals("genrule", genruleCommand.getShortName());
ImmutableMap<String, String> environmentVariables = genruleCommand.getEnvironmentVariables(executionContext);
assertEquals(new ImmutableMap.Builder<String, String>().put("APK", projectFilesystem.resolve(BuildTargets.getGenPath(projectFilesystem, apkTarget, "%s.apk")).toString()).put("OUT", expectedApkOutput).build(), environmentVariables);
Path scriptFilePath = genruleCommand.getScriptFilePath(executionContext);
String scriptFileContents = genruleCommand.getScriptFileContents(executionContext);
assertEquals(ImmutableList.of("/bin/bash", "-e", scriptFilePath.toString()), genruleCommand.getShellCommand(executionContext));
assertEquals("python signer.py $APK key.properties > $OUT", scriptFileContents);
EasyMock.verify(parser);
}
use of com.facebook.buck.rules.FakeBuildableContext in project buck by facebook.
the class AssembleDirectoriesTest method testAssembleFoldersWithRelativePath.
@Test
public void testAssembleFoldersWithRelativePath() throws IOException, InterruptedException {
Path tmp = filesystem.getRootPath();
Files.createDirectories(tmp.resolve("folder_a"));
Files.write(tmp.resolve("folder_a/a.txt"), "".getBytes(UTF_8));
Files.write(tmp.resolve("folder_a/b.txt"), "".getBytes(UTF_8));
Files.createDirectories(tmp.resolve("folder_b"));
Files.write(tmp.resolve("folder_b/c.txt"), "".getBytes(UTF_8));
Files.write(tmp.resolve("folder_b/d.txt"), "".getBytes(UTF_8));
BuildTarget target = BuildTargetFactory.newInstance(filesystem.getRootPath(), "//:output_folder");
BuildRuleParams buildRuleParams = new FakeBuildRuleParamsBuilder(target).setProjectFilesystem(filesystem).build();
ImmutableList<SourcePath> directories = ImmutableList.of(new FakeSourcePath(filesystem, "folder_a"), new FakeSourcePath(filesystem, "folder_b"));
BuildRuleResolver ruleResolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(ruleResolver));
AssembleDirectories assembleDirectories = new AssembleDirectories(buildRuleParams, directories);
ruleResolver.addToIndex(assembleDirectories);
ImmutableList<Step> steps = assembleDirectories.getBuildSteps(FakeBuildContext.withSourcePathResolver(pathResolver), new FakeBuildableContext());
for (Step step : steps) {
assertEquals(0, step.execute(context).getExitCode());
}
Path outputFile = pathResolver.getAbsolutePath(assembleDirectories.getSourcePathToOutput());
try (DirectoryStream<Path> dir = Files.newDirectoryStream(outputFile)) {
assertEquals(4, Iterables.size(dir));
}
}
use of com.facebook.buck.rules.FakeBuildableContext in project buck by facebook.
the class DuplicateResourcesTest method getAaptStepShellCommand.
private ImmutableList<String> getAaptStepShellCommand(TargetNode<AndroidBinaryDescription.Arg, AndroidBinaryDescription> binary) {
TargetGraph targetGraph = TargetGraphFactory.newInstance(binary, mainRes, directDepRes, transitiveDepRes, transitiveDepLib, bottomDepRes, library, keystore);
ActionGraphAndResolver actionGraphAndResolver = ActionGraphCache.getFreshActionGraph(BuckEventBusFactory.newInstance(new IncrementingFakeClock(TimeUnit.SECONDS.toNanos(1))), new DefaultTargetNodeToBuildRuleTransformer(), targetGraph);
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(actionGraphAndResolver.getResolver()));
ImmutableSet<ImmutableList<Step>> ruleSteps = RichStream.from(actionGraphAndResolver.getActionGraph().getNodes()).filter(AaptPackageResources.class).filter(r -> androidBinaryTarget.getUnflavoredBuildTarget().equals(r.getBuildTarget().getUnflavoredBuildTarget())).map(b -> b.getBuildSteps(FakeBuildContext.withSourcePathResolver(pathResolver), new FakeBuildableContext())).map(steps -> steps.stream().filter(step -> step instanceof AaptStep).collect(MoreCollectors.toImmutableList())).filter(steps -> !steps.isEmpty()).collect(MoreCollectors.toImmutableSet());
assertEquals(1, ruleSteps.size());
assertEquals(1, Iterables.getOnlyElement(ruleSteps).size());
AaptStep step = (AaptStep) Iterables.getOnlyElement(Iterables.getOnlyElement(ruleSteps));
AndroidDirectoryResolver androidDirectoryResolver = new FakeAndroidDirectoryResolver(Optional.of(filesystem.getPath("/android-sdk")), Optional.of(filesystem.getPath("/android-build-tools")), Optional.empty(), Optional.empty());
AndroidPlatformTarget androidPlatformTarget = AndroidPlatformTarget.createFromDefaultDirectoryStructure("", androidDirectoryResolver, "", ImmutableSet.of(), Optional.empty());
ExecutionContext context = TestExecutionContext.newBuilder().setAndroidPlatformTargetSupplier(Suppliers.ofInstance(androidPlatformTarget)).build();
return step.getShellCommand(context);
}
use of com.facebook.buck.rules.FakeBuildableContext in project buck by facebook.
the class CopyNativeLibrariesTest method testCopyNativeLibrariesCopiesLibDirsInReverseTopoOrder.
@Test
public void testCopyNativeLibrariesCopiesLibDirsInReverseTopoOrder() {
BuildTarget target = BuildTargetFactory.newInstance("//:test");
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer())));
CopyNativeLibraries copyNativeLibraries = new CopyNativeLibraries(new FakeBuildRuleParamsBuilder(target).build(), ImmutableSet.of(new FakeSourcePath("lib1"), new FakeSourcePath("lib2")), ImmutableSet.of(), ImmutableSet.of(), ImmutableSet.of(), "dex");
ImmutableList<Step> steps = copyNativeLibraries.getBuildSteps(FakeBuildContext.withSourcePathResolver(pathResolver), new FakeBuildableContext());
Iterable<String> descriptions = Iterables.transform(steps, step -> step.getDescription(TestExecutionContext.newInstance()));
assertThat("lib1 contents should be copied *after* lib2", Iterables.indexOf(descriptions, Predicates.containsPattern("lib1")), Matchers.greaterThan(Iterables.indexOf(descriptions, Predicates.containsPattern("lib2"))));
}
Aggregations