blob: 63419d6b139a9d3bb8bc6e8a4e3c822c365f020f [file] [log] [blame]
Colin Cross1d2b6b32021-06-01 13:18:08 -07001// 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 java
16
17import (
Colin Cross1d2b6b32021-06-01 13:18:08 -070018 "fmt"
19 "path/filepath"
20 "regexp"
Paul Duffind0b9fca2022-09-30 18:11:41 +010021 "strings"
Colin Cross1d2b6b32021-06-01 13:18:08 -070022 "testing"
23
Pedro Loureiroc3621422021-09-28 15:40:23 +000024 "android/soong/android"
25
Colin Cross1d2b6b32021-06-01 13:18:08 -070026 "github.com/google/blueprint/proptools"
27)
28
29func TestJavaSdkLibrary(t *testing.T) {
30 result := android.GroupFixturePreparers(
31 prepareForJavaTest,
32 PrepareForTestWithJavaSdkLibraryFiles,
33 FixtureWithPrebuiltApis(map[string][]string{
34 "28": {"foo"},
35 "29": {"foo"},
36 "30": {"bar", "barney", "baz", "betty", "foo", "fred", "quuz", "wilma"},
37 }),
Jihoon Kang1c92c3e2023-03-23 17:44:51 +000038 android.FixtureModifyConfig(func(config android.Config) {
39 config.SetApiLibraries([]string{"foo"})
40 }),
Colin Cross1d2b6b32021-06-01 13:18:08 -070041 ).RunTestWithBp(t, `
42 droiddoc_exported_dir {
43 name: "droiddoc-templates-sdk",
44 path: ".",
45 }
46 java_sdk_library {
47 name: "foo",
48 srcs: ["a.java", "b.java"],
49 api_packages: ["foo"],
50 }
51 java_sdk_library {
52 name: "bar",
53 srcs: ["a.java", "b.java"],
54 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080055 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070056 }
57 java_library {
58 name: "baz",
59 srcs: ["c.java"],
60 libs: ["foo", "bar.stubs"],
61 sdk_version: "system_current",
62 }
63 java_sdk_library {
64 name: "barney",
65 srcs: ["c.java"],
66 api_only: true,
67 }
68 java_sdk_library {
69 name: "betty",
70 srcs: ["c.java"],
71 shared_library: false,
72 }
73 java_sdk_library_import {
74 name: "quuz",
75 public: {
76 jars: ["c.jar"],
Jihoon Kang71c86832023-09-13 01:01:53 +000077 current_api: "api/current.txt",
78 removed_api: "api/removed.txt",
Colin Cross1d2b6b32021-06-01 13:18:08 -070079 },
80 }
81 java_sdk_library_import {
82 name: "fred",
83 public: {
84 jars: ["b.jar"],
85 },
86 }
87 java_sdk_library_import {
88 name: "wilma",
89 public: {
90 jars: ["b.jar"],
91 },
92 shared_library: false,
93 }
94 java_library {
95 name: "qux",
96 srcs: ["c.java"],
97 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
98 sdk_version: "system_current",
99 }
100 java_library {
101 name: "baz-test",
102 srcs: ["c.java"],
103 libs: ["foo"],
104 sdk_version: "test_current",
105 }
106 java_library {
107 name: "baz-29",
108 srcs: ["c.java"],
109 libs: ["foo"],
110 sdk_version: "system_29",
111 }
112 java_library {
113 name: "baz-module-30",
114 srcs: ["c.java"],
115 libs: ["foo"],
116 sdk_version: "module_30",
117 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000118 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700119
120 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100121 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700122 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
123 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
124 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
125 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
126 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
127 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jihoon Kangd48abd52023-02-02 22:32:31 +0000128 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
Jihoon Kang1c92c3e2023-03-23 17:44:51 +0000129 result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700130 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
131 result.ModuleForTests("foo.api.public.28", "")
132 result.ModuleForTests("foo.api.system.28", "")
133 result.ModuleForTests("foo.api.test.28", "")
134
Colin Cross5a377182023-12-14 14:46:23 -0800135 exportedComponentsInfo, _ := android.SingletonModuleProvider(result, foo.Module(), android.ExportedComponentsInfoProvider)
Paul Duffinb97b1572021-04-29 21:50:40 +0100136 expectedFooExportedComponents := []string{
Paul Duffin958806b2022-05-16 13:10:47 +0000137 "foo-removed.api.public.latest",
138 "foo-removed.api.system.latest",
139 "foo.api.public.latest",
140 "foo.api.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100141 "foo.stubs",
142 "foo.stubs.source",
143 "foo.stubs.source.system",
144 "foo.stubs.source.test",
145 "foo.stubs.system",
146 "foo.stubs.test",
147 }
148 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
149
Colin Cross1d2b6b32021-06-01 13:18:08 -0700150 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
151 // tests if baz is actually linked to the stubs lib
152 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
153 // ... and not to the impl lib
154 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
155 // test if baz is not linked to the system variant of foo
156 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
157
158 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
159 // tests if baz-test is actually linked to the test stubs lib
160 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
161
162 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
163 // tests if baz-29 is actually linked to the system 29 stubs lib
164 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
165
166 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
167 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
168 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
169
170 // test if baz has exported SDK lib names foo and bar to qux
171 qux := result.ModuleForTests("qux", "android_common")
172 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100173 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100174 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100175 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700176 }
Wei Li1e73c652021-12-06 13:35:11 -0800177
Jihoon Kang71c86832023-09-13 01:01:53 +0000178 // test if quuz have created the api_contribution module
179 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "")
180
Wei Li1e73c652021-12-06 13:35:11 -0800181 fooDexJar := result.ModuleForTests("foo", "android_common").Rule("d8")
182 // tests if kotlinc generated files are NOT excluded from output of foo.
183 android.AssertStringDoesNotContain(t, "foo dex", fooDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
184
185 barDexJar := result.ModuleForTests("bar", "android_common").Rule("d8")
186 // tests if kotlinc generated files are excluded from output of bar.
187 android.AssertStringDoesContain(t, "bar dex", barDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700188}
189
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000190func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
191 result := android.GroupFixturePreparers(
192 prepareForJavaTest,
193 PrepareForTestWithJavaSdkLibraryFiles,
194 FixtureWithPrebuiltApis(map[string][]string{
195 "28": {"foo"},
196 "29": {"foo"},
197 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
198 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Pedro Loureirob638c622021-12-22 15:28:05 +0000200 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
Pedro Loureiroc3621422021-09-28 15:40:23 +0000201 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000202 ).RunTestWithBp(t,
203 `
204 java_sdk_library {
205 name: "fooUpdatable",
206 srcs: ["a.java", "b.java"],
207 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000208 on_bootclasspath_since: "U",
209 on_bootclasspath_before: "V",
210 min_device_sdk: "W",
Pedro Loureirob638c622021-12-22 15:28:05 +0000211 max_device_sdk: "X",
Pedro Loureiroc3621422021-09-28 15:40:23 +0000212 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000213 }
214 java_sdk_library {
215 name: "foo",
216 srcs: ["a.java", "b.java"],
217 api_packages: ["foo"],
218 }
219`)
Pedro Loureirob638c622021-12-22 15:28:05 +0000220
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000221 // test that updatability attributes are passed on correctly
222 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureirob638c622021-12-22 15:28:05 +0000223 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-since=\"U\"`)
224 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-before=\"V\"`)
225 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `min-device-sdk=\"W\"`)
226 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `max-device-sdk=\"X\"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000227
228 // double check that updatability attributes are not written if they don't exist in the bp file
229 // the permissions file for the foo library defined above
230 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiroba6682f2021-10-29 09:32:32 +0000231 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-since`)
232 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-before`)
233 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `min-device-sdk`)
234 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000235}
236
Pedro Loureiroc3621422021-09-28 15:40:23 +0000237func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000238 android.GroupFixturePreparers(
239 prepareForJavaTest,
240 PrepareForTestWithJavaSdkLibraryFiles,
241 FixtureWithPrebuiltApis(map[string][]string{
242 "30": {"fooUpdatable", "fooUpdatableErr"},
243 }),
244 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
245 []string{
246 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
247 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
248 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000249 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000250 })).RunTestWithBp(t,
251 `
252 java_sdk_library {
253 name: "fooUpdatableErr",
254 srcs: ["a.java", "b.java"],
255 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000256 on_bootclasspath_since: "aaa",
257 on_bootclasspath_before: "bbc",
258 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000259 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000260 }
261`)
262}
263
Pedro Loureiroc3621422021-09-28 15:40:23 +0000264func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
265 android.GroupFixturePreparers(
266 prepareForJavaTest,
267 PrepareForTestWithJavaSdkLibraryFiles,
268 FixtureWithPrebuiltApis(map[string][]string{
269 "28": {"foo"},
270 }),
271 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
272 []string{
273 "on_bootclasspath_since: Attribute value needs to be at least T",
274 "on_bootclasspath_before: Attribute value needs to be at least T",
275 "min_device_sdk: Attribute value needs to be at least T",
276 "max_device_sdk: Attribute value needs to be at least T",
277 },
278 )).RunTestWithBp(t,
279 `
280 java_sdk_library {
281 name: "foo",
282 srcs: ["a.java", "b.java"],
283 api_packages: ["foo"],
284 on_bootclasspath_since: "S",
285 on_bootclasspath_before: "S",
286 min_device_sdk: "S",
287 max_device_sdk: "S",
288 min_sdk_version: "S",
289 }
290`)
291}
292
293func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
294 android.GroupFixturePreparers(
295 prepareForJavaTest,
296 PrepareForTestWithJavaSdkLibraryFiles,
297 FixtureWithPrebuiltApis(map[string][]string{
298 "28": {"foo"},
299 }),
300 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
301 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
302 }),
303 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
304 []string{
305 "min_device_sdk can't be greater than max_device_sdk",
306 },
307 )).RunTestWithBp(t,
308 `
309 java_sdk_library {
310 name: "foo",
311 srcs: ["a.java", "b.java"],
312 api_packages: ["foo"],
313 min_device_sdk: "V",
314 max_device_sdk: "U",
315 min_sdk_version: "S",
316 }
317`)
318}
319
320func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
321 android.GroupFixturePreparers(
322 prepareForJavaTest,
323 PrepareForTestWithJavaSdkLibraryFiles,
324 FixtureWithPrebuiltApis(map[string][]string{
325 "28": {"foo"},
326 }),
327 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
328 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
329 }),
330 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
331 []string{
332 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
333 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
334 },
335 )).RunTestWithBp(t,
336 `
337 java_sdk_library {
338 name: "foo",
339 srcs: ["a.java", "b.java"],
340 api_packages: ["foo"],
341 min_device_sdk: "U",
342 max_device_sdk: "U",
343 min_sdk_version: "V",
344 }
345`)
346}
347
348func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
349 result := android.GroupFixturePreparers(
350 prepareForJavaTest,
351 PrepareForTestWithJavaSdkLibraryFiles,
352 FixtureWithPrebuiltApis(map[string][]string{
353 "30": {"foo"},
354 }),
355 ).RunTestWithBp(t,
356 `
357 java_sdk_library {
358 name: "foo",
359 srcs: ["a.java", "b.java"],
360 min_device_sdk: "Tiramisu",
361 min_sdk_version: "S",
362 }
363`)
364 // test that updatability attributes are passed on correctly
365 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiro196d3e62021-12-22 19:53:01 +0000366 android.AssertStringDoesContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<apex-library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000367 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<library`)
368}
369
Colin Cross1d2b6b32021-06-01 13:18:08 -0700370func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
371 result := android.GroupFixturePreparers(
372 prepareForJavaTest,
373 PrepareForTestWithJavaSdkLibraryFiles,
374 FixtureWithLastReleaseApis("sdklib"),
375 ).RunTestWithBp(t, `
376 java_sdk_library {
377 name: "sdklib",
378 srcs: ["a.java"],
379 libs: ["lib"],
380 static_libs: ["static-lib"],
381 impl_only_libs: ["impl-only-lib"],
382 stub_only_libs: ["stub-only-lib"],
383 stub_only_static_libs: ["stub-only-static-lib"],
384 }
385 java_defaults {
386 name: "defaults",
387 srcs: ["a.java"],
388 sdk_version: "current",
389 }
390 java_library { name: "lib", defaults: ["defaults"] }
391 java_library { name: "static-lib", defaults: ["defaults"] }
392 java_library { name: "impl-only-lib", defaults: ["defaults"] }
393 java_library { name: "stub-only-lib", defaults: ["defaults"] }
394 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
395 `)
396 var expectations = []struct {
397 lib string
398 on_impl_classpath bool
399 on_stub_classpath bool
400 in_impl_combined bool
401 in_stub_combined bool
402 }{
403 {lib: "lib", on_impl_classpath: true},
404 {lib: "static-lib", in_impl_combined: true},
405 {lib: "impl-only-lib", on_impl_classpath: true},
406 {lib: "stub-only-lib", on_stub_classpath: true},
407 {lib: "stub-only-static-lib", in_stub_combined: true},
408 }
409 verify := func(sdklib, dep string, cp, combined bool) {
410 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
411 expected := cp || combined // Every combined jar is also on the classpath.
412 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
413
414 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
415 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
416 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
417 }
418 for _, expectation := range expectations {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700419 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
420
Jihoon Kang1147b312023-06-08 23:25:57 +0000421 stubName := apiScopePublic.sourceStubLibraryModuleName("sdklib")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700422 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
423 }
424}
425
426func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
427 result := android.GroupFixturePreparers(
428 prepareForJavaTest,
429 PrepareForTestWithJavaSdkLibraryFiles,
430 FixtureWithLastReleaseApis("foo"),
431 ).RunTestWithBp(t, `
432 java_sdk_library {
433 name: "foo",
434 srcs: ["a.java"],
435 api_only: true,
436 public: {
437 enabled: true,
438 },
439 }
440
441 java_library {
442 name: "bar",
443 srcs: ["b.java"],
444 libs: ["foo"],
445 }
446 `)
447
448 // The bar library should depend on the stubs jar.
449 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
450 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
451 t.Errorf("expected %q, found %#q", expected, actual)
452 }
453}
454
Anton Hanssond78eb762021-09-21 15:25:12 +0100455func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700456 android.GroupFixturePreparers(
457 prepareForJavaTest,
458 PrepareForTestWithJavaSdkLibraryFiles,
459 FixtureWithLastReleaseApis("foo"),
460 ).RunTestWithBp(t, `
461 java_sdk_library {
462 name: "foo",
463 srcs: ["a.java"],
464 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100465 annotations_enabled: true,
466 public: {
467 enabled: true,
468 },
469 }
470 java_library {
471 name: "bar",
472 srcs: ["b.java", ":foo{.public.stubs.source}"],
473 java_resources: [":foo{.public.annotations.zip}"],
474 }
475 `)
476}
477
478func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
479 android.GroupFixturePreparers(
480 prepareForJavaTest,
481 PrepareForTestWithJavaSdkLibraryFiles,
482 FixtureWithLastReleaseApis("foo"),
483 ).
484 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": path dependency ":foo{.public.annotations.zip}": annotations.zip not available for api scope public`)).
485 RunTestWithBp(t, `
486 java_sdk_library {
487 name: "foo",
488 srcs: ["a.java"],
489 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700490 public: {
491 enabled: true,
492 },
493 }
494
495 java_library {
496 name: "bar",
497 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100498 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700499 }
500 `)
501}
502
503func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
504 android.GroupFixturePreparers(
505 prepareForJavaTest,
506 PrepareForTestWithJavaSdkLibraryFiles,
507 FixtureWithLastReleaseApis("foo"),
508 ).
509 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
510 RunTestWithBp(t, `
511 java_sdk_library {
512 name: "foo",
513 srcs: ["a.java"],
514 api_packages: ["foo"],
515 public: {
516 enabled: true,
517 },
518 }
519
520 java_library {
521 name: "bar",
522 srcs: ["b.java", ":foo{.system.stubs.source}"],
523 }
524 `)
525}
526
527func TestJavaSdkLibrary_Deps(t *testing.T) {
528 result := android.GroupFixturePreparers(
529 prepareForJavaTest,
530 PrepareForTestWithJavaSdkLibraryFiles,
531 FixtureWithLastReleaseApis("sdklib"),
532 ).RunTestWithBp(t, `
533 java_sdk_library {
534 name: "sdklib",
535 srcs: ["a.java"],
536 sdk_version: "none",
537 system_modules: "none",
538 public: {
539 enabled: true,
540 },
541 }
542 `)
543
544 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
545 `dex2oatd`,
Paul Duffin958806b2022-05-16 13:10:47 +0000546 `sdklib-removed.api.public.latest`,
547 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700548 `sdklib.impl`,
549 `sdklib.stubs`,
550 `sdklib.stubs.source`,
551 `sdklib.xml`,
552 })
553}
554
555func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
556 prepareForJavaTest.RunTestWithBp(t, `
557 java_sdk_library_import {
558 name: "foo",
559 public: {
560 jars: ["a.jar"],
561 stub_srcs: ["a.java"],
562 current_api: "api/current.txt",
563 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100564 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700565 },
566 }
567
568 java_library {
569 name: "bar",
570 srcs: [":foo{.public.stubs.source}"],
571 java_resources: [
572 ":foo{.public.api.txt}",
573 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100574 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700575 ],
576 }
577 `)
578}
579
580func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
581 bp := `
582 java_sdk_library_import {
583 name: "foo",
584 public: {
585 jars: ["a.jar"],
586 },
587 }
588 `
589
590 t.Run("stubs.source", func(t *testing.T) {
591 prepareForJavaTest.
592 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
593 RunTestWithBp(t, bp+`
594 java_library {
595 name: "bar",
596 srcs: [":foo{.public.stubs.source}"],
597 java_resources: [
598 ":foo{.public.api.txt}",
599 ":foo{.public.removed-api.txt}",
600 ],
601 }
602 `)
603 })
604
605 t.Run("api.txt", func(t *testing.T) {
606 prepareForJavaTest.
607 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
608 RunTestWithBp(t, bp+`
609 java_library {
610 name: "bar",
611 srcs: ["a.java"],
612 java_resources: [
613 ":foo{.public.api.txt}",
614 ],
615 }
616 `)
617 })
618
619 t.Run("removed-api.txt", func(t *testing.T) {
620 prepareForJavaTest.
621 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
622 RunTestWithBp(t, bp+`
623 java_library {
624 name: "bar",
625 srcs: ["a.java"],
626 java_resources: [
627 ":foo{.public.removed-api.txt}",
628 ],
629 }
630 `)
631 })
632}
633
634func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
635 prepareForJavaTest.
636 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
637 RunTestWithBp(t, `
638 java_sdk_library {
639 name: "foo",
640 srcs: ["a.java", "b.java"],
641 api_packages: ["foo"],
642 // Explicitly disable public to test the check that ensures the set of enabled
643 // scopes is consistent.
644 public: {
645 enabled: false,
646 },
647 system: {
648 enabled: true,
649 },
650 }
651 `)
652}
653
654func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
655 android.GroupFixturePreparers(
656 prepareForJavaTest,
657 PrepareForTestWithJavaSdkLibraryFiles,
658 FixtureWithLastReleaseApis("foo"),
659 ).RunTestWithBp(t, `
660 java_sdk_library {
661 name: "foo",
662 srcs: ["a.java", "b.java"],
663 api_packages: ["foo"],
664 system: {
665 enabled: true,
666 sdk_version: "module_current",
667 },
668 }
669 `)
670}
671
672func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
673 android.GroupFixturePreparers(
674 prepareForJavaTest,
675 PrepareForTestWithJavaSdkLibraryFiles,
676 FixtureWithLastReleaseApis("foo"),
677 ).RunTestWithBp(t, `
678 java_sdk_library {
679 name: "foo",
680 srcs: ["a.java", "b.java"],
681 api_packages: ["foo"],
682 system: {
683 enabled: true,
684 },
685 module_lib: {
686 enabled: true,
687 },
688 }
689 `)
690}
691
692func TestJavaSdkLibrary_SystemServer(t *testing.T) {
693 android.GroupFixturePreparers(
694 prepareForJavaTest,
695 PrepareForTestWithJavaSdkLibraryFiles,
696 FixtureWithLastReleaseApis("foo"),
697 ).RunTestWithBp(t, `
698 java_sdk_library {
699 name: "foo",
700 srcs: ["a.java", "b.java"],
701 api_packages: ["foo"],
702 system: {
703 enabled: true,
704 },
705 system_server: {
706 enabled: true,
707 },
708 }
709 `)
710}
711
Paul Duffind0b9fca2022-09-30 18:11:41 +0100712func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
713 result := android.GroupFixturePreparers(
714 prepareForJavaTest,
715 PrepareForTestWithJavaSdkLibraryFiles,
716 FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
717 ).RunTestWithBp(t, `
718 java_sdk_library {
719 name: "foo-public",
720 srcs: ["a.java"],
721 api_packages: ["foo"],
722 public: {
723 enabled: true,
724 },
725 }
726
727 java_sdk_library {
728 name: "foo-system",
729 srcs: ["a.java"],
730 api_packages: ["foo"],
731 system: {
732 enabled: true,
733 },
734 }
735
736 java_sdk_library {
737 name: "foo-module-lib",
738 srcs: ["a.java"],
739 api_packages: ["foo"],
740 system: {
741 enabled: true,
742 },
743 module_lib: {
744 enabled: true,
745 },
746 }
747
748 java_sdk_library {
749 name: "foo-system-server",
750 srcs: ["a.java"],
751 api_packages: ["foo"],
752 system_server: {
753 enabled: true,
754 },
755 }
756
757 java_library {
758 name: "bar",
759 srcs: ["a.java"],
760 libs: ["foo-public", "foo-system", "foo-module-lib", "foo-system-server"],
761 sdk_version: "system_server_current",
762 }
763 `)
764
765 stubsPath := func(name string, scope *apiScope) string {
766 name = scope.stubsLibraryModuleName(name)
767 return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
768 }
769
770 // The bar library should depend on the highest (where system server is highest and public is
771 // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
772 // foo-<x> module is <x>.
773 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
774 stubLibraries := []string{
775 stubsPath("foo-public", apiScopePublic),
776 stubsPath("foo-system", apiScopeSystem),
777 stubsPath("foo-module-lib", apiScopeModuleLib),
778 stubsPath("foo-system-server", apiScopeSystemServer),
779 }
780 expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
781 if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
782 t.Errorf("expected pattern %q to match %#q", expected, actual)
783 }
784}
785
Colin Cross1d2b6b32021-06-01 13:18:08 -0700786func TestJavaSdkLibrary_MissingScope(t *testing.T) {
787 prepareForJavaTest.
788 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
789 RunTestWithBp(t, `
790 java_sdk_library {
791 name: "foo",
792 srcs: ["a.java"],
793 public: {
794 enabled: false,
795 },
796 }
797
798 java_library {
799 name: "baz",
800 srcs: ["a.java"],
801 libs: ["foo"],
802 sdk_version: "module_current",
803 }
804 `)
805}
806
807func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
808 android.GroupFixturePreparers(
809 prepareForJavaTest,
810 PrepareForTestWithJavaSdkLibraryFiles,
811 FixtureWithLastReleaseApis("foo"),
812 ).RunTestWithBp(t, `
813 java_sdk_library {
814 name: "foo",
815 srcs: ["a.java"],
816 system: {
817 enabled: true,
818 },
819 }
820
821 java_library {
822 name: "baz",
823 srcs: ["a.java"],
824 libs: ["foo"],
825 // foo does not have module-lib scope so it should fallback to system
826 sdk_version: "module_current",
827 }
828 `)
829}
830
831func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
832 result := android.GroupFixturePreparers(
833 prepareForJavaTest,
834 PrepareForTestWithJavaSdkLibraryFiles,
835 FixtureWithLastReleaseApis("foo"),
836 ).RunTestWithBp(t, `
837 java_sdk_library {
838 name: "foo",
839 srcs: ["a.java"],
840 system: {
841 enabled: true,
842 },
843 default_to_stubs: true,
844 }
845
846 java_library {
847 name: "baz",
848 srcs: ["a.java"],
849 libs: ["foo"],
850 // does not have sdk_version set, should fallback to module,
851 // which will then fallback to system because the module scope
852 // is not enabled.
853 }
854 `)
855 // The baz library should depend on the system stubs jar.
856 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
857 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
858 t.Errorf("expected %q, found %#q", expected, actual)
859 }
860}
861
862func TestJavaSdkLibraryImport(t *testing.T) {
863 result := prepareForJavaTest.RunTestWithBp(t, `
864 java_library {
865 name: "foo",
866 srcs: ["a.java"],
867 libs: ["sdklib"],
868 sdk_version: "current",
869 }
870
871 java_library {
872 name: "foo.system",
873 srcs: ["a.java"],
874 libs: ["sdklib"],
875 sdk_version: "system_current",
876 }
877
878 java_library {
879 name: "foo.test",
880 srcs: ["a.java"],
881 libs: ["sdklib"],
882 sdk_version: "test_current",
883 }
884
885 java_sdk_library_import {
886 name: "sdklib",
887 public: {
888 jars: ["a.jar"],
889 },
890 system: {
891 jars: ["b.jar"],
892 },
893 test: {
894 jars: ["c.jar"],
895 stub_srcs: ["c.java"],
896 },
897 }
898 `)
899
900 for _, scope := range []string{"", ".system", ".test"} {
901 fooModule := result.ModuleForTests("foo"+scope, "android_common")
902 javac := fooModule.Rule("javac")
903
904 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
905 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
906 }
907
908 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000909 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700910 `prebuilt_sdklib.stubs`,
911 `prebuilt_sdklib.stubs.source.test`,
912 `prebuilt_sdklib.stubs.system`,
913 `prebuilt_sdklib.stubs.test`,
914 })
915}
916
917func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
918 result := android.GroupFixturePreparers(
919 prepareForJavaTest,
920 PrepareForTestWithJavaSdkLibraryFiles,
921 FixtureWithLastReleaseApis("sdklib"),
922 ).RunTestWithBp(t, `
923 java_sdk_library {
924 name: "sdklib",
925 srcs: ["a.java"],
926 sdk_version: "none",
927 system_modules: "none",
928 public: {
929 enabled: true,
930 },
931 }
932
933 java_sdk_library_import {
934 name: "sdklib",
935 public: {
936 jars: ["a.jar"],
937 },
938 }
939 `)
940
941 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
942 `dex2oatd`,
943 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +0000944 `sdklib-removed.api.public.latest`,
945 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700946 `sdklib.impl`,
947 `sdklib.stubs`,
948 `sdklib.stubs.source`,
949 `sdklib.xml`,
950 })
951
952 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +0000953 `all_apex_contributions`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700954 `prebuilt_sdklib.stubs`,
955 `sdklib.impl`,
956 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
957 // dependency is added after prebuilts may have been renamed and so has to use
958 // the renamed name.
959 `sdklib.xml`,
960 })
961}
962
Paul Duffinbf4de042022-09-27 12:41:52 +0100963func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700964 result := android.GroupFixturePreparers(
965 prepareForJavaTest,
966 PrepareForTestWithJavaSdkLibraryFiles,
967 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100968 preparer,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700969 ).RunTestWithBp(t, `
970 java_sdk_library {
971 name: "sdklib",
972 srcs: ["a.java"],
973 sdk_version: "none",
974 system_modules: "none",
975 public: {
976 enabled: true,
977 },
978 }
979
980 java_sdk_library_import {
981 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +0100982 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -0700983 public: {
984 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100985 stub_srcs: ["a.java"],
986 current_api: "current.txt",
987 removed_api: "removed.txt",
988 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700989 },
990 }
Paul Duffinbf4de042022-09-27 12:41:52 +0100991
992 java_library {
993 name: "combined",
994 static_libs: [
995 "sdklib.stubs",
996 ],
997 java_resources: [
998 ":sdklib.stubs.source",
999 ":sdklib{.public.api.txt}",
1000 ":sdklib{.public.removed-api.txt}",
1001 ":sdklib{.public.annotations.zip}",
1002 ],
1003 sdk_version: "none",
1004 system_modules: "none",
1005 }
1006
1007 java_library {
1008 name: "public",
1009 srcs: ["a.java"],
1010 libs: ["sdklib"],
1011 sdk_version: "current",
1012 }
Colin Cross1d2b6b32021-06-01 13:18:08 -07001013 `)
1014
1015 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -07001016 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +00001017 `sdklib-removed.api.public.latest`,
1018 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001019 `sdklib.impl`,
1020 `sdklib.stubs`,
1021 `sdklib.stubs.source`,
1022 `sdklib.xml`,
1023 })
1024
1025 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +00001026 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +00001027 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001028 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +01001029 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001030 `sdklib.impl`,
1031 `sdklib.xml`,
1032 })
Paul Duffinbf4de042022-09-27 12:41:52 +01001033
1034 // Make sure that dependencies on child modules use the prebuilt when preferred.
1035 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
1036 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
1037 `prebuilt_sdklib`,
1038 `prebuilt_sdklib`,
1039 `prebuilt_sdklib`,
1040 `prebuilt_sdklib.stubs`,
1041 `prebuilt_sdklib.stubs.source`,
1042 })
1043
1044 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1045 // prebuilt library.
1046 public := result.ModuleForTests("public", "android_common")
1047 rule := public.Output("javac/public.jar")
1048 inputs := rule.Implicits.Strings()
1049 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
1050 if !android.InList(expected, inputs) {
1051 t.Errorf("expected %q to contain %q", inputs, expected)
1052 }
1053}
1054
1055func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
1056 t.Run("prefer", func(t *testing.T) {
1057 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1058 })
1059
1060 t.Run("use_source_config_var", func(t *testing.T) {
1061 testJavaSdkLibraryImport_Preferred(t,
1062 "use_source_config_var: {config_namespace: \"acme\", var_name: \"use_source\"},",
1063 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1064 variables.VendorVars = map[string]map[string]string{
1065 "acme": {
1066 "use_source": "false",
1067 },
1068 }
1069 }))
1070 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001071}
1072
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001073// If a module is listed in `mainline_module_contributions, it should be used
1074// It will supersede any other source vs prebuilt selection mechanism like `prefer` attribute
1075func TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) {
1076 bp := `
1077 apex_contributions {
1078 name: "my_mainline_module_contributions",
1079 api_domain: "my_mainline_module",
1080 contents: [
1081 // legacy mechanism prefers the prebuilt
1082 // mainline_module_contributions supersedes this since source is listed explicitly
1083 "sdklib.prebuilt_preferred_using_legacy_flags",
1084
1085 // legacy mechanism prefers the source
1086 // mainline_module_contributions supersedes this since prebuilt is listed explicitly
1087 "prebuilt_sdklib.source_preferred_using_legacy_flags",
1088 ],
1089 }
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001090 java_sdk_library {
1091 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1092 srcs: ["a.java"],
1093 sdk_version: "none",
1094 system_modules: "none",
1095 public: {
1096 enabled: true,
1097 },
1098 system: {
1099 enabled: true,
1100 }
1101 }
1102 java_sdk_library_import {
1103 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1104 prefer: true, // prebuilt is preferred using legacy mechanism
1105 public: {
1106 jars: ["a.jar"],
1107 stub_srcs: ["a.java"],
1108 current_api: "current.txt",
1109 removed_api: "removed.txt",
1110 annotations: "annotations.zip",
1111 },
1112 system: {
1113 jars: ["a.jar"],
1114 stub_srcs: ["a.java"],
1115 current_api: "current.txt",
1116 removed_api: "removed.txt",
1117 annotations: "annotations.zip",
1118 },
1119 }
1120 java_sdk_library {
1121 name: "sdklib.source_preferred_using_legacy_flags",
1122 srcs: ["a.java"],
1123 sdk_version: "none",
1124 system_modules: "none",
1125 public: {
1126 enabled: true,
1127 },
1128 system: {
1129 enabled: true,
1130 }
1131 }
1132 java_sdk_library_import {
1133 name: "sdklib.source_preferred_using_legacy_flags",
1134 prefer: false, // source is preferred using legacy mechanism
1135 public: {
1136 jars: ["a.jar"],
1137 stub_srcs: ["a.java"],
1138 current_api: "current.txt",
1139 removed_api: "removed.txt",
1140 annotations: "annotations.zip",
1141 },
1142 system: {
1143 jars: ["a.jar"],
1144 stub_srcs: ["a.java"],
1145 current_api: "current.txt",
1146 removed_api: "removed.txt",
1147 annotations: "annotations.zip",
1148 },
1149 }
1150
1151 // rdeps
1152 java_library {
1153 name: "public",
1154 srcs: ["a.java"],
1155 libs: [
1156 // this should get source since source is listed in my_mainline_module_contributions
1157 "sdklib.prebuilt_preferred_using_legacy_flags.stubs",
1158 "sdklib.prebuilt_preferred_using_legacy_flags.stubs.system",
1159
1160 // this should get prebuilt since source is listed in my_mainline_module_contributions
1161 "sdklib.source_preferred_using_legacy_flags.stubs",
1162 "sdklib.source_preferred_using_legacy_flags.stubs.system",
1163
1164 ],
1165 }
1166 `
1167 result := android.GroupFixturePreparers(
1168 prepareForJavaTest,
1169 PrepareForTestWithJavaSdkLibraryFiles,
1170 FixtureWithLastReleaseApis("sdklib.source_preferred_using_legacy_flags", "sdklib.prebuilt_preferred_using_legacy_flags"),
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001171 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1172 variables.BuildFlags = map[string]string{
1173 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "my_mainline_module_contributions",
1174 }
1175 }),
1176 ).RunTestWithBp(t, bp)
1177
1178 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1179 public := result.ModuleForTests("public", "android_common")
1180 rule := public.Output("javac/public.jar")
1181 inputs := rule.Implicits.Strings()
1182 expectedInputs := []string{
1183 // source
1184 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.jar",
1185 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.jar",
1186
1187 // prebuilt
1188 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.jar",
1189 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs.system/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.system.jar",
1190 }
1191 for _, expected := range expectedInputs {
1192 if !android.InList(expected, inputs) {
1193 t.Errorf("expected %q to contain %q", inputs, expected)
1194 }
1195 }
1196}
1197
Colin Cross1d2b6b32021-06-01 13:18:08 -07001198func TestJavaSdkLibraryEnforce(t *testing.T) {
1199 partitionToBpOption := func(partition string) string {
1200 switch partition {
1201 case "system":
1202 return ""
1203 case "vendor":
1204 return "soc_specific: true,"
1205 case "product":
1206 return "product_specific: true,"
1207 default:
1208 panic("Invalid partition group name: " + partition)
1209 }
1210 }
1211
1212 type testConfigInfo struct {
1213 libraryType string
1214 fromPartition string
1215 toPartition string
1216 enforceVendorInterface bool
1217 enforceProductInterface bool
1218 enforceJavaSdkLibraryCheck bool
1219 allowList []string
1220 }
1221
1222 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1223 bpFileTemplate := `
1224 java_library {
1225 name: "foo",
1226 srcs: ["foo.java"],
1227 libs: ["bar"],
1228 sdk_version: "current",
1229 %s
1230 }
1231
1232 %s {
1233 name: "bar",
1234 srcs: ["bar.java"],
1235 sdk_version: "current",
1236 %s
1237 }
1238 `
1239
1240 bpFile := fmt.Sprintf(bpFileTemplate,
1241 partitionToBpOption(info.fromPartition),
1242 info.libraryType,
1243 partitionToBpOption(info.toPartition))
1244
1245 return android.GroupFixturePreparers(
1246 PrepareForTestWithJavaSdkLibraryFiles,
1247 FixtureWithLastReleaseApis("bar"),
1248 android.FixtureWithRootAndroidBp(bpFile),
1249 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1250 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
1251 if info.enforceVendorInterface {
1252 variables.DeviceVndkVersion = proptools.StringPtr("current")
1253 }
1254 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1255 variables.InterPartitionJavaLibraryAllowList = info.allowList
1256 }),
1257 )
1258 }
1259
1260 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1261 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1262 errorHandler := android.FixtureExpectsNoErrors
1263 if expectedErrorPattern != "" {
1264 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1265 }
1266 android.GroupFixturePreparers(
1267 prepareForJavaTest,
1268 createPreparer(info),
1269 ).
1270 ExtendWithErrorHandler(errorHandler).
1271 RunTest(t)
1272 })
1273 }
1274
1275 errorMessage := "is not allowed across the partitions"
1276
1277 runTest(t, testConfigInfo{
1278 libraryType: "java_library",
1279 fromPartition: "product",
1280 toPartition: "system",
1281 enforceVendorInterface: true,
1282 enforceProductInterface: true,
1283 enforceJavaSdkLibraryCheck: false,
1284 }, "")
1285
1286 runTest(t, testConfigInfo{
1287 libraryType: "java_library",
1288 fromPartition: "product",
1289 toPartition: "system",
1290 enforceVendorInterface: true,
1291 enforceProductInterface: false,
1292 enforceJavaSdkLibraryCheck: true,
1293 }, "")
1294
1295 runTest(t, testConfigInfo{
1296 libraryType: "java_library",
1297 fromPartition: "product",
1298 toPartition: "system",
1299 enforceVendorInterface: true,
1300 enforceProductInterface: true,
1301 enforceJavaSdkLibraryCheck: true,
1302 }, errorMessage)
1303
1304 runTest(t, testConfigInfo{
1305 libraryType: "java_library",
1306 fromPartition: "vendor",
1307 toPartition: "system",
1308 enforceVendorInterface: true,
1309 enforceProductInterface: true,
1310 enforceJavaSdkLibraryCheck: true,
1311 }, errorMessage)
1312
1313 runTest(t, testConfigInfo{
1314 libraryType: "java_library",
1315 fromPartition: "vendor",
1316 toPartition: "system",
1317 enforceVendorInterface: true,
1318 enforceProductInterface: true,
1319 enforceJavaSdkLibraryCheck: true,
1320 allowList: []string{"bar"},
1321 }, "")
1322
1323 runTest(t, testConfigInfo{
1324 libraryType: "java_library",
1325 fromPartition: "vendor",
1326 toPartition: "product",
1327 enforceVendorInterface: true,
1328 enforceProductInterface: true,
1329 enforceJavaSdkLibraryCheck: true,
1330 }, errorMessage)
1331
1332 runTest(t, testConfigInfo{
1333 libraryType: "java_sdk_library",
1334 fromPartition: "product",
1335 toPartition: "system",
1336 enforceVendorInterface: true,
1337 enforceProductInterface: true,
1338 enforceJavaSdkLibraryCheck: true,
1339 }, "")
1340
1341 runTest(t, testConfigInfo{
1342 libraryType: "java_sdk_library",
1343 fromPartition: "vendor",
1344 toPartition: "system",
1345 enforceVendorInterface: true,
1346 enforceProductInterface: true,
1347 enforceJavaSdkLibraryCheck: true,
1348 }, "")
1349
1350 runTest(t, testConfigInfo{
1351 libraryType: "java_sdk_library",
1352 fromPartition: "vendor",
1353 toPartition: "product",
1354 enforceVendorInterface: true,
1355 enforceProductInterface: true,
1356 enforceJavaSdkLibraryCheck: true,
1357 }, "")
1358}
Colin Cross30c491b2021-06-01 13:39:09 -07001359
1360func TestJavaSdkLibraryDist(t *testing.T) {
1361 result := android.GroupFixturePreparers(
1362 PrepareForTestWithJavaBuildComponents,
1363 PrepareForTestWithJavaDefaultModules,
1364 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001365 FixtureWithLastReleaseApis(
1366 "sdklib_no_group",
1367 "sdklib_group_foo",
1368 "sdklib_owner_foo",
1369 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001370 ).RunTestWithBp(t, `
1371 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001372 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001373 srcs: ["foo.java"],
1374 }
1375
1376 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001377 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001378 srcs: ["foo.java"],
1379 dist_group: "foo",
1380 }
1381
1382 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001383 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001384 srcs: ["foo.java"],
1385 owner: "foo",
1386 }
1387
1388 java_sdk_library {
1389 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001390 srcs: ["foo.java"],
1391 dist_stem: "foo",
1392 }
Colin Cross30c491b2021-06-01 13:39:09 -07001393 `)
1394
1395 type testCase struct {
1396 module string
1397 distDir string
1398 distStem string
1399 }
1400 testCases := []testCase{
1401 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001402 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001403 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001404 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001405 },
1406 {
Colin Cross986b69a2021-06-01 13:13:40 -07001407 module: "sdklib_group_foo",
1408 distDir: "apistubs/foo/public",
1409 distStem: "sdklib_group_foo.jar",
1410 },
1411 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001412 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001413 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001414 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001415 distStem: "sdklib_owner_foo.jar",
1416 },
1417 {
1418 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001419 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001420 distStem: "foo.jar",
1421 },
Colin Cross30c491b2021-06-01 13:39:09 -07001422 }
1423
1424 for _, tt := range testCases {
1425 t.Run(tt.module, func(t *testing.T) {
1426 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1427 dists := m.Dists()
1428 if len(dists) != 1 {
1429 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1430 }
1431 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1432 t.Errorf("expected dist dir %q, got %q", w, g)
1433 }
1434 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1435 t.Errorf("expected dist stem %q, got %q", w, g)
1436 }
1437 })
1438 }
1439}
satayev8f088b02021-12-06 11:40:46 +00001440
1441func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1442 preparer := android.GroupFixturePreparers(
1443 PrepareForTestWithJavaBuildComponents,
1444 PrepareForTestWithJavaDefaultModules,
1445 PrepareForTestWithJavaSdkLibraryFiles,
1446 )
1447
1448 preparer.RunTestWithBp(t, `
1449 java_sdk_library {
1450 name: "sdklib",
1451 srcs: ["a.java"],
1452 static_libs: ["util"],
1453 min_sdk_version: "30",
1454 unsafe_ignore_missing_latest_api: true,
1455 }
1456
1457 java_library {
1458 name: "util",
1459 srcs: ["a.java"],
1460 min_sdk_version: "30",
1461 }
1462 `)
1463
1464 preparer.
1465 RunTestWithBp(t, `
1466 java_sdk_library {
1467 name: "sdklib",
1468 srcs: ["a.java"],
1469 libs: ["util"],
1470 impl_only_libs: ["util"],
1471 stub_only_libs: ["util"],
1472 stub_only_static_libs: ["util"],
1473 min_sdk_version: "30",
1474 unsafe_ignore_missing_latest_api: true,
1475 }
1476
1477 java_library {
1478 name: "util",
1479 srcs: ["a.java"],
1480 }
1481 `)
1482
1483 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1484 RunTestWithBp(t, `
1485 java_sdk_library {
1486 name: "sdklib",
1487 srcs: ["a.java"],
1488 static_libs: ["util"],
1489 min_sdk_version: "30",
1490 unsafe_ignore_missing_latest_api: true,
1491 }
1492
1493 java_library {
1494 name: "util",
1495 srcs: ["a.java"],
1496 min_sdk_version: "31",
1497 }
1498 `)
1499
1500 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1501 RunTestWithBp(t, `
1502 java_sdk_library {
1503 name: "sdklib",
1504 srcs: ["a.java"],
1505 static_libs: ["util"],
1506 min_sdk_version: "30",
1507 unsafe_ignore_missing_latest_api: true,
1508 }
1509
1510 java_library {
1511 name: "util",
1512 srcs: ["a.java"],
1513 static_libs: ["another_util"],
1514 min_sdk_version: "30",
1515 }
1516
1517 java_library {
1518 name: "another_util",
1519 srcs: ["a.java"],
1520 min_sdk_version: "31",
1521 }
1522 `)
1523}
Nikita Ioffed732da72022-11-21 12:38:25 +00001524
1525func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1526 result := android.GroupFixturePreparers(
1527 prepareForJavaTest,
1528 PrepareForTestWithJavaSdkLibraryFiles,
1529 FixtureWithLastReleaseApis("foo"),
1530 ).RunTestWithBp(t, `
1531 java_sdk_library {
1532 name: "foo",
1533 srcs: ["a.java"],
1534 public: {
1535 enabled: true,
1536 },
1537 stub_only_libs: ["bar-lib"],
1538 }
1539
1540 java_library {
1541 name: "bar-lib",
1542 srcs: ["b.java"],
1543 }
1544 `)
1545
1546 // The foo.stubs.source should depend on bar-lib
1547 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1548 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1549}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001550
Mark White9421c4c2023-08-10 00:07:03 +00001551func TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) {
1552 result := android.GroupFixturePreparers(
1553 prepareForJavaTest,
1554 PrepareForTestWithJavaSdkLibraryFiles,
1555 FixtureWithLastReleaseApis("foo"),
1556 ).RunTestWithBp(t, `
1557 java_sdk_library {
1558 name: "foo",
1559 srcs: ["a.java"],
1560 public: {
1561 enabled: true,
1562 libs: ["bar-lib"],
1563 },
1564 }
1565
1566 java_library {
1567 name: "bar-lib",
1568 srcs: ["b.java"],
1569 }
1570 `)
1571
1572 // The foo.stubs.source should depend on bar-lib
1573 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1574 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1575}
1576
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001577func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
1578 result := android.GroupFixturePreparers(
1579 prepareForJavaTest,
1580 PrepareForTestWithJavaSdkLibraryFiles,
1581 FixtureWithLastReleaseApis("foo"),
1582 android.FixtureModifyConfig(func(config android.Config) {
1583 config.SetApiLibraries([]string{"foo"})
1584 }),
1585 ).RunTestWithBp(t, `
1586 java_sdk_library {
1587 name: "foo",
1588 srcs: ["a.java", "b.java"],
1589 api_packages: ["foo"],
1590 system: {
1591 enabled: true,
1592 },
1593 module_lib: {
1594 enabled: true,
1595 },
1596 test: {
1597 enabled: true,
1598 },
1599 }
1600 `)
1601
1602 testCases := []struct {
Jihoon Kangca198c22023-06-22 23:13:51 +00001603 scope *apiScope
1604 apiContributions []string
1605 fullApiSurfaceStub string
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001606 }{
1607 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001608 scope: apiScopePublic,
1609 apiContributions: []string{"foo.stubs.source.api.contribution"},
Jihoon Kange7ee2562023-07-25 05:51:46 +00001610 fullApiSurfaceStub: "android_stubs_current",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001611 },
1612 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001613 scope: apiScopeSystem,
1614 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kange7ee2562023-07-25 05:51:46 +00001615 fullApiSurfaceStub: "android_system_stubs_current",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001616 },
1617 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001618 scope: apiScopeTest,
1619 apiContributions: []string{"foo.stubs.source.test.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kange7ee2562023-07-25 05:51:46 +00001620 fullApiSurfaceStub: "android_test_stubs_current",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001621 },
1622 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001623 scope: apiScopeModuleLib,
1624 apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1625 fullApiSurfaceStub: "android_module_lib_stubs_current_full.from-text",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001626 },
1627 }
1628
1629 for _, c := range testCases {
1630 m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1631 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
Jihoon Kangca198c22023-06-22 23:13:51 +00001632 android.AssertStringEquals(t, "Module expected to contain full api surface api library", c.fullApiSurfaceStub, *m.properties.Full_api_surface_stub)
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001633 }
1634}
Jihoon Kang786df932023-09-07 01:18:31 +00001635
1636func TestStaticDepStubLibrariesVisibility(t *testing.T) {
1637 android.GroupFixturePreparers(
1638 prepareForJavaTest,
1639 PrepareForTestWithJavaSdkLibraryFiles,
1640 FixtureWithLastReleaseApis("foo"),
1641 android.FixtureMergeMockFs(
1642 map[string][]byte{
1643 "A.java": nil,
1644 "dir/Android.bp": []byte(
1645 `
1646 java_library {
1647 name: "bar",
1648 srcs: ["A.java"],
1649 libs: ["foo.stubs.from-source"],
1650 }
1651 `),
1652 "dir/A.java": nil,
1653 },
1654 ).ExtendWithErrorHandler(
1655 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1656 `module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1657 ).RunTestWithBp(t, `
1658 java_sdk_library {
1659 name: "foo",
1660 srcs: ["A.java"],
1661 }
1662 `)
1663}
Jamie Garsidee570ace2023-11-27 12:07:36 +00001664
1665func TestSdkLibraryDependency(t *testing.T) {
1666 result := android.GroupFixturePreparers(
1667 prepareForJavaTest,
1668 PrepareForTestWithJavaSdkLibraryFiles,
1669 FixtureWithPrebuiltApis(map[string][]string{
1670 "30": {"bar", "foo"},
1671 }),
1672 ).RunTestWithBp(t,
1673 `
1674 java_sdk_library {
1675 name: "foo",
1676 srcs: ["a.java", "b.java"],
1677 api_packages: ["foo"],
1678 }
1679
1680 java_sdk_library {
1681 name: "bar",
1682 srcs: ["c.java", "b.java"],
1683 libs: [
1684 "foo",
1685 ],
1686 uses_libs: [
1687 "foo",
1688 ],
1689 }
1690`)
1691
1692 barPermissions := result.ModuleForTests("bar.xml", "android_common").Rule("java_sdk_xml")
1693
1694 android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barPermissions.RuleParams.Command, `dependency=\"foo\"`)
1695}