blob: 641984b52759c1b708a607f74dcf6f3a00039978 [file] [log] [blame]
Rupert Shuttleworth54e78412021-02-15 11:04:32 +00001// 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 (
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020018 "testing"
19
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000020 "android/soong/android"
21 "android/soong/cc"
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000022)
23
24const (
25 // See cc/testing.go for more context
Jingwen Chen63930982021-03-24 10:04:33 -040026 soongCcLibraryHeadersPreamble = `
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000027cc_defaults {
Liz Kammer8337ea42021-09-10 10:06:32 -040028 name: "linux_bionic_supported",
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000029}`
30)
31
32func TestCcLibraryHeadersLoadStatement(t *testing.T) {
33 testCases := []struct {
34 bazelTargets BazelTargets
35 expectedLoadStatements string
36 }{
37 {
38 bazelTargets: BazelTargets{
39 BazelTarget{
40 name: "cc_library_headers_target",
41 ruleClass: "cc_library_headers",
42 // Note: no bzlLoadLocation for native rules
43 },
44 },
45 expectedLoadStatements: ``,
46 },
47 }
48
49 for _, testCase := range testCases {
50 actual := testCase.bazelTargets.LoadStatements()
51 expected := testCase.expectedLoadStatements
52 if actual != expected {
53 t.Fatalf("Expected load statements to be %s, got %s", expected, actual)
54 }
55 }
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000056}
57
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020058func registerCcLibraryHeadersModuleTypes(ctx android.RegistrationContext) {
59 cc.RegisterCCBuildComponents(ctx)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020060}
61
62func runCcLibraryHeadersTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040063 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020064 runBp2BuildTestCase(t, registerCcLibraryHeadersModuleTypes, tc)
65}
66
67func TestCcLibraryHeadersSimple(t *testing.T) {
68 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -040069 description: "cc_library_headers test",
70 moduleTypeUnderTest: "cc_library_headers",
71 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020072 filesystem: map[string]string{
73 "lib-1/lib1a.h": "",
74 "lib-1/lib1b.h": "",
75 "lib-2/lib2a.h": "",
76 "lib-2/lib2b.h": "",
77 "dir-1/dir1a.h": "",
78 "dir-1/dir1b.h": "",
79 "dir-2/dir2a.h": "",
80 "dir-2/dir2b.h": "",
81 "arch_arm64_exported_include_dir/a.h": "",
82 "arch_x86_exported_include_dir/b.h": "",
83 "arch_x86_64_exported_include_dir/c.h": "",
84 },
85 blueprint: soongCcLibraryHeadersPreamble + `
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000086cc_library_headers {
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000087 name: "foo_headers",
88 export_include_dirs: ["dir-1", "dir-2"],
89 header_libs: ["lib-1", "lib-2"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +000090
Rupert Shuttleworthb8151682021-04-06 20:06:21 +000091 arch: {
92 arm64: {
Liz Kammer8337ea42021-09-10 10:06:32 -040093 // We expect dir-1 headers to be dropped, because dir-1 is already in export_include_dirs
Rupert Shuttleworthb8151682021-04-06 20:06:21 +000094 export_include_dirs: ["arch_arm64_exported_include_dir", "dir-1"],
95 },
96 x86: {
97 export_include_dirs: ["arch_x86_exported_include_dir"],
98 },
99 x86_64: {
100 export_include_dirs: ["arch_x86_64_exported_include_dir"],
101 },
102 },
Yu Liufc603162022-03-01 15:44:08 -0800103 sdk_version: "current",
104 min_sdk_version: "29",
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000105
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000106 // TODO: Also support export_header_lib_headers
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000107}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500108 expectedBazelTargets: []string{
109 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
110 "export_includes": `[
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000111 "dir-1",
112 "dir-2",
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000113 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000114 "//build/bazel/platforms/arch:arm64": ["arch_arm64_exported_include_dir"],
115 "//build/bazel/platforms/arch:x86": ["arch_x86_exported_include_dir"],
116 "//build/bazel/platforms/arch:x86_64": ["arch_x86_64_exported_include_dir"],
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000117 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500118 })`,
Trevor Radcliffefb6c5222022-06-17 19:42:28 +0000119 "sdk_version": `"current"`,
120 "min_sdk_version": `"29"`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500121 }),
122 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200123 })
124}
125
Liz Kammer8337ea42021-09-10 10:06:32 -0400126func TestCcLibraryHeadersOsSpecificHeader(t *testing.T) {
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200127 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400128 description: "cc_library_headers test with os-specific header_libs props",
129 moduleTypeUnderTest: "cc_library_headers",
130 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
131 filesystem: map[string]string{},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200132 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -0400133cc_library_headers {
134 name: "android-lib",
135 bazel_module: { bp2build_available: false },
136}
137cc_library_headers {
138 name: "base-lib",
139 bazel_module: { bp2build_available: false },
140}
141cc_library_headers {
142 name: "darwin-lib",
143 bazel_module: { bp2build_available: false },
144}
145cc_library_headers {
146 name: "linux-lib",
147 bazel_module: { bp2build_available: false },
148}
149cc_library_headers {
150 name: "linux_bionic-lib",
151 bazel_module: { bp2build_available: false },
152}
153cc_library_headers {
154 name: "windows-lib",
155 bazel_module: { bp2build_available: false },
156}
Jingwen Chen91220d72021-03-24 02:18:33 -0400157cc_library_headers {
158 name: "foo_headers",
159 header_libs: ["base-lib"],
Trevor Radcliffefb6c5222022-06-17 19:42:28 +0000160 export_header_lib_headers: ["base-lib"],
Jingwen Chen91220d72021-03-24 02:18:33 -0400161 target: {
Trevor Radcliffefb6c5222022-06-17 19:42:28 +0000162 android: {
163 header_libs: ["android-lib"],
164 export_header_lib_headers: ["android-lib"],
165 },
166 darwin: {
167 header_libs: ["darwin-lib"],
168 export_header_lib_headers: ["darwin-lib"],
169 },
170 linux_bionic: {
171 header_libs: ["linux_bionic-lib"],
172 export_header_lib_headers: ["linux_bionic-lib"],
173 },
174 linux_glibc: {
175 header_libs: ["linux-lib"],
176 export_header_lib_headers: ["linux-lib"],
177 },
178 windows: {
179 header_libs: ["windows-lib"],
180 export_header_lib_headers: ["windows-lib"],
181 },
Jingwen Chen91220d72021-03-24 02:18:33 -0400182 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400183 include_build_directory: false,
Jingwen Chen91220d72021-03-24 02:18:33 -0400184}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500185 expectedBazelTargets: []string{
186 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
Trevor Radcliffefb6c5222022-06-17 19:42:28 +0000187 "deps": `[":base-lib"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000188 "//build/bazel/platforms/os:android": [":android-lib"],
189 "//build/bazel/platforms/os:darwin": [":darwin-lib"],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000190 "//build/bazel/platforms/os:linux": [":linux-lib"],
191 "//build/bazel/platforms/os:linux_bionic": [":linux_bionic-lib"],
192 "//build/bazel/platforms/os:windows": [":windows-lib"],
Jingwen Chen91220d72021-03-24 02:18:33 -0400193 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500194 })`,
195 }),
196 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200197 })
198}
199
200func TestCcLibraryHeadersOsSpecficHeaderLibsExportHeaderLibHeaders(t *testing.T) {
201 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400202 description: "cc_library_headers test with os-specific header_libs and export_header_lib_headers props",
203 moduleTypeUnderTest: "cc_library_headers",
204 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
205 filesystem: map[string]string{},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200206 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -0400207cc_library_headers {
208 name: "android-lib",
209 bazel_module: { bp2build_available: false },
210 }
211cc_library_headers {
212 name: "exported-lib",
213 bazel_module: { bp2build_available: false },
214}
Jingwen Chen91220d72021-03-24 02:18:33 -0400215cc_library_headers {
216 name: "foo_headers",
217 target: {
Liz Kammer7a210ac2021-09-22 15:52:58 -0400218 android: {
219 header_libs: ["android-lib", "exported-lib"],
220 export_header_lib_headers: ["exported-lib"]
221 },
Jingwen Chen91220d72021-03-24 02:18:33 -0400222 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400223 include_build_directory: false,
Jingwen Chen91220d72021-03-24 02:18:33 -0400224}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500225 expectedBazelTargets: []string{
226 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
227 "deps": `select({
Chris Parsonsd6358772021-05-18 18:35:24 -0400228 "//build/bazel/platforms/os:android": [":exported-lib"],
229 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500230 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500231 }),
232 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200233 })
234}
235
236func TestCcLibraryHeadersArchAndTargetExportSystemIncludes(t *testing.T) {
237 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400238 description: "cc_library_headers test with arch-specific and target-specific export_system_include_dirs props",
239 moduleTypeUnderTest: "cc_library_headers",
240 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
241 filesystem: map[string]string{},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200242 blueprint: soongCcLibraryPreamble + `cc_library_headers {
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400243 name: "foo_headers",
244 export_system_include_dirs: [
Liz Kammer8337ea42021-09-10 10:06:32 -0400245 "shared_include_dir",
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400246 ],
247 target: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400248 android: {
249 export_system_include_dirs: [
250 "android_include_dir",
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400251 ],
Liz Kammer8337ea42021-09-10 10:06:32 -0400252 },
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400253 linux_glibc: {
254 export_system_include_dirs: [
255 "linux_include_dir",
256 ],
257 },
258 darwin: {
259 export_system_include_dirs: [
260 "darwin_include_dir",
261 ],
262 },
263 },
264 arch: {
265 arm: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400266 export_system_include_dirs: [
267 "arm_include_dir",
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400268 ],
Liz Kammer8337ea42021-09-10 10:06:32 -0400269 },
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400270 x86_64: {
271 export_system_include_dirs: [
272 "x86_64_include_dir",
273 ],
274 },
275 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400276 include_build_directory: false,
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400277}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500278 expectedBazelTargets: []string{
279 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
280 "export_system_includes": `["shared_include_dir"] + select({
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400281 "//build/bazel/platforms/arch:arm": ["arm_include_dir"],
282 "//build/bazel/platforms/arch:x86_64": ["x86_64_include_dir"],
283 "//conditions:default": [],
284 }) + select({
285 "//build/bazel/platforms/os:android": ["android_include_dir"],
286 "//build/bazel/platforms/os:darwin": ["darwin_include_dir"],
287 "//build/bazel/platforms/os:linux": ["linux_include_dir"],
288 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500289 })`,
290 }),
291 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200292 })
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000293}
Liz Kammerd366c902021-06-03 13:43:01 -0400294
295func TestCcLibraryHeadersNoCrtIgnored(t *testing.T) {
296 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400297 description: "cc_library_headers test",
298 moduleTypeUnderTest: "cc_library_headers",
299 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
Liz Kammerd366c902021-06-03 13:43:01 -0400300 filesystem: map[string]string{
301 "lib-1/lib1a.h": "",
302 "lib-1/lib1b.h": "",
303 "lib-2/lib2a.h": "",
304 "lib-2/lib2b.h": "",
305 "dir-1/dir1a.h": "",
306 "dir-1/dir1b.h": "",
307 "dir-2/dir2a.h": "",
308 "dir-2/dir2b.h": "",
309 "arch_arm64_exported_include_dir/a.h": "",
310 "arch_x86_exported_include_dir/b.h": "",
311 "arch_x86_64_exported_include_dir/c.h": "",
312 },
313 blueprint: soongCcLibraryHeadersPreamble + `
314cc_library_headers {
315 name: "lib-1",
316 export_include_dirs: ["lib-1"],
317 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400318 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -0400319}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500320 expectedBazelTargets: []string{
321 makeBazelTarget("cc_library_headers", "lib-1", attrNameToString{
322 "export_includes": `["lib-1"]`,
323 }),
324 },
Liz Kammerd366c902021-06-03 13:43:01 -0400325 })
326}
Trevor Radcliffe2be7f542022-06-22 20:30:55 +0000327
328func TestCcLibraryHeadersExportedStaticLibHeadersReexported(t *testing.T) {
329 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
330 description: "cc_library_headers exported_static_lib_headers is reexported",
331 moduleTypeUnderTest: "cc_library_headers",
332 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
333 filesystem: map[string]string{},
334 blueprint: soongCcLibraryHeadersPreamble + `
335cc_library_headers {
336 name: "foo_headers",
337 export_static_lib_headers: ["foo_export"],
338 static_libs: ["foo_export", "foo_no_reexport"],
339 bazel_module: { bp2build_available: true },
340}
341` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
342 expectedBazelTargets: []string{
343 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
344 "deps": `[":foo_export"]`,
345 }),
346 },
347 })
348}
349
350func TestCcLibraryHeadersExportedSharedLibHeadersReexported(t *testing.T) {
351 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
352 description: "cc_library_headers exported_shared_lib_headers is reexported",
353 moduleTypeUnderTest: "cc_library_headers",
354 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
355 filesystem: map[string]string{},
356 blueprint: soongCcLibraryHeadersPreamble + `
357cc_library_headers {
358 name: "foo_headers",
359 export_shared_lib_headers: ["foo_export"],
360 shared_libs: ["foo_export", "foo_no_reexport"],
361 bazel_module: { bp2build_available: true },
362}
363` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
364 expectedBazelTargets: []string{
365 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
366 "deps": `[":foo_export"]`,
367 }),
368 },
369 })
370}
371
372func TestCcLibraryHeadersExportedHeaderLibHeadersReexported(t *testing.T) {
373 runCcLibraryHeadersTestCase(t, bp2buildTestCase{
374 description: "cc_library_headers exported_header_lib_headers is reexported",
375 moduleTypeUnderTest: "cc_library_headers",
376 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
377 filesystem: map[string]string{},
378 blueprint: soongCcLibraryHeadersPreamble + `
379cc_library_headers {
380 name: "foo_headers",
381 export_header_lib_headers: ["foo_export"],
382 header_libs: ["foo_export", "foo_no_reexport"],
383 bazel_module: { bp2build_available: true },
384}
385` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
386 expectedBazelTargets: []string{
387 makeBazelTarget("cc_library_headers", "foo_headers", attrNameToString{
388 "deps": `[":foo_export"]`,
389 }),
390 },
391 })
392}