blob: 0aed4b81a907a890b3945b65208799d4d8a510e4 [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
Paul Duffinb97b1572021-04-29 21:50:40 +0100118 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700119 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
120 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
121 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
122 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
123 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
124 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jihoon Kangd48abd52023-02-02 22:32:31 +0000125 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
Jihoon Kang1c92c3e2023-03-23 17:44:51 +0000126 result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700127 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
128 result.ModuleForTests("foo.api.public.28", "")
129 result.ModuleForTests("foo.api.system.28", "")
130 result.ModuleForTests("foo.api.test.28", "")
131
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 Cross1d2b6b32021-06-01 13:18:08 -0700150 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
151 // tests if baz is actually linked to the stubs lib
152 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
153 // ... and not to the impl lib
154 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
155 // test if baz is not linked to the system variant of foo
156 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
157
158 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
159 // tests if baz-test is actually linked to the test stubs lib
160 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
161
162 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
163 // tests if baz-29 is actually linked to the system 29 stubs lib
Jihoon Kang28c96572024-09-11 23:44:44 +0000164 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/sdk_system_29_foo/android_common/combined/sdk_system_29_foo.jar")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700165
166 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
167 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
Jihoon Kang28c96572024-09-11 23:44:44 +0000168 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/sdk_module-lib_30_foo/android_common/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
171 qux := result.ModuleForTests("qux", "android_common")
172 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100173 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100174 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100175 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700176 }
Wei Li1e73c652021-12-06 13:35:11 -0800177
Jihoon Kang71c86832023-09-13 01:01:53 +0000178 // test if quuz have created the api_contribution module
179 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("quuz")+".api.contribution", "")
180
Jihoon Kanga3a05462024-04-05 00:36:44 +0000181 fooImplDexJar := result.ModuleForTests("foo.impl", "android_common").Rule("d8")
182 // 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
Jihoon Kanga3a05462024-04-05 00:36:44 +0000185 barImplDexJar := result.ModuleForTests("bar.impl", "android_common").Rule("d8")
186 // 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
Paul Duffin1816cde2024-04-10 10:58:21 +0100223 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Output("fooUpdatable.xml")
224 fooUpdatableContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooUpdatable)
225 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-since="U"`)
226 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `on-bootclasspath-before="V"`)
227 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `min-device-sdk="W"`)
228 android.AssertStringDoesContain(t, "fooUpdatable.xml contents", fooUpdatableContents, `max-device-sdk="X"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000229
230 // double check that updatability attributes are not written if they don't exist in the bp file
231 // the permissions file for the foo library defined above
Paul Duffin1816cde2024-04-10 10:58:21 +0100232 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
233 fooPermissionsContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooPermissions)
234 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-since`)
235 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `on-bootclasspath-before`)
236 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `min-device-sdk`)
237 android.AssertStringDoesNotContain(t, "foo.xml contents", fooPermissionsContents, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000238}
239
Pedro Loureiroc3621422021-09-28 15:40:23 +0000240func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
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
Paul Duffin1816cde2024-04-10 10:58:21 +0100373 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Output("foo.xml")
374 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) {
420 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
421 expected := cp || combined // Every combined jar is also on the classpath.
422 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
423
424 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
425 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
426 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.
460 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
461 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
462 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 ).
mrziwang9f7b9f42024-07-10 12:18:06 -0700497 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference 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 ).
mrziwang9f7b9f42024-07-10 12:18:06 -0700523 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": unsupported module reference 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)
794 return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
795 }
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>.
800 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
801 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"} {
853 fooModule := result.ModuleForTests("foo"+scope, "android_common")
854 javac := fooModule.Rule("javac")
855
Colin Crossc9b4f6b2024-07-26 15:25:46 -0700856 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Output("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`,
996 `prebuilt_sdklib`,
997 `prebuilt_sdklib`,
998 `prebuilt_sdklib.stubs`,
999 `prebuilt_sdklib.stubs.source`,
1000 })
1001
1002 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1003 // prebuilt library.
1004 public := result.ModuleForTests("public", "android_common")
1005 rule := public.Output("javac/public.jar")
1006 inputs := rule.Implicits.Strings()
1007 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
1008 if !android.InList(expected, inputs) {
1009 t.Errorf("expected %q to contain %q", inputs, expected)
1010 }
1011}
1012
1013func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001014 t.Parallel()
Paul Duffinbf4de042022-09-27 12:41:52 +01001015 t.Run("prefer", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001016 t.Parallel()
Paul Duffinbf4de042022-09-27 12:41:52 +01001017 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1018 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001019}
1020
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001021// If a module is listed in `mainline_module_contributions, it should be used
1022// It will supersede any other source vs prebuilt selection mechanism like `prefer` attribute
1023func TestSdkLibraryImport_MetadataModuleSupersedesPreferred(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001024 t.Parallel()
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001025 bp := `
1026 apex_contributions {
1027 name: "my_mainline_module_contributions",
1028 api_domain: "my_mainline_module",
1029 contents: [
1030 // legacy mechanism prefers the prebuilt
1031 // mainline_module_contributions supersedes this since source is listed explicitly
1032 "sdklib.prebuilt_preferred_using_legacy_flags",
1033
1034 // legacy mechanism prefers the source
1035 // mainline_module_contributions supersedes this since prebuilt is listed explicitly
1036 "prebuilt_sdklib.source_preferred_using_legacy_flags",
1037 ],
1038 }
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001039 java_sdk_library {
1040 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1041 srcs: ["a.java"],
1042 sdk_version: "none",
1043 system_modules: "none",
1044 public: {
1045 enabled: true,
1046 },
1047 system: {
1048 enabled: true,
1049 }
1050 }
1051 java_sdk_library_import {
1052 name: "sdklib.prebuilt_preferred_using_legacy_flags",
1053 prefer: true, // prebuilt is preferred using legacy mechanism
1054 public: {
1055 jars: ["a.jar"],
1056 stub_srcs: ["a.java"],
1057 current_api: "current.txt",
1058 removed_api: "removed.txt",
1059 annotations: "annotations.zip",
1060 },
1061 system: {
1062 jars: ["a.jar"],
1063 stub_srcs: ["a.java"],
1064 current_api: "current.txt",
1065 removed_api: "removed.txt",
1066 annotations: "annotations.zip",
1067 },
1068 }
1069 java_sdk_library {
1070 name: "sdklib.source_preferred_using_legacy_flags",
1071 srcs: ["a.java"],
1072 sdk_version: "none",
1073 system_modules: "none",
1074 public: {
1075 enabled: true,
1076 },
1077 system: {
1078 enabled: true,
1079 }
1080 }
1081 java_sdk_library_import {
1082 name: "sdklib.source_preferred_using_legacy_flags",
1083 prefer: false, // source is preferred using legacy mechanism
1084 public: {
1085 jars: ["a.jar"],
1086 stub_srcs: ["a.java"],
1087 current_api: "current.txt",
1088 removed_api: "removed.txt",
1089 annotations: "annotations.zip",
1090 },
1091 system: {
1092 jars: ["a.jar"],
1093 stub_srcs: ["a.java"],
1094 current_api: "current.txt",
1095 removed_api: "removed.txt",
1096 annotations: "annotations.zip",
1097 },
1098 }
1099
1100 // rdeps
1101 java_library {
1102 name: "public",
1103 srcs: ["a.java"],
1104 libs: [
1105 // this should get source since source is listed in my_mainline_module_contributions
1106 "sdklib.prebuilt_preferred_using_legacy_flags.stubs",
1107 "sdklib.prebuilt_preferred_using_legacy_flags.stubs.system",
1108
1109 // this should get prebuilt since source is listed in my_mainline_module_contributions
1110 "sdklib.source_preferred_using_legacy_flags.stubs",
1111 "sdklib.source_preferred_using_legacy_flags.stubs.system",
1112
1113 ],
1114 }
1115 `
1116 result := android.GroupFixturePreparers(
1117 prepareForJavaTest,
1118 PrepareForTestWithJavaSdkLibraryFiles,
1119 FixtureWithLastReleaseApis("sdklib.source_preferred_using_legacy_flags", "sdklib.prebuilt_preferred_using_legacy_flags"),
Colin Crossa66b4632024-08-08 15:50:47 -07001120 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Dasfc12d2f2023-10-27 20:06:32 +00001121 ).RunTestWithBp(t, bp)
1122
1123 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1124 public := result.ModuleForTests("public", "android_common")
1125 rule := public.Output("javac/public.jar")
1126 inputs := rule.Implicits.Strings()
1127 expectedInputs := []string{
1128 // source
1129 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.jar",
1130 "out/soong/.intermediates/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system/android_common/turbine-combined/sdklib.prebuilt_preferred_using_legacy_flags.stubs.system.jar",
1131
1132 // prebuilt
1133 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.jar",
1134 "out/soong/.intermediates/prebuilt_sdklib.source_preferred_using_legacy_flags.stubs.system/android_common/combined/sdklib.source_preferred_using_legacy_flags.stubs.system.jar",
1135 }
1136 for _, expected := range expectedInputs {
1137 if !android.InList(expected, inputs) {
1138 t.Errorf("expected %q to contain %q", inputs, expected)
1139 }
1140 }
1141}
1142
Colin Cross30c491b2021-06-01 13:39:09 -07001143func TestJavaSdkLibraryDist(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001144 t.Parallel()
Colin Cross30c491b2021-06-01 13:39:09 -07001145 result := android.GroupFixturePreparers(
1146 PrepareForTestWithJavaBuildComponents,
1147 PrepareForTestWithJavaDefaultModules,
1148 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001149 FixtureWithLastReleaseApis(
1150 "sdklib_no_group",
1151 "sdklib_group_foo",
1152 "sdklib_owner_foo",
1153 "foo"),
Colin Crossa66b4632024-08-08 15:50:47 -07001154 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Colin Cross30c491b2021-06-01 13:39:09 -07001155 ).RunTestWithBp(t, `
1156 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001157 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001158 srcs: ["foo.java"],
1159 }
1160
1161 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001162 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001163 srcs: ["foo.java"],
1164 dist_group: "foo",
1165 }
1166
1167 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001168 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001169 srcs: ["foo.java"],
1170 owner: "foo",
1171 }
1172
1173 java_sdk_library {
1174 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001175 srcs: ["foo.java"],
1176 dist_stem: "foo",
1177 }
Colin Cross30c491b2021-06-01 13:39:09 -07001178 `)
1179
1180 type testCase struct {
1181 module string
1182 distDir string
1183 distStem string
1184 }
1185 testCases := []testCase{
1186 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001187 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001188 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001189 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001190 },
1191 {
Colin Cross986b69a2021-06-01 13:13:40 -07001192 module: "sdklib_group_foo",
1193 distDir: "apistubs/foo/public",
1194 distStem: "sdklib_group_foo.jar",
1195 },
1196 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001197 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001198 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001199 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001200 distStem: "sdklib_owner_foo.jar",
1201 },
1202 {
1203 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001204 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001205 distStem: "foo.jar",
1206 },
Colin Cross30c491b2021-06-01 13:39:09 -07001207 }
1208
1209 for _, tt := range testCases {
1210 t.Run(tt.module, func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001211 t.Parallel()
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001212 m := result.ModuleForTests(apiScopePublic.exportableStubsLibraryModuleName(tt.module), "android_common").Module().(*Library)
Colin Cross30c491b2021-06-01 13:39:09 -07001213 dists := m.Dists()
1214 if len(dists) != 1 {
1215 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1216 }
1217 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1218 t.Errorf("expected dist dir %q, got %q", w, g)
1219 }
1220 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1221 t.Errorf("expected dist stem %q, got %q", w, g)
1222 }
1223 })
1224 }
1225}
satayev8f088b02021-12-06 11:40:46 +00001226
1227func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001228 t.Parallel()
satayev8f088b02021-12-06 11:40:46 +00001229 preparer := android.GroupFixturePreparers(
1230 PrepareForTestWithJavaBuildComponents,
1231 PrepareForTestWithJavaDefaultModules,
1232 PrepareForTestWithJavaSdkLibraryFiles,
1233 )
1234
1235 preparer.RunTestWithBp(t, `
1236 java_sdk_library {
1237 name: "sdklib",
Jihoon Kanga3a05462024-04-05 00:36:44 +00001238 srcs: ["a.java"],
1239 static_libs: ["util"],
1240 min_sdk_version: "30",
satayev8f088b02021-12-06 11:40:46 +00001241 unsafe_ignore_missing_latest_api: true,
Jihoon Kanga3a05462024-04-05 00:36:44 +00001242 }
satayev8f088b02021-12-06 11:40:46 +00001243
1244 java_library {
1245 name: "util",
1246 srcs: ["a.java"],
1247 min_sdk_version: "30",
1248 }
1249 `)
1250
1251 preparer.
1252 RunTestWithBp(t, `
1253 java_sdk_library {
1254 name: "sdklib",
1255 srcs: ["a.java"],
1256 libs: ["util"],
1257 impl_only_libs: ["util"],
1258 stub_only_libs: ["util"],
1259 stub_only_static_libs: ["util"],
1260 min_sdk_version: "30",
1261 unsafe_ignore_missing_latest_api: true,
1262 }
1263
1264 java_library {
1265 name: "util",
1266 srcs: ["a.java"],
1267 }
1268 `)
1269
1270 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1271 RunTestWithBp(t, `
1272 java_sdk_library {
1273 name: "sdklib",
1274 srcs: ["a.java"],
1275 static_libs: ["util"],
1276 min_sdk_version: "30",
1277 unsafe_ignore_missing_latest_api: true,
1278 }
1279
1280 java_library {
1281 name: "util",
1282 srcs: ["a.java"],
1283 min_sdk_version: "31",
1284 }
1285 `)
1286
1287 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1288 RunTestWithBp(t, `
1289 java_sdk_library {
1290 name: "sdklib",
1291 srcs: ["a.java"],
1292 static_libs: ["util"],
1293 min_sdk_version: "30",
1294 unsafe_ignore_missing_latest_api: true,
1295 }
1296
1297 java_library {
1298 name: "util",
1299 srcs: ["a.java"],
1300 static_libs: ["another_util"],
1301 min_sdk_version: "30",
1302 }
1303
1304 java_library {
1305 name: "another_util",
1306 srcs: ["a.java"],
1307 min_sdk_version: "31",
1308 }
1309 `)
1310}
Nikita Ioffed732da72022-11-21 12:38:25 +00001311
1312func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001313 t.Parallel()
Nikita Ioffed732da72022-11-21 12:38:25 +00001314 result := android.GroupFixturePreparers(
1315 prepareForJavaTest,
1316 PrepareForTestWithJavaSdkLibraryFiles,
1317 FixtureWithLastReleaseApis("foo"),
1318 ).RunTestWithBp(t, `
1319 java_sdk_library {
1320 name: "foo",
1321 srcs: ["a.java"],
1322 public: {
1323 enabled: true,
1324 },
1325 stub_only_libs: ["bar-lib"],
1326 }
1327
1328 java_library {
1329 name: "bar-lib",
1330 srcs: ["b.java"],
1331 }
1332 `)
1333
1334 // The foo.stubs.source should depend on bar-lib
1335 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
Cole Faustb7493472024-08-28 11:55:52 -07001336 eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
1337 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 +00001338}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001339
Mark White9421c4c2023-08-10 00:07:03 +00001340func TestJavaSdkLibrary_Scope_Libs_PassedToDroidstubs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001341 t.Parallel()
Mark White9421c4c2023-08-10 00:07:03 +00001342 result := android.GroupFixturePreparers(
1343 prepareForJavaTest,
1344 PrepareForTestWithJavaSdkLibraryFiles,
1345 FixtureWithLastReleaseApis("foo"),
1346 ).RunTestWithBp(t, `
1347 java_sdk_library {
1348 name: "foo",
1349 srcs: ["a.java"],
1350 public: {
1351 enabled: true,
1352 libs: ["bar-lib"],
1353 },
1354 }
1355
1356 java_library {
1357 name: "bar-lib",
1358 srcs: ["b.java"],
1359 }
1360 `)
1361
1362 // The foo.stubs.source should depend on bar-lib
1363 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
Cole Faustb7493472024-08-28 11:55:52 -07001364 eval := fooStubsSources.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
1365 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 +00001366}
1367
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001368func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001369 t.Parallel()
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001370 result := android.GroupFixturePreparers(
1371 prepareForJavaTest,
1372 PrepareForTestWithJavaSdkLibraryFiles,
1373 FixtureWithLastReleaseApis("foo"),
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001374 ).RunTestWithBp(t, `
1375 java_sdk_library {
1376 name: "foo",
1377 srcs: ["a.java", "b.java"],
1378 api_packages: ["foo"],
1379 system: {
1380 enabled: true,
1381 },
1382 module_lib: {
1383 enabled: true,
1384 },
1385 test: {
1386 enabled: true,
1387 },
1388 }
1389 `)
1390
1391 testCases := []struct {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001392 scope *apiScope
1393 apiContributions []string
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001394 }{
1395 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001396 scope: apiScopePublic,
1397 apiContributions: []string{"foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001398 },
1399 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001400 scope: apiScopeSystem,
1401 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001402 },
1403 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001404 scope: apiScopeTest,
1405 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 +00001406 },
1407 {
Jihoon Kangb0f4c022024-08-06 00:15:25 +00001408 scope: apiScopeModuleLib,
1409 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 +00001410 },
1411 }
1412
1413 for _, c := range testCases {
1414 m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1415 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001416 }
1417}
Jihoon Kang786df932023-09-07 01:18:31 +00001418
1419func TestStaticDepStubLibrariesVisibility(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001420 t.Parallel()
Jihoon Kang786df932023-09-07 01:18:31 +00001421 android.GroupFixturePreparers(
1422 prepareForJavaTest,
1423 PrepareForTestWithJavaSdkLibraryFiles,
1424 FixtureWithLastReleaseApis("foo"),
1425 android.FixtureMergeMockFs(
1426 map[string][]byte{
1427 "A.java": nil,
1428 "dir/Android.bp": []byte(
1429 `
1430 java_library {
1431 name: "bar",
1432 srcs: ["A.java"],
1433 libs: ["foo.stubs.from-source"],
1434 }
1435 `),
1436 "dir/A.java": nil,
1437 },
1438 ).ExtendWithErrorHandler(
1439 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1440 `module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1441 ).RunTestWithBp(t, `
1442 java_sdk_library {
1443 name: "foo",
1444 srcs: ["A.java"],
1445 }
1446 `)
1447}
Jamie Garsidee570ace2023-11-27 12:07:36 +00001448
1449func TestSdkLibraryDependency(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001450 t.Parallel()
Jamie Garsidee570ace2023-11-27 12:07:36 +00001451 result := android.GroupFixturePreparers(
1452 prepareForJavaTest,
1453 PrepareForTestWithJavaSdkLibraryFiles,
1454 FixtureWithPrebuiltApis(map[string][]string{
1455 "30": {"bar", "foo"},
1456 }),
1457 ).RunTestWithBp(t,
1458 `
1459 java_sdk_library {
1460 name: "foo",
1461 srcs: ["a.java", "b.java"],
1462 api_packages: ["foo"],
1463 }
1464
1465 java_sdk_library {
1466 name: "bar",
1467 srcs: ["c.java", "b.java"],
1468 libs: [
Jihoon Kang28c96572024-09-11 23:44:44 +00001469 "foo.stubs",
Jamie Garsidee570ace2023-11-27 12:07:36 +00001470 ],
1471 uses_libs: [
1472 "foo",
1473 ],
1474 }
1475`)
1476
Paul Duffin1816cde2024-04-10 10:58:21 +01001477 barPermissions := result.ModuleForTests("bar.xml", "android_common").Output("bar.xml")
1478 barContents := android.ContentFromFileRuleForTests(t, result.TestContext, barPermissions)
1479 android.AssertStringDoesContain(t, "bar.xml java_sdk_xml command", barContents, `dependency="foo"`)
Jamie Garsidee570ace2023-11-27 12:07:36 +00001480}
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001481
1482func TestSdkLibraryExportableStubsLibrary(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001483 t.Parallel()
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001484 result := android.GroupFixturePreparers(
1485 prepareForJavaTest,
1486 PrepareForTestWithJavaSdkLibraryFiles,
1487 FixtureWithLastReleaseApis("foo"),
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001488 ).RunTestWithBp(t, `
1489 aconfig_declarations {
1490 name: "bar",
1491 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +00001492 container: "com.android.foo",
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001493 srcs: [
1494 "bar.aconfig",
1495 ],
1496 }
1497 java_sdk_library {
1498 name: "foo",
1499 srcs: ["a.java", "b.java"],
1500 api_packages: ["foo"],
1501 system: {
1502 enabled: true,
1503 },
1504 module_lib: {
1505 enabled: true,
1506 },
1507 test: {
1508 enabled: true,
1509 },
1510 aconfig_declarations: [
1511 "bar",
1512 ],
1513 }
1514 `)
1515
1516 exportableStubsLibraryModuleName := apiScopePublic.exportableStubsLibraryModuleName("foo")
1517 exportableSourceStubsLibraryModuleName := apiScopePublic.exportableSourceStubsLibraryModuleName("foo")
1518
1519 // Check modules generation
Cole Faustb7493472024-08-28 11:55:52 -07001520 result.ModuleForTests(exportableStubsLibraryModuleName, "android_common")
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001521 result.ModuleForTests(exportableSourceStubsLibraryModuleName, "android_common")
1522
1523 // Check static lib dependency
1524 android.AssertBoolEquals(t, "exportable top level stubs library module depends on the"+
1525 "exportable source stubs library module", true,
Cole Faustb7493472024-08-28 11:55:52 -07001526 CheckModuleHasDependencyWithTag(t, result.TestContext, exportableStubsLibraryModuleName,
1527 "android_common", staticLibTag, exportableSourceStubsLibraryModuleName),
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001528 )
Jihoon Kangfa4a90d2023-12-20 02:53:38 +00001529}
Spandan Das81d95c52024-02-01 23:41:11 +00001530
1531// For java libraries depending on java_sdk_library(_import) via libs, assert that
1532// rdep gets stubs of source if source is listed in apex_contributions and prebuilt has prefer (legacy mechanism)
1533func TestStubResolutionOfJavaSdkLibraryInLibs(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001534 t.Parallel()
Spandan Das81d95c52024-02-01 23:41:11 +00001535 bp := `
1536 apex_contributions {
1537 name: "my_mainline_module_contributions",
1538 api_domain: "my_mainline_module",
1539 contents: ["sdklib"], // source is selected using apex_contributions, but prebuilt is selected using prefer
1540 }
1541 java_sdk_library {
1542 name: "sdklib",
1543 srcs: ["a.java"],
1544 sdk_version: "none",
1545 system_modules: "none",
1546 public: {
1547 enabled: true,
1548 },
1549 }
1550 java_sdk_library_import {
1551 name: "sdklib",
1552 public: {
1553 jars: ["a.jar"],
1554 stub_srcs: ["a.java"],
1555 current_api: "current.txt",
1556 removed_api: "removed.txt",
1557 annotations: "annotations.zip",
1558 },
1559 prefer: true, // Set prefer explicitly on the prebuilt. We will assert that rdep gets source in a test case.
1560 }
1561 // rdeps
1562 java_library {
1563 name: "mymodule",
1564 srcs: ["a.java"],
1565 sdk_version: "current",
Jihoon Kang28c96572024-09-11 23:44:44 +00001566 libs: ["sdklib.stubs",], // this should be dynamically resolved to sdklib.stubs (source) or prebuilt_sdklib.stubs (prebuilt)
Spandan Das81d95c52024-02-01 23:41:11 +00001567 }
1568 `
1569
1570 fixture := android.GroupFixturePreparers(
1571 prepareForJavaTest,
1572 PrepareForTestWithJavaSdkLibraryFiles,
1573 FixtureWithLastReleaseApis("sdklib"),
Colin Crossa66b4632024-08-08 15:50:47 -07001574 // We can use any of the apex contribution build flags from build/soong/android/config.go#mainlineApexContributionBuildFlags here
1575 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Das81d95c52024-02-01 23:41:11 +00001576 )
1577
1578 result := fixture.RunTestWithBp(t, bp)
1579 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1580 public := result.ModuleForTests("mymodule", "android_common")
1581 rule := public.Output("javac/mymodule.jar")
1582 inputs := rule.Implicits.Strings()
1583 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar")
1584}
Spandan Das23956d12024-01-19 00:22:22 +00001585
1586// test that rdep gets resolved to the correct version of a java_sdk_library (source or a specific prebuilt)
1587func TestMultipleSdkLibraryPrebuilts(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001588 t.Parallel()
Spandan Das23956d12024-01-19 00:22:22 +00001589 bp := `
1590 apex_contributions {
1591 name: "my_mainline_module_contributions",
1592 api_domain: "my_mainline_module",
1593 contents: ["%s"],
1594 }
1595 java_sdk_library {
1596 name: "sdklib",
1597 srcs: ["a.java"],
1598 sdk_version: "none",
1599 system_modules: "none",
1600 public: {
1601 enabled: true,
1602 },
1603 }
1604 java_sdk_library_import {
1605 name: "sdklib.v1", //prebuilt
1606 source_module_name: "sdklib",
1607 public: {
1608 jars: ["a.jar"],
1609 stub_srcs: ["a.java"],
1610 current_api: "current.txt",
1611 removed_api: "removed.txt",
1612 annotations: "annotations.zip",
1613 },
1614 }
1615 java_sdk_library_import {
1616 name: "sdklib.v2", //prebuilt
1617 source_module_name: "sdklib",
1618 public: {
1619 jars: ["a.jar"],
1620 stub_srcs: ["a.java"],
1621 current_api: "current.txt",
1622 removed_api: "removed.txt",
1623 annotations: "annotations.zip",
1624 },
1625 }
1626 // rdeps
1627 java_library {
1628 name: "mymodule",
1629 srcs: ["a.java"],
1630 libs: ["sdklib.stubs",],
1631 }
1632 `
1633 testCases := []struct {
1634 desc string
1635 selectedDependencyName string
1636 expectedStubPath string
1637 }{
1638 {
1639 desc: "Source library is selected using apex_contributions",
1640 selectedDependencyName: "sdklib",
1641 expectedStubPath: "out/soong/.intermediates/sdklib.stubs/android_common/turbine-combined/sdklib.stubs.jar",
1642 },
1643 {
1644 desc: "Prebuilt library v1 is selected using apex_contributions",
1645 selectedDependencyName: "prebuilt_sdklib.v1",
1646 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v1.stubs/android_common/combined/sdklib.stubs.jar",
1647 },
1648 {
1649 desc: "Prebuilt library v2 is selected using apex_contributions",
1650 selectedDependencyName: "prebuilt_sdklib.v2",
1651 expectedStubPath: "out/soong/.intermediates/prebuilt_sdklib.v2.stubs/android_common/combined/sdklib.stubs.jar",
1652 },
1653 }
1654
1655 fixture := android.GroupFixturePreparers(
1656 prepareForJavaTest,
1657 PrepareForTestWithJavaSdkLibraryFiles,
1658 FixtureWithLastReleaseApis("sdklib", "sdklib.v1", "sdklib.v2"),
Colin Crossa66b4632024-08-08 15:50:47 -07001659 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_mainline_module_contributions"),
Spandan Das23956d12024-01-19 00:22:22 +00001660 )
1661
1662 for _, tc := range testCases {
1663 result := fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
1664
1665 // Make sure that rdeps get the correct source vs prebuilt based on mainline_module_contributions
1666 public := result.ModuleForTests("mymodule", "android_common")
1667 rule := public.Output("javac/mymodule.jar")
1668 inputs := rule.Implicits.Strings()
1669 android.AssertStringListContains(t, "Could not find the expected stub on classpath", inputs, tc.expectedStubPath)
1670 }
1671}
Jihoon Kangfa3f0782024-08-21 20:42:18 +00001672
1673func TestStubLinkType(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001674 t.Parallel()
Jihoon Kangfa3f0782024-08-21 20:42:18 +00001675 android.GroupFixturePreparers(
1676 prepareForJavaTest,
1677 PrepareForTestWithJavaSdkLibraryFiles,
1678 FixtureWithLastReleaseApis("foo"),
1679 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1680 `module "baz" variant "android_common": compiles against system API, but dependency `+
1681 `"bar.stubs.system" is compiling against module API. In order to fix this, `+
1682 `consider adjusting sdk_version: OR platform_apis: property of the source or `+
1683 `target module so that target module is built with the same or smaller API set `+
1684 `when compared to the source.`),
1685 ).RunTestWithBp(t, `
1686 java_sdk_library {
1687 name: "foo",
1688 srcs: ["a.java"],
1689 sdk_version: "current",
1690 }
1691 java_library {
1692 name: "bar.stubs.system",
1693 srcs: ["a.java"],
1694 sdk_version: "module_current",
1695 is_stubs_module: false,
1696 }
1697
1698 java_library {
1699 name: "baz",
1700 srcs: ["b.java"],
1701 libs: [
1702 "foo.stubs.system",
1703 "bar.stubs.system",
1704 ],
1705 sdk_version: "system_current",
1706 }
1707 `)
1708}
Jihoon Kang28c96572024-09-11 23:44:44 +00001709
1710func TestSdkLibDirectDependency(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001711 t.Parallel()
Jihoon Kang28c96572024-09-11 23:44:44 +00001712 android.GroupFixturePreparers(
1713 prepareForJavaTest,
1714 PrepareForTestWithJavaSdkLibraryFiles,
1715 FixtureWithLastReleaseApis("foo", "bar"),
1716 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern([]string{
1717 `module "baz" variant "android_common": cannot depend directly on java_sdk_library ` +
1718 `"foo"; try depending on "foo.stubs", or "foo.impl" instead`,
1719 `module "baz" variant "android_common": cannot depend directly on java_sdk_library ` +
1720 `"prebuilt_bar"; try depending on "bar.stubs", or "bar.impl" instead`,
1721 }),
1722 ).RunTestWithBp(t, `
1723 java_sdk_library {
1724 name: "foo",
1725 srcs: ["a.java"],
1726 sdk_version: "current",
1727 public: {
1728 enabled: true,
1729 },
1730 }
1731
1732 java_sdk_library_import {
1733 name: "foo",
1734 public: {
1735 jars: ["a.jar"],
1736 stub_srcs: ["a.java"],
1737 current_api: "current.txt",
1738 removed_api: "removed.txt",
1739 annotations: "annotations.zip",
1740 },
1741 }
1742
1743 java_sdk_library {
1744 name: "bar",
1745 srcs: ["a.java"],
1746 sdk_version: "current",
1747 public: {
1748 enabled: true,
1749 },
1750 }
1751
1752 java_sdk_library_import {
1753 name: "bar",
1754 prefer: true,
1755 public: {
1756 jars: ["a.jar"],
1757 stub_srcs: ["a.java"],
1758 current_api: "current.txt",
1759 removed_api: "removed.txt",
1760 annotations: "annotations.zip",
1761 },
1762 }
1763
1764 java_library {
1765 name: "baz",
1766 srcs: ["b.java"],
1767 libs: [
1768 "foo",
1769 "bar",
1770 ],
1771 }
1772 `)
1773}
1774
1775func TestSdkLibDirectDependencyWithPrebuiltSdk(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -08001776 t.Parallel()
Jihoon Kang28c96572024-09-11 23:44:44 +00001777 android.GroupFixturePreparers(
1778 prepareForJavaTest,
1779 PrepareForTestWithJavaSdkLibraryFiles,
1780 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1781 variables.Platform_sdk_version = intPtr(34)
1782 variables.Platform_sdk_codename = stringPtr("VanillaIceCream")
1783 variables.Platform_version_active_codenames = []string{"VanillaIceCream"}
1784 variables.Platform_systemsdk_versions = []string{"33", "34", "VanillaIceCream"}
1785 variables.DeviceSystemSdkVersions = []string{"VanillaIceCream"}
1786 }),
1787 FixtureWithPrebuiltApis(map[string][]string{
1788 "33": {"foo"},
1789 "34": {"foo"},
1790 "35": {"foo"},
1791 }),
1792 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
1793 `module "baz" variant "android_common": cannot depend directly on java_sdk_library "foo"; `+
1794 `try depending on "sdk_public_33_foo", "sdk_system_33_foo", "sdk_test_33_foo", `+
1795 `"sdk_module-lib_33_foo", or "sdk_system-server_33_foo" instead`),
1796 ).RunTestWithBp(t, `
1797 java_sdk_library {
1798 name: "foo",
1799 srcs: ["a.java"],
1800 sdk_version: "current",
1801 public: {
1802 enabled: true,
1803 },
1804 system: {
1805 enabled: true,
1806 },
1807 }
1808
1809 java_library {
1810 name: "baz",
1811 srcs: ["b.java"],
1812 libs: [
1813 "foo",
1814 ],
1815 sdk_version: "system_33",
1816 }
1817 `)
1818}