blob: 655218d29cf4c7f90063fa8e53e23b94802612fe [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 (
18 "android/soong/android"
19 "android/soong/cc"
20 "strings"
21 "testing"
22)
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 {
28 name: "linux_bionic_supported",
29}
30
31toolchain_library {
32 name: "libclang_rt.builtins-x86_64-android",
33 defaults: ["linux_bionic_supported"],
34 vendor_available: true,
35 vendor_ramdisk_available: true,
36 product_available: true,
37 recovery_available: true,
38 native_bridge_supported: true,
39 src: "",
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000040}`
41)
42
43func TestCcLibraryHeadersLoadStatement(t *testing.T) {
44 testCases := []struct {
45 bazelTargets BazelTargets
46 expectedLoadStatements string
47 }{
48 {
49 bazelTargets: BazelTargets{
50 BazelTarget{
51 name: "cc_library_headers_target",
52 ruleClass: "cc_library_headers",
53 // Note: no bzlLoadLocation for native rules
54 },
55 },
56 expectedLoadStatements: ``,
57 },
58 }
59
60 for _, testCase := range testCases {
61 actual := testCase.bazelTargets.LoadStatements()
62 expected := testCase.expectedLoadStatements
63 if actual != expected {
64 t.Fatalf("Expected load statements to be %s, got %s", expected, actual)
65 }
66 }
67
68}
69
70func TestCcLibraryHeadersBp2Build(t *testing.T) {
71 testCases := []struct {
72 description string
73 moduleTypeUnderTest string
74 moduleTypeUnderTestFactory android.ModuleFactory
75 moduleTypeUnderTestBp2BuildMutator func(android.TopDownMutatorContext)
76 preArchMutators []android.RegisterMutatorFunc
77 depsMutators []android.RegisterMutatorFunc
78 bp string
79 expectedBazelTargets []string
80 filesystem map[string]string
81 dir string
82 }{
83 {
84 description: "cc_library_headers test",
85 moduleTypeUnderTest: "cc_library_headers",
86 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
87 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryHeadersBp2Build,
88 filesystem: map[string]string{
Rupert Shuttleworthb8151682021-04-06 20:06:21 +000089 "lib-1/lib1a.h": "",
90 "lib-1/lib1b.h": "",
91 "lib-2/lib2a.h": "",
92 "lib-2/lib2b.h": "",
93 "dir-1/dir1a.h": "",
94 "dir-1/dir1b.h": "",
95 "dir-2/dir2a.h": "",
96 "dir-2/dir2b.h": "",
97 "arch_arm64_exported_include_dir/a.h": "",
98 "arch_x86_exported_include_dir/b.h": "",
99 "arch_x86_64_exported_include_dir/c.h": "",
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000100 },
Jingwen Chen63930982021-03-24 10:04:33 -0400101 bp: soongCcLibraryHeadersPreamble + `
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000102cc_library_headers {
103 name: "lib-1",
104 export_include_dirs: ["lib-1"],
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000105}
106
107cc_library_headers {
108 name: "lib-2",
109 export_include_dirs: ["lib-2"],
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000110}
111
112cc_library_headers {
113 name: "foo_headers",
114 export_include_dirs: ["dir-1", "dir-2"],
115 header_libs: ["lib-1", "lib-2"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000116
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000117 arch: {
118 arm64: {
119 // We expect dir-1 headers to be dropped, because dir-1 is already in export_include_dirs
120 export_include_dirs: ["arch_arm64_exported_include_dir", "dir-1"],
121 },
122 x86: {
123 export_include_dirs: ["arch_x86_exported_include_dir"],
124 },
125 x86_64: {
126 export_include_dirs: ["arch_x86_64_exported_include_dir"],
127 },
128 },
129
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000130 // TODO: Also support export_header_lib_headers
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000131}`,
132 expectedBazelTargets: []string{`cc_library_headers(
133 name = "foo_headers",
134 deps = [
135 ":lib-1",
136 ":lib-2",
137 ],
138 hdrs = [
139 "dir-1/dir1a.h",
140 "dir-1/dir1b.h",
141 "dir-2/dir2a.h",
142 "dir-2/dir2b.h",
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000143 ] + select({
144 "//build/bazel/platforms/arch:arm64": [
145 "arch_arm64_exported_include_dir/a.h",
146 ],
147 "//build/bazel/platforms/arch:x86": [
148 "arch_x86_exported_include_dir/b.h",
149 ],
150 "//build/bazel/platforms/arch:x86_64": [
151 "arch_x86_64_exported_include_dir/c.h",
152 ],
153 "//conditions:default": [],
154 }),
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000155 includes = [
156 "dir-1",
157 "dir-2",
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000158 ] + select({
159 "//build/bazel/platforms/arch:arm64": [
160 "arch_arm64_exported_include_dir",
161 ],
162 "//build/bazel/platforms/arch:x86": [
163 "arch_x86_exported_include_dir",
164 ],
165 "//build/bazel/platforms/arch:x86_64": [
166 "arch_x86_64_exported_include_dir",
167 ],
168 "//conditions:default": [],
169 }),
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000170)`, `cc_library_headers(
171 name = "lib-1",
172 hdrs = [
173 "lib-1/lib1a.h",
174 "lib-1/lib1b.h",
175 ],
176 includes = [
177 "lib-1",
178 ],
179)`, `cc_library_headers(
180 name = "lib-2",
181 hdrs = [
182 "lib-2/lib2a.h",
183 "lib-2/lib2b.h",
184 ],
185 includes = [
186 "lib-2",
187 ],
188)`},
189 },
Jingwen Chen91220d72021-03-24 02:18:33 -0400190 {
191 description: "cc_library_headers test with os-specific header_libs props",
192 moduleTypeUnderTest: "cc_library_headers",
193 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
194 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryHeadersBp2Build,
195 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
196 filesystem: map[string]string{},
197 bp: soongCcLibraryPreamble + `
198cc_library_headers { name: "android-lib" }
199cc_library_headers { name: "base-lib" }
200cc_library_headers { name: "darwin-lib" }
201cc_library_headers { name: "fuchsia-lib" }
202cc_library_headers { name: "linux-lib" }
203cc_library_headers { name: "linux_bionic-lib" }
204cc_library_headers { name: "windows-lib" }
205cc_library_headers {
206 name: "foo_headers",
207 header_libs: ["base-lib"],
208 target: {
209 android: { header_libs: ["android-lib"] },
210 darwin: { header_libs: ["darwin-lib"] },
211 fuchsia: { header_libs: ["fuchsia-lib"] },
212 linux_bionic: { header_libs: ["linux_bionic-lib"] },
213 linux_glibc: { header_libs: ["linux-lib"] },
214 windows: { header_libs: ["windows-lib"] },
215 },
216 bazel_module: { bp2build_available: true },
217}`,
218 expectedBazelTargets: []string{`cc_library_headers(
219 name = "android-lib",
220)`, `cc_library_headers(
221 name = "base-lib",
222)`, `cc_library_headers(
223 name = "darwin-lib",
224)`, `cc_library_headers(
225 name = "foo_headers",
226 deps = [
227 ":base-lib",
228 ] + select({
229 "//build/bazel/platforms/os:android": [
230 ":android-lib",
231 ],
232 "//build/bazel/platforms/os:darwin": [
233 ":darwin-lib",
234 ],
235 "//build/bazel/platforms/os:fuchsia": [
236 ":fuchsia-lib",
237 ],
238 "//build/bazel/platforms/os:linux": [
239 ":linux-lib",
240 ],
241 "//build/bazel/platforms/os:linux_bionic": [
242 ":linux_bionic-lib",
243 ],
244 "//build/bazel/platforms/os:windows": [
245 ":windows-lib",
246 ],
247 "//conditions:default": [],
248 }),
249)`, `cc_library_headers(
250 name = "fuchsia-lib",
251)`, `cc_library_headers(
252 name = "linux-lib",
253)`, `cc_library_headers(
254 name = "linux_bionic-lib",
255)`, `cc_library_headers(
256 name = "windows-lib",
257)`},
258 },
259 {
260 description: "cc_library_headers test with os-specific header_libs and export_header_lib_headers props",
261 moduleTypeUnderTest: "cc_library_headers",
262 moduleTypeUnderTestFactory: cc.LibraryHeaderFactory,
263 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryHeadersBp2Build,
264 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
265 filesystem: map[string]string{},
266 bp: soongCcLibraryPreamble + `
267cc_library_headers { name: "android-lib" }
268cc_library_headers { name: "exported-lib" }
269cc_library_headers {
270 name: "foo_headers",
271 target: {
272 android: { header_libs: ["android-lib"], export_header_lib_headers: ["exported-lib"] },
273 },
274}`,
275 expectedBazelTargets: []string{`cc_library_headers(
276 name = "android-lib",
277)`, `cc_library_headers(
278 name = "exported-lib",
279)`, `cc_library_headers(
280 name = "foo_headers",
Jingwen Chen63930982021-03-24 10:04:33 -0400281 deps = select({
Jingwen Chen91220d72021-03-24 02:18:33 -0400282 "//build/bazel/platforms/os:android": [
283 ":android-lib",
284 ":exported-lib",
285 ],
286 "//conditions:default": [],
287 }),
288)`},
289 },
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000290 }
291
292 dir := "."
293 for _, testCase := range testCases {
294 filesystem := make(map[string][]byte)
295 toParse := []string{
296 "Android.bp",
297 }
298 for f, content := range testCase.filesystem {
299 if strings.HasSuffix(f, "Android.bp") {
300 toParse = append(toParse, f)
301 }
302 filesystem[f] = []byte(content)
303 }
304 config := android.TestConfig(buildDir, nil, testCase.bp, filesystem)
305 ctx := android.NewTestContext(config)
306
Jingwen Chen91220d72021-03-24 02:18:33 -0400307 // TODO(jingwen): make this default for all bp2build tests
308 ctx.RegisterBp2BuildConfig(bp2buildConfig)
309
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000310 cc.RegisterCCBuildComponents(ctx)
311 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
312
313 ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
314 for _, m := range testCase.depsMutators {
315 ctx.DepsBp2BuildMutators(m)
316 }
317 ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
318 ctx.RegisterForBazelConversion()
319
320 _, errs := ctx.ParseFileList(dir, toParse)
321 if Errored(t, testCase.description, errs) {
322 continue
323 }
324 _, errs = ctx.ResolveDependencies(config)
325 if Errored(t, testCase.description, errs) {
326 continue
327 }
328
329 checkDir := dir
330 if testCase.dir != "" {
331 checkDir = testCase.dir
332 }
Jingwen Chen164e0862021-02-19 00:48:40 -0500333 codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
Jingwen Chenba369ad2021-02-22 10:19:34 -0500334 bazelTargets := generateBazelTargetsForDir(codegenCtx, checkDir)
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000335 if actualCount, expectedCount := len(bazelTargets), len(testCase.expectedBazelTargets); actualCount != expectedCount {
336 t.Errorf("%s: Expected %d bazel target, got %d", testCase.description, expectedCount, actualCount)
337 } else {
338 for i, target := range bazelTargets {
339 if w, g := testCase.expectedBazelTargets[i], target.content; w != g {
340 t.Errorf(
341 "%s: Expected generated Bazel target to be '%s', got '%s'",
342 testCase.description,
343 w,
344 g,
345 )
346 }
347 }
348 }
349 }
350}