1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "reflect" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 23*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerfunc TestSelects(t *testing.T) { 27*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 28*333d2b36SAndroid Build Coastguard Worker name string 29*333d2b36SAndroid Build Coastguard Worker bp string 30*333d2b36SAndroid Build Coastguard Worker fs MockFS 31*333d2b36SAndroid Build Coastguard Worker provider selectsTestProvider 32*333d2b36SAndroid Build Coastguard Worker providers map[string]selectsTestProvider 33*333d2b36SAndroid Build Coastguard Worker vendorVars map[string]map[string]string 34*333d2b36SAndroid Build Coastguard Worker vendorVarTypes map[string]map[string]string 35*333d2b36SAndroid Build Coastguard Worker expectedError string 36*333d2b36SAndroid Build Coastguard Worker }{ 37*333d2b36SAndroid Build Coastguard Worker { 38*333d2b36SAndroid Build Coastguard Worker name: "basic string list", 39*333d2b36SAndroid Build Coastguard Worker bp: ` 40*333d2b36SAndroid Build Coastguard Worker my_module_type { 41*333d2b36SAndroid Build Coastguard Worker name: "foo", 42*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 43*333d2b36SAndroid Build Coastguard Worker "a": ["a.cpp"], 44*333d2b36SAndroid Build Coastguard Worker "b": ["b.cpp"], 45*333d2b36SAndroid Build Coastguard Worker default: ["c.cpp"], 46*333d2b36SAndroid Build Coastguard Worker }), 47*333d2b36SAndroid Build Coastguard Worker } 48*333d2b36SAndroid Build Coastguard Worker `, 49*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 50*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"c.cpp"}, 51*333d2b36SAndroid Build Coastguard Worker }, 52*333d2b36SAndroid Build Coastguard Worker }, 53*333d2b36SAndroid Build Coastguard Worker { 54*333d2b36SAndroid Build Coastguard Worker name: "basic string", 55*333d2b36SAndroid Build Coastguard Worker bp: ` 56*333d2b36SAndroid Build Coastguard Worker my_module_type { 57*333d2b36SAndroid Build Coastguard Worker name: "foo", 58*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 59*333d2b36SAndroid Build Coastguard Worker "a": "a.cpp", 60*333d2b36SAndroid Build Coastguard Worker "b": "b.cpp", 61*333d2b36SAndroid Build Coastguard Worker default: "c.cpp", 62*333d2b36SAndroid Build Coastguard Worker }), 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker `, 65*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 66*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("c.cpp"), 67*333d2b36SAndroid Build Coastguard Worker }, 68*333d2b36SAndroid Build Coastguard Worker }, 69*333d2b36SAndroid Build Coastguard Worker { 70*333d2b36SAndroid Build Coastguard Worker name: "basic bool", 71*333d2b36SAndroid Build Coastguard Worker bp: ` 72*333d2b36SAndroid Build Coastguard Worker my_module_type { 73*333d2b36SAndroid Build Coastguard Worker name: "foo", 74*333d2b36SAndroid Build Coastguard Worker my_bool: select(soong_config_variable("my_namespace", "my_variable"), { 75*333d2b36SAndroid Build Coastguard Worker "a": true, 76*333d2b36SAndroid Build Coastguard Worker "b": false, 77*333d2b36SAndroid Build Coastguard Worker default: true, 78*333d2b36SAndroid Build Coastguard Worker }), 79*333d2b36SAndroid Build Coastguard Worker } 80*333d2b36SAndroid Build Coastguard Worker `, 81*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 82*333d2b36SAndroid Build Coastguard Worker my_bool: proptools.BoolPtr(true), 83*333d2b36SAndroid Build Coastguard Worker }, 84*333d2b36SAndroid Build Coastguard Worker }, 85*333d2b36SAndroid Build Coastguard Worker { 86*333d2b36SAndroid Build Coastguard Worker name: "basic paths", 87*333d2b36SAndroid Build Coastguard Worker bp: ` 88*333d2b36SAndroid Build Coastguard Worker my_module_type { 89*333d2b36SAndroid Build Coastguard Worker name: "foo", 90*333d2b36SAndroid Build Coastguard Worker my_paths: select(soong_config_variable("my_namespace", "my_variable"), { 91*333d2b36SAndroid Build Coastguard Worker "a": ["foo.txt"], 92*333d2b36SAndroid Build Coastguard Worker "b": ["bar.txt"], 93*333d2b36SAndroid Build Coastguard Worker default: ["baz.txt"], 94*333d2b36SAndroid Build Coastguard Worker }), 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker `, 97*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 98*333d2b36SAndroid Build Coastguard Worker my_paths: &[]string{"baz.txt"}, 99*333d2b36SAndroid Build Coastguard Worker }, 100*333d2b36SAndroid Build Coastguard Worker }, 101*333d2b36SAndroid Build Coastguard Worker { 102*333d2b36SAndroid Build Coastguard Worker name: "Expression in select", 103*333d2b36SAndroid Build Coastguard Worker bp: ` 104*333d2b36SAndroid Build Coastguard Worker my_module_type { 105*333d2b36SAndroid Build Coastguard Worker name: "foo", 106*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 107*333d2b36SAndroid Build Coastguard Worker "a": "foo" + "bar", 108*333d2b36SAndroid Build Coastguard Worker default: "baz", 109*333d2b36SAndroid Build Coastguard Worker }), 110*333d2b36SAndroid Build Coastguard Worker } 111*333d2b36SAndroid Build Coastguard Worker `, 112*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 113*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("foobar"), 114*333d2b36SAndroid Build Coastguard Worker }, 115*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 116*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 117*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 118*333d2b36SAndroid Build Coastguard Worker }, 119*333d2b36SAndroid Build Coastguard Worker }, 120*333d2b36SAndroid Build Coastguard Worker }, 121*333d2b36SAndroid Build Coastguard Worker { 122*333d2b36SAndroid Build Coastguard Worker name: "paths with module references", 123*333d2b36SAndroid Build Coastguard Worker bp: ` 124*333d2b36SAndroid Build Coastguard Worker my_module_type { 125*333d2b36SAndroid Build Coastguard Worker name: "foo", 126*333d2b36SAndroid Build Coastguard Worker my_paths: select(soong_config_variable("my_namespace", "my_variable"), { 127*333d2b36SAndroid Build Coastguard Worker "a": [":a"], 128*333d2b36SAndroid Build Coastguard Worker "b": [":b"], 129*333d2b36SAndroid Build Coastguard Worker default: [":c"], 130*333d2b36SAndroid Build Coastguard Worker }), 131*333d2b36SAndroid Build Coastguard Worker } 132*333d2b36SAndroid Build Coastguard Worker `, 133*333d2b36SAndroid Build Coastguard Worker expectedError: `"foo" depends on undefined module "c"`, 134*333d2b36SAndroid Build Coastguard Worker }, 135*333d2b36SAndroid Build Coastguard Worker { 136*333d2b36SAndroid Build Coastguard Worker name: "Select type doesn't match property type", 137*333d2b36SAndroid Build Coastguard Worker bp: ` 138*333d2b36SAndroid Build Coastguard Worker my_module_type { 139*333d2b36SAndroid Build Coastguard Worker name: "foo", 140*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 141*333d2b36SAndroid Build Coastguard Worker "a": false, 142*333d2b36SAndroid Build Coastguard Worker "b": true, 143*333d2b36SAndroid Build Coastguard Worker default: true, 144*333d2b36SAndroid Build Coastguard Worker }), 145*333d2b36SAndroid Build Coastguard Worker } 146*333d2b36SAndroid Build Coastguard Worker `, 147*333d2b36SAndroid Build Coastguard Worker expectedError: `can't assign bool value to string property`, 148*333d2b36SAndroid Build Coastguard Worker }, 149*333d2b36SAndroid Build Coastguard Worker { 150*333d2b36SAndroid Build Coastguard Worker name: "String list non-default", 151*333d2b36SAndroid Build Coastguard Worker bp: ` 152*333d2b36SAndroid Build Coastguard Worker my_module_type { 153*333d2b36SAndroid Build Coastguard Worker name: "foo", 154*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 155*333d2b36SAndroid Build Coastguard Worker "a": ["a.cpp"], 156*333d2b36SAndroid Build Coastguard Worker "b": ["b.cpp"], 157*333d2b36SAndroid Build Coastguard Worker default: ["c.cpp"], 158*333d2b36SAndroid Build Coastguard Worker }), 159*333d2b36SAndroid Build Coastguard Worker } 160*333d2b36SAndroid Build Coastguard Worker `, 161*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 162*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"a.cpp"}, 163*333d2b36SAndroid Build Coastguard Worker }, 164*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 165*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 166*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 167*333d2b36SAndroid Build Coastguard Worker }, 168*333d2b36SAndroid Build Coastguard Worker }, 169*333d2b36SAndroid Build Coastguard Worker }, 170*333d2b36SAndroid Build Coastguard Worker { 171*333d2b36SAndroid Build Coastguard Worker name: "String list append", 172*333d2b36SAndroid Build Coastguard Worker bp: ` 173*333d2b36SAndroid Build Coastguard Worker my_module_type { 174*333d2b36SAndroid Build Coastguard Worker name: "foo", 175*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 176*333d2b36SAndroid Build Coastguard Worker "a": ["a.cpp"], 177*333d2b36SAndroid Build Coastguard Worker "b": ["b.cpp"], 178*333d2b36SAndroid Build Coastguard Worker default: ["c.cpp"], 179*333d2b36SAndroid Build Coastguard Worker }) + select(soong_config_variable("my_namespace", "my_variable_2"), { 180*333d2b36SAndroid Build Coastguard Worker "a2": ["a2.cpp"], 181*333d2b36SAndroid Build Coastguard Worker "b2": ["b2.cpp"], 182*333d2b36SAndroid Build Coastguard Worker default: ["c2.cpp"], 183*333d2b36SAndroid Build Coastguard Worker }), 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker `, 186*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 187*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"a.cpp", "c2.cpp"}, 188*333d2b36SAndroid Build Coastguard Worker }, 189*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 190*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 191*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 192*333d2b36SAndroid Build Coastguard Worker }, 193*333d2b36SAndroid Build Coastguard Worker }, 194*333d2b36SAndroid Build Coastguard Worker }, 195*333d2b36SAndroid Build Coastguard Worker { 196*333d2b36SAndroid Build Coastguard Worker name: "String list prepend literal", 197*333d2b36SAndroid Build Coastguard Worker bp: ` 198*333d2b36SAndroid Build Coastguard Worker my_module_type { 199*333d2b36SAndroid Build Coastguard Worker name: "foo", 200*333d2b36SAndroid Build Coastguard Worker my_string_list: ["literal.cpp"] + select(soong_config_variable("my_namespace", "my_variable"), { 201*333d2b36SAndroid Build Coastguard Worker "a2": ["a2.cpp"], 202*333d2b36SAndroid Build Coastguard Worker "b2": ["b2.cpp"], 203*333d2b36SAndroid Build Coastguard Worker default: ["c2.cpp"], 204*333d2b36SAndroid Build Coastguard Worker }), 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker `, 207*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 208*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"literal.cpp", "c2.cpp"}, 209*333d2b36SAndroid Build Coastguard Worker }, 210*333d2b36SAndroid Build Coastguard Worker }, 211*333d2b36SAndroid Build Coastguard Worker { 212*333d2b36SAndroid Build Coastguard Worker name: "String list append literal", 213*333d2b36SAndroid Build Coastguard Worker bp: ` 214*333d2b36SAndroid Build Coastguard Worker my_module_type { 215*333d2b36SAndroid Build Coastguard Worker name: "foo", 216*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 217*333d2b36SAndroid Build Coastguard Worker "a2": ["a2.cpp"], 218*333d2b36SAndroid Build Coastguard Worker "b2": ["b2.cpp"], 219*333d2b36SAndroid Build Coastguard Worker default: ["c2.cpp"], 220*333d2b36SAndroid Build Coastguard Worker }) + ["literal.cpp"], 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker `, 223*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 224*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"c2.cpp", "literal.cpp"}, 225*333d2b36SAndroid Build Coastguard Worker }, 226*333d2b36SAndroid Build Coastguard Worker }, 227*333d2b36SAndroid Build Coastguard Worker { 228*333d2b36SAndroid Build Coastguard Worker name: "true + false = true", 229*333d2b36SAndroid Build Coastguard Worker bp: ` 230*333d2b36SAndroid Build Coastguard Worker my_module_type { 231*333d2b36SAndroid Build Coastguard Worker name: "foo", 232*333d2b36SAndroid Build Coastguard Worker my_bool: select(soong_config_variable("my_namespace", "my_variable"), { 233*333d2b36SAndroid Build Coastguard Worker "a": true, 234*333d2b36SAndroid Build Coastguard Worker "b": false, 235*333d2b36SAndroid Build Coastguard Worker default: true, 236*333d2b36SAndroid Build Coastguard Worker }) + false, 237*333d2b36SAndroid Build Coastguard Worker } 238*333d2b36SAndroid Build Coastguard Worker `, 239*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 240*333d2b36SAndroid Build Coastguard Worker my_bool: proptools.BoolPtr(true), 241*333d2b36SAndroid Build Coastguard Worker }, 242*333d2b36SAndroid Build Coastguard Worker }, 243*333d2b36SAndroid Build Coastguard Worker { 244*333d2b36SAndroid Build Coastguard Worker name: "false + false = false", 245*333d2b36SAndroid Build Coastguard Worker bp: ` 246*333d2b36SAndroid Build Coastguard Worker my_module_type { 247*333d2b36SAndroid Build Coastguard Worker name: "foo", 248*333d2b36SAndroid Build Coastguard Worker my_bool: select(soong_config_variable("my_namespace", "my_variable"), { 249*333d2b36SAndroid Build Coastguard Worker "a": true, 250*333d2b36SAndroid Build Coastguard Worker "b": false, 251*333d2b36SAndroid Build Coastguard Worker default: true, 252*333d2b36SAndroid Build Coastguard Worker }) + false, 253*333d2b36SAndroid Build Coastguard Worker } 254*333d2b36SAndroid Build Coastguard Worker `, 255*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 256*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 257*333d2b36SAndroid Build Coastguard Worker "my_variable": "b", 258*333d2b36SAndroid Build Coastguard Worker }, 259*333d2b36SAndroid Build Coastguard Worker }, 260*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 261*333d2b36SAndroid Build Coastguard Worker my_bool: proptools.BoolPtr(false), 262*333d2b36SAndroid Build Coastguard Worker }, 263*333d2b36SAndroid Build Coastguard Worker }, 264*333d2b36SAndroid Build Coastguard Worker { 265*333d2b36SAndroid Build Coastguard Worker name: "Append string", 266*333d2b36SAndroid Build Coastguard Worker bp: ` 267*333d2b36SAndroid Build Coastguard Worker my_module_type { 268*333d2b36SAndroid Build Coastguard Worker name: "foo", 269*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 270*333d2b36SAndroid Build Coastguard Worker "a": "a", 271*333d2b36SAndroid Build Coastguard Worker "b": "b", 272*333d2b36SAndroid Build Coastguard Worker default: "c", 273*333d2b36SAndroid Build Coastguard Worker }) + ".cpp", 274*333d2b36SAndroid Build Coastguard Worker } 275*333d2b36SAndroid Build Coastguard Worker `, 276*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 277*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("c.cpp"), 278*333d2b36SAndroid Build Coastguard Worker }, 279*333d2b36SAndroid Build Coastguard Worker }, 280*333d2b36SAndroid Build Coastguard Worker { 281*333d2b36SAndroid Build Coastguard Worker name: "Select on arch", 282*333d2b36SAndroid Build Coastguard Worker bp: ` 283*333d2b36SAndroid Build Coastguard Worker my_module_type { 284*333d2b36SAndroid Build Coastguard Worker name: "foo", 285*333d2b36SAndroid Build Coastguard Worker my_string: select(arch(), { 286*333d2b36SAndroid Build Coastguard Worker "x86": "my_x86", 287*333d2b36SAndroid Build Coastguard Worker "x86_64": "my_x86_64", 288*333d2b36SAndroid Build Coastguard Worker "arm": "my_arm", 289*333d2b36SAndroid Build Coastguard Worker "arm64": "my_arm64", 290*333d2b36SAndroid Build Coastguard Worker default: "my_default", 291*333d2b36SAndroid Build Coastguard Worker }), 292*333d2b36SAndroid Build Coastguard Worker } 293*333d2b36SAndroid Build Coastguard Worker `, 294*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 295*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("my_arm64"), 296*333d2b36SAndroid Build Coastguard Worker }, 297*333d2b36SAndroid Build Coastguard Worker }, 298*333d2b36SAndroid Build Coastguard Worker { 299*333d2b36SAndroid Build Coastguard Worker name: "Select on os", 300*333d2b36SAndroid Build Coastguard Worker bp: ` 301*333d2b36SAndroid Build Coastguard Worker my_module_type { 302*333d2b36SAndroid Build Coastguard Worker name: "foo", 303*333d2b36SAndroid Build Coastguard Worker my_string: select(os(), { 304*333d2b36SAndroid Build Coastguard Worker "android": "my_android", 305*333d2b36SAndroid Build Coastguard Worker "linux": "my_linux", 306*333d2b36SAndroid Build Coastguard Worker default: "my_default", 307*333d2b36SAndroid Build Coastguard Worker }), 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker `, 310*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 311*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("my_android"), 312*333d2b36SAndroid Build Coastguard Worker }, 313*333d2b36SAndroid Build Coastguard Worker }, 314*333d2b36SAndroid Build Coastguard Worker { 315*333d2b36SAndroid Build Coastguard Worker name: "Unset value", 316*333d2b36SAndroid Build Coastguard Worker bp: ` 317*333d2b36SAndroid Build Coastguard Worker my_module_type { 318*333d2b36SAndroid Build Coastguard Worker name: "foo", 319*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 320*333d2b36SAndroid Build Coastguard Worker "a": unset, 321*333d2b36SAndroid Build Coastguard Worker "b": "b", 322*333d2b36SAndroid Build Coastguard Worker default: "c", 323*333d2b36SAndroid Build Coastguard Worker }) 324*333d2b36SAndroid Build Coastguard Worker } 325*333d2b36SAndroid Build Coastguard Worker `, 326*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 327*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 328*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 329*333d2b36SAndroid Build Coastguard Worker }, 330*333d2b36SAndroid Build Coastguard Worker }, 331*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{}, 332*333d2b36SAndroid Build Coastguard Worker }, 333*333d2b36SAndroid Build Coastguard Worker { 334*333d2b36SAndroid Build Coastguard Worker name: "Unset value on different branch", 335*333d2b36SAndroid Build Coastguard Worker bp: ` 336*333d2b36SAndroid Build Coastguard Worker my_module_type { 337*333d2b36SAndroid Build Coastguard Worker name: "foo", 338*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 339*333d2b36SAndroid Build Coastguard Worker "a": unset, 340*333d2b36SAndroid Build Coastguard Worker "b": "b", 341*333d2b36SAndroid Build Coastguard Worker default: "c", 342*333d2b36SAndroid Build Coastguard Worker }) 343*333d2b36SAndroid Build Coastguard Worker } 344*333d2b36SAndroid Build Coastguard Worker `, 345*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 346*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("c"), 347*333d2b36SAndroid Build Coastguard Worker }, 348*333d2b36SAndroid Build Coastguard Worker }, 349*333d2b36SAndroid Build Coastguard Worker { 350*333d2b36SAndroid Build Coastguard Worker name: "unset + unset = unset", 351*333d2b36SAndroid Build Coastguard Worker bp: ` 352*333d2b36SAndroid Build Coastguard Worker my_module_type { 353*333d2b36SAndroid Build Coastguard Worker name: "foo", 354*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 355*333d2b36SAndroid Build Coastguard Worker "foo": "bar", 356*333d2b36SAndroid Build Coastguard Worker default: unset, 357*333d2b36SAndroid Build Coastguard Worker }) + select(soong_config_variable("my_namespace", "my_variable2"), { 358*333d2b36SAndroid Build Coastguard Worker "baz": "qux", 359*333d2b36SAndroid Build Coastguard Worker default: unset, 360*333d2b36SAndroid Build Coastguard Worker }) 361*333d2b36SAndroid Build Coastguard Worker } 362*333d2b36SAndroid Build Coastguard Worker `, 363*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{}, 364*333d2b36SAndroid Build Coastguard Worker }, 365*333d2b36SAndroid Build Coastguard Worker { 366*333d2b36SAndroid Build Coastguard Worker name: "unset + string = string", 367*333d2b36SAndroid Build Coastguard Worker bp: ` 368*333d2b36SAndroid Build Coastguard Worker my_module_type { 369*333d2b36SAndroid Build Coastguard Worker name: "foo", 370*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 371*333d2b36SAndroid Build Coastguard Worker "foo": "bar", 372*333d2b36SAndroid Build Coastguard Worker default: unset, 373*333d2b36SAndroid Build Coastguard Worker }) + select(soong_config_variable("my_namespace", "my_variable2"), { 374*333d2b36SAndroid Build Coastguard Worker default: "a", 375*333d2b36SAndroid Build Coastguard Worker }) 376*333d2b36SAndroid Build Coastguard Worker } 377*333d2b36SAndroid Build Coastguard Worker `, 378*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 379*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("a"), 380*333d2b36SAndroid Build Coastguard Worker }, 381*333d2b36SAndroid Build Coastguard Worker }, 382*333d2b36SAndroid Build Coastguard Worker { 383*333d2b36SAndroid Build Coastguard Worker name: "unset + bool = bool", 384*333d2b36SAndroid Build Coastguard Worker bp: ` 385*333d2b36SAndroid Build Coastguard Worker my_module_type { 386*333d2b36SAndroid Build Coastguard Worker name: "foo", 387*333d2b36SAndroid Build Coastguard Worker my_bool: select(soong_config_variable("my_namespace", "my_variable"), { 388*333d2b36SAndroid Build Coastguard Worker "a": true, 389*333d2b36SAndroid Build Coastguard Worker default: unset, 390*333d2b36SAndroid Build Coastguard Worker }) + select(soong_config_variable("my_namespace", "my_variable2"), { 391*333d2b36SAndroid Build Coastguard Worker default: true, 392*333d2b36SAndroid Build Coastguard Worker }) 393*333d2b36SAndroid Build Coastguard Worker } 394*333d2b36SAndroid Build Coastguard Worker `, 395*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 396*333d2b36SAndroid Build Coastguard Worker my_bool: proptools.BoolPtr(true), 397*333d2b36SAndroid Build Coastguard Worker }, 398*333d2b36SAndroid Build Coastguard Worker }, 399*333d2b36SAndroid Build Coastguard Worker { 400*333d2b36SAndroid Build Coastguard Worker name: "defaults with lists are appended", 401*333d2b36SAndroid Build Coastguard Worker bp: ` 402*333d2b36SAndroid Build Coastguard Worker my_module_type { 403*333d2b36SAndroid Build Coastguard Worker name: "foo", 404*333d2b36SAndroid Build Coastguard Worker defaults: ["bar"], 405*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 406*333d2b36SAndroid Build Coastguard Worker "a": ["a1"], 407*333d2b36SAndroid Build Coastguard Worker default: ["b1"], 408*333d2b36SAndroid Build Coastguard Worker }), 409*333d2b36SAndroid Build Coastguard Worker } 410*333d2b36SAndroid Build Coastguard Worker my_defaults { 411*333d2b36SAndroid Build Coastguard Worker name: "bar", 412*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable2"), { 413*333d2b36SAndroid Build Coastguard Worker "a": ["a2"], 414*333d2b36SAndroid Build Coastguard Worker default: ["b2"], 415*333d2b36SAndroid Build Coastguard Worker }), 416*333d2b36SAndroid Build Coastguard Worker } 417*333d2b36SAndroid Build Coastguard Worker `, 418*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 419*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"b2", "b1"}, 420*333d2b36SAndroid Build Coastguard Worker }, 421*333d2b36SAndroid Build Coastguard Worker }, 422*333d2b36SAndroid Build Coastguard Worker { 423*333d2b36SAndroid Build Coastguard Worker name: "defaults applied to multiple modules", 424*333d2b36SAndroid Build Coastguard Worker bp: ` 425*333d2b36SAndroid Build Coastguard Worker my_module_type { 426*333d2b36SAndroid Build Coastguard Worker name: "foo2", 427*333d2b36SAndroid Build Coastguard Worker defaults: ["bar"], 428*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 429*333d2b36SAndroid Build Coastguard Worker "a": ["a1"], 430*333d2b36SAndroid Build Coastguard Worker default: ["b1"], 431*333d2b36SAndroid Build Coastguard Worker }), 432*333d2b36SAndroid Build Coastguard Worker } 433*333d2b36SAndroid Build Coastguard Worker my_module_type { 434*333d2b36SAndroid Build Coastguard Worker name: "foo", 435*333d2b36SAndroid Build Coastguard Worker defaults: ["bar"], 436*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 437*333d2b36SAndroid Build Coastguard Worker "a": ["a1"], 438*333d2b36SAndroid Build Coastguard Worker default: ["b1"], 439*333d2b36SAndroid Build Coastguard Worker }), 440*333d2b36SAndroid Build Coastguard Worker } 441*333d2b36SAndroid Build Coastguard Worker my_defaults { 442*333d2b36SAndroid Build Coastguard Worker name: "bar", 443*333d2b36SAndroid Build Coastguard Worker my_string_list: select(soong_config_variable("my_namespace", "my_variable2"), { 444*333d2b36SAndroid Build Coastguard Worker "a": ["a2"], 445*333d2b36SAndroid Build Coastguard Worker default: ["b2"], 446*333d2b36SAndroid Build Coastguard Worker }), 447*333d2b36SAndroid Build Coastguard Worker } 448*333d2b36SAndroid Build Coastguard Worker `, 449*333d2b36SAndroid Build Coastguard Worker providers: map[string]selectsTestProvider{ 450*333d2b36SAndroid Build Coastguard Worker "foo": { 451*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"b2", "b1"}, 452*333d2b36SAndroid Build Coastguard Worker }, 453*333d2b36SAndroid Build Coastguard Worker "foo2": { 454*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"b2", "b1"}, 455*333d2b36SAndroid Build Coastguard Worker }, 456*333d2b36SAndroid Build Coastguard Worker }, 457*333d2b36SAndroid Build Coastguard Worker }, 458*333d2b36SAndroid Build Coastguard Worker { 459*333d2b36SAndroid Build Coastguard Worker name: "Replacing string list", 460*333d2b36SAndroid Build Coastguard Worker bp: ` 461*333d2b36SAndroid Build Coastguard Worker my_module_type { 462*333d2b36SAndroid Build Coastguard Worker name: "foo", 463*333d2b36SAndroid Build Coastguard Worker defaults: ["bar"], 464*333d2b36SAndroid Build Coastguard Worker replacing_string_list: select(soong_config_variable("my_namespace", "my_variable"), { 465*333d2b36SAndroid Build Coastguard Worker "a": ["a1"], 466*333d2b36SAndroid Build Coastguard Worker default: ["b1"], 467*333d2b36SAndroid Build Coastguard Worker }), 468*333d2b36SAndroid Build Coastguard Worker } 469*333d2b36SAndroid Build Coastguard Worker my_defaults { 470*333d2b36SAndroid Build Coastguard Worker name: "bar", 471*333d2b36SAndroid Build Coastguard Worker replacing_string_list: select(soong_config_variable("my_namespace", "my_variable2"), { 472*333d2b36SAndroid Build Coastguard Worker "a": ["a2"], 473*333d2b36SAndroid Build Coastguard Worker default: ["b2"], 474*333d2b36SAndroid Build Coastguard Worker }), 475*333d2b36SAndroid Build Coastguard Worker } 476*333d2b36SAndroid Build Coastguard Worker `, 477*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 478*333d2b36SAndroid Build Coastguard Worker replacing_string_list: &[]string{"b1"}, 479*333d2b36SAndroid Build Coastguard Worker }, 480*333d2b36SAndroid Build Coastguard Worker }, 481*333d2b36SAndroid Build Coastguard Worker { 482*333d2b36SAndroid Build Coastguard Worker name: "Multi-condition string 1", 483*333d2b36SAndroid Build Coastguard Worker bp: ` 484*333d2b36SAndroid Build Coastguard Worker my_module_type { 485*333d2b36SAndroid Build Coastguard Worker name: "foo", 486*333d2b36SAndroid Build Coastguard Worker my_string: select(( 487*333d2b36SAndroid Build Coastguard Worker soong_config_variable("my_namespace", "my_variable"), 488*333d2b36SAndroid Build Coastguard Worker soong_config_variable("my_namespace", "my_variable2"), 489*333d2b36SAndroid Build Coastguard Worker ), { 490*333d2b36SAndroid Build Coastguard Worker ("a", "b"): "a+b", 491*333d2b36SAndroid Build Coastguard Worker ("a", default): "a+default", 492*333d2b36SAndroid Build Coastguard Worker (default, default): "default", 493*333d2b36SAndroid Build Coastguard Worker }), 494*333d2b36SAndroid Build Coastguard Worker } 495*333d2b36SAndroid Build Coastguard Worker `, 496*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 497*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 498*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 499*333d2b36SAndroid Build Coastguard Worker "my_variable2": "b", 500*333d2b36SAndroid Build Coastguard Worker }, 501*333d2b36SAndroid Build Coastguard Worker }, 502*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 503*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("a+b"), 504*333d2b36SAndroid Build Coastguard Worker }, 505*333d2b36SAndroid Build Coastguard Worker }, 506*333d2b36SAndroid Build Coastguard Worker { 507*333d2b36SAndroid Build Coastguard Worker name: "Multi-condition string 2", 508*333d2b36SAndroid Build Coastguard Worker bp: ` 509*333d2b36SAndroid Build Coastguard Worker my_module_type { 510*333d2b36SAndroid Build Coastguard Worker name: "foo", 511*333d2b36SAndroid Build Coastguard Worker my_string: select(( 512*333d2b36SAndroid Build Coastguard Worker soong_config_variable("my_namespace", "my_variable"), 513*333d2b36SAndroid Build Coastguard Worker soong_config_variable("my_namespace", "my_variable2"), 514*333d2b36SAndroid Build Coastguard Worker ), { 515*333d2b36SAndroid Build Coastguard Worker ("a", "b"): "a+b", 516*333d2b36SAndroid Build Coastguard Worker ("a", default): "a+default", 517*333d2b36SAndroid Build Coastguard Worker (default, default): "default", 518*333d2b36SAndroid Build Coastguard Worker }), 519*333d2b36SAndroid Build Coastguard Worker } 520*333d2b36SAndroid Build Coastguard Worker `, 521*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 522*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 523*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 524*333d2b36SAndroid Build Coastguard Worker "my_variable2": "c", 525*333d2b36SAndroid Build Coastguard Worker }, 526*333d2b36SAndroid Build Coastguard Worker }, 527*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 528*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("a+default"), 529*333d2b36SAndroid Build Coastguard Worker }, 530*333d2b36SAndroid Build Coastguard Worker }, 531*333d2b36SAndroid Build Coastguard Worker { 532*333d2b36SAndroid Build Coastguard Worker name: "Multi-condition string 3", 533*333d2b36SAndroid Build Coastguard Worker bp: ` 534*333d2b36SAndroid Build Coastguard Worker my_module_type { 535*333d2b36SAndroid Build Coastguard Worker name: "foo", 536*333d2b36SAndroid Build Coastguard Worker my_string: select(( 537*333d2b36SAndroid Build Coastguard Worker soong_config_variable("my_namespace", "my_variable"), 538*333d2b36SAndroid Build Coastguard Worker soong_config_variable("my_namespace", "my_variable2"), 539*333d2b36SAndroid Build Coastguard Worker ), { 540*333d2b36SAndroid Build Coastguard Worker ("a", "b"): "a+b", 541*333d2b36SAndroid Build Coastguard Worker ("a", default): "a+default", 542*333d2b36SAndroid Build Coastguard Worker (default, default): "default", 543*333d2b36SAndroid Build Coastguard Worker }), 544*333d2b36SAndroid Build Coastguard Worker } 545*333d2b36SAndroid Build Coastguard Worker `, 546*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 547*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 548*333d2b36SAndroid Build Coastguard Worker "my_variable": "c", 549*333d2b36SAndroid Build Coastguard Worker "my_variable2": "b", 550*333d2b36SAndroid Build Coastguard Worker }, 551*333d2b36SAndroid Build Coastguard Worker }, 552*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 553*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("default"), 554*333d2b36SAndroid Build Coastguard Worker }, 555*333d2b36SAndroid Build Coastguard Worker }, 556*333d2b36SAndroid Build Coastguard Worker { 557*333d2b36SAndroid Build Coastguard Worker name: "Unhandled string value", 558*333d2b36SAndroid Build Coastguard Worker bp: ` 559*333d2b36SAndroid Build Coastguard Worker my_module_type { 560*333d2b36SAndroid Build Coastguard Worker name: "foo", 561*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 562*333d2b36SAndroid Build Coastguard Worker "foo": "a", 563*333d2b36SAndroid Build Coastguard Worker "bar": "b", 564*333d2b36SAndroid Build Coastguard Worker }), 565*333d2b36SAndroid Build Coastguard Worker } 566*333d2b36SAndroid Build Coastguard Worker `, 567*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 568*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 569*333d2b36SAndroid Build Coastguard Worker "my_variable": "baz", 570*333d2b36SAndroid Build Coastguard Worker }, 571*333d2b36SAndroid Build Coastguard Worker }, 572*333d2b36SAndroid Build Coastguard Worker expectedError: `my_string: soong_config_variable\("my_namespace", "my_variable"\) had value "baz", which was not handled by the select statement`, 573*333d2b36SAndroid Build Coastguard Worker }, 574*333d2b36SAndroid Build Coastguard Worker { 575*333d2b36SAndroid Build Coastguard Worker name: "Select on boolean", 576*333d2b36SAndroid Build Coastguard Worker bp: ` 577*333d2b36SAndroid Build Coastguard Worker my_module_type { 578*333d2b36SAndroid Build Coastguard Worker name: "foo", 579*333d2b36SAndroid Build Coastguard Worker my_string: select(boolean_var_for_testing(), { 580*333d2b36SAndroid Build Coastguard Worker true: "t", 581*333d2b36SAndroid Build Coastguard Worker false: "f", 582*333d2b36SAndroid Build Coastguard Worker }), 583*333d2b36SAndroid Build Coastguard Worker } 584*333d2b36SAndroid Build Coastguard Worker `, 585*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 586*333d2b36SAndroid Build Coastguard Worker "boolean_var": { 587*333d2b36SAndroid Build Coastguard Worker "for_testing": "true", 588*333d2b36SAndroid Build Coastguard Worker }, 589*333d2b36SAndroid Build Coastguard Worker }, 590*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 591*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("t"), 592*333d2b36SAndroid Build Coastguard Worker }, 593*333d2b36SAndroid Build Coastguard Worker }, 594*333d2b36SAndroid Build Coastguard Worker { 595*333d2b36SAndroid Build Coastguard Worker name: "Select on boolean soong config variable", 596*333d2b36SAndroid Build Coastguard Worker bp: ` 597*333d2b36SAndroid Build Coastguard Worker my_module_type { 598*333d2b36SAndroid Build Coastguard Worker name: "foo", 599*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 600*333d2b36SAndroid Build Coastguard Worker true: "t", 601*333d2b36SAndroid Build Coastguard Worker false: "f", 602*333d2b36SAndroid Build Coastguard Worker }), 603*333d2b36SAndroid Build Coastguard Worker } 604*333d2b36SAndroid Build Coastguard Worker `, 605*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 606*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 607*333d2b36SAndroid Build Coastguard Worker "my_variable": "true", 608*333d2b36SAndroid Build Coastguard Worker }, 609*333d2b36SAndroid Build Coastguard Worker }, 610*333d2b36SAndroid Build Coastguard Worker vendorVarTypes: map[string]map[string]string{ 611*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 612*333d2b36SAndroid Build Coastguard Worker "my_variable": "bool", 613*333d2b36SAndroid Build Coastguard Worker }, 614*333d2b36SAndroid Build Coastguard Worker }, 615*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 616*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("t"), 617*333d2b36SAndroid Build Coastguard Worker }, 618*333d2b36SAndroid Build Coastguard Worker }, 619*333d2b36SAndroid Build Coastguard Worker { 620*333d2b36SAndroid Build Coastguard Worker name: "Select on boolean false", 621*333d2b36SAndroid Build Coastguard Worker bp: ` 622*333d2b36SAndroid Build Coastguard Worker my_module_type { 623*333d2b36SAndroid Build Coastguard Worker name: "foo", 624*333d2b36SAndroid Build Coastguard Worker my_string: select(boolean_var_for_testing(), { 625*333d2b36SAndroid Build Coastguard Worker true: "t", 626*333d2b36SAndroid Build Coastguard Worker false: "f", 627*333d2b36SAndroid Build Coastguard Worker }), 628*333d2b36SAndroid Build Coastguard Worker } 629*333d2b36SAndroid Build Coastguard Worker `, 630*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 631*333d2b36SAndroid Build Coastguard Worker "boolean_var": { 632*333d2b36SAndroid Build Coastguard Worker "for_testing": "false", 633*333d2b36SAndroid Build Coastguard Worker }, 634*333d2b36SAndroid Build Coastguard Worker }, 635*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 636*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("f"), 637*333d2b36SAndroid Build Coastguard Worker }, 638*333d2b36SAndroid Build Coastguard Worker }, 639*333d2b36SAndroid Build Coastguard Worker { 640*333d2b36SAndroid Build Coastguard Worker name: "Select on boolean undefined", 641*333d2b36SAndroid Build Coastguard Worker bp: ` 642*333d2b36SAndroid Build Coastguard Worker my_module_type { 643*333d2b36SAndroid Build Coastguard Worker name: "foo", 644*333d2b36SAndroid Build Coastguard Worker my_string: select(boolean_var_for_testing(), { 645*333d2b36SAndroid Build Coastguard Worker true: "t", 646*333d2b36SAndroid Build Coastguard Worker false: "f", 647*333d2b36SAndroid Build Coastguard Worker }), 648*333d2b36SAndroid Build Coastguard Worker } 649*333d2b36SAndroid Build Coastguard Worker `, 650*333d2b36SAndroid Build Coastguard Worker expectedError: `my_string: boolean_var_for_testing\(\) had value undefined, which was not handled by the select statement`, 651*333d2b36SAndroid Build Coastguard Worker }, 652*333d2b36SAndroid Build Coastguard Worker { 653*333d2b36SAndroid Build Coastguard Worker name: "Select on boolean undefined with default", 654*333d2b36SAndroid Build Coastguard Worker bp: ` 655*333d2b36SAndroid Build Coastguard Worker my_module_type { 656*333d2b36SAndroid Build Coastguard Worker name: "foo", 657*333d2b36SAndroid Build Coastguard Worker my_string: select(boolean_var_for_testing(), { 658*333d2b36SAndroid Build Coastguard Worker true: "t", 659*333d2b36SAndroid Build Coastguard Worker false: "f", 660*333d2b36SAndroid Build Coastguard Worker default: "default", 661*333d2b36SAndroid Build Coastguard Worker }), 662*333d2b36SAndroid Build Coastguard Worker } 663*333d2b36SAndroid Build Coastguard Worker `, 664*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 665*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("default"), 666*333d2b36SAndroid Build Coastguard Worker }, 667*333d2b36SAndroid Build Coastguard Worker }, 668*333d2b36SAndroid Build Coastguard Worker { 669*333d2b36SAndroid Build Coastguard Worker name: "Mismatched condition types", 670*333d2b36SAndroid Build Coastguard Worker bp: ` 671*333d2b36SAndroid Build Coastguard Worker my_module_type { 672*333d2b36SAndroid Build Coastguard Worker name: "foo", 673*333d2b36SAndroid Build Coastguard Worker my_string: select(boolean_var_for_testing(), { 674*333d2b36SAndroid Build Coastguard Worker "true": "t", 675*333d2b36SAndroid Build Coastguard Worker "false": "f", 676*333d2b36SAndroid Build Coastguard Worker default: "default", 677*333d2b36SAndroid Build Coastguard Worker }), 678*333d2b36SAndroid Build Coastguard Worker } 679*333d2b36SAndroid Build Coastguard Worker `, 680*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 681*333d2b36SAndroid Build Coastguard Worker "boolean_var": { 682*333d2b36SAndroid Build Coastguard Worker "for_testing": "false", 683*333d2b36SAndroid Build Coastguard Worker }, 684*333d2b36SAndroid Build Coastguard Worker }, 685*333d2b36SAndroid Build Coastguard Worker expectedError: "Expected all branches of a select on condition boolean_var_for_testing\\(\\) to have type bool, found string", 686*333d2b36SAndroid Build Coastguard Worker }, 687*333d2b36SAndroid Build Coastguard Worker { 688*333d2b36SAndroid Build Coastguard Worker name: "Assigning select to nonconfigurable bool", 689*333d2b36SAndroid Build Coastguard Worker bp: ` 690*333d2b36SAndroid Build Coastguard Worker my_module_type { 691*333d2b36SAndroid Build Coastguard Worker name: "foo", 692*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_bool: select(arch(), { 693*333d2b36SAndroid Build Coastguard Worker "x86_64": true, 694*333d2b36SAndroid Build Coastguard Worker default: false, 695*333d2b36SAndroid Build Coastguard Worker }), 696*333d2b36SAndroid Build Coastguard Worker } 697*333d2b36SAndroid Build Coastguard Worker `, 698*333d2b36SAndroid Build Coastguard Worker expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_bool"`, 699*333d2b36SAndroid Build Coastguard Worker }, 700*333d2b36SAndroid Build Coastguard Worker { 701*333d2b36SAndroid Build Coastguard Worker name: "Assigning select to nonconfigurable string", 702*333d2b36SAndroid Build Coastguard Worker bp: ` 703*333d2b36SAndroid Build Coastguard Worker my_module_type { 704*333d2b36SAndroid Build Coastguard Worker name: "foo", 705*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string: select(arch(), { 706*333d2b36SAndroid Build Coastguard Worker "x86_64": "x86!", 707*333d2b36SAndroid Build Coastguard Worker default: "unknown!", 708*333d2b36SAndroid Build Coastguard Worker }), 709*333d2b36SAndroid Build Coastguard Worker } 710*333d2b36SAndroid Build Coastguard Worker `, 711*333d2b36SAndroid Build Coastguard Worker expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_string"`, 712*333d2b36SAndroid Build Coastguard Worker }, 713*333d2b36SAndroid Build Coastguard Worker { 714*333d2b36SAndroid Build Coastguard Worker name: "Assigning appended selects to nonconfigurable string", 715*333d2b36SAndroid Build Coastguard Worker bp: ` 716*333d2b36SAndroid Build Coastguard Worker my_module_type { 717*333d2b36SAndroid Build Coastguard Worker name: "foo", 718*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string: select(arch(), { 719*333d2b36SAndroid Build Coastguard Worker "x86_64": "x86!", 720*333d2b36SAndroid Build Coastguard Worker default: "unknown!", 721*333d2b36SAndroid Build Coastguard Worker }) + select(os(), { 722*333d2b36SAndroid Build Coastguard Worker "darwin": "_darwin!", 723*333d2b36SAndroid Build Coastguard Worker default: "unknown!", 724*333d2b36SAndroid Build Coastguard Worker }), 725*333d2b36SAndroid Build Coastguard Worker } 726*333d2b36SAndroid Build Coastguard Worker `, 727*333d2b36SAndroid Build Coastguard Worker expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_string"`, 728*333d2b36SAndroid Build Coastguard Worker }, 729*333d2b36SAndroid Build Coastguard Worker { 730*333d2b36SAndroid Build Coastguard Worker name: "Assigning select to nonconfigurable string list", 731*333d2b36SAndroid Build Coastguard Worker bp: ` 732*333d2b36SAndroid Build Coastguard Worker my_module_type { 733*333d2b36SAndroid Build Coastguard Worker name: "foo", 734*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string_list: select(arch(), { 735*333d2b36SAndroid Build Coastguard Worker "x86_64": ["foo", "bar"], 736*333d2b36SAndroid Build Coastguard Worker default: ["baz", "qux"], 737*333d2b36SAndroid Build Coastguard Worker }), 738*333d2b36SAndroid Build Coastguard Worker } 739*333d2b36SAndroid Build Coastguard Worker `, 740*333d2b36SAndroid Build Coastguard Worker expectedError: `can't assign select statement to non-configurable property "my_nonconfigurable_string_list"`, 741*333d2b36SAndroid Build Coastguard Worker }, 742*333d2b36SAndroid Build Coastguard Worker { 743*333d2b36SAndroid Build Coastguard Worker name: "Select in variable", 744*333d2b36SAndroid Build Coastguard Worker bp: ` 745*333d2b36SAndroid Build Coastguard Worker my_second_variable = ["after.cpp"] 746*333d2b36SAndroid Build Coastguard Worker my_variable = select(soong_config_variable("my_namespace", "my_variable"), { 747*333d2b36SAndroid Build Coastguard Worker "a": ["a.cpp"], 748*333d2b36SAndroid Build Coastguard Worker "b": ["b.cpp"], 749*333d2b36SAndroid Build Coastguard Worker default: ["c.cpp"], 750*333d2b36SAndroid Build Coastguard Worker }) + my_second_variable 751*333d2b36SAndroid Build Coastguard Worker my_module_type { 752*333d2b36SAndroid Build Coastguard Worker name: "foo", 753*333d2b36SAndroid Build Coastguard Worker my_string_list: ["before.cpp"] + my_variable, 754*333d2b36SAndroid Build Coastguard Worker } 755*333d2b36SAndroid Build Coastguard Worker `, 756*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 757*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"before.cpp", "a.cpp", "after.cpp"}, 758*333d2b36SAndroid Build Coastguard Worker }, 759*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 760*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 761*333d2b36SAndroid Build Coastguard Worker "my_variable": "a", 762*333d2b36SAndroid Build Coastguard Worker }, 763*333d2b36SAndroid Build Coastguard Worker }, 764*333d2b36SAndroid Build Coastguard Worker }, 765*333d2b36SAndroid Build Coastguard Worker { 766*333d2b36SAndroid Build Coastguard Worker name: "Soong config value variable on configurable property", 767*333d2b36SAndroid Build Coastguard Worker bp: ` 768*333d2b36SAndroid Build Coastguard Worker soong_config_module_type { 769*333d2b36SAndroid Build Coastguard Worker name: "soong_config_my_module_type", 770*333d2b36SAndroid Build Coastguard Worker module_type: "my_module_type", 771*333d2b36SAndroid Build Coastguard Worker config_namespace: "my_namespace", 772*333d2b36SAndroid Build Coastguard Worker value_variables: ["my_variable"], 773*333d2b36SAndroid Build Coastguard Worker properties: ["my_string", "my_string_list"], 774*333d2b36SAndroid Build Coastguard Worker } 775*333d2b36SAndroid Build Coastguard Worker 776*333d2b36SAndroid Build Coastguard Worker soong_config_my_module_type { 777*333d2b36SAndroid Build Coastguard Worker name: "foo", 778*333d2b36SAndroid Build Coastguard Worker my_string_list: ["before.cpp"], 779*333d2b36SAndroid Build Coastguard Worker soong_config_variables: { 780*333d2b36SAndroid Build Coastguard Worker my_variable: { 781*333d2b36SAndroid Build Coastguard Worker my_string_list: ["after_%s.cpp"], 782*333d2b36SAndroid Build Coastguard Worker my_string: "%s.cpp", 783*333d2b36SAndroid Build Coastguard Worker }, 784*333d2b36SAndroid Build Coastguard Worker }, 785*333d2b36SAndroid Build Coastguard Worker } 786*333d2b36SAndroid Build Coastguard Worker `, 787*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 788*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("foo.cpp"), 789*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"before.cpp", "after_foo.cpp"}, 790*333d2b36SAndroid Build Coastguard Worker }, 791*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 792*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 793*333d2b36SAndroid Build Coastguard Worker "my_variable": "foo", 794*333d2b36SAndroid Build Coastguard Worker }, 795*333d2b36SAndroid Build Coastguard Worker }, 796*333d2b36SAndroid Build Coastguard Worker }, 797*333d2b36SAndroid Build Coastguard Worker { 798*333d2b36SAndroid Build Coastguard Worker name: "Property appending with variable", 799*333d2b36SAndroid Build Coastguard Worker bp: ` 800*333d2b36SAndroid Build Coastguard Worker my_variable = ["b.cpp"] 801*333d2b36SAndroid Build Coastguard Worker my_module_type { 802*333d2b36SAndroid Build Coastguard Worker name: "foo", 803*333d2b36SAndroid Build Coastguard Worker my_string_list: ["a.cpp"] + my_variable + select(soong_config_variable("my_namespace", "my_variable"), { 804*333d2b36SAndroid Build Coastguard Worker "a": ["a.cpp"], 805*333d2b36SAndroid Build Coastguard Worker "b": ["b.cpp"], 806*333d2b36SAndroid Build Coastguard Worker default: ["c.cpp"], 807*333d2b36SAndroid Build Coastguard Worker }), 808*333d2b36SAndroid Build Coastguard Worker } 809*333d2b36SAndroid Build Coastguard Worker `, 810*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 811*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"a.cpp", "b.cpp", "c.cpp"}, 812*333d2b36SAndroid Build Coastguard Worker }, 813*333d2b36SAndroid Build Coastguard Worker }, 814*333d2b36SAndroid Build Coastguard Worker { 815*333d2b36SAndroid Build Coastguard Worker name: "Test AppendSimpleValue", 816*333d2b36SAndroid Build Coastguard Worker bp: ` 817*333d2b36SAndroid Build Coastguard Worker my_module_type { 818*333d2b36SAndroid Build Coastguard Worker name: "foo", 819*333d2b36SAndroid Build Coastguard Worker my_string_list: ["a.cpp"] + select(soong_config_variable("my_namespace", "my_variable"), { 820*333d2b36SAndroid Build Coastguard Worker "a": ["a.cpp"], 821*333d2b36SAndroid Build Coastguard Worker "b": ["b.cpp"], 822*333d2b36SAndroid Build Coastguard Worker default: ["c.cpp"], 823*333d2b36SAndroid Build Coastguard Worker }), 824*333d2b36SAndroid Build Coastguard Worker } 825*333d2b36SAndroid Build Coastguard Worker `, 826*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 827*333d2b36SAndroid Build Coastguard Worker "selects_test": { 828*333d2b36SAndroid Build Coastguard Worker "append_to_string_list": "foo.cpp", 829*333d2b36SAndroid Build Coastguard Worker }, 830*333d2b36SAndroid Build Coastguard Worker }, 831*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 832*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"a.cpp", "c.cpp", "foo.cpp"}, 833*333d2b36SAndroid Build Coastguard Worker }, 834*333d2b36SAndroid Build Coastguard Worker }, 835*333d2b36SAndroid Build Coastguard Worker { 836*333d2b36SAndroid Build Coastguard Worker name: "Arch variant bool", 837*333d2b36SAndroid Build Coastguard Worker bp: ` 838*333d2b36SAndroid Build Coastguard Worker my_variable = ["b.cpp"] 839*333d2b36SAndroid Build Coastguard Worker my_module_type { 840*333d2b36SAndroid Build Coastguard Worker name: "foo", 841*333d2b36SAndroid Build Coastguard Worker arch_variant_configurable_bool: false, 842*333d2b36SAndroid Build Coastguard Worker target: { 843*333d2b36SAndroid Build Coastguard Worker bionic_arm64: { 844*333d2b36SAndroid Build Coastguard Worker enabled: true, 845*333d2b36SAndroid Build Coastguard Worker }, 846*333d2b36SAndroid Build Coastguard Worker }, 847*333d2b36SAndroid Build Coastguard Worker } 848*333d2b36SAndroid Build Coastguard Worker `, 849*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 850*333d2b36SAndroid Build Coastguard Worker arch_variant_configurable_bool: proptools.BoolPtr(false), 851*333d2b36SAndroid Build Coastguard Worker }, 852*333d2b36SAndroid Build Coastguard Worker }, 853*333d2b36SAndroid Build Coastguard Worker { 854*333d2b36SAndroid Build Coastguard Worker name: "Simple string binding", 855*333d2b36SAndroid Build Coastguard Worker bp: ` 856*333d2b36SAndroid Build Coastguard Worker my_module_type { 857*333d2b36SAndroid Build Coastguard Worker name: "foo", 858*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 859*333d2b36SAndroid Build Coastguard Worker any @ my_binding: "hello " + my_binding, 860*333d2b36SAndroid Build Coastguard Worker default: "goodbye", 861*333d2b36SAndroid Build Coastguard Worker }) 862*333d2b36SAndroid Build Coastguard Worker } 863*333d2b36SAndroid Build Coastguard Worker `, 864*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 865*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 866*333d2b36SAndroid Build Coastguard Worker "my_variable": "world!", 867*333d2b36SAndroid Build Coastguard Worker }, 868*333d2b36SAndroid Build Coastguard Worker }, 869*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 870*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("hello world!"), 871*333d2b36SAndroid Build Coastguard Worker }, 872*333d2b36SAndroid Build Coastguard Worker }, 873*333d2b36SAndroid Build Coastguard Worker { 874*333d2b36SAndroid Build Coastguard Worker name: "Any branch with binding not taken", 875*333d2b36SAndroid Build Coastguard Worker bp: ` 876*333d2b36SAndroid Build Coastguard Worker my_module_type { 877*333d2b36SAndroid Build Coastguard Worker name: "foo", 878*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 879*333d2b36SAndroid Build Coastguard Worker any @ my_binding: "hello " + my_binding, 880*333d2b36SAndroid Build Coastguard Worker default: "goodbye", 881*333d2b36SAndroid Build Coastguard Worker }) 882*333d2b36SAndroid Build Coastguard Worker } 883*333d2b36SAndroid Build Coastguard Worker `, 884*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 885*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("goodbye"), 886*333d2b36SAndroid Build Coastguard Worker }, 887*333d2b36SAndroid Build Coastguard Worker }, 888*333d2b36SAndroid Build Coastguard Worker { 889*333d2b36SAndroid Build Coastguard Worker name: "Any branch without binding", 890*333d2b36SAndroid Build Coastguard Worker bp: ` 891*333d2b36SAndroid Build Coastguard Worker my_module_type { 892*333d2b36SAndroid Build Coastguard Worker name: "foo", 893*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 894*333d2b36SAndroid Build Coastguard Worker any: "hello", 895*333d2b36SAndroid Build Coastguard Worker default: "goodbye", 896*333d2b36SAndroid Build Coastguard Worker }) 897*333d2b36SAndroid Build Coastguard Worker } 898*333d2b36SAndroid Build Coastguard Worker `, 899*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 900*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 901*333d2b36SAndroid Build Coastguard Worker "my_variable": "world!", 902*333d2b36SAndroid Build Coastguard Worker }, 903*333d2b36SAndroid Build Coastguard Worker }, 904*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 905*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("hello"), 906*333d2b36SAndroid Build Coastguard Worker }, 907*333d2b36SAndroid Build Coastguard Worker }, 908*333d2b36SAndroid Build Coastguard Worker { 909*333d2b36SAndroid Build Coastguard Worker name: "Binding conflicts with file-level variable", 910*333d2b36SAndroid Build Coastguard Worker bp: ` 911*333d2b36SAndroid Build Coastguard Worker my_binding = "asdf" 912*333d2b36SAndroid Build Coastguard Worker my_module_type { 913*333d2b36SAndroid Build Coastguard Worker name: "foo", 914*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 915*333d2b36SAndroid Build Coastguard Worker any @ my_binding: "hello", 916*333d2b36SAndroid Build Coastguard Worker default: "goodbye", 917*333d2b36SAndroid Build Coastguard Worker }) 918*333d2b36SAndroid Build Coastguard Worker } 919*333d2b36SAndroid Build Coastguard Worker `, 920*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 921*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 922*333d2b36SAndroid Build Coastguard Worker "my_variable": "world!", 923*333d2b36SAndroid Build Coastguard Worker }, 924*333d2b36SAndroid Build Coastguard Worker }, 925*333d2b36SAndroid Build Coastguard Worker expectedError: "variable already set in inherited scope, previous assignment", 926*333d2b36SAndroid Build Coastguard Worker }, 927*333d2b36SAndroid Build Coastguard Worker { 928*333d2b36SAndroid Build Coastguard Worker name: "Binding in combination with file-level variable", 929*333d2b36SAndroid Build Coastguard Worker bp: ` 930*333d2b36SAndroid Build Coastguard Worker my_var = " there " 931*333d2b36SAndroid Build Coastguard Worker my_module_type { 932*333d2b36SAndroid Build Coastguard Worker name: "foo", 933*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "my_variable"), { 934*333d2b36SAndroid Build Coastguard Worker any @ my_binding: "hello" + my_var + my_binding, 935*333d2b36SAndroid Build Coastguard Worker default: "goodbye", 936*333d2b36SAndroid Build Coastguard Worker }) 937*333d2b36SAndroid Build Coastguard Worker } 938*333d2b36SAndroid Build Coastguard Worker `, 939*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 940*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 941*333d2b36SAndroid Build Coastguard Worker "my_variable": "world!", 942*333d2b36SAndroid Build Coastguard Worker }, 943*333d2b36SAndroid Build Coastguard Worker }, 944*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 945*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("hello there world!"), 946*333d2b36SAndroid Build Coastguard Worker }, 947*333d2b36SAndroid Build Coastguard Worker }, 948*333d2b36SAndroid Build Coastguard Worker { 949*333d2b36SAndroid Build Coastguard Worker name: "Bindings in subdirectory inherits variable", 950*333d2b36SAndroid Build Coastguard Worker fs: map[string][]byte{ 951*333d2b36SAndroid Build Coastguard Worker "Android.bp": []byte(` 952*333d2b36SAndroid Build Coastguard Workermy_var = "abcd" 953*333d2b36SAndroid Build Coastguard Worker`), 954*333d2b36SAndroid Build Coastguard Worker "directoryB/Android.bp": []byte(` 955*333d2b36SAndroid Build Coastguard Workermy_module_type { 956*333d2b36SAndroid Build Coastguard Worker name: "foo", 957*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "variable_a"), { 958*333d2b36SAndroid Build Coastguard Worker any @ my_binding: my_var + my_binding, 959*333d2b36SAndroid Build Coastguard Worker default: "", 960*333d2b36SAndroid Build Coastguard Worker }), 961*333d2b36SAndroid Build Coastguard Worker} 962*333d2b36SAndroid Build Coastguard Worker`), 963*333d2b36SAndroid Build Coastguard Worker }, 964*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 965*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 966*333d2b36SAndroid Build Coastguard Worker "variable_a": "e", 967*333d2b36SAndroid Build Coastguard Worker }, 968*333d2b36SAndroid Build Coastguard Worker }, 969*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 970*333d2b36SAndroid Build Coastguard Worker my_string: proptools.StringPtr("abcde"), 971*333d2b36SAndroid Build Coastguard Worker }, 972*333d2b36SAndroid Build Coastguard Worker }, 973*333d2b36SAndroid Build Coastguard Worker { 974*333d2b36SAndroid Build Coastguard Worker name: "Cannot modify variable after referenced by select", 975*333d2b36SAndroid Build Coastguard Worker bp: ` 976*333d2b36SAndroid Build Coastguard Workermy_var = "foo" 977*333d2b36SAndroid Build Coastguard Workermy_module_type { 978*333d2b36SAndroid Build Coastguard Worker name: "foo", 979*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "variable_a"), { 980*333d2b36SAndroid Build Coastguard Worker "a": my_var, 981*333d2b36SAndroid Build Coastguard Worker default: "", 982*333d2b36SAndroid Build Coastguard Worker }), 983*333d2b36SAndroid Build Coastguard Worker} 984*333d2b36SAndroid Build Coastguard Workermy_var += "bar" 985*333d2b36SAndroid Build Coastguard Worker`, 986*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 987*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 988*333d2b36SAndroid Build Coastguard Worker "variable_a": "b", // notably not the value that causes my_var to be referenced 989*333d2b36SAndroid Build Coastguard Worker }, 990*333d2b36SAndroid Build Coastguard Worker }, 991*333d2b36SAndroid Build Coastguard Worker expectedError: `modified variable "my_var" with \+= after referencing`, 992*333d2b36SAndroid Build Coastguard Worker }, 993*333d2b36SAndroid Build Coastguard Worker { 994*333d2b36SAndroid Build Coastguard Worker name: "Cannot shadow variable with binding", 995*333d2b36SAndroid Build Coastguard Worker bp: ` 996*333d2b36SAndroid Build Coastguard Workermy_var = "foo" 997*333d2b36SAndroid Build Coastguard Workermy_module_type { 998*333d2b36SAndroid Build Coastguard Worker name: "foo", 999*333d2b36SAndroid Build Coastguard Worker my_string: select(soong_config_variable("my_namespace", "variable_a"), { 1000*333d2b36SAndroid Build Coastguard Worker any @ my_var: my_var, 1001*333d2b36SAndroid Build Coastguard Worker default: "", 1002*333d2b36SAndroid Build Coastguard Worker }), 1003*333d2b36SAndroid Build Coastguard Worker} 1004*333d2b36SAndroid Build Coastguard Worker`, 1005*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 1006*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 1007*333d2b36SAndroid Build Coastguard Worker "variable_a": "a", 1008*333d2b36SAndroid Build Coastguard Worker }, 1009*333d2b36SAndroid Build Coastguard Worker }, 1010*333d2b36SAndroid Build Coastguard Worker expectedError: `variable already set in inherited scope, previous assignment:`, 1011*333d2b36SAndroid Build Coastguard Worker }, 1012*333d2b36SAndroid Build Coastguard Worker { 1013*333d2b36SAndroid Build Coastguard Worker name: "Basic string list postprocessor", 1014*333d2b36SAndroid Build Coastguard Worker bp: ` 1015*333d2b36SAndroid Build Coastguard Workermy_defaults { 1016*333d2b36SAndroid Build Coastguard Worker name: "defaults_a", 1017*333d2b36SAndroid Build Coastguard Worker my_string_list: ["a", "b", "c"], 1018*333d2b36SAndroid Build Coastguard Worker string_list_postprocessor_add_to_elements: "1", 1019*333d2b36SAndroid Build Coastguard Worker} 1020*333d2b36SAndroid Build Coastguard Workermy_defaults { 1021*333d2b36SAndroid Build Coastguard Worker name: "defaults_b", 1022*333d2b36SAndroid Build Coastguard Worker my_string_list: ["d", "e", "f"], 1023*333d2b36SAndroid Build Coastguard Worker string_list_postprocessor_add_to_elements: "2", 1024*333d2b36SAndroid Build Coastguard Worker} 1025*333d2b36SAndroid Build Coastguard Workermy_module_type { 1026*333d2b36SAndroid Build Coastguard Worker name: "foo", 1027*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults_a", "defaults_b"], 1028*333d2b36SAndroid Build Coastguard Worker} 1029*333d2b36SAndroid Build Coastguard Worker`, 1030*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 1031*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"d2", "e2", "f2", "a1", "b1", "c1"}, 1032*333d2b36SAndroid Build Coastguard Worker }, 1033*333d2b36SAndroid Build Coastguard Worker }, 1034*333d2b36SAndroid Build Coastguard Worker { 1035*333d2b36SAndroid Build Coastguard Worker name: "string list variables", 1036*333d2b36SAndroid Build Coastguard Worker bp: ` 1037*333d2b36SAndroid Build Coastguard Workermy_module_type { 1038*333d2b36SAndroid Build Coastguard Worker name: "foo", 1039*333d2b36SAndroid Build Coastguard Worker my_string_list: ["a"] + select(soong_config_variable("my_namespace", "my_var"), { 1040*333d2b36SAndroid Build Coastguard Worker any @ my_var: my_var, 1041*333d2b36SAndroid Build Coastguard Worker default: [], 1042*333d2b36SAndroid Build Coastguard Worker }), 1043*333d2b36SAndroid Build Coastguard Worker} 1044*333d2b36SAndroid Build Coastguard Worker`, 1045*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 1046*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 1047*333d2b36SAndroid Build Coastguard Worker "my_var": "b c", 1048*333d2b36SAndroid Build Coastguard Worker }, 1049*333d2b36SAndroid Build Coastguard Worker }, 1050*333d2b36SAndroid Build Coastguard Worker vendorVarTypes: map[string]map[string]string{ 1051*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 1052*333d2b36SAndroid Build Coastguard Worker "my_var": "string_list", 1053*333d2b36SAndroid Build Coastguard Worker }, 1054*333d2b36SAndroid Build Coastguard Worker }, 1055*333d2b36SAndroid Build Coastguard Worker provider: selectsTestProvider{ 1056*333d2b36SAndroid Build Coastguard Worker my_string_list: &[]string{"a", "b", "c"}, 1057*333d2b36SAndroid Build Coastguard Worker }, 1058*333d2b36SAndroid Build Coastguard Worker }, 1059*333d2b36SAndroid Build Coastguard Worker { 1060*333d2b36SAndroid Build Coastguard Worker name: "string list variables don't match string matchers", 1061*333d2b36SAndroid Build Coastguard Worker bp: ` 1062*333d2b36SAndroid Build Coastguard Workermy_module_type { 1063*333d2b36SAndroid Build Coastguard Worker name: "foo", 1064*333d2b36SAndroid Build Coastguard Worker my_string_list: ["a"] + select(soong_config_variable("my_namespace", "my_var"), { 1065*333d2b36SAndroid Build Coastguard Worker "foo": ["b"], 1066*333d2b36SAndroid Build Coastguard Worker default: [], 1067*333d2b36SAndroid Build Coastguard Worker }), 1068*333d2b36SAndroid Build Coastguard Worker} 1069*333d2b36SAndroid Build Coastguard Worker`, 1070*333d2b36SAndroid Build Coastguard Worker vendorVars: map[string]map[string]string{ 1071*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 1072*333d2b36SAndroid Build Coastguard Worker "my_var": "b c", 1073*333d2b36SAndroid Build Coastguard Worker }, 1074*333d2b36SAndroid Build Coastguard Worker }, 1075*333d2b36SAndroid Build Coastguard Worker vendorVarTypes: map[string]map[string]string{ 1076*333d2b36SAndroid Build Coastguard Worker "my_namespace": { 1077*333d2b36SAndroid Build Coastguard Worker "my_var": "string_list", 1078*333d2b36SAndroid Build Coastguard Worker }, 1079*333d2b36SAndroid Build Coastguard Worker }, 1080*333d2b36SAndroid Build Coastguard Worker expectedError: `Expected all branches of a select on condition soong_config_variable\("my_namespace", "my_var"\) to have type string_list, found string`, 1081*333d2b36SAndroid Build Coastguard Worker }, 1082*333d2b36SAndroid Build Coastguard Worker } 1083*333d2b36SAndroid Build Coastguard Worker 1084*333d2b36SAndroid Build Coastguard Worker for _, tc := range testCases { 1085*333d2b36SAndroid Build Coastguard Worker t.Run(tc.name, func(t *testing.T) { 1086*333d2b36SAndroid Build Coastguard Worker fs := tc.fs 1087*333d2b36SAndroid Build Coastguard Worker if fs == nil { 1088*333d2b36SAndroid Build Coastguard Worker fs = make(MockFS) 1089*333d2b36SAndroid Build Coastguard Worker } 1090*333d2b36SAndroid Build Coastguard Worker if tc.bp != "" { 1091*333d2b36SAndroid Build Coastguard Worker fs["Android.bp"] = []byte(tc.bp) 1092*333d2b36SAndroid Build Coastguard Worker } 1093*333d2b36SAndroid Build Coastguard Worker fixtures := GroupFixturePreparers( 1094*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDefaults, 1095*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithArchMutator, 1096*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithSoongConfigModuleBuildComponents, 1097*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 1098*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("my_module_type", newSelectsMockModule) 1099*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("my_defaults", newSelectsMockModuleDefaults) 1100*333d2b36SAndroid Build Coastguard Worker }), 1101*333d2b36SAndroid Build Coastguard Worker FixtureModifyProductVariables(func(variables FixtureProductVariables) { 1102*333d2b36SAndroid Build Coastguard Worker variables.VendorVars = tc.vendorVars 1103*333d2b36SAndroid Build Coastguard Worker variables.VendorVarTypes = tc.vendorVarTypes 1104*333d2b36SAndroid Build Coastguard Worker }), 1105*333d2b36SAndroid Build Coastguard Worker FixtureMergeMockFs(fs), 1106*333d2b36SAndroid Build Coastguard Worker ) 1107*333d2b36SAndroid Build Coastguard Worker if tc.expectedError != "" { 1108*333d2b36SAndroid Build Coastguard Worker fixtures = fixtures.ExtendWithErrorHandler(FixtureExpectsOneErrorPattern(tc.expectedError)) 1109*333d2b36SAndroid Build Coastguard Worker } 1110*333d2b36SAndroid Build Coastguard Worker result := fixtures.RunTest(t) 1111*333d2b36SAndroid Build Coastguard Worker 1112*333d2b36SAndroid Build Coastguard Worker if tc.expectedError == "" { 1113*333d2b36SAndroid Build Coastguard Worker if len(tc.providers) == 0 { 1114*333d2b36SAndroid Build Coastguard Worker tc.providers = map[string]selectsTestProvider{ 1115*333d2b36SAndroid Build Coastguard Worker "foo": tc.provider, 1116*333d2b36SAndroid Build Coastguard Worker } 1117*333d2b36SAndroid Build Coastguard Worker } 1118*333d2b36SAndroid Build Coastguard Worker 1119*333d2b36SAndroid Build Coastguard Worker for moduleName := range tc.providers { 1120*333d2b36SAndroid Build Coastguard Worker expected := tc.providers[moduleName] 1121*333d2b36SAndroid Build Coastguard Worker m := result.ModuleForTests(moduleName, "android_arm64_armv8-a") 1122*333d2b36SAndroid Build Coastguard Worker p, _ := OtherModuleProvider(result.testContext.OtherModuleProviderAdaptor(), m.Module(), selectsTestProviderKey) 1123*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(p, expected) { 1124*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected:\n %q\ngot:\n %q", expected.String(), p.String()) 1125*333d2b36SAndroid Build Coastguard Worker } 1126*333d2b36SAndroid Build Coastguard Worker } 1127*333d2b36SAndroid Build Coastguard Worker } 1128*333d2b36SAndroid Build Coastguard Worker }) 1129*333d2b36SAndroid Build Coastguard Worker } 1130*333d2b36SAndroid Build Coastguard Worker} 1131*333d2b36SAndroid Build Coastguard Worker 1132*333d2b36SAndroid Build Coastguard Workertype selectsTestProvider struct { 1133*333d2b36SAndroid Build Coastguard Worker my_bool *bool 1134*333d2b36SAndroid Build Coastguard Worker my_string *string 1135*333d2b36SAndroid Build Coastguard Worker my_string_list *[]string 1136*333d2b36SAndroid Build Coastguard Worker my_paths *[]string 1137*333d2b36SAndroid Build Coastguard Worker replacing_string_list *[]string 1138*333d2b36SAndroid Build Coastguard Worker arch_variant_configurable_bool *bool 1139*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_bool *bool 1140*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string *string 1141*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string_list []string 1142*333d2b36SAndroid Build Coastguard Worker} 1143*333d2b36SAndroid Build Coastguard Worker 1144*333d2b36SAndroid Build Coastguard Workerfunc (p *selectsTestProvider) String() string { 1145*333d2b36SAndroid Build Coastguard Worker myBoolStr := "nil" 1146*333d2b36SAndroid Build Coastguard Worker if p.my_bool != nil { 1147*333d2b36SAndroid Build Coastguard Worker myBoolStr = fmt.Sprintf("%t", *p.my_bool) 1148*333d2b36SAndroid Build Coastguard Worker } 1149*333d2b36SAndroid Build Coastguard Worker myStringStr := "nil" 1150*333d2b36SAndroid Build Coastguard Worker if p.my_string != nil { 1151*333d2b36SAndroid Build Coastguard Worker myStringStr = *p.my_string 1152*333d2b36SAndroid Build Coastguard Worker } 1153*333d2b36SAndroid Build Coastguard Worker myNonconfigurableStringStr := "nil" 1154*333d2b36SAndroid Build Coastguard Worker if p.my_nonconfigurable_string != nil { 1155*333d2b36SAndroid Build Coastguard Worker myNonconfigurableStringStr = *p.my_nonconfigurable_string 1156*333d2b36SAndroid Build Coastguard Worker } 1157*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf(`selectsTestProvider { 1158*333d2b36SAndroid Build Coastguard Worker my_bool: %v, 1159*333d2b36SAndroid Build Coastguard Worker my_string: %s, 1160*333d2b36SAndroid Build Coastguard Worker my_string_list: %s, 1161*333d2b36SAndroid Build Coastguard Worker my_paths: %s, 1162*333d2b36SAndroid Build Coastguard Worker replacing_string_list %s, 1163*333d2b36SAndroid Build Coastguard Worker arch_variant_configurable_bool %v 1164*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_bool: %v, 1165*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string: %s, 1166*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string_list: %s, 1167*333d2b36SAndroid Build Coastguard Worker}`, 1168*333d2b36SAndroid Build Coastguard Worker myBoolStr, 1169*333d2b36SAndroid Build Coastguard Worker myStringStr, 1170*333d2b36SAndroid Build Coastguard Worker p.my_string_list, 1171*333d2b36SAndroid Build Coastguard Worker p.my_paths, 1172*333d2b36SAndroid Build Coastguard Worker p.replacing_string_list, 1173*333d2b36SAndroid Build Coastguard Worker p.arch_variant_configurable_bool, 1174*333d2b36SAndroid Build Coastguard Worker p.my_nonconfigurable_bool, 1175*333d2b36SAndroid Build Coastguard Worker myNonconfigurableStringStr, 1176*333d2b36SAndroid Build Coastguard Worker p.my_nonconfigurable_string_list, 1177*333d2b36SAndroid Build Coastguard Worker ) 1178*333d2b36SAndroid Build Coastguard Worker} 1179*333d2b36SAndroid Build Coastguard Worker 1180*333d2b36SAndroid Build Coastguard Workervar selectsTestProviderKey = blueprint.NewProvider[selectsTestProvider]() 1181*333d2b36SAndroid Build Coastguard Worker 1182*333d2b36SAndroid Build Coastguard Workertype selectsMockModuleProperties struct { 1183*333d2b36SAndroid Build Coastguard Worker My_bool proptools.Configurable[bool] 1184*333d2b36SAndroid Build Coastguard Worker My_string proptools.Configurable[string] 1185*333d2b36SAndroid Build Coastguard Worker My_string_list proptools.Configurable[[]string] 1186*333d2b36SAndroid Build Coastguard Worker My_paths proptools.Configurable[[]string] `android:"path"` 1187*333d2b36SAndroid Build Coastguard Worker Replacing_string_list proptools.Configurable[[]string] `android:"replace_instead_of_append,arch_variant"` 1188*333d2b36SAndroid Build Coastguard Worker Arch_variant_configurable_bool proptools.Configurable[bool] `android:"replace_instead_of_append,arch_variant"` 1189*333d2b36SAndroid Build Coastguard Worker My_nonconfigurable_bool *bool 1190*333d2b36SAndroid Build Coastguard Worker My_nonconfigurable_string *string 1191*333d2b36SAndroid Build Coastguard Worker My_nonconfigurable_string_list []string 1192*333d2b36SAndroid Build Coastguard Worker} 1193*333d2b36SAndroid Build Coastguard Worker 1194*333d2b36SAndroid Build Coastguard Workertype selectsMockModule struct { 1195*333d2b36SAndroid Build Coastguard Worker ModuleBase 1196*333d2b36SAndroid Build Coastguard Worker DefaultableModuleBase 1197*333d2b36SAndroid Build Coastguard Worker properties selectsMockModuleProperties 1198*333d2b36SAndroid Build Coastguard Worker} 1199*333d2b36SAndroid Build Coastguard Worker 1200*333d2b36SAndroid Build Coastguard Workerfunc optionalToPtr[T any](o proptools.ConfigurableOptional[T]) *T { 1201*333d2b36SAndroid Build Coastguard Worker if o.IsEmpty() { 1202*333d2b36SAndroid Build Coastguard Worker return nil 1203*333d2b36SAndroid Build Coastguard Worker } 1204*333d2b36SAndroid Build Coastguard Worker x := o.Get() 1205*333d2b36SAndroid Build Coastguard Worker return &x 1206*333d2b36SAndroid Build Coastguard Worker} 1207*333d2b36SAndroid Build Coastguard Worker 1208*333d2b36SAndroid Build Coastguard Workerfunc (p *selectsMockModule) GenerateAndroidBuildActions(ctx ModuleContext) { 1209*333d2b36SAndroid Build Coastguard Worker toAppend := ctx.Config().VendorConfig("selects_test").String("append_to_string_list") 1210*333d2b36SAndroid Build Coastguard Worker if toAppend != "" { 1211*333d2b36SAndroid Build Coastguard Worker p.properties.My_string_list.AppendSimpleValue([]string{toAppend}) 1212*333d2b36SAndroid Build Coastguard Worker } 1213*333d2b36SAndroid Build Coastguard Worker SetProvider(ctx, selectsTestProviderKey, selectsTestProvider{ 1214*333d2b36SAndroid Build Coastguard Worker my_bool: optionalToPtr(p.properties.My_bool.Get(ctx)), 1215*333d2b36SAndroid Build Coastguard Worker my_string: optionalToPtr(p.properties.My_string.Get(ctx)), 1216*333d2b36SAndroid Build Coastguard Worker my_string_list: optionalToPtr(p.properties.My_string_list.Get(ctx)), 1217*333d2b36SAndroid Build Coastguard Worker my_paths: optionalToPtr(p.properties.My_paths.Get(ctx)), 1218*333d2b36SAndroid Build Coastguard Worker replacing_string_list: optionalToPtr(p.properties.Replacing_string_list.Get(ctx)), 1219*333d2b36SAndroid Build Coastguard Worker arch_variant_configurable_bool: optionalToPtr(p.properties.Arch_variant_configurable_bool.Get(ctx)), 1220*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_bool: p.properties.My_nonconfigurable_bool, 1221*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string: p.properties.My_nonconfigurable_string, 1222*333d2b36SAndroid Build Coastguard Worker my_nonconfigurable_string_list: p.properties.My_nonconfigurable_string_list, 1223*333d2b36SAndroid Build Coastguard Worker }) 1224*333d2b36SAndroid Build Coastguard Worker} 1225*333d2b36SAndroid Build Coastguard Worker 1226*333d2b36SAndroid Build Coastguard Workerfunc newSelectsMockModule() Module { 1227*333d2b36SAndroid Build Coastguard Worker m := &selectsMockModule{} 1228*333d2b36SAndroid Build Coastguard Worker m.AddProperties(&m.properties) 1229*333d2b36SAndroid Build Coastguard Worker InitAndroidArchModule(m, HostAndDeviceSupported, MultilibFirst) 1230*333d2b36SAndroid Build Coastguard Worker InitDefaultableModule(m) 1231*333d2b36SAndroid Build Coastguard Worker return m 1232*333d2b36SAndroid Build Coastguard Worker} 1233*333d2b36SAndroid Build Coastguard Worker 1234*333d2b36SAndroid Build Coastguard Workertype selectsMockDefaultsProperties struct { 1235*333d2b36SAndroid Build Coastguard Worker String_list_postprocessor_add_to_elements string 1236*333d2b36SAndroid Build Coastguard Worker} 1237*333d2b36SAndroid Build Coastguard Worker 1238*333d2b36SAndroid Build Coastguard Workertype selectsMockModuleDefaults struct { 1239*333d2b36SAndroid Build Coastguard Worker ModuleBase 1240*333d2b36SAndroid Build Coastguard Worker DefaultsModuleBase 1241*333d2b36SAndroid Build Coastguard Worker myProperties selectsMockModuleProperties 1242*333d2b36SAndroid Build Coastguard Worker defaultsProperties selectsMockDefaultsProperties 1243*333d2b36SAndroid Build Coastguard Worker} 1244*333d2b36SAndroid Build Coastguard Worker 1245*333d2b36SAndroid Build Coastguard Workerfunc (d *selectsMockModuleDefaults) GenerateAndroidBuildActions(ctx ModuleContext) { 1246*333d2b36SAndroid Build Coastguard Worker} 1247*333d2b36SAndroid Build Coastguard Worker 1248*333d2b36SAndroid Build Coastguard Workerfunc newSelectsMockModuleDefaults() Module { 1249*333d2b36SAndroid Build Coastguard Worker module := &selectsMockModuleDefaults{} 1250*333d2b36SAndroid Build Coastguard Worker 1251*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 1252*333d2b36SAndroid Build Coastguard Worker &module.myProperties, 1253*333d2b36SAndroid Build Coastguard Worker &module.defaultsProperties, 1254*333d2b36SAndroid Build Coastguard Worker ) 1255*333d2b36SAndroid Build Coastguard Worker 1256*333d2b36SAndroid Build Coastguard Worker InitDefaultsModule(module) 1257*333d2b36SAndroid Build Coastguard Worker 1258*333d2b36SAndroid Build Coastguard Worker AddLoadHook(module, func(lhc LoadHookContext) { 1259*333d2b36SAndroid Build Coastguard Worker if module.defaultsProperties.String_list_postprocessor_add_to_elements != "" { 1260*333d2b36SAndroid Build Coastguard Worker module.myProperties.My_string_list.AddPostProcessor(func(x []string) []string { 1261*333d2b36SAndroid Build Coastguard Worker for i := range x { 1262*333d2b36SAndroid Build Coastguard Worker x[i] = x[i] + module.defaultsProperties.String_list_postprocessor_add_to_elements 1263*333d2b36SAndroid Build Coastguard Worker } 1264*333d2b36SAndroid Build Coastguard Worker return x 1265*333d2b36SAndroid Build Coastguard Worker }) 1266*333d2b36SAndroid Build Coastguard Worker } 1267*333d2b36SAndroid Build Coastguard Worker }) 1268*333d2b36SAndroid Build Coastguard Worker 1269*333d2b36SAndroid Build Coastguard Worker return module 1270*333d2b36SAndroid Build Coastguard Worker} 1271