blob: 6d27e54d0cbf5c059927e38d112a555cdd60c248 [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"
Colin Cross1d2b6b32021-06-01 13:18:08 -070025)
26
27func TestJavaSdkLibrary(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080028 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -070029 result := android.GroupFixturePreparers(
30 prepareForJavaTest,
31 PrepareForTestWithJavaSdkLibraryFiles,
32 FixtureWithPrebuiltApis(map[string][]string{
33 "28": {"foo"},
34 "29": {"foo"},
35 "30": {"bar", "barney", "baz", "betty", "foo", "fred", "quuz", "wilma"},
36 }),
Colin Crossa66b4632024-08-08 15:50:47 -070037 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -070038 ).RunTestWithBp(t, `
39 droiddoc_exported_dir {
40 name: "droiddoc-templates-sdk",
41 path: ".",
42 }
43 java_sdk_library {
44 name: "foo",
45 srcs: ["a.java", "b.java"],
46 api_packages: ["foo"],
47 }
48 java_sdk_library {
49 name: "bar",
50 srcs: ["a.java", "b.java"],
51 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080052 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070053 }
54 java_library {
55 name: "baz",
56 srcs: ["c.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +000057 libs: ["foo.stubs.system", "bar.stubs"],
Colin Cross1d2b6b32021-06-01 13:18:08 -070058 sdk_version: "system_current",
59 }
60 java_sdk_library {
61 name: "barney",
62 srcs: ["c.java"],
63 api_only: true,
64 }
65 java_sdk_library {
66 name: "betty",
67 srcs: ["c.java"],
68 shared_library: false,
69 }
70 java_sdk_library_import {
71 name: "quuz",
72 public: {
73 jars: ["c.jar"],
Jihoon Kang71c86832023-09-13 01:01:53 +000074 current_api: "api/current.txt",
75 removed_api: "api/removed.txt",
Colin Cross1d2b6b32021-06-01 13:18:08 -070076 },
77 }
78 java_sdk_library_import {
79 name: "fred",
80 public: {
81 jars: ["b.jar"],
82 },
83 }
84 java_sdk_library_import {
85 name: "wilma",
86 public: {
87 jars: ["b.jar"],
88 },
89 shared_library: false,
90 }
91 java_library {
92 name: "qux",
93 srcs: ["c.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +000094 libs: ["baz", "fred.stubs", "quuz.stubs", "wilma.stubs", "barney.stubs.system", "betty.stubs.system"],
Colin Cross1d2b6b32021-06-01 13:18:08 -070095 sdk_version: "system_current",
96 }
97 java_library {
98 name: "baz-test",
99 srcs: ["c.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000100 libs: ["foo.stubs.test"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700101 sdk_version: "test_current",
102 }
103 java_library {
104 name: "baz-29",
105 srcs: ["c.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000106 libs: ["sdk_system_29_foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700107 sdk_version: "system_29",
108 }
109 java_library {
110 name: "baz-module-30",
111 srcs: ["c.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000112 libs: ["sdk_module-lib_30_foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700113 sdk_version: "module_30",
114 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000115 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700116
117 // check the existence of the internal modules
Colin Cross90607e92025-02-11 14:58:07 -0800118 foo := result.ModuleForTests(t, "foo", "android_common")
119 result.ModuleForTests(t, apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
120 result.ModuleForTests(t, apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
121 result.ModuleForTests(t, apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
122 result.ModuleForTests(t, apiScopePublic.stubsSourceModuleName("foo"), "android_common")
123 result.ModuleForTests(t, apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
124 result.ModuleForTests(t, apiScopeTest.stubsSourceModuleName("foo"), "android_common")
125 result.ModuleForTests(t, apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
126 result.ModuleForTests(t, apiScopePublic.apiLibraryModuleName("foo"), "android_common")
127 result.ModuleForTests(t, "foo"+sdkXmlFileSuffix, "android_common")
128 result.ModuleForTests(t, "foo.api.public.28", "")
129 result.ModuleForTests(t, "foo.api.system.28", "")
130 result.ModuleForTests(t, "foo.api.test.28", "")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700131
Yu Liu663e4502024-08-12 18:23:59 +0000132 exportedComponentsInfo, _ := android.OtherModuleProvider(result, foo.Module(), android.ExportedComponentsInfoProvider)
Paul Duffinb97b1572021-04-29 21:50:40 +0100133 expectedFooExportedComponents := []string{
Jihoon Kang748a24d2024-03-20 21:29:39 +0000134 "foo-removed.api.combined.public.latest",
135 "foo-removed.api.combined.system.latest",
136 "foo.api.combined.public.latest",
137 "foo.api.combined.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100138 "foo.stubs",
Jihoon Kangbd093452023-12-26 19:08:01 +0000139 "foo.stubs.exportable",
140 "foo.stubs.exportable.system",
141 "foo.stubs.exportable.test",
Paul Duffinb97b1572021-04-29 21:50:40 +0100142 "foo.stubs.source",
143 "foo.stubs.source.system",
144 "foo.stubs.source.test",
145 "foo.stubs.system",
146 "foo.stubs.test",
147 }
148 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
149
Colin Cross90607e92025-02-11 14:58:07 -0800150 bazJavac := result.ModuleForTests(t, "baz", "android_common").Rule("javac")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700151 // tests if baz is actually linked to the stubs lib
Colin Cross8ff4af32025-02-19 15:17:02 -0800152 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.from-text.jar")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700153 // ... and not to the impl lib
154 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
155 // test if baz is not linked to the system variant of foo
156 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
157
Colin Cross90607e92025-02-11 14:58:07 -0800158 bazTestJavac := result.ModuleForTests(t, "baz-test", "android_common").Rule("javac")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700159 // tests if baz-test is actually linked to the test stubs lib
Colin Cross8ff4af32025-02-19 15:17:02 -0800160 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.from-text.jar")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700161
Colin Cross90607e92025-02-11 14:58:07 -0800162 baz29Javac := result.ModuleForTests(t, "baz-29", "android_common").Rule("javac")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700163 // tests if baz-29 is actually linked to the system 29 stubs lib
Colin Cross8ff4af32025-02-19 15:17:02 -0800164 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/sdk_system_29_foo/android_common/local-combined/sdk_system_29_foo.jar")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700165
Colin Cross90607e92025-02-11 14:58:07 -0800166 bazModule30Javac := result.ModuleForTests(t, "baz-module-30", "android_common").Rule("javac")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700167 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
Colin Cross8ff4af32025-02-19 15:17:02 -0800168 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/sdk_module-lib_30_foo/android_common/local-combined/sdk_module-lib_30_foo.jar")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700169
170 // test if baz has exported SDK lib names foo and bar to qux
Colin Cross90607e92025-02-11 14:58:07 -0800171 qux := result.ModuleForTests(t, "qux", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700172 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100173 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100174 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100175 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700176 }
Wei Li1e73c652021-12-06 13:35:11 -0800177
Jihoon Kang71c86832023-09-13 01:01:53 +0000178 // test if quuz have created the api_contribution module
Colin Cross90607e92025-02-11 14:58:07 -0800179 result.ModuleForTests(t, apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "")
Jihoon Kang71c86832023-09-13 01:01:53 +0000180
Colin Cross90607e92025-02-11 14:58:07 -0800181 fooImplDexJar := result.ModuleForTests(t, "foo.impl", "android_common").Rule("d8")
Jihoon Kanga3a05462024-04-05 00:36:44 +0000182 // tests if kotlinc generated files are NOT excluded from output of foo.impl.
183 android.AssertStringDoesNotContain(t, "foo.impl dex", fooImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Wei Li1e73c652021-12-06 13:35:11 -0800184
Colin Cross90607e92025-02-11 14:58:07 -0800185 barImplDexJar := result.ModuleForTests(t, "bar.impl", "android_common").Rule("d8")
Jihoon Kanga3a05462024-04-05 00:36:44 +0000186 // tests if kotlinc generated files are excluded from output of bar.impl.
187 android.AssertStringDoesContain(t, "bar.impl dex", barImplDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700188}
189
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000190func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800191 t.Parallel()
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000192 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
Colin Cross90607e92025-02-11 14:58:07 -0800223 fooUpdatable := result.ModuleForTests(t, "fooUpdatable.xml", "android_common").Output("fooUpdatable.xml")
Paul Duffin1816cde2024-04-10 10:58:21 +0100224 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
Colin Cross90607e92025-02-11 14:58:07 -0800232 fooPermissions := result.ModuleForTests(t, "foo.xml", "android_common").Output("foo.xml")
Paul Duffin1816cde2024-04-10 10:58:21 +0100233 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) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800241 t.Parallel()
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000242 android.GroupFixturePreparers(
243 prepareForJavaTest,
244 PrepareForTestWithJavaSdkLibraryFiles,
245 FixtureWithPrebuiltApis(map[string][]string{
246 "30": {"fooUpdatable", "fooUpdatableErr"},
247 }),
248 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
249 []string{
250 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
251 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
252 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000253 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000254 })).RunTestWithBp(t,
255 `
256 java_sdk_library {
257 name: "fooUpdatableErr",
258 srcs: ["a.java", "b.java"],
259 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000260 on_bootclasspath_since: "aaa",
261 on_bootclasspath_before: "bbc",
262 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000263 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000264 }
265`)
266}
267
Pedro Loureiroc3621422021-09-28 15:40:23 +0000268func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800269 t.Parallel()
Pedro Loureiroc3621422021-09-28 15:40:23 +0000270 android.GroupFixturePreparers(
271 prepareForJavaTest,
272 PrepareForTestWithJavaSdkLibraryFiles,
273 FixtureWithPrebuiltApis(map[string][]string{
274 "28": {"foo"},
275 }),
276 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
277 []string{
278 "on_bootclasspath_since: Attribute value needs to be at least T",
279 "on_bootclasspath_before: Attribute value needs to be at least T",
280 "min_device_sdk: Attribute value needs to be at least T",
281 "max_device_sdk: Attribute value needs to be at least T",
282 },
283 )).RunTestWithBp(t,
284 `
285 java_sdk_library {
286 name: "foo",
287 srcs: ["a.java", "b.java"],
288 api_packages: ["foo"],
289 on_bootclasspath_since: "S",
290 on_bootclasspath_before: "S",
291 min_device_sdk: "S",
292 max_device_sdk: "S",
293 min_sdk_version: "S",
294 }
295`)
296}
297
298func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800299 t.Parallel()
Pedro Loureiroc3621422021-09-28 15:40:23 +0000300 android.GroupFixturePreparers(
301 prepareForJavaTest,
302 PrepareForTestWithJavaSdkLibraryFiles,
303 FixtureWithPrebuiltApis(map[string][]string{
304 "28": {"foo"},
305 }),
306 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
307 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
308 }),
309 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
310 []string{
311 "min_device_sdk can't be greater than max_device_sdk",
312 },
313 )).RunTestWithBp(t,
314 `
315 java_sdk_library {
316 name: "foo",
317 srcs: ["a.java", "b.java"],
318 api_packages: ["foo"],
319 min_device_sdk: "V",
320 max_device_sdk: "U",
321 min_sdk_version: "S",
322 }
323`)
324}
325
326func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800327 t.Parallel()
Pedro Loureiroc3621422021-09-28 15:40:23 +0000328 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) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800356 t.Parallel()
Pedro Loureiroc3621422021-09-28 15:40:23 +0000357 result := android.GroupFixturePreparers(
358 prepareForJavaTest,
359 PrepareForTestWithJavaSdkLibraryFiles,
360 FixtureWithPrebuiltApis(map[string][]string{
361 "30": {"foo"},
362 }),
363 ).RunTestWithBp(t,
364 `
365 java_sdk_library {
366 name: "foo",
367 srcs: ["a.java", "b.java"],
368 min_device_sdk: "Tiramisu",
369 min_sdk_version: "S",
370 }
371`)
372 // test that updatability attributes are passed on correctly
Colin Cross90607e92025-02-11 14:58:07 -0800373 fooUpdatable := result.ModuleForTests(t, "foo.xml", "android_common").Output("foo.xml")
Paul Duffin1816cde2024-04-10 10:58:21 +0100374 fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
375 android.AssertStringDoesContain(t, "foo.xml contents", fooUpdatableContents, `<apex-library`)
376 android.AssertStringDoesNotContain(t, "foo.xml contents", fooUpdatableContents, `<library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000377}
378
Colin Cross1d2b6b32021-06-01 13:18:08 -0700379func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800380 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700381 result := android.GroupFixturePreparers(
382 prepareForJavaTest,
383 PrepareForTestWithJavaSdkLibraryFiles,
384 FixtureWithLastReleaseApis("sdklib"),
385 ).RunTestWithBp(t, `
386 java_sdk_library {
387 name: "sdklib",
388 srcs: ["a.java"],
389 libs: ["lib"],
390 static_libs: ["static-lib"],
391 impl_only_libs: ["impl-only-lib"],
392 stub_only_libs: ["stub-only-lib"],
393 stub_only_static_libs: ["stub-only-static-lib"],
394 }
395 java_defaults {
396 name: "defaults",
397 srcs: ["a.java"],
398 sdk_version: "current",
399 }
400 java_library { name: "lib", defaults: ["defaults"] }
401 java_library { name: "static-lib", defaults: ["defaults"] }
402 java_library { name: "impl-only-lib", defaults: ["defaults"] }
403 java_library { name: "stub-only-lib", defaults: ["defaults"] }
404 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
405 `)
406 var expectations = []struct {
407 lib string
408 on_impl_classpath bool
409 on_stub_classpath bool
410 in_impl_combined bool
411 in_stub_combined bool
412 }{
413 {lib: "lib", on_impl_classpath: true},
414 {lib: "static-lib", in_impl_combined: true},
415 {lib: "impl-only-lib", on_impl_classpath: true},
416 {lib: "stub-only-lib", on_stub_classpath: true},
417 {lib: "stub-only-static-lib", in_stub_combined: true},
418 }
419 verify := func(sdklib, dep string, cp, combined bool) {
Colin Cross90607e92025-02-11 14:58:07 -0800420 sdklibCp := result.ModuleForTests(t, sdklib, "android_common").Rule("javac").Args["classpath"]
Colin Cross1d2b6b32021-06-01 13:18:08 -0700421 expected := cp || combined // Every combined jar is also on the classpath.
422 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
423
Colin Cross90607e92025-02-11 14:58:07 -0800424 combineJarInputs := result.ModuleForTests(t, sdklib, "android_common").Rule("combineJar").Inputs.Strings()
Colin Cross8ff4af32025-02-19 15:17:02 -0800425 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine", dep+".jar")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700426 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
427 }
428 for _, expectation := range expectations {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700429 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
430
Jihoon Kang2261a822024-09-12 00:01:54 +0000431 stubName := apiScopePublic.sourceStubsLibraryModuleName("sdklib")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700432 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
433 }
434}
435
436func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800437 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700438 result := android.GroupFixturePreparers(
439 prepareForJavaTest,
440 PrepareForTestWithJavaSdkLibraryFiles,
441 FixtureWithLastReleaseApis("foo"),
442 ).RunTestWithBp(t, `
443 java_sdk_library {
444 name: "foo",
445 srcs: ["a.java"],
446 api_only: true,
447 public: {
448 enabled: true,
449 },
450 }
451
452 java_library {
453 name: "bar",
454 srcs: ["b.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000455 libs: ["foo.stubs"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700456 }
457 `)
458
459 // The bar library should depend on the stubs jar.
Colin Cross90607e92025-02-11 14:58:07 -0800460 barLibrary := result.ModuleForTests(t, "bar", "android_common").Rule("javac")
Colin Cross8ff4af32025-02-19 15:17:02 -0800461 if expected, actual := `^-classpath .*:out/soong/[^:]*/foo\.stubs\.from-text/foo\.stubs\.from-text\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700462 t.Errorf("expected %q, found %#q", expected, actual)
463 }
464}
465
Anton Hanssond78eb762021-09-21 15:25:12 +0100466func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800467 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700468 android.GroupFixturePreparers(
469 prepareForJavaTest,
470 PrepareForTestWithJavaSdkLibraryFiles,
471 FixtureWithLastReleaseApis("foo"),
472 ).RunTestWithBp(t, `
473 java_sdk_library {
474 name: "foo",
475 srcs: ["a.java"],
476 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100477 annotations_enabled: true,
478 public: {
479 enabled: true,
480 },
481 }
482 java_library {
483 name: "bar",
484 srcs: ["b.java", ":foo{.public.stubs.source}"],
485 java_resources: [":foo{.public.annotations.zip}"],
486 }
487 `)
488}
489
490func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800491 t.Parallel()
Anton Hanssond78eb762021-09-21 15:25:12 +0100492 android.GroupFixturePreparers(
493 prepareForJavaTest,
494 PrepareForTestWithJavaSdkLibraryFiles,
495 FixtureWithLastReleaseApis("foo"),
496 ).
Cole Fausta8437c52025-02-25 14:45:43 -0800497 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported output tag ".public.annotations.zip"`)).
Anton Hanssond78eb762021-09-21 15:25:12 +0100498 RunTestWithBp(t, `
499 java_sdk_library {
500 name: "foo",
501 srcs: ["a.java"],
502 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700503 public: {
504 enabled: true,
505 },
506 }
507
508 java_library {
509 name: "bar",
510 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100511 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700512 }
513 `)
514}
515
516func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800517 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700518 android.GroupFixturePreparers(
519 prepareForJavaTest,
520 PrepareForTestWithJavaSdkLibraryFiles,
521 FixtureWithLastReleaseApis("foo"),
522 ).
Cole Fausta8437c52025-02-25 14:45:43 -0800523 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported output tag ".system.stubs.source"`)).
Colin Cross1d2b6b32021-06-01 13:18:08 -0700524 RunTestWithBp(t, `
525 java_sdk_library {
526 name: "foo",
527 srcs: ["a.java"],
528 api_packages: ["foo"],
529 public: {
530 enabled: true,
531 },
532 }
533
534 java_library {
535 name: "bar",
536 srcs: ["b.java", ":foo{.system.stubs.source}"],
537 }
538 `)
539}
540
541func TestJavaSdkLibrary_Deps(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800542 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700543 result := android.GroupFixturePreparers(
544 prepareForJavaTest,
545 PrepareForTestWithJavaSdkLibraryFiles,
546 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -0700547 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700548 ).RunTestWithBp(t, `
549 java_sdk_library {
550 name: "sdklib",
551 srcs: ["a.java"],
552 sdk_version: "none",
553 system_modules: "none",
554 public: {
555 enabled: true,
556 },
557 }
558 `)
559
560 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
561 `dex2oatd`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000562 `sdklib-removed.api.combined.public.latest`,
563 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700564 `sdklib.impl`,
565 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000566 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700567 `sdklib.stubs.source`,
568 `sdklib.xml`,
569 })
570}
571
572func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800573 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700574 prepareForJavaTest.RunTestWithBp(t, `
575 java_sdk_library_import {
576 name: "foo",
577 public: {
578 jars: ["a.jar"],
579 stub_srcs: ["a.java"],
580 current_api: "api/current.txt",
581 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100582 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700583 },
584 }
585
586 java_library {
587 name: "bar",
588 srcs: [":foo{.public.stubs.source}"],
589 java_resources: [
590 ":foo{.public.api.txt}",
591 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100592 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700593 ],
594 }
595 `)
596}
597
598func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800599 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700600 bp := `
601 java_sdk_library_import {
602 name: "foo",
603 public: {
604 jars: ["a.jar"],
605 },
606 }
607 `
608
609 t.Run("stubs.source", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800610 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700611 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700612 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 -0700613 RunTestWithBp(t, bp+`
614 java_library {
615 name: "bar",
616 srcs: [":foo{.public.stubs.source}"],
617 java_resources: [
618 ":foo{.public.api.txt}",
619 ":foo{.public.removed-api.txt}",
620 ],
621 }
622 `)
623 })
624
625 t.Run("api.txt", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800626 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700627 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700628 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 -0700629 RunTestWithBp(t, bp+`
630 java_library {
631 name: "bar",
632 srcs: ["a.java"],
633 java_resources: [
634 ":foo{.public.api.txt}",
635 ],
636 }
637 `)
638 })
639
640 t.Run("removed-api.txt", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800641 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700642 prepareForJavaTest.
mrziwang68b25942024-07-11 09:58:30 -0700643 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 -0700644 RunTestWithBp(t, bp+`
645 java_library {
646 name: "bar",
647 srcs: ["a.java"],
648 java_resources: [
649 ":foo{.public.removed-api.txt}",
650 ],
651 }
652 `)
653 })
654}
655
656func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800657 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700658 prepareForJavaTest.
659 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
660 RunTestWithBp(t, `
661 java_sdk_library {
662 name: "foo",
663 srcs: ["a.java", "b.java"],
664 api_packages: ["foo"],
665 // Explicitly disable public to test the check that ensures the set of enabled
666 // scopes is consistent.
667 public: {
668 enabled: false,
669 },
670 system: {
671 enabled: true,
672 },
673 }
674 `)
675}
676
677func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800678 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700679 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 sdk_version: "module_current",
691 },
692 }
693 `)
694}
695
696func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800697 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700698 android.GroupFixturePreparers(
699 prepareForJavaTest,
700 PrepareForTestWithJavaSdkLibraryFiles,
701 FixtureWithLastReleaseApis("foo"),
702 ).RunTestWithBp(t, `
703 java_sdk_library {
704 name: "foo",
705 srcs: ["a.java", "b.java"],
706 api_packages: ["foo"],
707 system: {
708 enabled: true,
709 },
710 module_lib: {
711 enabled: true,
712 },
713 }
714 `)
715}
716
717func TestJavaSdkLibrary_SystemServer(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800718 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700719 android.GroupFixturePreparers(
720 prepareForJavaTest,
721 PrepareForTestWithJavaSdkLibraryFiles,
722 FixtureWithLastReleaseApis("foo"),
723 ).RunTestWithBp(t, `
724 java_sdk_library {
725 name: "foo",
726 srcs: ["a.java", "b.java"],
727 api_packages: ["foo"],
728 system: {
729 enabled: true,
730 },
731 system_server: {
732 enabled: true,
733 },
734 }
735 `)
736}
737
Paul Duffind0b9fca2022-09-30 18:11:41 +0100738func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800739 t.Parallel()
Paul Duffind0b9fca2022-09-30 18:11:41 +0100740 result := android.GroupFixturePreparers(
741 prepareForJavaTest,
742 PrepareForTestWithJavaSdkLibraryFiles,
743 FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
744 ).RunTestWithBp(t, `
745 java_sdk_library {
746 name: "foo-public",
747 srcs: ["a.java"],
748 api_packages: ["foo"],
749 public: {
750 enabled: true,
751 },
752 }
753
754 java_sdk_library {
755 name: "foo-system",
756 srcs: ["a.java"],
757 api_packages: ["foo"],
758 system: {
759 enabled: true,
760 },
761 }
762
763 java_sdk_library {
764 name: "foo-module-lib",
765 srcs: ["a.java"],
766 api_packages: ["foo"],
767 system: {
768 enabled: true,
769 },
770 module_lib: {
771 enabled: true,
772 },
773 }
774
775 java_sdk_library {
776 name: "foo-system-server",
777 srcs: ["a.java"],
778 api_packages: ["foo"],
779 system_server: {
780 enabled: true,
781 },
782 }
783
784 java_library {
785 name: "bar",
786 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000787 libs: ["foo-public.stubs", "foo-system.stubs.system", "foo-module-lib.stubs.module_lib", "foo-system-server.stubs.system_server"],
Paul Duffind0b9fca2022-09-30 18:11:41 +0100788 sdk_version: "system_server_current",
789 }
790 `)
791
792 stubsPath := func(name string, scope *apiScope) string {
793 name = scope.stubsLibraryModuleName(name)
Colin Cross8ff4af32025-02-19 15:17:02 -0800794 return fmt.Sprintf("out/soong/.intermediates/%[1]s.from-text/android_common/%[1]s.from-text/%[1]s.from-text.jar", name)
Paul Duffind0b9fca2022-09-30 18:11:41 +0100795 }
796
797 // The bar library should depend on the highest (where system server is highest and public is
798 // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
799 // foo-<x> module is <x>.
Colin Cross90607e92025-02-11 14:58:07 -0800800 barLibrary := result.ModuleForTests(t, "bar", "android_common").Rule("javac")
Paul Duffind0b9fca2022-09-30 18:11:41 +0100801 stubLibraries := []string{
802 stubsPath("foo-public", apiScopePublic),
803 stubsPath("foo-system", apiScopeSystem),
804 stubsPath("foo-module-lib", apiScopeModuleLib),
805 stubsPath("foo-system-server", apiScopeSystemServer),
806 }
807 expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
808 if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
809 t.Errorf("expected pattern %q to match %#q", expected, actual)
810 }
811}
812
Colin Cross1d2b6b32021-06-01 13:18:08 -0700813func TestJavaSdkLibraryImport(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800814 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700815 result := prepareForJavaTest.RunTestWithBp(t, `
816 java_library {
817 name: "foo",
818 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000819 libs: ["sdklib.stubs"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700820 sdk_version: "current",
821 }
822
823 java_library {
824 name: "foo.system",
825 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000826 libs: ["sdklib.stubs.system"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700827 sdk_version: "system_current",
828 }
829
830 java_library {
831 name: "foo.test",
832 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000833 libs: ["sdklib.stubs.test"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700834 sdk_version: "test_current",
835 }
836
837 java_sdk_library_import {
838 name: "sdklib",
839 public: {
840 jars: ["a.jar"],
841 },
842 system: {
843 jars: ["b.jar"],
844 },
845 test: {
846 jars: ["c.jar"],
847 stub_srcs: ["c.java"],
848 },
849 }
850 `)
851
852 for _, scope := range []string{"", ".system", ".test"} {
Colin Cross90607e92025-02-11 14:58:07 -0800853 fooModule := result.ModuleForTests(t, "foo"+scope, "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700854 javac := fooModule.Rule("javac")
855
Colin Cross8ff4af32025-02-19 15:17:02 -0800856 sdklibStubsJar := result.ModuleForTests(t, "sdklib.stubs"+scope, "android_common").Output("local-combined/sdklib.stubs" + scope + ".jar").Output
Colin Cross1d2b6b32021-06-01 13:18:08 -0700857 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
858 }
859
860 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Spandan Das85bd4622024-08-01 00:51:20 +0000861 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +0000862 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700863 `prebuilt_sdklib.stubs`,
864 `prebuilt_sdklib.stubs.source.test`,
865 `prebuilt_sdklib.stubs.system`,
866 `prebuilt_sdklib.stubs.test`,
867 })
868}
869
870func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800871 t.Parallel()
Colin Cross1d2b6b32021-06-01 13:18:08 -0700872 result := android.GroupFixturePreparers(
873 prepareForJavaTest,
874 PrepareForTestWithJavaSdkLibraryFiles,
875 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -0700876 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700877 ).RunTestWithBp(t, `
878 java_sdk_library {
879 name: "sdklib",
880 srcs: ["a.java"],
881 sdk_version: "none",
882 system_modules: "none",
883 public: {
884 enabled: true,
885 },
886 }
887
888 java_sdk_library_import {
889 name: "sdklib",
890 public: {
891 jars: ["a.jar"],
892 },
893 }
894 `)
895
896 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
897 `dex2oatd`,
898 `prebuilt_sdklib`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000899 `sdklib-removed.api.combined.public.latest`,
900 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700901 `sdklib.impl`,
902 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000903 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700904 `sdklib.stubs.source`,
905 `sdklib.xml`,
906 })
907
908 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +0000909 `all_apex_contributions`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700910 `prebuilt_sdklib.stubs`,
911 `sdklib.impl`,
912 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
913 // dependency is added after prebuilts may have been renamed and so has to use
914 // the renamed name.
915 `sdklib.xml`,
916 })
917}
918
Paul Duffinbf4de042022-09-27 12:41:52 +0100919func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700920 result := android.GroupFixturePreparers(
921 prepareForJavaTest,
922 PrepareForTestWithJavaSdkLibraryFiles,
923 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100924 preparer,
Colin Crossa66b4632024-08-08 15:50:47 -0700925 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross1d2b6b32021-06-01 13:18:08 -0700926 ).RunTestWithBp(t, `
927 java_sdk_library {
928 name: "sdklib",
929 srcs: ["a.java"],
930 sdk_version: "none",
931 system_modules: "none",
932 public: {
933 enabled: true,
934 },
935 }
936
937 java_sdk_library_import {
938 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +0100939 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -0700940 public: {
941 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100942 stub_srcs: ["a.java"],
943 current_api: "current.txt",
944 removed_api: "removed.txt",
945 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700946 },
947 }
Paul Duffinbf4de042022-09-27 12:41:52 +0100948
949 java_library {
950 name: "combined",
951 static_libs: [
952 "sdklib.stubs",
953 ],
954 java_resources: [
955 ":sdklib.stubs.source",
956 ":sdklib{.public.api.txt}",
957 ":sdklib{.public.removed-api.txt}",
958 ":sdklib{.public.annotations.zip}",
959 ],
960 sdk_version: "none",
961 system_modules: "none",
962 }
963
964 java_library {
965 name: "public",
966 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +0000967 libs: ["sdklib.stubs"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100968 sdk_version: "current",
969 }
Colin Cross1d2b6b32021-06-01 13:18:08 -0700970 `)
971
972 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -0700973 `prebuilt_sdklib`,
Jihoon Kang748a24d2024-03-20 21:29:39 +0000974 `sdklib-removed.api.combined.public.latest`,
975 `sdklib.api.combined.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700976 `sdklib.impl`,
977 `sdklib.stubs`,
Jihoon Kangbd093452023-12-26 19:08:01 +0000978 `sdklib.stubs.exportable`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700979 `sdklib.stubs.source`,
980 `sdklib.xml`,
981 })
982
983 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Spandan Dasda739a32023-12-13 00:06:32 +0000984 `all_apex_contributions`,
Jiakai Zhang204356f2021-09-09 08:12:46 +0000985 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700986 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +0100987 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700988 `sdklib.impl`,
989 `sdklib.xml`,
990 })
Paul Duffinbf4de042022-09-27 12:41:52 +0100991
992 // Make sure that dependencies on child modules use the prebuilt when preferred.
993 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
994 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
995 `prebuilt_sdklib`,
Paul Duffinbf4de042022-09-27 12:41:52 +0100996 `prebuilt_sdklib.stubs`,
997 `prebuilt_sdklib.stubs.source`,
998 })
999
1000 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1001 // prebuilt library.
Colin Cross90607e92025-02-11 14:58:07 -08001002 public := result.ModuleForTests(t, "public", "android_common")
Paul Duffinbf4de042022-09-27 12:41:52 +01001003 rule := public.Output("javac/public.jar")
1004 inputs := rule.Implicits.Strings()
Colin Cross8ff4af32025-02-19 15:17:02 -08001005 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/local-combined/sdklib.stubs.jar"
Paul Duffinbf4de042022-09-27 12:41:52 +01001006 if !android.InList(expected, inputs) {
1007 t.Errorf("expected %q to contain %q", inputs, expected)
1008 }
1009}
1010
1011func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001012 t.Parallel()
Paul Duffinbf4de042022-09-27 12:41:52 +01001013 t.Run("prefer", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001014 t.Parallel()
Paul Duffinbf4de042022-09-27 12:41:52 +01001015 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1016 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001017}
1018
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001019// If a module is listed in `mainline_module_contributions, it should be used
1020// It will supersede any other source vs prebuilt selection mechanism like `prefer` attribute
1021func TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001022 t.Parallel()
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001023 bp := `
1024 apex_contributions {
1025 name: "my_mainline_module_contributions",
1026 api_domain: "my_mainline_module",
1027 contents: [
1028 // legacy mechanism prefers the prebuilt
1029 // mainline_module_contributions supersedes this since source is listed explicitly
1030 "sdklib.prebuilt_preferred_using_legacy_flags",
1031
1032 // legacy mechanism prefers the source
1033 // mainline_module_contributions supersedes this since prebuilt is listed explicitly
1034 "prebuilt_sdklib.source_preferred_using_legacy_flags",
1035 ],
1036 }
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001037 java_sdk_library {
1038 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1039 srcs: ["a.java"],
1040 sdk_version: "none",
1041 system_modules: "none",
1042 public: {
1043 enabled: true,
1044 },
1045 system: {
1046 enabled: true,
1047 }
1048 }
1049 java_sdk_library_import {
1050 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1051 prefer: true, // prebuilt is preferred using legacy mechanism
1052 public: {
1053 jars: ["a.jar"],
1054 stub_srcs: ["a.java"],
1055 current_api: "current.txt",
1056 removed_api: "removed.txt",
1057 annotations: "annotations.zip",
1058 },
1059 system: {
1060 jars: ["a.jar"],
1061 stub_srcs: ["a.java"],
1062 current_api: "current.txt",
1063 removed_api: "removed.txt",
1064 annotations: "annotations.zip",
1065 },
1066 }
1067 java_sdk_library {
1068 name: "sdklib.source_preferred_using_legacy_flags",
1069 srcs: ["a.java"],
1070 sdk_version: "none",
1071 system_modules: "none",
1072 public: {
1073 enabled: true,
1074 },
1075 system: {
1076 enabled: true,
1077 }
1078 }
1079 java_sdk_library_import {
1080 name: "sdklib.source_preferred_using_legacy_flags",
1081 prefer: false, // source is preferred using legacy mechanism
1082 public: {
1083 jars: ["a.jar"],
1084 stub_srcs: ["a.java"],
1085 current_api: "current.txt",
1086 removed_api: "removed.txt",
1087 annotations: "annotations.zip",
1088 },
1089 system: {
1090 jars: ["a.jar"],
1091 stub_srcs: ["a.java"],
1092 current_api: "current.txt",
1093 removed_api: "removed.txt",
1094 annotations: "annotations.zip",
1095 },
1096 }
1097
1098 // rdeps
1099 java_library {
1100 name: "public",
1101 srcs: ["a.java"],
1102 libs: [
1103 // this should get source since source is listed in my_mainline_module_contributions
1104 "sdklib.prebuilt_preferred_using_legacy_flags.stubs",
1105 "sdklib.prebuilt_preferred_using_legacy_flags.stubs.system",
1106
1107 // this should get prebuilt since source is listed in my_mainline_module_contributions
1108 "sdklib.source_preferred_using_legacy_flags.stubs",
1109 "sdklib.source_preferred_using_legacy_flags.stubs.system",
1110
1111 ],
1112 }
1113 `
1114 result := android.GroupFixturePreparers(
1115 prepareForJavaTest,
1116 PrepareForTestWithJavaSdkLibraryFiles,
1117 FixtureWithLastReleaseApis("sdklib.source_preferred_using_legacy_flags", "sdklib.prebuilt_preferred_using_legacy_flags"),
Colin Crossa66b4632024-08-08 15:50:47 -07001118 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001119 ).RunTestWithBp(t, bp)
1120
1121 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
Colin Cross90607e92025-02-11 14:58:07 -08001122 public := result.ModuleForTests(t, "public", "android_common")
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001123 rule := public.Output("javac/public.jar")
1124 inputs := rule.Implicits.Strings()
1125 expectedInputs := []string{
1126 // source
Colin Cross8ff4af32025-02-19 15:17:02 -08001127 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.from-text/android_common/sdklib.prebuilt_preferred_using_legacy_flags.stubs.from-text/sdklib.prebuilt_preferred_using_legacy_flags.stubs.from-text.jar",
1128 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.from-text/android_common/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.from-text/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.from-text.jar",
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001129
1130 // prebuilt
Colin Cross8ff4af32025-02-19 15:17:02 -08001131 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs/android_common/local-combined/sdklib.source_preferred_using_legacy_flags.stubs.jar",
1132 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs.system/android_common/local-combined/sdklib.source_preferred_using_legacy_flags.stubs.system.jar",
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001133 }
1134 for _, expected := range expectedInputs {
1135 if !android.InList(expected, inputs) {
1136 t.Errorf("expected %q to contain %q", inputs, expected)
1137 }
1138 }
1139}
1140
Colin Cross30c491b2021-06-01 13:39:09 -07001141func TestJavaSdkLibraryDist(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001142 t.Parallel()
Colin Cross30c491b2021-06-01 13:39:09 -07001143 result := android.GroupFixturePreparers(
1144 PrepareForTestWithJavaBuildComponents,
1145 PrepareForTestWithJavaDefaultModules,
1146 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001147 FixtureWithLastReleaseApis(
1148 "sdklib_no_group",
1149 "sdklib_group_foo",
1150 "sdklib_owner_foo",
1151 "foo"),
Colin Crossa66b4632024-08-08 15:50:47 -07001152 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross30c491b2021-06-01 13:39:09 -07001153 ).RunTestWithBp(t, `
1154 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001155 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001156 srcs: ["foo.java"],
1157 }
1158
1159 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001160 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001161 srcs: ["foo.java"],
1162 dist_group: "foo",
1163 }
1164
1165 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001166 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001167 srcs: ["foo.java"],
1168 owner: "foo",
1169 }
1170
1171 java_sdk_library {
1172 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001173 srcs: ["foo.java"],
1174 dist_stem: "foo",
1175 }
Colin Cross30c491b2021-06-01 13:39:09 -07001176 `)
1177
1178 type testCase struct {
1179 module string
1180 distDir string
1181 distStem string
1182 }
1183 testCases := []testCase{
1184 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001185 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001186 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001187 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001188 },
1189 {
Colin Cross986b69a2021-06-01 13:13:40 -07001190 module: "sdklib_group_foo",
1191 distDir: "apistubs/foo/public",
1192 distStem: "sdklib_group_foo.jar",
1193 },
1194 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001195 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001196 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001197 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001198 distStem: "sdklib_owner_foo.jar",
1199 },
1200 {
1201 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001202 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001203 distStem: "foo.jar",
1204 },
Colin Cross30c491b2021-06-01 13:39:09 -07001205 }
1206
1207 for _, tt := range testCases {
1208 t.Run(tt.module, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001209 t.Parallel()
Colin Cross90607e92025-02-11 14:58:07 -08001210 m := result.ModuleForTests(t, apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library)
Colin Cross30c491b2021-06-01 13:39:09 -07001211 dists := m.Dists()
1212 if len(dists) != 1 {
1213 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1214 }
1215 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1216 t.Errorf("expected dist dir %q, got %q", w, g)
1217 }
1218 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1219 t.Errorf("expected dist stem %q, got %q", w, g)
1220 }
1221 })
1222 }
1223}
satayev8f088b02021-12-06 11:40:46 +00001224
1225func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001226 t.Parallel()
satayev8f088b02021-12-06 11:40:46 +00001227 preparer := android.GroupFixturePreparers(
1228 PrepareForTestWithJavaBuildComponents,
1229 PrepareForTestWithJavaDefaultModules,
1230 PrepareForTestWithJavaSdkLibraryFiles,
1231 )
1232
1233 preparer.RunTestWithBp(t, `
1234 java_sdk_library {
1235 name: "sdklib",
Jihoon Kanga3a05462024-04-05 00:36:44 +00001236 srcs: ["a.java"],
1237 static_libs: ["util"],
1238 min_sdk_version: "30",
satayev8f088b02021-12-06 11:40:46 +00001239 unsafe_ignore_missing_latest_api: true,
Jihoon Kanga3a05462024-04-05 00:36:44 +00001240 }
satayev8f088b02021-12-06 11:40:46 +00001241
1242 java_library {
1243 name: "util",
1244 srcs: ["a.java"],
1245 min_sdk_version: "30",
1246 }
1247 `)
1248
1249 preparer.
1250 RunTestWithBp(t, `
1251 java_sdk_library {
1252 name: "sdklib",
1253 srcs: ["a.java"],
1254 libs: ["util"],
1255 impl_only_libs: ["util"],
1256 stub_only_libs: ["util"],
1257 stub_only_static_libs: ["util"],
1258 min_sdk_version: "30",
1259 unsafe_ignore_missing_latest_api: true,
1260 }
1261
1262 java_library {
1263 name: "util",
1264 srcs: ["a.java"],
1265 }
1266 `)
1267
1268 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1269 RunTestWithBp(t, `
1270 java_sdk_library {
1271 name: "sdklib",
1272 srcs: ["a.java"],
1273 static_libs: ["util"],
1274 min_sdk_version: "30",
1275 unsafe_ignore_missing_latest_api: true,
1276 }
1277
1278 java_library {
1279 name: "util",
1280 srcs: ["a.java"],
1281 min_sdk_version: "31",
1282 }
1283 `)
1284
1285 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1286 RunTestWithBp(t, `
1287 java_sdk_library {
1288 name: "sdklib",
1289 srcs: ["a.java"],
1290 static_libs: ["util"],
1291 min_sdk_version: "30",
1292 unsafe_ignore_missing_latest_api: true,
1293 }
1294
1295 java_library {
1296 name: "util",
1297 srcs: ["a.java"],
1298 static_libs: ["another_util"],
1299 min_sdk_version: "30",
1300 }
1301
1302 java_library {
1303 name: "another_util",
1304 srcs: ["a.java"],
1305 min_sdk_version: "31",
1306 }
1307 `)
1308}
Nikita Ioffed732da72022-11-21 12:38:25 +00001309
1310func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001311 t.Parallel()
Nikita Ioffed732da72022-11-21 12:38:25 +00001312 result := android.GroupFixturePreparers(
1313 prepareForJavaTest,
1314 PrepareForTestWithJavaSdkLibraryFiles,
1315 FixtureWithLastReleaseApis("foo"),
1316 ).RunTestWithBp(t, `
1317 java_sdk_library {
1318 name: "foo",
1319 srcs: ["a.java"],
1320 public: {
1321 enabled: true,
1322 },
1323 stub_only_libs: ["bar-lib"],
1324 }
1325
1326 java_library {
1327 name: "bar-lib",
1328 srcs: ["b.java"],
1329 }
1330 `)
1331
1332 // The foo.stubs.source should depend on bar-lib
Colin Cross90607e92025-02-11 14:58:07 -08001333 fooStubsSources := result.ModuleForTests(t, "foo.stubs.source", "android_common").Module().(*Droidstubs)
Cole Faustb7493472024-08-28 11:55:52 -07001334 eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
1335 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs.GetOrDefault(eval, nil), "bar-lib")
Nikita Ioffed732da72022-11-21 12:38:25 +00001336}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001337
Mark White9421c4c2023-08-10 00:07:03 +00001338func TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001339 t.Parallel()
Mark White9421c4c2023-08-10 00:07:03 +00001340 result := android.GroupFixturePreparers(
1341 prepareForJavaTest,
1342 PrepareForTestWithJavaSdkLibraryFiles,
1343 FixtureWithLastReleaseApis("foo"),
1344 ).RunTestWithBp(t, `
1345 java_sdk_library {
1346 name: "foo",
1347 srcs: ["a.java"],
1348 public: {
1349 enabled: true,
1350 libs: ["bar-lib"],
1351 },
1352 }
1353
1354 java_library {
1355 name: "bar-lib",
1356 srcs: ["b.java"],
1357 }
1358 `)
1359
1360 // The foo.stubs.source should depend on bar-lib
Colin Cross90607e92025-02-11 14:58:07 -08001361 fooStubsSources := result.ModuleForTests(t, "foo.stubs.source", "android_common").Module().(*Droidstubs)
Cole Faustb7493472024-08-28 11:55:52 -07001362 eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
1363 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs.GetOrDefault(eval, nil), "bar-lib")
Mark White9421c4c2023-08-10 00:07:03 +00001364}
1365
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001366func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001367 t.Parallel()
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001368 result := android.GroupFixturePreparers(
1369 prepareForJavaTest,
1370 PrepareForTestWithJavaSdkLibraryFiles,
1371 FixtureWithLastReleaseApis("foo"),
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001372 ).RunTestWithBp(t, `
1373 java_sdk_library {
1374 name: "foo",
1375 srcs: ["a.java", "b.java"],
1376 api_packages: ["foo"],
1377 system: {
1378 enabled: true,
1379 },
1380 module_lib: {
1381 enabled: true,
1382 },
1383 test: {
1384 enabled: true,
1385 },
1386 }
1387 `)
1388
1389 testCases := []struct {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001390 scope *apiScope
1391 apiContributions []string
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001392 }{
1393 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001394 scope: apiScopePublic,
1395 apiContributions: []string{"foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001396 },
1397 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001398 scope: apiScopeSystem,
1399 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001400 },
1401 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001402 scope: apiScopeTest,
1403 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 +00001404 },
1405 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001406 scope: apiScopeModuleLib,
1407 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 +00001408 },
1409 }
1410
1411 for _, c := range testCases {
Colin Cross90607e92025-02-11 14:58:07 -08001412 m := result.ModuleForTests(t, c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001413 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001414 }
1415}
Jihoon Kang786df932023-09-07 01:18:31 +00001416
1417func TestStaticDepStubLibrariesVisibility(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001418 t.Parallel()
Jihoon Kang786df932023-09-07 01:18:31 +00001419 android.GroupFixturePreparers(
1420 prepareForJavaTest,
1421 PrepareForTestWithJavaSdkLibraryFiles,
1422 FixtureWithLastReleaseApis("foo"),
1423 android.FixtureMergeMockFs(
1424 map[string][]byte{
1425 "A.java": nil,
1426 "dir/Android.bp": []byte(
1427 `
1428 java_library {
1429 name: "bar",
1430 srcs: ["A.java"],
1431 libs: ["foo.stubs.from-source"],
1432 }
1433 `),
1434 "dir/A.java": nil,
1435 },
1436 ).ExtendWithErrorHandler(
1437 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1438 `module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1439 ).RunTestWithBp(t, `
1440 java_sdk_library {
1441 name: "foo",
1442 srcs: ["A.java"],
1443 }
1444 `)
1445}
Jamie Garsidee570ace2023-11-27 12:07:36 +00001446
1447func TestSdkLibraryDependency(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001448 t.Parallel()
Jamie Garsidee570ace2023-11-27 12:07:36 +00001449 result := android.GroupFixturePreparers(
1450 prepareForJavaTest,
1451 PrepareForTestWithJavaSdkLibraryFiles,
1452 FixtureWithPrebuiltApis(map[string][]string{
1453 "30": {"bar", "foo"},
1454 }),
1455 ).RunTestWithBp(t,
1456 `
1457 java_sdk_library {
1458 name: "foo",
1459 srcs: ["a.java", "b.java"],
1460 api_packages: ["foo"],
1461 }
1462
1463 java_sdk_library {
1464 name: "bar",
1465 srcs: ["c.java", "b.java"],
1466 libs: [
Jihoon Kang28c96572024-09-11 23:44:44 +00001467 "foo.stubs",
Jamie Garsidee570ace2023-11-27 12:07:36 +00001468 ],
1469 uses_libs: [
1470 "foo",
1471 ],
1472 }
1473`)
1474
Colin Cross90607e92025-02-11 14:58:07 -08001475 barPermissions := result.ModuleForTests(t, "bar.xml", "android_common").Output("bar.xml")
Paul Duffin1816cde2024-04-10 10:58:21 +01001476 barContents := android.ContentFromFileRuleForTests(t, result.TestContext, barPermissions)
1477 android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barContents, `dependency="foo"`)
Jamie Garsidee570ace2023-11-27 12:07:36 +00001478}
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001479
1480func TestSdkLibraryExportableStubsLibrary(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001481 t.Parallel()
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001482 result := android.GroupFixturePreparers(
1483 prepareForJavaTest,
1484 PrepareForTestWithJavaSdkLibraryFiles,
1485 FixtureWithLastReleaseApis("foo"),
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001486 ).RunTestWithBp(t, `
1487 aconfig_declarations {
1488 name: "bar",
1489 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +00001490 container: "com.android.foo",
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001491 srcs: [
1492 "bar.aconfig",
1493 ],
1494 }
1495 java_sdk_library {
1496 name: "foo",
1497 srcs: ["a.java", "b.java"],
1498 api_packages: ["foo"],
1499 system: {
1500 enabled: true,
1501 },
1502 module_lib: {
1503 enabled: true,
1504 },
1505 test: {
1506 enabled: true,
1507 },
1508 aconfig_declarations: [
1509 "bar",
1510 ],
1511 }
1512 `)
1513
1514 exportableStubsLibraryModuleName := apiScopePublic.exportableStubsLibraryModuleName("foo")
1515 exportableSourceStubsLibraryModuleName := apiScopePublic.exportableSourceStubsLibraryModuleName("foo")
1516
1517 // Check modules generation
Colin Cross90607e92025-02-11 14:58:07 -08001518 result.ModuleForTests(t, exportableStubsLibraryModuleName, "android_common")
1519 result.ModuleForTests(t, exportableSourceStubsLibraryModuleName, "android_common")
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001520
1521 // Check static lib dependency
1522 android.AssertBoolEquals(t, "exportable top level stubs library module depends on the"+
1523 "exportable source stubs library module", true,
Cole Faustb7493472024-08-28 11:55:52 -07001524 CheckModuleHasDependencyWithTag(t, result.TestContext, exportableStubsLibraryModuleName,
1525 "android_common", staticLibTag, exportableSourceStubsLibraryModuleName),
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001526 )
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001527}
Spandan Das81d95c52024-02-01 23:41:11 +00001528
1529// For java libraries depending on java_sdk_library(_import) via libs, assert that
1530// rdep gets stubs of source if source is listed in apex_contributions and prebuilt has prefer (legacy mechanism)
1531func TestStubResolutionOfJavaSdkLibraryInLibs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001532 t.Parallel()
Spandan Das81d95c52024-02-01 23:41:11 +00001533 bp := `
1534 apex_contributions {
1535 name: "my_mainline_module_contributions",
1536 api_domain: "my_mainline_module",
1537 contents: ["sdklib"], // source is selected using apex_contributions, but prebuilt is selected using prefer
1538 }
1539 java_sdk_library {
1540 name: "sdklib",
1541 srcs: ["a.java"],
1542 sdk_version: "none",
1543 system_modules: "none",
1544 public: {
1545 enabled: true,
1546 },
1547 }
1548 java_sdk_library_import {
1549 name: "sdklib",
1550 public: {
1551 jars: ["a.jar"],
1552 stub_srcs: ["a.java"],
1553 current_api: "current.txt",
1554 removed_api: "removed.txt",
1555 annotations: "annotations.zip",
1556 },
1557 prefer: true, // Set prefer explicitly on the prebuilt. We will assert that rdep gets source in a test case.
1558 }
1559 // rdeps
1560 java_library {
1561 name: "mymodule",
1562 srcs: ["a.java"],
1563 sdk_version: "current",
Jihoon Kang28c96572024-09-11 23:44:44 +00001564 libs: ["sdklib.stubs",], // this should be dynamically resolved to sdklib.stubs (source) or prebuilt_sdklib.stubs (prebuilt)
Spandan Das81d95c52024-02-01 23:41:11 +00001565 }
1566 `
1567
1568 fixture := android.GroupFixturePreparers(
1569 prepareForJavaTest,
1570 PrepareForTestWithJavaSdkLibraryFiles,
1571 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -07001572 // We can use any of the apex contribution build flags from build/soong/android/config.go#mainlineApexContributionBuildFlags here
1573 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Das81d95c52024-02-01 23:41:11 +00001574 )
1575
1576 result := fixture.RunTestWithBp(t, bp)
1577 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
Colin Cross90607e92025-02-11 14:58:07 -08001578 public := result.ModuleForTests(t, "mymodule", "android_common")
Spandan Das81d95c52024-02-01 23:41:11 +00001579 rule := public.Output("javac/mymodule.jar")
1580 inputs := rule.Implicits.Strings()
Colin Cross8ff4af32025-02-19 15:17:02 -08001581 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs,
1582 "out/soong/.intermediates/sdklib.stubs.from-text/android_common/sdklib.stubs.from-text/sdklib.stubs.from-text.jar")
Spandan Das81d95c52024-02-01 23:41:11 +00001583}
Spandan Das23956d12024-01-19 00:22:22 +00001584
1585// test that rdep gets resolved to the correct version of a java_sdk_library (source or a specific prebuilt)
1586func TestMultipleSdkLibraryPrebuilts(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001587 t.Parallel()
Spandan Das23956d12024-01-19 00:22:22 +00001588 bp := `
1589 apex_contributions {
1590 name: "my_mainline_module_contributions",
1591 api_domain: "my_mainline_module",
1592 contents: ["%s"],
1593 }
1594 java_sdk_library {
1595 name: "sdklib",
1596 srcs: ["a.java"],
1597 sdk_version: "none",
1598 system_modules: "none",
1599 public: {
1600 enabled: true,
1601 },
1602 }
1603 java_sdk_library_import {
1604 name: "sdklib.v1", //prebuilt
1605 source_module_name: "sdklib",
1606 public: {
1607 jars: ["a.jar"],
1608 stub_srcs: ["a.java"],
1609 current_api: "current.txt",
1610 removed_api: "removed.txt",
1611 annotations: "annotations.zip",
1612 },
1613 }
1614 java_sdk_library_import {
1615 name: "sdklib.v2", //prebuilt
1616 source_module_name: "sdklib",
1617 public: {
1618 jars: ["a.jar"],
1619 stub_srcs: ["a.java"],
1620 current_api: "current.txt",
1621 removed_api: "removed.txt",
1622 annotations: "annotations.zip",
1623 },
1624 }
1625 // rdeps
1626 java_library {
1627 name: "mymodule",
1628 srcs: ["a.java"],
1629 libs: ["sdklib.stubs",],
1630 }
1631 `
1632 testCases := []struct {
1633 desc string
1634 selectedDependencyName string
1635 expectedStubPath string
1636 }{
1637 {
1638 desc: "Source library is selected using apex_contributions",
1639 selectedDependencyName: "sdklib",
Colin Cross8ff4af32025-02-19 15:17:02 -08001640 expectedStubPath: "out/soong/.intermediates/sdklib.stubs.from-text/android_common/sdklib.stubs.from-text/sdklib.stubs.from-text.jar",
Spandan Das23956d12024-01-19 00:22:22 +00001641 },
1642 {
1643 desc: "Prebuilt library v1 is selected using apex_contributions",
1644 selectedDependencyName: "prebuilt_sdklib.v1",
Colin Cross8ff4af32025-02-19 15:17:02 -08001645 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v1.stubs/android_common/local-combined/sdklib.stubs.jar",
Spandan Das23956d12024-01-19 00:22:22 +00001646 },
1647 {
1648 desc: "Prebuilt library v2 is selected using apex_contributions",
1649 selectedDependencyName: "prebuilt_sdklib.v2",
Colin Cross8ff4af32025-02-19 15:17:02 -08001650 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v2.stubs/android_common/local-combined/sdklib.stubs.jar",
Spandan Das23956d12024-01-19 00:22:22 +00001651 },
1652 }
1653
1654 fixture := android.GroupFixturePreparers(
1655 prepareForJavaTest,
1656 PrepareForTestWithJavaSdkLibraryFiles,
1657 FixtureWithLastReleaseApis("sdklib", "sdklib.v1", "sdklib.v2"),
Colin Crossa66b4632024-08-08 15:50:47 -07001658 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Das23956d12024-01-19 00:22:22 +00001659 )
1660
1661 for _, tc := range testCases {
1662 result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
1663
1664 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
Colin Cross90607e92025-02-11 14:58:07 -08001665 public := result.ModuleForTests(t, "mymodule", "android_common")
Spandan Das23956d12024-01-19 00:22:22 +00001666 rule := public.Output("javac/mymodule.jar")
1667 inputs := rule.Implicits.Strings()
1668 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, tc.expectedStubPath)
1669 }
1670}
Jihoon Kangfa3f0782024-08-21 20:42:18 +00001671
1672func TestStubLinkType(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001673 t.Parallel()
Jihoon Kangfa3f0782024-08-21 20:42:18 +00001674 android.GroupFixturePreparers(
1675 prepareForJavaTest,
1676 PrepareForTestWithJavaSdkLibraryFiles,
1677 FixtureWithLastReleaseApis("foo"),
1678 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1679 `module "baz" variant "android_common": compiles against system API, but dependency `+
1680 `"bar.stubs.system" is compiling against module API. In order to fix this, `+
1681 `consider adjusting sdk_version: OR platform_apis: property of the source or `+
1682 `target module so that target module is built with the same or smaller API set `+
1683 `when compared to the source.`),
1684 ).RunTestWithBp(t, `
1685 java_sdk_library {
1686 name: "foo",
1687 srcs: ["a.java"],
1688 sdk_version: "current",
1689 }
1690 java_library {
1691 name: "bar.stubs.system",
1692 srcs: ["a.java"],
1693 sdk_version: "module_current",
1694 is_stubs_module: false,
1695 }
1696
1697 java_library {
1698 name: "baz",
1699 srcs: ["b.java"],
1700 libs: [
1701 "foo.stubs.system",
1702 "bar.stubs.system",
1703 ],
1704 sdk_version: "system_current",
1705 }
1706 `)
1707}
Jihoon Kang28c96572024-09-11 23:44:44 +00001708
1709func TestSdkLibDirectDependency(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001710 t.Parallel()
Jihoon Kang28c96572024-09-11 23:44:44 +00001711 android.GroupFixturePreparers(
1712 prepareForJavaTest,
1713 PrepareForTestWithJavaSdkLibraryFiles,
1714 FixtureWithLastReleaseApis("foo", "bar"),
1715 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern([]string{
1716 `module "baz" variant "android_common": cannot depend directly on java_sdk_library ` +
1717 `"foo"; try depending on "foo.stubs", or "foo.impl" instead`,
1718 `module "baz" variant "android_common": cannot depend directly on java_sdk_library ` +
1719 `"prebuilt_bar"; try depending on "bar.stubs", or "bar.impl" instead`,
1720 }),
1721 ).RunTestWithBp(t, `
1722 java_sdk_library {
1723 name: "foo",
1724 srcs: ["a.java"],
1725 sdk_version: "current",
1726 public: {
1727 enabled: true,
1728 },
1729 }
1730
1731 java_sdk_library_import {
1732 name: "foo",
1733 public: {
1734 jars: ["a.jar"],
1735 stub_srcs: ["a.java"],
1736 current_api: "current.txt",
1737 removed_api: "removed.txt",
1738 annotations: "annotations.zip",
1739 },
1740 }
1741
1742 java_sdk_library {
1743 name: "bar",
1744 srcs: ["a.java"],
1745 sdk_version: "current",
1746 public: {
1747 enabled: true,
1748 },
1749 }
1750
1751 java_sdk_library_import {
1752 name: "bar",
1753 prefer: true,
1754 public: {
1755 jars: ["a.jar"],
1756 stub_srcs: ["a.java"],
1757 current_api: "current.txt",
1758 removed_api: "removed.txt",
1759 annotations: "annotations.zip",
1760 },
1761 }
1762
1763 java_library {
1764 name: "baz",
1765 srcs: ["b.java"],
1766 libs: [
1767 "foo",
1768 "bar",
1769 ],
1770 }
1771 `)
1772}
1773
1774func TestSdkLibDirectDependencyWithPrebuiltSdk(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001775 t.Parallel()
Jihoon Kang28c96572024-09-11 23:44:44 +00001776 android.GroupFixturePreparers(
1777 prepareForJavaTest,
1778 PrepareForTestWithJavaSdkLibraryFiles,
1779 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1780 variables.Platform_sdk_version = intPtr(34)
1781 variables.Platform_sdk_codename = stringPtr("VanillaIceCream")
1782 variables.Platform_version_active_codenames = []string{"VanillaIceCream"}
1783 variables.Platform_systemsdk_versions = []string{"33", "34", "VanillaIceCream"}
1784 variables.DeviceSystemSdkVersions = []string{"VanillaIceCream"}
1785 }),
1786 FixtureWithPrebuiltApis(map[string][]string{
1787 "33": {"foo"},
1788 "34": {"foo"},
1789 "35": {"foo"},
1790 }),
1791 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1792 `module "baz" variant "android_common": cannot depend directly on java_sdk_library "foo"; `+
1793 `try depending on "sdk_public_33_foo", "sdk_system_33_foo", "sdk_test_33_foo", `+
1794 `"sdk_module-lib_33_foo", or "sdk_system-server_33_foo" instead`),
1795 ).RunTestWithBp(t, `
1796 java_sdk_library {
1797 name: "foo",
1798 srcs: ["a.java"],
1799 sdk_version: "current",
1800 public: {
1801 enabled: true,
1802 },
1803 system: {
1804 enabled: true,
1805 },
1806 }
1807
1808 java_library {
1809 name: "baz",
1810 srcs: ["b.java"],
1811 libs: [
1812 "foo",
1813 ],
1814 sdk_version: "system_33",
1815 }
1816 `)
1817}