blob: 8ed94b49841b2c1be04985847f10094dfcf6a2eb [file] [log] [blame]
Romain Jobredeaux1282c422021-10-29 10:52:59 -04001// Copyright 2021 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 bp2build
16
17import (
18 "android/soong/android"
19 "android/soong/java"
20
21 "testing"
22)
23
Sam Delmerico3177a6e2022-06-21 19:28:33 +000024func runAndroidAppTestCase(t *testing.T, tc Bp2buildTestCase) {
Romain Jobredeaux1282c422021-10-29 10:52:59 -040025 t.Helper()
Sam Delmerico3177a6e2022-06-21 19:28:33 +000026 RunBp2BuildTestCase(t, registerAndroidAppModuleTypes, tc)
Romain Jobredeaux1282c422021-10-29 10:52:59 -040027}
28
29func registerAndroidAppModuleTypes(ctx android.RegistrationContext) {
Jingwen Chen6817bbb2022-10-14 09:56:07 +000030 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Alix6c087cf2023-01-05 21:12:31 +000031 ctx.RegisterModuleType("java_library", java.LibraryFactory)
Romain Jobredeaux1282c422021-10-29 10:52:59 -040032}
33
34func TestMinimalAndroidApp(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +000035 runAndroidAppTestCase(t, Bp2buildTestCase{
36 Description: "Android app - simple example",
37 ModuleTypeUnderTest: "android_app",
38 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
39 Filesystem: map[string]string{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040040 "app.java": "",
41 "res/res.png": "",
42 "AndroidManifest.xml": "",
Romain Jobredeaux7a71e072023-08-16 17:39:12 -040043 "assets/asset.png": "",
Romain Jobredeaux1282c422021-10-29 10:52:59 -040044 },
Sam Delmerico3177a6e2022-06-21 19:28:33 +000045 Blueprint: `
Romain Jobredeaux1282c422021-10-29 10:52:59 -040046android_app {
47 name: "TestApp",
48 srcs: ["app.java"],
49 sdk_version: "current",
50}
51`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +000052 ExpectedBazelTargets: []string{
Alixe06d75b2022-08-31 18:28:19 +000053 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040054 "srcs": `["app.java"]`,
55 "manifest": `"AndroidManifest.xml"`,
56 "resource_files": `["res/res.png"]`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -050057 "sdk_version": `"current"`,
Romain Jobredeaux7a71e072023-08-16 17:39:12 -040058 "assets": `["assets/asset.png"]`,
59 "assets_dir": `"assets"`,
Romain Jobredeaux1282c422021-10-29 10:52:59 -040060 }),
61 }})
62}
63
64func TestAndroidAppAllSupportedFields(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +000065 runAndroidAppTestCase(t, Bp2buildTestCase{
66 Description: "Android app - all supported fields",
67 ModuleTypeUnderTest: "android_app",
68 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
69 Filesystem: map[string]string{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040070 "app.java": "",
71 "resa/res.png": "",
72 "resb/res.png": "",
73 "manifest/AndroidManifest.xml": "",
Romain Jobredeaux7a71e072023-08-16 17:39:12 -040074 "assets_/asset.png": "",
Romain Jobredeaux1282c422021-10-29 10:52:59 -040075 },
Sam Delmerico3177a6e2022-06-21 19:28:33 +000076 Blueprint: simpleModuleDoNotConvertBp2build("android_app", "static_lib_dep") + `
Romain Jobredeaux1282c422021-10-29 10:52:59 -040077android_app {
78 name: "TestApp",
79 srcs: ["app.java"],
80 sdk_version: "current",
81 package_name: "com.google",
82 resource_dirs: ["resa", "resb"],
83 manifest: "manifest/AndroidManifest.xml",
Vinh Tran3ac6daf2022-04-22 19:09:58 -040084 static_libs: ["static_lib_dep"],
85 java_version: "7",
Jingwen Chen6817bbb2022-10-14 09:56:07 +000086 certificate: "foocert",
Romain Jobredeaux56d41d02023-05-09 16:34:16 -040087 required: ["static_lib_dep"],
Romain Jobredeaux7a71e072023-08-16 17:39:12 -040088 asset_dirs: ["assets_"],
Romain Jobredeaux1282c422021-10-29 10:52:59 -040089}
90`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +000091 ExpectedBazelTargets: []string{
Alixe06d75b2022-08-31 18:28:19 +000092 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040093 "srcs": `["app.java"]`,
94 "manifest": `"manifest/AndroidManifest.xml"`,
95 "resource_files": `[
96 "resa/res.png",
97 "resb/res.png",
98 ]`,
Romain Jobredeaux7a71e072023-08-16 17:39:12 -040099 "assets": `["assets_/asset.png"]`,
100 "assets_dir": `"assets_"`,
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000101 "custom_package": `"com.google"`,
102 "deps": `[":static_lib_dep"]`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500103 "java_version": `"7"`,
104 "sdk_version": `"current"`,
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000105 "certificate_name": `"foocert"`,
Romain Jobredeaux1282c422021-10-29 10:52:59 -0400106 }),
107 }})
108}
Sam Delmericoe91d0302022-02-23 15:28:33 +0000109
110func TestAndroidAppArchVariantSrcs(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000111 runAndroidAppTestCase(t, Bp2buildTestCase{
112 Description: "Android app - arch variant srcs",
113 ModuleTypeUnderTest: "android_app",
114 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
115 Filesystem: map[string]string{
Sam Delmericoe91d0302022-02-23 15:28:33 +0000116 "arm.java": "",
117 "x86.java": "",
118 "res/res.png": "",
119 "AndroidManifest.xml": "",
120 },
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000121 Blueprint: `
Sam Delmericoe91d0302022-02-23 15:28:33 +0000122android_app {
123 name: "TestApp",
124 sdk_version: "current",
125 arch: {
126 arm: {
127 srcs: ["arm.java"],
128 },
129 x86: {
130 srcs: ["x86.java"],
131 }
132 }
133}
134`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000135 ExpectedBazelTargets: []string{
Alixe06d75b2022-08-31 18:28:19 +0000136 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
Sam Delmericoe91d0302022-02-23 15:28:33 +0000137 "srcs": `select({
138 "//build/bazel/platforms/arch:arm": ["arm.java"],
139 "//build/bazel/platforms/arch:x86": ["x86.java"],
140 "//conditions:default": [],
141 })`,
142 "manifest": `"AndroidManifest.xml"`,
143 "resource_files": `["res/res.png"]`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500144 "sdk_version": `"current"`,
Sam Delmericoe91d0302022-02-23 15:28:33 +0000145 }),
146 }})
147}
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000148
149func TestAndroidAppCertIsModule(t *testing.T) {
150 runAndroidAppTestCase(t, Bp2buildTestCase{
151 Description: "Android app - cert is module",
152 ModuleTypeUnderTest: "android_app",
153 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
154 Filesystem: map[string]string{},
155 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
156android_app {
157 name: "TestApp",
158 certificate: ":foocert",
159}
160`,
161 ExpectedBazelTargets: []string{
162 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
163 "certificate": `":foocert"`,
164 "manifest": `"AndroidManifest.xml"`,
165 "resource_files": `[]`,
166 }),
167 }})
168}
169
170func TestAndroidAppCertIsSrcFile(t *testing.T) {
171 runAndroidAppTestCase(t, Bp2buildTestCase{
172 Description: "Android app - cert is src file",
173 ModuleTypeUnderTest: "android_app",
174 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
175 Filesystem: map[string]string{
176 "foocert": "",
177 },
178 Blueprint: `
179android_app {
180 name: "TestApp",
181 certificate: "foocert",
182}
183`,
184 ExpectedBazelTargets: []string{
185 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
186 "certificate": `"foocert"`,
187 "manifest": `"AndroidManifest.xml"`,
188 "resource_files": `[]`,
189 }),
190 }})
191}
192
193func TestAndroidAppCertIsNotSrcOrModule(t *testing.T) {
194 runAndroidAppTestCase(t, Bp2buildTestCase{
195 Description: "Android app - cert is not src or module",
196 ModuleTypeUnderTest: "android_app",
197 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
198 Filesystem: map[string]string{
199 // deliberate empty
200 },
201 Blueprint: `
202android_app {
203 name: "TestApp",
204 certificate: "foocert",
205}
206`,
207 ExpectedBazelTargets: []string{
208 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
209 "certificate_name": `"foocert"`,
210 "manifest": `"AndroidManifest.xml"`,
211 "resource_files": `[]`,
212 }),
213 }})
214}
Alix6c087cf2023-01-05 21:12:31 +0000215
216func TestAndroidAppLibs(t *testing.T) {
217 runAndroidAppTestCase(t, Bp2buildTestCase{
218 Description: "Android app with libs",
219 ModuleTypeUnderTest: "android_app",
220 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
221 Filesystem: map[string]string{},
222 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
223android_app {
224 name: "foo",
225 libs: ["barLib"]
226}
227java_library{
228 name: "barLib",
229}
230`,
231 ExpectedBazelTargets: []string{
232 MakeBazelTarget("java_library", "barLib", AttrNameToString{}),
233 MakeNeverlinkDuplicateTarget("java_library", "barLib"),
234 MakeBazelTarget("android_binary", "foo", AttrNameToString{
235 "manifest": `"AndroidManifest.xml"`,
236 "resource_files": `[]`,
237 "deps": `[":barLib-neverlink"]`,
238 }),
239 }})
240}
Alix0856f9e2023-01-20 22:15:30 +0000241
242func TestAndroidAppKotlinSrcs(t *testing.T) {
243 runAndroidAppTestCase(t, Bp2buildTestCase{
244 Description: "Android app with kotlin sources and common_srcs",
245 ModuleTypeUnderTest: "android_app",
246 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
247 Filesystem: map[string]string{
248 "res/res.png": "",
249 },
250 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
251android_app {
252 name: "foo",
253 srcs: ["a.java", "b.kt"],
254 certificate: ":foocert",
255 manifest: "fooManifest.xml",
256 libs: ["barLib"]
257}
258java_library{
259 name: "barLib",
260}
261`,
262 ExpectedBazelTargets: []string{
263 MakeBazelTarget("java_library", "barLib", AttrNameToString{}),
264 MakeNeverlinkDuplicateTarget("java_library", "barLib"),
265 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
266 "srcs": `[
267 "a.java",
268 "b.kt",
269 ]`,
270 "manifest": `"fooManifest.xml"`,
271 "resource_files": `["res/res.png"]`,
272 "deps": `[":barLib-neverlink"]`,
273 }),
274 MakeBazelTarget("android_binary", "foo", AttrNameToString{
275 "deps": `[":foo_kt"]`,
276 "certificate": `":foocert"`,
277 "manifest": `"fooManifest.xml"`,
278 }),
279 }})
280}
281
282func TestAndroidAppCommonSrcs(t *testing.T) {
283 runAndroidAppTestCase(t, Bp2buildTestCase{
284 Description: "Android app with common_srcs",
285 ModuleTypeUnderTest: "android_app",
286 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
287 Filesystem: map[string]string{
288 "res/res.png": "",
289 },
290 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
291android_app {
292 name: "foo",
293 srcs: ["a.java"],
294 common_srcs: ["b.kt"],
295 certificate: "foocert",
296 manifest: "fooManifest.xml",
297 libs: ["barLib"],
298}
299java_library{
300 name: "barLib",
301}
302`,
303 ExpectedBazelTargets: []string{
304 MakeBazelTarget("java_library", "barLib", AttrNameToString{}),
305 MakeNeverlinkDuplicateTarget("java_library", "barLib"),
306 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
307 "srcs": `["a.java"]`,
308 "common_srcs": `["b.kt"]`,
309 "manifest": `"fooManifest.xml"`,
310 "resource_files": `["res/res.png"]`,
311 "deps": `[":barLib-neverlink"]`,
312 }),
313 MakeBazelTarget("android_binary", "foo", AttrNameToString{
314 "deps": `[":foo_kt"]`,
315 "certificate_name": `"foocert"`,
316 "manifest": `"fooManifest.xml"`,
317 }),
318 }})
319}
Alixf848bf82023-03-06 19:43:55 +0000320
321func TestAndroidAppKotlinCflags(t *testing.T) {
322 runAndroidAppTestCase(t, Bp2buildTestCase{
323 Description: "Android app with kotlincflags",
324 ModuleTypeUnderTest: "android_app",
325 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
326 Filesystem: map[string]string{
327 "res/res.png": "",
328 },
329 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
330android_app {
331 name: "foo",
332 srcs: ["a.java", "b.kt"],
333 certificate: ":foocert",
334 manifest: "fooManifest.xml",
335 kotlincflags: ["-flag1", "-flag2"],
336}
337`,
338 ExpectedBazelTargets: []string{
339 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
340 "srcs": `[
341 "a.java",
342 "b.kt",
343 ]`,
344 "manifest": `"fooManifest.xml"`,
345 "resource_files": `["res/res.png"]`,
346 "kotlincflags": `[
347 "-flag1",
348 "-flag2",
349 ]`,
350 }),
351 MakeBazelTarget("android_binary", "foo", AttrNameToString{
352 "deps": `[":foo_kt"]`,
353 "certificate": `":foocert"`,
354 "manifest": `"fooManifest.xml"`,
355 }),
356 }})
357}
Alixe5085eb2023-01-31 19:38:41 +0000358
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400359func TestAndroidAppManifestSdkVersionsProvided(t *testing.T) {
Alixe5085eb2023-01-31 19:38:41 +0000360 runAndroidAppTestCase(t, Bp2buildTestCase{
361 Description: "Android app with value for min_sdk_version",
362 ModuleTypeUnderTest: "android_app",
363 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
364 Filesystem: map[string]string{},
365 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
366android_app {
367 name: "foo",
368 sdk_version: "current",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400369 min_sdk_version: "24",
370 max_sdk_version: "30",
371 target_sdk_version: "29",
Alixe5085eb2023-01-31 19:38:41 +0000372}
373`,
374 ExpectedBazelTargets: []string{
375 MakeBazelTarget("android_binary", "foo", AttrNameToString{
376 "manifest": `"AndroidManifest.xml"`,
377 "resource_files": `[]`,
378 "manifest_values": `{
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400379 "maxSdkVersion": "30",
Alixe5085eb2023-01-31 19:38:41 +0000380 "minSdkVersion": "24",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400381 "targetSdkVersion": "29",
Alixe5085eb2023-01-31 19:38:41 +0000382 }`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500383 "sdk_version": `"current"`,
Alixe5085eb2023-01-31 19:38:41 +0000384 }),
385 }})
386}
387
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400388func TestAndroidAppMinAndTargetSdkDefaultToSdkVersion(t *testing.T) {
Alixe5085eb2023-01-31 19:38:41 +0000389 runAndroidAppTestCase(t, Bp2buildTestCase{
390 Description: "Android app with value for sdk_version",
391 ModuleTypeUnderTest: "android_app",
392 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
393 Filesystem: map[string]string{},
394 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
395android_app {
396 name: "foo",
397 sdk_version: "30",
398}
399`,
400 ExpectedBazelTargets: []string{
401 MakeBazelTarget("android_binary", "foo", AttrNameToString{
402 "manifest": `"AndroidManifest.xml"`,
403 "resource_files": `[]`,
404 "manifest_values": `{
405 "minSdkVersion": "30",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400406 "targetSdkVersion": "30",
Alixe5085eb2023-01-31 19:38:41 +0000407 }`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500408 "sdk_version": `"30"`,
Alixe5085eb2023-01-31 19:38:41 +0000409 }),
410 }})
411}