blob: 1e5ce2b759693a2d3acffac15fef07a51939fcb2 [file] [log] [blame]
/*
* Copyright 2012-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.android;
import static com.facebook.buck.rules.BuildableProperties.Kind.ANDROID;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.model.BuildTargetPattern;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.BuildRuleType;
import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
import com.facebook.buck.rules.FakeBuildableContext;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.step.Step;
import com.facebook.buck.testutil.MoreAsserts;
import com.facebook.buck.util.BuckConstant;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
/**
* Unit test for {@link NdkLibrary}.
*/
public class NdkLibraryTest {
@Test
public void testSimpleNdkLibraryRule() throws IOException {
BuildContext context = null;
String basePath = "java/src/com/facebook/base";
BuildRuleResolver ruleResolver = new BuildRuleResolver();
BuildRule rule = ruleResolver.buildAndAddToIndex(
NdkLibrary.newNdkLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
.setBuildTarget(BuildTargetFactory.newInstance(
String.format("//%s:base", basePath)))
.addSrc(basePath + "/Application.mk")
.addSrc(basePath + "/main.cpp")
.addSrc(basePath + "/Android.mk")
.addFlag("flag1")
.addFlag("flag2")
.setIsAsset(true)
.addVisibilityPattern(BuildTargetPattern.MATCH_ALL));
assertEquals(BuildRuleType.NDK_LIBRARY, rule.getType());
NdkLibrary ndkLibrary = (NdkLibrary) rule.getBuildable();
assertTrue(ndkLibrary.getProperties().is(ANDROID));
assertTrue(ndkLibrary.isAsset());
assertEquals(BuckConstant.GEN_DIR + "/" + basePath + "/__libbase", ndkLibrary.getLibraryPath());
MoreAsserts.assertListEquals(
ImmutableList.of(
basePath + "/Android.mk",
basePath + "/Application.mk",
basePath + "/main.cpp"),
ImmutableList.copyOf(ndkLibrary.getInputsToCompareToOutput()));
List<Step> steps = ndkLibrary.getBuildSteps(context, new FakeBuildableContext());
ExecutionContext executionContext = createMock(ExecutionContext.class);
ProjectFilesystem projectFilesystem = createMock(ProjectFilesystem.class);
Function<String, Path> pathTransform = new Function<String, Path>() {
@Override
public Path apply(String pathRelativeTo) {
return Paths.get("/foo/", pathRelativeTo);
}
};
expect(executionContext.getProjectFilesystem()).andReturn(projectFilesystem);
expect(projectFilesystem.getPathRelativizer()).andReturn(pathTransform);
Path binDir = Paths.get(BuckConstant.BIN_DIR, "java/src/com/facebook/base/__libbase/libs");
expect(projectFilesystem.resolve(binDir)).andReturn(Paths.get("/foo/" + binDir));
File ndkDir = createMock(File.class);
expect(executionContext.getNdkRoot()).andReturn(Optional.of(ndkDir));
expect(ndkDir.getAbsolutePath()).andReturn("/ndk-r8b");
replay(executionContext, projectFilesystem, ndkDir);
MoreAsserts.assertShellCommands(
"ndk_library() should invoke ndk-build on the given path with some -j value",
ImmutableList.of(
String.format(
"/ndk-r8b/ndk-build -j %d -C %s/ flag1 flag2 " +
"APP_PROJECT_PATH=/foo/%s/%s/%s/ APP_BUILD_SCRIPT=/foo/%s/Android.mk " +
"NDK_OUT=/foo/%s/%s/%s/ " +
"NDK_LIBS_OUT=/foo/%s/%s/%s/libs",
Runtime.getRuntime().availableProcessors(),
basePath,
BuckConstant.BIN_DIR,
basePath,
"__libbase",
basePath,
BuckConstant.BIN_DIR,
basePath,
"__libbase",
BuckConstant.BIN_DIR,
basePath,
"__libbase")
),
steps.subList(0, 1),
executionContext);
verify(executionContext, projectFilesystem);
}
}