blob: 2f0e59858b20c44d04738ff2a12b71959a7016cd [file] [log] [blame]
Jiyong Parkd1063c12019-07-17 20:08:41 +09001// Copyright 2019 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package sdk
16
17import (
18 "io/ioutil"
19 "os"
Jiyong Park232e7852019-11-04 12:23:40 +090020 "path/filepath"
Jiyong Parkd1063c12019-07-17 20:08:41 +090021 "strings"
22 "testing"
23
24 "android/soong/android"
25 "android/soong/apex"
26 "android/soong/cc"
27 "android/soong/java"
28)
29
Paul Duffin375058f2019-11-29 20:17:53 +000030func testSdkContext(bp string) (*android.TestContext, android.Config) {
Jiyong Parkd1063c12019-07-17 20:08:41 +090031 config := android.TestArchConfig(buildDir, nil)
32 ctx := android.NewTestArchContext()
33
34 // from android package
35 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
36 ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
37 ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
38 })
39 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
40 ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
41 ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
42 })
43
44 // from java package
Colin Cross4b49b762019-11-22 15:25:03 -080045 ctx.RegisterModuleType("android_app_certificate", java.AndroidAppCertificateFactory)
46 ctx.RegisterModuleType("java_library", java.LibraryFactory)
47 ctx.RegisterModuleType("java_import", java.ImportFactory)
48 ctx.RegisterModuleType("droidstubs", java.DroidstubsFactory)
49 ctx.RegisterModuleType("prebuilt_stubs_sources", java.PrebuiltStubsSourcesFactory)
Jiyong Parkd1063c12019-07-17 20:08:41 +090050
51 // from cc package
Colin Cross4b49b762019-11-22 15:25:03 -080052 ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
53 ctx.RegisterModuleType("cc_library_shared", cc.LibrarySharedFactory)
54 ctx.RegisterModuleType("cc_object", cc.ObjectFactory)
55 ctx.RegisterModuleType("cc_prebuilt_library_shared", cc.PrebuiltSharedLibraryFactory)
56 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
57 ctx.RegisterModuleType("llndk_library", cc.LlndkLibraryFactory)
58 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
Jiyong Parkd1063c12019-07-17 20:08:41 +090059 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
Colin Cross7228ecd2019-11-18 16:00:16 -080060 ctx.BottomUp("image", android.ImageMutator).Parallel()
Jiyong Parkd1063c12019-07-17 20:08:41 +090061 ctx.BottomUp("link", cc.LinkageMutator).Parallel()
62 ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
63 ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
64 ctx.BottomUp("version", cc.VersionMutator).Parallel()
65 ctx.BottomUp("begin", cc.BeginMutator).Parallel()
66 })
67
68 // from apex package
Colin Cross4b49b762019-11-22 15:25:03 -080069 ctx.RegisterModuleType("apex", apex.BundleFactory)
70 ctx.RegisterModuleType("apex_key", apex.ApexKeyFactory)
Jiyong Parkd1063c12019-07-17 20:08:41 +090071 ctx.PostDepsMutators(apex.RegisterPostDepsMutators)
72
73 // from this package
Colin Cross4b49b762019-11-22 15:25:03 -080074 ctx.RegisterModuleType("sdk", ModuleFactory)
75 ctx.RegisterModuleType("sdk_snapshot", SnapshotModuleFactory)
Jiyong Parkd1063c12019-07-17 20:08:41 +090076 ctx.PreDepsMutators(RegisterPreDepsMutators)
77 ctx.PostDepsMutators(RegisterPostDepsMutators)
78
79 ctx.Register()
80
81 bp = bp + `
82 apex_key {
83 name: "myapex.key",
84 public_key: "myapex.avbpubkey",
85 private_key: "myapex.pem",
86 }
87
88 android_app_certificate {
89 name: "myapex.cert",
90 certificate: "myapex",
91 }
92 ` + cc.GatherRequiredDepsForTest(android.Android)
93
94 ctx.MockFileSystem(map[string][]byte{
95 "Android.bp": []byte(bp),
96 "build/make/target/product/security": nil,
97 "apex_manifest.json": nil,
98 "system/sepolicy/apex/myapex-file_contexts": nil,
99 "system/sepolicy/apex/myapex2-file_contexts": nil,
100 "myapex.avbpubkey": nil,
101 "myapex.pem": nil,
102 "myapex.x509.pem": nil,
103 "myapex.pk8": nil,
104 "Test.java": nil,
105 "Test.cpp": nil,
Jiyong Park232e7852019-11-04 12:23:40 +0900106 "include/Test.h": nil,
107 "aidl/foo/bar/Test.aidl": nil,
Jiyong Parkd1063c12019-07-17 20:08:41 +0900108 "libfoo.so": nil,
Paul Duffin91547182019-11-12 19:39:36 +0000109 "stubs-sources/foo/bar/Foo.java": nil,
110 "foo/bar/Foo.java": nil,
Jiyong Parkd1063c12019-07-17 20:08:41 +0900111 })
112
113 return ctx, config
114}
115
116func testSdk(t *testing.T, bp string) (*android.TestContext, android.Config) {
Paul Duffin375058f2019-11-29 20:17:53 +0000117 ctx, config := testSdkContext(bp)
Jiyong Parkd1063c12019-07-17 20:08:41 +0900118 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
119 android.FailIfErrored(t, errs)
120 _, errs = ctx.PrepareBuildActions(config)
121 android.FailIfErrored(t, errs)
122 return ctx, config
123}
124
Jiyong Parka7bc8ad2019-10-15 15:20:07 +0900125func testSdkError(t *testing.T, pattern, bp string) {
126 t.Helper()
Paul Duffin375058f2019-11-29 20:17:53 +0000127 ctx, config := testSdkContext(bp)
Jiyong Parka7bc8ad2019-10-15 15:20:07 +0900128 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
129 if len(errs) > 0 {
130 android.FailIfNoMatchingErrors(t, pattern, errs)
131 return
132 }
133 _, errs = ctx.PrepareBuildActions(config)
134 if len(errs) > 0 {
135 android.FailIfNoMatchingErrors(t, pattern, errs)
136 return
137 }
138
139 t.Fatalf("missing expected error %q (0 errors are returned)", pattern)
140}
141
Jiyong Parkd1063c12019-07-17 20:08:41 +0900142func ensureListContains(t *testing.T, result []string, expected string) {
143 t.Helper()
144 if !android.InList(expected, result) {
145 t.Errorf("%q is not found in %v", expected, result)
146 }
147}
148
Jiyong Parkd1063c12019-07-17 20:08:41 +0900149func pathsToStrings(paths android.Paths) []string {
Paul Duffin375058f2019-11-29 20:17:53 +0000150 var ret []string
Jiyong Parkd1063c12019-07-17 20:08:41 +0900151 for _, p := range paths {
152 ret = append(ret, p.String())
153 }
154 return ret
155}
156
157func TestBasicSdkWithJava(t *testing.T) {
158 ctx, _ := testSdk(t, `
159 sdk {
Jiyong Park9b409bc2019-10-11 14:59:13 +0900160 name: "mysdk",
Paul Duffin13879572019-11-28 14:31:38 +0000161 java_libs: ["myjavalib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900162 }
163
164 sdk_snapshot {
165 name: "mysdk@1",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900166 java_libs: ["sdkmember_mysdk_1"],
167 }
168
Jiyong Park9b409bc2019-10-11 14:59:13 +0900169 sdk_snapshot {
170 name: "mysdk@2",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900171 java_libs: ["sdkmember_mysdk_2"],
172 }
173
174 java_import {
175 name: "sdkmember",
176 prefer: false,
177 host_supported: true,
178 }
179
180 java_import {
181 name: "sdkmember_mysdk_1",
182 sdk_member_name: "sdkmember",
183 host_supported: true,
184 }
185
186 java_import {
187 name: "sdkmember_mysdk_2",
188 sdk_member_name: "sdkmember",
189 host_supported: true,
190 }
191
192 java_library {
193 name: "myjavalib",
194 srcs: ["Test.java"],
195 libs: ["sdkmember"],
196 system_modules: "none",
197 sdk_version: "none",
198 compile_dex: true,
199 host_supported: true,
200 }
201
202 apex {
203 name: "myapex",
204 java_libs: ["myjavalib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900205 uses_sdks: ["mysdk@1"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900206 key: "myapex.key",
207 certificate: ":myapex.cert",
208 }
209
210 apex {
211 name: "myapex2",
212 java_libs: ["myjavalib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900213 uses_sdks: ["mysdk@2"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900214 key: "myapex.key",
215 certificate: ":myapex.cert",
216 }
217 `)
218
219 sdkMemberV1 := ctx.ModuleForTests("sdkmember_mysdk_1", "android_common_myapex").Rule("combineJar").Output
220 sdkMemberV2 := ctx.ModuleForTests("sdkmember_mysdk_2", "android_common_myapex2").Rule("combineJar").Output
221
222 javalibForMyApex := ctx.ModuleForTests("myjavalib", "android_common_myapex")
223 javalibForMyApex2 := ctx.ModuleForTests("myjavalib", "android_common_myapex2")
224
225 // Depending on the uses_sdks value, different libs are linked
226 ensureListContains(t, pathsToStrings(javalibForMyApex.Rule("javac").Implicits), sdkMemberV1.String())
227 ensureListContains(t, pathsToStrings(javalibForMyApex2.Rule("javac").Implicits), sdkMemberV2.String())
228}
229
230func TestBasicSdkWithCc(t *testing.T) {
231 ctx, _ := testSdk(t, `
232 sdk {
Jiyong Park9b409bc2019-10-11 14:59:13 +0900233 name: "mysdk",
234 native_shared_libs: ["sdkmember"],
235 }
236
237 sdk_snapshot {
238 name: "mysdk@1",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900239 native_shared_libs: ["sdkmember_mysdk_1"],
240 }
241
Jiyong Park9b409bc2019-10-11 14:59:13 +0900242 sdk_snapshot {
243 name: "mysdk@2",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900244 native_shared_libs: ["sdkmember_mysdk_2"],
245 }
246
247 cc_prebuilt_library_shared {
248 name: "sdkmember",
249 srcs: ["libfoo.so"],
250 prefer: false,
251 system_shared_libs: [],
252 stl: "none",
253 }
254
255 cc_prebuilt_library_shared {
256 name: "sdkmember_mysdk_1",
257 sdk_member_name: "sdkmember",
258 srcs: ["libfoo.so"],
259 system_shared_libs: [],
260 stl: "none",
261 }
262
263 cc_prebuilt_library_shared {
264 name: "sdkmember_mysdk_2",
265 sdk_member_name: "sdkmember",
266 srcs: ["libfoo.so"],
267 system_shared_libs: [],
268 stl: "none",
269 }
270
271 cc_library_shared {
272 name: "mycpplib",
273 srcs: ["Test.cpp"],
274 shared_libs: ["sdkmember"],
275 system_shared_libs: [],
276 stl: "none",
277 }
278
279 apex {
280 name: "myapex",
281 native_shared_libs: ["mycpplib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900282 uses_sdks: ["mysdk@1"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900283 key: "myapex.key",
284 certificate: ":myapex.cert",
285 }
286
287 apex {
288 name: "myapex2",
289 native_shared_libs: ["mycpplib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900290 uses_sdks: ["mysdk@2"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900291 key: "myapex.key",
292 certificate: ":myapex.cert",
293 }
294 `)
295
296 sdkMemberV1 := ctx.ModuleForTests("sdkmember_mysdk_1", "android_arm64_armv8-a_core_shared_myapex").Rule("toc").Output
297 sdkMemberV2 := ctx.ModuleForTests("sdkmember_mysdk_2", "android_arm64_armv8-a_core_shared_myapex2").Rule("toc").Output
298
299 cpplibForMyApex := ctx.ModuleForTests("mycpplib", "android_arm64_armv8-a_core_shared_myapex")
300 cpplibForMyApex2 := ctx.ModuleForTests("mycpplib", "android_arm64_armv8-a_core_shared_myapex2")
301
302 // Depending on the uses_sdks value, different libs are linked
303 ensureListContains(t, pathsToStrings(cpplibForMyApex.Rule("ld").Implicits), sdkMemberV1.String())
304 ensureListContains(t, pathsToStrings(cpplibForMyApex2.Rule("ld").Implicits), sdkMemberV2.String())
305}
306
Paul Duffin91547182019-11-12 19:39:36 +0000307// Note: This test does not verify that a droidstubs can be referenced, either
308// directly or indirectly from an APEX as droidstubs can never be a part of an
309// apex.
310func TestBasicSdkWithDroidstubs(t *testing.T) {
311 testSdk(t, `
312 sdk {
313 name: "mysdk",
314 stubs_sources: ["mystub"],
315 }
316 sdk_snapshot {
317 name: "mysdk@10",
318 stubs_sources: ["mystub_mysdk@10"],
319 }
320 prebuilt_stubs_sources {
321 name: "mystub_mysdk@10",
322 sdk_member_name: "mystub",
323 srcs: ["stubs-sources/foo/bar/Foo.java"],
324 }
325 droidstubs {
326 name: "mystub",
327 srcs: ["foo/bar/Foo.java"],
328 sdk_version: "none",
329 system_modules: "none",
330 }
331 java_library {
332 name: "myjavalib",
333 srcs: [":mystub"],
334 sdk_version: "none",
335 system_modules: "none",
336 }
337 `)
338}
339
Jiyong Parka7bc8ad2019-10-15 15:20:07 +0900340func TestDepNotInRequiredSdks(t *testing.T) {
341 testSdkError(t, `module "myjavalib".*depends on "otherlib".*that isn't part of the required SDKs:.*`, `
342 sdk {
343 name: "mysdk",
344 java_libs: ["sdkmember"],
345 }
346
347 sdk_snapshot {
348 name: "mysdk@1",
349 java_libs: ["sdkmember_mysdk_1"],
350 }
351
352 java_import {
353 name: "sdkmember",
354 prefer: false,
355 host_supported: true,
356 }
357
358 java_import {
359 name: "sdkmember_mysdk_1",
360 sdk_member_name: "sdkmember",
361 host_supported: true,
362 }
363
364 java_library {
365 name: "myjavalib",
366 srcs: ["Test.java"],
367 libs: [
368 "sdkmember",
369 "otherlib",
370 ],
371 system_modules: "none",
372 sdk_version: "none",
373 compile_dex: true,
374 host_supported: true,
375 }
376
377 // this lib is no in mysdk
378 java_library {
379 name: "otherlib",
380 srcs: ["Test.java"],
381 system_modules: "none",
382 sdk_version: "none",
383 compile_dex: true,
384 host_supported: true,
385 }
386
387 apex {
388 name: "myapex",
389 java_libs: ["myjavalib"],
390 uses_sdks: ["mysdk@1"],
391 key: "myapex.key",
392 certificate: ":myapex.cert",
393 }
394 `)
395}
396
Jiyong Park100f3fd2019-11-06 16:03:32 +0900397func TestSdkIsCompileMultilibBoth(t *testing.T) {
398 ctx, _ := testSdk(t, `
399 sdk {
400 name: "mysdk",
401 native_shared_libs: ["sdkmember"],
402 }
403
404 cc_library_shared {
405 name: "sdkmember",
406 srcs: ["Test.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 }
410 `)
411
412 armOutput := ctx.ModuleForTests("sdkmember", "android_arm_armv7-a-neon_core_shared").Module().(*cc.Module).OutputFile()
413 arm64Output := ctx.ModuleForTests("sdkmember", "android_arm64_armv8-a_core_shared").Module().(*cc.Module).OutputFile()
414
415 var inputs []string
416 buildParams := ctx.ModuleForTests("mysdk", "android_common").Module().BuildParamsForTests()
417 for _, bp := range buildParams {
Jiyong Park232e7852019-11-04 12:23:40 +0900418 if bp.Input != nil {
419 inputs = append(inputs, bp.Input.String())
420 }
Jiyong Park100f3fd2019-11-06 16:03:32 +0900421 }
422
423 // ensure that both 32/64 outputs are inputs of the sdk snapshot
424 ensureListContains(t, inputs, armOutput.String())
425 ensureListContains(t, inputs, arm64Output.String())
426}
427
Jiyong Park232e7852019-11-04 12:23:40 +0900428func TestSnapshot(t *testing.T) {
429 ctx, config := testSdk(t, `
430 sdk {
431 name: "mysdk",
432 java_libs: ["myjavalib"],
433 native_shared_libs: ["mynativelib"],
Paul Duffin91547182019-11-12 19:39:36 +0000434 stubs_sources: ["myjavaapistubs"],
Jiyong Park232e7852019-11-04 12:23:40 +0900435 }
436
437 java_library {
438 name: "myjavalib",
439 srcs: ["Test.java"],
440 aidl: {
441 export_include_dirs: ["aidl"],
442 },
443 system_modules: "none",
444 sdk_version: "none",
445 compile_dex: true,
446 host_supported: true,
447 }
448
449 cc_library_shared {
450 name: "mynativelib",
451 srcs: [
452 "Test.cpp",
453 "aidl/foo/bar/Test.aidl",
454 ],
455 export_include_dirs: ["include"],
456 aidl: {
457 export_aidl_headers: true,
458 },
459 system_shared_libs: [],
460 stl: "none",
461 }
Paul Duffin91547182019-11-12 19:39:36 +0000462
463 droidstubs {
464 name: "myjavaapistubs",
465 srcs: ["foo/bar/Foo.java"],
466 system_modules: "none",
467 sdk_version: "none",
468 }
Jiyong Park232e7852019-11-04 12:23:40 +0900469 `)
470
Paul Duffinac37c502019-11-26 18:02:20 +0000471 sdk := ctx.ModuleForTests("mysdk", "android_common").Module().(*sdk)
472
473 checkSnapshotAndroidBpContents(t, sdk, `// This is auto-generated. DO NOT EDIT.
474
475java_import {
476 name: "mysdk_myjavalib@current",
477 sdk_member_name: "myjavalib",
478 jars: ["java/myjavalib.jar"],
479}
480
481java_import {
482 name: "myjavalib",
483 prefer: false,
484 jars: ["java/myjavalib.jar"],
485}
486
487prebuilt_stubs_sources {
488 name: "mysdk_myjavaapistubs@current",
489 sdk_member_name: "myjavaapistubs",
490 srcs: ["java/myjavaapistubs_stubs_sources"],
491}
492
493prebuilt_stubs_sources {
494 name: "myjavaapistubs",
Paul Duffinac37c502019-11-26 18:02:20 +0000495 prefer: false,
Paul Duffinb1a88132019-11-26 21:55:37 +0000496 srcs: ["java/myjavaapistubs_stubs_sources"],
Paul Duffinac37c502019-11-26 18:02:20 +0000497}
498
499cc_prebuilt_library_shared {
500 name: "mysdk_mynativelib@current",
501 sdk_member_name: "mynativelib",
502 arch: {
503 arm64: {
504 srcs: ["arm64/lib/mynativelib.so"],
505 export_include_dirs: [
506 "arm64/include/include",
507 "arm64/include_gen/mynativelib",
508 ],
509 },
510 arm: {
511 srcs: ["arm/lib/mynativelib.so"],
512 export_include_dirs: [
513 "arm/include/include",
514 "arm/include_gen/mynativelib",
515 ],
516 },
517 },
518 stl: "none",
519 system_shared_libs: [],
520}
521
522cc_prebuilt_library_shared {
523 name: "mynativelib",
524 prefer: false,
525 arch: {
526 arm64: {
527 srcs: ["arm64/lib/mynativelib.so"],
528 export_include_dirs: [
529 "arm64/include/include",
530 "arm64/include_gen/mynativelib",
531 ],
532 },
533 arm: {
534 srcs: ["arm/lib/mynativelib.so"],
535 export_include_dirs: [
536 "arm/include/include",
537 "arm/include_gen/mynativelib",
538 ],
539 },
540 },
541 stl: "none",
542 system_shared_libs: [],
543}
544
545sdk_snapshot {
546 name: "mysdk@current",
Paul Duffinb645ec82019-11-27 17:43:54 +0000547 java_libs: ["mysdk_myjavalib@current"],
548 stubs_sources: ["mysdk_myjavaapistubs@current"],
549 native_shared_libs: ["mysdk_mynativelib@current"],
Paul Duffinac37c502019-11-26 18:02:20 +0000550}
551
552`)
553
Jiyong Park232e7852019-11-04 12:23:40 +0900554 var copySrcs []string
555 var copyDests []string
Paul Duffinac37c502019-11-26 18:02:20 +0000556 buildParams := sdk.BuildParamsForTests()
Paul Duffin375058f2019-11-29 20:17:53 +0000557 var mergeZipInputs []string
558 var intermediateZip string
559 var outputZip string
Jiyong Park232e7852019-11-04 12:23:40 +0900560 for _, bp := range buildParams {
Paul Duffin91547182019-11-12 19:39:36 +0000561 ruleString := bp.Rule.String()
Paul Duffin375058f2019-11-29 20:17:53 +0000562 if ruleString == android.Cp.String() {
Jiyong Park232e7852019-11-04 12:23:40 +0900563 copySrcs = append(copySrcs, bp.Input.String())
564 copyDests = append(copyDests, bp.Output.Rel()) // rooted at the snapshot root
Paul Duffin375058f2019-11-29 20:17:53 +0000565 } else if ruleString == zipFiles.String() {
566 intermediateZip = bp.Output.String()
567 } else if ruleString == mergeZips.String() {
568 input := bp.Input.String()
569 if intermediateZip != input {
570 t.Errorf("Intermediate zip %s is not an input to merge_zips, %s is used instead", intermediateZip, input)
571 }
572 mergeZipInputs = bp.Inputs.Strings()
573 outputZip = bp.Output.String()
Jiyong Park232e7852019-11-04 12:23:40 +0900574 }
575 }
576
577 buildDir := config.BuildDir()
578 ensureListContains(t, copySrcs, "aidl/foo/bar/Test.aidl")
579 ensureListContains(t, copySrcs, "include/Test.h")
580 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/BnTest.h"))
581 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/BpTest.h"))
582 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/Test.h"))
583 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/myjavalib/android_common/turbine-combined/myjavalib.jar"))
584 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/mynativelib.so"))
585
586 ensureListContains(t, copyDests, "aidl/aidl/foo/bar/Test.aidl")
587 ensureListContains(t, copyDests, "arm64/include/include/Test.h")
588 ensureListContains(t, copyDests, "arm64/include_gen/mynativelib/aidl/foo/bar/BnTest.h")
589 ensureListContains(t, copyDests, "arm64/include_gen/mynativelib/aidl/foo/bar/BpTest.h")
590 ensureListContains(t, copyDests, "arm64/include_gen/mynativelib/aidl/foo/bar/Test.h")
591 ensureListContains(t, copyDests, "java/myjavalib.jar")
592 ensureListContains(t, copyDests, "arm64/lib/mynativelib.so")
Paul Duffin91547182019-11-12 19:39:36 +0000593
Paul Duffin375058f2019-11-29 20:17:53 +0000594 expectedOutputZip := filepath.Join(buildDir, ".intermediates/mysdk/android_common/mysdk-current.zip")
595 expectedRepackagedZip := filepath.Join(buildDir, ".intermediates/mysdk/android_common/tmp/java/myjavaapistubs_stubs_sources.zip")
596
Paul Duffin91547182019-11-12 19:39:36 +0000597 // Ensure that the droidstubs .srcjar as repackaged into a temporary zip file
598 // and then merged together with the intermediate snapshot zip.
Paul Duffin375058f2019-11-29 20:17:53 +0000599 ensureListContains(t, mergeZipInputs, expectedRepackagedZip)
600 if outputZip != expectedOutputZip {
601 t.Errorf("Expected snapshot output to be %q but was %q", expectedOutputZip, outputZip)
Paul Duffin91547182019-11-12 19:39:36 +0000602 }
Jiyong Park232e7852019-11-04 12:23:40 +0900603}
604
Paul Duffine44358f2019-11-26 18:04:12 +0000605func TestHostSnapshot(t *testing.T) {
Paul Duffin46fc58e2019-12-03 15:40:55 +0000606 // b/145598135 - Generating host snapshots for anything other than linux is not supported.
607 SkipIfNotLinux(t)
608
Paul Duffine44358f2019-11-26 18:04:12 +0000609 ctx, config := testSdk(t, `
610 sdk {
611 name: "mysdk",
612 device_supported: false,
613 host_supported: true,
614 java_libs: ["myjavalib"],
615 native_shared_libs: ["mynativelib"],
616 stubs_sources: ["myjavaapistubs"],
617 }
618
619 java_library {
620 name: "myjavalib",
621 device_supported: false,
622 host_supported: true,
623 srcs: ["Test.java"],
624 aidl: {
625 export_include_dirs: ["aidl"],
626 },
627 system_modules: "none",
628 sdk_version: "none",
629 compile_dex: true,
630 }
631
632 cc_library_shared {
633 name: "mynativelib",
634 device_supported: false,
635 host_supported: true,
636 srcs: [
637 "Test.cpp",
638 "aidl/foo/bar/Test.aidl",
639 ],
640 export_include_dirs: ["include"],
641 aidl: {
642 export_aidl_headers: true,
643 },
644 system_shared_libs: [],
645 stl: "none",
646 }
647
648 droidstubs {
649 name: "myjavaapistubs",
650 device_supported: false,
651 host_supported: true,
652 srcs: ["foo/bar/Foo.java"],
653 system_modules: "none",
654 sdk_version: "none",
655 }
656 `)
657
658 sdk := ctx.ModuleForTests("mysdk", "linux_glibc_common").Module().(*sdk)
659
660 checkSnapshotAndroidBpContents(t, sdk, `// This is auto-generated. DO NOT EDIT.
661
662java_import {
663 name: "mysdk_myjavalib@current",
664 sdk_member_name: "myjavalib",
665 device_supported: false,
666 host_supported: true,
667 jars: ["java/myjavalib.jar"],
668}
669
670java_import {
671 name: "myjavalib",
672 prefer: false,
673 device_supported: false,
674 host_supported: true,
675 jars: ["java/myjavalib.jar"],
676}
677
678prebuilt_stubs_sources {
679 name: "mysdk_myjavaapistubs@current",
680 sdk_member_name: "myjavaapistubs",
681 device_supported: false,
682 host_supported: true,
683 srcs: ["java/myjavaapistubs_stubs_sources"],
684}
685
686prebuilt_stubs_sources {
687 name: "myjavaapistubs",
688 prefer: false,
689 device_supported: false,
690 host_supported: true,
691 srcs: ["java/myjavaapistubs_stubs_sources"],
692}
693
694cc_prebuilt_library_shared {
695 name: "mysdk_mynativelib@current",
696 sdk_member_name: "mynativelib",
697 device_supported: false,
698 host_supported: true,
699 arch: {
700 x86_64: {
701 srcs: ["x86_64/lib/mynativelib.so"],
702 export_include_dirs: [
703 "x86_64/include/include",
704 "x86_64/include_gen/mynativelib",
705 ],
706 },
707 x86: {
708 srcs: ["x86/lib/mynativelib.so"],
709 export_include_dirs: [
710 "x86/include/include",
711 "x86/include_gen/mynativelib",
712 ],
713 },
714 },
715 stl: "none",
716 system_shared_libs: [],
717}
718
719cc_prebuilt_library_shared {
720 name: "mynativelib",
721 prefer: false,
722 device_supported: false,
723 host_supported: true,
724 arch: {
725 x86_64: {
726 srcs: ["x86_64/lib/mynativelib.so"],
727 export_include_dirs: [
728 "x86_64/include/include",
729 "x86_64/include_gen/mynativelib",
730 ],
731 },
732 x86: {
733 srcs: ["x86/lib/mynativelib.so"],
734 export_include_dirs: [
735 "x86/include/include",
736 "x86/include_gen/mynativelib",
737 ],
738 },
739 },
740 stl: "none",
741 system_shared_libs: [],
742}
743
744sdk_snapshot {
745 name: "mysdk@current",
746 device_supported: false,
747 host_supported: true,
748 java_libs: ["mysdk_myjavalib@current"],
749 stubs_sources: ["mysdk_myjavaapistubs@current"],
750 native_shared_libs: ["mysdk_mynativelib@current"],
751}
752
753`)
754
755 var copySrcs []string
756 var copyDests []string
757 buildParams := sdk.BuildParamsForTests()
Paul Duffin375058f2019-11-29 20:17:53 +0000758 var mergeZipInputs []string
759 var intermediateZip string
760 var outputZip string
Paul Duffine44358f2019-11-26 18:04:12 +0000761 for _, bp := range buildParams {
762 ruleString := bp.Rule.String()
Paul Duffin375058f2019-11-29 20:17:53 +0000763 if ruleString == android.Cp.String() {
Paul Duffine44358f2019-11-26 18:04:12 +0000764 copySrcs = append(copySrcs, bp.Input.String())
765 copyDests = append(copyDests, bp.Output.Rel()) // rooted at the snapshot root
Paul Duffin375058f2019-11-29 20:17:53 +0000766 } else if ruleString == zipFiles.String() {
767 intermediateZip = bp.Output.String()
768 } else if ruleString == mergeZips.String() {
769 input := bp.Input.String()
770 if intermediateZip != input {
771 t.Errorf("Intermediate zip %s is not an input to merge_zips, %s is used instead", intermediateZip, input)
772 }
773 mergeZipInputs = bp.Inputs.Strings()
774 outputZip = bp.Output.String()
Paul Duffine44358f2019-11-26 18:04:12 +0000775 }
776 }
777
778 buildDir := config.BuildDir()
779 ensureListContains(t, copySrcs, "aidl/foo/bar/Test.aidl")
780 ensureListContains(t, copySrcs, "include/Test.h")
781 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BnTest.h"))
782 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BpTest.h"))
783 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/Test.h"))
784 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/myjavalib/linux_glibc_common/javac/myjavalib.jar"))
785 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so"))
786
787 ensureListContains(t, copyDests, "aidl/aidl/foo/bar/Test.aidl")
788 ensureListContains(t, copyDests, "x86_64/include/include/Test.h")
789 ensureListContains(t, copyDests, "x86_64/include_gen/mynativelib/aidl/foo/bar/BnTest.h")
790 ensureListContains(t, copyDests, "x86_64/include_gen/mynativelib/aidl/foo/bar/BpTest.h")
791 ensureListContains(t, copyDests, "x86_64/include_gen/mynativelib/aidl/foo/bar/Test.h")
792 ensureListContains(t, copyDests, "java/myjavalib.jar")
793 ensureListContains(t, copyDests, "x86_64/lib/mynativelib.so")
794
Paul Duffin375058f2019-11-29 20:17:53 +0000795 expectedOutputZip := filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/mysdk-current.zip")
796 expectedRepackagedZip := filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/tmp/java/myjavaapistubs_stubs_sources.zip")
797
Paul Duffine44358f2019-11-26 18:04:12 +0000798 // Ensure that the droidstubs .srcjar as repackaged into a temporary zip file
799 // and then merged together with the intermediate snapshot zip.
Paul Duffin375058f2019-11-29 20:17:53 +0000800 ensureListContains(t, mergeZipInputs, expectedRepackagedZip)
801 if outputZip != expectedOutputZip {
802 t.Errorf("Expected snapshot output to be %q but was %q", expectedOutputZip, outputZip)
Paul Duffine44358f2019-11-26 18:04:12 +0000803 }
804}
805
Paul Duffinac37c502019-11-26 18:02:20 +0000806func checkSnapshotAndroidBpContents(t *testing.T, s *sdk, expectedContents string) {
807 t.Helper()
808 androidBpContents := strings.NewReplacer("\\n", "\n").Replace(s.GetAndroidBpContentsForTests())
809 if androidBpContents != expectedContents {
810 t.Errorf("Android.bp contents do not match, expected %s, actual %s", expectedContents, androidBpContents)
811 }
812}
813
Jiyong Parkd1063c12019-07-17 20:08:41 +0900814var buildDir string
815
816func setUp() {
817 var err error
818 buildDir, err = ioutil.TempDir("", "soong_sdk_test")
819 if err != nil {
820 panic(err)
821 }
822}
823
824func tearDown() {
Paul Duffin375058f2019-11-29 20:17:53 +0000825 _ = os.RemoveAll(buildDir)
Jiyong Parkd1063c12019-07-17 20:08:41 +0900826}
827
828func TestMain(m *testing.M) {
829 run := func() int {
830 setUp()
831 defer tearDown()
832
833 return m.Run()
834 }
835
836 os.Exit(run())
837}
Paul Duffin46fc58e2019-12-03 15:40:55 +0000838
839func SkipIfNotLinux(t *testing.T) {
840 t.Helper()
841 if android.BuildOs != android.Linux {
842 t.Skipf("Skipping as sdk snapshot generation is only supported on %s not %s", android.Linux, android.BuildOs)
843 }
844}