blob: d1b4d40612207287c34d61fc6c93b0fe56eea30e [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": "",
43 },
Sam Delmerico3177a6e2022-06-21 19:28:33 +000044 Blueprint: `
Romain Jobredeaux1282c422021-10-29 10:52:59 -040045android_app {
46 name: "TestApp",
47 srcs: ["app.java"],
48 sdk_version: "current",
49}
50`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +000051 ExpectedBazelTargets: []string{
Alixe06d75b2022-08-31 18:28:19 +000052 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040053 "srcs": `["app.java"]`,
54 "manifest": `"AndroidManifest.xml"`,
55 "resource_files": `["res/res.png"]`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -050056 "sdk_version": `"current"`,
Romain Jobredeaux1282c422021-10-29 10:52:59 -040057 }),
58 }})
59}
60
61func TestAndroidAppAllSupportedFields(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +000062 runAndroidAppTestCase(t, Bp2buildTestCase{
63 Description: "Android app - all supported fields",
64 ModuleTypeUnderTest: "android_app",
65 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
66 Filesystem: map[string]string{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040067 "app.java": "",
68 "resa/res.png": "",
69 "resb/res.png": "",
70 "manifest/AndroidManifest.xml": "",
71 },
Sam Delmerico3177a6e2022-06-21 19:28:33 +000072 Blueprint: simpleModuleDoNotConvertBp2build("android_app", "static_lib_dep") + `
Romain Jobredeaux1282c422021-10-29 10:52:59 -040073android_app {
74 name: "TestApp",
75 srcs: ["app.java"],
76 sdk_version: "current",
77 package_name: "com.google",
78 resource_dirs: ["resa", "resb"],
79 manifest: "manifest/AndroidManifest.xml",
Vinh Tran3ac6daf2022-04-22 19:09:58 -040080 static_libs: ["static_lib_dep"],
81 java_version: "7",
Jingwen Chen6817bbb2022-10-14 09:56:07 +000082 certificate: "foocert",
Romain Jobredeaux56d41d02023-05-09 16:34:16 -040083 required: ["static_lib_dep"],
Romain Jobredeaux1282c422021-10-29 10:52:59 -040084}
85`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +000086 ExpectedBazelTargets: []string{
Alixe06d75b2022-08-31 18:28:19 +000087 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
Romain Jobredeaux1282c422021-10-29 10:52:59 -040088 "srcs": `["app.java"]`,
89 "manifest": `"manifest/AndroidManifest.xml"`,
90 "resource_files": `[
91 "resa/res.png",
92 "resb/res.png",
93 ]`,
Jingwen Chen6817bbb2022-10-14 09:56:07 +000094 "custom_package": `"com.google"`,
95 "deps": `[":static_lib_dep"]`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -050096 "java_version": `"7"`,
97 "sdk_version": `"current"`,
Jingwen Chen6817bbb2022-10-14 09:56:07 +000098 "certificate_name": `"foocert"`,
Romain Jobredeaux1282c422021-10-29 10:52:59 -040099 }),
100 }})
101}
Sam Delmericoe91d0302022-02-23 15:28:33 +0000102
103func TestAndroidAppArchVariantSrcs(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000104 runAndroidAppTestCase(t, Bp2buildTestCase{
105 Description: "Android app - arch variant srcs",
106 ModuleTypeUnderTest: "android_app",
107 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
108 Filesystem: map[string]string{
Sam Delmericoe91d0302022-02-23 15:28:33 +0000109 "arm.java": "",
110 "x86.java": "",
111 "res/res.png": "",
112 "AndroidManifest.xml": "",
113 },
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000114 Blueprint: `
Sam Delmericoe91d0302022-02-23 15:28:33 +0000115android_app {
116 name: "TestApp",
117 sdk_version: "current",
118 arch: {
119 arm: {
120 srcs: ["arm.java"],
121 },
122 x86: {
123 srcs: ["x86.java"],
124 }
125 }
126}
127`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000128 ExpectedBazelTargets: []string{
Alixe06d75b2022-08-31 18:28:19 +0000129 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
Sam Delmericoe91d0302022-02-23 15:28:33 +0000130 "srcs": `select({
131 "//build/bazel/platforms/arch:arm": ["arm.java"],
132 "//build/bazel/platforms/arch:x86": ["x86.java"],
133 "//conditions:default": [],
134 })`,
135 "manifest": `"AndroidManifest.xml"`,
136 "resource_files": `["res/res.png"]`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500137 "sdk_version": `"current"`,
Sam Delmericoe91d0302022-02-23 15:28:33 +0000138 }),
139 }})
140}
Jingwen Chen6817bbb2022-10-14 09:56:07 +0000141
142func TestAndroidAppCertIsModule(t *testing.T) {
143 runAndroidAppTestCase(t, Bp2buildTestCase{
144 Description: "Android app - cert is module",
145 ModuleTypeUnderTest: "android_app",
146 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
147 Filesystem: map[string]string{},
148 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
149android_app {
150 name: "TestApp",
151 certificate: ":foocert",
152}
153`,
154 ExpectedBazelTargets: []string{
155 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
156 "certificate": `":foocert"`,
157 "manifest": `"AndroidManifest.xml"`,
158 "resource_files": `[]`,
159 }),
160 }})
161}
162
163func TestAndroidAppCertIsSrcFile(t *testing.T) {
164 runAndroidAppTestCase(t, Bp2buildTestCase{
165 Description: "Android app - cert is src file",
166 ModuleTypeUnderTest: "android_app",
167 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
168 Filesystem: map[string]string{
169 "foocert": "",
170 },
171 Blueprint: `
172android_app {
173 name: "TestApp",
174 certificate: "foocert",
175}
176`,
177 ExpectedBazelTargets: []string{
178 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
179 "certificate": `"foocert"`,
180 "manifest": `"AndroidManifest.xml"`,
181 "resource_files": `[]`,
182 }),
183 }})
184}
185
186func TestAndroidAppCertIsNotSrcOrModule(t *testing.T) {
187 runAndroidAppTestCase(t, Bp2buildTestCase{
188 Description: "Android app - cert is not src or module",
189 ModuleTypeUnderTest: "android_app",
190 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
191 Filesystem: map[string]string{
192 // deliberate empty
193 },
194 Blueprint: `
195android_app {
196 name: "TestApp",
197 certificate: "foocert",
198}
199`,
200 ExpectedBazelTargets: []string{
201 MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
202 "certificate_name": `"foocert"`,
203 "manifest": `"AndroidManifest.xml"`,
204 "resource_files": `[]`,
205 }),
206 }})
207}
Alix6c087cf2023-01-05 21:12:31 +0000208
209func TestAndroidAppLibs(t *testing.T) {
210 runAndroidAppTestCase(t, Bp2buildTestCase{
211 Description: "Android app with libs",
212 ModuleTypeUnderTest: "android_app",
213 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
214 Filesystem: map[string]string{},
215 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
216android_app {
217 name: "foo",
218 libs: ["barLib"]
219}
220java_library{
221 name: "barLib",
222}
223`,
224 ExpectedBazelTargets: []string{
225 MakeBazelTarget("java_library", "barLib", AttrNameToString{}),
226 MakeNeverlinkDuplicateTarget("java_library", "barLib"),
227 MakeBazelTarget("android_binary", "foo", AttrNameToString{
228 "manifest": `"AndroidManifest.xml"`,
229 "resource_files": `[]`,
230 "deps": `[":barLib-neverlink"]`,
231 }),
232 }})
233}
Alix0856f9e2023-01-20 22:15:30 +0000234
235func TestAndroidAppKotlinSrcs(t *testing.T) {
236 runAndroidAppTestCase(t, Bp2buildTestCase{
237 Description: "Android app with kotlin sources and common_srcs",
238 ModuleTypeUnderTest: "android_app",
239 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
240 Filesystem: map[string]string{
241 "res/res.png": "",
242 },
243 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
244android_app {
245 name: "foo",
246 srcs: ["a.java", "b.kt"],
247 certificate: ":foocert",
248 manifest: "fooManifest.xml",
249 libs: ["barLib"]
250}
251java_library{
252 name: "barLib",
253}
254`,
255 ExpectedBazelTargets: []string{
256 MakeBazelTarget("java_library", "barLib", AttrNameToString{}),
257 MakeNeverlinkDuplicateTarget("java_library", "barLib"),
258 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
259 "srcs": `[
260 "a.java",
261 "b.kt",
262 ]`,
263 "manifest": `"fooManifest.xml"`,
264 "resource_files": `["res/res.png"]`,
265 "deps": `[":barLib-neverlink"]`,
266 }),
267 MakeBazelTarget("android_binary", "foo", AttrNameToString{
268 "deps": `[":foo_kt"]`,
269 "certificate": `":foocert"`,
270 "manifest": `"fooManifest.xml"`,
271 }),
272 }})
273}
274
275func TestAndroidAppCommonSrcs(t *testing.T) {
276 runAndroidAppTestCase(t, Bp2buildTestCase{
277 Description: "Android app with common_srcs",
278 ModuleTypeUnderTest: "android_app",
279 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
280 Filesystem: map[string]string{
281 "res/res.png": "",
282 },
283 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
284android_app {
285 name: "foo",
286 srcs: ["a.java"],
287 common_srcs: ["b.kt"],
288 certificate: "foocert",
289 manifest: "fooManifest.xml",
290 libs: ["barLib"],
291}
292java_library{
293 name: "barLib",
294}
295`,
296 ExpectedBazelTargets: []string{
297 MakeBazelTarget("java_library", "barLib", AttrNameToString{}),
298 MakeNeverlinkDuplicateTarget("java_library", "barLib"),
299 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
300 "srcs": `["a.java"]`,
301 "common_srcs": `["b.kt"]`,
302 "manifest": `"fooManifest.xml"`,
303 "resource_files": `["res/res.png"]`,
304 "deps": `[":barLib-neverlink"]`,
305 }),
306 MakeBazelTarget("android_binary", "foo", AttrNameToString{
307 "deps": `[":foo_kt"]`,
308 "certificate_name": `"foocert"`,
309 "manifest": `"fooManifest.xml"`,
310 }),
311 }})
312}
Alixf848bf82023-03-06 19:43:55 +0000313
314func TestAndroidAppKotlinCflags(t *testing.T) {
315 runAndroidAppTestCase(t, Bp2buildTestCase{
316 Description: "Android app with kotlincflags",
317 ModuleTypeUnderTest: "android_app",
318 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
319 Filesystem: map[string]string{
320 "res/res.png": "",
321 },
322 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
323android_app {
324 name: "foo",
325 srcs: ["a.java", "b.kt"],
326 certificate: ":foocert",
327 manifest: "fooManifest.xml",
328 kotlincflags: ["-flag1", "-flag2"],
329}
330`,
331 ExpectedBazelTargets: []string{
332 MakeBazelTarget("android_library", "foo_kt", AttrNameToString{
333 "srcs": `[
334 "a.java",
335 "b.kt",
336 ]`,
337 "manifest": `"fooManifest.xml"`,
338 "resource_files": `["res/res.png"]`,
339 "kotlincflags": `[
340 "-flag1",
341 "-flag2",
342 ]`,
343 }),
344 MakeBazelTarget("android_binary", "foo", AttrNameToString{
345 "deps": `[":foo_kt"]`,
346 "certificate": `":foocert"`,
347 "manifest": `"fooManifest.xml"`,
348 }),
349 }})
350}
Alixe5085eb2023-01-31 19:38:41 +0000351
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400352func TestAndroidAppManifestSdkVersionsProvided(t *testing.T) {
Alixe5085eb2023-01-31 19:38:41 +0000353 runAndroidAppTestCase(t, Bp2buildTestCase{
354 Description: "Android app with value for min_sdk_version",
355 ModuleTypeUnderTest: "android_app",
356 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
357 Filesystem: map[string]string{},
358 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
359android_app {
360 name: "foo",
361 sdk_version: "current",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400362 min_sdk_version: "24",
363 max_sdk_version: "30",
364 target_sdk_version: "29",
Alixe5085eb2023-01-31 19:38:41 +0000365}
366`,
367 ExpectedBazelTargets: []string{
368 MakeBazelTarget("android_binary", "foo", AttrNameToString{
369 "manifest": `"AndroidManifest.xml"`,
370 "resource_files": `[]`,
371 "manifest_values": `{
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400372 "maxSdkVersion": "30",
Alixe5085eb2023-01-31 19:38:41 +0000373 "minSdkVersion": "24",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400374 "targetSdkVersion": "29",
Alixe5085eb2023-01-31 19:38:41 +0000375 }`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500376 "sdk_version": `"current"`,
Alixe5085eb2023-01-31 19:38:41 +0000377 }),
378 }})
379}
380
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400381func TestAndroidAppMinAndTargetSdkDefaultToSdkVersion(t *testing.T) {
Alixe5085eb2023-01-31 19:38:41 +0000382 runAndroidAppTestCase(t, Bp2buildTestCase{
383 Description: "Android app with value for sdk_version",
384 ModuleTypeUnderTest: "android_app",
385 ModuleTypeUnderTestFactory: java.AndroidAppFactory,
386 Filesystem: map[string]string{},
387 Blueprint: simpleModuleDoNotConvertBp2build("filegroup", "foocert") + `
388android_app {
389 name: "foo",
390 sdk_version: "30",
391}
392`,
393 ExpectedBazelTargets: []string{
394 MakeBazelTarget("android_binary", "foo", AttrNameToString{
395 "manifest": `"AndroidManifest.xml"`,
396 "resource_files": `[]`,
397 "manifest_values": `{
398 "minSdkVersion": "30",
Romain Jobredeaux496660d2023-07-10 11:50:00 -0400399 "targetSdkVersion": "30",
Alixe5085eb2023-01-31 19:38:41 +0000400 }`,
Romain Jobredeaux2eef2e12023-02-24 12:07:08 -0500401 "sdk_version": `"30"`,
Alixe5085eb2023-01-31 19:38:41 +0000402 }),
403 }})
404}