Allow aspects to specify multiple sets of required providers to match against rules. Aspects can attach to a rule if at least one set of required providers are present on the rule.

--
MOS_MIGRATED_REVID=140605023
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 37abaaf..ae4f533 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -163,6 +163,21 @@
   }
 
   @Test
+  public void aspectCreatedIfAtLeastOneSetOfAdvertisedProvidersArePresent() throws Exception {
+    setRulesAvailableInTests(new TestAspects.BaseRule(), new TestAspects.HonestRule(),
+        new TestAspects.HonestRule2(), new TestAspects.AspectRequiringProviderSetsRule());
+
+    pkg("a",
+        "aspect_requiring_provider_sets(name='a', foo=[':b', ':c'])",
+        "honest(name='b', foo=[])",
+        "honest2(name='c', foo=[])");
+
+    ConfiguredTarget a = getConfiguredTarget("//a:a");
+    assertThat(a.getProvider(RuleInfo.class).getData())
+        .containsExactly("rule //a:a", "aspect //a:b", "aspect //a:c");
+  }
+
+  @Test
   public void aspectWithParametrizedDefinition() throws Exception {
     setRulesAvailableInTests(
         new TestAspects.BaseRule(),