/*
* 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.android;
import static org.junit.Assert.assertEquals;
import com.facebook.buck.android.AndroidBuildConfig.ReadValuesStep;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.model.BuildTargets;
import com.facebook.buck.rules.BuildRuleParams;
import com.facebook.buck.rules.Description;
import com.facebook.buck.rules.ExplicitBuildTargetSourcePath;
import com.facebook.buck.rules.FakeBuildContext;
import com.facebook.buck.rules.FakeBuildRuleParamsBuilder;
import com.facebook.buck.rules.FakeBuildableContext;
import com.facebook.buck.rules.coercer.BuildConfigFields;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.TestExecutionContext;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import org.easymock.EasyMock;
import org.junit.Test;
/** Unit test for {@link AndroidBuildConfig}. */
public class AndroidBuildConfigTest {
public static final BuildTarget BUILD_TARGET =
BuildTargetFactory.newInstance("//java/com/example:build_config");
private static final ProjectFilesystem filesystem = new FakeProjectFilesystem();
@Test
public void testGetPathToOutput() {
AndroidBuildConfig buildConfig = createSimpleBuildConfigRule();
assertEquals(
new ExplicitBuildTargetSourcePath(
BUILD_TARGET,
BuildTargets.getGenPath(filesystem, BUILD_TARGET, "__%s__/BuildConfig.java")),
buildConfig.getSourcePathToOutput());
}
@Test
public void testBuildInternal() throws IOException {
AndroidBuildConfig buildConfig = createSimpleBuildConfigRule();
List<Step> steps =
buildConfig.getBuildSteps(FakeBuildContext.NOOP_CONTEXT, new FakeBuildableContext());
Step generateBuildConfigStep = steps.get(2);
GenerateBuildConfigStep expectedStep =
new GenerateBuildConfigStep(
new FakeProjectFilesystem(),
BuildTargetFactory.newInstance("//java/com/example:build_config")
.getUnflavoredBuildTarget(),
/* javaPackage */ "com.example",
/* useConstantExpressions */ false,
/* constants */ Suppliers.ofInstance(BuildConfigFields.empty()),
BuildTargets.getGenPath(filesystem, BUILD_TARGET, "__%s__/BuildConfig.java"));
assertEquals(expectedStep, generateBuildConfigStep);
}
@Test
public void testGetTypeMethodOfBuilder() {
assertEquals(
"android_build_config",
Description.getBuildRuleType(AndroidBuildConfigDescription.class).getName());
}
@Test
public void testReadValuesStep() throws IOException {
Path pathToValues = Paths.get("src/values.txt");
ProjectFilesystem projectFilesystem = EasyMock.createMock(ProjectFilesystem.class);
EasyMock.expect(projectFilesystem.readLines(pathToValues))
.andReturn(ImmutableList.of("boolean DEBUG = false", "String FOO = \"BAR\""));
EasyMock.replay(projectFilesystem);
ReadValuesStep step = new ReadValuesStep(projectFilesystem, pathToValues);
ExecutionContext context = TestExecutionContext.newBuilder().build();
int exitCode = step.execute(context).getExitCode();
assertEquals(0, exitCode);
assertEquals(
BuildConfigFields.fromFields(
ImmutableList.of(
BuildConfigFields.Field.of("boolean", "DEBUG", "false"),
BuildConfigFields.Field.of("String", "FOO", "\"BAR\""))),
step.get());
EasyMock.verify(projectFilesystem);
}
private static AndroidBuildConfig createSimpleBuildConfigRule() {
// First, create the BuildConfig object.
BuildRuleParams params = new FakeBuildRuleParamsBuilder(BUILD_TARGET).build();
return new AndroidBuildConfig(
params,
/* javaPackage */ "com.example",
/* values */ BuildConfigFields.empty(),
/* valuesFile */ Optional.empty(),
/* useConstantExpressions */ false);
}
// TODO(nickpalmer): Add another unit test that passes in a non-trivial DependencyGraph and verify
// that the resulting set of libraryManifestPaths is computed correctly.
}