Add constraint_setting and constraint_value rules, to enable defining 
platform-related constraints and values.

Part of ongoing work on #2219.

--
Change-Id: Ice370ee26469f4992faf72c0c95a1a3e51a9f9e7
Reviewed-on: https://cr.bazel.build/9091
PiperOrigin-RevId: 148758190
MOS_MIGRATED_REVID=148758190
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index d6663ea..7bca1eb 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -34,6 +34,7 @@
         "//src/main/java/com/google/devtools/build/lib/rules/genquery:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/genrule:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/objc:srcs",
+        "//src/main/java/com/google/devtools/build/lib/rules/platform:srcs",
         "//src/main/java/com/google/devtools/build/lib/sandbox:srcs",
         "//src/main/java/com/google/devtools/build/lib/ssd:srcs",
         "//src/main/java/com/google/devtools/build/lib/standalone:srcs",
@@ -613,6 +614,7 @@
         "//src/main/java/com/google/devtools/build/lib/rules/genquery",
         "//src/main/java/com/google/devtools/build/lib/rules/genrule",
         "//src/main/java/com/google/devtools/build/lib/rules/objc",
+        "//src/main/java/com/google/devtools/build/lib/rules/platform",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/protobuf:crosstool_config_java_proto",
@@ -1164,6 +1166,7 @@
         "//src/main/java/com/google/devtools/build/lib/rules/genquery:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/genrule:srcs",
         "//src/main/java/com/google/devtools/build/lib/rules/objc:srcs",
+        "//src/main/java/com/google/devtools/build/lib/rules/platform:srcs",
     ],
 )
 
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 90b963b..9f3bfde 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
@@ -159,6 +159,8 @@
 import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses;
 import com.google.devtools.build.lib.rules.objc.ObjcXcodeprojRule;
 import com.google.devtools.build.lib.rules.objc.XcTestAppProvider;
+import com.google.devtools.build.lib.rules.platform.ConstraintSettingRule;
+import com.google.devtools.build.lib.rules.platform.ConstraintValueRule;
 import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule;
 import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
 import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainRule;
@@ -273,6 +275,7 @@
     CORE_RULES.init(builder);
     CORE_WORKSPACE_RULES.init(builder);
     BASIC_RULES.init(builder);
+    PLATFORM_RULES.init(builder);
     PROTO_RULES.init(builder);
     SH_RULES.init(builder);
     CPP_RULES.init(builder);
@@ -334,6 +337,20 @@
         }
       };
 
