blob: 942556a323e99d058abe7e76868a8a5e415426b6 [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"
20 "strings"
21 "testing"
22
23 "android/soong/android"
24 "android/soong/apex"
25 "android/soong/cc"
26 "android/soong/java"
27)
28
29func testSdkContext(t *testing.T, bp string) (*android.TestContext, android.Config) {
30 config := android.TestArchConfig(buildDir, nil)
31 ctx := android.NewTestArchContext()
32
33 // from android package
34 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
35 ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
36 ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
37 })
38 ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
39 ctx.TopDown("prebuilt_select", android.PrebuiltSelectModuleMutator).Parallel()
40 ctx.BottomUp("prebuilt_postdeps", android.PrebuiltPostDepsMutator).Parallel()
41 })
42
43 // from java package
44 ctx.RegisterModuleType("android_app_certificate", android.ModuleFactoryAdaptor(java.AndroidAppCertificateFactory))
45 ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(java.LibraryFactory))
46 ctx.RegisterModuleType("java_import", android.ModuleFactoryAdaptor(java.ImportFactory))
47
48 // from cc package
49 ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
50 ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
51 ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(cc.ObjectFactory))
52 ctx.RegisterModuleType("cc_prebuilt_library_shared", android.ModuleFactoryAdaptor(cc.PrebuiltSharedLibraryFactory))
53 ctx.RegisterModuleType("cc_prebuilt_library_static", android.ModuleFactoryAdaptor(cc.PrebuiltStaticLibraryFactory))
54 ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(cc.LlndkLibraryFactory))
55 ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(cc.ToolchainLibraryFactory))
56 ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
57 ctx.BottomUp("image", cc.ImageMutator).Parallel()
58 ctx.BottomUp("link", cc.LinkageMutator).Parallel()
59 ctx.BottomUp("vndk", cc.VndkMutator).Parallel()
60 ctx.BottomUp("test_per_src", cc.TestPerSrcMutator).Parallel()
61 ctx.BottomUp("version", cc.VersionMutator).Parallel()
62 ctx.BottomUp("begin", cc.BeginMutator).Parallel()
63 })
64
65 // from apex package
66 ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(apex.BundleFactory))
67 ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apex.ApexKeyFactory))
68 ctx.PostDepsMutators(apex.RegisterPostDepsMutators)
69
70 // from this package
71 ctx.RegisterModuleType("sdk", android.ModuleFactoryAdaptor(ModuleFactory))
Jiyong Park9b409bc2019-10-11 14:59:13 +090072 ctx.RegisterModuleType("sdk_snapshot", android.ModuleFactoryAdaptor(SnapshotModuleFactory))
Jiyong Parkd1063c12019-07-17 20:08:41 +090073 ctx.PreDepsMutators(RegisterPreDepsMutators)
74 ctx.PostDepsMutators(RegisterPostDepsMutators)
75
76 ctx.Register()
77
78 bp = bp + `
79 apex_key {
80 name: "myapex.key",
81 public_key: "myapex.avbpubkey",
82 private_key: "myapex.pem",
83 }
84
85 android_app_certificate {
86 name: "myapex.cert",
87 certificate: "myapex",
88 }
89 ` + cc.GatherRequiredDepsForTest(android.Android)
90
91 ctx.MockFileSystem(map[string][]byte{
92 "Android.bp": []byte(bp),
93 "build/make/target/product/security": nil,
94 "apex_manifest.json": nil,
95 "system/sepolicy/apex/myapex-file_contexts": nil,
96 "system/sepolicy/apex/myapex2-file_contexts": nil,
97 "myapex.avbpubkey": nil,
98 "myapex.pem": nil,
99 "myapex.x509.pem": nil,
100 "myapex.pk8": nil,
101 "Test.java": nil,
102 "Test.cpp": nil,
103 "libfoo.so": nil,
104 })
105
106 return ctx, config
107}
108
109func testSdk(t *testing.T, bp string) (*android.TestContext, android.Config) {
110 ctx, config := testSdkContext(t, bp)
111 _, errs := ctx.ParseFileList(".", []string{"Android.bp"})
112 android.FailIfErrored(t, errs)
113 _, errs = ctx.PrepareBuildActions(config)
114 android.FailIfErrored(t, errs)
115 return ctx, config
116}
117
118// ensure that 'result' contains 'expected'
119func ensureContains(t *testing.T, result string, expected string) {
120 t.Helper()
121 if !strings.Contains(result, expected) {
122 t.Errorf("%q is not found in %q", expected, result)
123 }
124}
125
126// ensures that 'result' does not contain 'notExpected'
127func ensureNotContains(t *testing.T, result string, notExpected string) {
128 t.Helper()
129 if strings.Contains(result, notExpected) {
130 t.Errorf("%q is found in %q", notExpected, result)
131 }
132}
133
134func ensureListContains(t *testing.T, result []string, expected string) {
135 t.Helper()
136 if !android.InList(expected, result) {
137 t.Errorf("%q is not found in %v", expected, result)
138 }
139}
140
141func ensureListNotContains(t *testing.T, result []string, notExpected string) {
142 t.Helper()
143 if android.InList(notExpected, result) {
144 t.Errorf("%q is found in %v", notExpected, result)
145 }
146}
147
148func pathsToStrings(paths android.Paths) []string {
149 ret := []string{}
150 for _, p := range paths {
151 ret = append(ret, p.String())
152 }
153 return ret
154}
155
156func TestBasicSdkWithJava(t *testing.T) {
157 ctx, _ := testSdk(t, `
158 sdk {
Jiyong Park9b409bc2019-10-11 14:59:13 +0900159 name: "mysdk",
160 java_libs: ["sdkmember"],
161 }
162
163 sdk_snapshot {
164 name: "mysdk@1",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900165 java_libs: ["sdkmember_mysdk_1"],
166 }
167
Jiyong Park9b409bc2019-10-11 14:59:13 +0900168 sdk_snapshot {
169 name: "mysdk@2",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900170 java_libs: ["sdkmember_mysdk_2"],
171 }
172
173 java_import {
174 name: "sdkmember",
175 prefer: false,
176 host_supported: true,
177 }
178
179 java_import {
180 name: "sdkmember_mysdk_1",
181 sdk_member_name: "sdkmember",
182 host_supported: true,
183 }
184
185 java_import {
186 name: "sdkmember_mysdk_2",
187 sdk_member_name: "sdkmember",
188 host_supported: true,
189 }
190
191 java_library {
192 name: "myjavalib",
193 srcs: ["Test.java"],
194 libs: ["sdkmember"],
195 system_modules: "none",
196 sdk_version: "none",
197 compile_dex: true,
198 host_supported: true,
199 }
200
201 apex {
202 name: "myapex",
203 java_libs: ["myjavalib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900204 uses_sdks: ["mysdk@1"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900205 key: "myapex.key",
206 certificate: ":myapex.cert",
207 }
208
209 apex {
210 name: "myapex2",
211 java_libs: ["myjavalib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900212 uses_sdks: ["mysdk@2"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900213 key: "myapex.key",
214 certificate: ":myapex.cert",
215 }
216 `)
217
218 sdkMemberV1 := ctx.ModuleForTests("sdkmember_mysdk_1", "android_common_myapex").Rule("combineJar").Output
219 sdkMemberV2 := ctx.ModuleForTests("sdkmember_mysdk_2", "android_common_myapex2").Rule("combineJar").Output
220
221 javalibForMyApex := ctx.ModuleForTests("myjavalib", "android_common_myapex")
222 javalibForMyApex2 := ctx.ModuleForTests("myjavalib", "android_common_myapex2")
223
224 // Depending on the uses_sdks value, different libs are linked
225 ensureListContains(t, pathsToStrings(javalibForMyApex.Rule("javac").Implicits), sdkMemberV1.String())
226 ensureListContains(t, pathsToStrings(javalibForMyApex2.Rule("javac").Implicits), sdkMemberV2.String())
227}
228
229func TestBasicSdkWithCc(t *testing.T) {
230 ctx, _ := testSdk(t, `
231 sdk {
Jiyong Park9b409bc2019-10-11 14:59:13 +0900232 name: "mysdk",
233 native_shared_libs: ["sdkmember"],
234 }
235
236 sdk_snapshot {
237 name: "mysdk@1",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900238 native_shared_libs: ["sdkmember_mysdk_1"],
239 }
240
Jiyong Park9b409bc2019-10-11 14:59:13 +0900241 sdk_snapshot {
242 name: "mysdk@2",
Jiyong Parkd1063c12019-07-17 20:08:41 +0900243 native_shared_libs: ["sdkmember_mysdk_2"],
244 }
245
246 cc_prebuilt_library_shared {
247 name: "sdkmember",
248 srcs: ["libfoo.so"],
249 prefer: false,
250 system_shared_libs: [],
251 stl: "none",
252 }
253
254 cc_prebuilt_library_shared {
255 name: "sdkmember_mysdk_1",
256 sdk_member_name: "sdkmember",
257 srcs: ["libfoo.so"],
258 system_shared_libs: [],
259 stl: "none",
260 }
261
262 cc_prebuilt_library_shared {
263 name: "sdkmember_mysdk_2",
264 sdk_member_name: "sdkmember",
265 srcs: ["libfoo.so"],
266 system_shared_libs: [],
267 stl: "none",
268 }
269
270 cc_library_shared {
271 name: "mycpplib",
272 srcs: ["Test.cpp"],
273 shared_libs: ["sdkmember"],
274 system_shared_libs: [],
275 stl: "none",
276 }
277
278 apex {
279 name: "myapex",
280 native_shared_libs: ["mycpplib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900281 uses_sdks: ["mysdk@1"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900282 key: "myapex.key",
283 certificate: ":myapex.cert",
284 }
285
286 apex {
287 name: "myapex2",
288 native_shared_libs: ["mycpplib"],
Jiyong Park9b409bc2019-10-11 14:59:13 +0900289 uses_sdks: ["mysdk@2"],
Jiyong Parkd1063c12019-07-17 20:08:41 +0900290 key: "myapex.key",
291 certificate: ":myapex.cert",
292 }
293 `)
294
295 sdkMemberV1 := ctx.ModuleForTests("sdkmember_mysdk_1", "android_arm64_armv8-a_core_shared_myapex").Rule("toc").Output
296 sdkMemberV2 := ctx.ModuleForTests("sdkmember_mysdk_2", "android_arm64_armv8-a_core_shared_myapex2").Rule("toc").Output
297
298 cpplibForMyApex := ctx.ModuleForTests("mycpplib", "android_arm64_armv8-a_core_shared_myapex")
299 cpplibForMyApex2 := ctx.ModuleForTests("mycpplib", "android_arm64_armv8-a_core_shared_myapex2")
300
301 // Depending on the uses_sdks value, different libs are linked
302 ensureListContains(t, pathsToStrings(cpplibForMyApex.Rule("ld").Implicits), sdkMemberV1.String())
303 ensureListContains(t, pathsToStrings(cpplibForMyApex2.Rule("ld").Implicits), sdkMemberV2.String())
304}
305
306var buildDir string
307
308func setUp() {
309 var err error
310 buildDir, err = ioutil.TempDir("", "soong_sdk_test")
311 if err != nil {
312 panic(err)
313 }
314}
315
316func tearDown() {
317 os.RemoveAll(buildDir)
318}
319
320func TestMain(m *testing.M) {
321 run := func() int {
322 setUp()
323 defer tearDown()
324
325 return m.Run()
326 }
327
328 os.Exit(run())
329}