aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar dannark <dannark@google.com>2018-02-22 18:29:57 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-22 18:31:57 -0800
commitda51eb327c39b64357faa85ce5c884d51a58c003 (patch)
tree9464719321f4128c64711b8390ab684f21df66fe /src/main/java/com/google/devtools/build/lib
parent00c317b1677ee817c4534497e1e0f88b2ae0a40d (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBaseRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestConfiguration.java98
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/robolectric_properties_template.txt3
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