1*bcb5dc79SHONG Yifan# Copyright 2017 The Bazel Authors. All rights reserved. 2*bcb5dc79SHONG Yifan# 3*bcb5dc79SHONG Yifan# Licensed under the Apache License, Version 2.0 (the "License"); 4*bcb5dc79SHONG Yifan# you may not use this file except in compliance with the License. 5*bcb5dc79SHONG Yifan# You may obtain a copy of the License at 6*bcb5dc79SHONG Yifan# 7*bcb5dc79SHONG Yifan# http://www.apache.org/licenses/LICENSE-2.0 8*bcb5dc79SHONG Yifan# 9*bcb5dc79SHONG Yifan# Unless required by applicable law or agreed to in writing, software 10*bcb5dc79SHONG Yifan# distributed under the License is distributed on an "AS IS" BASIS, 11*bcb5dc79SHONG Yifan# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*bcb5dc79SHONG Yifan# See the License for the specific language governing permissions and 13*bcb5dc79SHONG Yifan# limitations under the License. 14*bcb5dc79SHONG Yifan 15*bcb5dc79SHONG Yifan"""Unit tests for selects.bzl.""" 16*bcb5dc79SHONG Yifan 17*bcb5dc79SHONG Yifanload("//lib:selects.bzl", "selects") 18*bcb5dc79SHONG Yifanload("//lib:unittest.bzl", "analysistest", "asserts", "unittest") 19*bcb5dc79SHONG Yifan 20*bcb5dc79SHONG Yifan################################################### 21*bcb5dc79SHONG Yifan# with_or_test 22*bcb5dc79SHONG Yifan################################################### 23*bcb5dc79SHONG Yifandef _with_or_test(ctx): 24*bcb5dc79SHONG Yifan """Unit tests for with_or.""" 25*bcb5dc79SHONG Yifan env = unittest.begin(ctx) 26*bcb5dc79SHONG Yifan 27*bcb5dc79SHONG Yifan # We actually test on with_or_dict because Starlark can't get the 28*bcb5dc79SHONG Yifan # dictionary from a select(). 29*bcb5dc79SHONG Yifan 30*bcb5dc79SHONG Yifan # Test select()-compatible input syntax. 31*bcb5dc79SHONG Yifan input_dict = {":foo": ":d1", "//conditions:default": ":d1"} 32*bcb5dc79SHONG Yifan asserts.equals(env, input_dict, selects.with_or_dict(input_dict)) 33*bcb5dc79SHONG Yifan 34*bcb5dc79SHONG Yifan # Test OR syntax. 35*bcb5dc79SHONG Yifan or_dict = {(":foo", ":bar"): ":d1"} 36*bcb5dc79SHONG Yifan asserts.equals( 37*bcb5dc79SHONG Yifan env, 38*bcb5dc79SHONG Yifan {":bar": ":d1", ":foo": ":d1"}, 39*bcb5dc79SHONG Yifan selects.with_or_dict(or_dict), 40*bcb5dc79SHONG Yifan ) 41*bcb5dc79SHONG Yifan 42*bcb5dc79SHONG Yifan # Test mixed syntax. 43*bcb5dc79SHONG Yifan mixed_dict = { 44*bcb5dc79SHONG Yifan ":foo": ":d1", 45*bcb5dc79SHONG Yifan (":bar", ":baz"): ":d2", 46*bcb5dc79SHONG Yifan "//conditions:default": ":d3", 47*bcb5dc79SHONG Yifan } 48*bcb5dc79SHONG Yifan asserts.equals( 49*bcb5dc79SHONG Yifan env, 50*bcb5dc79SHONG Yifan { 51*bcb5dc79SHONG Yifan ":bar": ":d2", 52*bcb5dc79SHONG Yifan ":baz": ":d2", 53*bcb5dc79SHONG Yifan ":foo": ":d1", 54*bcb5dc79SHONG Yifan "//conditions:default": ":d3", 55*bcb5dc79SHONG Yifan }, 56*bcb5dc79SHONG Yifan selects.with_or_dict(mixed_dict), 57*bcb5dc79SHONG Yifan ) 58*bcb5dc79SHONG Yifan 59*bcb5dc79SHONG Yifan return unittest.end(env) 60*bcb5dc79SHONG Yifan 61*bcb5dc79SHONG Yifanwith_or_test = unittest.make(_with_or_test) 62*bcb5dc79SHONG Yifan 63*bcb5dc79SHONG Yifan################################################### 64*bcb5dc79SHONG Yifan# BUILD declarations for config_setting_group tests 65*bcb5dc79SHONG Yifan################################################### 66*bcb5dc79SHONG Yifan 67*bcb5dc79SHONG Yifan# TODO: redefine these config_settings with Starlark build flags when 68*bcb5dc79SHONG Yifan# they're available non-experimentally. 69*bcb5dc79SHONG Yifandef _create_config_settings(): 70*bcb5dc79SHONG Yifan native.config_setting( 71*bcb5dc79SHONG Yifan name = "condition1", 72*bcb5dc79SHONG Yifan values = {"cpu": "ppc"}, 73*bcb5dc79SHONG Yifan ) 74*bcb5dc79SHONG Yifan native.config_setting( 75*bcb5dc79SHONG Yifan name = "condition2", 76*bcb5dc79SHONG Yifan values = {"compilation_mode": "opt"}, 77*bcb5dc79SHONG Yifan ) 78*bcb5dc79SHONG Yifan native.config_setting( 79*bcb5dc79SHONG Yifan name = "condition3", 80*bcb5dc79SHONG Yifan values = {"features": "myfeature"}, 81*bcb5dc79SHONG Yifan ) 82*bcb5dc79SHONG Yifan 83*bcb5dc79SHONG Yifandef _create_config_setting_groups(): 84*bcb5dc79SHONG Yifan selects.config_setting_group( 85*bcb5dc79SHONG Yifan name = "1_and_2_and_3", 86*bcb5dc79SHONG Yifan match_all = [":condition1", ":condition2", ":condition3"], 87*bcb5dc79SHONG Yifan ) 88*bcb5dc79SHONG Yifan selects.config_setting_group( 89*bcb5dc79SHONG Yifan name = "1_and_nothing_else", 90*bcb5dc79SHONG Yifan match_all = [":condition1"], 91*bcb5dc79SHONG Yifan ) 92*bcb5dc79SHONG Yifan selects.config_setting_group( 93*bcb5dc79SHONG Yifan name = "1_or_2_or_3", 94*bcb5dc79SHONG Yifan match_any = [":condition1", ":condition2", ":condition3"], 95*bcb5dc79SHONG Yifan ) 96*bcb5dc79SHONG Yifan selects.config_setting_group( 97*bcb5dc79SHONG Yifan name = "1_or_nothing_else", 98*bcb5dc79SHONG Yifan match_any = [":condition1"], 99*bcb5dc79SHONG Yifan ) 100*bcb5dc79SHONG Yifan 101*bcb5dc79SHONG Yifan################################################### 102*bcb5dc79SHONG Yifan# Support code for config_setting_group tests 103*bcb5dc79SHONG Yifan################################################### 104*bcb5dc79SHONG Yifan 105*bcb5dc79SHONG Yifandef _set_conditions(condition_list): 106*bcb5dc79SHONG Yifan """Returns an argument for config_settings that sets specific options. 107*bcb5dc79SHONG Yifan 108*bcb5dc79SHONG Yifan Args: 109*bcb5dc79SHONG Yifan condition_list: a list of three booleans 110*bcb5dc79SHONG Yifan 111*bcb5dc79SHONG Yifan Returns: 112*bcb5dc79SHONG Yifan a dictionary parameter for config_settings such that ":conditionN" is True 113*bcb5dc79SHONG Yifan iff condition_list[N + 1] is True 114*bcb5dc79SHONG Yifan """ 115*bcb5dc79SHONG Yifan if len(condition_list) != 3: 116*bcb5dc79SHONG Yifan fail("condition_list must be a list of 3 booleans") 117*bcb5dc79SHONG Yifan ans = {} 118*bcb5dc79SHONG Yifan if condition_list[0]: 119*bcb5dc79SHONG Yifan ans["//command_line_option:cpu"] = "ppc" 120*bcb5dc79SHONG Yifan else: 121*bcb5dc79SHONG Yifan ans["//command_line_option:cpu"] = "k8" 122*bcb5dc79SHONG Yifan if condition_list[1]: 123*bcb5dc79SHONG Yifan ans["//command_line_option:compilation_mode"] = "opt" 124*bcb5dc79SHONG Yifan else: 125*bcb5dc79SHONG Yifan ans["//command_line_option:compilation_mode"] = "dbg" 126*bcb5dc79SHONG Yifan if condition_list[2]: 127*bcb5dc79SHONG Yifan ans["//command_line_option:features"] = ["myfeature"] 128*bcb5dc79SHONG Yifan else: 129*bcb5dc79SHONG Yifan ans["//command_line_option:features"] = ["notmyfeature"] 130*bcb5dc79SHONG Yifan return ans 131*bcb5dc79SHONG Yifan 132*bcb5dc79SHONG Yifan_BooleanInfo = provider( 133*bcb5dc79SHONG Yifan doc = "value for boolean tests", 134*bcb5dc79SHONG Yifan fields = ["value"], 135*bcb5dc79SHONG Yifan) 136*bcb5dc79SHONG Yifan 137*bcb5dc79SHONG Yifandef _boolean_attr_impl(ctx): 138*bcb5dc79SHONG Yifan return [_BooleanInfo(value = ctx.attr.myboolean)] 139*bcb5dc79SHONG Yifan 140*bcb5dc79SHONG Yifanboolean_attr_rule = rule( 141*bcb5dc79SHONG Yifan implementation = _boolean_attr_impl, 142*bcb5dc79SHONG Yifan attrs = {"myboolean": attr.bool()}, 143*bcb5dc79SHONG Yifan) 144*bcb5dc79SHONG Yifan 145*bcb5dc79SHONG Yifandef _expect_matches(ctx): 146*bcb5dc79SHONG Yifan """Generic test implementation expecting myboolean == True.""" 147*bcb5dc79SHONG Yifan env = analysistest.begin(ctx) 148*bcb5dc79SHONG Yifan attrval = analysistest.target_under_test(env)[_BooleanInfo].value 149*bcb5dc79SHONG Yifan asserts.equals(env, True, attrval) 150*bcb5dc79SHONG Yifan return analysistest.end(env) 151*bcb5dc79SHONG Yifan 152*bcb5dc79SHONG Yifandef _expect_doesnt_match(ctx): 153*bcb5dc79SHONG Yifan """Generic test implementation expecting myboolean == False.""" 154*bcb5dc79SHONG Yifan env = analysistest.begin(ctx) 155*bcb5dc79SHONG Yifan attrval = analysistest.target_under_test(env)[_BooleanInfo].value 156*bcb5dc79SHONG Yifan asserts.equals(env, False, attrval) 157*bcb5dc79SHONG Yifan return analysistest.end(env) 158*bcb5dc79SHONG Yifan 159*bcb5dc79SHONG Yifan################################################### 160*bcb5dc79SHONG Yifan# and_config_setting_group_matches_test 161*bcb5dc79SHONG Yifan################################################### 162*bcb5dc79SHONG Yifanand_config_setting_group_matches_test = analysistest.make( 163*bcb5dc79SHONG Yifan _expect_matches, 164*bcb5dc79SHONG Yifan config_settings = _set_conditions([True, True, True]), 165*bcb5dc79SHONG Yifan) 166*bcb5dc79SHONG Yifan 167*bcb5dc79SHONG Yifandef _and_config_setting_group_matches_test(): 168*bcb5dc79SHONG Yifan """Test verifying match on an ANDing config_setting_group.""" 169*bcb5dc79SHONG Yifan boolean_attr_rule( 170*bcb5dc79SHONG Yifan name = "and_config_setting_group_matches_rule", 171*bcb5dc79SHONG Yifan myboolean = select( 172*bcb5dc79SHONG Yifan { 173*bcb5dc79SHONG Yifan ":1_and_2_and_3": True, 174*bcb5dc79SHONG Yifan "//conditions:default": False, 175*bcb5dc79SHONG Yifan }, 176*bcb5dc79SHONG Yifan ), 177*bcb5dc79SHONG Yifan ) 178*bcb5dc79SHONG Yifan and_config_setting_group_matches_test( 179*bcb5dc79SHONG Yifan name = "and_config_setting_group_matches_test", 180*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_matches_rule", 181*bcb5dc79SHONG Yifan ) 182*bcb5dc79SHONG Yifan 183*bcb5dc79SHONG Yifan################################################### 184*bcb5dc79SHONG Yifan# and_config_setting_group_first_match_fails_test 185*bcb5dc79SHONG Yifan################################################### 186*bcb5dc79SHONG Yifanand_config_setting_group_first_match_fails_test = analysistest.make( 187*bcb5dc79SHONG Yifan _expect_doesnt_match, 188*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, True, True]), 189*bcb5dc79SHONG Yifan) 190*bcb5dc79SHONG Yifan 191*bcb5dc79SHONG Yifandef _and_config_setting_group_first_match_fails_test(): 192*bcb5dc79SHONG Yifan """Test verifying first condition mismatch on an ANDing config_setting_group.""" 193*bcb5dc79SHONG Yifan boolean_attr_rule( 194*bcb5dc79SHONG Yifan name = "and_config_setting_group_first_match_fails_rule", 195*bcb5dc79SHONG Yifan myboolean = select( 196*bcb5dc79SHONG Yifan { 197*bcb5dc79SHONG Yifan ":1_and_2_and_3": True, 198*bcb5dc79SHONG Yifan "//conditions:default": False, 199*bcb5dc79SHONG Yifan }, 200*bcb5dc79SHONG Yifan ), 201*bcb5dc79SHONG Yifan ) 202*bcb5dc79SHONG Yifan and_config_setting_group_first_match_fails_test( 203*bcb5dc79SHONG Yifan name = "and_config_setting_group_first_match_fails_test", 204*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_first_match_fails_rule", 205*bcb5dc79SHONG Yifan ) 206*bcb5dc79SHONG Yifan 207*bcb5dc79SHONG Yifan################################################### 208*bcb5dc79SHONG Yifan# and_config_setting_group_middle_match_fails_test 209*bcb5dc79SHONG Yifan################################################### 210*bcb5dc79SHONG Yifanand_config_setting_group_middle_match_fails_test = analysistest.make( 211*bcb5dc79SHONG Yifan _expect_doesnt_match, 212*bcb5dc79SHONG Yifan config_settings = _set_conditions([True, False, True]), 213*bcb5dc79SHONG Yifan) 214*bcb5dc79SHONG Yifan 215*bcb5dc79SHONG Yifandef _and_config_setting_group_middle_match_fails_test(): 216*bcb5dc79SHONG Yifan """Test verifying middle condition mismatch on an ANDing config_setting_group.""" 217*bcb5dc79SHONG Yifan boolean_attr_rule( 218*bcb5dc79SHONG Yifan name = "and_config_setting_group_middle_match_fails_rule", 219*bcb5dc79SHONG Yifan myboolean = select( 220*bcb5dc79SHONG Yifan { 221*bcb5dc79SHONG Yifan ":1_and_2_and_3": True, 222*bcb5dc79SHONG Yifan "//conditions:default": False, 223*bcb5dc79SHONG Yifan }, 224*bcb5dc79SHONG Yifan ), 225*bcb5dc79SHONG Yifan ) 226*bcb5dc79SHONG Yifan and_config_setting_group_middle_match_fails_test( 227*bcb5dc79SHONG Yifan name = "and_config_setting_group_middle_match_fails_test", 228*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_middle_match_fails_rule", 229*bcb5dc79SHONG Yifan ) 230*bcb5dc79SHONG Yifan 231*bcb5dc79SHONG Yifan################################################### 232*bcb5dc79SHONG Yifan# and_config_setting_group_last_match_fails_test 233*bcb5dc79SHONG Yifan################################################### 234*bcb5dc79SHONG Yifanand_config_setting_group_last_match_fails_test = analysistest.make( 235*bcb5dc79SHONG Yifan _expect_doesnt_match, 236*bcb5dc79SHONG Yifan config_settings = _set_conditions([True, True, False]), 237*bcb5dc79SHONG Yifan) 238*bcb5dc79SHONG Yifan 239*bcb5dc79SHONG Yifandef _and_config_setting_group_last_match_fails_test(): 240*bcb5dc79SHONG Yifan """Test verifying last condition mismatch on an ANDing config_setting_group.""" 241*bcb5dc79SHONG Yifan boolean_attr_rule( 242*bcb5dc79SHONG Yifan name = "and_config_setting_group_last_match_fails_rule", 243*bcb5dc79SHONG Yifan myboolean = select( 244*bcb5dc79SHONG Yifan { 245*bcb5dc79SHONG Yifan ":1_and_2_and_3": True, 246*bcb5dc79SHONG Yifan "//conditions:default": False, 247*bcb5dc79SHONG Yifan }, 248*bcb5dc79SHONG Yifan ), 249*bcb5dc79SHONG Yifan ) 250*bcb5dc79SHONG Yifan and_config_setting_group_last_match_fails_test( 251*bcb5dc79SHONG Yifan name = "and_config_setting_group_last_match_fails_test", 252*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_last_match_fails_rule", 253*bcb5dc79SHONG Yifan ) 254*bcb5dc79SHONG Yifan 255*bcb5dc79SHONG Yifan################################################### 256*bcb5dc79SHONG Yifan# and_config_setting_group_multiple_matches_fail_test 257*bcb5dc79SHONG Yifan################################################### 258*bcb5dc79SHONG Yifanand_config_setting_group_multiple_matches_fail_test = analysistest.make( 259*bcb5dc79SHONG Yifan _expect_doesnt_match, 260*bcb5dc79SHONG Yifan config_settings = _set_conditions([True, False, False]), 261*bcb5dc79SHONG Yifan) 262*bcb5dc79SHONG Yifan 263*bcb5dc79SHONG Yifandef _and_config_setting_group_multiple_matches_fail_test(): 264*bcb5dc79SHONG Yifan """Test verifying multiple conditions mismatch on an ANDing config_setting_group.""" 265*bcb5dc79SHONG Yifan boolean_attr_rule( 266*bcb5dc79SHONG Yifan name = "and_config_setting_group_multiple_matches_fail_rule", 267*bcb5dc79SHONG Yifan myboolean = select( 268*bcb5dc79SHONG Yifan { 269*bcb5dc79SHONG Yifan ":1_and_2_and_3": True, 270*bcb5dc79SHONG Yifan "//conditions:default": False, 271*bcb5dc79SHONG Yifan }, 272*bcb5dc79SHONG Yifan ), 273*bcb5dc79SHONG Yifan ) 274*bcb5dc79SHONG Yifan and_config_setting_group_multiple_matches_fail_test( 275*bcb5dc79SHONG Yifan name = "and_config_setting_group_multiple_matches_fail_test", 276*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_multiple_matches_fail_rule", 277*bcb5dc79SHONG Yifan ) 278*bcb5dc79SHONG Yifan 279*bcb5dc79SHONG Yifan################################################### 280*bcb5dc79SHONG Yifan# and_config_setting_group_all_matches_fail_test 281*bcb5dc79SHONG Yifan################################################### 282*bcb5dc79SHONG Yifanand_config_setting_group_all_matches_fail_test = analysistest.make( 283*bcb5dc79SHONG Yifan _expect_doesnt_match, 284*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, False, False]), 285*bcb5dc79SHONG Yifan) 286*bcb5dc79SHONG Yifan 287*bcb5dc79SHONG Yifandef _and_config_setting_group_all_matches_fail_test(): 288*bcb5dc79SHONG Yifan """Test verifying all conditions mismatch on an ANDing config_setting_group.""" 289*bcb5dc79SHONG Yifan boolean_attr_rule( 290*bcb5dc79SHONG Yifan name = "and_config_setting_group_all_matches_fail_rule", 291*bcb5dc79SHONG Yifan myboolean = select( 292*bcb5dc79SHONG Yifan { 293*bcb5dc79SHONG Yifan ":1_and_2_and_3": True, 294*bcb5dc79SHONG Yifan "//conditions:default": False, 295*bcb5dc79SHONG Yifan }, 296*bcb5dc79SHONG Yifan ), 297*bcb5dc79SHONG Yifan ) 298*bcb5dc79SHONG Yifan and_config_setting_group_all_matches_fail_test( 299*bcb5dc79SHONG Yifan name = "and_config_setting_group_all_matches_fail_test", 300*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_all_matches_fail_rule", 301*bcb5dc79SHONG Yifan ) 302*bcb5dc79SHONG Yifan 303*bcb5dc79SHONG Yifan################################################### 304*bcb5dc79SHONG Yifan# and_config_setting_group_single_setting_matches_test 305*bcb5dc79SHONG Yifan################################################### 306*bcb5dc79SHONG Yifanand_config_setting_group_single_setting_matches_test = analysistest.make( 307*bcb5dc79SHONG Yifan _expect_matches, 308*bcb5dc79SHONG Yifan config_settings = {"//command_line_option:cpu": "ppc"}, 309*bcb5dc79SHONG Yifan) 310*bcb5dc79SHONG Yifan 311*bcb5dc79SHONG Yifandef _and_config_setting_group_single_setting_matches_test(): 312*bcb5dc79SHONG Yifan """Test verifying match on single-entry ANDing config_setting_group.""" 313*bcb5dc79SHONG Yifan boolean_attr_rule( 314*bcb5dc79SHONG Yifan name = "and_config_setting_group_single_setting_matches_rule", 315*bcb5dc79SHONG Yifan myboolean = select( 316*bcb5dc79SHONG Yifan { 317*bcb5dc79SHONG Yifan ":1_and_nothing_else": True, 318*bcb5dc79SHONG Yifan "//conditions:default": False, 319*bcb5dc79SHONG Yifan }, 320*bcb5dc79SHONG Yifan ), 321*bcb5dc79SHONG Yifan ) 322*bcb5dc79SHONG Yifan and_config_setting_group_single_setting_matches_test( 323*bcb5dc79SHONG Yifan name = "and_config_setting_group_single_setting_matches_test", 324*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_single_setting_matches_rule", 325*bcb5dc79SHONG Yifan ) 326*bcb5dc79SHONG Yifan 327*bcb5dc79SHONG Yifan################################################### 328*bcb5dc79SHONG Yifan# and_config_setting_group_single_setting_fails_test 329*bcb5dc79SHONG Yifan################################################### 330*bcb5dc79SHONG Yifanand_config_setting_group_single_setting_fails_test = analysistest.make( 331*bcb5dc79SHONG Yifan _expect_doesnt_match, 332*bcb5dc79SHONG Yifan config_settings = {"//command_line_option:cpu": "x86"}, 333*bcb5dc79SHONG Yifan) 334*bcb5dc79SHONG Yifan 335*bcb5dc79SHONG Yifandef _and_config_setting_group_single_setting_fails_test(): 336*bcb5dc79SHONG Yifan """Test verifying no match on single-entry ANDing config_setting_group.""" 337*bcb5dc79SHONG Yifan boolean_attr_rule( 338*bcb5dc79SHONG Yifan name = "and_config_setting_group_single_setting_fails_rule", 339*bcb5dc79SHONG Yifan myboolean = select( 340*bcb5dc79SHONG Yifan { 341*bcb5dc79SHONG Yifan ":1_and_nothing_else": True, 342*bcb5dc79SHONG Yifan "//conditions:default": False, 343*bcb5dc79SHONG Yifan }, 344*bcb5dc79SHONG Yifan ), 345*bcb5dc79SHONG Yifan ) 346*bcb5dc79SHONG Yifan and_config_setting_group_single_setting_fails_test( 347*bcb5dc79SHONG Yifan name = "and_config_setting_group_single_setting_fails_test", 348*bcb5dc79SHONG Yifan target_under_test = ":and_config_setting_group_single_setting_fails_rule", 349*bcb5dc79SHONG Yifan ) 350*bcb5dc79SHONG Yifan 351*bcb5dc79SHONG Yifan################################################### 352*bcb5dc79SHONG Yifan# or_config_setting_group_no_match_test 353*bcb5dc79SHONG Yifan################################################### 354*bcb5dc79SHONG Yifanor_config_setting_group_no_matches_test = analysistest.make( 355*bcb5dc79SHONG Yifan _expect_doesnt_match, 356*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, False, False]), 357*bcb5dc79SHONG Yifan) 358*bcb5dc79SHONG Yifan 359*bcb5dc79SHONG Yifandef _or_config_setting_group_no_matches_test(): 360*bcb5dc79SHONG Yifan """Test verifying no matches on an ORing config_setting_group.""" 361*bcb5dc79SHONG Yifan boolean_attr_rule( 362*bcb5dc79SHONG Yifan name = "or_config_setting_group_no_matches_rule", 363*bcb5dc79SHONG Yifan myboolean = select( 364*bcb5dc79SHONG Yifan { 365*bcb5dc79SHONG Yifan ":1_or_2_or_3": True, 366*bcb5dc79SHONG Yifan "//conditions:default": False, 367*bcb5dc79SHONG Yifan }, 368*bcb5dc79SHONG Yifan ), 369*bcb5dc79SHONG Yifan ) 370*bcb5dc79SHONG Yifan or_config_setting_group_no_matches_test( 371*bcb5dc79SHONG Yifan name = "or_config_setting_group_no_matches_test", 372*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_no_matches_rule", 373*bcb5dc79SHONG Yifan ) 374*bcb5dc79SHONG Yifan 375*bcb5dc79SHONG Yifan################################################### 376*bcb5dc79SHONG Yifan# or_config_setting_group_first_cond_matches_test 377*bcb5dc79SHONG Yifan################################################### 378*bcb5dc79SHONG Yifanor_config_setting_group_first_cond_matches_test = analysistest.make( 379*bcb5dc79SHONG Yifan _expect_matches, 380*bcb5dc79SHONG Yifan config_settings = _set_conditions([True, False, False]), 381*bcb5dc79SHONG Yifan) 382*bcb5dc79SHONG Yifan 383*bcb5dc79SHONG Yifandef _or_config_setting_group_first_cond_matches_test(): 384*bcb5dc79SHONG Yifan """Test verifying first condition matching on an ORing config_setting_group.""" 385*bcb5dc79SHONG Yifan boolean_attr_rule( 386*bcb5dc79SHONG Yifan name = "or_config_setting_group_first_cond_matches_rule", 387*bcb5dc79SHONG Yifan myboolean = select( 388*bcb5dc79SHONG Yifan { 389*bcb5dc79SHONG Yifan ":1_or_2_or_3": True, 390*bcb5dc79SHONG Yifan "//conditions:default": False, 391*bcb5dc79SHONG Yifan }, 392*bcb5dc79SHONG Yifan ), 393*bcb5dc79SHONG Yifan ) 394*bcb5dc79SHONG Yifan or_config_setting_group_first_cond_matches_test( 395*bcb5dc79SHONG Yifan name = "or_config_setting_group_first_cond_matches_test", 396*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_first_cond_matches_rule", 397*bcb5dc79SHONG Yifan ) 398*bcb5dc79SHONG Yifan 399*bcb5dc79SHONG Yifan################################################### 400*bcb5dc79SHONG Yifan# or_config_setting_group_middle_cond_matches_test 401*bcb5dc79SHONG Yifan################################################### 402*bcb5dc79SHONG Yifanor_config_setting_group_middle_cond_matches_test = analysistest.make( 403*bcb5dc79SHONG Yifan _expect_matches, 404*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, True, False]), 405*bcb5dc79SHONG Yifan) 406*bcb5dc79SHONG Yifan 407*bcb5dc79SHONG Yifandef _or_config_setting_group_middle_cond_matches_test(): 408*bcb5dc79SHONG Yifan """Test verifying middle condition matching on an ORing config_setting_group.""" 409*bcb5dc79SHONG Yifan boolean_attr_rule( 410*bcb5dc79SHONG Yifan name = "or_config_setting_group_middle_cond_matches_rule", 411*bcb5dc79SHONG Yifan myboolean = select( 412*bcb5dc79SHONG Yifan { 413*bcb5dc79SHONG Yifan ":1_or_2_or_3": True, 414*bcb5dc79SHONG Yifan "//conditions:default": False, 415*bcb5dc79SHONG Yifan }, 416*bcb5dc79SHONG Yifan ), 417*bcb5dc79SHONG Yifan ) 418*bcb5dc79SHONG Yifan or_config_setting_group_middle_cond_matches_test( 419*bcb5dc79SHONG Yifan name = "or_config_setting_group_middle_cond_matches_test", 420*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_middle_cond_matches_rule", 421*bcb5dc79SHONG Yifan ) 422*bcb5dc79SHONG Yifan 423*bcb5dc79SHONG Yifan################################################### 424*bcb5dc79SHONG Yifan# or_config_setting_group_last_cond_matches_test 425*bcb5dc79SHONG Yifan################################################### 426*bcb5dc79SHONG Yifanor_config_setting_group_last_cond_matches_test = analysistest.make( 427*bcb5dc79SHONG Yifan _expect_matches, 428*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, False, True]), 429*bcb5dc79SHONG Yifan) 430*bcb5dc79SHONG Yifan 431*bcb5dc79SHONG Yifandef _or_config_setting_group_last_cond_matches_test(): 432*bcb5dc79SHONG Yifan """Test verifying last condition matching on an ORing config_setting_group.""" 433*bcb5dc79SHONG Yifan boolean_attr_rule( 434*bcb5dc79SHONG Yifan name = "or_config_setting_group_last_cond_matches_rule", 435*bcb5dc79SHONG Yifan myboolean = select( 436*bcb5dc79SHONG Yifan { 437*bcb5dc79SHONG Yifan ":1_or_2_or_3": True, 438*bcb5dc79SHONG Yifan "//conditions:default": False, 439*bcb5dc79SHONG Yifan }, 440*bcb5dc79SHONG Yifan ), 441*bcb5dc79SHONG Yifan ) 442*bcb5dc79SHONG Yifan or_config_setting_group_last_cond_matches_test( 443*bcb5dc79SHONG Yifan name = "or_config_setting_group_last_cond_matches_test", 444*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_last_cond_matches_rule", 445*bcb5dc79SHONG Yifan ) 446*bcb5dc79SHONG Yifan 447*bcb5dc79SHONG Yifan################################################### 448*bcb5dc79SHONG Yifan# or_config_setting_group_multiple_conds_match_test 449*bcb5dc79SHONG Yifan################################################### 450*bcb5dc79SHONG Yifanor_config_setting_group_multiple_conds_match_test = analysistest.make( 451*bcb5dc79SHONG Yifan _expect_matches, 452*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, True, True]), 453*bcb5dc79SHONG Yifan) 454*bcb5dc79SHONG Yifan 455*bcb5dc79SHONG Yifandef _or_config_setting_group_multiple_conds_match_test(): 456*bcb5dc79SHONG Yifan """Test verifying multiple conditions matching on an ORing config_setting_group.""" 457*bcb5dc79SHONG Yifan boolean_attr_rule( 458*bcb5dc79SHONG Yifan name = "or_config_setting_group_multiple_conds_match_rule", 459*bcb5dc79SHONG Yifan myboolean = select( 460*bcb5dc79SHONG Yifan { 461*bcb5dc79SHONG Yifan ":1_or_2_or_3": True, 462*bcb5dc79SHONG Yifan "//conditions:default": False, 463*bcb5dc79SHONG Yifan }, 464*bcb5dc79SHONG Yifan ), 465*bcb5dc79SHONG Yifan ) 466*bcb5dc79SHONG Yifan or_config_setting_group_multiple_conds_match_test( 467*bcb5dc79SHONG Yifan name = "or_config_setting_group_multiple_conds_match_test", 468*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_multiple_conds_match_rule", 469*bcb5dc79SHONG Yifan ) 470*bcb5dc79SHONG Yifan 471*bcb5dc79SHONG Yifan################################################### 472*bcb5dc79SHONG Yifan# or_config_setting_group_all_conds_match_test 473*bcb5dc79SHONG Yifan################################################### 474*bcb5dc79SHONG Yifanor_config_setting_group_all_conds_match_test = analysistest.make( 475*bcb5dc79SHONG Yifan _expect_matches, 476*bcb5dc79SHONG Yifan config_settings = _set_conditions([False, True, True]), 477*bcb5dc79SHONG Yifan) 478*bcb5dc79SHONG Yifan 479*bcb5dc79SHONG Yifandef _or_config_setting_group_all_conds_match_test(): 480*bcb5dc79SHONG Yifan """Test verifying all conditions matching on an ORing config_setting_group.""" 481*bcb5dc79SHONG Yifan boolean_attr_rule( 482*bcb5dc79SHONG Yifan name = "or_config_setting_group_all_conds_match_rule", 483*bcb5dc79SHONG Yifan myboolean = select( 484*bcb5dc79SHONG Yifan { 485*bcb5dc79SHONG Yifan ":1_or_2_or_3": True, 486*bcb5dc79SHONG Yifan "//conditions:default": False, 487*bcb5dc79SHONG Yifan }, 488*bcb5dc79SHONG Yifan ), 489*bcb5dc79SHONG Yifan ) 490*bcb5dc79SHONG Yifan or_config_setting_group_all_conds_match_test( 491*bcb5dc79SHONG Yifan name = "or_config_setting_group_all_conds_match_test", 492*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_all_conds_match_rule", 493*bcb5dc79SHONG Yifan ) 494*bcb5dc79SHONG Yifan 495*bcb5dc79SHONG Yifan################################################### 496*bcb5dc79SHONG Yifan# or_config_setting_group_single_setting_matches_test 497*bcb5dc79SHONG Yifan################################################### 498*bcb5dc79SHONG Yifanor_config_setting_group_single_setting_matches_test = analysistest.make( 499*bcb5dc79SHONG Yifan _expect_matches, 500*bcb5dc79SHONG Yifan config_settings = {"//command_line_option:cpu": "ppc"}, 501*bcb5dc79SHONG Yifan) 502*bcb5dc79SHONG Yifan 503*bcb5dc79SHONG Yifandef _or_config_setting_group_single_setting_matches_test(): 504*bcb5dc79SHONG Yifan """Test verifying match on single-entry ORing config_setting_group.""" 505*bcb5dc79SHONG Yifan boolean_attr_rule( 506*bcb5dc79SHONG Yifan name = "or_config_setting_group_single_setting_matches_rule", 507*bcb5dc79SHONG Yifan myboolean = select( 508*bcb5dc79SHONG Yifan { 509*bcb5dc79SHONG Yifan ":1_or_nothing_else": True, 510*bcb5dc79SHONG Yifan "//conditions:default": False, 511*bcb5dc79SHONG Yifan }, 512*bcb5dc79SHONG Yifan ), 513*bcb5dc79SHONG Yifan ) 514*bcb5dc79SHONG Yifan or_config_setting_group_single_setting_matches_test( 515*bcb5dc79SHONG Yifan name = "or_config_setting_group_single_setting_matches_test", 516*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_single_setting_matches_rule", 517*bcb5dc79SHONG Yifan ) 518*bcb5dc79SHONG Yifan 519*bcb5dc79SHONG Yifan################################################### 520*bcb5dc79SHONG Yifan# or_config_setting_group_single_setting_fails_test 521*bcb5dc79SHONG Yifan################################################### 522*bcb5dc79SHONG Yifanor_config_setting_group_single_setting_fails_test = analysistest.make( 523*bcb5dc79SHONG Yifan _expect_doesnt_match, 524*bcb5dc79SHONG Yifan config_settings = {"//command_line_option:cpu": "x86"}, 525*bcb5dc79SHONG Yifan) 526*bcb5dc79SHONG Yifan 527*bcb5dc79SHONG Yifandef _or_config_setting_group_single_setting_fails_test(): 528*bcb5dc79SHONG Yifan """Test verifying no match on single-entry ORing config_setting_group.""" 529*bcb5dc79SHONG Yifan boolean_attr_rule( 530*bcb5dc79SHONG Yifan name = "or_config_setting_group_single_setting_fails_rule", 531*bcb5dc79SHONG Yifan myboolean = select( 532*bcb5dc79SHONG Yifan { 533*bcb5dc79SHONG Yifan ":1_or_nothing_else": True, 534*bcb5dc79SHONG Yifan "//conditions:default": False, 535*bcb5dc79SHONG Yifan }, 536*bcb5dc79SHONG Yifan ), 537*bcb5dc79SHONG Yifan ) 538*bcb5dc79SHONG Yifan or_config_setting_group_single_setting_fails_test( 539*bcb5dc79SHONG Yifan name = "or_config_setting_group_single_setting_fails_test", 540*bcb5dc79SHONG Yifan target_under_test = ":or_config_setting_group_single_setting_fails_rule", 541*bcb5dc79SHONG Yifan ) 542*bcb5dc79SHONG Yifan 543*bcb5dc79SHONG Yifan################################################### 544*bcb5dc79SHONG Yifan# always_true_match_all_test 545*bcb5dc79SHONG Yifan################################################### 546*bcb5dc79SHONG Yifanalways_true_match_all_test = analysistest.make(_expect_matches) 547*bcb5dc79SHONG Yifan 548*bcb5dc79SHONG Yifandef _always_true_match_all_test(): 549*bcb5dc79SHONG Yifan """Tests that "match_all=['//conditions:default']" always matches.""" 550*bcb5dc79SHONG Yifan selects.config_setting_group( 551*bcb5dc79SHONG Yifan name = "all_always_match", 552*bcb5dc79SHONG Yifan match_all = ["//conditions:default"], 553*bcb5dc79SHONG Yifan ) 554*bcb5dc79SHONG Yifan boolean_attr_rule( 555*bcb5dc79SHONG Yifan name = "match_always_true_rule", 556*bcb5dc79SHONG Yifan myboolean = select( 557*bcb5dc79SHONG Yifan { 558*bcb5dc79SHONG Yifan ":all_always_match": True, 559*bcb5dc79SHONG Yifan }, 560*bcb5dc79SHONG Yifan ), 561*bcb5dc79SHONG Yifan ) 562*bcb5dc79SHONG Yifan always_true_match_all_test( 563*bcb5dc79SHONG Yifan name = "always_true_match_all_test", 564*bcb5dc79SHONG Yifan target_under_test = ":match_always_true_rule", 565*bcb5dc79SHONG Yifan ) 566*bcb5dc79SHONG Yifan 567*bcb5dc79SHONG Yifan################################################### 568*bcb5dc79SHONG Yifan# always_true_match_any_test 569*bcb5dc79SHONG Yifan################################################### 570*bcb5dc79SHONG Yifanalways_true_match_any_test = analysistest.make(_expect_matches) 571*bcb5dc79SHONG Yifan 572*bcb5dc79SHONG Yifandef _always_true_match_any_test(): 573*bcb5dc79SHONG Yifan """Tests that "match_any=['//conditions:default']" always matches.""" 574*bcb5dc79SHONG Yifan selects.config_setting_group( 575*bcb5dc79SHONG Yifan name = "any_always_match", 576*bcb5dc79SHONG Yifan match_any = ["//conditions:default"], 577*bcb5dc79SHONG Yifan ) 578*bcb5dc79SHONG Yifan boolean_attr_rule( 579*bcb5dc79SHONG Yifan name = "match_any_always_true_rule", 580*bcb5dc79SHONG Yifan myboolean = select( 581*bcb5dc79SHONG Yifan { 582*bcb5dc79SHONG Yifan ":any_always_match": True, 583*bcb5dc79SHONG Yifan }, 584*bcb5dc79SHONG Yifan ), 585*bcb5dc79SHONG Yifan ) 586*bcb5dc79SHONG Yifan always_true_match_any_test( 587*bcb5dc79SHONG Yifan name = "always_true_match_any_test", 588*bcb5dc79SHONG Yifan target_under_test = ":match_any_always_true_rule", 589*bcb5dc79SHONG Yifan ) 590*bcb5dc79SHONG Yifan 591*bcb5dc79SHONG Yifan################################################### 592*bcb5dc79SHONG Yifan# empty_config_setting_group_not_allowed_test 593*bcb5dc79SHONG Yifan################################################### 594*bcb5dc79SHONG Yifan 595*bcb5dc79SHONG Yifan# config_setting_group with no parameters triggers a failure. 596*bcb5dc79SHONG Yifan# TODO: how do we test this? This requires catching macro 597*bcb5dc79SHONG Yifan# evaluation failure. 598*bcb5dc79SHONG Yifan 599*bcb5dc79SHONG Yifan################################################### 600*bcb5dc79SHONG Yifan# and_and_or_not_allowed_together_test 601*bcb5dc79SHONG Yifan################################################### 602*bcb5dc79SHONG Yifan 603*bcb5dc79SHONG Yifan# config_setting_group: setting both match_any and match_or 604*bcb5dc79SHONG Yifan# triggers a failure. 605*bcb5dc79SHONG Yifan# TODO: how do we test this? This requires catching macro 606*bcb5dc79SHONG Yifan# evaluation failure. 607*bcb5dc79SHONG Yifan 608*bcb5dc79SHONG Yifan################################################### 609*bcb5dc79SHONG Yifan 610*bcb5dc79SHONG Yifan# buildifier: disable=unnamed-macro 611*bcb5dc79SHONG Yifandef selects_test_suite(): 612*bcb5dc79SHONG Yifan """Creates the test targets and test suite for selects.bzl tests.""" 613*bcb5dc79SHONG Yifan unittest.suite( 614*bcb5dc79SHONG Yifan "selects_tests", 615*bcb5dc79SHONG Yifan with_or_test, 616*bcb5dc79SHONG Yifan ) 617*bcb5dc79SHONG Yifan 618*bcb5dc79SHONG Yifan _create_config_settings() 619*bcb5dc79SHONG Yifan _create_config_setting_groups() 620*bcb5dc79SHONG Yifan 621*bcb5dc79SHONG Yifan _and_config_setting_group_matches_test() 622*bcb5dc79SHONG Yifan _and_config_setting_group_first_match_fails_test() 623*bcb5dc79SHONG Yifan _and_config_setting_group_middle_match_fails_test() 624*bcb5dc79SHONG Yifan _and_config_setting_group_last_match_fails_test() 625*bcb5dc79SHONG Yifan _and_config_setting_group_multiple_matches_fail_test() 626*bcb5dc79SHONG Yifan _and_config_setting_group_all_matches_fail_test() 627*bcb5dc79SHONG Yifan _and_config_setting_group_single_setting_matches_test() 628*bcb5dc79SHONG Yifan _and_config_setting_group_single_setting_fails_test() 629*bcb5dc79SHONG Yifan 630*bcb5dc79SHONG Yifan _or_config_setting_group_no_matches_test() 631*bcb5dc79SHONG Yifan _or_config_setting_group_first_cond_matches_test() 632*bcb5dc79SHONG Yifan _or_config_setting_group_middle_cond_matches_test() 633*bcb5dc79SHONG Yifan _or_config_setting_group_last_cond_matches_test() 634*bcb5dc79SHONG Yifan _or_config_setting_group_multiple_conds_match_test() 635*bcb5dc79SHONG Yifan _or_config_setting_group_all_conds_match_test() 636*bcb5dc79SHONG Yifan _or_config_setting_group_single_setting_matches_test() 637*bcb5dc79SHONG Yifan _or_config_setting_group_single_setting_fails_test() 638*bcb5dc79SHONG Yifan 639*bcb5dc79SHONG Yifan _always_true_match_all_test() 640*bcb5dc79SHONG Yifan _always_true_match_any_test() 641*bcb5dc79SHONG Yifan 642*bcb5dc79SHONG Yifan # _empty_config_setting_group_not_allowed_test() 643*bcb5dc79SHONG Yifan # _and_and_or_not_allowed_together_test() 644