blob: 6b92d2761f467e7dbe3ca9be47993b230c5a61d8 [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
30func testSdkContext(t *testing.T, bp string) (*android.TestContext, android.Config) {
31 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) {
117 ctx, config := testSdkContext(t, bp)
118 _, 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()
127 ctx, config := testSdkContext(t, bp)
128 _, 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 {
150 ret := []string{}
151 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",
161 java_libs: ["sdkmember"],
162 }
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 Duffin91547182019-11-12 19:39:36 +0000557 var zipBp android.BuildParams
Jiyong Park232e7852019-11-04 12:23:40 +0900558 for _, bp := range buildParams {
Paul Duffin91547182019-11-12 19:39:36 +0000559 ruleString := bp.Rule.String()
560 if ruleString == "android/soong/android.Cp" {
Jiyong Park232e7852019-11-04 12:23:40 +0900561 copySrcs = append(copySrcs, bp.Input.String())
562 copyDests = append(copyDests, bp.Output.Rel()) // rooted at the snapshot root
Paul Duffin91547182019-11-12 19:39:36 +0000563 } else if ruleString == "<local rule>:m.mysdk_android_common.snapshot" {
564 zipBp = bp
Jiyong Park232e7852019-11-04 12:23:40 +0900565 }
566 }
567
568 buildDir := config.BuildDir()
569 ensureListContains(t, copySrcs, "aidl/foo/bar/Test.aidl")
570 ensureListContains(t, copySrcs, "include/Test.h")
571 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/BnTest.h"))
572 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/BpTest.h"))
573 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/Test.h"))
574 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/myjavalib/android_common/turbine-combined/myjavalib.jar"))
575 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/android_arm64_armv8-a_core_shared/mynativelib.so"))
576
577 ensureListContains(t, copyDests, "aidl/aidl/foo/bar/Test.aidl")
578 ensureListContains(t, copyDests, "arm64/include/include/Test.h")
579 ensureListContains(t, copyDests, "arm64/include_gen/mynativelib/aidl/foo/bar/BnTest.h")
580 ensureListContains(t, copyDests, "arm64/include_gen/mynativelib/aidl/foo/bar/BpTest.h")
581 ensureListContains(t, copyDests, "arm64/include_gen/mynativelib/aidl/foo/bar/Test.h")
582 ensureListContains(t, copyDests, "java/myjavalib.jar")
583 ensureListContains(t, copyDests, "arm64/lib/mynativelib.so")
Paul Duffin91547182019-11-12 19:39:36 +0000584
585 // Ensure that the droidstubs .srcjar as repackaged into a temporary zip file
586 // and then merged together with the intermediate snapshot zip.
587 snapshotCreationInputs := zipBp.Implicits.Strings()
588 ensureListContains(t, snapshotCreationInputs,
589 filepath.Join(buildDir, ".intermediates/mysdk/android_common/tmp/java/myjavaapistubs_stubs_sources.zip"))
590 ensureListContains(t, snapshotCreationInputs,
591 filepath.Join(buildDir, ".intermediates/mysdk/android_common/mysdk-current.unmerged.zip"))
592 actual := zipBp.Output.String()
593 expected := filepath.Join(buildDir, ".intermediates/mysdk/android_common/mysdk-current.zip")
594 if actual != expected {
595 t.Errorf("Expected snapshot output to be %q but was %q", expected, actual)
596 }
Jiyong Park232e7852019-11-04 12:23:40 +0900597}
598
Paul Duffine44358f2019-11-26 18:04:12 +0000599func TestHostSnapshot(t *testing.T) {
600 ctx, config := testSdk(t, `
601 sdk {
602 name: "mysdk",
603 device_supported: false,
604 host_supported: true,
605 java_libs: ["myjavalib"],
606 native_shared_libs: ["mynativelib"],
607 stubs_sources: ["myjavaapistubs"],
608 }
609
610 java_library {
611 name: "myjavalib",
612 device_supported: false,
613 host_supported: true,
614 srcs: ["Test.java"],
615 aidl: {
616 export_include_dirs: ["aidl"],
617 },
618 system_modules: "none",
619 sdk_version: "none",
620 compile_dex: true,
621 }
622
623 cc_library_shared {
624 name: "mynativelib",
625 device_supported: false,
626 host_supported: true,
627 srcs: [
628 "Test.cpp",
629 "aidl/foo/bar/Test.aidl",
630 ],
631 export_include_dirs: ["include"],
632 aidl: {
633 export_aidl_headers: true,
634 },
635 system_shared_libs: [],
636 stl: "none",
637 }
638
639 droidstubs {
640 name: "myjavaapistubs",
641 device_supported: false,
642 host_supported: true,
643 srcs: ["foo/bar/Foo.java"],
644 system_modules: "none",
645 sdk_version: "none",
646 }
647 `)
648
649 sdk := ctx.ModuleForTests("mysdk", "linux_glibc_common").Module().(*sdk)
650
651 checkSnapshotAndroidBpContents(t, sdk, `// This is auto-generated. DO NOT EDIT.
652
653java_import {
654 name: "mysdk_myjavalib@current",
655 sdk_member_name: "myjavalib",
656 device_supported: false,
657 host_supported: true,
658 jars: ["java/myjavalib.jar"],
659}
660
661java_import {
662 name: "myjavalib",
663 prefer: false,
664 device_supported: false,
665 host_supported: true,
666 jars: ["java/myjavalib.jar"],
667}
668
669prebuilt_stubs_sources {
670 name: "mysdk_myjavaapistubs@current",
671 sdk_member_name: "myjavaapistubs",
672 device_supported: false,
673 host_supported: true,
674 srcs: ["java/myjavaapistubs_stubs_sources"],
675}
676
677prebuilt_stubs_sources {
678 name: "myjavaapistubs",
679 prefer: false,
680 device_supported: false,
681 host_supported: true,
682 srcs: ["java/myjavaapistubs_stubs_sources"],
683}
684
685cc_prebuilt_library_shared {
686 name: "mysdk_mynativelib@current",
687 sdk_member_name: "mynativelib",
688 device_supported: false,
689 host_supported: true,
690 arch: {
691 x86_64: {
692 srcs: ["x86_64/lib/mynativelib.so"],
693 export_include_dirs: [
694 "x86_64/include/include",
695 "x86_64/include_gen/mynativelib",
696 ],
697 },
698 x86: {
699 srcs: ["x86/lib/mynativelib.so"],
700 export_include_dirs: [
701 "x86/include/include",
702 "x86/include_gen/mynativelib",
703 ],
704 },
705 },
706 stl: "none",
707 system_shared_libs: [],
708}
709
710cc_prebuilt_library_shared {
711 name: "mynativelib",
712 prefer: false,
713 device_supported: false,
714 host_supported: true,
715 arch: {
716 x86_64: {
717 srcs: ["x86_64/lib/mynativelib.so"],
718 export_include_dirs: [
719 "x86_64/include/include",
720 "x86_64/include_gen/mynativelib",
721 ],
722 },
723 x86: {
724 srcs: ["x86/lib/mynativelib.so"],
725 export_include_dirs: [
726 "x86/include/include",
727 "x86/include_gen/mynativelib",
728 ],
729 },
730 },
731 stl: "none",
732 system_shared_libs: [],
733}
734
735sdk_snapshot {
736 name: "mysdk@current",
737 device_supported: false,
738 host_supported: true,
739 java_libs: ["mysdk_myjavalib@current"],
740 stubs_sources: ["mysdk_myjavaapistubs@current"],
741 native_shared_libs: ["mysdk_mynativelib@current"],
742}
743
744`)
745
746 var copySrcs []string
747 var copyDests []string
748 buildParams := sdk.BuildParamsForTests()
749 var zipBp android.BuildParams
750 for _, bp := range buildParams {
751 ruleString := bp.Rule.String()
752 if ruleString == "android/soong/android.Cp" {
753 copySrcs = append(copySrcs, bp.Input.String())
754 copyDests = append(copyDests, bp.Output.Rel()) // rooted at the snapshot root
755 } else if ruleString == "<local rule>:m.mysdk_linux_glibc_common.snapshot" {
756 zipBp = bp
757 }
758 }
759
760 buildDir := config.BuildDir()
761 ensureListContains(t, copySrcs, "aidl/foo/bar/Test.aidl")
762 ensureListContains(t, copySrcs, "include/Test.h")
763 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BnTest.h"))
764 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BpTest.h"))
765 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/Test.h"))
766 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/myjavalib/linux_glibc_common/javac/myjavalib.jar"))
767 ensureListContains(t, copySrcs, filepath.Join(buildDir, ".intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so"))
768
769 ensureListContains(t, copyDests, "aidl/aidl/foo/bar/Test.aidl")
770 ensureListContains(t, copyDests, "x86_64/include/include/Test.h")
771 ensureListContains(t, copyDests, "x86_64/include_gen/mynativelib/aidl/foo/bar/BnTest.h")
772 ensureListContains(t, copyDests, "x86_64/include_gen/mynativelib/aidl/foo/bar/BpTest.h")
773 ensureListContains(t, copyDests, "x86_64/include_gen/mynativelib/aidl/foo/bar/Test.h")
774 ensureListContains(t, copyDests, "java/myjavalib.jar")
775 ensureListContains(t, copyDests, "x86_64/lib/mynativelib.so")
776
777 // Ensure that the droidstubs .srcjar as repackaged into a temporary zip file
778 // and then merged together with the intermediate snapshot zip.
779 snapshotCreationInputs := zipBp.Implicits.Strings()
780 ensureListContains(t, snapshotCreationInputs,
781 filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/tmp/java/myjavaapistubs_stubs_sources.zip"))
782 ensureListContains(t, snapshotCreationInputs,
783 filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/mysdk-current.unmerged.zip"))
784 actual := zipBp.Output.String()
785 expected := filepath.Join(buildDir, ".intermediates/mysdk/linux_glibc_common/mysdk-current.zip")
786 if actual != expected {
787 t.Errorf("Expected snapshot output to be %q but was %q", expected, actual)
788 }
789}
790
Paul Duffinac37c502019-11-26 18:02:20 +0000791func checkSnapshotAndroidBpContents(t *testing.T, s *sdk, expectedContents string) {
792 t.Helper()
793 androidBpContents := strings.NewReplacer("\\n", "\n").Replace(s.GetAndroidBpContentsForTests())
794 if androidBpContents != expectedContents {
795 t.Errorf("Android.bp contents do not match, expected %s, actual %s", expectedContents, androidBpContents)
796 }
797}
798
Jiyong Parkd1063c12019-07-17 20:08:41 +0900799var buildDir string
800
801func setUp() {
802 var err error
803 buildDir, err = ioutil.TempDir("", "soong_sdk_test")
804 if err != nil {
805 panic(err)
806 }
807}
808
809func tearDown() {
810 os.RemoveAll(buildDir)
811}
812
813func TestMain(m *testing.M) {
814 run := func() int {
815 setUp()
816 defer tearDown()
817
818 return m.Run()
819 }
820
821 os.Exit(run())
822}