aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGreg <gregestren@users.noreply.github.com>2019-06-05 17:39:51 -0400
committerc-parsons <cparsons@google.com>2019-06-05 17:39:51 -0400
commit6a6a509f367ca0446e75c6f881719f5da2a55a26 (patch)
tree8a826713356bd97c10bf177ea7aff555fa355479 /tests
parent446fd595bf1bb85768d885ab3a92dc8f80b29475 (diff)
downloadbazel-skylib-6a6a509f367ca0446e75c6f881719f5da2a55a26.tar.gz
selects.bzl: Add config_setting_group for config_setting AND/OR-chaining (#89)
* Add config_setting_group for config_setting AND/OR-chaining Implements https://github.com/bazelbuild/proposals/blob/master/designs/2018-11-09-config-setting-chaining.md. * buildifier lint fixes * Add tests * Add test stub for both match_any and match_all * Simplify the implementation and make it more correct. :) * Fix styling issues
Diffstat (limited to 'tests')
-rw-r--r--tests/selects_tests.bzl522
1 files changed, 521 insertions, 1 deletions
diff --git a/tests/selects_tests.bzl b/tests/selects_tests.bzl
index b9a354d..1d77cee 100644
--- a/tests/selects_tests.bzl
+++ b/tests/selects_tests.bzl
@@ -15,8 +15,11 @@
"""Unit tests for selects.bzl."""
load("//lib:selects.bzl", "selects")
-load("//lib:unittest.bzl", "asserts", "unittest")
+load("//lib:unittest.bzl", "analysistest", "asserts", "unittest")
+###################################################
+# with_or_test
+###################################################
def _with_or_test(ctx):
"""Unit tests for with_or."""
env = unittest.begin(ctx)
@@ -57,9 +60,526 @@ def _with_or_test(ctx):
with_or_test = unittest.make(_with_or_test)
+###################################################
+# BUILD declarations for config_setting_group tests
+###################################################
+
+# TODO: redefine these config_settings with Starlark build flags when
+# they're available non-experimentally.
+def _create_config_settings():
+ native.config_setting(
+ name = "condition1",
+ values = {"cpu": "ppc"},
+ )
+ native.config_setting(
+ name = "condition2",
+ values = {"compilation_mode": "opt"},
+ )
+ native.config_setting(
+ name = "condition3",
+ values = {"features": "myfeature"},
+ )
+
+def _create_config_setting_groups():
+ selects.config_setting_group(
+ name = "1_and_2_and_3",
+ match_all = [":condition1", ":condition2", ":condition3"],
+ )
+ selects.config_setting_group(
+ name = "1_and_nothing_else",
+ match_all = [":condition1"],
+ )
+ selects.config_setting_group(
+ name = "1_or_2_or_3",
+ match_any = [":condition1", ":condition2", ":condition3"],
+ )
+ selects.config_setting_group(
+ name = "1_or_nothing_else",
+ match_any = [":condition1"],
+ )
+
+###################################################
+# Support code for config_setting_group tests
+###################################################
+
+def _set_conditions(condition_list):
+ """Returns an argument for config_settings that sets specific options.
+
+ Args:
+ condition_list: a list of three booleans
+
+ Returns:
+ a dictionary parameter for config_settings such that ":conditionN" is True
+ iff condition_list[N + 1] is True
+ """
+ if len(condition_list) != 3:
+ fail("condition_list must be a list of 3 booleans")
+ ans = {}
+ if condition_list[0]:
+ ans["//command_line_option:cpu"] = "ppc"
+ if condition_list[1]:
+ ans["//command_line_option:compilation_mode"] = "opt"
+ if condition_list[2]:
+ ans["//command_line_option:features"] = ["myfeature"]
+ return ans
+
+_BooleanInfo = provider()
+
+def _boolean_attr_impl(ctx):
+ return [_BooleanInfo(value = ctx.attr.myboolean)]
+
+boolean_attr_rule = rule(
+ implementation = _boolean_attr_impl,
+ attrs = {"myboolean": attr.bool()},
+)
+
+def _expect_matches(ctx):
+ """Generic test implementation expecting myboolean == True."""
+ env = analysistest.begin(ctx)
+ attrval = analysistest.target_under_test(env)[_BooleanInfo].value
+ asserts.equals(env, True, attrval)
+ return analysistest.end(env)
+
+def _expect_doesnt_match(ctx):
+ """Generic test implementation expecting myboolean == False."""
+ env = analysistest.begin(ctx)
+ attrval = analysistest.target_under_test(env)[_BooleanInfo].value
+ asserts.equals(env, False, attrval)
+ return analysistest.end(env)
+
+def _config_setting_group_test(name, config_settings):
+ return analysistest.make()
+
+###################################################
+# and_config_setting_group_matches_test
+###################################################
+and_config_setting_group_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([True, True, True]),
+)
+
+def _and_config_setting_group_matches_test():
+ """Test verifying match on an ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_matches_rule",
+ myboolean = select(
+ {
+ ":1_and_2_and_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_matches_test(
+ name = "and_config_setting_group_matches_test",
+ target_under_test = ":and_config_setting_group_matches_rule",
+ )
+
+###################################################
+# and_config_setting_group_first_match_fails_test
+###################################################
+and_config_setting_group_first_match_fails_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([False, True, True]),
+)
+
+def _and_config_setting_group_first_match_fails_test():
+ """Test verifying first condition mismatch on an ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_first_match_fails_rule",
+ myboolean = select(
+ {
+ ":1_and_2_and_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_first_match_fails_test(
+ name = "and_config_setting_group_first_match_fails_test",
+ target_under_test = ":and_config_setting_group_first_match_fails_rule",
+ )
+
+###################################################
+# and_config_setting_group_middle_match_fails_test
+###################################################
+and_config_setting_group_middle_match_fails_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([True, False, True]),
+)
+
+def _and_config_setting_group_middle_match_fails_test():
+ """Test verifying middle condition mismatch on an ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_middle_match_fails_rule",
+ myboolean = select(
+ {
+ ":1_and_2_and_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_middle_match_fails_test(
+ name = "and_config_setting_group_middle_match_fails_test",
+ target_under_test = ":and_config_setting_group_middle_match_fails_rule",
+ )
+
+###################################################
+# and_config_setting_group_last_match_fails_test
+###################################################
+and_config_setting_group_last_match_fails_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([True, True, False]),
+)
+
+def _and_config_setting_group_last_match_fails_test():
+ """Test verifying last condition mismatch on an ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_last_match_fails_rule",
+ myboolean = select(
+ {
+ ":1_and_2_and_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_last_match_fails_test(
+ name = "and_config_setting_group_last_match_fails_test",
+ target_under_test = ":and_config_setting_group_last_match_fails_rule",
+ )
+
+###################################################
+# and_config_setting_group_multiple_matches_fail_test
+###################################################
+and_config_setting_group_multiple_matches_fail_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([True, False, False]),
+)
+
+def _and_config_setting_group_multiple_matches_fail_test():
+ """Test verifying multple conditions mismatch on an ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_multiple_matches_fail_rule",
+ myboolean = select(
+ {
+ ":1_and_2_and_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_multiple_matches_fail_test(
+ name = "and_config_setting_group_multiple_matches_fail_test",
+ target_under_test = ":and_config_setting_group_multiple_matches_fail_rule",
+ )
+
+###################################################
+# and_config_setting_group_all_matches_fail_test
+###################################################
+and_config_setting_group_all_matches_fail_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([False, False, False]),
+)
+
+def _and_config_setting_group_all_matches_fail_test():
+ """Test verifying all conditions mismatch on an ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_all_matches_fail_rule",
+ myboolean = select(
+ {
+ ":1_and_2_and_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_all_matches_fail_test(
+ name = "and_config_setting_group_all_matches_fail_test",
+ target_under_test = ":and_config_setting_group_all_matches_fail_rule",
+ )
+
+###################################################
+# and_config_setting_group_single_setting_matches_test
+###################################################
+and_config_setting_group_single_setting_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = {"//command_line_option:cpu": "ppc"},
+)
+
+def _and_config_setting_group_single_setting_matches_test():
+ """Test verifying match on single-entry ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_single_setting_matches_rule",
+ myboolean = select(
+ {
+ ":1_and_nothing_else": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_single_setting_matches_test(
+ name = "and_config_setting_group_single_setting_matches_test",
+ target_under_test = ":and_config_setting_group_single_setting_matches_rule",
+ )
+
+###################################################
+# and_config_setting_group_single_setting_fails_test
+###################################################
+and_config_setting_group_single_setting_fails_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = {"//command_line_option:cpu": "x86"},
+)
+
+def _and_config_setting_group_single_setting_fails_test():
+ """Test verifying no match on single-entry ANDing config_setting_group."""
+ boolean_attr_rule(
+ name = "and_config_setting_group_single_setting_fails_rule",
+ myboolean = select(
+ {
+ ":1_and_nothing_else": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ and_config_setting_group_single_setting_fails_test(
+ name = "and_config_setting_group_single_setting_fails_test",
+ target_under_test = ":and_config_setting_group_single_setting_fails_rule",
+ )
+
+###################################################
+# or_config_setting_group_no_match_test
+###################################################
+or_config_setting_group_no_matches_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = _set_conditions([False, False, False]),
+)
+
+def _or_config_setting_group_no_matches_test():
+ """Test verifying no matches on an ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_no_matches_rule",
+ myboolean = select(
+ {
+ ":1_or_2_or_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_no_matches_test(
+ name = "or_config_setting_group_no_matches_test",
+ target_under_test = ":or_config_setting_group_no_matches_rule",
+ )
+
+###################################################
+# or_config_setting_group_first_cond_matches_test
+###################################################
+or_config_setting_group_first_cond_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([True, False, False]),
+)
+
+def _or_config_setting_group_first_cond_matches_test():
+ """Test verifying first condition matching on an ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_first_cond_matches_rule",
+ myboolean = select(
+ {
+ ":1_or_2_or_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_first_cond_matches_test(
+ name = "or_config_setting_group_first_cond_matches_test",
+ target_under_test = ":or_config_setting_group_first_cond_matches_rule",
+ )
+
+###################################################
+# or_config_setting_group_middle_cond_matches_test
+###################################################
+or_config_setting_group_middle_cond_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([False, True, False]),
+)
+
+def _or_config_setting_group_middle_cond_matches_test():
+ """Test verifying middle condition matching on an ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_middle_cond_matches_rule",
+ myboolean = select(
+ {
+ ":1_or_2_or_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_middle_cond_matches_test(
+ name = "or_config_setting_group_middle_cond_matches_test",
+ target_under_test = ":or_config_setting_group_middle_cond_matches_rule",
+ )
+
+###################################################
+# or_config_setting_group_last_cond_matches_test
+###################################################
+or_config_setting_group_last_cond_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([False, False, True]),
+)
+
+def _or_config_setting_group_last_cond_matches_test():
+ """Test verifying last condition matching on an ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_last_cond_matches_rule",
+ myboolean = select(
+ {
+ ":1_or_2_or_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_last_cond_matches_test(
+ name = "or_config_setting_group_last_cond_matches_test",
+ target_under_test = ":or_config_setting_group_last_cond_matches_rule",
+ )
+
+###################################################
+# or_config_setting_group_multiple_conds_match_test
+###################################################
+or_config_setting_group_multiple_conds_match_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([False, True, True]),
+)
+
+def _or_config_setting_group_multiple_conds_match_test():
+ """Test verifying multple conditions matching on an ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_multiple_conds_match_rule",
+ myboolean = select(
+ {
+ ":1_or_2_or_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_multiple_conds_match_test(
+ name = "or_config_setting_group_multiple_conds_match_test",
+ target_under_test = ":or_config_setting_group_multiple_conds_match_rule",
+ )
+
+###################################################
+# or_config_setting_group_all_conds_match_test
+###################################################
+or_config_setting_group_all_conds_match_test = analysistest.make(
+ _expect_matches,
+ config_settings = _set_conditions([False, True, True]),
+)
+
+def _or_config_setting_group_all_conds_match_test():
+ """Test verifying all conditions matching on an ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_all_conds_match_rule",
+ myboolean = select(
+ {
+ ":1_or_2_or_3": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_all_conds_match_test(
+ name = "or_config_setting_group_all_conds_match_test",
+ target_under_test = ":or_config_setting_group_all_conds_match_rule",
+ )
+
+###################################################
+# or_config_setting_group_single_setting_matches_test
+###################################################
+or_config_setting_group_single_setting_matches_test = analysistest.make(
+ _expect_matches,
+ config_settings = {"//command_line_option:cpu": "ppc"},
+)
+
+def _or_config_setting_group_single_setting_matches_test():
+ """Test verifying match on single-entry ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_single_setting_matches_rule",
+ myboolean = select(
+ {
+ ":1_or_nothing_else": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_single_setting_matches_test(
+ name = "or_config_setting_group_single_setting_matches_test",
+ target_under_test = ":or_config_setting_group_single_setting_matches_rule",
+ )
+
+###################################################
+# or_config_setting_group_single_setting_fails_test
+###################################################
+or_config_setting_group_single_setting_fails_test = analysistest.make(
+ _expect_doesnt_match,
+ config_settings = {"//command_line_option:cpu": "x86"},
+)
+
+def _or_config_setting_group_single_setting_fails_test():
+ """Test verifying no match on single-entry ORing config_setting_group."""
+ boolean_attr_rule(
+ name = "or_config_setting_group_single_setting_fails_rule",
+ myboolean = select(
+ {
+ ":1_or_nothing_else": True,
+ "//conditions:default": False,
+ },
+ ),
+ )
+ or_config_setting_group_single_setting_fails_test(
+ name = "or_config_setting_group_single_setting_fails_test",
+ target_under_test = ":or_config_setting_group_single_setting_fails_rule",
+ )
+
+###################################################
+# empty_config_setting_group_not_allowed_test
+###################################################
+
+# config_setting_group with no parameters triggers a failure.
+# TODO: how do we test this? This requires catching macro
+# evaluation failure.
+
+###################################################
+# and_and_or_not_allowed_together_test
+###################################################
+
+# config_setting_group: setting both match_any and match_or
+# triggers a failure.
+# TODO: how do we test this? This requires catching macro
+# evaluation failure.
+
+###################################################
+
def selects_test_suite():
"""Creates the test targets and test suite for selects.bzl tests."""
unittest.suite(
"selects_tests",
with_or_test,
)
+
+ _create_config_settings()
+ _create_config_setting_groups()
+
+ _and_config_setting_group_matches_test()
+ _and_config_setting_group_first_match_fails_test()
+ _and_config_setting_group_middle_match_fails_test()
+ _and_config_setting_group_last_match_fails_test()
+ _and_config_setting_group_multiple_matches_fail_test()
+ _and_config_setting_group_all_matches_fail_test()
+ _and_config_setting_group_single_setting_matches_test()
+ _and_config_setting_group_single_setting_fails_test()
+
+ _or_config_setting_group_no_matches_test()
+ _or_config_setting_group_first_cond_matches_test()
+ _or_config_setting_group_middle_cond_matches_test()
+ _or_config_setting_group_last_cond_matches_test()
+ _or_config_setting_group_multiple_conds_match_test()
+ _or_config_setting_group_all_conds_match_test()
+ _or_config_setting_group_single_setting_matches_test()
+ _or_config_setting_group_single_setting_fails_test()
+
+ # _empty_config_setting_group_not_allowed_test()
+ # _and_and_or_not_allowed_together_test()