blob: 25494a162a1c297fc6c2d711489b508f9f4bb375 [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 {
Liz Kammer02914402023-08-07 13:38:18 -040047 name: "TestApp",
48 srcs: ["app.java"],
49 sdk_version: "current",
Romain Jobredeaux1282c422021-10-29 10:52:59 -040050}
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 {
Liz Kammer02914402023-08-07 13:38:18 -040078 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",
84 static_libs: ["static_lib_dep"],
85 java_version: "7",
86 certificate: "foocert",
87 required: ["static_lib_dep"],
88 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 {
Liz Kammer02914402023-08-07 13:38:18 -0400123 name: "TestApp",
124 sdk_version: "current",
125 arch: {
126 arm: {
127 srcs: ["arm.java"],
128 },
129 x86: {
130 srcs: ["x86.java"],
Sam Delmericoe91d0302022-02-23 15:28:33 +0000131 }
Liz Kammer02914402023-08-07 13:38:18 -0400132 }
Sam Delmericoe91d0302022-02-23 15:28:33 +0000133}
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 {
Liz Kammer02914402023-08-07 13:38:18 -0400157 name: "TestApp",
158 certificate: ":foocert",
159 sdk_version: "current",
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000160}
161`,
162 ExpectedBazelTargets: []string{
163 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
164 "certificate": `":foocert"`,
165 "manifest": `"AndroidManifest.xml"`,
166 "resource_files": `[]`,
Liz Kammer02914402023-08-07 13:38:18 -0400167 "sdk_version": `"current"`, // use as default
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000168 }),
169 }})
170}
171
172func TestAndroidAppCertIsSrcFile(t *testing.T) {
173 runAndroidAppTestCase(t, Bp2buildTestCase{
174 Description: "Android app - cert is src file",
175 ModuleTypeUnderTest: "android_app",
176 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
177 Filesystem: map[string]string{
178 "foocert": "",
179 },
180 Blueprint: `
181android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400182 name: "TestApp",
183 certificate: "foocert",
184 sdk_version: "current",
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000185}
186`,
187 ExpectedBazelTargets: []string{
188 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
189 "certificate": `"foocert"`,
190 "manifest": `"AndroidManifest.xml"`,
191 "resource_files": `[]`,
Liz Kammer02914402023-08-07 13:38:18 -0400192 "sdk_version": `"current"`, // use as default
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000193 }),
194 }})
195}
196
197func TestAndroidAppCertIsNotSrcOrModule(t *testing.T) {
198 runAndroidAppTestCase(t, Bp2buildTestCase{
199 Description: "Android app - cert is not src or module",
200 ModuleTypeUnderTest: "android_app",
201 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
202 Filesystem: map[string]string{
203 // deliberate empty
204 },
205 Blueprint: `
206android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400207 name: "TestApp",
208 certificate: "foocert",
209 sdk_version: "current",
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000210}
211`,
212 ExpectedBazelTargets: []string{
213 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
214 "certificate_name": `"foocert"`,
215 "manifest": `"AndroidManifest.xml"`,
216 "resource_files": `[]`,
Liz Kammer02914402023-08-07 13:38:18 -0400217 "sdk_version": `"current"`, // use as default
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000218 }),
219 }})
220}
Alix6c087cf2023-01-05 21:12:31 +0000221
222func TestAndroidAppLibs(t *testing.T) {
223 runAndroidAppTestCase(t, Bp2buildTestCase{
224 Description: "Android app with libs",
225 ModuleTypeUnderTest: "android_app",
226 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
227 Filesystem: map[string]string{},
Liz Kammer02914402023-08-07 13:38:18 -0400228 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") +
229 simpleModuleDoNotConvertBp2build("java_library", "barLib") + `
Alix6c087cf2023-01-05 21:12:31 +0000230android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400231 name: "foo",
232 libs: ["barLib"],
233 sdk_version: "current",
Alix6c087cf2023-01-05 21:12:31 +0000234}
235`,
236 ExpectedBazelTargets: []string{
Alix6c087cf2023-01-05 21:12:31 +0000237 MakeBazelTarget("android_binary", "foo", AttrNameToString{
238 "manifest": `"AndroidManifest.xml"`,
239 "resource_files": `[]`,
240 "deps": `[":barLib-neverlink"]`,
Liz Kammer02914402023-08-07 13:38:18 -0400241 "sdk_version": `"current"`, // use as default
Alix6c087cf2023-01-05 21:12:31 +0000242 }),
243 }})
244}
Alix0856f9e2023-01-20 22:15:30 +0000245
246func TestAndroidAppKotlinSrcs(t *testing.T) {
247 runAndroidAppTestCase(t, Bp2buildTestCase{
248 Description: "Android app with kotlin sources and common_srcs",
249 ModuleTypeUnderTest: "android_app",
250 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
251 Filesystem: map[string]string{
252 "res/res.png": "",
253 },
Liz Kammer02914402023-08-07 13:38:18 -0400254 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") +
255 simpleModuleDoNotConvertBp2build("java_library", "barLib") + `
Alix0856f9e2023-01-20 22:15:30 +0000256android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400257 name: "foo",
258 srcs: ["a.java", "b.kt"],
259 certificate: ":foocert",
260 manifest: "fooManifest.xml",
261 libs: ["barLib"],
262 sdk_version: "current",
Alix0856f9e2023-01-20 22:15:30 +0000263}
264`,
265 ExpectedBazelTargets: []string{
Alix0856f9e2023-01-20 22:15:30 +0000266 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
267 "srcs": `[
268 "a.java",
269 "b.kt",
270 ]`,
271 "manifest": `"fooManifest.xml"`,
272 "resource_files": `["res/res.png"]`,
273 "deps": `[":barLib-neverlink"]`,
Liz Kammer02914402023-08-07 13:38:18 -0400274 "sdk_version": `"current"`, // use as default
Alix0856f9e2023-01-20 22:15:30 +0000275 }),
276 MakeBazelTarget("android_binary", "foo", AttrNameToString{
277 "deps": `[":foo_kt"]`,
278 "certificate": `":foocert"`,
279 "manifest": `"fooManifest.xml"`,
Liz Kammer02914402023-08-07 13:38:18 -0400280 "sdk_version": `"current"`, // use as default
Alix0856f9e2023-01-20 22:15:30 +0000281 }),
282 }})
283}
284
285func TestAndroidAppCommonSrcs(t *testing.T) {
286 runAndroidAppTestCase(t, Bp2buildTestCase{
287 Description: "Android app with common_srcs",
288 ModuleTypeUnderTest: "android_app",
289 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
290 Filesystem: map[string]string{
291 "res/res.png": "",
292 },
293 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
294android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400295 name: "foo",
296 srcs: ["a.java"],
297 common_srcs: ["b.kt"],
298 certificate: "foocert",
299 manifest: "fooManifest.xml",
300 libs: ["barLib"],
301 sdk_version: "current",
Alix0856f9e2023-01-20 22:15:30 +0000302}
303java_library{
Liz Kammer02914402023-08-07 13:38:18 -0400304 name: "barLib",
305 bazel_module: { bp2build_available: false },
Alix0856f9e2023-01-20 22:15:30 +0000306}
307`,
308 ExpectedBazelTargets: []string{
Alix0856f9e2023-01-20 22:15:30 +0000309 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
310 "srcs": `["a.java"]`,
311 "common_srcs": `["b.kt"]`,
312 "manifest": `"fooManifest.xml"`,
313 "resource_files": `["res/res.png"]`,
314 "deps": `[":barLib-neverlink"]`,
Liz Kammer02914402023-08-07 13:38:18 -0400315 "sdk_version": `"current"`, // use as default
Alix0856f9e2023-01-20 22:15:30 +0000316 }),
317 MakeBazelTarget("android_binary", "foo", AttrNameToString{
318 "deps": `[":foo_kt"]`,
319 "certificate_name": `"foocert"`,
320 "manifest": `"fooManifest.xml"`,
Liz Kammer02914402023-08-07 13:38:18 -0400321 "sdk_version": `"current"`, // use as default
Alix0856f9e2023-01-20 22:15:30 +0000322 }),
323 }})
324}
Alixf848bf82023-03-06 19:43:55 +0000325
326func TestAndroidAppKotlinCflags(t *testing.T) {
327 runAndroidAppTestCase(t, Bp2buildTestCase{
328 Description: "Android app with kotlincflags",
329 ModuleTypeUnderTest: "android_app",
330 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
331 Filesystem: map[string]string{
332 "res/res.png": "",
333 },
334 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
335android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400336 name: "foo",
337 srcs: ["a.java", "b.kt"],
338 certificate: ":foocert",
339 manifest: "fooManifest.xml",
340 kotlincflags: ["-flag1", "-flag2"],
341 sdk_version: "current",
Alixf848bf82023-03-06 19:43:55 +0000342}
343`,
344 ExpectedBazelTargets: []string{
345 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
346 "srcs": `[
347 "a.java",
348 "b.kt",
349 ]`,
350 "manifest": `"fooManifest.xml"`,
351 "resource_files": `["res/res.png"]`,
352 "kotlincflags": `[
353 "-flag1",
354 "-flag2",
355 ]`,
Liz Kammer02914402023-08-07 13:38:18 -0400356 "sdk_version": `"current"`, // use as default
Alixf848bf82023-03-06 19:43:55 +0000357 }),
358 MakeBazelTarget("android_binary", "foo", AttrNameToString{
359 "deps": `[":foo_kt"]`,
360 "certificate": `":foocert"`,
361 "manifest": `"fooManifest.xml"`,
Liz Kammer02914402023-08-07 13:38:18 -0400362 "sdk_version": `"current"`,
Alixf848bf82023-03-06 19:43:55 +0000363 }),
364 }})
365}
Alixe5085eb2023-01-31 19:38:41 +0000366
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400367func TestAndroidAppManifestSdkVersionsProvided(t *testing.T) {
Alixe5085eb2023-01-31 19:38:41 +0000368 runAndroidAppTestCase(t, Bp2buildTestCase{
369 Description: "Android app with value for min_sdk_version",
370 ModuleTypeUnderTest: "android_app",
371 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
372 Filesystem: map[string]string{},
373 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
374android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400375 name: "foo",
376 sdk_version: "current",
377 min_sdk_version: "24",
378 max_sdk_version: "30",
379 target_sdk_version: "29",
Alixe5085eb2023-01-31 19:38:41 +0000380}
381`,
382 ExpectedBazelTargets: []string{
383 MakeBazelTarget("android_binary", "foo", AttrNameToString{
384 "manifest": `"AndroidManifest.xml"`,
385 "resource_files": `[]`,
386 "manifest_values": `{
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400387 "maxSdkVersion": "30",
Alixe5085eb2023-01-31 19:38:41 +0000388 "minSdkVersion": "24",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400389 "targetSdkVersion": "29",
Alixe5085eb2023-01-31 19:38:41 +0000390 }`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500391 "sdk_version": `"current"`,
Alixe5085eb2023-01-31 19:38:41 +0000392 }),
393 }})
394}
395
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400396func TestAndroidAppMinAndTargetSdkDefaultToSdkVersion(t *testing.T) {
Alixe5085eb2023-01-31 19:38:41 +0000397 runAndroidAppTestCase(t, Bp2buildTestCase{
398 Description: "Android app with value for sdk_version",
399 ModuleTypeUnderTest: "android_app",
400 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
401 Filesystem: map[string]string{},
402 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
403android_app {
Liz Kammer02914402023-08-07 13:38:18 -0400404 name: "foo",
405 sdk_version: "30",
Alixe5085eb2023-01-31 19:38:41 +0000406}
407`,
408 ExpectedBazelTargets: []string{
409 MakeBazelTarget("android_binary", "foo", AttrNameToString{
410 "manifest": `"AndroidManifest.xml"`,
411 "resource_files": `[]`,
412 "manifest_values": `{
413 "minSdkVersion": "30",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400414 "targetSdkVersion": "30",
Alixe5085eb2023-01-31 19:38:41 +0000415 }`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500416 "sdk_version": `"30"`,
Alixe5085eb2023-01-31 19:38:41 +0000417 }),
418 }})
419}