aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-03-17 12:52:24 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-03-18 12:45:04 +0000
commit273ca5bf1ece580f50cf3b4f2e6ee1bd9b07807a (patch)
treefbcbfe30faf55e27646b69ab8304f527ccde0ad2 /src
parent8c7d565c42491b39e950430ede138b6ca84c0c17 (diff)
Refactor AndroidStudioInfoAspectTestBase.
-- MOS_MIGRATED_REVID=117438482
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java63
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java91
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl79
4 files changed, 139 insertions, 101 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
index 0ec029e1fd..eb6e7fa89e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -88,7 +88,12 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns transitive set of labels that are being exported from this rule."
)
public NestedSet<Label> getTransitiveExports() {
- return getInfo().getProvider(JavaExportsProvider.class).getTransitiveExports();
+ JavaExportsProvider provider = getInfo().getProvider(JavaExportsProvider.class);
+ if (provider != null) {
+ return provider.getTransitiveExports();
+ } else {
+ return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
}
@SkylarkCallable(
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
index aefa5d93b6..81b0badabc 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
@@ -18,35 +18,17 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import com.google.common.collect.ImmutableList;
-import com.google.common.eventbus.EventBus;
-import com.google.devtools.build.lib.actions.Action;
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.BuildView;
-import com.google.devtools.build.lib.analysis.OutputGroupProvider;
-import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.ArtifactLocation;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.JavaRuleIdeInfo;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.RuleIdeInfo;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.RuleIdeInfo.Kind;
-import com.google.devtools.build.lib.skyframe.AspectValue;
import com.google.devtools.build.lib.vfs.Path;
-import com.google.protobuf.TextFormat;
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
import java.util.Map;
/**
@@ -984,6 +966,7 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
* Eventually Skylark aspect will be equivalent to a native one, and this method
* will be removed.
*/
+ @Override
protected boolean isNativeTest() {
return true;
}
@@ -993,50 +976,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
*/
@RunWith(JUnit4.class)
public static class IntelliJSkylarkAspectTest extends AndroidStudioInfoAspectTest {
- @Before
- public void setupBzl() throws Exception {
- InputStream stream = IntelliJSkylarkAspectTest.class
- .getResourceAsStream("intellij_info.bzl");
- BufferedReader reader =
- new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
- String line;
- ArrayList<String> contents = new ArrayList<>();
- while ((line = reader.readLine()) != null) {
- contents.add(line);
- }
-
- scratch.file("intellij_tools/BUILD", "# empty");
- scratch.file("intellij_tools/intellij_info.bzl", contents.toArray(new String[0]));
- }
-
- @Override
- protected Map<String, RuleIdeInfo> buildRuleIdeInfo(String target) throws Exception {
- BuildView.AnalysisResult analysisResult = update(
- ImmutableList.of(target),
- ImmutableList.of("intellij_tools/intellij_info.bzl%intellij_info_aspect"),
- false,
- LOADING_PHASE_THREADS,
- true,
- new EventBus()
- );
- Collection<AspectValue> aspects = analysisResult.getAspects();
- assertThat(aspects).hasSize(1);
- AspectValue aspectValue = aspects.iterator().next();
- this.configuredAspect = aspectValue.getConfiguredAspect();
- OutputGroupProvider provider = configuredAspect.getProvider(OutputGroupProvider.class);
- NestedSet<Artifact> outputGroup = provider.getOutputGroup("ide-info-text");
- Map<String, RuleIdeInfo> ruleIdeInfos = new HashMap<>();
- for (Artifact artifact : outputGroup) {
- Action generatingAction = getGeneratingAction(artifact);
- assertThat(generatingAction).isInstanceOf(FileWriteAction.class);
- String fileContents = ((FileWriteAction) generatingAction).getFileContents();
- RuleIdeInfo.Builder builder = RuleIdeInfo.newBuilder();
- TextFormat.getParser().merge(fileContents, builder);
- RuleIdeInfo ruleIdeInfo = builder.build();
- ruleIdeInfos.put(ruleIdeInfo.getLabel(), ruleIdeInfo);
- }
- return ruleIdeInfos;
- }
@Override
public boolean isNativeTest() {
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java
index 443c577313..dca83cb61e 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTestBase.java
@@ -26,10 +26,12 @@ import com.google.common.collect.Lists;
import com.google.common.eventbus.EventBus;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.BuildView;
import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.analysis.actions.BinaryFileWriteAction;
+import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -37,8 +39,17 @@ import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.LibraryArtifact;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.RuleIdeInfo;
import com.google.devtools.build.lib.skyframe.AspectValue;
+import com.google.protobuf.TextFormat;
+import org.junit.Before;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -129,27 +140,77 @@ abstract class AndroidStudioInfoAspectTestBase extends BuildViewTestCase {
assertThat(configuredAspect.getName()).isEqualTo(AndroidStudioInfoAspect.NAME);
}
+ @Before
+ public void setupBzl() throws Exception {
+ if (isNativeTest()) {
+ return;
+ }
+
+ InputStream stream = AndroidStudioInfoAspectTestBase.class
+ .getResourceAsStream("intellij_info.bzl");
+ BufferedReader reader =
+ new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
+ String line;
+ ArrayList<String> contents = new ArrayList<>();
+ while ((line = reader.readLine()) != null) {
+ contents.add(line);
+ }
+
+ scratch.file("intellij_tools/BUILD", "# empty");
+ scratch.file("intellij_tools/intellij_info.bzl", contents.toArray(new String[0]));
+ }
+
+
/**
* Returns a map of (label as string) -> RuleIdeInfo for each rule in the transitive
* closure of the passed target.
*/
protected Map<String, RuleIdeInfo> buildRuleIdeInfo(String target) throws Exception {
- buildTarget(target);
- AndroidStudioInfoFilesProvider provider =
- configuredAspect.getProvider(AndroidStudioInfoFilesProvider.class);
- Iterable<Artifact> artifacts = provider.getIdeInfoFiles();
- ImmutableMap.Builder<String, RuleIdeInfo> builder = ImmutableMap.builder();
- for (Artifact artifact : artifacts) {
- Action generatingAction = getGeneratingAction(artifact);
- if (generatingAction instanceof BinaryFileWriteAction) {
- BinaryFileWriteAction writeAction = (BinaryFileWriteAction) generatingAction;
- RuleIdeInfo ruleIdeInfo = RuleIdeInfo.parseFrom(writeAction.getSource().openStream());
- builder.put(ruleIdeInfo.getLabel(), ruleIdeInfo);
- } else {
- verifyPackageManifestSpawnAction(generatingAction);
+ if (isNativeTest()) {
+ buildTarget(target);
+ AndroidStudioInfoFilesProvider provider =
+ configuredAspect.getProvider(AndroidStudioInfoFilesProvider.class);
+ Iterable<Artifact> artifacts = provider.getIdeInfoFiles();
+ ImmutableMap.Builder<String, RuleIdeInfo> builder = ImmutableMap.builder();
+ for (Artifact artifact : artifacts) {
+ Action generatingAction = getGeneratingAction(artifact);
+ if (generatingAction instanceof BinaryFileWriteAction) {
+ BinaryFileWriteAction writeAction = (BinaryFileWriteAction) generatingAction;
+ RuleIdeInfo ruleIdeInfo = RuleIdeInfo.parseFrom(writeAction.getSource().openStream());
+ builder.put(ruleIdeInfo.getLabel(), ruleIdeInfo);
+ } else {
+ verifyPackageManifestSpawnAction(generatingAction);
+ }
}
+ return builder.build();
+ } else {
+ BuildView.AnalysisResult analysisResult = update(
+ ImmutableList.of(target),
+ ImmutableList.of("intellij_tools/intellij_info.bzl%intellij_info_aspect"),
+ false,
+ LOADING_PHASE_THREADS,
+ true,
+ new EventBus()
+ );
+ Collection<AspectValue> aspects = analysisResult.getAspects();
+ assertThat(aspects).hasSize(1);
+ AspectValue aspectValue = aspects.iterator().next();
+ this.configuredAspect = aspectValue.getConfiguredAspect();
+ OutputGroupProvider provider = configuredAspect.getProvider(OutputGroupProvider.class);
+ NestedSet<Artifact> outputGroup = provider.getOutputGroup("ide-info-text");
+ Map<String, RuleIdeInfo> ruleIdeInfos = new HashMap<>();
+ for (Artifact artifact : outputGroup) {
+ Action generatingAction = getGeneratingAction(artifact);
+ assertThat(generatingAction).isInstanceOf(FileWriteAction.class);
+ String fileContents = ((FileWriteAction) generatingAction).getFileContents();
+ RuleIdeInfo.Builder builder = RuleIdeInfo.newBuilder();
+ TextFormat.getParser().merge(fileContents, builder);
+ RuleIdeInfo ruleIdeInfo = builder.build();
+ ruleIdeInfos.put(ruleIdeInfo.getLabel(), ruleIdeInfo);
+ }
+ return ruleIdeInfos;
+
}
- return builder.build();
}
protected final void verifyPackageManifestSpawnAction(Action genAction) {
@@ -180,4 +241,6 @@ abstract class AndroidStudioInfoAspectTestBase extends BuildViewTestCase {
protected List<String> getIdeResolveFiles() {
return getOutputGroupResult(AndroidStudioInfoAspect.IDE_RESOLVE);
}
+
+ protected abstract boolean isNativeTest();
}
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl b/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
index 91ef06f1da..f7dc921faf 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
@@ -19,7 +19,7 @@ _kind_to_kind_id = {
"android_binary" : 0,
"android_library" : 1,
"android_test" : 2,
- "android_roboelectric_test" : 3,
+ "android_robolectric_test" : 3,
"java_library" : 4,
"java_test" : 5,
"java_import" : 6,
@@ -27,6 +27,7 @@ _kind_to_kind_id = {
"proto_library" : 8,
"android_sdk" : 9,
"java_plugin" : 10,
+ "android_resources" : 11,
}
_unrecognized_rule = -1;
@@ -37,24 +38,38 @@ def get_kind(target, ctx):
return _kind_to_kind_id.get(ctx.rule.kind, _unrecognized_rule)
-# Compile-time dependency attributes list
-DEPS = [
- "deps",
- "exports",
- "_robolectric", # From android_robolectric_test
- "_junit", # From android_robolectric_test
- "binary_under_test", # From android_test
- "java_lib",# From proto_library
- "_proto1_java_lib", # From proto_library
-]
+# Compile-time dependency attributes, grouped by type.
+DEPS = struct(
+ label = [
+ "binary_under_test", # From android_test
+ "java_lib",# From proto_library
+ "_proto1_java_lib", # From proto_library
+ "_junit", # From android_robolectric_test
+ ],
+ label_list = [
+ "deps",
+ "exports",
+ "_robolectric", # From android_robolectric_test
+ ],
+)
-# Run-time dependecy attributes list
-RUNTIME_DEPS = [
- "runtime_deps",
-]
-# All dependency attributes along which the aspect propagates
-ALL_DEPS = DEPS + RUNTIME_DEPS
+# Run-time dependency attributes, grouped by type.
+RUNTIME_DEPS = struct(
+ label = [
+ # todo(dslomov,tomlu): resources are tricky since they are sometimes labels and sometimes label_lists.
+ # "resources"
+ ],
+ label_list = [
+ "runtime_deps",
+ ]
+)
+
+# All dependency attributes along which the aspect propagates, grouped by type.
+ALL_DEPS = struct(
+ label = DEPS.label + RUNTIME_DEPS.label,
+ label_list = DEPS.label_list + RUNTIME_DEPS.label_list,
+)
def struct_omit_none(**kwargs):
""" A replacement for standard `struct` function that omits the fields with None value.
@@ -180,6 +195,7 @@ def android_rule_ide_info(target, ctx):
java_package = target.android.java_package,
manifest = artifact_location(target.android.manifest),
apk = artifact_location(target.android.apk),
+ dependency_apk = [artifact_location(apk) for apk in target.android.apks_under_test],
has_idl_sources = target.android.idl.output != None,
idl_jar = library_artifact(target.android.idl.output),
generate_resource_class = target.android.defines_resources,
@@ -187,25 +203,33 @@ def android_rule_ide_info(target, ctx):
),
ide_resolve_files)
-def collect_labels(rule_attrs, attr_list):
+def collect_labels(rule_attrs, attrs):
""" Collect labels from attribute values.
Assuming that values of attributes from attr_list in rule_atrs
are label lists, collect a set of string representation of those labels.
"""
return set([str(dep.label)
- for attr_name in attr_list
+ for attr_name in attrs.label_list
if hasattr(rule_attrs, attr_name)
- for dep in getattr(rule_attrs, attr_name)])
+ for dep in getattr(rule_attrs, attr_name)]) | \
+ set([str(getattr(rule_attrs, attr_name).label)
+ for attr_name in attrs.label
+ if hasattr(rule_attrs, attr_name)])
def collect_export_deps(rule_attrs):
""" Build a union of all export dependencies.
"""
result = set()
- for attr_name in DEPS:
+ for attr_name in DEPS.label_list:
if hasattr(rule_attrs, attr_name):
for dep in getattr(rule_attrs, attr_name):
result = result | dep.export_deps
+ for attr_name in DEPS.label:
+ if hasattr(rule_attrs, attr_name):
+ dep = getattr(rule_attrs, attr_name)
+ result = result | dep.export_deps
+
return result
def _aspect_impl(target, ctx):
@@ -221,12 +245,19 @@ def _aspect_impl(target, ctx):
ide_info_text = set()
ide_resolve_files = set()
- for attr_name in ALL_DEPS:
+ for attr_name in ALL_DEPS.label_list:
if hasattr(rule_attrs, attr_name):
for dep in getattr(rule_attrs, attr_name):
ide_info_text = ide_info_text | dep.intellij_info_files.ide_info_text
ide_resolve_files = ide_resolve_files | dep.intellij_info_files.ide_resolve_files
+ for attr_name in ALL_DEPS.label:
+ if hasattr(rule_attrs, attr_name):
+ dep = getattr(rule_attrs, attr_name)
+ ide_info_text = ide_info_text | dep.intellij_info_files.ide_info_text
+ ide_resolve_files = ide_resolve_files | dep.intellij_info_files.ide_resolve_files
+
+
# Collect Java-specific information
(java_rule_ide_info, java_ide_resolve_files) = java_rule_ide_info(target, ctx)
ide_resolve_files = ide_resolve_files | java_ide_resolve_files
@@ -247,7 +278,7 @@ def _aspect_impl(target, ctx):
# Build RuleIdeInfo proto
info = struct_omit_none(
label = str(target.label),
- kind = kind,
+ kind = kind if kind != _unrecognized_rule else None,
dependencies = list(compiletime_deps),
runtime_deps = list(runtime_deps),
build_file_artifact_location = build_file_artifact_location(ctx.build_file_path),
@@ -275,5 +306,5 @@ def _aspect_impl(target, ctx):
)
intellij_info_aspect = aspect(implementation = _aspect_impl,
- attr_aspects = ALL_DEPS
+ attr_aspects = ALL_DEPS.label + ALL_DEPS.label_list
)