Allow aspects to adveritise providers they provide.

--
PiperOrigin-RevId: 146794883
MOS_MIGRATED_REVID=146794883
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 c3748fe..76d24e0 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
@@ -684,4 +684,29 @@
         .containsExactly(
             "aspect //a:a", "aspect //a:b", "aspect //a:c", "aspect //a:tool", "rule //a:x");
   }
+
+  @Test
+  public void aspectTruthInAdvertisement() throws Exception {
+    reporter.removeHandler(failFastHandler); // expect errors
+    setRulesAvailableInTests(
+        new TestAspects.BaseRule(),
+        new TestAspects.SimpleRule(),
+        new TestAspects.FalseAdvertisementAspectRule());
+    pkg(
+        "a",
+        "simple(name = 's')",
+        "false_advertisement_aspect(name = 'x', deps = [':s'])"
+    );
+    try {
+      update("//a:x");
+    } catch (ViewCreationFailedException e) {
+      // expected.
+    }
+    assertContainsEvent(
+        "Aspect 'FalseAdvertisementAspect', applied to '//a:s',"
+            + " does not provide advertised provider 'RequiredProvider'");
+    assertContainsEvent(
+        "Aspect 'FalseAdvertisementAspect', applied to '//a:s',"
+            + " does not provide advertised provider 'advertised_provider'");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 3a74a59..0566c43 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -61,6 +61,7 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder;
+import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileTypeSet;
@@ -442,6 +443,33 @@
       .build();
 
   /**
+   * An aspect that advertises but fails to provide providers.
+   */
+  public static class FalseAdvertisementAspect extends NativeAspectClass
+    implements ConfiguredAspectFactory {
+
+    @Override
+    public AspectDefinition getDefinition(AspectParameters aspectParameters) {
+      return FALSE_ADVERTISEMENT_DEFINITION;
+    }
+
+    @Override
+    public ConfiguredAspect create(ConfiguredTarget base, RuleContext context,
+        AspectParameters parameters) throws InterruptedException {
+      return new ConfiguredAspect.Builder(this, parameters, context).build();
+    }
+  }
+  public static final FalseAdvertisementAspect FALSE_ADVERTISEMENT_ASPECT
+      = new FalseAdvertisementAspect();
+  private static final AspectDefinition FALSE_ADVERTISEMENT_DEFINITION =
+      new AspectDefinition.Builder(FALSE_ADVERTISEMENT_ASPECT)
+        .advertiseProvider(RequiredProvider.class)
+        .advertiseProvider(
+            ImmutableList.of(SkylarkProviderIdentifier.forLegacy("advertised_provider")))
+        .build();
+
+
+  /**
    * A common base rule for mock rules in this class to reduce boilerplate.
    *
    * <p>It has a few common attributes because internal Blaze machinery assumes the presence of
@@ -967,6 +995,28 @@
   }
 
   /**
+   * Rule with {@link FalseAdvertisementAspect}
+   */
+  public static final class FalseAdvertisementAspectRule implements RuleDefinition {
+
+    @Override
+    public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+      return builder
+          .add(attr("deps", LABEL_LIST).allowedFileTypes().aspect(FALSE_ADVERTISEMENT_ASPECT))
+          .build();
+    }
+
+    @Override
+    public Metadata getMetadata() {
+      return  RuleDefinition.Metadata.builder()
+          .name("false_advertisement_aspect")
+          .factoryClass(DummyRuleFactory.class)
+          .ancestors(BaseRule.class)
+          .build();
+    }
+  }
+
+  /**
    * Rule with rule class configuration transition.
    */
   public static class RuleClassTransitionRule implements RuleDefinition {