1// Copyright 2021 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package bp2build 16 17import ( 18 "fmt" 19 "testing" 20 21 "android/soong/android" 22 "android/soong/etc" 23) 24 25func runPrebuiltEtcTestCase(t *testing.T, tc Bp2buildTestCase) { 26 t.Helper() 27 (&tc).ModuleTypeUnderTest = "prebuilt_etc" 28 (&tc).ModuleTypeUnderTestFactory = etc.PrebuiltEtcFactory 29 RunBp2BuildTestCase(t, registerPrebuiltEtcModuleTypes, tc) 30} 31 32func registerPrebuiltEtcModuleTypes(ctx android.RegistrationContext) { 33} 34 35func TestPrebuiltEtcSimple(t *testing.T) { 36 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 37 Description: "prebuilt_etc - simple example", 38 Filesystem: map[string]string{}, 39 Blueprint: ` 40prebuilt_etc { 41 name: "apex_tz_version", 42 src: "version/tz_version", 43 filename: "tz_version", 44 sub_dir: "tz", 45 installable: false, 46} 47`, 48 ExpectedBazelTargets: []string{ 49 MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ 50 "filename": `"tz_version"`, 51 "installable": `False`, 52 "src": `"version/tz_version"`, 53 "dir": `"etc/tz"`, 54 })}}) 55} 56 57func TestPrebuiltEtcArchVariant(t *testing.T) { 58 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 59 Description: "prebuilt_etc - arch variant", 60 Filesystem: map[string]string{}, 61 Blueprint: ` 62prebuilt_etc { 63 name: "apex_tz_version", 64 src: "version/tz_version", 65 filename: "tz_version", 66 sub_dir: "tz", 67 installable: false, 68 arch: { 69 arm: { 70 src: "arm", 71 }, 72 arm64: { 73 src: "arm64", 74 }, 75 } 76} 77`, 78 ExpectedBazelTargets: []string{ 79 MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ 80 "filename": `"tz_version"`, 81 "installable": `False`, 82 "src": `select({ 83 "//build/bazel/platforms/arch:arm": "arm", 84 "//build/bazel/platforms/arch:arm64": "arm64", 85 "//conditions:default": "version/tz_version", 86 })`, 87 "dir": `"etc/tz"`, 88 })}}) 89} 90 91func TestPrebuiltEtcArchAndTargetVariant(t *testing.T) { 92 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 93 Description: "prebuilt_etc - arch variant", 94 Filesystem: map[string]string{}, 95 Blueprint: ` 96prebuilt_etc { 97 name: "apex_tz_version", 98 src: "version/tz_version", 99 filename: "tz_version", 100 sub_dir: "tz", 101 installable: false, 102 arch: { 103 arm: { 104 src: "arm", 105 }, 106 arm64: { 107 src: "darwin_or_arm64", 108 }, 109 }, 110 target: { 111 darwin: { 112 src: "darwin_or_arm64", 113 } 114 }, 115} 116`, 117 ExpectedBazelTargets: []string{ 118 MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ 119 "filename": `"tz_version"`, 120 "installable": `False`, 121 "src": `select({ 122 "//build/bazel/platforms/os_arch:android_arm": "arm", 123 "//build/bazel/platforms/os_arch:android_arm64": "darwin_or_arm64", 124 "//build/bazel/platforms/os_arch:darwin_arm64": "darwin_or_arm64", 125 "//build/bazel/platforms/os_arch:darwin_x86_64": "darwin_or_arm64", 126 "//build/bazel/platforms/os_arch:linux_bionic_arm64": "darwin_or_arm64", 127 "//conditions:default": "version/tz_version", 128 })`, 129 "dir": `"etc/tz"`, 130 })}}) 131} 132func TestPrebuiltEtcProductVariables(t *testing.T) { 133 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 134 Description: "prebuilt etc - product variables", 135 Filesystem: map[string]string{}, 136 Blueprint: ` 137prebuilt_etc { 138 name: "apex_tz_version", 139 src: "version/tz_version", 140 filename: "tz_version", 141 product_variables: { 142 native_coverage: { 143 src: "src1", 144 }, 145 }, 146} 147`, 148 ExpectedBazelTargets: []string{ 149 MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ 150 "filename": `"tz_version"`, 151 "src": `select({ 152 "//build/bazel/product_variables:native_coverage": "src1", 153 "//conditions:default": "version/tz_version", 154 })`, 155 "dir": `"etc"`, 156 })}}) 157} 158 159func runPrebuiltUsrShareTestCase(t *testing.T, tc Bp2buildTestCase) { 160 t.Helper() 161 (&tc).ModuleTypeUnderTest = "prebuilt_usr_share" 162 (&tc).ModuleTypeUnderTestFactory = etc.PrebuiltUserShareFactory 163 RunBp2BuildTestCase(t, registerPrebuiltEtcModuleTypes, tc) 164} 165 166func registerPrebuiltUsrShareModuleTypes(ctx android.RegistrationContext) { 167} 168 169func TestPrebuiltUsrShareSimple(t *testing.T) { 170 runPrebuiltUsrShareTestCase(t, Bp2buildTestCase{ 171 Description: "prebuilt_usr_share - simple example", 172 Filesystem: map[string]string{}, 173 Blueprint: ` 174prebuilt_usr_share { 175 name: "apex_tz_version", 176 src: "version/tz_version", 177 filename: "tz_version", 178 sub_dir: "tz", 179 installable: false, 180} 181`, 182 ExpectedBazelTargets: []string{ 183 MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ 184 "filename": `"tz_version"`, 185 "installable": `False`, 186 "src": `"version/tz_version"`, 187 "dir": `"usr/share/tz"`, 188 })}}) 189} 190 191func TestPrebuiltEtcNoSubdir(t *testing.T) { 192 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 193 Description: "prebuilt_etc - no subdir", 194 Filesystem: map[string]string{}, 195 Blueprint: ` 196prebuilt_etc { 197 name: "apex_tz_version", 198 src: "version/tz_version", 199 filename: "tz_version", 200 installable: false, 201} 202`, 203 ExpectedBazelTargets: []string{ 204 MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ 205 "filename": `"tz_version"`, 206 "installable": `False`, 207 "src": `"version/tz_version"`, 208 "dir": `"etc"`, 209 })}}) 210} 211 212func TestFilenameAsProperty(t *testing.T) { 213 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 214 Description: "prebuilt_etc - filename is specified as a property ", 215 Filesystem: map[string]string{}, 216 Blueprint: ` 217prebuilt_etc { 218 name: "foo", 219 src: "fooSrc", 220 filename: "fooFileName", 221} 222`, 223 ExpectedBazelTargets: []string{ 224 MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ 225 "filename": `"fooFileName"`, 226 "src": `"fooSrc"`, 227 "dir": `"etc"`, 228 })}}) 229} 230 231func TestFileNameFromSrc(t *testing.T) { 232 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 233 Description: "prebuilt_etc - filename_from_src is true ", 234 Filesystem: map[string]string{}, 235 Blueprint: ` 236prebuilt_etc { 237 name: "foo", 238 filename_from_src: true, 239 src: "fooSrc", 240} 241`, 242 ExpectedBazelTargets: []string{ 243 MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ 244 "filename": `"fooSrc"`, 245 "src": `"fooSrc"`, 246 "dir": `"etc"`, 247 })}}) 248} 249 250func TestFileNameFromSrcMultipleSrcs(t *testing.T) { 251 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 252 Description: "prebuilt_etc - filename_from_src is true but there are multiple srcs", 253 Filesystem: map[string]string{}, 254 Blueprint: ` 255prebuilt_etc { 256 name: "foo", 257 filename_from_src: true, 258 arch: { 259 arm: { 260 src: "barSrc", 261 }, 262 arm64: { 263 src: "bazSrc", 264 }, 265 } 266} 267`, 268 ExpectedBazelTargets: []string{ 269 MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ 270 "filename_from_src": `True`, 271 "dir": `"etc"`, 272 "src": `select({ 273 "//build/bazel/platforms/arch:arm": "barSrc", 274 "//build/bazel/platforms/arch:arm64": "bazSrc", 275 "//conditions:default": None, 276 })`, 277 })}}) 278} 279 280func TestFilenameFromModuleName(t *testing.T) { 281 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 282 Description: "prebuilt_etc - neither filename nor filename_from_src are specified ", 283 Filesystem: map[string]string{}, 284 Blueprint: ` 285prebuilt_etc { 286 name: "foo", 287} 288`, 289 ExpectedBazelTargets: []string{ 290 MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ 291 "filename": `"foo"`, 292 "dir": `"etc"`, 293 })}}) 294} 295 296func TestPrebuiltEtcProductVariableArchSrcs(t *testing.T) { 297 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 298 Description: "prebuilt etc- SRcs from arch variant product variables", 299 Filesystem: map[string]string{}, 300 Blueprint: ` 301prebuilt_etc { 302 name: "foo", 303 filename: "fooFilename", 304 arch: { 305 arm: { 306 src: "armSrc", 307 product_variables: { 308 native_coverage: { 309 src: "nativeCoverageArmSrc", 310 }, 311 }, 312 }, 313 }, 314}`, 315 ExpectedBazelTargets: []string{ 316 MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ 317 "filename": `"fooFilename"`, 318 "dir": `"etc"`, 319 "src": `select({ 320 "//build/bazel/platforms/arch:arm": "armSrc", 321 "//build/bazel/product_variables:native_coverage-arm": "nativeCoverageArmSrc", 322 "//conditions:default": None, 323 })`, 324 })}}) 325} 326 327func TestPrebuiltEtcProductVariableError(t *testing.T) { 328 runPrebuiltEtcTestCase(t, Bp2buildTestCase{ 329 Description: "", 330 Filesystem: map[string]string{}, 331 Blueprint: ` 332prebuilt_etc { 333 name: "foo", 334 filename: "fooFilename", 335 arch: { 336 arm: { 337 src: "armSrc", 338 }, 339 }, 340 product_variables: { 341 native_coverage: { 342 src: "nativeCoverageArmSrc", 343 }, 344 }, 345}`, 346 ExpectedErr: fmt.Errorf("label attribute could not be collapsed"), 347 }) 348} 349