blob: 210bfc3a302ef0cde07c05229cb404bad7909050 [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 }),
38 ).RunTestWithBp(t, `
39 droiddoc_exported_dir {
40 name: "droiddoc-templates-sdk",
41 path: ".",
42 }
43 java_sdk_library {
44 name: "foo",
45 srcs: ["a.java", "b.java"],
46 api_packages: ["foo"],
47 }
48 java_sdk_library {
49 name: "bar",
50 srcs: ["a.java", "b.java"],
51 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080052 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070053 }
54 java_library {
55 name: "baz",
56 srcs: ["c.java"],
57 libs: ["foo", "bar.stubs"],
58 sdk_version: "system_current",
59 }
60 java_sdk_library {
61 name: "barney",
62 srcs: ["c.java"],
63 api_only: true,
64 }
65 java_sdk_library {
66 name: "betty",
67 srcs: ["c.java"],
68 shared_library: false,
69 }
70 java_sdk_library_import {
71 name: "quuz",
72 public: {
73 jars: ["c.jar"],
74 },
75 }
76 java_sdk_library_import {
77 name: "fred",
78 public: {
79 jars: ["b.jar"],
80 },
81 }
82 java_sdk_library_import {
83 name: "wilma",
84 public: {
85 jars: ["b.jar"],
86 },
87 shared_library: false,
88 }
89 java_library {
90 name: "qux",
91 srcs: ["c.java"],
92 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
93 sdk_version: "system_current",
94 }
95 java_library {
96 name: "baz-test",
97 srcs: ["c.java"],
98 libs: ["foo"],
99 sdk_version: "test_current",
100 }
101 java_library {
102 name: "baz-29",
103 srcs: ["c.java"],
104 libs: ["foo"],
105 sdk_version: "system_29",
106 }
107 java_library {
108 name: "baz-module-30",
109 srcs: ["c.java"],
110 libs: ["foo"],
111 sdk_version: "module_30",
112 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000113 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700114
115 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100116 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700117 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
118 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
119 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
120 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
121 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
122 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
123 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
124 result.ModuleForTests("foo.api.public.28", "")
125 result.ModuleForTests("foo.api.system.28", "")
126 result.ModuleForTests("foo.api.test.28", "")
127
Paul Duffin9fc208e2021-06-27 20:42:04 +0100128 exportedComponentsInfo := result.ModuleProvider(foo.Module(), android.ExportedComponentsInfoProvider).(android.ExportedComponentsInfo)
Paul Duffinb97b1572021-04-29 21:50:40 +0100129 expectedFooExportedComponents := []string{
Paul Duffin958806b2022-05-16 13:10:47 +0000130 "foo-removed.api.public.latest",
131 "foo-removed.api.system.latest",
132 "foo.api.public.latest",
133 "foo.api.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100134 "foo.stubs",
135 "foo.stubs.source",
136 "foo.stubs.source.system",
137 "foo.stubs.source.test",
138 "foo.stubs.system",
139 "foo.stubs.test",
140 }
141 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
142
Colin Cross1d2b6b32021-06-01 13:18:08 -0700143 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
144 // tests if baz is actually linked to the stubs lib
145 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
146 // ... and not to the impl lib
147 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
148 // test if baz is not linked to the system variant of foo
149 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
150
151 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
152 // tests if baz-test is actually linked to the test stubs lib
153 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
154
155 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
156 // tests if baz-29 is actually linked to the system 29 stubs lib
157 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
158
159 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
160 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
161 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
162
163 // test if baz has exported SDK lib names foo and bar to qux
164 qux := result.ModuleForTests("qux", "android_common")
165 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100166 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100167 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100168 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700169 }
Wei Li1e73c652021-12-06 13:35:11 -0800170
171 fooDexJar := result.ModuleForTests("foo", "android_common").Rule("d8")
172 // tests if kotlinc generated files are NOT excluded from output of foo.
173 android.AssertStringDoesNotContain(t, "foo dex", fooDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
174
175 barDexJar := result.ModuleForTests("bar", "android_common").Rule("d8")
176 // tests if kotlinc generated files are excluded from output of bar.
177 android.AssertStringDoesContain(t, "bar dex", barDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700178}
179
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000180func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
181 result := android.GroupFixturePreparers(
182 prepareForJavaTest,
183 PrepareForTestWithJavaSdkLibraryFiles,
184 FixtureWithPrebuiltApis(map[string][]string{
185 "28": {"foo"},
186 "29": {"foo"},
187 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
188 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000189 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Pedro Loureirob638c622021-12-22 15:28:05 +0000190 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
Pedro Loureiroc3621422021-09-28 15:40:23 +0000191 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000192 ).RunTestWithBp(t,
193 `
194 java_sdk_library {
195 name: "fooUpdatable",
196 srcs: ["a.java", "b.java"],
197 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000198 on_bootclasspath_since: "U",
199 on_bootclasspath_before: "V",
200 min_device_sdk: "W",
Pedro Loureirob638c622021-12-22 15:28:05 +0000201 max_device_sdk: "X",
Pedro Loureiroc3621422021-09-28 15:40:23 +0000202 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000203 }
204 java_sdk_library {
205 name: "foo",
206 srcs: ["a.java", "b.java"],
207 api_packages: ["foo"],
208 }
209`)
Pedro Loureirob638c622021-12-22 15:28:05 +0000210
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000211 // test that updatability attributes are passed on correctly
212 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureirob638c622021-12-22 15:28:05 +0000213 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-since=\"U\"`)
214 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-before=\"V\"`)
215 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `min-device-sdk=\"W\"`)
216 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `max-device-sdk=\"X\"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000217
218 // double check that updatability attributes are not written if they don't exist in the bp file
219 // the permissions file for the foo library defined above
220 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiroba6682f2021-10-29 09:32:32 +0000221 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-since`)
222 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-before`)
223 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `min-device-sdk`)
224 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000225}
226
Pedro Loureiroc3621422021-09-28 15:40:23 +0000227func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000228 android.GroupFixturePreparers(
229 prepareForJavaTest,
230 PrepareForTestWithJavaSdkLibraryFiles,
231 FixtureWithPrebuiltApis(map[string][]string{
232 "30": {"fooUpdatable", "fooUpdatableErr"},
233 }),
234 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
235 []string{
236 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
237 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
238 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000239 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000240 })).RunTestWithBp(t,
241 `
242 java_sdk_library {
243 name: "fooUpdatableErr",
244 srcs: ["a.java", "b.java"],
245 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000246 on_bootclasspath_since: "aaa",
247 on_bootclasspath_before: "bbc",
248 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000249 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000250 }
251`)
252}
253
Pedro Loureiroc3621422021-09-28 15:40:23 +0000254func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
255 android.GroupFixturePreparers(
256 prepareForJavaTest,
257 PrepareForTestWithJavaSdkLibraryFiles,
258 FixtureWithPrebuiltApis(map[string][]string{
259 "28": {"foo"},
260 }),
261 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
262 []string{
263 "on_bootclasspath_since: Attribute value needs to be at least T",
264 "on_bootclasspath_before: Attribute value needs to be at least T",
265 "min_device_sdk: Attribute value needs to be at least T",
266 "max_device_sdk: Attribute value needs to be at least T",
267 },
268 )).RunTestWithBp(t,
269 `
270 java_sdk_library {
271 name: "foo",
272 srcs: ["a.java", "b.java"],
273 api_packages: ["foo"],
274 on_bootclasspath_since: "S",
275 on_bootclasspath_before: "S",
276 min_device_sdk: "S",
277 max_device_sdk: "S",
278 min_sdk_version: "S",
279 }
280`)
281}
282
283func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
284 android.GroupFixturePreparers(
285 prepareForJavaTest,
286 PrepareForTestWithJavaSdkLibraryFiles,
287 FixtureWithPrebuiltApis(map[string][]string{
288 "28": {"foo"},
289 }),
290 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
291 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
292 }),
293 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
294 []string{
295 "min_device_sdk can't be greater than max_device_sdk",
296 },
297 )).RunTestWithBp(t,
298 `
299 java_sdk_library {
300 name: "foo",
301 srcs: ["a.java", "b.java"],
302 api_packages: ["foo"],
303 min_device_sdk: "V",
304 max_device_sdk: "U",
305 min_sdk_version: "S",
306 }
307`)
308}
309
310func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
311 android.GroupFixturePreparers(
312 prepareForJavaTest,
313 PrepareForTestWithJavaSdkLibraryFiles,
314 FixtureWithPrebuiltApis(map[string][]string{
315 "28": {"foo"},
316 }),
317 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
318 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
319 }),
320 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
321 []string{
322 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
323 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
324 },
325 )).RunTestWithBp(t,
326 `
327 java_sdk_library {
328 name: "foo",
329 srcs: ["a.java", "b.java"],
330 api_packages: ["foo"],
331 min_device_sdk: "U",
332 max_device_sdk: "U",
333 min_sdk_version: "V",
334 }
335`)
336}
337
338func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
339 result := android.GroupFixturePreparers(
340 prepareForJavaTest,
341 PrepareForTestWithJavaSdkLibraryFiles,
342 FixtureWithPrebuiltApis(map[string][]string{
343 "30": {"foo"},
344 }),
345 ).RunTestWithBp(t,
346 `
347 java_sdk_library {
348 name: "foo",
349 srcs: ["a.java", "b.java"],
350 min_device_sdk: "Tiramisu",
351 min_sdk_version: "S",
352 }
353`)
354 // test that updatability attributes are passed on correctly
355 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiro196d3e62021-12-22 19:53:01 +0000356 android.AssertStringDoesContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<apex-library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000357 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<library`)
358}
359
Colin Cross1d2b6b32021-06-01 13:18:08 -0700360func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
361 result := android.GroupFixturePreparers(
362 prepareForJavaTest,
363 PrepareForTestWithJavaSdkLibraryFiles,
364 FixtureWithLastReleaseApis("sdklib"),
365 ).RunTestWithBp(t, `
366 java_sdk_library {
367 name: "sdklib",
368 srcs: ["a.java"],
369 libs: ["lib"],
370 static_libs: ["static-lib"],
371 impl_only_libs: ["impl-only-lib"],
372 stub_only_libs: ["stub-only-lib"],
373 stub_only_static_libs: ["stub-only-static-lib"],
374 }
375 java_defaults {
376 name: "defaults",
377 srcs: ["a.java"],
378 sdk_version: "current",
379 }
380 java_library { name: "lib", defaults: ["defaults"] }
381 java_library { name: "static-lib", defaults: ["defaults"] }
382 java_library { name: "impl-only-lib", defaults: ["defaults"] }
383 java_library { name: "stub-only-lib", defaults: ["defaults"] }
384 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
385 `)
386 var expectations = []struct {
387 lib string
388 on_impl_classpath bool
389 on_stub_classpath bool
390 in_impl_combined bool
391 in_stub_combined bool
392 }{
393 {lib: "lib", on_impl_classpath: true},
394 {lib: "static-lib", in_impl_combined: true},
395 {lib: "impl-only-lib", on_impl_classpath: true},
396 {lib: "stub-only-lib", on_stub_classpath: true},
397 {lib: "stub-only-static-lib", in_stub_combined: true},
398 }
399 verify := func(sdklib, dep string, cp, combined bool) {
400 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
401 expected := cp || combined // Every combined jar is also on the classpath.
402 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
403
404 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
405 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
406 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
407 }
408 for _, expectation := range expectations {
409 verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
410 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
411
412 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
413 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
414 }
415}
416
417func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
418 result := android.GroupFixturePreparers(
419 prepareForJavaTest,
420 PrepareForTestWithJavaSdkLibraryFiles,
421 FixtureWithLastReleaseApis("foo"),
422 ).RunTestWithBp(t, `
423 java_sdk_library {
424 name: "foo",
425 srcs: ["a.java"],
426 api_only: true,
427 public: {
428 enabled: true,
429 },
430 }
431
432 java_library {
433 name: "bar",
434 srcs: ["b.java"],
435 libs: ["foo"],
436 }
437 `)
438
439 // The bar library should depend on the stubs jar.
440 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
441 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
442 t.Errorf("expected %q, found %#q", expected, actual)
443 }
444}
445
Anton Hanssond78eb762021-09-21 15:25:12 +0100446func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700447 android.GroupFixturePreparers(
448 prepareForJavaTest,
449 PrepareForTestWithJavaSdkLibraryFiles,
450 FixtureWithLastReleaseApis("foo"),
451 ).RunTestWithBp(t, `
452 java_sdk_library {
453 name: "foo",
454 srcs: ["a.java"],
455 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100456 annotations_enabled: true,
457 public: {
458 enabled: true,
459 },
460 }
461 java_library {
462 name: "bar",
463 srcs: ["b.java", ":foo{.public.stubs.source}"],
464 java_resources: [":foo{.public.annotations.zip}"],
465 }
466 `)
467}
468
469func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
470 android.GroupFixturePreparers(
471 prepareForJavaTest,
472 PrepareForTestWithJavaSdkLibraryFiles,
473 FixtureWithLastReleaseApis("foo"),
474 ).
475 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": path dependency ":foo{.public.annotations.zip}": annotations.zip not available for api scope public`)).
476 RunTestWithBp(t, `
477 java_sdk_library {
478 name: "foo",
479 srcs: ["a.java"],
480 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700481 public: {
482 enabled: true,
483 },
484 }
485
486 java_library {
487 name: "bar",
488 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100489 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700490 }
491 `)
492}
493
494func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
495 android.GroupFixturePreparers(
496 prepareForJavaTest,
497 PrepareForTestWithJavaSdkLibraryFiles,
498 FixtureWithLastReleaseApis("foo"),
499 ).
500 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
501 RunTestWithBp(t, `
502 java_sdk_library {
503 name: "foo",
504 srcs: ["a.java"],
505 api_packages: ["foo"],
506 public: {
507 enabled: true,
508 },
509 }
510
511 java_library {
512 name: "bar",
513 srcs: ["b.java", ":foo{.system.stubs.source}"],
514 }
515 `)
516}
517
518func TestJavaSdkLibrary_Deps(t *testing.T) {
519 result := android.GroupFixturePreparers(
520 prepareForJavaTest,
521 PrepareForTestWithJavaSdkLibraryFiles,
522 FixtureWithLastReleaseApis("sdklib"),
523 ).RunTestWithBp(t, `
524 java_sdk_library {
525 name: "sdklib",
526 srcs: ["a.java"],
527 sdk_version: "none",
528 system_modules: "none",
529 public: {
530 enabled: true,
531 },
532 }
533 `)
534
535 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
536 `dex2oatd`,
Paul Duffin958806b2022-05-16 13:10:47 +0000537 `sdklib-removed.api.public.latest`,
538 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700539 `sdklib.impl`,
540 `sdklib.stubs`,
541 `sdklib.stubs.source`,
542 `sdklib.xml`,
543 })
544}
545
546func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
547 prepareForJavaTest.RunTestWithBp(t, `
548 java_sdk_library_import {
549 name: "foo",
550 public: {
551 jars: ["a.jar"],
552 stub_srcs: ["a.java"],
553 current_api: "api/current.txt",
554 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100555 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700556 },
557 }
558
559 java_library {
560 name: "bar",
561 srcs: [":foo{.public.stubs.source}"],
562 java_resources: [
563 ":foo{.public.api.txt}",
564 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100565 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700566 ],
567 }
568 `)
569}
570
571func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
572 bp := `
573 java_sdk_library_import {
574 name: "foo",
575 public: {
576 jars: ["a.jar"],
577 },
578 }
579 `
580
581 t.Run("stubs.source", func(t *testing.T) {
582 prepareForJavaTest.
583 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
584 RunTestWithBp(t, bp+`
585 java_library {
586 name: "bar",
587 srcs: [":foo{.public.stubs.source}"],
588 java_resources: [
589 ":foo{.public.api.txt}",
590 ":foo{.public.removed-api.txt}",
591 ],
592 }
593 `)
594 })
595
596 t.Run("api.txt", func(t *testing.T) {
597 prepareForJavaTest.
598 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
599 RunTestWithBp(t, bp+`
600 java_library {
601 name: "bar",
602 srcs: ["a.java"],
603 java_resources: [
604 ":foo{.public.api.txt}",
605 ],
606 }
607 `)
608 })
609
610 t.Run("removed-api.txt", func(t *testing.T) {
611 prepareForJavaTest.
612 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
613 RunTestWithBp(t, bp+`
614 java_library {
615 name: "bar",
616 srcs: ["a.java"],
617 java_resources: [
618 ":foo{.public.removed-api.txt}",
619 ],
620 }
621 `)
622 })
623}
624
625func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
626 prepareForJavaTest.
627 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
628 RunTestWithBp(t, `
629 java_sdk_library {
630 name: "foo",
631 srcs: ["a.java", "b.java"],
632 api_packages: ["foo"],
633 // Explicitly disable public to test the check that ensures the set of enabled
634 // scopes is consistent.
635 public: {
636 enabled: false,
637 },
638 system: {
639 enabled: true,
640 },
641 }
642 `)
643}
644
645func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
646 android.GroupFixturePreparers(
647 prepareForJavaTest,
648 PrepareForTestWithJavaSdkLibraryFiles,
649 FixtureWithLastReleaseApis("foo"),
650 ).RunTestWithBp(t, `
651 java_sdk_library {
652 name: "foo",
653 srcs: ["a.java", "b.java"],
654 api_packages: ["foo"],
655 system: {
656 enabled: true,
657 sdk_version: "module_current",
658 },
659 }
660 `)
661}
662
663func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
664 android.GroupFixturePreparers(
665 prepareForJavaTest,
666 PrepareForTestWithJavaSdkLibraryFiles,
667 FixtureWithLastReleaseApis("foo"),
668 ).RunTestWithBp(t, `
669 java_sdk_library {
670 name: "foo",
671 srcs: ["a.java", "b.java"],
672 api_packages: ["foo"],
673 system: {
674 enabled: true,
675 },
676 module_lib: {
677 enabled: true,
678 },
679 }
680 `)
681}
682
683func TestJavaSdkLibrary_SystemServer(t *testing.T) {
684 android.GroupFixturePreparers(
685 prepareForJavaTest,
686 PrepareForTestWithJavaSdkLibraryFiles,
687 FixtureWithLastReleaseApis("foo"),
688 ).RunTestWithBp(t, `
689 java_sdk_library {
690 name: "foo",
691 srcs: ["a.java", "b.java"],
692 api_packages: ["foo"],
693 system: {
694 enabled: true,
695 },
696 system_server: {
697 enabled: true,
698 },
699 }
700 `)
701}
702
Paul Duffind0b9fca2022-09-30 18:11:41 +0100703func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
704 result := android.GroupFixturePreparers(
705 prepareForJavaTest,
706 PrepareForTestWithJavaSdkLibraryFiles,
707 FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
708 ).RunTestWithBp(t, `
709 java_sdk_library {
710 name: "foo-public",
711 srcs: ["a.java"],
712 api_packages: ["foo"],
713 public: {
714 enabled: true,
715 },
716 }
717
718 java_sdk_library {
719 name: "foo-system",
720 srcs: ["a.java"],
721 api_packages: ["foo"],
722 system: {
723 enabled: true,
724 },
725 }
726
727 java_sdk_library {
728 name: "foo-module-lib",
729 srcs: ["a.java"],
730 api_packages: ["foo"],
731 system: {
732 enabled: true,
733 },
734 module_lib: {
735 enabled: true,
736 },
737 }
738
739 java_sdk_library {
740 name: "foo-system-server",
741 srcs: ["a.java"],
742 api_packages: ["foo"],
743 system_server: {
744 enabled: true,
745 },
746 }
747
748 java_library {
749 name: "bar",
750 srcs: ["a.java"],
751 libs: ["foo-public", "foo-system", "foo-module-lib", "foo-system-server"],
752 sdk_version: "system_server_current",
753 }
754 `)
755
756 stubsPath := func(name string, scope *apiScope) string {
757 name = scope.stubsLibraryModuleName(name)
758 return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
759 }
760
761 // The bar library should depend on the highest (where system server is highest and public is
762 // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
763 // foo-<x> module is <x>.
764 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
765 stubLibraries := []string{
766 stubsPath("foo-public", apiScopePublic),
767 stubsPath("foo-system", apiScopeSystem),
768 stubsPath("foo-module-lib", apiScopeModuleLib),
769 stubsPath("foo-system-server", apiScopeSystemServer),
770 }
771 expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
772 if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
773 t.Errorf("expected pattern %q to match %#q", expected, actual)
774 }
775}
776
Colin Cross1d2b6b32021-06-01 13:18:08 -0700777func TestJavaSdkLibrary_MissingScope(t *testing.T) {
778 prepareForJavaTest.
779 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
780 RunTestWithBp(t, `
781 java_sdk_library {
782 name: "foo",
783 srcs: ["a.java"],
784 public: {
785 enabled: false,
786 },
787 }
788
789 java_library {
790 name: "baz",
791 srcs: ["a.java"],
792 libs: ["foo"],
793 sdk_version: "module_current",
794 }
795 `)
796}
797
798func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
799 android.GroupFixturePreparers(
800 prepareForJavaTest,
801 PrepareForTestWithJavaSdkLibraryFiles,
802 FixtureWithLastReleaseApis("foo"),
803 ).RunTestWithBp(t, `
804 java_sdk_library {
805 name: "foo",
806 srcs: ["a.java"],
807 system: {
808 enabled: true,
809 },
810 }
811
812 java_library {
813 name: "baz",
814 srcs: ["a.java"],
815 libs: ["foo"],
816 // foo does not have module-lib scope so it should fallback to system
817 sdk_version: "module_current",
818 }
819 `)
820}
821
822func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
823 result := android.GroupFixturePreparers(
824 prepareForJavaTest,
825 PrepareForTestWithJavaSdkLibraryFiles,
826 FixtureWithLastReleaseApis("foo"),
827 ).RunTestWithBp(t, `
828 java_sdk_library {
829 name: "foo",
830 srcs: ["a.java"],
831 system: {
832 enabled: true,
833 },
834 default_to_stubs: true,
835 }
836
837 java_library {
838 name: "baz",
839 srcs: ["a.java"],
840 libs: ["foo"],
841 // does not have sdk_version set, should fallback to module,
842 // which will then fallback to system because the module scope
843 // is not enabled.
844 }
845 `)
846 // The baz library should depend on the system stubs jar.
847 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
848 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
849 t.Errorf("expected %q, found %#q", expected, actual)
850 }
851}
852
853func TestJavaSdkLibraryImport(t *testing.T) {
854 result := prepareForJavaTest.RunTestWithBp(t, `
855 java_library {
856 name: "foo",
857 srcs: ["a.java"],
858 libs: ["sdklib"],
859 sdk_version: "current",
860 }
861
862 java_library {
863 name: "foo.system",
864 srcs: ["a.java"],
865 libs: ["sdklib"],
866 sdk_version: "system_current",
867 }
868
869 java_library {
870 name: "foo.test",
871 srcs: ["a.java"],
872 libs: ["sdklib"],
873 sdk_version: "test_current",
874 }
875
876 java_sdk_library_import {
877 name: "sdklib",
878 public: {
879 jars: ["a.jar"],
880 },
881 system: {
882 jars: ["b.jar"],
883 },
884 test: {
885 jars: ["c.jar"],
886 stub_srcs: ["c.java"],
887 },
888 }
889 `)
890
891 for _, scope := range []string{"", ".system", ".test"} {
892 fooModule := result.ModuleForTests("foo"+scope, "android_common")
893 javac := fooModule.Rule("javac")
894
895 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
896 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
897 }
898
899 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000900 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700901 `prebuilt_sdklib.stubs`,
902 `prebuilt_sdklib.stubs.source.test`,
903 `prebuilt_sdklib.stubs.system`,
904 `prebuilt_sdklib.stubs.test`,
905 })
906}
907
908func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
909 result := android.GroupFixturePreparers(
910 prepareForJavaTest,
911 PrepareForTestWithJavaSdkLibraryFiles,
912 FixtureWithLastReleaseApis("sdklib"),
913 ).RunTestWithBp(t, `
914 java_sdk_library {
915 name: "sdklib",
916 srcs: ["a.java"],
917 sdk_version: "none",
918 system_modules: "none",
919 public: {
920 enabled: true,
921 },
922 }
923
924 java_sdk_library_import {
925 name: "sdklib",
926 public: {
927 jars: ["a.jar"],
928 },
929 }
930 `)
931
932 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
933 `dex2oatd`,
934 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +0000935 `sdklib-removed.api.public.latest`,
936 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700937 `sdklib.impl`,
938 `sdklib.stubs`,
939 `sdklib.stubs.source`,
940 `sdklib.xml`,
941 })
942
943 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
944 `prebuilt_sdklib.stubs`,
945 `sdklib.impl`,
946 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
947 // dependency is added after prebuilts may have been renamed and so has to use
948 // the renamed name.
949 `sdklib.xml`,
950 })
951}
952
Paul Duffinbf4de042022-09-27 12:41:52 +0100953func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700954 result := android.GroupFixturePreparers(
955 prepareForJavaTest,
956 PrepareForTestWithJavaSdkLibraryFiles,
957 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100958 preparer,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700959 ).RunTestWithBp(t, `
960 java_sdk_library {
961 name: "sdklib",
962 srcs: ["a.java"],
963 sdk_version: "none",
964 system_modules: "none",
965 public: {
966 enabled: true,
967 },
968 }
969
970 java_sdk_library_import {
971 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +0100972 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -0700973 public: {
974 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100975 stub_srcs: ["a.java"],
976 current_api: "current.txt",
977 removed_api: "removed.txt",
978 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700979 },
980 }
Paul Duffinbf4de042022-09-27 12:41:52 +0100981
982 java_library {
983 name: "combined",
984 static_libs: [
985 "sdklib.stubs",
986 ],
987 java_resources: [
988 ":sdklib.stubs.source",
989 ":sdklib{.public.api.txt}",
990 ":sdklib{.public.removed-api.txt}",
991 ":sdklib{.public.annotations.zip}",
992 ],
993 sdk_version: "none",
994 system_modules: "none",
995 }
996
997 java_library {
998 name: "public",
999 srcs: ["a.java"],
1000 libs: ["sdklib"],
1001 sdk_version: "current",
1002 }
Colin Cross1d2b6b32021-06-01 13:18:08 -07001003 `)
1004
1005 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -07001006 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +00001007 `sdklib-removed.api.public.latest`,
1008 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001009 `sdklib.impl`,
1010 `sdklib.stubs`,
1011 `sdklib.stubs.source`,
1012 `sdklib.xml`,
1013 })
1014
1015 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +00001016 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001017 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +01001018 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001019 `sdklib.impl`,
1020 `sdklib.xml`,
1021 })
Paul Duffinbf4de042022-09-27 12:41:52 +01001022
1023 // Make sure that dependencies on child modules use the prebuilt when preferred.
1024 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
1025 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
1026 `prebuilt_sdklib`,
1027 `prebuilt_sdklib`,
1028 `prebuilt_sdklib`,
1029 `prebuilt_sdklib.stubs`,
1030 `prebuilt_sdklib.stubs.source`,
1031 })
1032
1033 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1034 // prebuilt library.
1035 public := result.ModuleForTests("public", "android_common")
1036 rule := public.Output("javac/public.jar")
1037 inputs := rule.Implicits.Strings()
1038 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
1039 if !android.InList(expected, inputs) {
1040 t.Errorf("expected %q to contain %q", inputs, expected)
1041 }
1042}
1043
1044func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
1045 t.Run("prefer", func(t *testing.T) {
1046 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1047 })
1048
1049 t.Run("use_source_config_var", func(t *testing.T) {
1050 testJavaSdkLibraryImport_Preferred(t,
1051 "use_source_config_var: {config_namespace: \"acme\", var_name: \"use_source\"},",
1052 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1053 variables.VendorVars = map[string]map[string]string{
1054 "acme": {
1055 "use_source": "false",
1056 },
1057 }
1058 }))
1059 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001060}
1061
1062func TestJavaSdkLibraryEnforce(t *testing.T) {
1063 partitionToBpOption := func(partition string) string {
1064 switch partition {
1065 case "system":
1066 return ""
1067 case "vendor":
1068 return "soc_specific: true,"
1069 case "product":
1070 return "product_specific: true,"
1071 default:
1072 panic("Invalid partition group name: " + partition)
1073 }
1074 }
1075
1076 type testConfigInfo struct {
1077 libraryType string
1078 fromPartition string
1079 toPartition string
1080 enforceVendorInterface bool
1081 enforceProductInterface bool
1082 enforceJavaSdkLibraryCheck bool
1083 allowList []string
1084 }
1085
1086 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1087 bpFileTemplate := `
1088 java_library {
1089 name: "foo",
1090 srcs: ["foo.java"],
1091 libs: ["bar"],
1092 sdk_version: "current",
1093 %s
1094 }
1095
1096 %s {
1097 name: "bar",
1098 srcs: ["bar.java"],
1099 sdk_version: "current",
1100 %s
1101 }
1102 `
1103
1104 bpFile := fmt.Sprintf(bpFileTemplate,
1105 partitionToBpOption(info.fromPartition),
1106 info.libraryType,
1107 partitionToBpOption(info.toPartition))
1108
1109 return android.GroupFixturePreparers(
1110 PrepareForTestWithJavaSdkLibraryFiles,
1111 FixtureWithLastReleaseApis("bar"),
1112 android.FixtureWithRootAndroidBp(bpFile),
1113 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1114 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
1115 if info.enforceVendorInterface {
1116 variables.DeviceVndkVersion = proptools.StringPtr("current")
1117 }
1118 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1119 variables.InterPartitionJavaLibraryAllowList = info.allowList
1120 }),
1121 )
1122 }
1123
1124 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1125 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1126 errorHandler := android.FixtureExpectsNoErrors
1127 if expectedErrorPattern != "" {
1128 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1129 }
1130 android.GroupFixturePreparers(
1131 prepareForJavaTest,
1132 createPreparer(info),
1133 ).
1134 ExtendWithErrorHandler(errorHandler).
1135 RunTest(t)
1136 })
1137 }
1138
1139 errorMessage := "is not allowed across the partitions"
1140
1141 runTest(t, testConfigInfo{
1142 libraryType: "java_library",
1143 fromPartition: "product",
1144 toPartition: "system",
1145 enforceVendorInterface: true,
1146 enforceProductInterface: true,
1147 enforceJavaSdkLibraryCheck: false,
1148 }, "")
1149
1150 runTest(t, testConfigInfo{
1151 libraryType: "java_library",
1152 fromPartition: "product",
1153 toPartition: "system",
1154 enforceVendorInterface: true,
1155 enforceProductInterface: false,
1156 enforceJavaSdkLibraryCheck: true,
1157 }, "")
1158
1159 runTest(t, testConfigInfo{
1160 libraryType: "java_library",
1161 fromPartition: "product",
1162 toPartition: "system",
1163 enforceVendorInterface: true,
1164 enforceProductInterface: true,
1165 enforceJavaSdkLibraryCheck: true,
1166 }, errorMessage)
1167
1168 runTest(t, testConfigInfo{
1169 libraryType: "java_library",
1170 fromPartition: "vendor",
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 allowList: []string{"bar"},
1185 }, "")
1186
1187 runTest(t, testConfigInfo{
1188 libraryType: "java_library",
1189 fromPartition: "vendor",
1190 toPartition: "product",
1191 enforceVendorInterface: true,
1192 enforceProductInterface: true,
1193 enforceJavaSdkLibraryCheck: true,
1194 }, errorMessage)
1195
1196 runTest(t, testConfigInfo{
1197 libraryType: "java_sdk_library",
1198 fromPartition: "product",
1199 toPartition: "system",
1200 enforceVendorInterface: true,
1201 enforceProductInterface: true,
1202 enforceJavaSdkLibraryCheck: true,
1203 }, "")
1204
1205 runTest(t, testConfigInfo{
1206 libraryType: "java_sdk_library",
1207 fromPartition: "vendor",
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: "product",
1218 enforceVendorInterface: true,
1219 enforceProductInterface: true,
1220 enforceJavaSdkLibraryCheck: true,
1221 }, "")
1222}
Colin Cross30c491b2021-06-01 13:39:09 -07001223
1224func TestJavaSdkLibraryDist(t *testing.T) {
1225 result := android.GroupFixturePreparers(
1226 PrepareForTestWithJavaBuildComponents,
1227 PrepareForTestWithJavaDefaultModules,
1228 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001229 FixtureWithLastReleaseApis(
1230 "sdklib_no_group",
1231 "sdklib_group_foo",
1232 "sdklib_owner_foo",
1233 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001234 ).RunTestWithBp(t, `
1235 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001236 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001237 srcs: ["foo.java"],
1238 }
1239
1240 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001241 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001242 srcs: ["foo.java"],
1243 dist_group: "foo",
1244 }
1245
1246 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001247 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001248 srcs: ["foo.java"],
1249 owner: "foo",
1250 }
1251
1252 java_sdk_library {
1253 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001254 srcs: ["foo.java"],
1255 dist_stem: "foo",
1256 }
Colin Cross30c491b2021-06-01 13:39:09 -07001257 `)
1258
1259 type testCase struct {
1260 module string
1261 distDir string
1262 distStem string
1263 }
1264 testCases := []testCase{
1265 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001266 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001267 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001268 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001269 },
1270 {
Colin Cross986b69a2021-06-01 13:13:40 -07001271 module: "sdklib_group_foo",
1272 distDir: "apistubs/foo/public",
1273 distStem: "sdklib_group_foo.jar",
1274 },
1275 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001276 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001277 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001278 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001279 distStem: "sdklib_owner_foo.jar",
1280 },
1281 {
1282 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001283 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001284 distStem: "foo.jar",
1285 },
Colin Cross30c491b2021-06-01 13:39:09 -07001286 }
1287
1288 for _, tt := range testCases {
1289 t.Run(tt.module, func(t *testing.T) {
1290 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1291 dists := m.Dists()
1292 if len(dists) != 1 {
1293 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1294 }
1295 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1296 t.Errorf("expected dist dir %q, got %q", w, g)
1297 }
1298 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1299 t.Errorf("expected dist stem %q, got %q", w, g)
1300 }
1301 })
1302 }
1303}
satayev8f088b02021-12-06 11:40:46 +00001304
1305func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1306 preparer := android.GroupFixturePreparers(
1307 PrepareForTestWithJavaBuildComponents,
1308 PrepareForTestWithJavaDefaultModules,
1309 PrepareForTestWithJavaSdkLibraryFiles,
1310 )
1311
1312 preparer.RunTestWithBp(t, `
1313 java_sdk_library {
1314 name: "sdklib",
1315 srcs: ["a.java"],
1316 static_libs: ["util"],
1317 min_sdk_version: "30",
1318 unsafe_ignore_missing_latest_api: true,
1319 }
1320
1321 java_library {
1322 name: "util",
1323 srcs: ["a.java"],
1324 min_sdk_version: "30",
1325 }
1326 `)
1327
1328 preparer.
1329 RunTestWithBp(t, `
1330 java_sdk_library {
1331 name: "sdklib",
1332 srcs: ["a.java"],
1333 libs: ["util"],
1334 impl_only_libs: ["util"],
1335 stub_only_libs: ["util"],
1336 stub_only_static_libs: ["util"],
1337 min_sdk_version: "30",
1338 unsafe_ignore_missing_latest_api: true,
1339 }
1340
1341 java_library {
1342 name: "util",
1343 srcs: ["a.java"],
1344 }
1345 `)
1346
1347 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1348 RunTestWithBp(t, `
1349 java_sdk_library {
1350 name: "sdklib",
1351 srcs: ["a.java"],
1352 static_libs: ["util"],
1353 min_sdk_version: "30",
1354 unsafe_ignore_missing_latest_api: true,
1355 }
1356
1357 java_library {
1358 name: "util",
1359 srcs: ["a.java"],
1360 min_sdk_version: "31",
1361 }
1362 `)
1363
1364 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1365 RunTestWithBp(t, `
1366 java_sdk_library {
1367 name: "sdklib",
1368 srcs: ["a.java"],
1369 static_libs: ["util"],
1370 min_sdk_version: "30",
1371 unsafe_ignore_missing_latest_api: true,
1372 }
1373
1374 java_library {
1375 name: "util",
1376 srcs: ["a.java"],
1377 static_libs: ["another_util"],
1378 min_sdk_version: "30",
1379 }
1380
1381 java_library {
1382 name: "another_util",
1383 srcs: ["a.java"],
1384 min_sdk_version: "31",
1385 }
1386 `)
1387}
Nikita Ioffed732da72022-11-21 12:38:25 +00001388
1389func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1390 result := android.GroupFixturePreparers(
1391 prepareForJavaTest,
1392 PrepareForTestWithJavaSdkLibraryFiles,
1393 FixtureWithLastReleaseApis("foo"),
1394 ).RunTestWithBp(t, `
1395 java_sdk_library {
1396 name: "foo",
1397 srcs: ["a.java"],
1398 public: {
1399 enabled: true,
1400 },
1401 stub_only_libs: ["bar-lib"],
1402 }
1403
1404 java_library {
1405 name: "bar-lib",
1406 srcs: ["b.java"],
1407 }
1408 `)
1409
1410 // The foo.stubs.source should depend on bar-lib
1411 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1412 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1413}