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