diff options
author | 2018-02-22 18:29:57 -0800 | |
---|---|---|
committer | 2018-02-22 18:31:57 -0800 | |
commit | da51eb327c39b64357faa85ce5c884d51a58c003 (patch) | |
tree | 9464719321f4128c64711b8390ab684f21df66fe /src/main/java/com/google/devtools/build/lib | |
parent | 00c317b1677ee817c4534497e1e0f88b2ae0a40d (diff) |
Enable ability to pass the resource apk to Robolectric so that it can consume binary resources.
This functionality is guarded by a flag, --experimental_android_local_test_binary_resources whose default value is false. If the flag is set to true, Bazel will generate the .ap_ and add the path to the .ap_ to the test_config.properties file. Bazel will still generate and pass the raw resources to Robolectric in both cases and so the cue to Robolectric that binary resources should be used is the presence of the path to the .ap_ in the test_config.properties file.
RELNOTES: None
PiperOrigin-RevId: 186708941
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
5 files changed, 129 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 4d58a9b706..4cab2d11a8 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -61,6 +61,7 @@ import com.google.devtools.build.lib.rules.android.AndroidInstrumentationInfo; import com.google.devtools.build.lib.rules.android.AndroidInstrumentationTestRule; import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule; import com.google.devtools.build.lib.rules.android.AndroidLocalTestBaseRule; +import com.google.devtools.build.lib.rules.android.AndroidLocalTestConfiguration; import com.google.devtools.build.lib.rules.android.AndroidNativeLibsInfo; import com.google.devtools.build.lib.rules.android.AndroidNeverlinkAspect; import com.google.devtools.build.lib.rules.android.AndroidResourcesInfo; @@ -189,6 +190,9 @@ public class BazelRuleClassProvider { String toolsRepository = checkNotNull(builder.getToolsRepository()); builder.addConfig(AndroidConfiguration.Options.class, new AndroidConfiguration.Loader()); + builder.addConfig( + AndroidLocalTestConfiguration.Options.class, + new AndroidLocalTestConfiguration.Loader()); AndroidNeverlinkAspect androidNeverlinkAspect = new AndroidNeverlinkAspect(); DexArchiveAspect dexArchiveAspect = new DexArchiveAspect(toolsRepository); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index c5245d13ba..11dc93ed06 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -78,6 +78,9 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); + AndroidLocalTestConfiguration androidLocalTestConfiguration = + ruleContext.getFragment(AndroidLocalTestConfiguration.class); + final JavaCommon javaCommon = new JavaCommon(ruleContext, javaSemantics); // Use the regular Java javacopts. Enforcing android-compatible Java // (-source 7 -target 7 and no TWR) is unnecessary for robolectric tests @@ -140,6 +143,14 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor Substitution.of( "%android_custom_package%", resourceApk.getPrimaryResource().getJavaPackage())); + boolean generateBinaryResources = + androidLocalTestConfiguration.useAndroidLocalTestBinaryResources(); + if (generateBinaryResources) { + substitutions.add( + Substitution.of( + "%android_resource_apk%", resourceApk.getArtifact().getRunfilesPathString())); + } + ruleContext.registerAction( new TemplateExpansionAction( ruleContext.getActionOwner(), @@ -283,7 +294,13 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor Runfiles defaultRunfiles = collectDefaultRunfiles( - ruleContext, javaCommon, filesToBuild, manifest, resourcesClassJar, resourcesZip); + ruleContext, + javaCommon, + filesToBuild, + manifest, + resourcesClassJar, + resourcesZip, + generateBinaryResources ? resourceApk : null); RunfilesSupport runfilesSupport = RunfilesSupport.withExecutable(ruleContext, defaultRunfiles, executable); @@ -418,7 +435,8 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor NestedSet<Artifact> filesToBuild, Artifact manifest, Artifact resourcesClassJar, - Artifact resourcesZip) + Artifact resourcesZip, + @Nullable ResourceApk resourceApk) throws RuleErrorException { Runfiles.Builder builder = new Runfiles.Builder(ruleContext.getWorkspaceName()); @@ -468,6 +486,9 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor builder.addArtifact(manifest); builder.addArtifact(resourcesClassJar); builder.addArtifact(resourcesZip); + if (resourceApk != null) { + builder.addArtifact(resourceApk.getArtifact()); + } return builder.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java index 4527d7d11e..068b5de552 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java @@ -38,7 +38,8 @@ public class AndroidLocalTestBaseRule implements RuleDefinition { @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { return builder - .requiresConfigurationFragments(JavaConfiguration.class) + .requiresConfigurationFragments( + JavaConfiguration.class, AndroidLocalTestConfiguration.class) // Update documentation for inherited attributes diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java new file mode 100644 index 0000000000..69e96e5d4c --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java @@ -0,0 +1,98 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// 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.google.devtools.build.lib.rules.android; + +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; +import com.google.devtools.build.lib.analysis.config.BuildOptions; +import com.google.devtools.build.lib.analysis.config.ConfigurationEnvironment; +import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory; +import com.google.devtools.build.lib.analysis.config.FragmentOptions; +import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; +import com.google.devtools.common.options.Option; +import com.google.devtools.common.options.OptionDocumentationCategory; +import com.google.devtools.common.options.OptionEffectTag; +import javax.annotation.Nullable; + +/** Configuration fragment for android_local_test. */ +@AutoCodec +@Immutable +public class AndroidLocalTestConfiguration extends BuildConfiguration.Fragment { + public static final ObjectCodec<AndroidLocalTestConfiguration> CODEC = + new AndroidLocalTestConfiguration_AutoCodec(); + + /** android_local_test specific options */ + @AutoCodec(strategy = Strategy.PUBLIC_FIELDS) + public static final class Options extends FragmentOptions { + public static final ObjectCodec<Options> CODEC = + new AndroidLocalTestConfiguration_Options_AutoCodec(); + + @Option( + name = "experimental_android_local_test_binary_resources", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, + help = + "If true, provide Robolectric with binary resources instead of raw resources" + + " for android_local_test. This should only be used by Robolectric team members" + + " for testing purposes." + ) + public boolean androidLocalTestBinaryResources; + } + + /** + * Loader class for {@link + * com.google.devtools.build.lib.rules.android.AndroidLocalTestConfiguration}. + */ + public static final class Loader implements ConfigurationFragmentFactory { + + @Nullable + @Override + public Fragment create(ConfigurationEnvironment env, BuildOptions buildOptions) + throws InvalidConfigurationException, InterruptedException { + return new AndroidLocalTestConfiguration(buildOptions.get(Options.class)); + } + + @Override + public Class<? extends Fragment> creates() { + return AndroidLocalTestConfiguration.class; + } + + @Override + public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() { + return ImmutableSet.of(Options.class); + } + } + + private final boolean androidLocalTestBinaryResources; + + AndroidLocalTestConfiguration(Options options) { + this.androidLocalTestBinaryResources = options.androidLocalTestBinaryResources; + } + + @AutoCodec.Instantiator + AndroidLocalTestConfiguration(boolean androidLocalTestBinaryResources) { + this.androidLocalTestBinaryResources = androidLocalTestBinaryResources; + } + + public boolean useAndroidLocalTestBinaryResources() { + return this.androidLocalTestBinaryResources; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/robolectric_properties_template.txt b/src/main/java/com/google/devtools/build/lib/rules/android/robolectric_properties_template.txt index dba03448b2..facc965941 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/robolectric_properties_template.txt +++ b/src/main/java/com/google/devtools/build/lib/rules/android/robolectric_properties_template.txt @@ -1,4 +1,5 @@ android_merged_manifest=%android_merged_manifest% android_merged_resources=%android_merged_resources% android_merged_assets=%android_merged_assets% -android_custom_package=%android_custom_package%
\ No newline at end of file +android_custom_package=%android_custom_package% +android_resource_apk=%android_resource_apk%
\ No newline at end of file |