blob: 12d5877c8dfcc243bf02860be11b699fcd10901f [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 }),
Colin Crossa66b4632024-08-08 15:50:47 -070038 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -070039 ).RunTestWithBp(t, `
40 droiddoc_exported_dir {
41 name: "droiddoc-templates-sdk",
42 path: ".",
43 }
44 java_sdk_library {
45 name: "foo",
46 srcs: ["a.java", "b.java"],
47 api_packages: ["foo"],
48 }
49 java_sdk_library {
50 name: "bar",
51 srcs: ["a.java", "b.java"],
52 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080053 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070054 }
55 java_library {
56 name: "baz",
57 srcs: ["c.java"],
58 libs: ["foo", "bar.stubs"],
59 sdk_version: "system_current",
60 }
61 java_sdk_library {
62 name: "barney",
63 srcs: ["c.java"],
64 api_only: true,
65 }
66 java_sdk_library {
67 name: "betty",
68 srcs: ["c.java"],
69 shared_library: false,
70 }
71 java_sdk_library_import {
72 name: "quuz",
73 public: {
74 jars: ["c.jar"],
Jihoon Kang71c86832023-09-13 01:01:53 +000075 current_api: "api/current.txt",
76 removed_api: "api/removed.txt",
Colin Cross1d2b6b32021-06-01 13:18:08 -070077 },
78 }
79 java_sdk_library_import {
80 name: "fred",
81 public: {
82 jars: ["b.jar"],
83 },
84 }
85 java_sdk_library_import {
86 name: "wilma",
87 public: {
88 jars: ["b.jar"],
89 },
90 shared_library: false,
91 }
92 java_library {
93 name: "qux",
94 srcs: ["c.java"],
95 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
96 sdk_version: "system_current",
97 }
98 java_library {
99 name: "baz-test",
100 srcs: ["c.java"],
101 libs: ["foo"],
102 sdk_version: "test_current",
103 }
104 java_library {
105 name: "baz-29",
106 srcs: ["c.java"],
107 libs: ["foo"],
108 sdk_version: "system_29",
109 }
110 java_library {
111 name: "baz-module-30",
112 srcs: ["c.java"],
113 libs: ["foo"],
114 sdk_version: "module_30",
115 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000116 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700117
118 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100119 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700120 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
121 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
122 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
123 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
124 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
125 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jihoon Kangd48abd52023-02-02 22:32:31 +0000126 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
Jihoon Kang1c92c3e2023-03-23 17:44:51 +0000127 result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700128 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
129 result.ModuleForTests("foo.api.public.28", "")
130 result.ModuleForTests("foo.api.system.28", "")
131 result.ModuleForTests("foo.api.test.28", "")
132
Yu Liu663e4502024-08-12 18:23:59 +0000133 exportedComponentsInfo, _ := android.OtherModuleProvider(result, foo.Module(), android.ExportedComponentsInfoProvider)
Paul Duffinb97b1572021-04-29 21:50:40 +0100134 expectedFooExportedComponents := []string{
Jihoon Kang748a24d2024-03-20 21:29:39 +0000135 "foo-removed.api.combined.public.latest",
136 "foo-removed.api.combined.system.latest",
137 "foo.api.combined.public.latest",
138 "foo.api.combined.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100139 "foo.stubs",
Jihoon Kangbd093452023-12-26 19:08:01 +0000140 "foo.stubs.exportable",
141 "foo.stubs.exportable.system",
142 "foo.stubs.exportable.test",
Paul Duffinb97b1572021-04-29 21:50:40 +0100143 "foo.stubs.source",
144 "foo.stubs.source.system",
145 "foo.stubs.source.test",
146 "foo.stubs.system",
147 "foo.stubs.test",
148 }
149 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
150
Colin Cross1d2b6b32021-06-01 13:18:08 -0700151 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
152 // tests if baz is actually linked to the stubs lib
153 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
154 // ... and not to the impl lib
155 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
156 // test if baz is not linked to the system variant of foo
157 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
158
159 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
160 // tests if baz-test is actually linked to the test stubs lib
161 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
162
163 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
164 // tests if baz-29 is actually linked to the system 29 stubs lib
165 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
166
167 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
168 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
169 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
170
171 // test if baz has exported SDK lib names foo and bar to qux
172 qux := result.ModuleForTests("qux", "android_common")
173 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100174 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100175 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100176 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700177 }
Wei Li1e73c652021-12-06 13:35:11 -0800178
Jihoon Kang71c86832023-09-13 01:01:53 +0000179 // test if quuz have created the api_contribution module
180 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "")
181
Jihoon Kanga3a05462024-04-05 00:36:44 +0000182 fooImplDexJar := result.ModuleForTests("foo.impl", "android_common").Rule("d8")
183 // tests if kotlinc generated files are NOT excluded from output of foo.impl.
184 android.AssertStringDoesNotContain(t, "foo.impl dex", fooImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Wei Li1e73c652021-12-06 13:35:11 -0800185
Jihoon Kanga3a05462024-04-05 00:36:44 +0000186 barImplDexJar := result.ModuleForTests("bar.impl", "android_common").Rule("d8")
187 // tests if kotlinc generated files are excluded from output of bar.impl.
188 android.AssertStringDoesContain(t, "bar.impl dex", barImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700189}
190
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000191func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
192 result := android.GroupFixturePreparers(
193 prepareForJavaTest,
194 PrepareForTestWithJavaSdkLibraryFiles,
195 FixtureWithPrebuiltApis(map[string][]string{
196 "28": {"foo"},
197 "29": {"foo"},
198 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
199 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000200 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Pedro Loureirob638c622021-12-22 15:28:05 +0000201 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
Pedro Loureiroc3621422021-09-28 15:40:23 +0000202 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000203 ).RunTestWithBp(t,
204 `
205 java_sdk_library {
206 name: "fooUpdatable",
207 srcs: ["a.java", "b.java"],
208 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000209 on_bootclasspath_since: "U",
210 on_bootclasspath_before: "V",
211 min_device_sdk: "W",
Pedro Loureirob638c622021-12-22 15:28:05 +0000212 max_device_sdk: "X",
Pedro Loureiroc3621422021-09-28 15:40:23 +0000213 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000214 }
215 java_sdk_library {
216 name: "foo",
217 srcs: ["a.java", "b.java"],
218 api_packages: ["foo"],
219 }
220`)
Pedro Loureirob638c622021-12-22 15:28:05 +0000221
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000222 // test that updatability attributes are passed on correctly
Paul Duffin1816cde2024-04-10 10:58:21 +0100223 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Output("fooUpdatable.xml")
224 fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
225 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-since="U"`)
226 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-before="V"`)
227 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `min-device-sdk="W"`)
228 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `max-device-sdk="X"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000229
230 // double check that updatability attributes are not written if they don't exist in the bp file
231 // the permissions file for the foo library defined above
Paul Duffin1816cde2024-04-10 10:58:21 +0100232 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
233 fooPermissionsContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooPermissions)
234 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-since`)
235 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-before`)
236 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `min-device-sdk`)
237 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000238}
239
Pedro Loureiroc3621422021-09-28 15:40:23 +0000240func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000241 android.GroupFixturePreparers(
242 prepareForJavaTest,
243 PrepareForTestWithJavaSdkLibraryFiles,
244 FixtureWithPrebuiltApis(map[string][]string{
245 "30": {"fooUpdatable", "fooUpdatableErr"},
246 }),
247 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
248 []string{
249 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
250 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
251 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000252 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000253 })).RunTestWithBp(t,
254 `
255 java_sdk_library {
256 name: "fooUpdatableErr",
257 srcs: ["a.java", "b.java"],
258 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000259 on_bootclasspath_since: "aaa",
260 on_bootclasspath_before: "bbc",
261 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000262 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000263 }
264`)
265}
266
Pedro Loureiroc3621422021-09-28 15:40:23 +0000267func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
268 android.GroupFixturePreparers(
269 prepareForJavaTest,
270 PrepareForTestWithJavaSdkLibraryFiles,
271 FixtureWithPrebuiltApis(map[string][]string{
272 "28": {"foo"},
273 }),
274 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
275 []string{
276 "on_bootclasspath_since: Attribute value needs to be at least T",
277 "on_bootclasspath_before: Attribute value needs to be at least T",
278 "min_device_sdk: Attribute value needs to be at least T",
279 "max_device_sdk: Attribute value needs to be at least T",
280 },
281 )).RunTestWithBp(t,
282 `
283 java_sdk_library {
284 name: "foo",
285 srcs: ["a.java", "b.java"],
286 api_packages: ["foo"],
287 on_bootclasspath_since: "S",
288 on_bootclasspath_before: "S",
289 min_device_sdk: "S",
290 max_device_sdk: "S",
291 min_sdk_version: "S",
292 }
293`)
294}
295
296func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
297 android.GroupFixturePreparers(
298 prepareForJavaTest,
299 PrepareForTestWithJavaSdkLibraryFiles,
300 FixtureWithPrebuiltApis(map[string][]string{
301 "28": {"foo"},
302 }),
303 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
304 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
305 }),
306 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
307 []string{
308 "min_device_sdk can't be greater than max_device_sdk",
309 },
310 )).RunTestWithBp(t,
311 `
312 java_sdk_library {
313 name: "foo",
314 srcs: ["a.java", "b.java"],
315 api_packages: ["foo"],
316 min_device_sdk: "V",
317 max_device_sdk: "U",
318 min_sdk_version: "S",
319 }
320`)
321}
322
323func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
324 android.GroupFixturePreparers(
325 prepareForJavaTest,
326 PrepareForTestWithJavaSdkLibraryFiles,
327 FixtureWithPrebuiltApis(map[string][]string{
328 "28": {"foo"},
329 }),
330 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
331 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
332 }),
333 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
334 []string{
335 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
336 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
337 },
338 )).RunTestWithBp(t,
339 `
340 java_sdk_library {
341 name: "foo",
342 srcs: ["a.java", "b.java"],
343 api_packages: ["foo"],
344 min_device_sdk: "U",
345 max_device_sdk: "U",
346 min_sdk_version: "V",
347 }
348`)
349}
350
351func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
352 result := android.GroupFixturePreparers(
353 prepareForJavaTest,
354 PrepareForTestWithJavaSdkLibraryFiles,
355 FixtureWithPrebuiltApis(map[string][]string{
356 "30": {"foo"},
357 }),
358 ).RunTestWithBp(t,
359 `
360 java_sdk_library {
361 name: "foo",
362 srcs: ["a.java", "b.java"],
363 min_device_sdk: "Tiramisu",
364 min_sdk_version: "S",
365 }
366`)
367 // test that updatability attributes are passed on correctly
Paul Duffin1816cde2024-04-10 10:58:21 +0100368 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
369 fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
370 android.AssertStringDoesContain(t, "foo.xml contents", fooUpdatableContents, `<apex-library`)
371 android.AssertStringDoesNotContain(t, "foo.xml contents", fooUpdatableContents, `<library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000372}
373
Colin Cross1d2b6b32021-06-01 13:18:08 -0700374func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
375 result := android.GroupFixturePreparers(
376 prepareForJavaTest,
377 PrepareForTestWithJavaSdkLibraryFiles,
378 FixtureWithLastReleaseApis("sdklib"),
379 ).RunTestWithBp(t, `
380 java_sdk_library {
381 name: "sdklib",
382 srcs: ["a.java"],
383 libs: ["lib"],
384 static_libs: ["static-lib"],
385 impl_only_libs: ["impl-only-lib"],
386 stub_only_libs: ["stub-only-lib"],
387 stub_only_static_libs: ["stub-only-static-lib"],
388 }
389 java_defaults {
390 name: "defaults",
391 srcs: ["a.java"],
392 sdk_version: "current",
393 }
394 java_library { name: "lib", defaults: ["defaults"] }
395 java_library { name: "static-lib", defaults: ["defaults"] }
396 java_library { name: "impl-only-lib", defaults: ["defaults"] }
397 java_library { name: "stub-only-lib", defaults: ["defaults"] }
398 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
399 `)
400 var expectations = []struct {
401 lib string
402 on_impl_classpath bool
403 on_stub_classpath bool
404 in_impl_combined bool
405 in_stub_combined bool
406 }{
407 {lib: "lib", on_impl_classpath: true},
408 {lib: "static-lib", in_impl_combined: true},
409 {lib: "impl-only-lib", on_impl_classpath: true},
410 {lib: "stub-only-lib", on_stub_classpath: true},
411 {lib: "stub-only-static-lib", in_stub_combined: true},
412 }
413 verify := func(sdklib, dep string, cp, combined bool) {
414 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
415 expected := cp || combined // Every combined jar is also on the classpath.
416 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
417
418 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
419 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
420 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
421 }
422 for _, expectation := range expectations {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700423 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
424
Jihoon Kang1147b312023-06-08 23:25:57 +0000425 stubName := apiScopePublic.sourceStubLibraryModuleName("sdklib")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700426 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
427 }
428}
429
430func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
431 result := android.GroupFixturePreparers(
432 prepareForJavaTest,
433 PrepareForTestWithJavaSdkLibraryFiles,
434 FixtureWithLastReleaseApis("foo"),
435 ).RunTestWithBp(t, `
436 java_sdk_library {
437 name: "foo",
438 srcs: ["a.java"],
439 api_only: true,
440 public: {
441 enabled: true,
442 },
443 }
444
445 java_library {
446 name: "bar",
447 srcs: ["b.java"],
448 libs: ["foo"],
449 }
450 `)
451
452 // The bar library should depend on the stubs jar.
453 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
454 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
455 t.Errorf("expected %q, found %#q", expected, actual)
456 }
457}
458
Anton Hanssond78eb762021-09-21 15:25:12 +0100459func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700460 android.GroupFixturePreparers(
461 prepareForJavaTest,
462 PrepareForTestWithJavaSdkLibraryFiles,
463 FixtureWithLastReleaseApis("foo"),
464 ).RunTestWithBp(t, `
465 java_sdk_library {
466 name: "foo",
467 srcs: ["a.java"],
468 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100469 annotations_enabled: true,
470 public: {
471 enabled: true,
472 },
473 }
474 java_library {
475 name: "bar",
476 srcs: ["b.java", ":foo{.public.stubs.source}"],
477 java_resources: [":foo{.public.annotations.zip}"],
478 }
479 `)
480}
481
482func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
483 android.GroupFixturePreparers(
484 prepareForJavaTest,
485 PrepareForTestWithJavaSdkLibraryFiles,
486 FixtureWithLastReleaseApis("foo"),
487 ).
mrziwang9f7b9f42024-07-10 12:18:06 -0700488 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference tag ".public.annotations.zip"`)).
Anton Hanssond78eb762021-09-21 15:25:12 +0100489 RunTestWithBp(t, `
490 java_sdk_library {
491 name: "foo",
492 srcs: ["a.java"],
493 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700494 public: {
495 enabled: true,
496 },
497 }
498
499 java_library {
500 name: "bar",
501 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100502 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700503 }
504 `)
505}
506
507func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
508 android.GroupFixturePreparers(
509 prepareForJavaTest,
510 PrepareForTestWithJavaSdkLibraryFiles,
511 FixtureWithLastReleaseApis("foo"),
512 ).
mrziwang9f7b9f42024-07-10 12:18:06 -0700513 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference tag ".system.stubs.source"`)).
Colin Cross1d2b6b32021-06-01 13:18:08 -0700514 RunTestWithBp(t, `
515 java_sdk_library {
516 name: "foo",
517 srcs: ["a.java"],
518 api_packages: ["foo"],
519 public: {
520 enabled: true,
521 },
522 }
523
524 java_library {
525 name: "bar",
526 srcs: ["b.java", ":foo{.system.stubs.source}"],
527 }
528 `)
529}
530
531func TestJavaSdkLibrary_Deps(t *testing.T) {
532 result := android.GroupFixturePreparers(
533 prepareForJavaTest,
534 PrepareForTestWithJavaSdkLibraryFiles,
535 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -0700536 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700537 ).RunTestWithBp(t, `
538 java_sdk_library {
539 name: "sdklib",
540 srcs: ["a.java"],
541 sdk_version: "none",
542 system_modules: "none",
543 public: {
544 enabled: true,
545 },
546 }
547 `)
548
549 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
550 `dex2oatd`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000551 `sdklib-removed.api.combined.public.latest`,
552 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700553 `sdklib.impl`,
554 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000555 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700556 `sdklib.stubs.source`,
557 `sdklib.xml`,
558 })
559}
560
561func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
562 prepareForJavaTest.RunTestWithBp(t, `
563 java_sdk_library_import {
564 name: "foo",
565 public: {
566 jars: ["a.jar"],
567 stub_srcs: ["a.java"],
568 current_api: "api/current.txt",
569 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100570 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700571 },
572 }
573
574 java_library {
575 name: "bar",
576 srcs: [":foo{.public.stubs.source}"],
577 java_resources: [
578 ":foo{.public.api.txt}",
579 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100580 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700581 ],
582 }
583 `)
584}
585
586func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
587 bp := `
588 java_sdk_library_import {
589 name: "foo",
590 public: {
591 jars: ["a.jar"],
592 },
593 }
594 `
595
596 t.Run("stubs.source", func(t *testing.T) {
597 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700598 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo" is not a SourceFileProducer or having valid output file for tag ".public.stubs.source"`)).
Colin Cross1d2b6b32021-06-01 13:18:08 -0700599 RunTestWithBp(t, bp+`
600 java_library {
601 name: "bar",
602 srcs: [":foo{.public.stubs.source}"],
603 java_resources: [
604 ":foo{.public.api.txt}",
605 ":foo{.public.removed-api.txt}",
606 ],
607 }
608 `)
609 })
610
611 t.Run("api.txt", func(t *testing.T) {
612 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700613 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo" is not a SourceFileProducer or having valid output file for tag ".public.api.txt"`)).
Colin Cross1d2b6b32021-06-01 13:18:08 -0700614 RunTestWithBp(t, bp+`
615 java_library {
616 name: "bar",
617 srcs: ["a.java"],
618 java_resources: [
619 ":foo{.public.api.txt}",
620 ],
621 }
622 `)
623 })
624
625 t.Run("removed-api.txt", func(t *testing.T) {
626 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700627 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo" is not a SourceFileProducer or having valid output file for tag ".public.removed-api.txt"`)).
Colin Cross1d2b6b32021-06-01 13:18:08 -0700628 RunTestWithBp(t, bp+`
629 java_library {
630 name: "bar",
631 srcs: ["a.java"],
632 java_resources: [
633 ":foo{.public.removed-api.txt}",
634 ],
635 }
636 `)
637 })
638}
639
640func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
641 prepareForJavaTest.
642 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
643 RunTestWithBp(t, `
644 java_sdk_library {
645 name: "foo",
646 srcs: ["a.java", "b.java"],
647 api_packages: ["foo"],
648 // Explicitly disable public to test the check that ensures the set of enabled
649 // scopes is consistent.
650 public: {
651 enabled: false,
652 },
653 system: {
654 enabled: true,
655 },
656 }
657 `)
658}
659
660func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
661 android.GroupFixturePreparers(
662 prepareForJavaTest,
663 PrepareForTestWithJavaSdkLibraryFiles,
664 FixtureWithLastReleaseApis("foo"),
665 ).RunTestWithBp(t, `
666 java_sdk_library {
667 name: "foo",
668 srcs: ["a.java", "b.java"],
669 api_packages: ["foo"],
670 system: {
671 enabled: true,
672 sdk_version: "module_current",
673 },
674 }
675 `)
676}
677
678func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
679 android.GroupFixturePreparers(
680 prepareForJavaTest,
681 PrepareForTestWithJavaSdkLibraryFiles,
682 FixtureWithLastReleaseApis("foo"),
683 ).RunTestWithBp(t, `
684 java_sdk_library {
685 name: "foo",
686 srcs: ["a.java", "b.java"],
687 api_packages: ["foo"],
688 system: {
689 enabled: true,
690 },
691 module_lib: {
692 enabled: true,
693 },
694 }
695 `)
696}
697
698func TestJavaSdkLibrary_SystemServer(t *testing.T) {
699 android.GroupFixturePreparers(
700 prepareForJavaTest,
701 PrepareForTestWithJavaSdkLibraryFiles,
702 FixtureWithLastReleaseApis("foo"),
703 ).RunTestWithBp(t, `
704 java_sdk_library {
705 name: "foo",
706 srcs: ["a.java", "b.java"],
707 api_packages: ["foo"],
708 system: {
709 enabled: true,
710 },
711 system_server: {
712 enabled: true,
713 },
714 }
715 `)
716}
717
Paul Duffind0b9fca2022-09-30 18:11:41 +0100718func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
719 result := android.GroupFixturePreparers(
720 prepareForJavaTest,
721 PrepareForTestWithJavaSdkLibraryFiles,
722 FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
723 ).RunTestWithBp(t, `
724 java_sdk_library {
725 name: "foo-public",
726 srcs: ["a.java"],
727 api_packages: ["foo"],
728 public: {
729 enabled: true,
730 },
731 }
732
733 java_sdk_library {
734 name: "foo-system",
735 srcs: ["a.java"],
736 api_packages: ["foo"],
737 system: {
738 enabled: true,
739 },
740 }
741
742 java_sdk_library {
743 name: "foo-module-lib",
744 srcs: ["a.java"],
745 api_packages: ["foo"],
746 system: {
747 enabled: true,
748 },
749 module_lib: {
750 enabled: true,
751 },
752 }
753
754 java_sdk_library {
755 name: "foo-system-server",
756 srcs: ["a.java"],
757 api_packages: ["foo"],
758 system_server: {
759 enabled: true,
760 },
761 }
762
763 java_library {
764 name: "bar",
765 srcs: ["a.java"],
766 libs: ["foo-public", "foo-system", "foo-module-lib", "foo-system-server"],
767 sdk_version: "system_server_current",
768 }
769 `)
770
771 stubsPath := func(name string, scope *apiScope) string {
772 name = scope.stubsLibraryModuleName(name)
773 return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
774 }
775
776 // The bar library should depend on the highest (where system server is highest and public is
777 // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
778 // foo-<x> module is <x>.
779 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
780 stubLibraries := []string{
781 stubsPath("foo-public", apiScopePublic),
782 stubsPath("foo-system", apiScopeSystem),
783 stubsPath("foo-module-lib", apiScopeModuleLib),
784 stubsPath("foo-system-server", apiScopeSystemServer),
785 }
786 expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
787 if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
788 t.Errorf("expected pattern %q to match %#q", expected, actual)
789 }
790}
791
Colin Cross1d2b6b32021-06-01 13:18:08 -0700792func TestJavaSdkLibrary_MissingScope(t *testing.T) {
793 prepareForJavaTest.
794 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
795 RunTestWithBp(t, `
796 java_sdk_library {
797 name: "foo",
798 srcs: ["a.java"],
799 public: {
800 enabled: false,
801 },
802 }
803
804 java_library {
805 name: "baz",
806 srcs: ["a.java"],
807 libs: ["foo"],
808 sdk_version: "module_current",
809 }
810 `)
811}
812
813func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
814 android.GroupFixturePreparers(
815 prepareForJavaTest,
816 PrepareForTestWithJavaSdkLibraryFiles,
817 FixtureWithLastReleaseApis("foo"),
818 ).RunTestWithBp(t, `
819 java_sdk_library {
820 name: "foo",
821 srcs: ["a.java"],
822 system: {
823 enabled: true,
824 },
825 }
826
827 java_library {
828 name: "baz",
829 srcs: ["a.java"],
830 libs: ["foo"],
831 // foo does not have module-lib scope so it should fallback to system
832 sdk_version: "module_current",
833 }
834 `)
835}
836
837func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
838 result := android.GroupFixturePreparers(
839 prepareForJavaTest,
840 PrepareForTestWithJavaSdkLibraryFiles,
841 FixtureWithLastReleaseApis("foo"),
842 ).RunTestWithBp(t, `
843 java_sdk_library {
844 name: "foo",
845 srcs: ["a.java"],
846 system: {
847 enabled: true,
848 },
849 default_to_stubs: true,
850 }
851
852 java_library {
853 name: "baz",
854 srcs: ["a.java"],
855 libs: ["foo"],
856 // does not have sdk_version set, should fallback to module,
857 // which will then fallback to system because the module scope
858 // is not enabled.
859 }
860 `)
861 // The baz library should depend on the system stubs jar.
862 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
863 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
864 t.Errorf("expected %q, found %#q", expected, actual)
865 }
866}
867
868func TestJavaSdkLibraryImport(t *testing.T) {
869 result := prepareForJavaTest.RunTestWithBp(t, `
870 java_library {
871 name: "foo",
872 srcs: ["a.java"],
873 libs: ["sdklib"],
874 sdk_version: "current",
875 }
876
877 java_library {
878 name: "foo.system",
879 srcs: ["a.java"],
880 libs: ["sdklib"],
881 sdk_version: "system_current",
882 }
883
884 java_library {
885 name: "foo.test",
886 srcs: ["a.java"],
887 libs: ["sdklib"],
888 sdk_version: "test_current",
889 }
890
891 java_sdk_library_import {
892 name: "sdklib",
893 public: {
894 jars: ["a.jar"],
895 },
896 system: {
897 jars: ["b.jar"],
898 },
899 test: {
900 jars: ["c.jar"],
901 stub_srcs: ["c.java"],
902 },
903 }
904 `)
905
906 for _, scope := range []string{"", ".system", ".test"} {
907 fooModule := result.ModuleForTests("foo"+scope, "android_common")
908 javac := fooModule.Rule("javac")
909
Colin Crossc9b4f6b2024-07-26 15:25:46 -0700910 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Output("combined/sdklib.stubs" + scope + ".jar").Output
Colin Cross1d2b6b32021-06-01 13:18:08 -0700911 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
912 }
913
914 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000915 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +0000916 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700917 `prebuilt_sdklib.stubs`,
918 `prebuilt_sdklib.stubs.source.test`,
919 `prebuilt_sdklib.stubs.system`,
920 `prebuilt_sdklib.stubs.test`,
921 })
922}
923
924func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
925 result := android.GroupFixturePreparers(
926 prepareForJavaTest,
927 PrepareForTestWithJavaSdkLibraryFiles,
928 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -0700929 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700930 ).RunTestWithBp(t, `
931 java_sdk_library {
932 name: "sdklib",
933 srcs: ["a.java"],
934 sdk_version: "none",
935 system_modules: "none",
936 public: {
937 enabled: true,
938 },
939 }
940
941 java_sdk_library_import {
942 name: "sdklib",
943 public: {
944 jars: ["a.jar"],
945 },
946 }
947 `)
948
949 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
950 `dex2oatd`,
951 `prebuilt_sdklib`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000952 `sdklib-removed.api.combined.public.latest`,
953 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700954 `sdklib.impl`,
955 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000956 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700957 `sdklib.stubs.source`,
958 `sdklib.xml`,
959 })
960
961 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +0000962 `all_apex_contributions`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700963 `prebuilt_sdklib.stubs`,
964 `sdklib.impl`,
965 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
966 // dependency is added after prebuilts may have been renamed and so has to use
967 // the renamed name.
968 `sdklib.xml`,
969 })
970}
971
Paul Duffinbf4de042022-09-27 12:41:52 +0100972func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700973 result := android.GroupFixturePreparers(
974 prepareForJavaTest,
975 PrepareForTestWithJavaSdkLibraryFiles,
976 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100977 preparer,
Colin Crossa66b4632024-08-08 15:50:47 -0700978 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700979 ).RunTestWithBp(t, `
980 java_sdk_library {
981 name: "sdklib",
982 srcs: ["a.java"],
983 sdk_version: "none",
984 system_modules: "none",
985 public: {
986 enabled: true,
987 },
988 }
989
990 java_sdk_library_import {
991 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +0100992 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -0700993 public: {
994 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100995 stub_srcs: ["a.java"],
996 current_api: "current.txt",
997 removed_api: "removed.txt",
998 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700999 },
1000 }
Paul Duffinbf4de042022-09-27 12:41:52 +01001001
1002 java_library {
1003 name: "combined",
1004 static_libs: [
1005 "sdklib.stubs",
1006 ],
1007 java_resources: [
1008 ":sdklib.stubs.source",
1009 ":sdklib{.public.api.txt}",
1010 ":sdklib{.public.removed-api.txt}",
1011 ":sdklib{.public.annotations.zip}",
1012 ],
1013 sdk_version: "none",
1014 system_modules: "none",
1015 }
1016
1017 java_library {
1018 name: "public",
1019 srcs: ["a.java"],
1020 libs: ["sdklib"],
1021 sdk_version: "current",
1022 }
Colin Cross1d2b6b32021-06-01 13:18:08 -07001023 `)
1024
1025 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -07001026 `prebuilt_sdklib`,
Jihoon Kang748a24d2024-03-20 21:29:39 +00001027 `sdklib-removed.api.combined.public.latest`,
1028 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001029 `sdklib.impl`,
1030 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +00001031 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001032 `sdklib.stubs.source`,
1033 `sdklib.xml`,
1034 })
1035
1036 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +00001037 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +00001038 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001039 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +01001040 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001041 `sdklib.impl`,
1042 `sdklib.xml`,
1043 })
Paul Duffinbf4de042022-09-27 12:41:52 +01001044
1045 // Make sure that dependencies on child modules use the prebuilt when preferred.
1046 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
1047 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
1048 `prebuilt_sdklib`,
1049 `prebuilt_sdklib`,
1050 `prebuilt_sdklib`,
1051 `prebuilt_sdklib.stubs`,
1052 `prebuilt_sdklib.stubs.source`,
1053 })
1054
1055 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1056 // prebuilt library.
1057 public := result.ModuleForTests("public", "android_common")
1058 rule := public.Output("javac/public.jar")
1059 inputs := rule.Implicits.Strings()
1060 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
1061 if !android.InList(expected, inputs) {
1062 t.Errorf("expected %q to contain %q", inputs, expected)
1063 }
1064}
1065
1066func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
1067 t.Run("prefer", func(t *testing.T) {
1068 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1069 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001070}
1071
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001072// If a module is listed in `mainline_module_contributions, it should be used
1073// It will supersede any other source vs prebuilt selection mechanism like `prefer` attribute
1074func TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) {
1075 bp := `
1076 apex_contributions {
1077 name: "my_mainline_module_contributions",
1078 api_domain: "my_mainline_module",
1079 contents: [
1080 // legacy mechanism prefers the prebuilt
1081 // mainline_module_contributions supersedes this since source is listed explicitly
1082 "sdklib.prebuilt_preferred_using_legacy_flags",
1083
1084 // legacy mechanism prefers the source
1085 // mainline_module_contributions supersedes this since prebuilt is listed explicitly
1086 "prebuilt_sdklib.source_preferred_using_legacy_flags",
1087 ],
1088 }
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001089 java_sdk_library {
1090 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1091 srcs: ["a.java"],
1092 sdk_version: "none",
1093 system_modules: "none",
1094 public: {
1095 enabled: true,
1096 },
1097 system: {
1098 enabled: true,
1099 }
1100 }
1101 java_sdk_library_import {
1102 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1103 prefer: true, // prebuilt is preferred using legacy mechanism
1104 public: {
1105 jars: ["a.jar"],
1106 stub_srcs: ["a.java"],
1107 current_api: "current.txt",
1108 removed_api: "removed.txt",
1109 annotations: "annotations.zip",
1110 },
1111 system: {
1112 jars: ["a.jar"],
1113 stub_srcs: ["a.java"],
1114 current_api: "current.txt",
1115 removed_api: "removed.txt",
1116 annotations: "annotations.zip",
1117 },
1118 }
1119 java_sdk_library {
1120 name: "sdklib.source_preferred_using_legacy_flags",
1121 srcs: ["a.java"],
1122 sdk_version: "none",
1123 system_modules: "none",
1124 public: {
1125 enabled: true,
1126 },
1127 system: {
1128 enabled: true,
1129 }
1130 }
1131 java_sdk_library_import {
1132 name: "sdklib.source_preferred_using_legacy_flags",
1133 prefer: false, // source is preferred using legacy mechanism
1134 public: {
1135 jars: ["a.jar"],
1136 stub_srcs: ["a.java"],
1137 current_api: "current.txt",
1138 removed_api: "removed.txt",
1139 annotations: "annotations.zip",
1140 },
1141 system: {
1142 jars: ["a.jar"],
1143 stub_srcs: ["a.java"],
1144 current_api: "current.txt",
1145 removed_api: "removed.txt",
1146 annotations: "annotations.zip",
1147 },
1148 }
1149
1150 // rdeps
1151 java_library {
1152 name: "public",
1153 srcs: ["a.java"],
1154 libs: [
1155 // this should get source since source is listed in my_mainline_module_contributions
1156 "sdklib.prebuilt_preferred_using_legacy_flags.stubs",
1157 "sdklib.prebuilt_preferred_using_legacy_flags.stubs.system",
1158
1159 // this should get prebuilt since source is listed in my_mainline_module_contributions
1160 "sdklib.source_preferred_using_legacy_flags.stubs",
1161 "sdklib.source_preferred_using_legacy_flags.stubs.system",
1162
1163 ],
1164 }
1165 `
1166 result := android.GroupFixturePreparers(
1167 prepareForJavaTest,
1168 PrepareForTestWithJavaSdkLibraryFiles,
1169 FixtureWithLastReleaseApis("sdklib.source_preferred_using_legacy_flags", "sdklib.prebuilt_preferred_using_legacy_flags"),
Colin Crossa66b4632024-08-08 15:50:47 -07001170 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001171 ).RunTestWithBp(t, bp)
1172
1173 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1174 public := result.ModuleForTests("public", "android_common")
1175 rule := public.Output("javac/public.jar")
1176 inputs := rule.Implicits.Strings()
1177 expectedInputs := []string{
1178 // source
1179 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.jar",
1180 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.jar",
1181
1182 // prebuilt
1183 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.jar",
1184 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs.system/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.system.jar",
1185 }
1186 for _, expected := range expectedInputs {
1187 if !android.InList(expected, inputs) {
1188 t.Errorf("expected %q to contain %q", inputs, expected)
1189 }
1190 }
1191}
1192
Colin Cross1d2b6b32021-06-01 13:18:08 -07001193func TestJavaSdkLibraryEnforce(t *testing.T) {
1194 partitionToBpOption := func(partition string) string {
1195 switch partition {
1196 case "system":
1197 return ""
1198 case "vendor":
1199 return "soc_specific: true,"
1200 case "product":
1201 return "product_specific: true,"
1202 default:
1203 panic("Invalid partition group name: " + partition)
1204 }
1205 }
1206
1207 type testConfigInfo struct {
1208 libraryType string
1209 fromPartition string
1210 toPartition string
Colin Cross1d2b6b32021-06-01 13:18:08 -07001211 enforceProductInterface bool
1212 enforceJavaSdkLibraryCheck bool
1213 allowList []string
1214 }
1215
1216 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1217 bpFileTemplate := `
1218 java_library {
1219 name: "foo",
1220 srcs: ["foo.java"],
1221 libs: ["bar"],
1222 sdk_version: "current",
1223 %s
1224 }
1225
1226 %s {
1227 name: "bar",
1228 srcs: ["bar.java"],
1229 sdk_version: "current",
1230 %s
1231 }
1232 `
1233
1234 bpFile := fmt.Sprintf(bpFileTemplate,
1235 partitionToBpOption(info.fromPartition),
1236 info.libraryType,
1237 partitionToBpOption(info.toPartition))
1238
1239 return android.GroupFixturePreparers(
1240 PrepareForTestWithJavaSdkLibraryFiles,
1241 FixtureWithLastReleaseApis("bar"),
1242 android.FixtureWithRootAndroidBp(bpFile),
1243 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1244 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
Colin Cross1d2b6b32021-06-01 13:18:08 -07001245 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1246 variables.InterPartitionJavaLibraryAllowList = info.allowList
1247 }),
1248 )
1249 }
1250
1251 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1252 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1253 errorHandler := android.FixtureExpectsNoErrors
1254 if expectedErrorPattern != "" {
1255 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1256 }
1257 android.GroupFixturePreparers(
1258 prepareForJavaTest,
1259 createPreparer(info),
1260 ).
1261 ExtendWithErrorHandler(errorHandler).
1262 RunTest(t)
1263 })
1264 }
1265
1266 errorMessage := "is not allowed across the partitions"
1267
1268 runTest(t, testConfigInfo{
1269 libraryType: "java_library",
1270 fromPartition: "product",
1271 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001272 enforceProductInterface: true,
1273 enforceJavaSdkLibraryCheck: false,
1274 }, "")
1275
1276 runTest(t, testConfigInfo{
1277 libraryType: "java_library",
1278 fromPartition: "product",
1279 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001280 enforceProductInterface: false,
1281 enforceJavaSdkLibraryCheck: true,
1282 }, "")
1283
1284 runTest(t, testConfigInfo{
1285 libraryType: "java_library",
1286 fromPartition: "product",
1287 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001288 enforceProductInterface: true,
1289 enforceJavaSdkLibraryCheck: true,
1290 }, errorMessage)
1291
1292 runTest(t, testConfigInfo{
1293 libraryType: "java_library",
1294 fromPartition: "vendor",
1295 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001296 enforceProductInterface: true,
1297 enforceJavaSdkLibraryCheck: true,
1298 }, errorMessage)
1299
1300 runTest(t, testConfigInfo{
1301 libraryType: "java_library",
1302 fromPartition: "vendor",
1303 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001304 enforceProductInterface: true,
1305 enforceJavaSdkLibraryCheck: true,
1306 allowList: []string{"bar"},
1307 }, "")
1308
1309 runTest(t, testConfigInfo{
1310 libraryType: "java_library",
1311 fromPartition: "vendor",
1312 toPartition: "product",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001313 enforceProductInterface: true,
1314 enforceJavaSdkLibraryCheck: true,
1315 }, errorMessage)
1316
1317 runTest(t, testConfigInfo{
1318 libraryType: "java_sdk_library",
1319 fromPartition: "product",
1320 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001321 enforceProductInterface: true,
1322 enforceJavaSdkLibraryCheck: true,
1323 }, "")
1324
1325 runTest(t, testConfigInfo{
1326 libraryType: "java_sdk_library",
1327 fromPartition: "vendor",
1328 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001329 enforceProductInterface: true,
1330 enforceJavaSdkLibraryCheck: true,
1331 }, "")
1332
1333 runTest(t, testConfigInfo{
1334 libraryType: "java_sdk_library",
1335 fromPartition: "vendor",
1336 toPartition: "product",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001337 enforceProductInterface: true,
1338 enforceJavaSdkLibraryCheck: true,
1339 }, "")
1340}
Colin Cross30c491b2021-06-01 13:39:09 -07001341
1342func TestJavaSdkLibraryDist(t *testing.T) {
1343 result := android.GroupFixturePreparers(
1344 PrepareForTestWithJavaBuildComponents,
1345 PrepareForTestWithJavaDefaultModules,
1346 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001347 FixtureWithLastReleaseApis(
1348 "sdklib_no_group",
1349 "sdklib_group_foo",
1350 "sdklib_owner_foo",
1351 "foo"),
Colin Crossa66b4632024-08-08 15:50:47 -07001352 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross30c491b2021-06-01 13:39:09 -07001353 ).RunTestWithBp(t, `
1354 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001355 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001356 srcs: ["foo.java"],
1357 }
1358
1359 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001360 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001361 srcs: ["foo.java"],
1362 dist_group: "foo",
1363 }
1364
1365 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001366 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001367 srcs: ["foo.java"],
1368 owner: "foo",
1369 }
1370
1371 java_sdk_library {
1372 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001373 srcs: ["foo.java"],
1374 dist_stem: "foo",
1375 }
Colin Cross30c491b2021-06-01 13:39:09 -07001376 `)
1377
1378 type testCase struct {
1379 module string
1380 distDir string
1381 distStem string
1382 }
1383 testCases := []testCase{
1384 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001385 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001386 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001387 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001388 },
1389 {
Colin Cross986b69a2021-06-01 13:13:40 -07001390 module: "sdklib_group_foo",
1391 distDir: "apistubs/foo/public",
1392 distStem: "sdklib_group_foo.jar",
1393 },
1394 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001395 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001396 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001397 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001398 distStem: "sdklib_owner_foo.jar",
1399 },
1400 {
1401 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001402 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001403 distStem: "foo.jar",
1404 },
Colin Cross30c491b2021-06-01 13:39:09 -07001405 }
1406
1407 for _, tt := range testCases {
1408 t.Run(tt.module, func(t *testing.T) {
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001409 m := result.ModuleForTests(apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library)
Colin Cross30c491b2021-06-01 13:39:09 -07001410 dists := m.Dists()
1411 if len(dists) != 1 {
1412 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1413 }
1414 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1415 t.Errorf("expected dist dir %q, got %q", w, g)
1416 }
1417 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1418 t.Errorf("expected dist stem %q, got %q", w, g)
1419 }
1420 })
1421 }
1422}
satayev8f088b02021-12-06 11:40:46 +00001423
1424func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1425 preparer := android.GroupFixturePreparers(
1426 PrepareForTestWithJavaBuildComponents,
1427 PrepareForTestWithJavaDefaultModules,
1428 PrepareForTestWithJavaSdkLibraryFiles,
1429 )
1430
1431 preparer.RunTestWithBp(t, `
1432 java_sdk_library {
1433 name: "sdklib",
Jihoon Kanga3a05462024-04-05 00:36:44 +00001434 srcs: ["a.java"],
1435 static_libs: ["util"],
1436 min_sdk_version: "30",
satayev8f088b02021-12-06 11:40:46 +00001437 unsafe_ignore_missing_latest_api: true,
Jihoon Kanga3a05462024-04-05 00:36:44 +00001438 }
satayev8f088b02021-12-06 11:40:46 +00001439
1440 java_library {
1441 name: "util",
1442 srcs: ["a.java"],
1443 min_sdk_version: "30",
1444 }
1445 `)
1446
1447 preparer.
1448 RunTestWithBp(t, `
1449 java_sdk_library {
1450 name: "sdklib",
1451 srcs: ["a.java"],
1452 libs: ["util"],
1453 impl_only_libs: ["util"],
1454 stub_only_libs: ["util"],
1455 stub_only_static_libs: ["util"],
1456 min_sdk_version: "30",
1457 unsafe_ignore_missing_latest_api: true,
1458 }
1459
1460 java_library {
1461 name: "util",
1462 srcs: ["a.java"],
1463 }
1464 `)
1465
1466 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1467 RunTestWithBp(t, `
1468 java_sdk_library {
1469 name: "sdklib",
1470 srcs: ["a.java"],
1471 static_libs: ["util"],
1472 min_sdk_version: "30",
1473 unsafe_ignore_missing_latest_api: true,
1474 }
1475
1476 java_library {
1477 name: "util",
1478 srcs: ["a.java"],
1479 min_sdk_version: "31",
1480 }
1481 `)
1482
1483 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_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 static_libs: ["another_util"],
1497 min_sdk_version: "30",
1498 }
1499
1500 java_library {
1501 name: "another_util",
1502 srcs: ["a.java"],
1503 min_sdk_version: "31",
1504 }
1505 `)
1506}
Nikita Ioffed732da72022-11-21 12:38:25 +00001507
1508func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1509 result := android.GroupFixturePreparers(
1510 prepareForJavaTest,
1511 PrepareForTestWithJavaSdkLibraryFiles,
1512 FixtureWithLastReleaseApis("foo"),
1513 ).RunTestWithBp(t, `
1514 java_sdk_library {
1515 name: "foo",
1516 srcs: ["a.java"],
1517 public: {
1518 enabled: true,
1519 },
1520 stub_only_libs: ["bar-lib"],
1521 }
1522
1523 java_library {
1524 name: "bar-lib",
1525 srcs: ["b.java"],
1526 }
1527 `)
1528
1529 // The foo.stubs.source should depend on bar-lib
1530 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1531 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1532}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001533
Mark White9421c4c2023-08-10 00:07:03 +00001534func TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) {
1535 result := android.GroupFixturePreparers(
1536 prepareForJavaTest,
1537 PrepareForTestWithJavaSdkLibraryFiles,
1538 FixtureWithLastReleaseApis("foo"),
1539 ).RunTestWithBp(t, `
1540 java_sdk_library {
1541 name: "foo",
1542 srcs: ["a.java"],
1543 public: {
1544 enabled: true,
1545 libs: ["bar-lib"],
1546 },
1547 }
1548
1549 java_library {
1550 name: "bar-lib",
1551 srcs: ["b.java"],
1552 }
1553 `)
1554
1555 // The foo.stubs.source should depend on bar-lib
1556 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1557 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1558}
1559
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001560func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
1561 result := android.GroupFixturePreparers(
1562 prepareForJavaTest,
1563 PrepareForTestWithJavaSdkLibraryFiles,
1564 FixtureWithLastReleaseApis("foo"),
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001565 ).RunTestWithBp(t, `
1566 java_sdk_library {
1567 name: "foo",
1568 srcs: ["a.java", "b.java"],
1569 api_packages: ["foo"],
1570 system: {
1571 enabled: true,
1572 },
1573 module_lib: {
1574 enabled: true,
1575 },
1576 test: {
1577 enabled: true,
1578 },
1579 }
1580 `)
1581
1582 testCases := []struct {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001583 scope *apiScope
1584 apiContributions []string
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001585 }{
1586 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001587 scope: apiScopePublic,
1588 apiContributions: []string{"foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001589 },
1590 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001591 scope: apiScopeSystem,
1592 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001593 },
1594 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001595 scope: apiScopeTest,
1596 apiContributions: []string{"foo.stubs.source.test.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001597 },
1598 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001599 scope: apiScopeModuleLib,
1600 apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001601 },
1602 }
1603
1604 for _, c := range testCases {
1605 m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1606 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001607 }
1608}
Jihoon Kang786df932023-09-07 01:18:31 +00001609
1610func TestStaticDepStubLibrariesVisibility(t *testing.T) {
1611 android.GroupFixturePreparers(
1612 prepareForJavaTest,
1613 PrepareForTestWithJavaSdkLibraryFiles,
1614 FixtureWithLastReleaseApis("foo"),
1615 android.FixtureMergeMockFs(
1616 map[string][]byte{
1617 "A.java": nil,
1618 "dir/Android.bp": []byte(
1619 `
1620 java_library {
1621 name: "bar",
1622 srcs: ["A.java"],
1623 libs: ["foo.stubs.from-source"],
1624 }
1625 `),
1626 "dir/A.java": nil,
1627 },
1628 ).ExtendWithErrorHandler(
1629 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1630 `module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1631 ).RunTestWithBp(t, `
1632 java_sdk_library {
1633 name: "foo",
1634 srcs: ["A.java"],
1635 }
1636 `)
1637}
Jamie Garsidee570ace2023-11-27 12:07:36 +00001638
1639func TestSdkLibraryDependency(t *testing.T) {
1640 result := android.GroupFixturePreparers(
1641 prepareForJavaTest,
1642 PrepareForTestWithJavaSdkLibraryFiles,
1643 FixtureWithPrebuiltApis(map[string][]string{
1644 "30": {"bar", "foo"},
1645 }),
1646 ).RunTestWithBp(t,
1647 `
1648 java_sdk_library {
1649 name: "foo",
1650 srcs: ["a.java", "b.java"],
1651 api_packages: ["foo"],
1652 }
1653
1654 java_sdk_library {
1655 name: "bar",
1656 srcs: ["c.java", "b.java"],
1657 libs: [
1658 "foo",
1659 ],
1660 uses_libs: [
1661 "foo",
1662 ],
1663 }
1664`)
1665
Paul Duffin1816cde2024-04-10 10:58:21 +01001666 barPermissions := result.ModuleForTests("bar.xml", "android_common").Output("bar.xml")
1667 barContents := android.ContentFromFileRuleForTests(t, result.TestContext, barPermissions)
1668 android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barContents, `dependency="foo"`)
Jamie Garsidee570ace2023-11-27 12:07:36 +00001669}
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001670
1671func TestSdkLibraryExportableStubsLibrary(t *testing.T) {
1672 result := android.GroupFixturePreparers(
1673 prepareForJavaTest,
1674 PrepareForTestWithJavaSdkLibraryFiles,
1675 FixtureWithLastReleaseApis("foo"),
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001676 ).RunTestWithBp(t, `
1677 aconfig_declarations {
1678 name: "bar",
1679 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +00001680 container: "com.android.foo",
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001681 srcs: [
1682 "bar.aconfig",
1683 ],
1684 }
1685 java_sdk_library {
1686 name: "foo",
1687 srcs: ["a.java", "b.java"],
1688 api_packages: ["foo"],
1689 system: {
1690 enabled: true,
1691 },
1692 module_lib: {
1693 enabled: true,
1694 },
1695 test: {
1696 enabled: true,
1697 },
1698 aconfig_declarations: [
1699 "bar",
1700 ],
1701 }
1702 `)
1703
1704 exportableStubsLibraryModuleName := apiScopePublic.exportableStubsLibraryModuleName("foo")
1705 exportableSourceStubsLibraryModuleName := apiScopePublic.exportableSourceStubsLibraryModuleName("foo")
1706
1707 // Check modules generation
1708 topLevelModule := result.ModuleForTests(exportableStubsLibraryModuleName, "android_common")
1709 result.ModuleForTests(exportableSourceStubsLibraryModuleName, "android_common")
1710
1711 // Check static lib dependency
1712 android.AssertBoolEquals(t, "exportable top level stubs library module depends on the"+
1713 "exportable source stubs library module", true,
1714 CheckModuleHasDependency(t, result.TestContext, exportableStubsLibraryModuleName,
1715 "android_common", exportableSourceStubsLibraryModuleName),
1716 )
1717 android.AssertArrayString(t, "exportable source stub library is a static lib of the"+
1718 "top level exportable stubs library", []string{exportableSourceStubsLibraryModuleName},
1719 topLevelModule.Module().(*Library).properties.Static_libs)
1720}
Spandan Das81d95c52024-02-01 23:41:11 +00001721
1722// For java libraries depending on java_sdk_library(_import) via libs, assert that
1723// rdep gets stubs of source if source is listed in apex_contributions and prebuilt has prefer (legacy mechanism)
1724func TestStubResolutionOfJavaSdkLibraryInLibs(t *testing.T) {
1725 bp := `
1726 apex_contributions {
1727 name: "my_mainline_module_contributions",
1728 api_domain: "my_mainline_module",
1729 contents: ["sdklib"], // source is selected using apex_contributions, but prebuilt is selected using prefer
1730 }
1731 java_sdk_library {
1732 name: "sdklib",
1733 srcs: ["a.java"],
1734 sdk_version: "none",
1735 system_modules: "none",
1736 public: {
1737 enabled: true,
1738 },
1739 }
1740 java_sdk_library_import {
1741 name: "sdklib",
1742 public: {
1743 jars: ["a.jar"],
1744 stub_srcs: ["a.java"],
1745 current_api: "current.txt",
1746 removed_api: "removed.txt",
1747 annotations: "annotations.zip",
1748 },
1749 prefer: true, // Set prefer explicitly on the prebuilt. We will assert that rdep gets source in a test case.
1750 }
1751 // rdeps
1752 java_library {
1753 name: "mymodule",
1754 srcs: ["a.java"],
1755 sdk_version: "current",
1756 libs: ["sdklib",], // this should be dynamically resolved to sdklib.stubs (source) or prebuilt_sdklib.stubs (prebuilt)
1757 }
1758 `
1759
1760 fixture := android.GroupFixturePreparers(
1761 prepareForJavaTest,
1762 PrepareForTestWithJavaSdkLibraryFiles,
1763 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -07001764 // We can use any of the apex contribution build flags from build/soong/android/config.go#mainlineApexContributionBuildFlags here
1765 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Das81d95c52024-02-01 23:41:11 +00001766 )
1767
1768 result := fixture.RunTestWithBp(t, bp)
1769 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1770 public := result.ModuleForTests("mymodule", "android_common")
1771 rule := public.Output("javac/mymodule.jar")
1772 inputs := rule.Implicits.Strings()
1773 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar")
1774}
Spandan Das23956d12024-01-19 00:22:22 +00001775
1776// test that rdep gets resolved to the correct version of a java_sdk_library (source or a specific prebuilt)
1777func TestMultipleSdkLibraryPrebuilts(t *testing.T) {
1778 bp := `
1779 apex_contributions {
1780 name: "my_mainline_module_contributions",
1781 api_domain: "my_mainline_module",
1782 contents: ["%s"],
1783 }
1784 java_sdk_library {
1785 name: "sdklib",
1786 srcs: ["a.java"],
1787 sdk_version: "none",
1788 system_modules: "none",
1789 public: {
1790 enabled: true,
1791 },
1792 }
1793 java_sdk_library_import {
1794 name: "sdklib.v1", //prebuilt
1795 source_module_name: "sdklib",
1796 public: {
1797 jars: ["a.jar"],
1798 stub_srcs: ["a.java"],
1799 current_api: "current.txt",
1800 removed_api: "removed.txt",
1801 annotations: "annotations.zip",
1802 },
1803 }
1804 java_sdk_library_import {
1805 name: "sdklib.v2", //prebuilt
1806 source_module_name: "sdklib",
1807 public: {
1808 jars: ["a.jar"],
1809 stub_srcs: ["a.java"],
1810 current_api: "current.txt",
1811 removed_api: "removed.txt",
1812 annotations: "annotations.zip",
1813 },
1814 }
1815 // rdeps
1816 java_library {
1817 name: "mymodule",
1818 srcs: ["a.java"],
1819 libs: ["sdklib.stubs",],
1820 }
1821 `
1822 testCases := []struct {
1823 desc string
1824 selectedDependencyName string
1825 expectedStubPath string
1826 }{
1827 {
1828 desc: "Source library is selected using apex_contributions",
1829 selectedDependencyName: "sdklib",
1830 expectedStubPath: "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar",
1831 },
1832 {
1833 desc: "Prebuilt library v1 is selected using apex_contributions",
1834 selectedDependencyName: "prebuilt_sdklib.v1",
1835 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v1.stubs/android_common/combined/sdklib.stubs.jar",
1836 },
1837 {
1838 desc: "Prebuilt library v2 is selected using apex_contributions",
1839 selectedDependencyName: "prebuilt_sdklib.v2",
1840 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v2.stubs/android_common/combined/sdklib.stubs.jar",
1841 },
1842 }
1843
1844 fixture := android.GroupFixturePreparers(
1845 prepareForJavaTest,
1846 PrepareForTestWithJavaSdkLibraryFiles,
1847 FixtureWithLastReleaseApis("sdklib", "sdklib.v1", "sdklib.v2"),
Colin Crossa66b4632024-08-08 15:50:47 -07001848 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Das23956d12024-01-19 00:22:22 +00001849 )
1850
1851 for _, tc := range testCases {
1852 result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
1853
1854 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1855 public := result.ModuleForTests("mymodule", "android_common")
1856 rule := public.Output("javac/mymodule.jar")
1857 inputs := rule.Implicits.Strings()
1858 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, tc.expectedStubPath)
1859 }
1860}
Jihoon Kangfa3f0782024-08-21 20:42:18 +00001861
1862func TestStubLinkType(t *testing.T) {
1863 android.GroupFixturePreparers(
1864 prepareForJavaTest,
1865 PrepareForTestWithJavaSdkLibraryFiles,
1866 FixtureWithLastReleaseApis("foo"),
1867 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1868 `module "baz" variant "android_common": compiles against system API, but dependency `+
1869 `"bar.stubs.system" is compiling against module API. In order to fix this, `+
1870 `consider adjusting sdk_version: OR platform_apis: property of the source or `+
1871 `target module so that target module is built with the same or smaller API set `+
1872 `when compared to the source.`),
1873 ).RunTestWithBp(t, `
1874 java_sdk_library {
1875 name: "foo",
1876 srcs: ["a.java"],
1877 sdk_version: "current",
1878 }
1879 java_library {
1880 name: "bar.stubs.system",
1881 srcs: ["a.java"],
1882 sdk_version: "module_current",
1883 is_stubs_module: false,
1884 }
1885
1886 java_library {
1887 name: "baz",
1888 srcs: ["b.java"],
1889 libs: [
1890 "foo.stubs.system",
1891 "bar.stubs.system",
1892 ],
1893 sdk_version: "system_current",
1894 }
1895 `)
1896}