+  public static final RuleSet PLATFORM_RULES =
+      new RuleSet() {
+        @Override
+        public void init(Builder builder) {
+          builder.addRuleDefinition(new ConstraintSettingRule());
+          builder.addRuleDefinition(new ConstraintValueRule());
+        }
+
+        @Override
+        public ImmutableList<RuleSet> requires() {
+          return ImmutableList.of(CORE_RULES);
+        }
+      };
+
   public static final RuleSet BASIC_RULES =
       new RuleSet() {
         @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD
new file mode 100644
index 0000000..d8c6ca9
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD
@@ -0,0 +1,25 @@
+# Description:
+#   Rules to define Platforms and related Constraints.
+
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+java_library(
+    name = "platform",
+    srcs = glob([
+        "*.java",
+    ]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:packages",
+        "//third_party:auto_value",
+        "//third_party:guava",
+    ],
+)
+
+filegroup(
+    name = "srcs",
+    testonly = 0,  # All srcs should be not test only, overwrite package default.
+    srcs = glob(["**"]),
+)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java
new file mode 100644
index 0000000..03e924f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java
@@ -0,0 +1,45 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.analysis.FilesToRunProvider;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+
+/**
+ * Defines a category of constraint that can be fulfilled by a constraint_value rule in a platform
+ * definition.
+ */
+public class ConstraintSetting implements RuleConfiguredTargetFactory {
+
+  @Override
+  public ConfiguredTarget create(RuleContext ruleContext)
+      throws InterruptedException, RuleErrorException {
+
+    return new RuleConfiguredTargetBuilder(ruleContext)
+        .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
+        .addProvider(FileProvider.class, FileProvider.EMPTY)
+        .addProvider(FilesToRunProvider.class, FilesToRunProvider.EMPTY)
+        .addProvider(
+            ConstraintSettingProvider.class,
+            ConstraintSettingProvider.create(ruleContext.getLabel()))
+        .build();
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSettingProvider.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSettingProvider.java
new file mode 100644
index 0000000..9459a07
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSettingProvider.java
@@ -0,0 +1,31 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import com.google.auto.value.AutoValue;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+
+/** Provider for a platform constraint setting that is available to be fulfilled. */
+@AutoValue
+@Immutable
+public abstract class ConstraintSettingProvider implements TransitiveInfoProvider {
+  public abstract Label constraintSetting();
+
+  public static ConstraintSettingProvider create(Label constraintSetting) {
+    return new AutoValue_ConstraintSettingProvider(constraintSetting);
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSettingRule.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSettingRule.java
new file mode 100644
index 0000000..6b23983
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSettingRule.java
@@ -0,0 +1,57 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.syntax.Type;
+
+/** Rule definition for {@link ConstraintSetting}. */
+public class ConstraintSettingRule implements RuleDefinition {
+  public static final String RULE_NAME = "constraint_setting";
+
+  @Override
+  public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
+    return builder
+        .override(
+            attr("tags", Type.STRING_LIST)
+                // No need to show up in ":all", etc. target patterns.
+                .value(ImmutableList.of("manual"))
+                .nonconfigurable("low-level attribute, used in platform configuration"))
+        .removeAttribute("deps")
+        .removeAttribute("data")
+        .exemptFromConstraintChecking("this rule *defines* a constraint")
+        .build();
+  }
+
+  @Override
+  public RuleDefinition.Metadata getMetadata() {
+    return RuleDefinition.Metadata.builder()
+        .name(RULE_NAME)
+        .ancestors(BaseRuleClasses.RuleBase.class)
+        .factoryClass(ConstraintSetting.class)
+        .build();
+  }
+}
+/*<!-- #BLAZE_RULE (NAME = constraint_setting, TYPE = OTHER, FAMILY = Platform)[GENERIC_RULE] -->
+
+<p>This rule defines a type of constraint that can be used to define an execution platform.</p>
+
+<!-- #END_BLAZE_RULE -->*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java
new file mode 100644
index 0000000..c232c92
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java
@@ -0,0 +1,48 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.FileProvider;
+import com.google.devtools.build.lib.analysis.FilesToRunProvider;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+
+/** Defines a potential value of a constraint. */
+public class ConstraintValue implements RuleConfiguredTargetFactory {
+
+  @Override
+  public ConfiguredTarget create(RuleContext ruleContext)
+      throws InterruptedException, RuleErrorException {
+
+    ConstraintSettingProvider constraint =
+        ruleContext.getPrerequisite(
+            ConstraintValueRule.CONSTRAINT_SETTING_ATTR,
+            Mode.DONT_CHECK,
+            ConstraintSettingProvider.class);
+
+    return new RuleConfiguredTargetBuilder(ruleContext)
+        .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
+        .addProvider(FileProvider.class, FileProvider.EMPTY)
+        .addProvider(FilesToRunProvider.class, FilesToRunProvider.EMPTY)
+        .addProvider(
+            ConstraintValueProvider.class,
+            ConstraintValueProvider.create(constraint, ruleContext.getLabel()))
+        .build();
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValueProvider.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValueProvider.java
new file mode 100644
index 0000000..1ade6dd
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValueProvider.java
@@ -0,0 +1,33 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import com.google.auto.value.AutoValue;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+
+/** Provider for a platform constraint value that fulfills a {@link ConstraintSettingProvider}. */
+@AutoValue
+@Immutable
+public abstract class ConstraintValueProvider implements TransitiveInfoProvider {
+  public abstract ConstraintSettingProvider constraint();
+
+  public abstract Label value();
+
+  public static ConstraintValueProvider create(ConstraintSettingProvider constraint, Label value) {
+    return new AutoValue_ConstraintValueProvider(constraint, value);
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValueRule.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValueRule.java
new file mode 100644
index 0000000..55e85b1
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValueRule.java
@@ -0,0 +1,74 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.BaseRuleClasses;
+import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.packages.BuildType;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.syntax.Type;
+import com.google.devtools.build.lib.util.FileTypeSet;
+
+/** Rule definition for {@link ConstraintValue}. */
+public class ConstraintValueRule implements RuleDefinition {
+  public static final String RULE_NAME = "constraint_value";
+  public static final String CONSTRAINT_SETTING_ATTR = "constraint_setting";
+
+  @Override
+  public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
+    return builder
+        .override(
+            attr("tags", Type.STRING_LIST)
+                // No need to show up in ":all", etc. target patterns.
+                .value(ImmutableList.of("manual"))
+                .nonconfigurable("low-level attribute, used in platform configuration"))
+
+        /* <!-- #BLAZE_RULE(constraint_value).ATTRIBUTE(constraint) -->
+        The constraint_setting rule this value is applied to.
+        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
+        .add(
+            attr(CONSTRAINT_SETTING_ATTR, BuildType.LABEL)
+                .mandatory()
+                .allowedRuleClasses(ConstraintSettingRule.RULE_NAME)
+                .allowedFileTypes(FileTypeSet.NO_FILE)
+                .mandatoryNativeProviders(
+                    ImmutableList.<Class<? extends TransitiveInfoProvider>>of(
+                        ConstraintSettingProvider.class)))
+        .removeAttribute("deps")
+        .removeAttribute("data")
+        .exemptFromConstraintChecking("this rule *defines* a constraint")
+        .build();
+  }
+
+  @Override
+  public Metadata getMetadata() {
+    return Metadata.builder()
+        .name(RULE_NAME)
+        .ancestors(BaseRuleClasses.RuleBase.class)
+        .factoryClass(ConstraintValue.class)
+        .build();
+  }
+}
+/*<!-- #BLAZE_RULE (NAME = constraint_value, TYPE = OTHER, FAMILY = Platform)[GENERIC_RULE] -->
+
+<p>This rule defines a specific value of a constraint, which can be used to define execution
+platforms.
+
+<!-- #END_BLAZE_RULE -->*/
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index b1efe10..bcf79d6 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -36,6 +36,7 @@
         "//src/test/java/com/google/devtools/build/lib/skylark:srcs",
         "//src/test/java/com/google/devtools/build/lib/skyframe:srcs",
         "//src/test/java/com/google/devtools/build/lib/rules/android:srcs",
+        "//src/test/java/com/google/devtools/build/lib/rules/platform:srcs",
         "//src/test/java/com/google/devtools/build/lib/rules/repository:srcs",
         "//src/test/java/com/google/devtools/build/lib/bazel/repository:srcs",
         "//src/test/java/com/google/devtools/build/lib/buildeventstream/transports:srcs",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
new file mode 100644
index 0000000..198f3a4
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/BUILD
@@ -0,0 +1,21 @@
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+    visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"],
+)
+
+java_test(
+    name = "PlatformTests",
+    srcs = glob(["*.java"]),
+    test_class = "com.google.devtools.build.lib.AllTests",
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/rules/platform",
+        "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
new file mode 100644
index 0000000..6c2f959
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/ConstraintTest.java
@@ -0,0 +1,60 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.platform;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests of {@link ConstraintSetting} and {@link ConstraintValue}. */
+@RunWith(JUnit4.class)
+public class ConstraintTest extends BuildViewTestCase {
+
+  @Test
+  public void testConstraint() throws Exception {
+    scratch.file(
+        "constraint/BUILD",
+        "constraint_setting(name = 'basic')",
+        "constraint_value(name = 'foo',",
+        "    constraint_setting = ':basic',",
+        "    )",
+        "constraint_value(name = 'bar',",
+        "    constraint_setting = ':basic',",
+        "    )");
+    ConfiguredTarget setting = getConfiguredTarget("//constraint:basic");
+    assertThat(setting).isNotNull();
+    assertThat(setting.getProvider(ConstraintSettingProvider.class)).isNotNull();
+    assertThat(setting.getProvider(ConstraintSettingProvider.class).constraintSetting())
+        .isEqualTo(Label.parseAbsolute("//constraint:basic"));
+    ConfiguredTarget fooValue = getConfiguredTarget("//constraint:foo");
+    assertThat(fooValue).isNotNull();
+    assertThat(fooValue.getProvider(ConstraintValueProvider.class)).isNotNull();
+    assertThat(fooValue.getProvider(ConstraintValueProvider.class).constraint().constraintSetting())
+        .isEqualTo(Label.parseAbsolute("//constraint:basic"));
+    assertThat(fooValue.getProvider(ConstraintValueProvider.class).value())
+        .isEqualTo(Label.parseAbsolute("//constraint:foo"));
+    ConfiguredTarget barValue = getConfiguredTarget("//constraint:bar");
+    assertThat(barValue).isNotNull();
+    assertThat(barValue.getProvider(ConstraintValueProvider.class).constraint().constraintSetting())
+        .isEqualTo(Label.parseAbsolute("//constraint:basic"));
+    assertThat(barValue.getProvider(ConstraintValueProvider.class).value())
+        .isEqualTo(Label.parseAbsolute("//constraint:bar"));
+  }
+}