aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2016-10-18 11:48:18 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2016-10-19 08:24:35 +0000
commita9f20b0d6459d395444c45cf5e94a899f3443633 (patch)
tree5dc25eb652fb15144110b838f25218918eb17897 /src/main/java/com/google/devtools/build
parentab588d21db260ed99ae1c9b6329eba099dc647dd (diff)
Enforce that non test-only targets cannot depends on test-only targets
This behavior was not enforced since we open-sourced Bazel even though this was documented and the attributed existed. Also removed the incorrect part from the documentations: we do not enforce restrictions on javatests package. Fixes #1923. RELNOTES[INC]: Non test-only targets can no longer depends on test-only targets. -- MOS_MIGRATED_REVID=136459421
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html6
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java26
2 files changed, 26 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html
index ed26e6198f..8d3efe9b94 100644
--- a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html
+++ b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html
@@ -16,12 +16,6 @@ are <code>testonly</code> by default.
</p>
<p>
-By virtue of
-<a href="${link package.default_testonly}"><code>default_testonly</code></a>,
-targets under <code>javatests</code> are <code>testonly</code> by default.
-</p>
-
-<p>
This attribute is intended to mean that the target should not be
contained in binaries that are released to production.
</p>
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 0fae32d39c..44d194dedd 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
@@ -77,6 +77,7 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.ideinfo.AndroidStudioInfoAspect;
import com.google.devtools.build.lib.ideinfo.BazelAndroidStudioInfoSemantics;
import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
import com.google.devtools.build.lib.packages.PackageGroup;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.Target;
@@ -153,6 +154,7 @@ import com.google.devtools.build.lib.rules.repository.BindRule;
import com.google.devtools.build.lib.rules.repository.LocalRepositoryRule;
import com.google.devtools.build.lib.rules.repository.NewLocalRepositoryRule;
import com.google.devtools.build.lib.rules.repository.WorkspaceBaseRule;
+import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.ResourceFileLoader;
import java.io.IOException;
@@ -188,6 +190,7 @@ public class BazelRuleClassProvider {
public void validate(RuleContext.Builder context,
ConfiguredTarget prerequisite, Attribute attribute) {
validateDirectPrerequisiteVisibility(context, prerequisite, attribute.getName());
+ validateDirectPrerequisiteForTestOnly(context, prerequisite);
DeprecationValidator.validateDirectPrerequisiteForDeprecation(
context, context.getRule(), prerequisite, context.forAspect());
}
@@ -236,6 +239,29 @@ public class BazelRuleClassProvider {
+ "(they are only allowed in the visibility attribute)");
}
}
+
+ private void validateDirectPrerequisiteForTestOnly(
+ RuleContext.Builder context, ConfiguredTarget prerequisite) {
+ Rule rule = context.getRule();
+ Target prerequisiteTarget = prerequisite.getTarget();
+ Label prerequisiteLabel = prerequisiteTarget.getLabel();
+ String thisPackage = rule.getLabel().getPackageName();
+
+ if (isTestOnlyRule(prerequisiteTarget) && !isTestOnlyRule(rule)) {
+ String message = "non-test target '" + rule.getLabel() + "' depends on testonly target '"
+ + prerequisiteLabel + "' and doesn't have testonly attribute set";
+ if (thisPackage.startsWith("experimental/")) {
+ context.ruleWarning(message);
+ } else {
+ context.ruleError(message);
+ }
+ }
+ }
+
+ private static boolean isTestOnlyRule(Target target) {
+ return (target instanceof Rule)
+ && (NonconfigurableAttributeMapper.of((Rule) target)).get("testonly", Type.BOOLEAN);
+ }
}
public static void setup(ConfiguredRuleClassProvider.Builder builder) {