diff options
author | 2016-03-17 12:52:24 +0000 | |
---|---|---|
committer | 2016-03-18 12:45:04 +0000 | |
commit | 273ca5bf1ece580f50cf3b4f2e6ee1bd9b07807a (patch) | |
tree | fbcbfe30faf55e27646b69ab8304f527ccde0ad2 /src | |
parent | 8c7d565c42491b39e950430ede138b6ca84c0c17 (diff) |
Refactor AndroidStudioInfoAspectTestBase.
--
MOS_MIGRATED_REVID=117438482
Diffstat (limited to 'src')
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 ) |