blob: 38a5c2d6dd1f73b318b8d2168abf851bfe7933ee [file] [log] [blame]
Colin Crossd00350c2017-11-17 10:55:38 -08001// Copyright 2017 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
Colin Cross74d1ec02015-04-28 13:30:13 -070015package cc
16
17import (
Jeff Gaston294356f2017-09-27 17:05:30 -070018 "fmt"
Jiyong Park6a43f042017-10-12 23:05:00 +090019 "io/ioutil"
20 "os"
Inseob Kim1f086e22019-05-09 13:29:15 +090021 "path/filepath"
Colin Cross74d1ec02015-04-28 13:30:13 -070022 "reflect"
Jeff Gaston294356f2017-09-27 17:05:30 -070023 "sort"
24 "strings"
Colin Cross74d1ec02015-04-28 13:30:13 -070025 "testing"
Colin Crosse1bb5d02019-09-24 14:55:04 -070026
27 "android/soong/android"
Colin Cross74d1ec02015-04-28 13:30:13 -070028)
29
Jiyong Park6a43f042017-10-12 23:05:00 +090030var buildDir string
31
32func setUp() {
33 var err error
34 buildDir, err = ioutil.TempDir("", "soong_cc_test")
35 if err != nil {
36 panic(err)
37 }
38}
39
40func tearDown() {
41 os.RemoveAll(buildDir)
42}
43
44func TestMain(m *testing.M) {
45 run := func() int {
46 setUp()
47 defer tearDown()
48
49 return m.Run()
50 }
51
52 os.Exit(run())
53}
54
Colin Cross98be1bb2019-12-13 20:41:13 -080055func testCcWithConfig(t *testing.T, config android.Config) *android.TestContext {
Colin Crosse1bb5d02019-09-24 14:55:04 -070056 t.Helper()
Colin Cross98be1bb2019-12-13 20:41:13 -080057 ctx := CreateTestContext()
58 ctx.Register(config)
Logan Chienf3511742017-10-31 18:04:35 +080059
Jeff Gastond3e141d2017-08-08 17:46:01 -070060 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
Logan Chien42039712018-03-12 16:29:17 +080061 android.FailIfErrored(t, errs)
Jiyong Park6a43f042017-10-12 23:05:00 +090062 _, errs = ctx.PrepareBuildActions(config)
Logan Chien42039712018-03-12 16:29:17 +080063 android.FailIfErrored(t, errs)
Jiyong Park6a43f042017-10-12 23:05:00 +090064
65 return ctx
66}
67
Logan Chienf3511742017-10-31 18:04:35 +080068func testCc(t *testing.T, bp string) *android.TestContext {
Logan Chiend3c59a22018-03-29 14:08:15 +080069 t.Helper()
Colin Cross98be1bb2019-12-13 20:41:13 -080070 config := TestConfig(buildDir, android.Android, nil, bp, nil)
Dan Willemsen674dc7f2018-03-12 18:06:05 -070071 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
72 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
Logan Chienf3511742017-10-31 18:04:35 +080073
Colin Cross98be1bb2019-12-13 20:41:13 -080074 return testCcWithConfig(t, config)
Logan Chienf3511742017-10-31 18:04:35 +080075}
76
77func testCcNoVndk(t *testing.T, bp string) *android.TestContext {
Logan Chiend3c59a22018-03-29 14:08:15 +080078 t.Helper()
Colin Cross98be1bb2019-12-13 20:41:13 -080079 config := TestConfig(buildDir, android.Android, nil, bp, nil)
Dan Willemsen674dc7f2018-03-12 18:06:05 -070080 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
Logan Chienf3511742017-10-31 18:04:35 +080081
Colin Cross98be1bb2019-12-13 20:41:13 -080082 return testCcWithConfig(t, config)
Logan Chienf3511742017-10-31 18:04:35 +080083}
84
Justin Yun5f7f7e82019-11-18 19:52:14 +090085func testCcErrorWithConfig(t *testing.T, pattern string, config android.Config) {
Logan Chiend3c59a22018-03-29 14:08:15 +080086 t.Helper()
Logan Chienf3511742017-10-31 18:04:35 +080087
Colin Cross98be1bb2019-12-13 20:41:13 -080088 ctx := CreateTestContext()
89 ctx.Register(config)
Logan Chienf3511742017-10-31 18:04:35 +080090
91 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
92 if len(errs) > 0 {
Logan Chienee97c3e2018-03-12 16:34:26 +080093 android.FailIfNoMatchingErrors(t, pattern, errs)
Logan Chienf3511742017-10-31 18:04:35 +080094 return
95 }
96
97 _, errs = ctx.PrepareBuildActions(config)
98 if len(errs) > 0 {
Logan Chienee97c3e2018-03-12 16:34:26 +080099 android.FailIfNoMatchingErrors(t, pattern, errs)
Logan Chienf3511742017-10-31 18:04:35 +0800100 return
101 }
102
103 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
104}
105
Justin Yun5f7f7e82019-11-18 19:52:14 +0900106func testCcError(t *testing.T, pattern string, bp string) {
107 config := TestConfig(buildDir, android.Android, nil, bp, nil)
108 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
109 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
110 testCcErrorWithConfig(t, pattern, config)
111 return
112}
113
114func testCcErrorProductVndk(t *testing.T, pattern string, bp string) {
115 config := TestConfig(buildDir, android.Android, nil, bp, nil)
116 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
117 config.TestProductVariables.ProductVndkVersion = StringPtr("current")
118 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
119 testCcErrorWithConfig(t, pattern, config)
120 return
121}
122
Logan Chienf3511742017-10-31 18:04:35 +0800123const (
Colin Cross7113d202019-11-20 16:39:12 -0800124 coreVariant = "android_arm64_armv8-a_shared"
Colin Crossfb0c16e2019-11-20 17:12:35 -0800125 vendorVariant = "android_vendor.VER_arm64_armv8-a_shared"
Justin Yun5f7f7e82019-11-18 19:52:14 +0900126 productVariant = "android_product.VER_arm64_armv8-a_shared"
Colin Crossfb0c16e2019-11-20 17:12:35 -0800127 recoveryVariant = "android_recovery_arm64_armv8-a_shared"
Logan Chienf3511742017-10-31 18:04:35 +0800128)
129
Doug Hornc32c6b02019-01-17 14:44:05 -0800130func TestFuchsiaDeps(t *testing.T) {
131 t.Helper()
132
133 bp := `
134 cc_library {
135 name: "libTest",
136 srcs: ["foo.c"],
137 target: {
138 fuchsia: {
139 srcs: ["bar.c"],
140 },
141 },
142 }`
143
Colin Cross98be1bb2019-12-13 20:41:13 -0800144 config := TestConfig(buildDir, android.Fuchsia, nil, bp, nil)
145 ctx := testCcWithConfig(t, config)
Doug Hornc32c6b02019-01-17 14:44:05 -0800146
147 rt := false
148 fb := false
149
150 ld := ctx.ModuleForTests("libTest", "fuchsia_arm64_shared").Rule("ld")
151 implicits := ld.Implicits
152 for _, lib := range implicits {
153 if strings.Contains(lib.Rel(), "libcompiler_rt") {
154 rt = true
155 }
156
157 if strings.Contains(lib.Rel(), "libbioniccompat") {
158 fb = true
159 }
160 }
161
162 if !rt || !fb {
163 t.Errorf("fuchsia libs must link libcompiler_rt and libbioniccompat")
164 }
165}
166
167func TestFuchsiaTargetDecl(t *testing.T) {
168 t.Helper()
169
170 bp := `
171 cc_library {
172 name: "libTest",
173 srcs: ["foo.c"],
174 target: {
175 fuchsia: {
176 srcs: ["bar.c"],
177 },
178 },
179 }`
180
Colin Cross98be1bb2019-12-13 20:41:13 -0800181 config := TestConfig(buildDir, android.Fuchsia, nil, bp, nil)
182 ctx := testCcWithConfig(t, config)
Doug Hornc32c6b02019-01-17 14:44:05 -0800183 ld := ctx.ModuleForTests("libTest", "fuchsia_arm64_shared").Rule("ld")
184 var objs []string
185 for _, o := range ld.Inputs {
186 objs = append(objs, o.Base())
187 }
188 if len(objs) != 2 || objs[0] != "foo.o" || objs[1] != "bar.o" {
189 t.Errorf("inputs of libTest must be []string{\"foo.o\", \"bar.o\"}, but was %#v.", objs)
190 }
191}
192
Jiyong Park6a43f042017-10-12 23:05:00 +0900193func TestVendorSrc(t *testing.T) {
194 ctx := testCc(t, `
195 cc_library {
196 name: "libTest",
197 srcs: ["foo.c"],
Yi Konge7fe9912019-06-02 00:53:50 -0700198 no_libcrt: true,
Logan Chienf3511742017-10-31 18:04:35 +0800199 nocrt: true,
200 system_shared_libs: [],
Jiyong Park6a43f042017-10-12 23:05:00 +0900201 vendor_available: true,
202 target: {
203 vendor: {
204 srcs: ["bar.c"],
205 },
206 },
207 }
Jiyong Park6a43f042017-10-12 23:05:00 +0900208 `)
209
Logan Chienf3511742017-10-31 18:04:35 +0800210 ld := ctx.ModuleForTests("libTest", vendorVariant).Rule("ld")
Jiyong Park6a43f042017-10-12 23:05:00 +0900211 var objs []string
212 for _, o := range ld.Inputs {
213 objs = append(objs, o.Base())
214 }
Colin Cross95d33fe2018-01-03 13:40:46 -0800215 if len(objs) != 2 || objs[0] != "foo.o" || objs[1] != "bar.o" {
Jiyong Park6a43f042017-10-12 23:05:00 +0900216 t.Errorf("inputs of libTest must be []string{\"foo.o\", \"bar.o\"}, but was %#v.", objs)
217 }
218}
219
Logan Chienf3511742017-10-31 18:04:35 +0800220func checkVndkModule(t *testing.T, ctx *android.TestContext, name, subDir string,
Justin Yun0ecf0b22020-02-28 15:07:59 +0900221 isVndkSp bool, extends string, variant string) {
Logan Chienf3511742017-10-31 18:04:35 +0800222
Logan Chiend3c59a22018-03-29 14:08:15 +0800223 t.Helper()
224
Justin Yun0ecf0b22020-02-28 15:07:59 +0900225 mod := ctx.ModuleForTests(name, variant).Module().(*Module)
Ivan Lozano52767be2019-10-18 14:49:46 -0700226 if !mod.HasVendorVariant() {
Justin Yun0ecf0b22020-02-28 15:07:59 +0900227 t.Errorf("%q must have variant %q", name, variant)
Logan Chienf3511742017-10-31 18:04:35 +0800228 }
229
230 // Check library properties.
231 lib, ok := mod.compiler.(*libraryDecorator)
232 if !ok {
233 t.Errorf("%q must have libraryDecorator", name)
234 } else if lib.baseInstaller.subDir != subDir {
235 t.Errorf("%q must use %q as subdir but it is using %q", name, subDir,
236 lib.baseInstaller.subDir)
237 }
238
239 // Check VNDK properties.
240 if mod.vndkdep == nil {
241 t.Fatalf("%q must have `vndkdep`", name)
242 }
Ivan Lozano52767be2019-10-18 14:49:46 -0700243 if !mod.IsVndk() {
244 t.Errorf("%q IsVndk() must equal to true", name)
Logan Chienf3511742017-10-31 18:04:35 +0800245 }
246 if mod.isVndkSp() != isVndkSp {
247 t.Errorf("%q isVndkSp() must equal to %t", name, isVndkSp)
248 }
249
250 // Check VNDK extension properties.
251 isVndkExt := extends != ""
252 if mod.isVndkExt() != isVndkExt {
253 t.Errorf("%q isVndkExt() must equal to %t", name, isVndkExt)
254 }
255
256 if actualExtends := mod.getVndkExtendsModuleName(); actualExtends != extends {
257 t.Errorf("%q must extend from %q but get %q", name, extends, actualExtends)
258 }
259}
260
Inseob Kim7f283f42020-06-01 21:53:49 +0900261func checkSnapshot(t *testing.T, ctx *android.TestContext, singleton android.TestingSingleton, moduleName, snapshotFilename, subDir, variant string) {
Jooyung Han39edb6c2019-11-06 16:53:07 +0900262 mod, ok := ctx.ModuleForTests(moduleName, variant).Module().(android.OutputFileProducer)
263 if !ok {
264 t.Errorf("%q must have output\n", moduleName)
Inseob Kim1f086e22019-05-09 13:29:15 +0900265 return
266 }
Jooyung Han39edb6c2019-11-06 16:53:07 +0900267 outputFiles, err := mod.OutputFiles("")
268 if err != nil || len(outputFiles) != 1 {
269 t.Errorf("%q must have single output\n", moduleName)
270 return
271 }
272 snapshotPath := filepath.Join(subDir, snapshotFilename)
Inseob Kim1f086e22019-05-09 13:29:15 +0900273
Inseob Kim7f283f42020-06-01 21:53:49 +0900274 out := singleton.Output(snapshotPath)
Jooyung Han39edb6c2019-11-06 16:53:07 +0900275 if out.Input.String() != outputFiles[0].String() {
Inseob Kim8471cda2019-11-15 09:59:12 +0900276 t.Errorf("The input of snapshot %q must be %q, but %q", moduleName, out.Input.String(), outputFiles[0])
Inseob Kim1f086e22019-05-09 13:29:15 +0900277 }
278}
279
Jooyung Han2216fb12019-11-06 16:46:15 +0900280func checkWriteFileOutput(t *testing.T, params android.TestingBuildParams, expected []string) {
281 t.Helper()
282 assertString(t, params.Rule.String(), android.WriteFile.String())
283 actual := strings.FieldsFunc(strings.ReplaceAll(params.Args["content"], "\\n", "\n"), func(r rune) bool { return r == '\n' })
284 assertArrayString(t, actual, expected)
285}
286
Jooyung Han097087b2019-10-22 19:32:18 +0900287func checkVndkOutput(t *testing.T, ctx *android.TestContext, output string, expected []string) {
288 t.Helper()
289 vndkSnapshot := ctx.SingletonForTests("vndk-snapshot")
Jooyung Han2216fb12019-11-06 16:46:15 +0900290 checkWriteFileOutput(t, vndkSnapshot.Output(output), expected)
291}
292
293func checkVndkLibrariesOutput(t *testing.T, ctx *android.TestContext, module string, expected []string) {
294 t.Helper()
295 vndkLibraries := ctx.ModuleForTests(module, "")
Kiyoung Kime1aa8ea2019-12-30 11:12:55 +0900296
297 var output string
298 if module != "vndkcorevariant.libraries.txt" {
299 output = insertVndkVersion(module, "VER")
300 } else {
301 output = module
302 }
303
Jooyung Han2216fb12019-11-06 16:46:15 +0900304 checkWriteFileOutput(t, vndkLibraries.Output(output), expected)
Jooyung Han097087b2019-10-22 19:32:18 +0900305}
306
Logan Chienf3511742017-10-31 18:04:35 +0800307func TestVndk(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800308 bp := `
Logan Chienf3511742017-10-31 18:04:35 +0800309 cc_library {
310 name: "libvndk",
311 vendor_available: true,
312 vndk: {
313 enabled: true,
314 },
315 nocrt: true,
316 }
317
318 cc_library {
319 name: "libvndk_private",
320 vendor_available: false,
321 vndk: {
322 enabled: true,
323 },
324 nocrt: true,
Jooyung Han0302a842019-10-30 18:43:49 +0900325 stem: "libvndk-private",
Logan Chienf3511742017-10-31 18:04:35 +0800326 }
327
328 cc_library {
329 name: "libvndk_sp",
330 vendor_available: true,
331 vndk: {
332 enabled: true,
333 support_system_process: true,
334 },
335 nocrt: true,
Jooyung Han0302a842019-10-30 18:43:49 +0900336 suffix: "-x",
Logan Chienf3511742017-10-31 18:04:35 +0800337 }
338
339 cc_library {
340 name: "libvndk_sp_private",
341 vendor_available: false,
342 vndk: {
343 enabled: true,
344 support_system_process: true,
345 },
346 nocrt: true,
Jooyung Han0302a842019-10-30 18:43:49 +0900347 target: {
348 vendor: {
349 suffix: "-x",
350 },
351 },
Logan Chienf3511742017-10-31 18:04:35 +0800352 }
Jooyung Han2216fb12019-11-06 16:46:15 +0900353 vndk_libraries_txt {
354 name: "llndk.libraries.txt",
355 }
356 vndk_libraries_txt {
357 name: "vndkcore.libraries.txt",
358 }
359 vndk_libraries_txt {
360 name: "vndksp.libraries.txt",
361 }
362 vndk_libraries_txt {
363 name: "vndkprivate.libraries.txt",
364 }
365 vndk_libraries_txt {
366 name: "vndkcorevariant.libraries.txt",
367 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800368 `
369
370 config := TestConfig(buildDir, android.Android, nil, bp, nil)
371 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
372 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
373
374 ctx := testCcWithConfig(t, config)
Logan Chienf3511742017-10-31 18:04:35 +0800375
Justin Yun0ecf0b22020-02-28 15:07:59 +0900376 checkVndkModule(t, ctx, "libvndk", "vndk-VER", false, "", vendorVariant)
377 checkVndkModule(t, ctx, "libvndk_private", "vndk-VER", false, "", vendorVariant)
378 checkVndkModule(t, ctx, "libvndk_sp", "vndk-sp-VER", true, "", vendorVariant)
379 checkVndkModule(t, ctx, "libvndk_sp_private", "vndk-sp-VER", true, "", vendorVariant)
Inseob Kim1f086e22019-05-09 13:29:15 +0900380
381 // Check VNDK snapshot output.
382
383 snapshotDir := "vndk-snapshot"
384 snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64")
385
386 vndkLibPath := filepath.Join(snapshotVariantPath, fmt.Sprintf("arch-%s-%s",
387 "arm64", "armv8-a"))
388 vndkLib2ndPath := filepath.Join(snapshotVariantPath, fmt.Sprintf("arch-%s-%s",
389 "arm", "armv7-a-neon"))
390
391 vndkCoreLibPath := filepath.Join(vndkLibPath, "shared", "vndk-core")
392 vndkSpLibPath := filepath.Join(vndkLibPath, "shared", "vndk-sp")
393 vndkCoreLib2ndPath := filepath.Join(vndkLib2ndPath, "shared", "vndk-core")
394 vndkSpLib2ndPath := filepath.Join(vndkLib2ndPath, "shared", "vndk-sp")
395
Colin Crossfb0c16e2019-11-20 17:12:35 -0800396 variant := "android_vendor.VER_arm64_armv8-a_shared"
397 variant2nd := "android_vendor.VER_arm_armv7-a-neon_shared"
Inseob Kim1f086e22019-05-09 13:29:15 +0900398
Inseob Kim7f283f42020-06-01 21:53:49 +0900399 snapshotSingleton := ctx.SingletonForTests("vndk-snapshot")
400
401 checkSnapshot(t, ctx, snapshotSingleton, "libvndk", "libvndk.so", vndkCoreLibPath, variant)
402 checkSnapshot(t, ctx, snapshotSingleton, "libvndk", "libvndk.so", vndkCoreLib2ndPath, variant2nd)
403 checkSnapshot(t, ctx, snapshotSingleton, "libvndk_sp", "libvndk_sp-x.so", vndkSpLibPath, variant)
404 checkSnapshot(t, ctx, snapshotSingleton, "libvndk_sp", "libvndk_sp-x.so", vndkSpLib2ndPath, variant2nd)
Jooyung Han097087b2019-10-22 19:32:18 +0900405
Jooyung Han39edb6c2019-11-06 16:53:07 +0900406 snapshotConfigsPath := filepath.Join(snapshotVariantPath, "configs")
Inseob Kim7f283f42020-06-01 21:53:49 +0900407 checkSnapshot(t, ctx, snapshotSingleton, "llndk.libraries.txt", "llndk.libraries.txt", snapshotConfigsPath, "")
408 checkSnapshot(t, ctx, snapshotSingleton, "vndkcore.libraries.txt", "vndkcore.libraries.txt", snapshotConfigsPath, "")
409 checkSnapshot(t, ctx, snapshotSingleton, "vndksp.libraries.txt", "vndksp.libraries.txt", snapshotConfigsPath, "")
410 checkSnapshot(t, ctx, snapshotSingleton, "vndkprivate.libraries.txt", "vndkprivate.libraries.txt", snapshotConfigsPath, "")
Jooyung Han39edb6c2019-11-06 16:53:07 +0900411
Jooyung Han097087b2019-10-22 19:32:18 +0900412 checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{
413 "LLNDK: libc.so",
414 "LLNDK: libdl.so",
415 "LLNDK: libft2.so",
416 "LLNDK: libm.so",
417 "VNDK-SP: libc++.so",
Jooyung Han0302a842019-10-30 18:43:49 +0900418 "VNDK-SP: libvndk_sp-x.so",
419 "VNDK-SP: libvndk_sp_private-x.so",
420 "VNDK-core: libvndk-private.so",
Jooyung Han097087b2019-10-22 19:32:18 +0900421 "VNDK-core: libvndk.so",
Jooyung Han097087b2019-10-22 19:32:18 +0900422 "VNDK-private: libft2.so",
Jooyung Han0302a842019-10-30 18:43:49 +0900423 "VNDK-private: libvndk-private.so",
424 "VNDK-private: libvndk_sp_private-x.so",
Jooyung Han097087b2019-10-22 19:32:18 +0900425 })
Jooyung Han2216fb12019-11-06 16:46:15 +0900426 checkVndkLibrariesOutput(t, ctx, "llndk.libraries.txt", []string{"libc.so", "libdl.so", "libft2.so", "libm.so"})
427 checkVndkLibrariesOutput(t, ctx, "vndkcore.libraries.txt", []string{"libvndk-private.so", "libvndk.so"})
428 checkVndkLibrariesOutput(t, ctx, "vndkprivate.libraries.txt", []string{"libft2.so", "libvndk-private.so", "libvndk_sp_private-x.so"})
429 checkVndkLibrariesOutput(t, ctx, "vndksp.libraries.txt", []string{"libc++.so", "libvndk_sp-x.so", "libvndk_sp_private-x.so"})
430 checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", nil)
431}
432
Yo Chiangbba545e2020-06-09 16:15:37 +0800433func TestVndkWithHostSupported(t *testing.T) {
434 ctx := testCc(t, `
435 cc_library {
436 name: "libvndk_host_supported",
437 vendor_available: true,
438 vndk: {
439 enabled: true,
440 },
441 host_supported: true,
442 }
443
444 cc_library {
445 name: "libvndk_host_supported_but_disabled_on_device",
446 vendor_available: true,
447 vndk: {
448 enabled: true,
449 },
450 host_supported: true,
451 enabled: false,
452 target: {
453 host: {
454 enabled: true,
455 }
456 }
457 }
458
459 vndk_libraries_txt {
460 name: "vndkcore.libraries.txt",
461 }
462 `)
463
464 checkVndkLibrariesOutput(t, ctx, "vndkcore.libraries.txt", []string{"libvndk_host_supported.so"})
465}
466
Jooyung Han2216fb12019-11-06 16:46:15 +0900467func TestVndkLibrariesTxtAndroidMk(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800468 bp := `
Jooyung Han2216fb12019-11-06 16:46:15 +0900469 vndk_libraries_txt {
470 name: "llndk.libraries.txt",
Colin Cross98be1bb2019-12-13 20:41:13 -0800471 }`
472 config := TestConfig(buildDir, android.Android, nil, bp, nil)
473 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
474 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
475 ctx := testCcWithConfig(t, config)
Jooyung Han2216fb12019-11-06 16:46:15 +0900476
477 module := ctx.ModuleForTests("llndk.libraries.txt", "")
Jiyong Park0b0e1b92019-12-03 13:24:29 +0900478 entries := android.AndroidMkEntriesForTest(t, config, "", module.Module())[0]
Jooyung Han2216fb12019-11-06 16:46:15 +0900479 assertArrayString(t, entries.EntryMap["LOCAL_MODULE_STEM"], []string{"llndk.libraries.VER.txt"})
Jooyung Han097087b2019-10-22 19:32:18 +0900480}
481
482func TestVndkUsingCoreVariant(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800483 bp := `
Jooyung Han097087b2019-10-22 19:32:18 +0900484 cc_library {
485 name: "libvndk",
486 vendor_available: true,
487 vndk: {
488 enabled: true,
489 },
490 nocrt: true,
491 }
492
493 cc_library {
494 name: "libvndk_sp",
495 vendor_available: true,
496 vndk: {
497 enabled: true,
498 support_system_process: true,
499 },
500 nocrt: true,
501 }
502
503 cc_library {
504 name: "libvndk2",
505 vendor_available: false,
506 vndk: {
507 enabled: true,
508 },
509 nocrt: true,
510 }
Jooyung Han2216fb12019-11-06 16:46:15 +0900511
512 vndk_libraries_txt {
513 name: "vndkcorevariant.libraries.txt",
514 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800515 `
516
517 config := TestConfig(buildDir, android.Android, nil, bp, nil)
518 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
519 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
520 config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
521
522 setVndkMustUseVendorVariantListForTest(config, []string{"libvndk"})
523
524 ctx := testCcWithConfig(t, config)
Jooyung Han097087b2019-10-22 19:32:18 +0900525
Jooyung Han2216fb12019-11-06 16:46:15 +0900526 checkVndkLibrariesOutput(t, ctx, "vndkcorevariant.libraries.txt", []string{"libc++.so", "libvndk2.so", "libvndk_sp.so"})
Jooyung Han0302a842019-10-30 18:43:49 +0900527}
528
Chris Parsons79d66a52020-06-05 17:26:16 -0400529func TestDataLibs(t *testing.T) {
530 bp := `
531 cc_test_library {
532 name: "test_lib",
533 srcs: ["test_lib.cpp"],
534 gtest: false,
535 }
536
537 cc_test {
538 name: "main_test",
539 data_libs: ["test_lib"],
540 gtest: false,
541 }
Chris Parsons216e10a2020-07-09 17:12:52 -0400542 `
Chris Parsons79d66a52020-06-05 17:26:16 -0400543
544 config := TestConfig(buildDir, android.Android, nil, bp, nil)
545 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
546 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
547 config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
548
549 ctx := testCcWithConfig(t, config)
550 module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module()
551 testBinary := module.(*Module).linker.(*testBinary)
552 outputFiles, err := module.(android.OutputFileProducer).OutputFiles("")
553 if err != nil {
554 t.Errorf("Expected cc_test to produce output files, error: %s", err)
555 return
556 }
557 if len(outputFiles) != 1 {
558 t.Errorf("expected exactly one output file. output files: [%s]", outputFiles)
559 return
560 }
561 if len(testBinary.dataPaths()) != 1 {
562 t.Errorf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths())
563 return
564 }
565
566 outputPath := outputFiles[0].String()
Chris Parsons216e10a2020-07-09 17:12:52 -0400567 testBinaryPath := testBinary.dataPaths()[0].SrcPath.String()
Chris Parsons79d66a52020-06-05 17:26:16 -0400568
569 if !strings.HasSuffix(outputPath, "/main_test") {
570 t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
571 return
572 }
573 if !strings.HasSuffix(testBinaryPath, "/test_lib.so") {
574 t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", testBinaryPath)
575 return
576 }
577}
578
Chris Parsons216e10a2020-07-09 17:12:52 -0400579func TestDataLibsRelativeInstallPath(t *testing.T) {
580 bp := `
581 cc_test_library {
582 name: "test_lib",
583 srcs: ["test_lib.cpp"],
584 relative_install_path: "foo/bar/baz",
585 gtest: false,
586 }
587
588 cc_test {
589 name: "main_test",
590 data_libs: ["test_lib"],
591 gtest: false,
592 }
593 `
594
595 config := TestConfig(buildDir, android.Android, nil, bp, nil)
596 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
597 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
598 config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
599
600 ctx := testCcWithConfig(t, config)
601 module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module()
602 testBinary := module.(*Module).linker.(*testBinary)
603 outputFiles, err := module.(android.OutputFileProducer).OutputFiles("")
604 if err != nil {
605 t.Fatalf("Expected cc_test to produce output files, error: %s", err)
606 }
607 if len(outputFiles) != 1 {
608 t.Errorf("expected exactly one output file. output files: [%s]", outputFiles)
609 }
610 if len(testBinary.dataPaths()) != 1 {
611 t.Errorf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths())
612 }
613
614 outputPath := outputFiles[0].String()
Chris Parsons216e10a2020-07-09 17:12:52 -0400615
616 if !strings.HasSuffix(outputPath, "/main_test") {
617 t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
618 }
619 entries := android.AndroidMkEntriesForTest(t, config, "", module)[0]
620 if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") {
621 t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+
Chris Parsons1f6d90f2020-06-17 16:10:42 -0400622 " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0])
Chris Parsons216e10a2020-07-09 17:12:52 -0400623 }
624}
625
Jooyung Han0302a842019-10-30 18:43:49 +0900626func TestVndkWhenVndkVersionIsNotSet(t *testing.T) {
Jooyung Han2216fb12019-11-06 16:46:15 +0900627 ctx := testCcNoVndk(t, `
Jooyung Han0302a842019-10-30 18:43:49 +0900628 cc_library {
629 name: "libvndk",
630 vendor_available: true,
631 vndk: {
632 enabled: true,
633 },
634 nocrt: true,
635 }
Jooyung Han2216fb12019-11-06 16:46:15 +0900636 `)
Jooyung Han0302a842019-10-30 18:43:49 +0900637
638 checkVndkOutput(t, ctx, "vndk/vndk.libraries.txt", []string{
639 "LLNDK: libc.so",
640 "LLNDK: libdl.so",
641 "LLNDK: libft2.so",
642 "LLNDK: libm.so",
643 "VNDK-SP: libc++.so",
644 "VNDK-core: libvndk.so",
645 "VNDK-private: libft2.so",
646 })
Logan Chienf3511742017-10-31 18:04:35 +0800647}
648
Logan Chiend3c59a22018-03-29 14:08:15 +0800649func TestVndkDepError(t *testing.T) {
650 // Check whether an error is emitted when a VNDK lib depends on a system lib.
651 testCcError(t, "dependency \".*\" of \".*\" missing variant", `
652 cc_library {
653 name: "libvndk",
654 vendor_available: true,
655 vndk: {
656 enabled: true,
657 },
658 shared_libs: ["libfwk"], // Cause error
659 nocrt: true,
660 }
661
662 cc_library {
663 name: "libfwk",
664 nocrt: true,
665 }
666 `)
667
668 // Check whether an error is emitted when a VNDK lib depends on a vendor lib.
669 testCcError(t, "dependency \".*\" of \".*\" missing variant", `
670 cc_library {
671 name: "libvndk",
672 vendor_available: true,
673 vndk: {
674 enabled: true,
675 },
676 shared_libs: ["libvendor"], // Cause error
677 nocrt: true,
678 }
679
680 cc_library {
681 name: "libvendor",
682 vendor: true,
683 nocrt: true,
684 }
685 `)
686
687 // Check whether an error is emitted when a VNDK-SP lib depends on a system lib.
688 testCcError(t, "dependency \".*\" of \".*\" missing variant", `
689 cc_library {
690 name: "libvndk_sp",
691 vendor_available: true,
692 vndk: {
693 enabled: true,
694 support_system_process: true,
695 },
696 shared_libs: ["libfwk"], // Cause error
697 nocrt: true,
698 }
699
700 cc_library {
701 name: "libfwk",
702 nocrt: true,
703 }
704 `)
705
706 // Check whether an error is emitted when a VNDK-SP lib depends on a vendor lib.
707 testCcError(t, "dependency \".*\" of \".*\" missing variant", `
708 cc_library {
709 name: "libvndk_sp",
710 vendor_available: true,
711 vndk: {
712 enabled: true,
713 support_system_process: true,
714 },
715 shared_libs: ["libvendor"], // Cause error
716 nocrt: true,
717 }
718
719 cc_library {
720 name: "libvendor",
721 vendor: true,
722 nocrt: true,
723 }
724 `)
725
726 // Check whether an error is emitted when a VNDK-SP lib depends on a VNDK lib.
727 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
728 cc_library {
729 name: "libvndk_sp",
730 vendor_available: true,
731 vndk: {
732 enabled: true,
733 support_system_process: true,
734 },
735 shared_libs: ["libvndk"], // Cause error
736 nocrt: true,
737 }
738
739 cc_library {
740 name: "libvndk",
741 vendor_available: true,
742 vndk: {
743 enabled: true,
744 },
745 nocrt: true,
746 }
747 `)
Jooyung Hana70f0672019-01-18 15:20:43 +0900748
749 // Check whether an error is emitted when a VNDK lib depends on a non-VNDK lib.
750 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
751 cc_library {
752 name: "libvndk",
753 vendor_available: true,
754 vndk: {
755 enabled: true,
756 },
757 shared_libs: ["libnonvndk"],
758 nocrt: true,
759 }
760
761 cc_library {
762 name: "libnonvndk",
763 vendor_available: true,
764 nocrt: true,
765 }
766 `)
767
768 // Check whether an error is emitted when a VNDK-private lib depends on a non-VNDK lib.
769 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
770 cc_library {
771 name: "libvndkprivate",
772 vendor_available: false,
773 vndk: {
774 enabled: true,
775 },
776 shared_libs: ["libnonvndk"],
777 nocrt: true,
778 }
779
780 cc_library {
781 name: "libnonvndk",
782 vendor_available: true,
783 nocrt: true,
784 }
785 `)
786
787 // Check whether an error is emitted when a VNDK-sp lib depends on a non-VNDK lib.
788 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
789 cc_library {
790 name: "libvndksp",
791 vendor_available: true,
792 vndk: {
793 enabled: true,
794 support_system_process: true,
795 },
796 shared_libs: ["libnonvndk"],
797 nocrt: true,
798 }
799
800 cc_library {
801 name: "libnonvndk",
802 vendor_available: true,
803 nocrt: true,
804 }
805 `)
806
807 // Check whether an error is emitted when a VNDK-sp-private lib depends on a non-VNDK lib.
808 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
809 cc_library {
810 name: "libvndkspprivate",
811 vendor_available: false,
812 vndk: {
813 enabled: true,
814 support_system_process: true,
815 },
816 shared_libs: ["libnonvndk"],
817 nocrt: true,
818 }
819
820 cc_library {
821 name: "libnonvndk",
822 vendor_available: true,
823 nocrt: true,
824 }
825 `)
826}
827
828func TestDoubleLoadbleDep(t *testing.T) {
829 // okay to link : LLNDK -> double_loadable VNDK
830 testCc(t, `
831 cc_library {
832 name: "libllndk",
833 shared_libs: ["libdoubleloadable"],
834 }
835
836 llndk_library {
837 name: "libllndk",
838 symbol_file: "",
839 }
840
841 cc_library {
842 name: "libdoubleloadable",
843 vendor_available: true,
844 vndk: {
845 enabled: true,
846 },
847 double_loadable: true,
848 }
849 `)
850 // okay to link : LLNDK -> VNDK-SP
851 testCc(t, `
852 cc_library {
853 name: "libllndk",
854 shared_libs: ["libvndksp"],
855 }
856
857 llndk_library {
858 name: "libllndk",
859 symbol_file: "",
860 }
861
862 cc_library {
863 name: "libvndksp",
864 vendor_available: true,
865 vndk: {
866 enabled: true,
867 support_system_process: true,
868 },
869 }
870 `)
871 // okay to link : double_loadable -> double_loadable
872 testCc(t, `
873 cc_library {
874 name: "libdoubleloadable1",
875 shared_libs: ["libdoubleloadable2"],
876 vendor_available: true,
877 double_loadable: true,
878 }
879
880 cc_library {
881 name: "libdoubleloadable2",
882 vendor_available: true,
883 double_loadable: true,
884 }
885 `)
886 // okay to link : double_loadable VNDK -> double_loadable VNDK private
887 testCc(t, `
888 cc_library {
889 name: "libdoubleloadable",
890 vendor_available: true,
891 vndk: {
892 enabled: true,
893 },
894 double_loadable: true,
895 shared_libs: ["libnondoubleloadable"],
896 }
897
898 cc_library {
899 name: "libnondoubleloadable",
900 vendor_available: false,
901 vndk: {
902 enabled: true,
903 },
904 double_loadable: true,
905 }
906 `)
907 // okay to link : LLNDK -> core-only -> vendor_available & double_loadable
908 testCc(t, `
909 cc_library {
910 name: "libllndk",
911 shared_libs: ["libcoreonly"],
912 }
913
914 llndk_library {
915 name: "libllndk",
916 symbol_file: "",
917 }
918
919 cc_library {
920 name: "libcoreonly",
921 shared_libs: ["libvendoravailable"],
922 }
923
924 // indirect dependency of LLNDK
925 cc_library {
926 name: "libvendoravailable",
927 vendor_available: true,
928 double_loadable: true,
929 }
930 `)
931}
932
Inseob Kim8471cda2019-11-15 09:59:12 +0900933func TestVendorSnapshot(t *testing.T) {
934 bp := `
935 cc_library {
936 name: "libvndk",
937 vendor_available: true,
938 vndk: {
939 enabled: true,
940 },
941 nocrt: true,
942 }
943
944 cc_library {
945 name: "libvendor",
946 vendor: true,
947 nocrt: true,
948 }
949
950 cc_library {
951 name: "libvendor_available",
952 vendor_available: true,
953 nocrt: true,
954 }
955
956 cc_library_headers {
957 name: "libvendor_headers",
958 vendor_available: true,
959 nocrt: true,
960 }
961
962 cc_binary {
963 name: "vendor_bin",
964 vendor: true,
965 nocrt: true,
966 }
967
968 cc_binary {
969 name: "vendor_available_bin",
970 vendor_available: true,
971 nocrt: true,
972 }
Inseob Kim7f283f42020-06-01 21:53:49 +0900973
974 toolchain_library {
975 name: "libb",
976 vendor_available: true,
977 src: "libb.a",
978 }
Inseob Kim1042d292020-06-01 23:23:05 +0900979
980 cc_object {
981 name: "obj",
982 vendor_available: true,
983 }
Inseob Kim8471cda2019-11-15 09:59:12 +0900984`
985 config := TestConfig(buildDir, android.Android, nil, bp, nil)
986 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
987 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
988 ctx := testCcWithConfig(t, config)
989
990 // Check Vendor snapshot output.
991
992 snapshotDir := "vendor-snapshot"
993 snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64")
Inseob Kim7f283f42020-06-01 21:53:49 +0900994 snapshotSingleton := ctx.SingletonForTests("vendor-snapshot")
995
996 var jsonFiles []string
Inseob Kim8471cda2019-11-15 09:59:12 +0900997
998 for _, arch := range [][]string{
999 []string{"arm64", "armv8-a"},
1000 []string{"arm", "armv7-a-neon"},
1001 } {
1002 archType := arch[0]
1003 archVariant := arch[1]
1004 archDir := fmt.Sprintf("arch-%s-%s", archType, archVariant)
1005
1006 // For shared libraries, only non-VNDK vendor_available modules are captured
1007 sharedVariant := fmt.Sprintf("android_vendor.VER_%s_%s_shared", archType, archVariant)
1008 sharedDir := filepath.Join(snapshotVariantPath, archDir, "shared")
Inseob Kim7f283f42020-06-01 21:53:49 +09001009 checkSnapshot(t, ctx, snapshotSingleton, "libvendor", "libvendor.so", sharedDir, sharedVariant)
1010 checkSnapshot(t, ctx, snapshotSingleton, "libvendor_available", "libvendor_available.so", sharedDir, sharedVariant)
1011 jsonFiles = append(jsonFiles,
1012 filepath.Join(sharedDir, "libvendor.so.json"),
1013 filepath.Join(sharedDir, "libvendor_available.so.json"))
Inseob Kim8471cda2019-11-15 09:59:12 +09001014
1015 // For static libraries, all vendor:true and vendor_available modules (including VNDK) are captured.
1016 staticVariant := fmt.Sprintf("android_vendor.VER_%s_%s_static", archType, archVariant)
1017 staticDir := filepath.Join(snapshotVariantPath, archDir, "static")
Inseob Kim7f283f42020-06-01 21:53:49 +09001018 checkSnapshot(t, ctx, snapshotSingleton, "libb", "libb.a", staticDir, staticVariant)
1019 checkSnapshot(t, ctx, snapshotSingleton, "libvndk", "libvndk.a", staticDir, staticVariant)
1020 checkSnapshot(t, ctx, snapshotSingleton, "libvendor", "libvendor.a", staticDir, staticVariant)
1021 checkSnapshot(t, ctx, snapshotSingleton, "libvendor_available", "libvendor_available.a", staticDir, staticVariant)
1022 jsonFiles = append(jsonFiles,
1023 filepath.Join(staticDir, "libb.a.json"),
1024 filepath.Join(staticDir, "libvndk.a.json"),
1025 filepath.Join(staticDir, "libvendor.a.json"),
1026 filepath.Join(staticDir, "libvendor_available.a.json"))
Inseob Kim8471cda2019-11-15 09:59:12 +09001027
Inseob Kim7f283f42020-06-01 21:53:49 +09001028 // For binary executables, all vendor:true and vendor_available modules are captured.
Inseob Kim8471cda2019-11-15 09:59:12 +09001029 if archType == "arm64" {
1030 binaryVariant := fmt.Sprintf("android_vendor.VER_%s_%s", archType, archVariant)
1031 binaryDir := filepath.Join(snapshotVariantPath, archDir, "binary")
Inseob Kim7f283f42020-06-01 21:53:49 +09001032 checkSnapshot(t, ctx, snapshotSingleton, "vendor_bin", "vendor_bin", binaryDir, binaryVariant)
1033 checkSnapshot(t, ctx, snapshotSingleton, "vendor_available_bin", "vendor_available_bin", binaryDir, binaryVariant)
1034 jsonFiles = append(jsonFiles,
1035 filepath.Join(binaryDir, "vendor_bin.json"),
1036 filepath.Join(binaryDir, "vendor_available_bin.json"))
1037 }
1038
1039 // For header libraries, all vendor:true and vendor_available modules are captured.
1040 headerDir := filepath.Join(snapshotVariantPath, archDir, "header")
1041 jsonFiles = append(jsonFiles, filepath.Join(headerDir, "libvendor_headers.json"))
Inseob Kim1042d292020-06-01 23:23:05 +09001042
1043 // For object modules, all vendor:true and vendor_available modules are captured.
1044 objectVariant := fmt.Sprintf("android_vendor.VER_%s_%s", archType, archVariant)
1045 objectDir := filepath.Join(snapshotVariantPath, archDir, "object")
1046 checkSnapshot(t, ctx, snapshotSingleton, "obj", "obj.o", objectDir, objectVariant)
1047 jsonFiles = append(jsonFiles, filepath.Join(objectDir, "obj.o.json"))
Inseob Kim7f283f42020-06-01 21:53:49 +09001048 }
1049
1050 for _, jsonFile := range jsonFiles {
1051 // verify all json files exist
1052 if snapshotSingleton.MaybeOutput(jsonFile).Rule == nil {
1053 t.Errorf("%q expected but not found", jsonFile)
Inseob Kim8471cda2019-11-15 09:59:12 +09001054 }
1055 }
1056}
1057
Jooyung Hana70f0672019-01-18 15:20:43 +09001058func TestDoubleLoadableDepError(t *testing.T) {
1059 // Check whether an error is emitted when a LLNDK depends on a non-double_loadable VNDK lib.
1060 testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
1061 cc_library {
1062 name: "libllndk",
1063 shared_libs: ["libnondoubleloadable"],
1064 }
1065
1066 llndk_library {
1067 name: "libllndk",
1068 symbol_file: "",
1069 }
1070
1071 cc_library {
1072 name: "libnondoubleloadable",
1073 vendor_available: true,
1074 vndk: {
1075 enabled: true,
1076 },
1077 }
1078 `)
1079
1080 // Check whether an error is emitted when a LLNDK depends on a non-double_loadable vendor_available lib.
1081 testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
1082 cc_library {
1083 name: "libllndk",
Yi Konge7fe9912019-06-02 00:53:50 -07001084 no_libcrt: true,
Jooyung Hana70f0672019-01-18 15:20:43 +09001085 shared_libs: ["libnondoubleloadable"],
1086 }
1087
1088 llndk_library {
1089 name: "libllndk",
1090 symbol_file: "",
1091 }
1092
1093 cc_library {
1094 name: "libnondoubleloadable",
1095 vendor_available: true,
1096 }
1097 `)
1098
1099 // Check whether an error is emitted when a double_loadable lib depends on a non-double_loadable vendor_available lib.
1100 testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
1101 cc_library {
1102 name: "libdoubleloadable",
1103 vendor_available: true,
1104 double_loadable: true,
1105 shared_libs: ["libnondoubleloadable"],
1106 }
1107
1108 cc_library {
1109 name: "libnondoubleloadable",
1110 vendor_available: true,
1111 }
1112 `)
1113
1114 // Check whether an error is emitted when a double_loadable lib depends on a non-double_loadable VNDK lib.
1115 testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
1116 cc_library {
1117 name: "libdoubleloadable",
1118 vendor_available: true,
1119 double_loadable: true,
1120 shared_libs: ["libnondoubleloadable"],
1121 }
1122
1123 cc_library {
1124 name: "libnondoubleloadable",
1125 vendor_available: true,
1126 vndk: {
1127 enabled: true,
1128 },
1129 }
1130 `)
1131
1132 // Check whether an error is emitted when a double_loadable VNDK depends on a non-double_loadable VNDK private lib.
1133 testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
1134 cc_library {
1135 name: "libdoubleloadable",
1136 vendor_available: true,
1137 vndk: {
1138 enabled: true,
1139 },
1140 double_loadable: true,
1141 shared_libs: ["libnondoubleloadable"],
1142 }
1143
1144 cc_library {
1145 name: "libnondoubleloadable",
1146 vendor_available: false,
1147 vndk: {
1148 enabled: true,
1149 },
1150 }
1151 `)
1152
1153 // Check whether an error is emitted when a LLNDK depends on a non-double_loadable indirectly.
1154 testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", `
1155 cc_library {
1156 name: "libllndk",
1157 shared_libs: ["libcoreonly"],
1158 }
1159
1160 llndk_library {
1161 name: "libllndk",
1162 symbol_file: "",
1163 }
1164
1165 cc_library {
1166 name: "libcoreonly",
1167 shared_libs: ["libvendoravailable"],
1168 }
1169
1170 // indirect dependency of LLNDK
1171 cc_library {
1172 name: "libvendoravailable",
1173 vendor_available: true,
1174 }
1175 `)
Logan Chiend3c59a22018-03-29 14:08:15 +08001176}
1177
Logan Chienf3511742017-10-31 18:04:35 +08001178func TestVndkExt(t *testing.T) {
1179 // This test checks the VNDK-Ext properties.
Justin Yun0ecf0b22020-02-28 15:07:59 +09001180 bp := `
Logan Chienf3511742017-10-31 18:04:35 +08001181 cc_library {
1182 name: "libvndk",
1183 vendor_available: true,
1184 vndk: {
1185 enabled: true,
1186 },
1187 nocrt: true,
1188 }
Jooyung Han4c2b9422019-10-22 19:53:47 +09001189 cc_library {
1190 name: "libvndk2",
1191 vendor_available: true,
1192 vndk: {
1193 enabled: true,
1194 },
1195 target: {
1196 vendor: {
1197 suffix: "-suffix",
1198 },
1199 },
1200 nocrt: true,
1201 }
Logan Chienf3511742017-10-31 18:04:35 +08001202
1203 cc_library {
1204 name: "libvndk_ext",
1205 vendor: true,
1206 vndk: {
1207 enabled: true,
1208 extends: "libvndk",
1209 },
1210 nocrt: true,
1211 }
Jooyung Han4c2b9422019-10-22 19:53:47 +09001212
1213 cc_library {
1214 name: "libvndk2_ext",
1215 vendor: true,
1216 vndk: {
1217 enabled: true,
1218 extends: "libvndk2",
1219 },
1220 nocrt: true,
1221 }
Logan Chienf3511742017-10-31 18:04:35 +08001222
Justin Yun0ecf0b22020-02-28 15:07:59 +09001223 cc_library {
1224 name: "libvndk_ext_product",
1225 product_specific: true,
1226 vndk: {
1227 enabled: true,
1228 extends: "libvndk",
1229 },
1230 nocrt: true,
1231 }
Jooyung Han4c2b9422019-10-22 19:53:47 +09001232
Justin Yun0ecf0b22020-02-28 15:07:59 +09001233 cc_library {
1234 name: "libvndk2_ext_product",
1235 product_specific: true,
1236 vndk: {
1237 enabled: true,
1238 extends: "libvndk2",
1239 },
1240 nocrt: true,
1241 }
1242 `
1243 config := TestConfig(buildDir, android.Android, nil, bp, nil)
1244 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
1245 config.TestProductVariables.ProductVndkVersion = StringPtr("current")
1246 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
1247
1248 ctx := testCcWithConfig(t, config)
1249
1250 checkVndkModule(t, ctx, "libvndk_ext", "vndk", false, "libvndk", vendorVariant)
1251 checkVndkModule(t, ctx, "libvndk_ext_product", "vndk", false, "libvndk", productVariant)
1252
1253 mod_vendor := ctx.ModuleForTests("libvndk2_ext", vendorVariant).Module().(*Module)
1254 assertString(t, mod_vendor.outputFile.Path().Base(), "libvndk2-suffix.so")
1255
1256 mod_product := ctx.ModuleForTests("libvndk2_ext_product", productVariant).Module().(*Module)
1257 assertString(t, mod_product.outputFile.Path().Base(), "libvndk2-suffix.so")
Logan Chienf3511742017-10-31 18:04:35 +08001258}
1259
Logan Chiend3c59a22018-03-29 14:08:15 +08001260func TestVndkExtWithoutBoardVndkVersion(t *testing.T) {
Logan Chienf3511742017-10-31 18:04:35 +08001261 // This test checks the VNDK-Ext properties when BOARD_VNDK_VERSION is not set.
1262 ctx := testCcNoVndk(t, `
1263 cc_library {
1264 name: "libvndk",
1265 vendor_available: true,
1266 vndk: {
1267 enabled: true,
1268 },
1269 nocrt: true,
1270 }
1271
1272 cc_library {
1273 name: "libvndk_ext",
1274 vendor: true,
1275 vndk: {
1276 enabled: true,
1277 extends: "libvndk",
1278 },
1279 nocrt: true,
1280 }
1281 `)
1282
1283 // Ensures that the core variant of "libvndk_ext" can be found.
1284 mod := ctx.ModuleForTests("libvndk_ext", coreVariant).Module().(*Module)
1285 if extends := mod.getVndkExtendsModuleName(); extends != "libvndk" {
1286 t.Errorf("\"libvndk_ext\" must extend from \"libvndk\" but get %q", extends)
1287 }
1288}
1289
Justin Yun0ecf0b22020-02-28 15:07:59 +09001290func TestVndkExtWithoutProductVndkVersion(t *testing.T) {
1291 // This test checks the VNDK-Ext properties when PRODUCT_PRODUCT_VNDK_VERSION is not set.
1292 ctx := testCc(t, `
1293 cc_library {
1294 name: "libvndk",
1295 vendor_available: true,
1296 vndk: {
1297 enabled: true,
1298 },
1299 nocrt: true,
1300 }
1301
1302 cc_library {
1303 name: "libvndk_ext_product",
1304 product_specific: true,
1305 vndk: {
1306 enabled: true,
1307 extends: "libvndk",
1308 },
1309 nocrt: true,
1310 }
1311 `)
1312
1313 // Ensures that the core variant of "libvndk_ext_product" can be found.
1314 mod := ctx.ModuleForTests("libvndk_ext_product", coreVariant).Module().(*Module)
1315 if extends := mod.getVndkExtendsModuleName(); extends != "libvndk" {
1316 t.Errorf("\"libvndk_ext_product\" must extend from \"libvndk\" but get %q", extends)
1317 }
1318}
1319
Logan Chienf3511742017-10-31 18:04:35 +08001320func TestVndkExtError(t *testing.T) {
1321 // This test ensures an error is emitted in ill-formed vndk-ext definition.
Justin Yun0ecf0b22020-02-28 15:07:59 +09001322 testCcError(t, "must set `vendor: true` or `product_specific: true` to set `extends: \".*\"`", `
Logan Chienf3511742017-10-31 18:04:35 +08001323 cc_library {
1324 name: "libvndk",
1325 vendor_available: true,
1326 vndk: {
1327 enabled: true,
1328 },
1329 nocrt: true,
1330 }
1331
1332 cc_library {
1333 name: "libvndk_ext",
1334 vndk: {
1335 enabled: true,
1336 extends: "libvndk",
1337 },
1338 nocrt: true,
1339 }
1340 `)
1341
1342 testCcError(t, "must set `extends: \"\\.\\.\\.\"` to vndk extension", `
1343 cc_library {
1344 name: "libvndk",
1345 vendor_available: true,
1346 vndk: {
1347 enabled: true,
1348 },
1349 nocrt: true,
1350 }
1351
1352 cc_library {
1353 name: "libvndk_ext",
1354 vendor: true,
1355 vndk: {
1356 enabled: true,
1357 },
1358 nocrt: true,
1359 }
1360 `)
Justin Yun0ecf0b22020-02-28 15:07:59 +09001361
1362 testCcErrorProductVndk(t, "must set `extends: \"\\.\\.\\.\"` to vndk extension", `
1363 cc_library {
1364 name: "libvndk",
1365 vendor_available: true,
1366 vndk: {
1367 enabled: true,
1368 },
1369 nocrt: true,
1370 }
1371
1372 cc_library {
1373 name: "libvndk_ext_product",
1374 product_specific: true,
1375 vndk: {
1376 enabled: true,
1377 },
1378 nocrt: true,
1379 }
1380 `)
1381
1382 testCcErrorProductVndk(t, "must not set at the same time as `vndk: {extends: \"\\.\\.\\.\"}`", `
1383 cc_library {
1384 name: "libvndk",
1385 vendor_available: true,
1386 vndk: {
1387 enabled: true,
1388 },
1389 nocrt: true,
1390 }
1391
1392 cc_library {
1393 name: "libvndk_ext_product",
1394 product_specific: true,
1395 vendor_available: true,
1396 vndk: {
1397 enabled: true,
1398 extends: "libvndk",
1399 },
1400 nocrt: true,
1401 }
1402 `)
Logan Chienf3511742017-10-31 18:04:35 +08001403}
1404
1405func TestVndkExtInconsistentSupportSystemProcessError(t *testing.T) {
1406 // This test ensures an error is emitted for inconsistent support_system_process.
1407 testCcError(t, "module \".*\" with mismatched support_system_process", `
1408 cc_library {
1409 name: "libvndk",
1410 vendor_available: true,
1411 vndk: {
1412 enabled: true,
1413 },
1414 nocrt: true,
1415 }
1416
1417 cc_library {
1418 name: "libvndk_sp_ext",
1419 vendor: true,
1420 vndk: {
1421 enabled: true,
1422 extends: "libvndk",
1423 support_system_process: true,
1424 },
1425 nocrt: true,
1426 }
1427 `)
1428
1429 testCcError(t, "module \".*\" with mismatched support_system_process", `
1430 cc_library {
1431 name: "libvndk_sp",
1432 vendor_available: true,
1433 vndk: {
1434 enabled: true,
1435 support_system_process: true,
1436 },
1437 nocrt: true,
1438 }
1439
1440 cc_library {
1441 name: "libvndk_ext",
1442 vendor: true,
1443 vndk: {
1444 enabled: true,
1445 extends: "libvndk_sp",
1446 },
1447 nocrt: true,
1448 }
1449 `)
1450}
1451
1452func TestVndkExtVendorAvailableFalseError(t *testing.T) {
Logan Chiend3c59a22018-03-29 14:08:15 +08001453 // This test ensures an error is emitted when a VNDK-Ext library extends a VNDK library
Logan Chienf3511742017-10-31 18:04:35 +08001454 // with `vendor_available: false`.
1455 testCcError(t, "`extends` refers module \".*\" which does not have `vendor_available: true`", `
1456 cc_library {
1457 name: "libvndk",
1458 vendor_available: false,
1459 vndk: {
1460 enabled: true,
1461 },
1462 nocrt: true,
1463 }
1464
1465 cc_library {
1466 name: "libvndk_ext",
1467 vendor: true,
1468 vndk: {
1469 enabled: true,
1470 extends: "libvndk",
1471 },
1472 nocrt: true,
1473 }
1474 `)
Justin Yun0ecf0b22020-02-28 15:07:59 +09001475
1476 testCcErrorProductVndk(t, "`extends` refers module \".*\" which does not have `vendor_available: true`", `
1477 cc_library {
1478 name: "libvndk",
1479 vendor_available: false,
1480 vndk: {
1481 enabled: true,
1482 },
1483 nocrt: true,
1484 }
1485
1486 cc_library {
1487 name: "libvndk_ext_product",
1488 product_specific: true,
1489 vndk: {
1490 enabled: true,
1491 extends: "libvndk",
1492 },
1493 nocrt: true,
1494 }
1495 `)
Logan Chienf3511742017-10-31 18:04:35 +08001496}
1497
Logan Chiend3c59a22018-03-29 14:08:15 +08001498func TestVendorModuleUseVndkExt(t *testing.T) {
1499 // This test ensures a vendor module can depend on a VNDK-Ext library.
Logan Chienf3511742017-10-31 18:04:35 +08001500 testCc(t, `
1501 cc_library {
1502 name: "libvndk",
1503 vendor_available: true,
1504 vndk: {
1505 enabled: true,
1506 },
1507 nocrt: true,
1508 }
1509
1510 cc_library {
1511 name: "libvndk_ext",
1512 vendor: true,
1513 vndk: {
1514 enabled: true,
1515 extends: "libvndk",
1516 },
1517 nocrt: true,
1518 }
1519
1520 cc_library {
Logan Chienf3511742017-10-31 18:04:35 +08001521 name: "libvndk_sp",
1522 vendor_available: true,
1523 vndk: {
1524 enabled: true,
1525 support_system_process: true,
1526 },
1527 nocrt: true,
1528 }
1529
1530 cc_library {
1531 name: "libvndk_sp_ext",
1532 vendor: true,
1533 vndk: {
1534 enabled: true,
1535 extends: "libvndk_sp",
1536 support_system_process: true,
1537 },
1538 nocrt: true,
1539 }
1540
1541 cc_library {
1542 name: "libvendor",
1543 vendor: true,
1544 shared_libs: ["libvndk_ext", "libvndk_sp_ext"],
1545 nocrt: true,
1546 }
1547 `)
1548}
1549
Logan Chiend3c59a22018-03-29 14:08:15 +08001550func TestVndkExtUseVendorLib(t *testing.T) {
1551 // This test ensures a VNDK-Ext library can depend on a vendor library.
Logan Chienf3511742017-10-31 18:04:35 +08001552 testCc(t, `
1553 cc_library {
1554 name: "libvndk",
1555 vendor_available: true,
1556 vndk: {
1557 enabled: true,
1558 },
1559 nocrt: true,
1560 }
1561
1562 cc_library {
1563 name: "libvndk_ext",
1564 vendor: true,
1565 vndk: {
1566 enabled: true,
1567 extends: "libvndk",
1568 },
1569 shared_libs: ["libvendor"],
1570 nocrt: true,
1571 }
1572
1573 cc_library {
1574 name: "libvendor",
1575 vendor: true,
1576 nocrt: true,
1577 }
1578 `)
Logan Chienf3511742017-10-31 18:04:35 +08001579
Logan Chiend3c59a22018-03-29 14:08:15 +08001580 // This test ensures a VNDK-SP-Ext library can depend on a vendor library.
1581 testCc(t, `
Logan Chienf3511742017-10-31 18:04:35 +08001582 cc_library {
1583 name: "libvndk_sp",
1584 vendor_available: true,
1585 vndk: {
1586 enabled: true,
1587 support_system_process: true,
1588 },
1589 nocrt: true,
1590 }
1591
1592 cc_library {
1593 name: "libvndk_sp_ext",
1594 vendor: true,
1595 vndk: {
1596 enabled: true,
1597 extends: "libvndk_sp",
1598 support_system_process: true,
1599 },
1600 shared_libs: ["libvendor"], // Cause an error
1601 nocrt: true,
1602 }
1603
1604 cc_library {
1605 name: "libvendor",
1606 vendor: true,
1607 nocrt: true,
1608 }
1609 `)
1610}
1611
Justin Yun0ecf0b22020-02-28 15:07:59 +09001612func TestProductVndkExtDependency(t *testing.T) {
1613 bp := `
1614 cc_library {
1615 name: "libvndk",
1616 vendor_available: true,
1617 vndk: {
1618 enabled: true,
1619 },
1620 nocrt: true,
1621 }
1622
1623 cc_library {
1624 name: "libvndk_ext_product",
1625 product_specific: true,
1626 vndk: {
1627 enabled: true,
1628 extends: "libvndk",
1629 },
1630 shared_libs: ["libproduct_for_vndklibs"],
1631 nocrt: true,
1632 }
1633
1634 cc_library {
1635 name: "libvndk_sp",
1636 vendor_available: true,
1637 vndk: {
1638 enabled: true,
1639 support_system_process: true,
1640 },
1641 nocrt: true,
1642 }
1643
1644 cc_library {
1645 name: "libvndk_sp_ext_product",
1646 product_specific: true,
1647 vndk: {
1648 enabled: true,
1649 extends: "libvndk_sp",
1650 support_system_process: true,
1651 },
1652 shared_libs: ["libproduct_for_vndklibs"],
1653 nocrt: true,
1654 }
1655
1656 cc_library {
1657 name: "libproduct",
1658 product_specific: true,
1659 shared_libs: ["libvndk_ext_product", "libvndk_sp_ext_product"],
1660 nocrt: true,
1661 }
1662
1663 cc_library {
1664 name: "libproduct_for_vndklibs",
1665 product_specific: true,
1666 nocrt: true,
1667 }
1668 `
1669 config := TestConfig(buildDir, android.Android, nil, bp, nil)
1670 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
1671 config.TestProductVariables.ProductVndkVersion = StringPtr("current")
1672 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
1673
1674 testCcWithConfig(t, config)
1675}
1676
Logan Chiend3c59a22018-03-29 14:08:15 +08001677func TestVndkSpExtUseVndkError(t *testing.T) {
1678 // This test ensures an error is emitted if a VNDK-SP-Ext library depends on a VNDK
1679 // library.
1680 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
1681 cc_library {
1682 name: "libvndk",
1683 vendor_available: true,
1684 vndk: {
1685 enabled: true,
1686 },
1687 nocrt: true,
1688 }
1689
1690 cc_library {
1691 name: "libvndk_sp",
1692 vendor_available: true,
1693 vndk: {
1694 enabled: true,
1695 support_system_process: true,
1696 },
1697 nocrt: true,
1698 }
1699
1700 cc_library {
1701 name: "libvndk_sp_ext",
1702 vendor: true,
1703 vndk: {
1704 enabled: true,
1705 extends: "libvndk_sp",
1706 support_system_process: true,
1707 },
1708 shared_libs: ["libvndk"], // Cause an error
1709 nocrt: true,
1710 }
1711 `)
1712
1713 // This test ensures an error is emitted if a VNDK-SP-Ext library depends on a VNDK-Ext
1714 // library.
1715 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
1716 cc_library {
1717 name: "libvndk",
1718 vendor_available: true,
1719 vndk: {
1720 enabled: true,
1721 },
1722 nocrt: true,
1723 }
1724
1725 cc_library {
1726 name: "libvndk_ext",
1727 vendor: true,
1728 vndk: {
1729 enabled: true,
1730 extends: "libvndk",
1731 },
1732 nocrt: true,
1733 }
1734
1735 cc_library {
1736 name: "libvndk_sp",
1737 vendor_available: true,
1738 vndk: {
1739 enabled: true,
1740 support_system_process: true,
1741 },
1742 nocrt: true,
1743 }
1744
1745 cc_library {
1746 name: "libvndk_sp_ext",
1747 vendor: true,
1748 vndk: {
1749 enabled: true,
1750 extends: "libvndk_sp",
1751 support_system_process: true,
1752 },
1753 shared_libs: ["libvndk_ext"], // Cause an error
1754 nocrt: true,
1755 }
1756 `)
1757}
1758
1759func TestVndkUseVndkExtError(t *testing.T) {
1760 // This test ensures an error is emitted if a VNDK/VNDK-SP library depends on a
1761 // VNDK-Ext/VNDK-SP-Ext library.
Logan Chienf3511742017-10-31 18:04:35 +08001762 testCcError(t, "dependency \".*\" of \".*\" missing variant", `
1763 cc_library {
1764 name: "libvndk",
1765 vendor_available: true,
1766 vndk: {
1767 enabled: true,
1768 },
1769 nocrt: true,
1770 }
1771
1772 cc_library {
1773 name: "libvndk_ext",
1774 vendor: true,
1775 vndk: {
1776 enabled: true,
1777 extends: "libvndk",
1778 },
1779 nocrt: true,
1780 }
1781
1782 cc_library {
1783 name: "libvndk2",
1784 vendor_available: true,
1785 vndk: {
1786 enabled: true,
1787 },
1788 shared_libs: ["libvndk_ext"],
1789 nocrt: true,
1790 }
1791 `)
1792
Martin Stjernholmef449fe2018-11-06 16:12:13 +00001793 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
Logan Chienf3511742017-10-31 18:04:35 +08001794 cc_library {
1795 name: "libvndk",
1796 vendor_available: true,
1797 vndk: {
1798 enabled: true,
1799 },
1800 nocrt: true,
1801 }
1802
1803 cc_library {
1804 name: "libvndk_ext",
1805 vendor: true,
1806 vndk: {
1807 enabled: true,
1808 extends: "libvndk",
1809 },
1810 nocrt: true,
1811 }
1812
1813 cc_library {
1814 name: "libvndk2",
1815 vendor_available: true,
1816 vndk: {
1817 enabled: true,
1818 },
1819 target: {
1820 vendor: {
1821 shared_libs: ["libvndk_ext"],
1822 },
1823 },
1824 nocrt: true,
1825 }
1826 `)
1827
1828 testCcError(t, "dependency \".*\" of \".*\" missing variant", `
1829 cc_library {
1830 name: "libvndk_sp",
1831 vendor_available: true,
1832 vndk: {
1833 enabled: true,
1834 support_system_process: true,
1835 },
1836 nocrt: true,
1837 }
1838
1839 cc_library {
1840 name: "libvndk_sp_ext",
1841 vendor: true,
1842 vndk: {
1843 enabled: true,
1844 extends: "libvndk_sp",
1845 support_system_process: true,
1846 },
1847 nocrt: true,
1848 }
1849
1850 cc_library {
1851 name: "libvndk_sp_2",
1852 vendor_available: true,
1853 vndk: {
1854 enabled: true,
1855 support_system_process: true,
1856 },
1857 shared_libs: ["libvndk_sp_ext"],
1858 nocrt: true,
1859 }
1860 `)
1861
Martin Stjernholmef449fe2018-11-06 16:12:13 +00001862 testCcError(t, "module \".*\" variant \".*\": \\(.*\\) should not link to \".*\"", `
Logan Chienf3511742017-10-31 18:04:35 +08001863 cc_library {
1864 name: "libvndk_sp",
1865 vendor_available: true,
1866 vndk: {
1867 enabled: true,
1868 },
1869 nocrt: true,
1870 }
1871
1872 cc_library {
1873 name: "libvndk_sp_ext",
1874 vendor: true,
1875 vndk: {
1876 enabled: true,
1877 extends: "libvndk_sp",
1878 },
1879 nocrt: true,
1880 }
1881
1882 cc_library {
1883 name: "libvndk_sp2",
1884 vendor_available: true,
1885 vndk: {
1886 enabled: true,
1887 },
1888 target: {
1889 vendor: {
1890 shared_libs: ["libvndk_sp_ext"],
1891 },
1892 },
1893 nocrt: true,
1894 }
1895 `)
1896}
1897
Justin Yun5f7f7e82019-11-18 19:52:14 +09001898func TestEnforceProductVndkVersion(t *testing.T) {
1899 bp := `
1900 cc_library {
1901 name: "libllndk",
1902 }
1903 llndk_library {
1904 name: "libllndk",
1905 symbol_file: "",
1906 }
1907 cc_library {
1908 name: "libvndk",
1909 vendor_available: true,
1910 vndk: {
1911 enabled: true,
1912 },
1913 nocrt: true,
1914 }
1915 cc_library {
1916 name: "libvndk_sp",
1917 vendor_available: true,
1918 vndk: {
1919 enabled: true,
1920 support_system_process: true,
1921 },
1922 nocrt: true,
1923 }
1924 cc_library {
1925 name: "libva",
1926 vendor_available: true,
1927 nocrt: true,
1928 }
1929 cc_library {
1930 name: "libproduct_va",
1931 product_specific: true,
1932 vendor_available: true,
1933 nocrt: true,
1934 }
1935 cc_library {
1936 name: "libprod",
1937 product_specific: true,
1938 shared_libs: [
1939 "libllndk",
1940 "libvndk",
1941 "libvndk_sp",
1942 "libva",
1943 "libproduct_va",
1944 ],
1945 nocrt: true,
1946 }
1947 cc_library {
1948 name: "libvendor",
1949 vendor: true,
1950 shared_libs: [
1951 "libllndk",
1952 "libvndk",
1953 "libvndk_sp",
1954 "libva",
1955 "libproduct_va",
1956 ],
1957 nocrt: true,
1958 }
1959 `
1960
1961 config := TestConfig(buildDir, android.Android, nil, bp, nil)
1962 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
1963 config.TestProductVariables.ProductVndkVersion = StringPtr("current")
1964 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
1965
1966 ctx := testCcWithConfig(t, config)
1967
Justin Yun0ecf0b22020-02-28 15:07:59 +09001968 checkVndkModule(t, ctx, "libvndk", "vndk-VER", false, "", productVariant)
1969 checkVndkModule(t, ctx, "libvndk_sp", "vndk-sp-VER", true, "", productVariant)
Justin Yun5f7f7e82019-11-18 19:52:14 +09001970}
1971
1972func TestEnforceProductVndkVersionErrors(t *testing.T) {
1973 testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:product.VER", `
1974 cc_library {
1975 name: "libprod",
1976 product_specific: true,
1977 shared_libs: [
1978 "libvendor",
1979 ],
1980 nocrt: true,
1981 }
1982 cc_library {
1983 name: "libvendor",
1984 vendor: true,
1985 nocrt: true,
1986 }
1987 `)
1988 testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:product.VER", `
1989 cc_library {
1990 name: "libprod",
1991 product_specific: true,
1992 shared_libs: [
1993 "libsystem",
1994 ],
1995 nocrt: true,
1996 }
1997 cc_library {
1998 name: "libsystem",
1999 nocrt: true,
2000 }
2001 `)
2002 testCcErrorProductVndk(t, "Vendor module that is not VNDK should not link to \".*\" which is marked as `vendor_available: false`", `
2003 cc_library {
2004 name: "libprod",
2005 product_specific: true,
2006 shared_libs: [
2007 "libvndk_private",
2008 ],
2009 nocrt: true,
2010 }
2011 cc_library {
2012 name: "libvndk_private",
2013 vendor_available: false,
2014 vndk: {
2015 enabled: true,
2016 },
2017 nocrt: true,
2018 }
2019 `)
2020 testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:product.VER", `
2021 cc_library {
2022 name: "libprod",
2023 product_specific: true,
2024 shared_libs: [
2025 "libsystem_ext",
2026 ],
2027 nocrt: true,
2028 }
2029 cc_library {
2030 name: "libsystem_ext",
2031 system_ext_specific: true,
2032 nocrt: true,
2033 }
2034 `)
2035 testCcErrorProductVndk(t, "dependency \".*\" of \".*\" missing variant:\n.*image:", `
2036 cc_library {
2037 name: "libsystem",
2038 shared_libs: [
2039 "libproduct_va",
2040 ],
2041 nocrt: true,
2042 }
2043 cc_library {
2044 name: "libproduct_va",
2045 product_specific: true,
2046 vendor_available: true,
2047 nocrt: true,
2048 }
2049 `)
2050}
2051
Jooyung Han38002912019-05-16 04:01:54 +09002052func TestMakeLinkType(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -08002053 bp := `
2054 cc_library {
2055 name: "libvndk",
2056 vendor_available: true,
2057 vndk: {
2058 enabled: true,
2059 },
2060 }
2061 cc_library {
2062 name: "libvndksp",
2063 vendor_available: true,
2064 vndk: {
2065 enabled: true,
2066 support_system_process: true,
2067 },
2068 }
2069 cc_library {
2070 name: "libvndkprivate",
2071 vendor_available: false,
2072 vndk: {
2073 enabled: true,
2074 },
2075 }
2076 cc_library {
2077 name: "libvendor",
2078 vendor: true,
2079 }
2080 cc_library {
2081 name: "libvndkext",
2082 vendor: true,
2083 vndk: {
2084 enabled: true,
2085 extends: "libvndk",
2086 },
2087 }
2088 vndk_prebuilt_shared {
2089 name: "prevndk",
2090 version: "27",
2091 target_arch: "arm",
2092 binder32bit: true,
2093 vendor_available: true,
2094 vndk: {
2095 enabled: true,
2096 },
2097 arch: {
2098 arm: {
2099 srcs: ["liba.so"],
2100 },
2101 },
2102 }
2103 cc_library {
2104 name: "libllndk",
2105 }
2106 llndk_library {
2107 name: "libllndk",
2108 symbol_file: "",
2109 }
2110 cc_library {
2111 name: "libllndkprivate",
2112 }
2113 llndk_library {
2114 name: "libllndkprivate",
2115 vendor_available: false,
2116 symbol_file: "",
2117 }`
2118
2119 config := TestConfig(buildDir, android.Android, nil, bp, nil)
Jooyung Han38002912019-05-16 04:01:54 +09002120 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
2121 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
2122 // native:vndk
Colin Cross98be1bb2019-12-13 20:41:13 -08002123 ctx := testCcWithConfig(t, config)
Jooyung Han38002912019-05-16 04:01:54 +09002124
Jooyung Han0302a842019-10-30 18:43:49 +09002125 assertMapKeys(t, vndkCoreLibraries(config),
Jooyung Han38002912019-05-16 04:01:54 +09002126 []string{"libvndk", "libvndkprivate"})
Jooyung Han0302a842019-10-30 18:43:49 +09002127 assertMapKeys(t, vndkSpLibraries(config),
Jooyung Han38002912019-05-16 04:01:54 +09002128 []string{"libc++", "libvndksp"})
Jooyung Han0302a842019-10-30 18:43:49 +09002129 assertMapKeys(t, llndkLibraries(config),
Jooyung Han097087b2019-10-22 19:32:18 +09002130 []string{"libc", "libdl", "libft2", "libllndk", "libllndkprivate", "libm"})
Jooyung Han0302a842019-10-30 18:43:49 +09002131 assertMapKeys(t, vndkPrivateLibraries(config),
Jooyung Han097087b2019-10-22 19:32:18 +09002132 []string{"libft2", "libllndkprivate", "libvndkprivate"})
Jooyung Han38002912019-05-16 04:01:54 +09002133
Colin Crossfb0c16e2019-11-20 17:12:35 -08002134 vendorVariant27 := "android_vendor.27_arm64_armv8-a_shared"
Inseob Kim64c43952019-08-26 16:52:35 +09002135
Jooyung Han38002912019-05-16 04:01:54 +09002136 tests := []struct {
2137 variant string
2138 name string
2139 expected string
2140 }{
2141 {vendorVariant, "libvndk", "native:vndk"},
2142 {vendorVariant, "libvndksp", "native:vndk"},
2143 {vendorVariant, "libvndkprivate", "native:vndk_private"},
2144 {vendorVariant, "libvendor", "native:vendor"},
2145 {vendorVariant, "libvndkext", "native:vendor"},
Jooyung Han38002912019-05-16 04:01:54 +09002146 {vendorVariant, "libllndk.llndk", "native:vndk"},
Inseob Kim64c43952019-08-26 16:52:35 +09002147 {vendorVariant27, "prevndk.vndk.27.arm.binder32", "native:vndk"},
Jooyung Han38002912019-05-16 04:01:54 +09002148 {coreVariant, "libvndk", "native:platform"},
2149 {coreVariant, "libvndkprivate", "native:platform"},
2150 {coreVariant, "libllndk", "native:platform"},
2151 }
2152 for _, test := range tests {
2153 t.Run(test.name, func(t *testing.T) {
2154 module := ctx.ModuleForTests(test.name, test.variant).Module().(*Module)
2155 assertString(t, module.makeLinkType, test.expected)
2156 })
2157 }
2158}
2159
Colin Cross0af4b842015-04-30 16:36:18 -07002160var (
2161 str11 = "01234567891"
2162 str10 = str11[:10]
2163 str9 = str11[:9]
2164 str5 = str11[:5]
2165 str4 = str11[:4]
2166)
2167
2168var splitListForSizeTestCases = []struct {
2169 in []string
2170 out [][]string
2171 size int
2172}{
2173 {
2174 in: []string{str10},
2175 out: [][]string{{str10}},
2176 size: 10,
2177 },
2178 {
2179 in: []string{str9},
2180 out: [][]string{{str9}},
2181 size: 10,
2182 },
2183 {
2184 in: []string{str5},
2185 out: [][]string{{str5}},
2186 size: 10,
2187 },
2188 {
2189 in: []string{str11},
2190 out: nil,
2191 size: 10,
2192 },
2193 {
2194 in: []string{str10, str10},
2195 out: [][]string{{str10}, {str10}},
2196 size: 10,
2197 },
2198 {
2199 in: []string{str9, str10},
2200 out: [][]string{{str9}, {str10}},
2201 size: 10,
2202 },
2203 {
2204 in: []string{str10, str9},
2205 out: [][]string{{str10}, {str9}},
2206 size: 10,
2207 },
2208 {
2209 in: []string{str5, str4},
2210 out: [][]string{{str5, str4}},
2211 size: 10,
2212 },
2213 {
2214 in: []string{str5, str4, str5},
2215 out: [][]string{{str5, str4}, {str5}},
2216 size: 10,
2217 },
2218 {
2219 in: []string{str5, str4, str5, str4},
2220 out: [][]string{{str5, str4}, {str5, str4}},
2221 size: 10,
2222 },
2223 {
2224 in: []string{str5, str4, str5, str5},
2225 out: [][]string{{str5, str4}, {str5}, {str5}},
2226 size: 10,
2227 },
2228 {
2229 in: []string{str5, str5, str5, str4},
2230 out: [][]string{{str5}, {str5}, {str5, str4}},
2231 size: 10,
2232 },
2233 {
2234 in: []string{str9, str11},
2235 out: nil,
2236 size: 10,
2237 },
2238 {
2239 in: []string{str11, str9},
2240 out: nil,
2241 size: 10,
2242 },
2243}
2244
2245func TestSplitListForSize(t *testing.T) {
2246 for _, testCase := range splitListForSizeTestCases {
Colin Cross40e33732019-02-15 11:08:35 -08002247 out, _ := splitListForSize(android.PathsForTesting(testCase.in...), testCase.size)
Colin Cross5b529592017-05-09 13:34:34 -07002248
2249 var outStrings [][]string
2250
2251 if len(out) > 0 {
2252 outStrings = make([][]string, len(out))
2253 for i, o := range out {
2254 outStrings[i] = o.Strings()
2255 }
2256 }
2257
2258 if !reflect.DeepEqual(outStrings, testCase.out) {
Colin Cross0af4b842015-04-30 16:36:18 -07002259 t.Errorf("incorrect output:")
2260 t.Errorf(" input: %#v", testCase.in)
2261 t.Errorf(" size: %d", testCase.size)
2262 t.Errorf(" expected: %#v", testCase.out)
Colin Cross5b529592017-05-09 13:34:34 -07002263 t.Errorf(" got: %#v", outStrings)
Colin Cross0af4b842015-04-30 16:36:18 -07002264 }
2265 }
2266}
Jeff Gaston294356f2017-09-27 17:05:30 -07002267
2268var staticLinkDepOrderTestCases = []struct {
2269 // This is a string representation of a map[moduleName][]moduleDependency .
2270 // It models the dependencies declared in an Android.bp file.
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002271 inStatic string
2272
2273 // This is a string representation of a map[moduleName][]moduleDependency .
2274 // It models the dependencies declared in an Android.bp file.
2275 inShared string
Jeff Gaston294356f2017-09-27 17:05:30 -07002276
2277 // allOrdered is a string representation of a map[moduleName][]moduleDependency .
2278 // The keys of allOrdered specify which modules we would like to check.
2279 // The values of allOrdered specify the expected result (of the transitive closure of all
2280 // dependencies) for each module to test
2281 allOrdered string
2282
2283 // outOrdered is a string representation of a map[moduleName][]moduleDependency .
2284 // The keys of outOrdered specify which modules we would like to check.
2285 // The values of outOrdered specify the expected result (of the ordered linker command line)
2286 // for each module to test.
2287 outOrdered string
2288}{
2289 // Simple tests
2290 {
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002291 inStatic: "",
Jeff Gaston294356f2017-09-27 17:05:30 -07002292 outOrdered: "",
2293 },
2294 {
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002295 inStatic: "a:",
Jeff Gaston294356f2017-09-27 17:05:30 -07002296 outOrdered: "a:",
2297 },
2298 {
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002299 inStatic: "a:b; b:",
Jeff Gaston294356f2017-09-27 17:05:30 -07002300 outOrdered: "a:b; b:",
2301 },
2302 // Tests of reordering
2303 {
2304 // diamond example
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002305 inStatic: "a:d,b,c; b:d; c:d; d:",
Jeff Gaston294356f2017-09-27 17:05:30 -07002306 outOrdered: "a:b,c,d; b:d; c:d; d:",
2307 },
2308 {
2309 // somewhat real example
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002310 inStatic: "bsdiff_unittest:b,c,d,e,f,g,h,i; e:b",
Jeff Gaston294356f2017-09-27 17:05:30 -07002311 outOrdered: "bsdiff_unittest:c,d,e,b,f,g,h,i; e:b",
2312 },
2313 {
2314 // multiple reorderings
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002315 inStatic: "a:b,c,d,e; d:b; e:c",
Jeff Gaston294356f2017-09-27 17:05:30 -07002316 outOrdered: "a:d,b,e,c; d:b; e:c",
2317 },
2318 {
2319 // should reorder without adding new transitive dependencies
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002320 inStatic: "bin:lib2,lib1; lib1:lib2,liboptional",
Jeff Gaston294356f2017-09-27 17:05:30 -07002321 allOrdered: "bin:lib1,lib2,liboptional; lib1:lib2,liboptional",
2322 outOrdered: "bin:lib1,lib2; lib1:lib2,liboptional",
2323 },
2324 {
2325 // multiple levels of dependencies
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002326 inStatic: "a:b,c,d,e,f,g,h; f:b,c,d; b:c,d; c:d",
Jeff Gaston294356f2017-09-27 17:05:30 -07002327 allOrdered: "a:e,f,b,c,d,g,h; f:b,c,d; b:c,d; c:d",
2328 outOrdered: "a:e,f,b,c,d,g,h; f:b,c,d; b:c,d; c:d",
2329 },
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002330 // shared dependencies
2331 {
2332 // Note that this test doesn't recurse, to minimize the amount of logic it tests.
2333 // So, we don't actually have to check that a shared dependency of c will change the order
2334 // of a library that depends statically on b and on c. We only need to check that if c has
2335 // a shared dependency on b, that that shows up in allOrdered.
2336 inShared: "c:b",
2337 allOrdered: "c:b",
2338 outOrdered: "c:",
2339 },
2340 {
2341 // This test doesn't actually include any shared dependencies but it's a reminder of what
2342 // the second phase of the above test would look like
2343 inStatic: "a:b,c; c:b",
2344 allOrdered: "a:c,b; c:b",
2345 outOrdered: "a:c,b; c:b",
2346 },
Jeff Gaston294356f2017-09-27 17:05:30 -07002347 // tiebreakers for when two modules specifying different orderings and there is no dependency
2348 // to dictate an order
2349 {
2350 // if the tie is between two modules at the end of a's deps, then a's order wins
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002351 inStatic: "a1:b,c,d,e; a2:b,c,e,d; b:d,e; c:e,d",
Jeff Gaston294356f2017-09-27 17:05:30 -07002352 outOrdered: "a1:b,c,d,e; a2:b,c,e,d; b:d,e; c:e,d",
2353 },
2354 {
2355 // if the tie is between two modules at the start of a's deps, then c's order is used
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002356 inStatic: "a1:d,e,b1,c1; b1:d,e; c1:e,d; a2:d,e,b2,c2; b2:d,e; c2:d,e",
Jeff Gaston294356f2017-09-27 17:05:30 -07002357 outOrdered: "a1:b1,c1,e,d; b1:d,e; c1:e,d; a2:b2,c2,d,e; b2:d,e; c2:d,e",
2358 },
2359 // Tests involving duplicate dependencies
2360 {
2361 // simple duplicate
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002362 inStatic: "a:b,c,c,b",
Jeff Gaston294356f2017-09-27 17:05:30 -07002363 outOrdered: "a:c,b",
2364 },
2365 {
2366 // duplicates with reordering
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002367 inStatic: "a:b,c,d,c; c:b",
Jeff Gaston294356f2017-09-27 17:05:30 -07002368 outOrdered: "a:d,c,b",
2369 },
2370 // Tests to confirm the nonexistence of infinite loops.
2371 // These cases should never happen, so as long as the test terminates and the
2372 // result is deterministic then that should be fine.
2373 {
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002374 inStatic: "a:a",
Jeff Gaston294356f2017-09-27 17:05:30 -07002375 outOrdered: "a:a",
2376 },
2377 {
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002378 inStatic: "a:b; b:c; c:a",
Jeff Gaston294356f2017-09-27 17:05:30 -07002379 allOrdered: "a:b,c; b:c,a; c:a,b",
2380 outOrdered: "a:b; b:c; c:a",
2381 },
2382 {
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002383 inStatic: "a:b,c; b:c,a; c:a,b",
Jeff Gaston294356f2017-09-27 17:05:30 -07002384 allOrdered: "a:c,a,b; b:a,b,c; c:b,c,a",
2385 outOrdered: "a:c,b; b:a,c; c:b,a",
2386 },
2387}
2388
2389// converts from a string like "a:b,c; d:e" to (["a","b"], {"a":["b","c"], "d":["e"]}, [{"a", "a.o"}, {"b", "b.o"}])
2390func parseModuleDeps(text string) (modulesInOrder []android.Path, allDeps map[android.Path][]android.Path) {
2391 // convert from "a:b,c; d:e" to "a:b,c;d:e"
2392 strippedText := strings.Replace(text, " ", "", -1)
2393 if len(strippedText) < 1 {
2394 return []android.Path{}, make(map[android.Path][]android.Path, 0)
2395 }
2396 allDeps = make(map[android.Path][]android.Path, 0)
2397
2398 // convert from "a:b,c;d:e" to ["a:b,c", "d:e"]
2399 moduleTexts := strings.Split(strippedText, ";")
2400
2401 outputForModuleName := func(moduleName string) android.Path {
2402 return android.PathForTesting(moduleName)
2403 }
2404
2405 for _, moduleText := range moduleTexts {
2406 // convert from "a:b,c" to ["a", "b,c"]
2407 components := strings.Split(moduleText, ":")
2408 if len(components) != 2 {
2409 panic(fmt.Sprintf("illegal module dep string %q from larger string %q; must contain one ':', not %v", moduleText, text, len(components)-1))
2410 }
2411 moduleName := components[0]
2412 moduleOutput := outputForModuleName(moduleName)
2413 modulesInOrder = append(modulesInOrder, moduleOutput)
2414
2415 depString := components[1]
2416 // convert from "b,c" to ["b", "c"]
2417 depNames := strings.Split(depString, ",")
2418 if len(depString) < 1 {
2419 depNames = []string{}
2420 }
2421 var deps []android.Path
2422 for _, depName := range depNames {
2423 deps = append(deps, outputForModuleName(depName))
2424 }
2425 allDeps[moduleOutput] = deps
2426 }
2427 return modulesInOrder, allDeps
2428}
2429
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002430func TestLinkReordering(t *testing.T) {
Jeff Gaston294356f2017-09-27 17:05:30 -07002431 for _, testCase := range staticLinkDepOrderTestCases {
2432 errs := []string{}
2433
2434 // parse testcase
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002435 _, givenTransitiveDeps := parseModuleDeps(testCase.inStatic)
Jeff Gaston294356f2017-09-27 17:05:30 -07002436 expectedModuleNames, expectedTransitiveDeps := parseModuleDeps(testCase.outOrdered)
2437 if testCase.allOrdered == "" {
2438 // allow the test case to skip specifying allOrdered
2439 testCase.allOrdered = testCase.outOrdered
2440 }
2441 _, expectedAllDeps := parseModuleDeps(testCase.allOrdered)
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002442 _, givenAllSharedDeps := parseModuleDeps(testCase.inShared)
Jeff Gaston294356f2017-09-27 17:05:30 -07002443
2444 // For each module whose post-reordered dependencies were specified, validate that
2445 // reordering the inputs produces the expected outputs.
2446 for _, moduleName := range expectedModuleNames {
2447 moduleDeps := givenTransitiveDeps[moduleName]
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002448 givenSharedDeps := givenAllSharedDeps[moduleName]
2449 orderedAllDeps, orderedDeclaredDeps := orderDeps(moduleDeps, givenSharedDeps, givenTransitiveDeps)
Jeff Gaston294356f2017-09-27 17:05:30 -07002450
2451 correctAllOrdered := expectedAllDeps[moduleName]
2452 if !reflect.DeepEqual(orderedAllDeps, correctAllOrdered) {
2453 errs = append(errs, fmt.Sprintf("orderDeps returned incorrect orderedAllDeps."+
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002454 "\nin static:%q"+
2455 "\nin shared:%q"+
Jeff Gaston294356f2017-09-27 17:05:30 -07002456 "\nmodule: %v"+
2457 "\nexpected: %s"+
2458 "\nactual: %s",
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002459 testCase.inStatic, testCase.inShared, moduleName, correctAllOrdered, orderedAllDeps))
Jeff Gaston294356f2017-09-27 17:05:30 -07002460 }
2461
2462 correctOutputDeps := expectedTransitiveDeps[moduleName]
2463 if !reflect.DeepEqual(correctOutputDeps, orderedDeclaredDeps) {
2464 errs = append(errs, fmt.Sprintf("orderDeps returned incorrect orderedDeclaredDeps."+
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002465 "\nin static:%q"+
2466 "\nin shared:%q"+
Jeff Gaston294356f2017-09-27 17:05:30 -07002467 "\nmodule: %v"+
2468 "\nexpected: %s"+
2469 "\nactual: %s",
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002470 testCase.inStatic, testCase.inShared, moduleName, correctOutputDeps, orderedDeclaredDeps))
Jeff Gaston294356f2017-09-27 17:05:30 -07002471 }
2472 }
2473
2474 if len(errs) > 0 {
2475 sort.Strings(errs)
2476 for _, err := range errs {
2477 t.Error(err)
2478 }
2479 }
2480 }
2481}
Logan Chienf3511742017-10-31 18:04:35 +08002482
Jeff Gaston294356f2017-09-27 17:05:30 -07002483func getOutputPaths(ctx *android.TestContext, variant string, moduleNames []string) (paths android.Paths) {
2484 for _, moduleName := range moduleNames {
2485 module := ctx.ModuleForTests(moduleName, variant).Module().(*Module)
2486 output := module.outputFile.Path()
2487 paths = append(paths, output)
2488 }
2489 return paths
2490}
2491
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002492func TestStaticLibDepReordering(t *testing.T) {
Jeff Gaston294356f2017-09-27 17:05:30 -07002493 ctx := testCc(t, `
2494 cc_library {
2495 name: "a",
2496 static_libs: ["b", "c", "d"],
Jiyong Park374510b2018-03-19 18:23:01 +09002497 stl: "none",
Jeff Gaston294356f2017-09-27 17:05:30 -07002498 }
2499 cc_library {
2500 name: "b",
Jiyong Park374510b2018-03-19 18:23:01 +09002501 stl: "none",
Jeff Gaston294356f2017-09-27 17:05:30 -07002502 }
2503 cc_library {
2504 name: "c",
2505 static_libs: ["b"],
Jiyong Park374510b2018-03-19 18:23:01 +09002506 stl: "none",
Jeff Gaston294356f2017-09-27 17:05:30 -07002507 }
2508 cc_library {
2509 name: "d",
Jiyong Park374510b2018-03-19 18:23:01 +09002510 stl: "none",
Jeff Gaston294356f2017-09-27 17:05:30 -07002511 }
2512
2513 `)
2514
Colin Cross7113d202019-11-20 16:39:12 -08002515 variant := "android_arm64_armv8-a_static"
Jeff Gaston294356f2017-09-27 17:05:30 -07002516 moduleA := ctx.ModuleForTests("a", variant).Module().(*Module)
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002517 actual := moduleA.depsInLinkOrder
Jeff Gaston294356f2017-09-27 17:05:30 -07002518 expected := getOutputPaths(ctx, variant, []string{"c", "b", "d"})
2519
2520 if !reflect.DeepEqual(actual, expected) {
2521 t.Errorf("staticDeps orderings were not propagated correctly"+
2522 "\nactual: %v"+
2523 "\nexpected: %v",
2524 actual,
2525 expected,
2526 )
2527 }
Jiyong Parkd08b6972017-09-26 10:50:54 +09002528}
Jeff Gaston294356f2017-09-27 17:05:30 -07002529
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002530func TestStaticLibDepReorderingWithShared(t *testing.T) {
2531 ctx := testCc(t, `
2532 cc_library {
2533 name: "a",
2534 static_libs: ["b", "c"],
Jiyong Park374510b2018-03-19 18:23:01 +09002535 stl: "none",
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002536 }
2537 cc_library {
2538 name: "b",
Jiyong Park374510b2018-03-19 18:23:01 +09002539 stl: "none",
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002540 }
2541 cc_library {
2542 name: "c",
2543 shared_libs: ["b"],
Jiyong Park374510b2018-03-19 18:23:01 +09002544 stl: "none",
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002545 }
2546
2547 `)
2548
Colin Cross7113d202019-11-20 16:39:12 -08002549 variant := "android_arm64_armv8-a_static"
Jeff Gastonf5b6e8f2017-11-27 15:48:57 -08002550 moduleA := ctx.ModuleForTests("a", variant).Module().(*Module)
2551 actual := moduleA.depsInLinkOrder
2552 expected := getOutputPaths(ctx, variant, []string{"c", "b"})
2553
2554 if !reflect.DeepEqual(actual, expected) {
2555 t.Errorf("staticDeps orderings did not account for shared libs"+
2556 "\nactual: %v"+
2557 "\nexpected: %v",
2558 actual,
2559 expected,
2560 )
2561 }
2562}
2563
Jooyung Hanb04a4992020-03-13 18:57:35 +09002564func checkEquals(t *testing.T, message string, expected, actual interface{}) {
2565 if !reflect.DeepEqual(actual, expected) {
2566 t.Errorf(message+
2567 "\nactual: %v"+
2568 "\nexpected: %v",
2569 actual,
2570 expected,
2571 )
2572 }
2573}
2574
Jooyung Han61b66e92020-03-21 14:21:46 +00002575func TestLlndkLibrary(t *testing.T) {
2576 ctx := testCc(t, `
2577 cc_library {
2578 name: "libllndk",
2579 stubs: { versions: ["1", "2"] },
2580 }
2581 llndk_library {
2582 name: "libllndk",
2583 }
2584 `)
2585 actual := ctx.ModuleVariantsForTests("libllndk.llndk")
2586 expected := []string{
2587 "android_vendor.VER_arm64_armv8-a_shared",
2588 "android_vendor.VER_arm64_armv8-a_shared_1",
2589 "android_vendor.VER_arm64_armv8-a_shared_2",
2590 "android_vendor.VER_arm_armv7-a-neon_shared",
2591 "android_vendor.VER_arm_armv7-a-neon_shared_1",
2592 "android_vendor.VER_arm_armv7-a-neon_shared_2",
2593 }
2594 checkEquals(t, "variants for llndk stubs", expected, actual)
2595
2596 params := ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared").Description("generate stub")
2597 checkEquals(t, "use VNDK version for default stubs", "current", params.Args["apiLevel"])
2598
2599 params = ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared_1").Description("generate stub")
2600 checkEquals(t, "override apiLevel for versioned stubs", "1", params.Args["apiLevel"])
2601}
2602
Jiyong Parka46a4d52017-12-14 19:54:34 +09002603func TestLlndkHeaders(t *testing.T) {
2604 ctx := testCc(t, `
2605 llndk_headers {
2606 name: "libllndk_headers",
2607 export_include_dirs: ["my_include"],
2608 }
2609 llndk_library {
2610 name: "libllndk",
2611 export_llndk_headers: ["libllndk_headers"],
2612 }
2613 cc_library {
2614 name: "libvendor",
2615 shared_libs: ["libllndk"],
2616 vendor: true,
2617 srcs: ["foo.c"],
Yi Konge7fe9912019-06-02 00:53:50 -07002618 no_libcrt: true,
Logan Chienf3511742017-10-31 18:04:35 +08002619 nocrt: true,
Jiyong Parka46a4d52017-12-14 19:54:34 +09002620 }
2621 `)
2622
2623 // _static variant is used since _shared reuses *.o from the static variant
Colin Crossfb0c16e2019-11-20 17:12:35 -08002624 cc := ctx.ModuleForTests("libvendor", "android_vendor.VER_arm_armv7-a-neon_static").Rule("cc")
Jiyong Parka46a4d52017-12-14 19:54:34 +09002625 cflags := cc.Args["cFlags"]
2626 if !strings.Contains(cflags, "-Imy_include") {
2627 t.Errorf("cflags for libvendor must contain -Imy_include, but was %#v.", cflags)
2628 }
2629}
2630
Logan Chien43d34c32017-12-20 01:17:32 +08002631func checkRuntimeLibs(t *testing.T, expected []string, module *Module) {
2632 actual := module.Properties.AndroidMkRuntimeLibs
2633 if !reflect.DeepEqual(actual, expected) {
2634 t.Errorf("incorrect runtime_libs for shared libs"+
2635 "\nactual: %v"+
2636 "\nexpected: %v",
2637 actual,
2638 expected,
2639 )
2640 }
2641}
2642
2643const runtimeLibAndroidBp = `
2644 cc_library {
2645 name: "libvendor_available1",
2646 vendor_available: true,
Yi Konge7fe9912019-06-02 00:53:50 -07002647 no_libcrt : true,
Logan Chien43d34c32017-12-20 01:17:32 +08002648 nocrt : true,
2649 system_shared_libs : [],
2650 }
2651 cc_library {
2652 name: "libvendor_available2",
2653 vendor_available: true,
2654 runtime_libs: ["libvendor_available1"],
Yi Konge7fe9912019-06-02 00:53:50 -07002655 no_libcrt : true,
Logan Chien43d34c32017-12-20 01:17:32 +08002656 nocrt : true,
2657 system_shared_libs : [],
2658 }
2659 cc_library {
2660 name: "libvendor_available3",
2661 vendor_available: true,
2662 runtime_libs: ["libvendor_available1"],
2663 target: {
2664 vendor: {
2665 exclude_runtime_libs: ["libvendor_available1"],
2666 }
2667 },
Yi Konge7fe9912019-06-02 00:53:50 -07002668 no_libcrt : true,
Logan Chien43d34c32017-12-20 01:17:32 +08002669 nocrt : true,
2670 system_shared_libs : [],
2671 }
2672 cc_library {
2673 name: "libcore",
2674 runtime_libs: ["libvendor_available1"],
Yi Konge7fe9912019-06-02 00:53:50 -07002675 no_libcrt : true,
Logan Chien43d34c32017-12-20 01:17:32 +08002676 nocrt : true,
2677 system_shared_libs : [],
2678 }
2679 cc_library {
2680 name: "libvendor1",
2681 vendor: true,
Yi Konge7fe9912019-06-02 00:53:50 -07002682 no_libcrt : true,
Logan Chien43d34c32017-12-20 01:17:32 +08002683 nocrt : true,
2684 system_shared_libs : [],
2685 }
2686 cc_library {
2687 name: "libvendor2",
2688 vendor: true,
2689 runtime_libs: ["libvendor_available1", "libvendor1"],
Yi Konge7fe9912019-06-02 00:53:50 -07002690 no_libcrt : true,
Logan Chien43d34c32017-12-20 01:17:32 +08002691 nocrt : true,
2692 system_shared_libs : [],
2693 }
2694`
2695
2696func TestRuntimeLibs(t *testing.T) {
2697 ctx := testCc(t, runtimeLibAndroidBp)
2698
2699 // runtime_libs for core variants use the module names without suffixes.
Colin Cross7113d202019-11-20 16:39:12 -08002700 variant := "android_arm64_armv8-a_shared"
Logan Chien43d34c32017-12-20 01:17:32 +08002701
2702 module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
2703 checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
2704
2705 module = ctx.ModuleForTests("libcore", variant).Module().(*Module)
2706 checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
2707
2708 // runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core
2709 // and vendor variants.
Colin Crossfb0c16e2019-11-20 17:12:35 -08002710 variant = "android_vendor.VER_arm64_armv8-a_shared"
Logan Chien43d34c32017-12-20 01:17:32 +08002711
2712 module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
2713 checkRuntimeLibs(t, []string{"libvendor_available1.vendor"}, module)
2714
2715 module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module)
2716 checkRuntimeLibs(t, []string{"libvendor_available1.vendor", "libvendor1"}, module)
2717}
2718
2719func TestExcludeRuntimeLibs(t *testing.T) {
2720 ctx := testCc(t, runtimeLibAndroidBp)
2721
Colin Cross7113d202019-11-20 16:39:12 -08002722 variant := "android_arm64_armv8-a_shared"
Logan Chien43d34c32017-12-20 01:17:32 +08002723 module := ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
2724 checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
2725
Colin Crossfb0c16e2019-11-20 17:12:35 -08002726 variant = "android_vendor.VER_arm64_armv8-a_shared"
Logan Chien43d34c32017-12-20 01:17:32 +08002727 module = ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
2728 checkRuntimeLibs(t, nil, module)
2729}
2730
2731func TestRuntimeLibsNoVndk(t *testing.T) {
2732 ctx := testCcNoVndk(t, runtimeLibAndroidBp)
2733
2734 // If DeviceVndkVersion is not defined, then runtime_libs are copied as-is.
2735
Colin Cross7113d202019-11-20 16:39:12 -08002736 variant := "android_arm64_armv8-a_shared"
Logan Chien43d34c32017-12-20 01:17:32 +08002737
2738 module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
2739 checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
2740
2741 module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module)
2742 checkRuntimeLibs(t, []string{"libvendor_available1", "libvendor1"}, module)
2743}
2744
Jaewoong Jung16c7d3d2018-11-16 01:19:56 +00002745func checkStaticLibs(t *testing.T, expected []string, module *Module) {
Jooyung Han03b51852020-02-26 22:45:42 +09002746 t.Helper()
Jaewoong Jung16c7d3d2018-11-16 01:19:56 +00002747 actual := module.Properties.AndroidMkStaticLibs
2748 if !reflect.DeepEqual(actual, expected) {
2749 t.Errorf("incorrect static_libs"+
2750 "\nactual: %v"+
2751 "\nexpected: %v",
2752 actual,
2753 expected,
2754 )
2755 }
2756}
2757
2758const staticLibAndroidBp = `
2759 cc_library {
2760 name: "lib1",
2761 }
2762 cc_library {
2763 name: "lib2",
2764 static_libs: ["lib1"],
2765 }
2766`
2767
2768func TestStaticLibDepExport(t *testing.T) {
2769 ctx := testCc(t, staticLibAndroidBp)
2770
2771 // Check the shared version of lib2.
Colin Cross7113d202019-11-20 16:39:12 -08002772 variant := "android_arm64_armv8-a_shared"
Jaewoong Jung16c7d3d2018-11-16 01:19:56 +00002773 module := ctx.ModuleForTests("lib2", variant).Module().(*Module)
Peter Collingbournee5ba2862019-12-10 18:37:45 -08002774 checkStaticLibs(t, []string{"lib1", "libc++demangle", "libclang_rt.builtins-aarch64-android", "libatomic"}, module)
Jaewoong Jung16c7d3d2018-11-16 01:19:56 +00002775
2776 // Check the static version of lib2.
Colin Cross7113d202019-11-20 16:39:12 -08002777 variant = "android_arm64_armv8-a_static"
Jaewoong Jung16c7d3d2018-11-16 01:19:56 +00002778 module = ctx.ModuleForTests("lib2", variant).Module().(*Module)
2779 // libc++_static is linked additionally.
Peter Collingbournee5ba2862019-12-10 18:37:45 -08002780 checkStaticLibs(t, []string{"lib1", "libc++_static", "libc++demangle", "libclang_rt.builtins-aarch64-android", "libatomic"}, module)
Jaewoong Jung16c7d3d2018-11-16 01:19:56 +00002781}
2782
Jiyong Parkd08b6972017-09-26 10:50:54 +09002783var compilerFlagsTestCases = []struct {
2784 in string
2785 out bool
2786}{
2787 {
2788 in: "a",
2789 out: false,
2790 },
2791 {
2792 in: "-a",
2793 out: true,
2794 },
2795 {
2796 in: "-Ipath/to/something",
2797 out: false,
2798 },
2799 {
2800 in: "-isystempath/to/something",
2801 out: false,
2802 },
2803 {
2804 in: "--coverage",
2805 out: false,
2806 },
2807 {
2808 in: "-include a/b",
2809 out: true,
2810 },
2811 {
2812 in: "-include a/b c/d",
2813 out: false,
2814 },
2815 {
2816 in: "-DMACRO",
2817 out: true,
2818 },
2819 {
2820 in: "-DMAC RO",
2821 out: false,
2822 },
2823 {
2824 in: "-a -b",
2825 out: false,
2826 },
2827 {
2828 in: "-DMACRO=definition",
2829 out: true,
2830 },
2831 {
2832 in: "-DMACRO=defi nition",
2833 out: true, // TODO(jiyong): this should be false
2834 },
2835 {
2836 in: "-DMACRO(x)=x + 1",
2837 out: true,
2838 },
2839 {
2840 in: "-DMACRO=\"defi nition\"",
2841 out: true,
2842 },
2843}
2844
2845type mockContext struct {
2846 BaseModuleContext
2847 result bool
2848}
2849
2850func (ctx *mockContext) PropertyErrorf(property, format string, args ...interface{}) {
2851 // CheckBadCompilerFlags calls this function when the flag should be rejected
2852 ctx.result = false
2853}
2854
2855func TestCompilerFlags(t *testing.T) {
2856 for _, testCase := range compilerFlagsTestCases {
2857 ctx := &mockContext{result: true}
2858 CheckBadCompilerFlags(ctx, "", []string{testCase.in})
2859 if ctx.result != testCase.out {
2860 t.Errorf("incorrect output:")
2861 t.Errorf(" input: %#v", testCase.in)
2862 t.Errorf(" expected: %#v", testCase.out)
2863 t.Errorf(" got: %#v", ctx.result)
2864 }
2865 }
Jeff Gaston294356f2017-09-27 17:05:30 -07002866}
Jiyong Park374510b2018-03-19 18:23:01 +09002867
2868func TestVendorPublicLibraries(t *testing.T) {
2869 ctx := testCc(t, `
2870 cc_library_headers {
2871 name: "libvendorpublic_headers",
2872 export_include_dirs: ["my_include"],
2873 }
2874 vendor_public_library {
2875 name: "libvendorpublic",
2876 symbol_file: "",
2877 export_public_headers: ["libvendorpublic_headers"],
2878 }
2879 cc_library {
2880 name: "libvendorpublic",
2881 srcs: ["foo.c"],
2882 vendor: true,
Yi Konge7fe9912019-06-02 00:53:50 -07002883 no_libcrt: true,
Jiyong Park374510b2018-03-19 18:23:01 +09002884 nocrt: true,
2885 }
2886
2887 cc_library {
2888 name: "libsystem",
2889 shared_libs: ["libvendorpublic"],
2890 vendor: false,
2891 srcs: ["foo.c"],
Yi Konge7fe9912019-06-02 00:53:50 -07002892 no_libcrt: true,
Jiyong Park374510b2018-03-19 18:23:01 +09002893 nocrt: true,
2894 }
2895 cc_library {
2896 name: "libvendor",
2897 shared_libs: ["libvendorpublic"],
2898 vendor: true,
2899 srcs: ["foo.c"],
Yi Konge7fe9912019-06-02 00:53:50 -07002900 no_libcrt: true,
Jiyong Park374510b2018-03-19 18:23:01 +09002901 nocrt: true,
2902 }
2903 `)
2904
Colin Cross7113d202019-11-20 16:39:12 -08002905 coreVariant := "android_arm64_armv8-a_shared"
Colin Crossfb0c16e2019-11-20 17:12:35 -08002906 vendorVariant := "android_vendor.VER_arm64_armv8-a_shared"
Jiyong Park374510b2018-03-19 18:23:01 +09002907
2908 // test if header search paths are correctly added
2909 // _static variant is used since _shared reuses *.o from the static variant
Colin Cross7113d202019-11-20 16:39:12 -08002910 cc := ctx.ModuleForTests("libsystem", strings.Replace(coreVariant, "_shared", "_static", 1)).Rule("cc")
Jiyong Park374510b2018-03-19 18:23:01 +09002911 cflags := cc.Args["cFlags"]
2912 if !strings.Contains(cflags, "-Imy_include") {
2913 t.Errorf("cflags for libsystem must contain -Imy_include, but was %#v.", cflags)
2914 }
2915
2916 // test if libsystem is linked to the stub
Colin Cross7113d202019-11-20 16:39:12 -08002917 ld := ctx.ModuleForTests("libsystem", coreVariant).Rule("ld")
Jiyong Park374510b2018-03-19 18:23:01 +09002918 libflags := ld.Args["libFlags"]
Colin Cross7113d202019-11-20 16:39:12 -08002919 stubPaths := getOutputPaths(ctx, coreVariant, []string{"libvendorpublic" + vendorPublicLibrarySuffix})
Jiyong Park374510b2018-03-19 18:23:01 +09002920 if !strings.Contains(libflags, stubPaths[0].String()) {
2921 t.Errorf("libflags for libsystem must contain %#v, but was %#v", stubPaths[0], libflags)
2922 }
2923
2924 // test if libvendor is linked to the real shared lib
Colin Cross7113d202019-11-20 16:39:12 -08002925 ld = ctx.ModuleForTests("libvendor", vendorVariant).Rule("ld")
Jiyong Park374510b2018-03-19 18:23:01 +09002926 libflags = ld.Args["libFlags"]
Colin Cross7113d202019-11-20 16:39:12 -08002927 stubPaths = getOutputPaths(ctx, vendorVariant, []string{"libvendorpublic"})
Jiyong Park374510b2018-03-19 18:23:01 +09002928 if !strings.Contains(libflags, stubPaths[0].String()) {
2929 t.Errorf("libflags for libvendor must contain %#v, but was %#v", stubPaths[0], libflags)
2930 }
2931
2932}
Jiyong Park37b25202018-07-11 10:49:27 +09002933
2934func TestRecovery(t *testing.T) {
2935 ctx := testCc(t, `
2936 cc_library_shared {
2937 name: "librecovery",
2938 recovery: true,
2939 }
2940 cc_library_shared {
2941 name: "librecovery32",
2942 recovery: true,
2943 compile_multilib:"32",
2944 }
Jiyong Park5baac542018-08-28 09:55:37 +09002945 cc_library_shared {
2946 name: "libHalInRecovery",
2947 recovery_available: true,
2948 vendor: true,
2949 }
Jiyong Park37b25202018-07-11 10:49:27 +09002950 `)
2951
2952 variants := ctx.ModuleVariantsForTests("librecovery")
Colin Crossfb0c16e2019-11-20 17:12:35 -08002953 const arm64 = "android_recovery_arm64_armv8-a_shared"
Jiyong Park37b25202018-07-11 10:49:27 +09002954 if len(variants) != 1 || !android.InList(arm64, variants) {
2955 t.Errorf("variants of librecovery must be \"%s\" only, but was %#v", arm64, variants)
2956 }
2957
2958 variants = ctx.ModuleVariantsForTests("librecovery32")
2959 if android.InList(arm64, variants) {
2960 t.Errorf("multilib was set to 32 for librecovery32, but its variants has %s.", arm64)
2961 }
Jiyong Park5baac542018-08-28 09:55:37 +09002962
2963 recoveryModule := ctx.ModuleForTests("libHalInRecovery", recoveryVariant).Module().(*Module)
2964 if !recoveryModule.Platform() {
2965 t.Errorf("recovery variant of libHalInRecovery must not specific to device, soc, or product")
2966 }
Jiyong Park7ed9de32018-10-15 22:25:07 +09002967}
Jiyong Park5baac542018-08-28 09:55:37 +09002968
Chris Parsons1f6d90f2020-06-17 16:10:42 -04002969func TestDataLibsPrebuiltSharedTestLibrary(t *testing.T) {
2970 bp := `
2971 cc_prebuilt_test_library_shared {
2972 name: "test_lib",
2973 relative_install_path: "foo/bar/baz",
2974 srcs: ["srcpath/dontusethispath/baz.so"],
2975 }
2976
2977 cc_test {
2978 name: "main_test",
2979 data_libs: ["test_lib"],
2980 gtest: false,
2981 }
2982 `
2983
2984 config := TestConfig(buildDir, android.Android, nil, bp, nil)
2985 config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
2986 config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
2987 config.TestProductVariables.VndkUseCoreVariant = BoolPtr(true)
2988
2989 ctx := testCcWithConfig(t, config)
2990 module := ctx.ModuleForTests("main_test", "android_arm_armv7-a-neon").Module()
2991 testBinary := module.(*Module).linker.(*testBinary)
2992 outputFiles, err := module.(android.OutputFileProducer).OutputFiles("")
2993 if err != nil {
2994 t.Fatalf("Expected cc_test to produce output files, error: %s", err)
2995 }
2996 if len(outputFiles) != 1 {
2997 t.Errorf("expected exactly one output file. output files: [%s]", outputFiles)
2998 }
2999 if len(testBinary.dataPaths()) != 1 {
3000 t.Errorf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths())
3001 }
3002
3003 outputPath := outputFiles[0].String()
3004
3005 if !strings.HasSuffix(outputPath, "/main_test") {
3006 t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath)
3007 }
3008 entries := android.AndroidMkEntriesForTest(t, config, "", module)[0]
3009 if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") {
3010 t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+
3011 " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0])
3012 }
3013}
3014
Jiyong Park7ed9de32018-10-15 22:25:07 +09003015func TestVersionedStubs(t *testing.T) {
3016 ctx := testCc(t, `
3017 cc_library_shared {
3018 name: "libFoo",
Jiyong Parkda732bd2018-11-02 18:23:15 +09003019 srcs: ["foo.c"],
Jiyong Park7ed9de32018-10-15 22:25:07 +09003020 stubs: {
3021 symbol_file: "foo.map.txt",
3022 versions: ["1", "2", "3"],
3023 },
3024 }
Jiyong Parkda732bd2018-11-02 18:23:15 +09003025
Jiyong Park7ed9de32018-10-15 22:25:07 +09003026 cc_library_shared {
3027 name: "libBar",
Jiyong Parkda732bd2018-11-02 18:23:15 +09003028 srcs: ["bar.c"],
Jiyong Park7ed9de32018-10-15 22:25:07 +09003029 shared_libs: ["libFoo#1"],
3030 }`)
3031
3032 variants := ctx.ModuleVariantsForTests("libFoo")
3033 expectedVariants := []string{
Colin Cross7113d202019-11-20 16:39:12 -08003034 "android_arm64_armv8-a_shared",
3035 "android_arm64_armv8-a_shared_1",
3036 "android_arm64_armv8-a_shared_2",
3037 "android_arm64_armv8-a_shared_3",
3038 "android_arm_armv7-a-neon_shared",
3039 "android_arm_armv7-a-neon_shared_1",
3040 "android_arm_armv7-a-neon_shared_2",
3041 "android_arm_armv7-a-neon_shared_3",
Jiyong Park7ed9de32018-10-15 22:25:07 +09003042 }
3043 variantsMismatch := false
3044 if len(variants) != len(expectedVariants) {
3045 variantsMismatch = true
3046 } else {
3047 for _, v := range expectedVariants {
3048 if !inList(v, variants) {
3049 variantsMismatch = false
3050 }
3051 }
3052 }
3053 if variantsMismatch {
3054 t.Errorf("variants of libFoo expected:\n")
3055 for _, v := range expectedVariants {
3056 t.Errorf("%q\n", v)
3057 }
3058 t.Errorf(", but got:\n")
3059 for _, v := range variants {
3060 t.Errorf("%q\n", v)
3061 }
3062 }
3063
Colin Cross7113d202019-11-20 16:39:12 -08003064 libBarLinkRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("ld")
Jiyong Park7ed9de32018-10-15 22:25:07 +09003065 libFlags := libBarLinkRule.Args["libFlags"]
Colin Cross7113d202019-11-20 16:39:12 -08003066 libFoo1StubPath := "libFoo/android_arm64_armv8-a_shared_1/libFoo.so"
Jiyong Park7ed9de32018-10-15 22:25:07 +09003067 if !strings.Contains(libFlags, libFoo1StubPath) {
3068 t.Errorf("%q is not found in %q", libFoo1StubPath, libFlags)
3069 }
Jiyong Parkda732bd2018-11-02 18:23:15 +09003070
Colin Cross7113d202019-11-20 16:39:12 -08003071 libBarCompileRule := ctx.ModuleForTests("libBar", "android_arm64_armv8-a_shared").Rule("cc")
Jiyong Parkda732bd2018-11-02 18:23:15 +09003072 cFlags := libBarCompileRule.Args["cFlags"]
3073 libFoo1VersioningMacro := "-D__LIBFOO_API__=1"
3074 if !strings.Contains(cFlags, libFoo1VersioningMacro) {
3075 t.Errorf("%q is not found in %q", libFoo1VersioningMacro, cFlags)
3076 }
Jiyong Park37b25202018-07-11 10:49:27 +09003077}
Jaewoong Jung232c07c2018-12-18 11:08:25 -08003078
Jooyung Hanb04a4992020-03-13 18:57:35 +09003079func TestVersioningMacro(t *testing.T) {
3080 for _, tc := range []struct{ moduleName, expected string }{
3081 {"libc", "__LIBC_API__"},
3082 {"libfoo", "__LIBFOO_API__"},
3083 {"libfoo@1", "__LIBFOO_1_API__"},
3084 {"libfoo-v1", "__LIBFOO_V1_API__"},
3085 {"libfoo.v1", "__LIBFOO_V1_API__"},
3086 } {
3087 checkEquals(t, tc.moduleName, tc.expected, versioningMacroName(tc.moduleName))
3088 }
3089}
3090
Jaewoong Jung232c07c2018-12-18 11:08:25 -08003091func TestStaticExecutable(t *testing.T) {
3092 ctx := testCc(t, `
3093 cc_binary {
3094 name: "static_test",
Pete Bentleyfcf55bf2019-08-16 20:14:32 +01003095 srcs: ["foo.c", "baz.o"],
Jaewoong Jung232c07c2018-12-18 11:08:25 -08003096 static_executable: true,
3097 }`)
3098
Colin Cross7113d202019-11-20 16:39:12 -08003099 variant := "android_arm64_armv8-a"
Jaewoong Jung232c07c2018-12-18 11:08:25 -08003100 binModuleRule := ctx.ModuleForTests("static_test", variant).Rule("ld")
3101 libFlags := binModuleRule.Args["libFlags"]
Ryan Prichardb49fe1b2019-10-11 15:03:34 -07003102 systemStaticLibs := []string{"libc.a", "libm.a"}
Jaewoong Jung232c07c2018-12-18 11:08:25 -08003103 for _, lib := range systemStaticLibs {
3104 if !strings.Contains(libFlags, lib) {
3105 t.Errorf("Static lib %q was not found in %q", lib, libFlags)
3106 }
3107 }
3108 systemSharedLibs := []string{"libc.so", "libm.so", "libdl.so"}
3109 for _, lib := range systemSharedLibs {
3110 if strings.Contains(libFlags, lib) {
3111 t.Errorf("Shared lib %q was found in %q", lib, libFlags)
3112 }
3113 }
3114}
Jiyong Parke4bb9862019-02-01 00:31:10 +09003115
3116func TestStaticDepsOrderWithStubs(t *testing.T) {
3117 ctx := testCc(t, `
3118 cc_binary {
3119 name: "mybin",
3120 srcs: ["foo.c"],
Colin Crossf9aabd72020-02-15 11:29:50 -08003121 static_libs: ["libfooB"],
Jiyong Parke4bb9862019-02-01 00:31:10 +09003122 static_executable: true,
3123 stl: "none",
3124 }
3125
3126 cc_library {
Colin Crossf9aabd72020-02-15 11:29:50 -08003127 name: "libfooB",
Jiyong Parke4bb9862019-02-01 00:31:10 +09003128 srcs: ["foo.c"],
Colin Crossf9aabd72020-02-15 11:29:50 -08003129 shared_libs: ["libfooC"],
Jiyong Parke4bb9862019-02-01 00:31:10 +09003130 stl: "none",
3131 }
3132
3133 cc_library {
Colin Crossf9aabd72020-02-15 11:29:50 -08003134 name: "libfooC",
Jiyong Parke4bb9862019-02-01 00:31:10 +09003135 srcs: ["foo.c"],
3136 stl: "none",
3137 stubs: {
3138 versions: ["1"],
3139 },
3140 }`)
3141
Colin Cross7113d202019-11-20 16:39:12 -08003142 mybin := ctx.ModuleForTests("mybin", "android_arm64_armv8-a").Module().(*Module)
Jiyong Parke4bb9862019-02-01 00:31:10 +09003143 actual := mybin.depsInLinkOrder
Colin Crossf9aabd72020-02-15 11:29:50 -08003144 expected := getOutputPaths(ctx, "android_arm64_armv8-a_static", []string{"libfooB", "libfooC"})
Jiyong Parke4bb9862019-02-01 00:31:10 +09003145
3146 if !reflect.DeepEqual(actual, expected) {
3147 t.Errorf("staticDeps orderings were not propagated correctly"+
3148 "\nactual: %v"+
3149 "\nexpected: %v",
3150 actual,
3151 expected,
3152 )
3153 }
3154}
Jooyung Han38002912019-05-16 04:01:54 +09003155
Jooyung Hand48f3c32019-08-23 11:18:57 +09003156func TestErrorsIfAModuleDependsOnDisabled(t *testing.T) {
3157 testCcError(t, `module "libA" .* depends on disabled module "libB"`, `
3158 cc_library {
3159 name: "libA",
3160 srcs: ["foo.c"],
3161 shared_libs: ["libB"],
3162 stl: "none",
3163 }
3164
3165 cc_library {
3166 name: "libB",
3167 srcs: ["foo.c"],
3168 enabled: false,
3169 stl: "none",
3170 }
3171 `)
3172}
3173
Mitch Phillipsda9a4632019-07-15 09:34:09 -07003174// Simple smoke test for the cc_fuzz target that ensures the rule compiles
3175// correctly.
3176func TestFuzzTarget(t *testing.T) {
3177 ctx := testCc(t, `
3178 cc_fuzz {
3179 name: "fuzz_smoke_test",
3180 srcs: ["foo.c"],
3181 }`)
3182
Paul Duffin075c4172019-12-19 19:06:13 +00003183 variant := "android_arm64_armv8-a_fuzzer"
Mitch Phillipsda9a4632019-07-15 09:34:09 -07003184 ctx.ModuleForTests("fuzz_smoke_test", variant).Rule("cc")
3185}
3186
Jiyong Park29074592019-07-07 16:27:47 +09003187func TestAidl(t *testing.T) {
3188}
3189
Jooyung Han38002912019-05-16 04:01:54 +09003190func assertString(t *testing.T, got, expected string) {
3191 t.Helper()
3192 if got != expected {
3193 t.Errorf("expected %q got %q", expected, got)
3194 }
3195}
3196
3197func assertArrayString(t *testing.T, got, expected []string) {
3198 t.Helper()
3199 if len(got) != len(expected) {
3200 t.Errorf("expected %d (%q) got (%d) %q", len(expected), expected, len(got), got)
3201 return
3202 }
3203 for i := range got {
3204 if got[i] != expected[i] {
3205 t.Errorf("expected %d-th %q (%q) got %q (%q)",
3206 i, expected[i], expected, got[i], got)
3207 return
3208 }
3209 }
3210}
Colin Crosse1bb5d02019-09-24 14:55:04 -07003211
Jooyung Han0302a842019-10-30 18:43:49 +09003212func assertMapKeys(t *testing.T, m map[string]string, expected []string) {
3213 t.Helper()
3214 assertArrayString(t, android.SortedStringKeys(m), expected)
3215}
3216
Colin Crosse1bb5d02019-09-24 14:55:04 -07003217func TestDefaults(t *testing.T) {
3218 ctx := testCc(t, `
3219 cc_defaults {
3220 name: "defaults",
3221 srcs: ["foo.c"],
3222 static: {
3223 srcs: ["bar.c"],
3224 },
3225 shared: {
3226 srcs: ["baz.c"],
3227 },
3228 }
3229
3230 cc_library_static {
3231 name: "libstatic",
3232 defaults: ["defaults"],
3233 }
3234
3235 cc_library_shared {
3236 name: "libshared",
3237 defaults: ["defaults"],
3238 }
3239
3240 cc_library {
3241 name: "libboth",
3242 defaults: ["defaults"],
3243 }
3244
3245 cc_binary {
3246 name: "binary",
3247 defaults: ["defaults"],
3248 }`)
3249
3250 pathsToBase := func(paths android.Paths) []string {
3251 var ret []string
3252 for _, p := range paths {
3253 ret = append(ret, p.Base())
3254 }
3255 return ret
3256 }
3257
Colin Cross7113d202019-11-20 16:39:12 -08003258 shared := ctx.ModuleForTests("libshared", "android_arm64_armv8-a_shared").Rule("ld")
Colin Crosse1bb5d02019-09-24 14:55:04 -07003259 if g, w := pathsToBase(shared.Inputs), []string{"foo.o", "baz.o"}; !reflect.DeepEqual(w, g) {
3260 t.Errorf("libshared ld rule wanted %q, got %q", w, g)
3261 }
Colin Cross7113d202019-11-20 16:39:12 -08003262 bothShared := ctx.ModuleForTests("libboth", "android_arm64_armv8-a_shared").Rule("ld")
Colin Crosse1bb5d02019-09-24 14:55:04 -07003263 if g, w := pathsToBase(bothShared.Inputs), []string{"foo.o", "baz.o"}; !reflect.DeepEqual(w, g) {
3264 t.Errorf("libboth ld rule wanted %q, got %q", w, g)
3265 }
Colin Cross7113d202019-11-20 16:39:12 -08003266 binary := ctx.ModuleForTests("binary", "android_arm64_armv8-a").Rule("ld")
Colin Crosse1bb5d02019-09-24 14:55:04 -07003267 if g, w := pathsToBase(binary.Inputs), []string{"foo.o"}; !reflect.DeepEqual(w, g) {
3268 t.Errorf("binary ld rule wanted %q, got %q", w, g)
3269 }
3270
Colin Cross7113d202019-11-20 16:39:12 -08003271 static := ctx.ModuleForTests("libstatic", "android_arm64_armv8-a_static").Rule("ar")
Colin Crosse1bb5d02019-09-24 14:55:04 -07003272 if g, w := pathsToBase(static.Inputs), []string{"foo.o", "bar.o"}; !reflect.DeepEqual(w, g) {
3273 t.Errorf("libstatic ar rule wanted %q, got %q", w, g)
3274 }
Colin Cross7113d202019-11-20 16:39:12 -08003275 bothStatic := ctx.ModuleForTests("libboth", "android_arm64_armv8-a_static").Rule("ar")
Colin Crosse1bb5d02019-09-24 14:55:04 -07003276 if g, w := pathsToBase(bothStatic.Inputs), []string{"foo.o", "bar.o"}; !reflect.DeepEqual(w, g) {
3277 t.Errorf("libboth ar rule wanted %q, got %q", w, g)
3278 }
3279}
Colin Crosseabaedd2020-02-06 17:01:55 -08003280
3281func TestProductVariableDefaults(t *testing.T) {
3282 bp := `
3283 cc_defaults {
3284 name: "libfoo_defaults",
3285 srcs: ["foo.c"],
3286 cppflags: ["-DFOO"],
3287 product_variables: {
3288 debuggable: {
3289 cppflags: ["-DBAR"],
3290 },
3291 },
3292 }
3293
3294 cc_library {
3295 name: "libfoo",
3296 defaults: ["libfoo_defaults"],
3297 }
3298 `
3299
3300 config := TestConfig(buildDir, android.Android, nil, bp, nil)
3301 config.TestProductVariables.Debuggable = BoolPtr(true)
3302
3303 ctx := CreateTestContext()
3304 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
3305 ctx.BottomUp("variable", android.VariableMutator).Parallel()
3306 })
3307 ctx.Register(config)
3308
3309 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
3310 android.FailIfErrored(t, errs)
3311 _, errs = ctx.PrepareBuildActions(config)
3312 android.FailIfErrored(t, errs)
3313
3314 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*Module)
3315 if !android.InList("-DBAR", libfoo.flags.Local.CppFlags) {
3316 t.Errorf("expected -DBAR in cppflags, got %q", libfoo.flags.Local.CppFlags)
3317 }
3318}