1// Copyright 2022 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. 14package bp2build 15 16import ( 17 "fmt" 18 "testing" 19 20 "android/soong/cc" 21) 22 23func runCcPrebuiltLibraryTestCase(t *testing.T, tc Bp2buildTestCase) { 24 t.Helper() 25 (&tc).ModuleTypeUnderTest = "cc_prebuilt_library" 26 (&tc).ModuleTypeUnderTestFactory = cc.PrebuiltLibraryFactory 27 RunBp2BuildTestCaseSimple(t, tc) 28} 29 30func TestPrebuiltLibraryStaticAndSharedSimple(t *testing.T) { 31 runCcPrebuiltLibraryTestCase(t, 32 Bp2buildTestCase{ 33 Description: "prebuilt library static and shared simple", 34 Filesystem: map[string]string{ 35 "libf.so": "", 36 }, 37 Blueprint: ` 38cc_prebuilt_library { 39 name: "libtest", 40 srcs: ["libf.so"], 41 bazel_module: { bp2build_available: true }, 42}`, 43 ExpectedBazelTargets: []string{ 44 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{ 45 "static_library": `"libf.so"`, 46 }), 47 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_alwayslink", AttrNameToString{ 48 "static_library": `"libf.so"`, 49 "alwayslink": "True", 50 }), 51 MakeBazelTarget("cc_prebuilt_library_shared", "libtest", AttrNameToString{ 52 "shared_library": `"libf.so"`, 53 }), 54 }, 55 }) 56} 57 58func TestPrebuiltLibraryWithArchVariance(t *testing.T) { 59 runCcPrebuiltLibraryTestCase(t, 60 Bp2buildTestCase{ 61 Description: "prebuilt library with arch variance", 62 Filesystem: map[string]string{ 63 "libf.so": "", 64 "libg.so": "", 65 }, 66 Blueprint: ` 67cc_prebuilt_library { 68 name: "libtest", 69 arch: { 70 arm64: { srcs: ["libf.so"], }, 71 arm: { srcs: ["libg.so"], }, 72 }, 73 bazel_module: { bp2build_available: true }, 74}`, 75 ExpectedBazelTargets: []string{ 76 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{ 77 "static_library": `select({ 78 "//build/bazel/platforms/arch:arm": "libg.so", 79 "//build/bazel/platforms/arch:arm64": "libf.so", 80 "//conditions:default": None, 81 })`}), 82 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_alwayslink", AttrNameToString{ 83 "alwayslink": "True", 84 "static_library": `select({ 85 "//build/bazel/platforms/arch:arm": "libg.so", 86 "//build/bazel/platforms/arch:arm64": "libf.so", 87 "//conditions:default": None, 88 })`}), 89 MakeBazelTarget("cc_prebuilt_library_shared", "libtest", AttrNameToString{ 90 "shared_library": `select({ 91 "//build/bazel/platforms/arch:arm": "libg.so", 92 "//build/bazel/platforms/arch:arm64": "libf.so", 93 "//conditions:default": None, 94 })`, 95 }), 96 }, 97 }) 98} 99 100func TestPrebuiltLibraryAdditionalAttrs(t *testing.T) { 101 runCcPrebuiltLibraryTestCase(t, 102 Bp2buildTestCase{ 103 Description: "prebuilt library additional attributes", 104 Filesystem: map[string]string{ 105 "libf.so": "", 106 "testdir/1/include.h": "", 107 "testdir/2/other.h": "", 108 }, 109 Blueprint: ` 110cc_prebuilt_library { 111 name: "libtest", 112 srcs: ["libf.so"], 113 export_include_dirs: ["testdir/1/"], 114 export_system_include_dirs: ["testdir/2/"], 115 bazel_module: { bp2build_available: true }, 116}`, 117 ExpectedBazelTargets: []string{ 118 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{ 119 "static_library": `"libf.so"`, 120 "export_includes": `["testdir/1/"]`, 121 "export_system_includes": `["testdir/2/"]`, 122 }), 123 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_alwayslink", AttrNameToString{ 124 "static_library": `"libf.so"`, 125 "export_includes": `["testdir/1/"]`, 126 "export_system_includes": `["testdir/2/"]`, 127 "alwayslink": "True", 128 }), 129 MakeBazelTarget("cc_prebuilt_library_shared", "libtest", AttrNameToString{ 130 "shared_library": `"libf.so"`, 131 "export_includes": `["testdir/1/"]`, 132 "export_system_includes": `["testdir/2/"]`, 133 }), 134 }, 135 }) 136} 137 138func TestPrebuiltLibrarySharedStanzaFails(t *testing.T) { 139 runCcPrebuiltLibraryTestCase(t, 140 Bp2buildTestCase{ 141 Description: "prebuilt library with shared stanza fails because multiple sources", 142 Filesystem: map[string]string{ 143 "libf.so": "", 144 "libg.so": "", 145 }, 146 Blueprint: ` 147cc_prebuilt_library { 148 name: "libtest", 149 srcs: ["libf.so"], 150 shared: { 151 srcs: ["libg.so"], 152 }, 153 bazel_module: { bp2build_available: true }, 154}`, 155 ExpectedErr: fmt.Errorf("Expected at most one source file"), 156 }) 157} 158 159func TestPrebuiltLibraryStaticStanzaFails(t *testing.T) { 160 RunBp2BuildTestCaseSimple(t, 161 Bp2buildTestCase{ 162 Description: "prebuilt library with static stanza fails because multiple sources", 163 ModuleTypeUnderTest: "cc_prebuilt_library", 164 ModuleTypeUnderTestFactory: cc.PrebuiltLibraryFactory, 165 Filesystem: map[string]string{ 166 "libf.so": "", 167 "libg.so": "", 168 }, 169 Blueprint: ` 170cc_prebuilt_library { 171 name: "libtest", 172 srcs: ["libf.so"], 173 static: { 174 srcs: ["libg.so"], 175 }, 176 bazel_module: { bp2build_available: true }, 177}`, 178 ExpectedErr: fmt.Errorf("Expected at most one source file"), 179 }) 180} 181 182func TestPrebuiltLibrarySharedAndStaticStanzas(t *testing.T) { 183 runCcPrebuiltLibraryTestCase(t, 184 Bp2buildTestCase{ 185 Description: "prebuilt library with both shared and static stanzas", 186 Filesystem: map[string]string{ 187 "libf.so": "", 188 "libg.so": "", 189 }, 190 Blueprint: ` 191cc_prebuilt_library { 192 name: "libtest", 193 static: { 194 srcs: ["libf.so"], 195 }, 196 shared: { 197 srcs: ["libg.so"], 198 }, 199 bazel_module: { bp2build_available: true }, 200}`, 201 ExpectedBazelTargets: []string{ 202 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{ 203 "static_library": `"libf.so"`, 204 }), 205 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_alwayslink", AttrNameToString{ 206 "static_library": `"libf.so"`, 207 "alwayslink": "True", 208 }), 209 MakeBazelTarget("cc_prebuilt_library_shared", "libtest", AttrNameToString{ 210 "shared_library": `"libg.so"`, 211 }), 212 }, 213 }) 214} 215 216// TODO(b/228623543): When this bug is fixed, enable this test 217//func TestPrebuiltLibraryOnlyShared(t *testing.T) { 218// runCcPrebuiltLibraryTestCase(t, 219// bp2buildTestCase{ 220// description: "prebuilt library shared only", 221// filesystem: map[string]string{ 222// "libf.so": "", 223// }, 224// blueprint: ` 225//cc_prebuilt_library { 226// name: "libtest", 227// srcs: ["libf.so"], 228// static: { 229// enabled: false, 230// }, 231// bazel_module: { bp2build_available: true }, 232//}`, 233// expectedBazelTargets: []string{ 234// makeBazelTarget("cc_prebuilt_library_shared", "libtest", attrNameToString{ 235// "shared_library": `"libf.so"`, 236// }), 237// }, 238// }) 239//} 240 241// TODO(b/228623543): When this bug is fixed, enable this test 242//func TestPrebuiltLibraryOnlyStatic(t *testing.T) { 243// runCcPrebuiltLibraryTestCase(t, 244// bp2buildTestCase{ 245// description: "prebuilt library static only", 246// filesystem: map[string]string{ 247// "libf.so": "", 248// }, 249// blueprint: ` 250//cc_prebuilt_library { 251// name: "libtest", 252// srcs: ["libf.so"], 253// shared: { 254// enabled: false, 255// }, 256// bazel_module: { bp2build_available: true }, 257//}`, 258// expectedBazelTargets: []string{ 259// makeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", attrNameToString{ 260// "static_library": `"libf.so"`, 261// }), 262// makeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_always", attrNameToString{ 263// "static_library": `"libf.so"`, 264// "alwayslink": "True", 265// }), 266// }, 267// }) 268//} 269 270func TestPrebuiltLibraryWithExportIncludesArchVariant(t *testing.T) { 271 runCcPrebuiltLibraryTestCase(t, Bp2buildTestCase{ 272 Description: "cc_prebuilt_library correctly translates export_includes with arch variance", 273 Filesystem: map[string]string{ 274 "libf.so": "", 275 "libg.so": "", 276 }, 277 Blueprint: ` 278cc_prebuilt_library { 279 name: "libtest", 280 srcs: ["libf.so"], 281 arch: { 282 arm: { export_include_dirs: ["testdir/1/"], }, 283 arm64: { export_include_dirs: ["testdir/2/"], }, 284 }, 285 bazel_module: { bp2build_available: true }, 286}`, 287 ExpectedBazelTargets: []string{ 288 MakeBazelTarget("cc_prebuilt_library_shared", "libtest", AttrNameToString{ 289 "shared_library": `"libf.so"`, 290 "export_includes": `select({ 291 "//build/bazel/platforms/arch:arm": ["testdir/1/"], 292 "//build/bazel/platforms/arch:arm64": ["testdir/2/"], 293 "//conditions:default": [], 294 })`, 295 }), 296 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{ 297 "static_library": `"libf.so"`, 298 "export_includes": `select({ 299 "//build/bazel/platforms/arch:arm": ["testdir/1/"], 300 "//build/bazel/platforms/arch:arm64": ["testdir/2/"], 301 "//conditions:default": [], 302 })`, 303 }), 304 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_alwayslink", AttrNameToString{ 305 "alwayslink": "True", 306 "static_library": `"libf.so"`, 307 "export_includes": `select({ 308 "//build/bazel/platforms/arch:arm": ["testdir/1/"], 309 "//build/bazel/platforms/arch:arm64": ["testdir/2/"], 310 "//conditions:default": [], 311 })`, 312 }), 313 }, 314 }) 315} 316 317func TestPrebuiltLibraryWithExportSystemIncludesArchVariant(t *testing.T) { 318 runCcPrebuiltLibraryTestCase(t, Bp2buildTestCase{ 319 Description: "cc_prebuilt_ibrary correctly translates export_system_includes with arch variance", 320 Filesystem: map[string]string{ 321 "libf.so": "", 322 "libg.so": "", 323 }, 324 Blueprint: ` 325cc_prebuilt_library { 326 name: "libtest", 327 srcs: ["libf.so"], 328 arch: { 329 arm: { export_system_include_dirs: ["testdir/1/"], }, 330 arm64: { export_system_include_dirs: ["testdir/2/"], }, 331 }, 332 bazel_module: { bp2build_available: true }, 333}`, 334 ExpectedBazelTargets: []string{ 335 MakeBazelTarget("cc_prebuilt_library_shared", "libtest", AttrNameToString{ 336 "shared_library": `"libf.so"`, 337 "export_system_includes": `select({ 338 "//build/bazel/platforms/arch:arm": ["testdir/1/"], 339 "//build/bazel/platforms/arch:arm64": ["testdir/2/"], 340 "//conditions:default": [], 341 })`, 342 }), 343 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{ 344 "static_library": `"libf.so"`, 345 "export_system_includes": `select({ 346 "//build/bazel/platforms/arch:arm": ["testdir/1/"], 347 "//build/bazel/platforms/arch:arm64": ["testdir/2/"], 348 "//conditions:default": [], 349 })`, 350 }), 351 MakeBazelTarget("cc_prebuilt_library_static", "libtest_bp2build_cc_library_static_alwayslink", AttrNameToString{ 352 "alwayslink": "True", 353 "static_library": `"libf.so"`, 354 "export_system_includes": `select({ 355 "//build/bazel/platforms/arch:arm": ["testdir/1/"], 356 "//build/bazel/platforms/arch:arm64": ["testdir/2/"], 357 "//conditions:default": [], 358 })`, 359 }), 360 }, 361 }) 362} 363