blob: 0b46919d2dd6774cba4472d9473a0f368466c632 [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
1071func TestJavaSdkLibraryEnforce(t *testing.T) {
1072 partitionToBpOption := func(partition string) string {
1073 switch partition {
1074 case "system":
1075 return ""
1076 case "vendor":
1077 return "soc_specific: true,"
1078 case "product":
1079 return "product_specific: true,"
1080 default:
1081 panic("Invalid partition group name: " + partition)
1082 }
1083 }
1084
1085 type testConfigInfo struct {
1086 libraryType string
1087 fromPartition string
1088 toPartition string
1089 enforceVendorInterface bool
1090 enforceProductInterface bool
1091 enforceJavaSdkLibraryCheck bool
1092 allowList []string
1093 }
1094
1095 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1096 bpFileTemplate := `
1097 java_library {
1098 name: "foo",
1099 srcs: ["foo.java"],
1100 libs: ["bar"],
1101 sdk_version: "current",
1102 %s
1103 }
1104
1105 %s {
1106 name: "bar",
1107 srcs: ["bar.java"],
1108 sdk_version: "current",
1109 %s
1110 }
1111 `
1112
1113 bpFile := fmt.Sprintf(bpFileTemplate,
1114 partitionToBpOption(info.fromPartition),
1115 info.libraryType,
1116 partitionToBpOption(info.toPartition))
1117
1118 return android.GroupFixturePreparers(
1119 PrepareForTestWithJavaSdkLibraryFiles,
1120 FixtureWithLastReleaseApis("bar"),
1121 android.FixtureWithRootAndroidBp(bpFile),
1122 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1123 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
1124 if info.enforceVendorInterface {
1125 variables.DeviceVndkVersion = proptools.StringPtr("current")
1126 }
1127 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1128 variables.InterPartitionJavaLibraryAllowList = info.allowList
1129 }),
1130 )
1131 }
1132
1133 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1134 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1135 errorHandler := android.FixtureExpectsNoErrors
1136 if expectedErrorPattern != "" {
1137 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1138 }
1139 android.GroupFixturePreparers(
1140 prepareForJavaTest,
1141 createPreparer(info),
1142 ).
1143 ExtendWithErrorHandler(errorHandler).
1144 RunTest(t)
1145 })
1146 }
1147
1148 errorMessage := "is not allowed across the partitions"
1149
1150 runTest(t, testConfigInfo{
1151 libraryType: "java_library",
1152 fromPartition: "product",
1153 toPartition: "system",
1154 enforceVendorInterface: true,
1155 enforceProductInterface: true,
1156 enforceJavaSdkLibraryCheck: false,
1157 }, "")
1158
1159 runTest(t, testConfigInfo{
1160 libraryType: "java_library",
1161 fromPartition: "product",
1162 toPartition: "system",
1163 enforceVendorInterface: true,
1164 enforceProductInterface: false,
1165 enforceJavaSdkLibraryCheck: true,
1166 }, "")
1167
1168 runTest(t, testConfigInfo{
1169 libraryType: "java_library",
1170 fromPartition: "product",
1171 toPartition: "system",
1172 enforceVendorInterface: true,
1173 enforceProductInterface: true,
1174 enforceJavaSdkLibraryCheck: true,
1175 }, errorMessage)
1176
1177 runTest(t, testConfigInfo{
1178 libraryType: "java_library",
1179 fromPartition: "vendor",
1180 toPartition: "system",
1181 enforceVendorInterface: true,
1182 enforceProductInterface: true,
1183 enforceJavaSdkLibraryCheck: true,
1184 }, errorMessage)
1185
1186 runTest(t, testConfigInfo{
1187 libraryType: "java_library",
1188 fromPartition: "vendor",
1189 toPartition: "system",
1190 enforceVendorInterface: true,
1191 enforceProductInterface: true,
1192 enforceJavaSdkLibraryCheck: true,
1193 allowList: []string{"bar"},
1194 }, "")
1195
1196 runTest(t, testConfigInfo{
1197 libraryType: "java_library",
1198 fromPartition: "vendor",
1199 toPartition: "product",
1200 enforceVendorInterface: true,
1201 enforceProductInterface: true,
1202 enforceJavaSdkLibraryCheck: true,
1203 }, errorMessage)
1204
1205 runTest(t, testConfigInfo{
1206 libraryType: "java_sdk_library",
1207 fromPartition: "product",
1208 toPartition: "system",
1209 enforceVendorInterface: true,
1210 enforceProductInterface: true,
1211 enforceJavaSdkLibraryCheck: true,
1212 }, "")
1213
1214 runTest(t, testConfigInfo{
1215 libraryType: "java_sdk_library",
1216 fromPartition: "vendor",
1217 toPartition: "system",
1218 enforceVendorInterface: true,
1219 enforceProductInterface: true,
1220 enforceJavaSdkLibraryCheck: true,
1221 }, "")
1222
1223 runTest(t, testConfigInfo{
1224 libraryType: "java_sdk_library",
1225 fromPartition: "vendor",
1226 toPartition: "product",
1227 enforceVendorInterface: true,
1228 enforceProductInterface: true,
1229 enforceJavaSdkLibraryCheck: true,
1230 }, "")
1231}
Colin Cross30c491b2021-06-01 13:39:09 -07001232
1233func TestJavaSdkLibraryDist(t *testing.T) {
1234 result := android.GroupFixturePreparers(
1235 PrepareForTestWithJavaBuildComponents,
1236 PrepareForTestWithJavaDefaultModules,
1237 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001238 FixtureWithLastReleaseApis(
1239 "sdklib_no_group",
1240 "sdklib_group_foo",
1241 "sdklib_owner_foo",
1242 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001243 ).RunTestWithBp(t, `
1244 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001245 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001246 srcs: ["foo.java"],
1247 }
1248
1249 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001250 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001251 srcs: ["foo.java"],
1252 dist_group: "foo",
1253 }
1254
1255 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001256 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001257 srcs: ["foo.java"],
1258 owner: "foo",
1259 }
1260
1261 java_sdk_library {
1262 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001263 srcs: ["foo.java"],
1264 dist_stem: "foo",
1265 }
Colin Cross30c491b2021-06-01 13:39:09 -07001266 `)
1267
1268 type testCase struct {
1269 module string
1270 distDir string
1271 distStem string
1272 }
1273 testCases := []testCase{
1274 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001275 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001276 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001277 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001278 },
1279 {
Colin Cross986b69a2021-06-01 13:13:40 -07001280 module: "sdklib_group_foo",
1281 distDir: "apistubs/foo/public",
1282 distStem: "sdklib_group_foo.jar",
1283 },
1284 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001285 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001286 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001287 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001288 distStem: "sdklib_owner_foo.jar",
1289 },
1290 {
1291 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001292 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001293 distStem: "foo.jar",
1294 },
Colin Cross30c491b2021-06-01 13:39:09 -07001295 }
1296
1297 for _, tt := range testCases {
1298 t.Run(tt.module, func(t *testing.T) {
1299 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1300 dists := m.Dists()
1301 if len(dists) != 1 {
1302 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1303 }
1304 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1305 t.Errorf("expected dist dir %q, got %q", w, g)
1306 }
1307 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1308 t.Errorf("expected dist stem %q, got %q", w, g)
1309 }
1310 })
1311 }
1312}
satayev8f088b02021-12-06 11:40:46 +00001313
1314func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1315 preparer := android.GroupFixturePreparers(
1316 PrepareForTestWithJavaBuildComponents,
1317 PrepareForTestWithJavaDefaultModules,
1318 PrepareForTestWithJavaSdkLibraryFiles,
1319 )
1320
1321 preparer.RunTestWithBp(t, `
1322 java_sdk_library {
1323 name: "sdklib",
1324 srcs: ["a.java"],
1325 static_libs: ["util"],
1326 min_sdk_version: "30",
1327 unsafe_ignore_missing_latest_api: true,
1328 }
1329
1330 java_library {
1331 name: "util",
1332 srcs: ["a.java"],
1333 min_sdk_version: "30",
1334 }
1335 `)
1336
1337 preparer.
1338 RunTestWithBp(t, `
1339 java_sdk_library {
1340 name: "sdklib",
1341 srcs: ["a.java"],
1342 libs: ["util"],
1343 impl_only_libs: ["util"],
1344 stub_only_libs: ["util"],
1345 stub_only_static_libs: ["util"],
1346 min_sdk_version: "30",
1347 unsafe_ignore_missing_latest_api: true,
1348 }
1349
1350 java_library {
1351 name: "util",
1352 srcs: ["a.java"],
1353 }
1354 `)
1355
1356 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1357 RunTestWithBp(t, `
1358 java_sdk_library {
1359 name: "sdklib",
1360 srcs: ["a.java"],
1361 static_libs: ["util"],
1362 min_sdk_version: "30",
1363 unsafe_ignore_missing_latest_api: true,
1364 }
1365
1366 java_library {
1367 name: "util",
1368 srcs: ["a.java"],
1369 min_sdk_version: "31",
1370 }
1371 `)
1372
1373 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1374 RunTestWithBp(t, `
1375 java_sdk_library {
1376 name: "sdklib",
1377 srcs: ["a.java"],
1378 static_libs: ["util"],
1379 min_sdk_version: "30",
1380 unsafe_ignore_missing_latest_api: true,
1381 }
1382
1383 java_library {
1384 name: "util",
1385 srcs: ["a.java"],
1386 static_libs: ["another_util"],
1387 min_sdk_version: "30",
1388 }
1389
1390 java_library {
1391 name: "another_util",
1392 srcs: ["a.java"],
1393 min_sdk_version: "31",
1394 }
1395 `)
1396}
Nikita Ioffed732da72022-11-21 12:38:25 +00001397
1398func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1399 result := android.GroupFixturePreparers(
1400 prepareForJavaTest,
1401 PrepareForTestWithJavaSdkLibraryFiles,
1402 FixtureWithLastReleaseApis("foo"),
1403 ).RunTestWithBp(t, `
1404 java_sdk_library {
1405 name: "foo",
1406 srcs: ["a.java"],
1407 public: {
1408 enabled: true,
1409 },
1410 stub_only_libs: ["bar-lib"],
1411 }
1412
1413 java_library {
1414 name: "bar-lib",
1415 srcs: ["b.java"],
1416 }
1417 `)
1418
1419 // The foo.stubs.source should depend on bar-lib
1420 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1421 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1422}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001423
1424func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
1425 result := android.GroupFixturePreparers(
1426 prepareForJavaTest,
1427 PrepareForTestWithJavaSdkLibraryFiles,
1428 FixtureWithLastReleaseApis("foo"),
1429 android.FixtureModifyConfig(func(config android.Config) {
1430 config.SetApiLibraries([]string{"foo"})
1431 }),
1432 ).RunTestWithBp(t, `
1433 java_sdk_library {
1434 name: "foo",
1435 srcs: ["a.java", "b.java"],
1436 api_packages: ["foo"],
1437 system: {
1438 enabled: true,
1439 },
1440 module_lib: {
1441 enabled: true,
1442 },
1443 test: {
1444 enabled: true,
1445 },
1446 }
1447 `)
1448
1449 testCases := []struct {
Jihoon Kangca198c22023-06-22 23:13:51 +00001450 scope *apiScope
1451 apiContributions []string
1452 fullApiSurfaceStub string
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001453 }{
1454 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001455 scope: apiScopePublic,
1456 apiContributions: []string{"foo.stubs.source.api.contribution"},
Jihoon Kange7ee2562023-07-25 05:51:46 +00001457 fullApiSurfaceStub: "android_stubs_current",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001458 },
1459 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001460 scope: apiScopeSystem,
1461 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
Jihoon Kange7ee2562023-07-25 05:51:46 +00001462 fullApiSurfaceStub: "android_system_stubs_current",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001463 },
1464 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001465 scope: apiScopeTest,
1466 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 +00001467 fullApiSurfaceStub: "android_test_stubs_current",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001468 },
1469 {
Jihoon Kangca198c22023-06-22 23:13:51 +00001470 scope: apiScopeModuleLib,
1471 apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1472 fullApiSurfaceStub: "android_module_lib_stubs_current_full.from-text",
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001473 },
1474 }
1475
1476 for _, c := range testCases {
1477 m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1478 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
Jihoon Kangca198c22023-06-22 23:13:51 +00001479 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 +00001480 }
1481}
Jihoon Kang786df932023-09-07 01:18:31 +00001482
1483func TestStaticDepStubLibrariesVisibility(t *testing.T) {
1484 android.GroupFixturePreparers(
1485 prepareForJavaTest,
1486 PrepareForTestWithJavaSdkLibraryFiles,
1487 FixtureWithLastReleaseApis("foo"),
1488 android.FixtureMergeMockFs(
1489 map[string][]byte{
1490 "A.java": nil,
1491 "dir/Android.bp": []byte(
1492 `
1493 java_library {
1494 name: "bar",
1495 srcs: ["A.java"],
1496 libs: ["foo.stubs.from-source"],
1497 }
1498 `),
1499 "dir/A.java": nil,
1500 },
1501 ).ExtendWithErrorHandler(
1502 android.FixtureExpectsAtLeastOneErrorMatchingPattern(
1503 `module "bar" variant "android_common": depends on //.:foo.stubs.from-source which is not visible to this module`)),
1504 ).RunTestWithBp(t, `
1505 java_sdk_library {
1506 name: "foo",
1507 srcs: ["A.java"],
1508 }
1509 `)
1510}