blob: 911e8b1e4ed70c0800774409d352d65d0cc04021 [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 Kangbd093452023-12-26 19:08:01 +000038 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
39 variables.BuildFlags = map[string]string{
40 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
41 }
42 }),
Colin Cross1d2b6b32021-06-01 13:18:08 -070043 ).RunTestWithBp(t, `
44 droiddoc_exported_dir {
45 name: "droiddoc-templates-sdk",
46 path: ".",
47 }
48 java_sdk_library {
49 name: "foo",
50 srcs: ["a.java", "b.java"],
51 api_packages: ["foo"],
52 }
53 java_sdk_library {
54 name: "bar",
55 srcs: ["a.java", "b.java"],
56 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080057 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070058 }
59 java_library {
60 name: "baz",
61 srcs: ["c.java"],
62 libs: ["foo", "bar.stubs"],
63 sdk_version: "system_current",
64 }
65 java_sdk_library {
66 name: "barney",
67 srcs: ["c.java"],
68 api_only: true,
69 }
70 java_sdk_library {
71 name: "betty",
72 srcs: ["c.java"],
73 shared_library: false,
74 }
75 java_sdk_library_import {
76 name: "quuz",
77 public: {
78 jars: ["c.jar"],
Jihoon Kang71c86832023-09-13 01:01:53 +000079 current_api: "api/current.txt",
80 removed_api: "api/removed.txt",
Colin Cross1d2b6b32021-06-01 13:18:08 -070081 },
82 }
83 java_sdk_library_import {
84 name: "fred",
85 public: {
86 jars: ["b.jar"],
87 },
88 }
89 java_sdk_library_import {
90 name: "wilma",
91 public: {
92 jars: ["b.jar"],
93 },
94 shared_library: false,
95 }
96 java_library {
97 name: "qux",
98 srcs: ["c.java"],
99 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
100 sdk_version: "system_current",
101 }
102 java_library {
103 name: "baz-test",
104 srcs: ["c.java"],
105 libs: ["foo"],
106 sdk_version: "test_current",
107 }
108 java_library {
109 name: "baz-29",
110 srcs: ["c.java"],
111 libs: ["foo"],
112 sdk_version: "system_29",
113 }
114 java_library {
115 name: "baz-module-30",
116 srcs: ["c.java"],
117 libs: ["foo"],
118 sdk_version: "module_30",
119 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000120 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700121
122 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100123 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700124 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
125 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
126 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
127 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
128 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
129 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jihoon Kangd48abd52023-02-02 22:32:31 +0000130 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
Jihoon Kang1c92c3e2023-03-23 17:44:51 +0000131 result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700132 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
133 result.ModuleForTests("foo.api.public.28", "")
134 result.ModuleForTests("foo.api.system.28", "")
135 result.ModuleForTests("foo.api.test.28", "")
136
Colin Cross5a377182023-12-14 14:46:23 -0800137 exportedComponentsInfo, _ := android.SingletonModuleProvider(result, foo.Module(), android.ExportedComponentsInfoProvider)
Paul Duffinb97b1572021-04-29 21:50:40 +0100138 expectedFooExportedComponents := []string{
Jihoon Kang748a24d2024-03-20 21:29:39 +0000139 "foo-removed.api.combined.public.latest",
140 "foo-removed.api.combined.system.latest",
141 "foo.api.combined.public.latest",
142 "foo.api.combined.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100143 "foo.stubs",
Jihoon Kangbd093452023-12-26 19:08:01 +0000144 "foo.stubs.exportable",
145 "foo.stubs.exportable.system",
146 "foo.stubs.exportable.test",
Paul Duffinb97b1572021-04-29 21:50:40 +0100147 "foo.stubs.source",
148 "foo.stubs.source.system",
149 "foo.stubs.source.test",
150 "foo.stubs.system",
151 "foo.stubs.test",
152 }
153 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
154
Colin Cross1d2b6b32021-06-01 13:18:08 -0700155 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
156 // tests if baz is actually linked to the stubs lib
157 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
158 // ... and not to the impl lib
159 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
160 // test if baz is not linked to the system variant of foo
161 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
162
163 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
164 // tests if baz-test is actually linked to the test stubs lib
165 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
166
167 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
168 // tests if baz-29 is actually linked to the system 29 stubs lib
169 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
170
171 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
172 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
173 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
174
175 // test if baz has exported SDK lib names foo and bar to qux
176 qux := result.ModuleForTests("qux", "android_common")
177 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100178 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100179 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100180 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700181 }
Wei Li1e73c652021-12-06 13:35:11 -0800182
Jihoon Kang71c86832023-09-13 01:01:53 +0000183 // test if quuz have created the api_contribution module
184 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "")
185
Jihoon Kanga3a05462024-04-05 00:36:44 +0000186 fooImplDexJar := result.ModuleForTests("foo.impl", "android_common").Rule("d8")
187 // tests if kotlinc generated files are NOT excluded from output of foo.impl.
188 android.AssertStringDoesNotContain(t, "foo.impl dex", fooImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Wei Li1e73c652021-12-06 13:35:11 -0800189
Jihoon Kanga3a05462024-04-05 00:36:44 +0000190 barImplDexJar := result.ModuleForTests("bar.impl", "android_common").Rule("d8")
191 // tests if kotlinc generated files are excluded from output of bar.impl.
192 android.AssertStringDoesContain(t, "bar.impl dex", barImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700193}
194
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000195func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
196 result := android.GroupFixturePreparers(
197 prepareForJavaTest,
198 PrepareForTestWithJavaSdkLibraryFiles,
199 FixtureWithPrebuiltApis(map[string][]string{
200 "28": {"foo"},
201 "29": {"foo"},
202 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
203 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000204 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Pedro Loureirob638c622021-12-22 15:28:05 +0000205 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
Pedro Loureiroc3621422021-09-28 15:40:23 +0000206 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000207 ).RunTestWithBp(t,
208 `
209 java_sdk_library {
210 name: "fooUpdatable",
211 srcs: ["a.java", "b.java"],
212 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000213 on_bootclasspath_since: "U",
214 on_bootclasspath_before: "V",
215 min_device_sdk: "W",
Pedro Loureirob638c622021-12-22 15:28:05 +0000216 max_device_sdk: "X",
Pedro Loureiroc3621422021-09-28 15:40:23 +0000217 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000218 }
219 java_sdk_library {
220 name: "foo",
221 srcs: ["a.java", "b.java"],
222 api_packages: ["foo"],
223 }
224`)
Pedro Loureirob638c622021-12-22 15:28:05 +0000225
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000226 // test that updatability attributes are passed on correctly
Paul Duffin1816cde2024-04-10 10:58:21 +0100227 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Output("fooUpdatable.xml")
228 fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
229 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-since="U"`)
230 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-before="V"`)
231 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `min-device-sdk="W"`)
232 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `max-device-sdk="X"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000233
234 // double check that updatability attributes are not written if they don't exist in the bp file
235 // the permissions file for the foo library defined above
Paul Duffin1816cde2024-04-10 10:58:21 +0100236 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
237 fooPermissionsContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooPermissions)
238 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-since`)
239 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-before`)
240 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `min-device-sdk`)
241 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000242}
243
Pedro Loureiroc3621422021-09-28 15:40:23 +0000244func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000245 android.GroupFixturePreparers(
246 prepareForJavaTest,
247 PrepareForTestWithJavaSdkLibraryFiles,
248 FixtureWithPrebuiltApis(map[string][]string{
249 "30": {"fooUpdatable", "fooUpdatableErr"},
250 }),
251 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
252 []string{
253 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
254 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
255 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000256 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000257 })).RunTestWithBp(t,
258 `
259 java_sdk_library {
260 name: "fooUpdatableErr",
261 srcs: ["a.java", "b.java"],
262 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000263 on_bootclasspath_since: "aaa",
264 on_bootclasspath_before: "bbc",
265 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000266 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000267 }
268`)
269}
270
Pedro Loureiroc3621422021-09-28 15:40:23 +0000271func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
272 android.GroupFixturePreparers(
273 prepareForJavaTest,
274 PrepareForTestWithJavaSdkLibraryFiles,
275 FixtureWithPrebuiltApis(map[string][]string{
276 "28": {"foo"},
277 }),
278 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
279 []string{
280 "on_bootclasspath_since: Attribute value needs to be at least T",
281 "on_bootclasspath_before: Attribute value needs to be at least T",
282 "min_device_sdk: Attribute value needs to be at least T",
283 "max_device_sdk: Attribute value needs to be at least T",
284 },
285 )).RunTestWithBp(t,
286 `
287 java_sdk_library {
288 name: "foo",
289 srcs: ["a.java", "b.java"],
290 api_packages: ["foo"],
291 on_bootclasspath_since: "S",
292 on_bootclasspath_before: "S",
293 min_device_sdk: "S",
294 max_device_sdk: "S",
295 min_sdk_version: "S",
296 }
297`)
298}
299
300func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
301 android.GroupFixturePreparers(
302 prepareForJavaTest,
303 PrepareForTestWithJavaSdkLibraryFiles,
304 FixtureWithPrebuiltApis(map[string][]string{
305 "28": {"foo"},
306 }),
307 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
308 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
309 }),
310 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
311 []string{
312 "min_device_sdk can't be greater than max_device_sdk",
313 },
314 )).RunTestWithBp(t,
315 `
316 java_sdk_library {
317 name: "foo",
318 srcs: ["a.java", "b.java"],
319 api_packages: ["foo"],
320 min_device_sdk: "V",
321 max_device_sdk: "U",
322 min_sdk_version: "S",
323 }
324`)
325}
326
327func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
328 android.GroupFixturePreparers(
329 prepareForJavaTest,
330 PrepareForTestWithJavaSdkLibraryFiles,
331 FixtureWithPrebuiltApis(map[string][]string{
332 "28": {"foo"},
333 }),
334 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
335 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
336 }),
337 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
338 []string{
339 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
340 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
341 },
342 )).RunTestWithBp(t,
343 `
344 java_sdk_library {
345 name: "foo",
346 srcs: ["a.java", "b.java"],
347 api_packages: ["foo"],
348 min_device_sdk: "U",
349 max_device_sdk: "U",
350 min_sdk_version: "V",
351 }
352`)
353}
354
355func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
356 result := android.GroupFixturePreparers(
357 prepareForJavaTest,
358 PrepareForTestWithJavaSdkLibraryFiles,
359 FixtureWithPrebuiltApis(map[string][]string{
360 "30": {"foo"},
361 }),
362 ).RunTestWithBp(t,
363 `
364 java_sdk_library {
365 name: "foo",
366 srcs: ["a.java", "b.java"],
367 min_device_sdk: "Tiramisu",
368 min_sdk_version: "S",
369 }
370`)
371 // test that updatability attributes are passed on correctly
Paul Duffin1816cde2024-04-10 10:58:21 +0100372 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
373 fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
374 android.AssertStringDoesContain(t, "foo.xml contents", fooUpdatableContents, `<apex-library`)
375 android.AssertStringDoesNotContain(t, "foo.xml contents", fooUpdatableContents, `<library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000376}
377
Colin Cross1d2b6b32021-06-01 13:18:08 -0700378func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
379 result := android.GroupFixturePreparers(
380 prepareForJavaTest,
381 PrepareForTestWithJavaSdkLibraryFiles,
382 FixtureWithLastReleaseApis("sdklib"),
383 ).RunTestWithBp(t, `
384 java_sdk_library {
385 name: "sdklib",
386 srcs: ["a.java"],
387 libs: ["lib"],
388 static_libs: ["static-lib"],
389 impl_only_libs: ["impl-only-lib"],
390 stub_only_libs: ["stub-only-lib"],
391 stub_only_static_libs: ["stub-only-static-lib"],
392 }
393 java_defaults {
394 name: "defaults",
395 srcs: ["a.java"],
396 sdk_version: "current",
397 }
398 java_library { name: "lib", defaults: ["defaults"] }
399 java_library { name: "static-lib", defaults: ["defaults"] }
400 java_library { name: "impl-only-lib", defaults: ["defaults"] }
401 java_library { name: "stub-only-lib", defaults: ["defaults"] }
402 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
403 `)
404 var expectations = []struct {
405 lib string
406 on_impl_classpath bool
407 on_stub_classpath bool
408 in_impl_combined bool
409 in_stub_combined bool
410 }{
411 {lib: "lib", on_impl_classpath: true},
412 {lib: "static-lib", in_impl_combined: true},
413 {lib: "impl-only-lib", on_impl_classpath: true},
414 {lib: "stub-only-lib", on_stub_classpath: true},
415 {lib: "stub-only-static-lib", in_stub_combined: true},
416 }
417 verify := func(sdklib, dep string, cp, combined bool) {
418 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
419 expected := cp || combined // Every combined jar is also on the classpath.
420 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
421
422 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
423 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
424 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
425 }
426 for _, expectation := range expectations {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700427 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
428
Jihoon Kang1147b312023-06-08 23:25:57 +0000429 stubName := apiScopePublic.sourceStubLibraryModuleName("sdklib")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700430 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
431 }
432}
433
434func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
435 result := android.GroupFixturePreparers(
436 prepareForJavaTest,
437 PrepareForTestWithJavaSdkLibraryFiles,
438 FixtureWithLastReleaseApis("foo"),
439 ).RunTestWithBp(t, `
440 java_sdk_library {
441 name: "foo",
442 srcs: ["a.java"],
443 api_only: true,
444 public: {
445 enabled: true,
446 },
447 }
448
449 java_library {
450 name: "bar",
451 srcs: ["b.java"],
452 libs: ["foo"],
453 }
454 `)
455
456 // The bar library should depend on the stubs jar.
457 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
458 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
459 t.Errorf("expected %q, found %#q", expected, actual)
460 }
461}
462
Anton Hanssond78eb762021-09-21 15:25:12 +0100463func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700464 android.GroupFixturePreparers(
465 prepareForJavaTest,
466 PrepareForTestWithJavaSdkLibraryFiles,
467 FixtureWithLastReleaseApis("foo"),
468 ).RunTestWithBp(t, `
469 java_sdk_library {
470 name: "foo",
471 srcs: ["a.java"],
472 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100473 annotations_enabled: true,
474 public: {
475 enabled: true,
476 },
477 }
478 java_library {
479 name: "bar",
480 srcs: ["b.java", ":foo{.public.stubs.source}"],
481 java_resources: [":foo{.public.annotations.zip}"],
482 }
483 `)
484}
485
486func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
487 android.GroupFixturePreparers(
488 prepareForJavaTest,
489 PrepareForTestWithJavaSdkLibraryFiles,
490 FixtureWithLastReleaseApis("foo"),
491 ).
mrziwang9f7b9f42024-07-10 12:18:06 -0700492 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference tag ".public.annotations.zip"`)).
Anton Hanssond78eb762021-09-21 15:25:12 +0100493 RunTestWithBp(t, `
494 java_sdk_library {
495 name: "foo",
496 srcs: ["a.java"],
497 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700498 public: {
499 enabled: true,
500 },
501 }
502
503 java_library {
504 name: "bar",
505 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100506 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700507 }
508 `)
509}
510
511func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
512 android.GroupFixturePreparers(
513 prepareForJavaTest,
514 PrepareForTestWithJavaSdkLibraryFiles,
515 FixtureWithLastReleaseApis("foo"),
516 ).
mrziwang9f7b9f42024-07-10 12:18:06 -0700517 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference tag ".system.stubs.source"`)).
Colin Cross1d2b6b32021-06-01 13:18:08 -0700518 RunTestWithBp(t, `
519 java_sdk_library {
520 name: "foo",
521 srcs: ["a.java"],
522 api_packages: ["foo"],
523 public: {
524 enabled: true,
525 },
526 }
527
528 java_library {
529 name: "bar",
530 srcs: ["b.java", ":foo{.system.stubs.source}"],
531 }
532 `)
533}
534
535func TestJavaSdkLibrary_Deps(t *testing.T) {
536 result := android.GroupFixturePreparers(
537 prepareForJavaTest,
538 PrepareForTestWithJavaSdkLibraryFiles,
539 FixtureWithLastReleaseApis("sdklib"),
Jihoon Kangbd093452023-12-26 19:08:01 +0000540 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
541 variables.BuildFlags = map[string]string{
542 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
543 }
544 }),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700545 ).RunTestWithBp(t, `
546 java_sdk_library {
547 name: "sdklib",
548 srcs: ["a.java"],
549 sdk_version: "none",
550 system_modules: "none",
551 public: {
552 enabled: true,
553 },
554 }
555 `)
556
557 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
558 `dex2oatd`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000559 `sdklib-removed.api.combined.public.latest`,
560 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700561 `sdklib.impl`,
562 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000563 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700564 `sdklib.stubs.source`,
565 `sdklib.xml`,
566 })
567}
568
569func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
570 prepareForJavaTest.RunTestWithBp(t, `
571 java_sdk_library_import {
572 name: "foo",
573 public: {
574 jars: ["a.jar"],
575 stub_srcs: ["a.java"],
576 current_api: "api/current.txt",
577 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100578 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700579 },
580 }
581
582 java_library {
583 name: "bar",
584 srcs: [":foo{.public.stubs.source}"],
585 java_resources: [
586 ":foo{.public.api.txt}",
587 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100588 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700589 ],
590 }
591 `)
592}
593
594func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
595 bp := `
596 java_sdk_library_import {
597 name: "foo",
598 public: {
599 jars: ["a.jar"],
600 },
601 }
602 `
603
604 t.Run("stubs.source", func(t *testing.T) {
605 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700606 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 -0700607 RunTestWithBp(t, bp+`
608 java_library {
609 name: "bar",
610 srcs: [":foo{.public.stubs.source}"],
611 java_resources: [
612 ":foo{.public.api.txt}",
613 ":foo{.public.removed-api.txt}",
614 ],
615 }
616 `)
617 })
618
619 t.Run("api.txt", func(t *testing.T) {
620 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700621 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 -0700622 RunTestWithBp(t, bp+`
623 java_library {
624 name: "bar",
625 srcs: ["a.java"],
626 java_resources: [
627 ":foo{.public.api.txt}",
628 ],
629 }
630 `)
631 })
632
633 t.Run("removed-api.txt", func(t *testing.T) {
634 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700635 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 -0700636 RunTestWithBp(t, bp+`
637 java_library {
638 name: "bar",
639 srcs: ["a.java"],
640 java_resources: [
641 ":foo{.public.removed-api.txt}",
642 ],
643 }
644 `)
645 })
646}
647
648func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
649 prepareForJavaTest.
650 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
651 RunTestWithBp(t, `
652 java_sdk_library {
653 name: "foo",
654 srcs: ["a.java", "b.java"],
655 api_packages: ["foo"],
656 // Explicitly disable public to test the check that ensures the set of enabled
657 // scopes is consistent.
658 public: {
659 enabled: false,
660 },
661 system: {
662 enabled: true,
663 },
664 }
665 `)
666}
667
668func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
669 android.GroupFixturePreparers(
670 prepareForJavaTest,
671 PrepareForTestWithJavaSdkLibraryFiles,
672 FixtureWithLastReleaseApis("foo"),
673 ).RunTestWithBp(t, `
674 java_sdk_library {
675 name: "foo",
676 srcs: ["a.java", "b.java"],
677 api_packages: ["foo"],
678 system: {
679 enabled: true,
680 sdk_version: "module_current",
681 },
682 }
683 `)
684}
685
686func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
687 android.GroupFixturePreparers(
688 prepareForJavaTest,
689 PrepareForTestWithJavaSdkLibraryFiles,
690 FixtureWithLastReleaseApis("foo"),
691 ).RunTestWithBp(t, `
692 java_sdk_library {
693 name: "foo",
694 srcs: ["a.java", "b.java"],
695 api_packages: ["foo"],
696 system: {
697 enabled: true,
698 },
699 module_lib: {
700 enabled: true,
701 },
702 }
703 `)
704}
705
706func TestJavaSdkLibrary_SystemServer(t *testing.T) {
707 android.GroupFixturePreparers(
708 prepareForJavaTest,
709 PrepareForTestWithJavaSdkLibraryFiles,
710 FixtureWithLastReleaseApis("foo"),
711 ).RunTestWithBp(t, `
712 java_sdk_library {
713 name: "foo",
714 srcs: ["a.java", "b.java"],
715 api_packages: ["foo"],
716 system: {
717 enabled: true,
718 },
719 system_server: {
720 enabled: true,
721 },
722 }
723 `)
724}
725
Paul Duffind0b9fca2022-09-30 18:11:41 +0100726func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
727 result := android.GroupFixturePreparers(
728 prepareForJavaTest,
729 PrepareForTestWithJavaSdkLibraryFiles,
730 FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
731 ).RunTestWithBp(t, `
732 java_sdk_library {
733 name: "foo-public",
734 srcs: ["a.java"],
735 api_packages: ["foo"],
736 public: {
737 enabled: true,
738 },
739 }
740
741 java_sdk_library {
742 name: "foo-system",
743 srcs: ["a.java"],
744 api_packages: ["foo"],
745 system: {
746 enabled: true,
747 },
748 }
749
750 java_sdk_library {
751 name: "foo-module-lib",
752 srcs: ["a.java"],
753 api_packages: ["foo"],
754 system: {
755 enabled: true,
756 },
757 module_lib: {
758 enabled: true,
759 },
760 }
761
762 java_sdk_library {
763 name: "foo-system-server",
764 srcs: ["a.java"],
765 api_packages: ["foo"],
766 system_server: {
767 enabled: true,
768 },
769 }
770
771 java_library {
772 name: "bar",
773 srcs: ["a.java"],
774 libs: ["foo-public", "foo-system", "foo-module-lib", "foo-system-server"],
775 sdk_version: "system_server_current",
776 }
777 `)
778
779 stubsPath := func(name string, scope *apiScope) string {
780 name = scope.stubsLibraryModuleName(name)
781 return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
782 }
783
784 // The bar library should depend on the highest (where system server is highest and public is
785 // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
786 // foo-<x> module is <x>.
787 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
788 stubLibraries := []string{
789 stubsPath("foo-public", apiScopePublic),
790 stubsPath("foo-system", apiScopeSystem),
791 stubsPath("foo-module-lib", apiScopeModuleLib),
792 stubsPath("foo-system-server", apiScopeSystemServer),
793 }
794 expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
795 if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
796 t.Errorf("expected pattern %q to match %#q", expected, actual)
797 }
798}
799
Colin Cross1d2b6b32021-06-01 13:18:08 -0700800func TestJavaSdkLibrary_MissingScope(t *testing.T) {
801 prepareForJavaTest.
802 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
803 RunTestWithBp(t, `
804 java_sdk_library {
805 name: "foo",
806 srcs: ["a.java"],
807 public: {
808 enabled: false,
809 },
810 }
811
812 java_library {
813 name: "baz",
814 srcs: ["a.java"],
815 libs: ["foo"],
816 sdk_version: "module_current",
817 }
818 `)
819}
820
821func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
822 android.GroupFixturePreparers(
823 prepareForJavaTest,
824 PrepareForTestWithJavaSdkLibraryFiles,
825 FixtureWithLastReleaseApis("foo"),
826 ).RunTestWithBp(t, `
827 java_sdk_library {
828 name: "foo",
829 srcs: ["a.java"],
830 system: {
831 enabled: true,
832 },
833 }
834
835 java_library {
836 name: "baz",
837 srcs: ["a.java"],
838 libs: ["foo"],
839 // foo does not have module-lib scope so it should fallback to system
840 sdk_version: "module_current",
841 }
842 `)
843}
844
845func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
846 result := android.GroupFixturePreparers(
847 prepareForJavaTest,
848 PrepareForTestWithJavaSdkLibraryFiles,
849 FixtureWithLastReleaseApis("foo"),
850 ).RunTestWithBp(t, `
851 java_sdk_library {
852 name: "foo",
853 srcs: ["a.java"],
854 system: {
855 enabled: true,
856 },
857 default_to_stubs: true,
858 }
859
860 java_library {
861 name: "baz",
862 srcs: ["a.java"],
863 libs: ["foo"],
864 // does not have sdk_version set, should fallback to module,
865 // which will then fallback to system because the module scope
866 // is not enabled.
867 }
868 `)
869 // The baz library should depend on the system stubs jar.
870 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
871 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
872 t.Errorf("expected %q, found %#q", expected, actual)
873 }
874}
875
876func TestJavaSdkLibraryImport(t *testing.T) {
877 result := prepareForJavaTest.RunTestWithBp(t, `
878 java_library {
879 name: "foo",
880 srcs: ["a.java"],
881 libs: ["sdklib"],
882 sdk_version: "current",
883 }
884
885 java_library {
886 name: "foo.system",
887 srcs: ["a.java"],
888 libs: ["sdklib"],
889 sdk_version: "system_current",
890 }
891
892 java_library {
893 name: "foo.test",
894 srcs: ["a.java"],
895 libs: ["sdklib"],
896 sdk_version: "test_current",
897 }
898
899 java_sdk_library_import {
900 name: "sdklib",
901 public: {
902 jars: ["a.jar"],
903 },
904 system: {
905 jars: ["b.jar"],
906 },
907 test: {
908 jars: ["c.jar"],
909 stub_srcs: ["c.java"],
910 },
911 }
912 `)
913
914 for _, scope := range []string{"", ".system", ".test"} {
915 fooModule := result.ModuleForTests("foo"+scope, "android_common")
916 javac := fooModule.Rule("javac")
917
918 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
919 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
920 }
921
922 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000923 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +0000924 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700925 `prebuilt_sdklib.stubs`,
926 `prebuilt_sdklib.stubs.source.test`,
927 `prebuilt_sdklib.stubs.system`,
928 `prebuilt_sdklib.stubs.test`,
929 })
930}
931
932func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
933 result := android.GroupFixturePreparers(
934 prepareForJavaTest,
935 PrepareForTestWithJavaSdkLibraryFiles,
936 FixtureWithLastReleaseApis("sdklib"),
Jihoon Kangbd093452023-12-26 19:08:01 +0000937 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
938 variables.BuildFlags = map[string]string{
939 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
940 }
941 }),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700942 ).RunTestWithBp(t, `
943 java_sdk_library {
944 name: "sdklib",
945 srcs: ["a.java"],
946 sdk_version: "none",
947 system_modules: "none",
948 public: {
949 enabled: true,
950 },
951 }
952
953 java_sdk_library_import {
954 name: "sdklib",
955 public: {
956 jars: ["a.jar"],
957 },
958 }
959 `)
960
961 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
962 `dex2oatd`,
963 `prebuilt_sdklib`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000964 `sdklib-removed.api.combined.public.latest`,
965 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700966 `sdklib.impl`,
967 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000968 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700969 `sdklib.stubs.source`,
970 `sdklib.xml`,
971 })
972
973 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +0000974 `all_apex_contributions`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700975 `prebuilt_sdklib.stubs`,
976 `sdklib.impl`,
977 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
978 // dependency is added after prebuilts may have been renamed and so has to use
979 // the renamed name.
980 `sdklib.xml`,
981 })
982}
983
Paul Duffinbf4de042022-09-27 12:41:52 +0100984func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700985 result := android.GroupFixturePreparers(
986 prepareForJavaTest,
987 PrepareForTestWithJavaSdkLibraryFiles,
988 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100989 preparer,
Jihoon Kangbd093452023-12-26 19:08:01 +0000990 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
991 variables.BuildFlags = map[string]string{
992 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
993 }
994 }),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700995 ).RunTestWithBp(t, `
996 java_sdk_library {
997 name: "sdklib",
998 srcs: ["a.java"],
999 sdk_version: "none",
1000 system_modules: "none",
1001 public: {
1002 enabled: true,
1003 },
1004 }
1005
1006 java_sdk_library_import {
1007 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +01001008 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -07001009 public: {
1010 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +01001011 stub_srcs: ["a.java"],
1012 current_api: "current.txt",
1013 removed_api: "removed.txt",
1014 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001015 },
1016 }
Paul Duffinbf4de042022-09-27 12:41:52 +01001017
1018 java_library {
1019 name: "combined",
1020 static_libs: [
1021 "sdklib.stubs",
1022 ],
1023 java_resources: [
1024 ":sdklib.stubs.source",
1025 ":sdklib{.public.api.txt}",
1026 ":sdklib{.public.removed-api.txt}",
1027 ":sdklib{.public.annotations.zip}",
1028 ],
1029 sdk_version: "none",
1030 system_modules: "none",
1031 }
1032
1033 java_library {
1034 name: "public",
1035 srcs: ["a.java"],
1036 libs: ["sdklib"],
1037 sdk_version: "current",
1038 }
Colin Cross1d2b6b32021-06-01 13:18:08 -07001039 `)
1040
1041 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -07001042 `prebuilt_sdklib`,
Jihoon Kang748a24d2024-03-20 21:29:39 +00001043 `sdklib-removed.api.combined.public.latest`,
1044 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001045 `sdklib.impl`,
1046 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +00001047 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001048 `sdklib.stubs.source`,
1049 `sdklib.xml`,
1050 })
1051
1052 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +00001053 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +00001054 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001055 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +01001056 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001057 `sdklib.impl`,
1058 `sdklib.xml`,
1059 })
Paul Duffinbf4de042022-09-27 12:41:52 +01001060
1061 // Make sure that dependencies on child modules use the prebuilt when preferred.
1062 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
1063 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
1064 `prebuilt_sdklib`,
1065 `prebuilt_sdklib`,
1066 `prebuilt_sdklib`,
1067 `prebuilt_sdklib.stubs`,
1068 `prebuilt_sdklib.stubs.source`,
1069 })
1070
1071 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1072 // prebuilt library.
1073 public := result.ModuleForTests("public", "android_common")
1074 rule := public.Output("javac/public.jar")
1075 inputs := rule.Implicits.Strings()
1076 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
1077 if !android.InList(expected, inputs) {
1078 t.Errorf("expected %q to contain %q", inputs, expected)
1079 }
1080}
1081
1082func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
1083 t.Run("prefer", func(t *testing.T) {
1084 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1085 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001086}
1087
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001088// If a module is listed in `mainline_module_contributions, it should be used
1089// It will supersede any other source vs prebuilt selection mechanism like `prefer` attribute
1090func TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) {
1091 bp := `
1092 apex_contributions {
1093 name: "my_mainline_module_contributions",
1094 api_domain: "my_mainline_module",
1095 contents: [
1096 // legacy mechanism prefers the prebuilt
1097 // mainline_module_contributions supersedes this since source is listed explicitly
1098 "sdklib.prebuilt_preferred_using_legacy_flags",
1099
1100 // legacy mechanism prefers the source
1101 // mainline_module_contributions supersedes this since prebuilt is listed explicitly
1102 "prebuilt_sdklib.source_preferred_using_legacy_flags",
1103 ],
1104 }
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001105 java_sdk_library {
1106 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1107 srcs: ["a.java"],
1108 sdk_version: "none",
1109 system_modules: "none",
1110 public: {
1111 enabled: true,
1112 },
1113 system: {
1114 enabled: true,
1115 }
1116 }
1117 java_sdk_library_import {
1118 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1119 prefer: true, // prebuilt is preferred using legacy mechanism
1120 public: {
1121 jars: ["a.jar"],
1122 stub_srcs: ["a.java"],
1123 current_api: "current.txt",
1124 removed_api: "removed.txt",
1125 annotations: "annotations.zip",
1126 },
1127 system: {
1128 jars: ["a.jar"],
1129 stub_srcs: ["a.java"],
1130 current_api: "current.txt",
1131 removed_api: "removed.txt",
1132 annotations: "annotations.zip",
1133 },
1134 }
1135 java_sdk_library {
1136 name: "sdklib.source_preferred_using_legacy_flags",
1137 srcs: ["a.java"],
1138 sdk_version: "none",
1139 system_modules: "none",
1140 public: {
1141 enabled: true,
1142 },
1143 system: {
1144 enabled: true,
1145 }
1146 }
1147 java_sdk_library_import {
1148 name: "sdklib.source_preferred_using_legacy_flags",
1149 prefer: false, // source is preferred using legacy mechanism
1150 public: {
1151 jars: ["a.jar"],
1152 stub_srcs: ["a.java"],
1153 current_api: "current.txt",
1154 removed_api: "removed.txt",
1155 annotations: "annotations.zip",
1156 },
1157 system: {
1158 jars: ["a.jar"],
1159 stub_srcs: ["a.java"],
1160 current_api: "current.txt",
1161 removed_api: "removed.txt",
1162 annotations: "annotations.zip",
1163 },
1164 }
1165
1166 // rdeps
1167 java_library {
1168 name: "public",
1169 srcs: ["a.java"],
1170 libs: [
1171 // this should get source since source is listed in my_mainline_module_contributions
1172 "sdklib.prebuilt_preferred_using_legacy_flags.stubs",
1173 "sdklib.prebuilt_preferred_using_legacy_flags.stubs.system",
1174
1175 // this should get prebuilt since source is listed in my_mainline_module_contributions
1176 "sdklib.source_preferred_using_legacy_flags.stubs",
1177 "sdklib.source_preferred_using_legacy_flags.stubs.system",
1178
1179 ],
1180 }
1181 `
1182 result := android.GroupFixturePreparers(
1183 prepareForJavaTest,
1184 PrepareForTestWithJavaSdkLibraryFiles,
1185 FixtureWithLastReleaseApis("sdklib.source_preferred_using_legacy_flags", "sdklib.prebuilt_preferred_using_legacy_flags"),
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001186 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1187 variables.BuildFlags = map[string]string{
1188 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "my_mainline_module_contributions",
1189 }
1190 }),
1191 ).RunTestWithBp(t, bp)
1192
1193 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1194 public := result.ModuleForTests("public", "android_common")
1195 rule := public.Output("javac/public.jar")
1196 inputs := rule.Implicits.Strings()
1197 expectedInputs := []string{
1198 // source
1199 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.jar",
1200 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.jar",
1201
1202 // prebuilt
1203 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.jar",
1204 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs.system/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.system.jar",
1205 }
1206 for _, expected := range expectedInputs {
1207 if !android.InList(expected, inputs) {
1208 t.Errorf("expected %q to contain %q", inputs, expected)
1209 }
1210 }
1211}
1212
Colin Cross1d2b6b32021-06-01 13:18:08 -07001213func TestJavaSdkLibraryEnforce(t *testing.T) {
1214 partitionToBpOption := func(partition string) string {
1215 switch partition {
1216 case "system":
1217 return ""
1218 case "vendor":
1219 return "soc_specific: true,"
1220 case "product":
1221 return "product_specific: true,"
1222 default:
1223 panic("Invalid partition group name: " + partition)
1224 }
1225 }
1226
1227 type testConfigInfo struct {
1228 libraryType string
1229 fromPartition string
1230 toPartition string
Colin Cross1d2b6b32021-06-01 13:18:08 -07001231 enforceProductInterface bool
1232 enforceJavaSdkLibraryCheck bool
1233 allowList []string
1234 }
1235
1236 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1237 bpFileTemplate := `
1238 java_library {
1239 name: "foo",
1240 srcs: ["foo.java"],
1241 libs: ["bar"],
1242 sdk_version: "current",
1243 %s
1244 }
1245
1246 %s {
1247 name: "bar",
1248 srcs: ["bar.java"],
1249 sdk_version: "current",
1250 %s
1251 }
1252 `
1253
1254 bpFile := fmt.Sprintf(bpFileTemplate,
1255 partitionToBpOption(info.fromPartition),
1256 info.libraryType,
1257 partitionToBpOption(info.toPartition))
1258
1259 return android.GroupFixturePreparers(
1260 PrepareForTestWithJavaSdkLibraryFiles,
1261 FixtureWithLastReleaseApis("bar"),
1262 android.FixtureWithRootAndroidBp(bpFile),
1263 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1264 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
Colin Cross1d2b6b32021-06-01 13:18:08 -07001265 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1266 variables.InterPartitionJavaLibraryAllowList = info.allowList
1267 }),
1268 )
1269 }
1270
1271 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1272 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1273 errorHandler := android.FixtureExpectsNoErrors
1274 if expectedErrorPattern != "" {
1275 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1276 }
1277 android.GroupFixturePreparers(
1278 prepareForJavaTest,
1279 createPreparer(info),
1280 ).
1281 ExtendWithErrorHandler(errorHandler).
1282 RunTest(t)
1283 })
1284 }
1285
1286 errorMessage := "is not allowed across the partitions"
1287
1288 runTest(t, testConfigInfo{
1289 libraryType: "java_library",
1290 fromPartition: "product",
1291 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001292 enforceProductInterface: true,
1293 enforceJavaSdkLibraryCheck: false,
1294 }, "")
1295
1296 runTest(t, testConfigInfo{
1297 libraryType: "java_library",
1298 fromPartition: "product",
1299 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001300 enforceProductInterface: false,
1301 enforceJavaSdkLibraryCheck: true,
1302 }, "")
1303
1304 runTest(t, testConfigInfo{
1305 libraryType: "java_library",
1306 fromPartition: "product",
1307 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001308 enforceProductInterface: true,
1309 enforceJavaSdkLibraryCheck: true,
1310 }, errorMessage)
1311
1312 runTest(t, testConfigInfo{
1313 libraryType: "java_library",
1314 fromPartition: "vendor",
1315 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001316 enforceProductInterface: true,
1317 enforceJavaSdkLibraryCheck: true,
1318 }, errorMessage)
1319
1320 runTest(t, testConfigInfo{
1321 libraryType: "java_library",
1322 fromPartition: "vendor",
1323 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001324 enforceProductInterface: true,
1325 enforceJavaSdkLibraryCheck: true,
1326 allowList: []string{"bar"},
1327 }, "")
1328
1329 runTest(t, testConfigInfo{
1330 libraryType: "java_library",
1331 fromPartition: "vendor",
1332 toPartition: "product",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001333 enforceProductInterface: true,
1334 enforceJavaSdkLibraryCheck: true,
1335 }, errorMessage)
1336
1337 runTest(t, testConfigInfo{
1338 libraryType: "java_sdk_library",
1339 fromPartition: "product",
1340 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001341 enforceProductInterface: true,
1342 enforceJavaSdkLibraryCheck: true,
1343 }, "")
1344
1345 runTest(t, testConfigInfo{
1346 libraryType: "java_sdk_library",
1347 fromPartition: "vendor",
1348 toPartition: "system",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001349 enforceProductInterface: true,
1350 enforceJavaSdkLibraryCheck: true,
1351 }, "")
1352
1353 runTest(t, testConfigInfo{
1354 libraryType: "java_sdk_library",
1355 fromPartition: "vendor",
1356 toPartition: "product",
Colin Cross1d2b6b32021-06-01 13:18:08 -07001357 enforceProductInterface: true,
1358 enforceJavaSdkLibraryCheck: true,
1359 }, "")
1360}
Colin Cross30c491b2021-06-01 13:39:09 -07001361
1362func TestJavaSdkLibraryDist(t *testing.T) {
1363 result := android.GroupFixturePreparers(
1364 PrepareForTestWithJavaBuildComponents,
1365 PrepareForTestWithJavaDefaultModules,
1366 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001367 FixtureWithLastReleaseApis(
1368 "sdklib_no_group",
1369 "sdklib_group_foo",
1370 "sdklib_owner_foo",
1371 "foo"),
Jihoon Kang02168052024-03-20 00:44:54 +00001372 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1373 variables.BuildFlags = map[string]string{
1374 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
1375 }
1376 }),
Colin Cross30c491b2021-06-01 13:39:09 -07001377 ).RunTestWithBp(t, `
1378 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001379 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001380 srcs: ["foo.java"],
1381 }
1382
1383 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001384 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001385 srcs: ["foo.java"],
1386 dist_group: "foo",
1387 }
1388
1389 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001390 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001391 srcs: ["foo.java"],
1392 owner: "foo",
1393 }
1394
1395 java_sdk_library {
1396 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001397 srcs: ["foo.java"],
1398 dist_stem: "foo",
1399 }
Colin Cross30c491b2021-06-01 13:39:09 -07001400 `)
1401
1402 type testCase struct {
1403 module string
1404 distDir string
1405 distStem string
1406 }
1407 testCases := []testCase{
1408 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001409 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001410 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001411 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001412 },
1413 {
Colin Cross986b69a2021-06-01 13:13:40 -07001414 module: "sdklib_group_foo",
1415 distDir: "apistubs/foo/public",
1416 distStem: "sdklib_group_foo.jar",
1417 },
1418 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001419 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001420 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001421 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001422 distStem: "sdklib_owner_foo.jar",
1423 },
1424 {
1425 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001426 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001427 distStem: "foo.jar",
1428 },
Colin Cross30c491b2021-06-01 13:39:09 -07001429 }
1430
1431 for _, tt := range testCases {
1432 t.Run(tt.module, func(t *testing.T) {
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001433 m := result.ModuleForTests(apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library)
Colin Cross30c491b2021-06-01 13:39:09 -07001434 dists := m.Dists()
1435 if len(dists) != 1 {
1436 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1437 }
1438 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1439 t.Errorf("expected dist dir %q, got %q", w, g)
1440 }
1441 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1442 t.Errorf("expected dist stem %q, got %q", w, g)
1443 }
1444 })
1445 }
1446}
satayev8f088b02021-12-06 11:40:46 +00001447
1448func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1449 preparer := android.GroupFixturePreparers(
1450 PrepareForTestWithJavaBuildComponents,
1451 PrepareForTestWithJavaDefaultModules,
1452 PrepareForTestWithJavaSdkLibraryFiles,
1453 )
1454
1455 preparer.RunTestWithBp(t, `
1456 java_sdk_library {
1457 name: "sdklib",
Jihoon Kanga3a05462024-04-05 00:36:44 +00001458 srcs: ["a.java"],
1459 static_libs: ["util"],
1460 min_sdk_version: "30",
satayev8f088b02021-12-06 11:40:46 +00001461 unsafe_ignore_missing_latest_api: true,
Jihoon Kanga3a05462024-04-05 00:36:44 +00001462 }
satayev8f088b02021-12-06 11:40:46 +00001463
1464 java_library {
1465 name: "util",
1466 srcs: ["a.java"],
1467 min_sdk_version: "30",
1468 }
1469 `)
1470
1471 preparer.
1472 RunTestWithBp(t, `
1473 java_sdk_library {
1474 name: "sdklib",
1475 srcs: ["a.java"],
1476 libs: ["util"],
1477 impl_only_libs: ["util"],
1478 stub_only_libs: ["util"],
1479 stub_only_static_libs: ["util"],
1480 min_sdk_version: "30",
1481 unsafe_ignore_missing_latest_api: true,
1482 }
1483
1484 java_library {
1485 name: "util",
1486 srcs: ["a.java"],
1487 }
1488 `)
1489
1490 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1491 RunTestWithBp(t, `
1492 java_sdk_library {
1493 name: "sdklib",
1494 srcs: ["a.java"],
1495 static_libs: ["util"],
1496 min_sdk_version: "30",
1497 unsafe_ignore_missing_latest_api: true,
1498 }
1499
1500 java_library {
1501 name: "util",
1502 srcs: ["a.java"],
1503 min_sdk_version: "31",
1504 }
1505 `)
1506
1507 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1508 RunTestWithBp(t, `
1509 java_sdk_library {
1510 name: "sdklib",
1511 srcs: ["a.java"],
1512 static_libs: ["util"],
1513 min_sdk_version: "30",
1514 unsafe_ignore_missing_latest_api: true,
1515 }
1516
1517 java_library {
1518 name: "util",
1519 srcs: ["a.java"],
1520 static_libs: ["another_util"],
1521 min_sdk_version: "30",
1522 }
1523
1524 java_library {
1525 name: "another_util",
1526 srcs: ["a.java"],
1527 min_sdk_version: "31",
1528 }
1529 `)
1530}
Nikita Ioffed732da72022-11-21 12:38:25 +00001531
1532func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1533 result := android.GroupFixturePreparers(
1534 prepareForJavaTest,
1535 PrepareForTestWithJavaSdkLibraryFiles,
1536 FixtureWithLastReleaseApis("foo"),
1537 ).RunTestWithBp(t, `
1538 java_sdk_library {
1539 name: "foo",
1540 srcs: ["a.java"],
1541 public: {
1542 enabled: true,
1543 },
1544 stub_only_libs: ["bar-lib"],
1545 }
1546
1547 java_library {
1548 name: "bar-lib",
1549 srcs: ["b.java"],
1550 }
1551 `)
1552
1553 // The foo.stubs.source should depend on bar-lib
1554 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1555 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1556}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001557
Mark White9421c4c2023-08-10 00:07:03 +00001558func TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) {
1559 result := android.GroupFixturePreparers(
1560 prepareForJavaTest,
1561 PrepareForTestWithJavaSdkLibraryFiles,
1562 FixtureWithLastReleaseApis("foo"),
1563 ).RunTestWithBp(t, `
1564 java_sdk_library {
1565 name: "foo",
1566 srcs: ["a.java"],
1567 public: {
1568 enabled: true,
1569 libs: ["bar-lib"],
1570 },
1571 }
1572
1573 java_library {
1574 name: "bar-lib",
1575 srcs: ["b.java"],
1576 }
1577 `)
1578
1579 // The foo.stubs.source should depend on bar-lib
1580 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1581 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1582}
1583
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001584func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
1585 result := android.GroupFixturePreparers(
1586 prepareForJavaTest,
1587 PrepareForTestWithJavaSdkLibraryFiles,
1588 FixtureWithLastReleaseApis("foo"),
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001589 ).RunTestWithBp(t, `
1590 java_sdk_library {
1591 name: "foo",
1592 srcs: ["a.java", "b.java"],
1593 api_packages: ["foo"],
1594 system: {
1595 enabled: true,
1596 },
1597 module_lib: {
1598 enabled: true,
1599 },
1600 test: {
1601 enabled: true,
1602 },
1603 }
1604 `)
1605
1606 testCases := []struct {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001607 scope *apiScope
1608 apiContributions []string
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001609 }{
1610 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001611 scope: apiScopePublic,
1612 apiContributions: []string{"foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001613 },
1614 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001615 scope: apiScopeSystem,
1616 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001617 },
1618 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001619 scope: apiScopeTest,
1620 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 +00001621 },
1622 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001623 scope: apiScopeModuleLib,
1624 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 +00001625 },
1626 }
1627
1628 for _, c := range testCases {
1629 m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1630 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001631 }
1632}
Jihoon Kang786df932023-09-07 01:18:31 +00001633
1634func TestStaticDepStubLibrariesVisibility(t *testing.T) {
1635 android.GroupFixturePreparers(
1636 prepareForJavaTest,
1637 PrepareForTestWithJavaSdkLibraryFiles,
1638 FixtureWithLastReleaseApis("foo"),
1639 android.FixtureMergeMockFs(
1640 map[string][]byte{
1641 "A.java": nil,
1642 "dir/Android.bp": []byte(
1643 `
1644 java_library {
1645 name: "bar",
1646 srcs: ["A.java"],
1647 libs: ["foo.stubs.from-source"],
1648 }
1649 `),
1650 "dir/A.java": nil,
1651 },
1652 ).ExtendWithErrorHandler(
1653 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1654 `module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1655 ).RunTestWithBp(t, `
1656 java_sdk_library {
1657 name: "foo",
1658 srcs: ["A.java"],
1659 }
1660 `)
1661}
Jamie Garsidee570ace2023-11-27 12:07:36 +00001662
1663func TestSdkLibraryDependency(t *testing.T) {
1664 result := android.GroupFixturePreparers(
1665 prepareForJavaTest,
1666 PrepareForTestWithJavaSdkLibraryFiles,
1667 FixtureWithPrebuiltApis(map[string][]string{
1668 "30": {"bar", "foo"},
1669 }),
1670 ).RunTestWithBp(t,
1671 `
1672 java_sdk_library {
1673 name: "foo",
1674 srcs: ["a.java", "b.java"],
1675 api_packages: ["foo"],
1676 }
1677
1678 java_sdk_library {
1679 name: "bar",
1680 srcs: ["c.java", "b.java"],
1681 libs: [
1682 "foo",
1683 ],
1684 uses_libs: [
1685 "foo",
1686 ],
1687 }
1688`)
1689
Paul Duffin1816cde2024-04-10 10:58:21 +01001690 barPermissions := result.ModuleForTests("bar.xml", "android_common").Output("bar.xml")
1691 barContents := android.ContentFromFileRuleForTests(t, result.TestContext, barPermissions)
1692 android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barContents, `dependency="foo"`)
Jamie Garsidee570ace2023-11-27 12:07:36 +00001693}
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001694
1695func TestSdkLibraryExportableStubsLibrary(t *testing.T) {
1696 result := android.GroupFixturePreparers(
1697 prepareForJavaTest,
1698 PrepareForTestWithJavaSdkLibraryFiles,
1699 FixtureWithLastReleaseApis("foo"),
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001700 ).RunTestWithBp(t, `
1701 aconfig_declarations {
1702 name: "bar",
1703 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +00001704 container: "com.android.foo",
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001705 srcs: [
1706 "bar.aconfig",
1707 ],
1708 }
1709 java_sdk_library {
1710 name: "foo",
1711 srcs: ["a.java", "b.java"],
1712 api_packages: ["foo"],
1713 system: {
1714 enabled: true,
1715 },
1716 module_lib: {
1717 enabled: true,
1718 },
1719 test: {
1720 enabled: true,
1721 },
1722 aconfig_declarations: [
1723 "bar",
1724 ],
1725 }
1726 `)
1727
1728 exportableStubsLibraryModuleName := apiScopePublic.exportableStubsLibraryModuleName("foo")
1729 exportableSourceStubsLibraryModuleName := apiScopePublic.exportableSourceStubsLibraryModuleName("foo")
1730
1731 // Check modules generation
1732 topLevelModule := result.ModuleForTests(exportableStubsLibraryModuleName, "android_common")
1733 result.ModuleForTests(exportableSourceStubsLibraryModuleName, "android_common")
1734
1735 // Check static lib dependency
1736 android.AssertBoolEquals(t, "exportable top level stubs library module depends on the"+
1737 "exportable source stubs library module", true,
1738 CheckModuleHasDependency(t, result.TestContext, exportableStubsLibraryModuleName,
1739 "android_common", exportableSourceStubsLibraryModuleName),
1740 )
1741 android.AssertArrayString(t, "exportable source stub library is a static lib of the"+
1742 "top level exportable stubs library", []string{exportableSourceStubsLibraryModuleName},
1743 topLevelModule.Module().(*Library).properties.Static_libs)
1744}
Spandan Das81d95c52024-02-01 23:41:11 +00001745
1746// For java libraries depending on java_sdk_library(_import) via libs, assert that
1747// rdep gets stubs of source if source is listed in apex_contributions and prebuilt has prefer (legacy mechanism)
1748func TestStubResolutionOfJavaSdkLibraryInLibs(t *testing.T) {
1749 bp := `
1750 apex_contributions {
1751 name: "my_mainline_module_contributions",
1752 api_domain: "my_mainline_module",
1753 contents: ["sdklib"], // source is selected using apex_contributions, but prebuilt is selected using prefer
1754 }
1755 java_sdk_library {
1756 name: "sdklib",
1757 srcs: ["a.java"],
1758 sdk_version: "none",
1759 system_modules: "none",
1760 public: {
1761 enabled: true,
1762 },
1763 }
1764 java_sdk_library_import {
1765 name: "sdklib",
1766 public: {
1767 jars: ["a.jar"],
1768 stub_srcs: ["a.java"],
1769 current_api: "current.txt",
1770 removed_api: "removed.txt",
1771 annotations: "annotations.zip",
1772 },
1773 prefer: true, // Set prefer explicitly on the prebuilt. We will assert that rdep gets source in a test case.
1774 }
1775 // rdeps
1776 java_library {
1777 name: "mymodule",
1778 srcs: ["a.java"],
1779 sdk_version: "current",
1780 libs: ["sdklib",], // this should be dynamically resolved to sdklib.stubs (source) or prebuilt_sdklib.stubs (prebuilt)
1781 }
1782 `
1783
1784 fixture := android.GroupFixturePreparers(
1785 prepareForJavaTest,
1786 PrepareForTestWithJavaSdkLibraryFiles,
1787 FixtureWithLastReleaseApis("sdklib"),
1788 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1789 variables.BuildFlags = map[string]string{
1790 // We can use any of the apex contribution build flags from build/soong/android/config.go#mainlineApexContributionBuildFlags here
1791 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "my_mainline_module_contributions",
1792 }
1793 }),
1794 )
1795
1796 result := fixture.RunTestWithBp(t, bp)
1797 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1798 public := result.ModuleForTests("mymodule", "android_common")
1799 rule := public.Output("javac/mymodule.jar")
1800 inputs := rule.Implicits.Strings()
1801 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar")
1802}
Spandan Das23956d12024-01-19 00:22:22 +00001803
1804// test that rdep gets resolved to the correct version of a java_sdk_library (source or a specific prebuilt)
1805func TestMultipleSdkLibraryPrebuilts(t *testing.T) {
1806 bp := `
1807 apex_contributions {
1808 name: "my_mainline_module_contributions",
1809 api_domain: "my_mainline_module",
1810 contents: ["%s"],
1811 }
1812 java_sdk_library {
1813 name: "sdklib",
1814 srcs: ["a.java"],
1815 sdk_version: "none",
1816 system_modules: "none",
1817 public: {
1818 enabled: true,
1819 },
1820 }
1821 java_sdk_library_import {
1822 name: "sdklib.v1", //prebuilt
1823 source_module_name: "sdklib",
1824 public: {
1825 jars: ["a.jar"],
1826 stub_srcs: ["a.java"],
1827 current_api: "current.txt",
1828 removed_api: "removed.txt",
1829 annotations: "annotations.zip",
1830 },
1831 }
1832 java_sdk_library_import {
1833 name: "sdklib.v2", //prebuilt
1834 source_module_name: "sdklib",
1835 public: {
1836 jars: ["a.jar"],
1837 stub_srcs: ["a.java"],
1838 current_api: "current.txt",
1839 removed_api: "removed.txt",
1840 annotations: "annotations.zip",
1841 },
1842 }
1843 // rdeps
1844 java_library {
1845 name: "mymodule",
1846 srcs: ["a.java"],
1847 libs: ["sdklib.stubs",],
1848 }
1849 `
1850 testCases := []struct {
1851 desc string
1852 selectedDependencyName string
1853 expectedStubPath string
1854 }{
1855 {
1856 desc: "Source library is selected using apex_contributions",
1857 selectedDependencyName: "sdklib",
1858 expectedStubPath: "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar",
1859 },
1860 {
1861 desc: "Prebuilt library v1 is selected using apex_contributions",
1862 selectedDependencyName: "prebuilt_sdklib.v1",
1863 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v1.stubs/android_common/combined/sdklib.stubs.jar",
1864 },
1865 {
1866 desc: "Prebuilt library v2 is selected using apex_contributions",
1867 selectedDependencyName: "prebuilt_sdklib.v2",
1868 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v2.stubs/android_common/combined/sdklib.stubs.jar",
1869 },
1870 }
1871
1872 fixture := android.GroupFixturePreparers(
1873 prepareForJavaTest,
1874 PrepareForTestWithJavaSdkLibraryFiles,
1875 FixtureWithLastReleaseApis("sdklib", "sdklib.v1", "sdklib.v2"),
1876 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1877 variables.BuildFlags = map[string]string{
1878 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "my_mainline_module_contributions",
1879 }
1880 }),
1881 )
1882
1883 for _, tc := range testCases {
1884 result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
1885
1886 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1887 public := result.ModuleForTests("mymodule", "android_common")
1888 rule := public.Output("javac/mymodule.jar")
1889 inputs := rule.Implicits.Strings()
1890 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, tc.expectedStubPath)
1891 }
1892}