diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
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 |