blob: ee4de6ee8177df0d14e93966ed573174c9bf3c04 [file] [log] [blame]
Colin Cross33b2fb72019-05-14 14:07:01 -07001// Copyright 2019 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 cc
16
17import (
Martin Stjernholm837ee1a2020-08-20 02:54:52 +010018 "path/filepath"
Colin Cross33b2fb72019-05-14 14:07:01 -070019 "testing"
20
21 "android/soong/android"
22
23 "github.com/google/blueprint"
24)
25
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -070026func testPrebuilt(t *testing.T, bp string, fs map[string][]byte, handlers ...configCustomizer) *android.TestContext {
Martin Stjernholmadeb0882020-04-01 23:02:57 +010027 config := TestConfig(buildDir, android.Android, nil, bp, fs)
Colin Crossae8600b2020-10-29 17:09:13 -070028 ctx := CreateTestContext(config)
Martin Stjernholmadeb0882020-04-01 23:02:57 +010029
30 // Enable androidmk support.
31 // * Register the singleton
32 // * Configure that we are inside make
33 // * Add CommonOS to ensure that androidmk processing works.
34 android.RegisterAndroidMkBuildComponents(ctx)
Jingwen Chencda22c92020-11-23 00:22:30 -050035 android.SetKatiEnabledForTests(config)
Martin Stjernholmadeb0882020-04-01 23:02:57 +010036
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -070037 for _, handler := range handlers {
38 handler(config)
39 }
40
Colin Crossae8600b2020-10-29 17:09:13 -070041 ctx.Register()
Martin Stjernholmadeb0882020-04-01 23:02:57 +010042 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
43 android.FailIfErrored(t, errs)
44 _, errs = ctx.PrepareBuildActions(config)
45 android.FailIfErrored(t, errs)
46 return ctx
47}
48
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -070049type configCustomizer func(config android.Config)
50
Colin Cross33b2fb72019-05-14 14:07:01 -070051func TestPrebuilt(t *testing.T) {
52 bp := `
53 cc_library {
54 name: "liba",
55 }
56
57 cc_prebuilt_library_shared {
58 name: "liba",
59 srcs: ["liba.so"],
60 }
61
62 cc_library {
63 name: "libb",
64 }
65
66 cc_prebuilt_library_static {
67 name: "libb",
68 srcs: ["libb.a"],
69 }
70
71 cc_library_shared {
72 name: "libd",
73 }
74
75 cc_prebuilt_library_shared {
76 name: "libd",
77 srcs: ["libd.so"],
78 }
79
80 cc_library_static {
81 name: "libe",
82 }
83
84 cc_prebuilt_library_static {
85 name: "libe",
86 srcs: ["libe.a"],
87 }
Paul Duffinbce90da2020-03-12 20:17:14 +000088
89 cc_library {
90 name: "libf",
91 }
92
93 cc_prebuilt_library {
94 name: "libf",
95 static: {
96 srcs: ["libf.a"],
97 },
98 shared: {
99 srcs: ["libf.so"],
100 },
101 }
Martin Stjernholm0b92ac82020-03-11 21:45:49 +0000102
103 cc_object {
104 name: "crtx",
105 }
106
107 cc_prebuilt_object {
108 name: "crtx",
109 srcs: ["crtx.o"],
110 }
Colin Cross33b2fb72019-05-14 14:07:01 -0700111 `
112
Martin Stjernholmadeb0882020-04-01 23:02:57 +0100113 ctx := testPrebuilt(t, bp, map[string][]byte{
114 "liba.so": nil,
115 "libb.a": nil,
116 "libd.so": nil,
117 "libe.a": nil,
118 "libf.a": nil,
119 "libf.so": nil,
120 "crtx.o": nil,
121 })
Colin Cross33b2fb72019-05-14 14:07:01 -0700122
123 // Verify that all the modules exist and that their dependencies were connected correctly
Colin Cross7113d202019-11-20 16:39:12 -0800124 liba := ctx.ModuleForTests("liba", "android_arm64_armv8-a_shared").Module()
125 libb := ctx.ModuleForTests("libb", "android_arm64_armv8-a_static").Module()
126 libd := ctx.ModuleForTests("libd", "android_arm64_armv8-a_shared").Module()
127 libe := ctx.ModuleForTests("libe", "android_arm64_armv8-a_static").Module()
Paul Duffinbce90da2020-03-12 20:17:14 +0000128 libfStatic := ctx.ModuleForTests("libf", "android_arm64_armv8-a_static").Module()
129 libfShared := ctx.ModuleForTests("libf", "android_arm64_armv8-a_shared").Module()
Martin Stjernholm0b92ac82020-03-11 21:45:49 +0000130 crtx := ctx.ModuleForTests("crtx", "android_arm64_armv8-a").Module()
Colin Cross33b2fb72019-05-14 14:07:01 -0700131
Colin Cross7113d202019-11-20 16:39:12 -0800132 prebuiltLiba := ctx.ModuleForTests("prebuilt_liba", "android_arm64_armv8-a_shared").Module()
133 prebuiltLibb := ctx.ModuleForTests("prebuilt_libb", "android_arm64_armv8-a_static").Module()
134 prebuiltLibd := ctx.ModuleForTests("prebuilt_libd", "android_arm64_armv8-a_shared").Module()
135 prebuiltLibe := ctx.ModuleForTests("prebuilt_libe", "android_arm64_armv8-a_static").Module()
Paul Duffinbce90da2020-03-12 20:17:14 +0000136 prebuiltLibfStatic := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_static").Module()
137 prebuiltLibfShared := ctx.ModuleForTests("prebuilt_libf", "android_arm64_armv8-a_shared").Module()
Martin Stjernholm0b92ac82020-03-11 21:45:49 +0000138 prebuiltCrtx := ctx.ModuleForTests("prebuilt_crtx", "android_arm64_armv8-a").Module()
Colin Cross33b2fb72019-05-14 14:07:01 -0700139
140 hasDep := func(m android.Module, wantDep android.Module) bool {
141 t.Helper()
142 var found bool
143 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
144 if dep == wantDep {
145 found = true
146 }
147 })
148 return found
149 }
150
151 if !hasDep(liba, prebuiltLiba) {
152 t.Errorf("liba missing dependency on prebuilt_liba")
153 }
154
155 if !hasDep(libb, prebuiltLibb) {
156 t.Errorf("libb missing dependency on prebuilt_libb")
157 }
158
159 if !hasDep(libd, prebuiltLibd) {
160 t.Errorf("libd missing dependency on prebuilt_libd")
161 }
162
163 if !hasDep(libe, prebuiltLibe) {
164 t.Errorf("libe missing dependency on prebuilt_libe")
165 }
Paul Duffinbce90da2020-03-12 20:17:14 +0000166
167 if !hasDep(libfStatic, prebuiltLibfStatic) {
168 t.Errorf("libf static missing dependency on prebuilt_libf")
169 }
170
171 if !hasDep(libfShared, prebuiltLibfShared) {
172 t.Errorf("libf shared missing dependency on prebuilt_libf")
173 }
Martin Stjernholm0b92ac82020-03-11 21:45:49 +0000174
175 if !hasDep(crtx, prebuiltCrtx) {
176 t.Errorf("crtx missing dependency on prebuilt_crtx")
177 }
Paul Duffinbce90da2020-03-12 20:17:14 +0000178}
179
Paul Duffinbce90da2020-03-12 20:17:14 +0000180func TestPrebuiltLibraryShared(t *testing.T) {
181 ctx := testPrebuilt(t, `
182 cc_prebuilt_library_shared {
183 name: "libtest",
184 srcs: ["libf.so"],
185 strip: {
186 none: true,
187 },
188 }
Martin Stjernholmadeb0882020-04-01 23:02:57 +0100189 `, map[string][]byte{
190 "libf.so": nil,
191 })
Paul Duffinbce90da2020-03-12 20:17:14 +0000192
193 shared := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared").Module().(*Module)
Yo Chianga3ad9b22020-03-18 14:19:07 +0800194 assertString(t, shared.OutputFile().Path().Base(), "libtest.so")
Paul Duffinbce90da2020-03-12 20:17:14 +0000195}
196
197func TestPrebuiltLibraryStatic(t *testing.T) {
198 ctx := testPrebuilt(t, `
199 cc_prebuilt_library_static {
200 name: "libtest",
201 srcs: ["libf.a"],
202 }
Martin Stjernholmadeb0882020-04-01 23:02:57 +0100203 `, map[string][]byte{
204 "libf.a": nil,
205 })
Paul Duffinbce90da2020-03-12 20:17:14 +0000206
207 static := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static").Module().(*Module)
Yo Chianga3ad9b22020-03-18 14:19:07 +0800208 assertString(t, static.OutputFile().Path().Base(), "libf.a")
Paul Duffinbce90da2020-03-12 20:17:14 +0000209}
210
211func TestPrebuiltLibrary(t *testing.T) {
212 ctx := testPrebuilt(t, `
213 cc_prebuilt_library {
214 name: "libtest",
215 static: {
216 srcs: ["libf.a"],
217 },
218 shared: {
219 srcs: ["libf.so"],
220 },
221 strip: {
222 none: true,
223 },
224 }
Martin Stjernholmadeb0882020-04-01 23:02:57 +0100225 `, map[string][]byte{
226 "libf.a": nil,
227 "libf.so": nil,
228 })
Paul Duffinbce90da2020-03-12 20:17:14 +0000229
230 shared := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared").Module().(*Module)
Yo Chianga3ad9b22020-03-18 14:19:07 +0800231 assertString(t, shared.OutputFile().Path().Base(), "libtest.so")
Paul Duffinbce90da2020-03-12 20:17:14 +0000232
233 static := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static").Module().(*Module)
Yo Chianga3ad9b22020-03-18 14:19:07 +0800234 assertString(t, static.OutputFile().Path().Base(), "libf.a")
235}
236
237func TestPrebuiltLibraryStem(t *testing.T) {
238 ctx := testPrebuilt(t, `
239 cc_prebuilt_library {
240 name: "libfoo",
241 stem: "libbar",
242 static: {
243 srcs: ["libfoo.a"],
244 },
245 shared: {
246 srcs: ["libfoo.so"],
247 },
248 strip: {
249 none: true,
250 },
251 }
252 `, map[string][]byte{
253 "libfoo.a": nil,
254 "libfoo.so": nil,
255 })
256
257 static := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*Module)
258 assertString(t, static.OutputFile().Path().Base(), "libfoo.a")
259
260 shared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*Module)
261 assertString(t, shared.OutputFile().Path().Base(), "libbar.so")
262}
263
264func TestPrebuiltLibrarySharedStem(t *testing.T) {
265 ctx := testPrebuilt(t, `
266 cc_prebuilt_library_shared {
267 name: "libfoo",
268 stem: "libbar",
269 srcs: ["libfoo.so"],
270 strip: {
271 none: true,
272 },
273 }
274 `, map[string][]byte{
275 "libfoo.so": nil,
276 })
277
278 shared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*Module)
279 assertString(t, shared.OutputFile().Path().Base(), "libbar.so")
Colin Cross33b2fb72019-05-14 14:07:01 -0700280}
Martin Stjernholm837ee1a2020-08-20 02:54:52 +0100281
282func TestPrebuiltSymlinkedHostBinary(t *testing.T) {
Martin Stjernholm6a9a1462020-09-15 02:56:19 +0100283 if android.BuildOs != android.Linux {
284 t.Skipf("Skipping host prebuilt testing that is only supported on %s not %s", android.Linux, android.BuildOs)
285 }
286
Martin Stjernholm837ee1a2020-08-20 02:54:52 +0100287 ctx := testPrebuilt(t, `
288 cc_prebuilt_library_shared {
289 name: "libfoo",
290 device_supported: false,
291 host_supported: true,
292 target: {
293 linux_glibc_x86_64: {
294 srcs: ["linux_glibc_x86_64/lib64/libfoo.so"],
295 },
296 },
297 }
298
299 cc_prebuilt_binary {
300 name: "foo",
301 device_supported: false,
302 host_supported: true,
303 shared_libs: ["libfoo"],
304 target: {
305 linux_glibc_x86_64: {
306 srcs: ["linux_glibc_x86_64/bin/foo"],
307 },
308 },
309 }
310 `, map[string][]byte{
311 "libfoo.so": nil,
312 "foo": nil,
313 })
314
315 fooRule := ctx.ModuleForTests("foo", "linux_glibc_x86_64").Rule("Symlink")
316 assertString(t, fooRule.Output.String(),
317 filepath.Join(buildDir, ".intermediates/foo/linux_glibc_x86_64/foo"))
318 assertString(t, fooRule.Args["fromPath"], "$$PWD/linux_glibc_x86_64/bin/foo")
319
320 var libfooDep android.Path
321 for _, dep := range fooRule.Implicits {
322 if dep.Base() == "libfoo.so" {
323 libfooDep = dep
324 break
325 }
326 }
327 assertString(t, libfooDep.String(),
328 filepath.Join(buildDir, ".intermediates/libfoo/linux_glibc_x86_64_shared/libfoo.so"))
329}
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -0700330
331func TestPrebuiltLibrarySanitized(t *testing.T) {
332 bp := `cc_prebuilt_library {
333 name: "libtest",
334 static: {
335 sanitized: { none: { srcs: ["libf.a"], }, hwaddress: { srcs: ["libf.hwasan.a"], }, },
336 },
337 shared: {
338 sanitized: { none: { srcs: ["libf.so"], }, hwaddress: { srcs: ["hwasan/libf.so"], }, },
339 },
340 }
341 cc_prebuilt_library_static {
342 name: "libtest_static",
343 sanitized: { none: { srcs: ["libf.a"], }, hwaddress: { srcs: ["libf.hwasan.a"], }, },
344 }
345 cc_prebuilt_library_shared {
346 name: "libtest_shared",
347 sanitized: { none: { srcs: ["libf.so"], }, hwaddress: { srcs: ["hwasan/libf.so"], }, },
348 }`
349
350 fs := map[string][]byte{
351 "libf.a": nil,
352 "libf.hwasan.a": nil,
353 "libf.so": nil,
354 "hwasan/libf.so": nil,
355 }
356
357 // Without SANITIZE_TARGET.
358 ctx := testPrebuilt(t, bp, fs)
359
360 shared_rule := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared").Rule("android/soong/cc.strip")
361 assertString(t, shared_rule.Input.String(), "libf.so")
362
363 static := ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static").Module().(*Module)
364 assertString(t, static.OutputFile().Path().Base(), "libf.a")
365
366 shared_rule2 := ctx.ModuleForTests("libtest_shared", "android_arm64_armv8-a_shared").Rule("android/soong/cc.strip")
367 assertString(t, shared_rule2.Input.String(), "libf.so")
368
369 static2 := ctx.ModuleForTests("libtest_static", "android_arm64_armv8-a_static").Module().(*Module)
370 assertString(t, static2.OutputFile().Path().Base(), "libf.a")
371
372 // With SANITIZE_TARGET=hwaddress
373 ctx = testPrebuilt(t, bp, fs, func(config android.Config) {
374 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
375 })
376
377 shared_rule = ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip")
378 assertString(t, shared_rule.Input.String(), "hwasan/libf.so")
379
380 static = ctx.ModuleForTests("libtest", "android_arm64_armv8-a_static_hwasan").Module().(*Module)
381 assertString(t, static.OutputFile().Path().Base(), "libf.hwasan.a")
382
383 shared_rule2 = ctx.ModuleForTests("libtest_shared", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip")
384 assertString(t, shared_rule2.Input.String(), "hwasan/libf.so")
385
386 static2 = ctx.ModuleForTests("libtest_static", "android_arm64_armv8-a_static_hwasan").Module().(*Module)
387 assertString(t, static2.OutputFile().Path().Base(), "libf.hwasan.a")
388}