blob: 805bc226f96af3d0f463930b2a3ca7d8528778f3 [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"
21 "testing"
22
Pedro Loureiroc3621422021-09-28 15:40:23 +000023 "android/soong/android"
24
Colin Cross1d2b6b32021-06-01 13:18:08 -070025 "github.com/google/blueprint/proptools"
26)
27
28func TestJavaSdkLibrary(t *testing.T) {
29 result := android.GroupFixturePreparers(
30 prepareForJavaTest,
31 PrepareForTestWithJavaSdkLibraryFiles,
32 FixtureWithPrebuiltApis(map[string][]string{
33 "28": {"foo"},
34 "29": {"foo"},
35 "30": {"bar", "barney", "baz", "betty", "foo", "fred", "quuz", "wilma"},
36 }),
37 ).RunTestWithBp(t, `
38 droiddoc_exported_dir {
39 name: "droiddoc-templates-sdk",
40 path: ".",
41 }
42 java_sdk_library {
43 name: "foo",
44 srcs: ["a.java", "b.java"],
45 api_packages: ["foo"],
46 }
47 java_sdk_library {
48 name: "bar",
49 srcs: ["a.java", "b.java"],
50 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080051 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070052 }
53 java_library {
54 name: "baz",
55 srcs: ["c.java"],
56 libs: ["foo", "bar.stubs"],
57 sdk_version: "system_current",
58 }
59 java_sdk_library {
60 name: "barney",
61 srcs: ["c.java"],
62 api_only: true,
63 }
64 java_sdk_library {
65 name: "betty",
66 srcs: ["c.java"],
67 shared_library: false,
68 }
69 java_sdk_library_import {
70 name: "quuz",
71 public: {
72 jars: ["c.jar"],
73 },
74 }
75 java_sdk_library_import {
76 name: "fred",
77 public: {
78 jars: ["b.jar"],
79 },
80 }
81 java_sdk_library_import {
82 name: "wilma",
83 public: {
84 jars: ["b.jar"],
85 },
86 shared_library: false,
87 }
88 java_library {
89 name: "qux",
90 srcs: ["c.java"],
91 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
92 sdk_version: "system_current",
93 }
94 java_library {
95 name: "baz-test",
96 srcs: ["c.java"],
97 libs: ["foo"],
98 sdk_version: "test_current",
99 }
100 java_library {
101 name: "baz-29",
102 srcs: ["c.java"],
103 libs: ["foo"],
104 sdk_version: "system_29",
105 }
106 java_library {
107 name: "baz-module-30",
108 srcs: ["c.java"],
109 libs: ["foo"],
110 sdk_version: "module_30",
111 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000112 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700113
114 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100115 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700116 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
117 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
118 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
119 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
120 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
121 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
122 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
123 result.ModuleForTests("foo.api.public.28", "")
124 result.ModuleForTests("foo.api.system.28", "")
125 result.ModuleForTests("foo.api.test.28", "")
126
Paul Duffin9fc208e2021-06-27 20:42:04 +0100127 exportedComponentsInfo := result.ModuleProvider(foo.Module(), android.ExportedComponentsInfoProvider).(android.ExportedComponentsInfo)
Paul Duffinb97b1572021-04-29 21:50:40 +0100128 expectedFooExportedComponents := []string{
Paul Duffin958806b2022-05-16 13:10:47 +0000129 "foo-removed.api.public.latest",
130 "foo-removed.api.system.latest",
131 "foo.api.public.latest",
132 "foo.api.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100133 "foo.stubs",
134 "foo.stubs.source",
135 "foo.stubs.source.system",
136 "foo.stubs.source.test",
137 "foo.stubs.system",
138 "foo.stubs.test",
139 }
140 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
141
Colin Cross1d2b6b32021-06-01 13:18:08 -0700142 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
143 // tests if baz is actually linked to the stubs lib
144 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
145 // ... and not to the impl lib
146 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
147 // test if baz is not linked to the system variant of foo
148 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
149
150 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
151 // tests if baz-test is actually linked to the test stubs lib
152 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
153
154 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
155 // tests if baz-29 is actually linked to the system 29 stubs lib
156 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
157
158 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
159 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
160 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
161
162 // test if baz has exported SDK lib names foo and bar to qux
163 qux := result.ModuleForTests("qux", "android_common")
164 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100165 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100166 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100167 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700168 }
Wei Li1e73c652021-12-06 13:35:11 -0800169
170 fooDexJar := result.ModuleForTests("foo", "android_common").Rule("d8")
171 // tests if kotlinc generated files are NOT excluded from output of foo.
172 android.AssertStringDoesNotContain(t, "foo dex", fooDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
173
174 barDexJar := result.ModuleForTests("bar", "android_common").Rule("d8")
175 // tests if kotlinc generated files are excluded from output of bar.
176 android.AssertStringDoesContain(t, "bar dex", barDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700177}
178
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000179func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
180 result := android.GroupFixturePreparers(
181 prepareForJavaTest,
182 PrepareForTestWithJavaSdkLibraryFiles,
183 FixtureWithPrebuiltApis(map[string][]string{
184 "28": {"foo"},
185 "29": {"foo"},
186 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
187 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000188 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Pedro Loureirob638c622021-12-22 15:28:05 +0000189 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
Pedro Loureiroc3621422021-09-28 15:40:23 +0000190 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000191 ).RunTestWithBp(t,
192 `
193 java_sdk_library {
194 name: "fooUpdatable",
195 srcs: ["a.java", "b.java"],
196 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000197 on_bootclasspath_since: "U",
198 on_bootclasspath_before: "V",
199 min_device_sdk: "W",
Pedro Loureirob638c622021-12-22 15:28:05 +0000200 max_device_sdk: "X",
Pedro Loureiroc3621422021-09-28 15:40:23 +0000201 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000202 }
203 java_sdk_library {
204 name: "foo",
205 srcs: ["a.java", "b.java"],
206 api_packages: ["foo"],
207 }
208`)
Pedro Loureirob638c622021-12-22 15:28:05 +0000209
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000210 // test that updatability attributes are passed on correctly
211 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureirob638c622021-12-22 15:28:05 +0000212 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-since=\"U\"`)
213 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-before=\"V\"`)
214 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `min-device-sdk=\"W\"`)
215 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `max-device-sdk=\"X\"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000216
217 // double check that updatability attributes are not written if they don't exist in the bp file
218 // the permissions file for the foo library defined above
219 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiroba6682f2021-10-29 09:32:32 +0000220 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-since`)
221 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-before`)
222 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `min-device-sdk`)
223 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000224}
225
Pedro Loureiroc3621422021-09-28 15:40:23 +0000226func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000227 android.GroupFixturePreparers(
228 prepareForJavaTest,
229 PrepareForTestWithJavaSdkLibraryFiles,
230 FixtureWithPrebuiltApis(map[string][]string{
231 "30": {"fooUpdatable", "fooUpdatableErr"},
232 }),
233 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
234 []string{
235 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
236 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
237 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000238 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000239 })).RunTestWithBp(t,
240 `
241 java_sdk_library {
242 name: "fooUpdatableErr",
243 srcs: ["a.java", "b.java"],
244 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000245 on_bootclasspath_since: "aaa",
246 on_bootclasspath_before: "bbc",
247 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000248 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000249 }
250`)
251}
252
Pedro Loureiroc3621422021-09-28 15:40:23 +0000253func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
254 android.GroupFixturePreparers(
255 prepareForJavaTest,
256 PrepareForTestWithJavaSdkLibraryFiles,
257 FixtureWithPrebuiltApis(map[string][]string{
258 "28": {"foo"},
259 }),
260 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
261 []string{
262 "on_bootclasspath_since: Attribute value needs to be at least T",
263 "on_bootclasspath_before: Attribute value needs to be at least T",
264 "min_device_sdk: Attribute value needs to be at least T",
265 "max_device_sdk: Attribute value needs to be at least T",
266 },
267 )).RunTestWithBp(t,
268 `
269 java_sdk_library {
270 name: "foo",
271 srcs: ["a.java", "b.java"],
272 api_packages: ["foo"],
273 on_bootclasspath_since: "S",
274 on_bootclasspath_before: "S",
275 min_device_sdk: "S",
276 max_device_sdk: "S",
277 min_sdk_version: "S",
278 }
279`)
280}
281
282func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
283 android.GroupFixturePreparers(
284 prepareForJavaTest,
285 PrepareForTestWithJavaSdkLibraryFiles,
286 FixtureWithPrebuiltApis(map[string][]string{
287 "28": {"foo"},
288 }),
289 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
290 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
291 }),
292 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
293 []string{
294 "min_device_sdk can't be greater than max_device_sdk",
295 },
296 )).RunTestWithBp(t,
297 `
298 java_sdk_library {
299 name: "foo",
300 srcs: ["a.java", "b.java"],
301 api_packages: ["foo"],
302 min_device_sdk: "V",
303 max_device_sdk: "U",
304 min_sdk_version: "S",
305 }
306`)
307}
308
309func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
310 android.GroupFixturePreparers(
311 prepareForJavaTest,
312 PrepareForTestWithJavaSdkLibraryFiles,
313 FixtureWithPrebuiltApis(map[string][]string{
314 "28": {"foo"},
315 }),
316 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
317 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
318 }),
319 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
320 []string{
321 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
322 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
323 },
324 )).RunTestWithBp(t,
325 `
326 java_sdk_library {
327 name: "foo",
328 srcs: ["a.java", "b.java"],
329 api_packages: ["foo"],
330 min_device_sdk: "U",
331 max_device_sdk: "U",
332 min_sdk_version: "V",
333 }
334`)
335}
336
337func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
338 result := android.GroupFixturePreparers(
339 prepareForJavaTest,
340 PrepareForTestWithJavaSdkLibraryFiles,
341 FixtureWithPrebuiltApis(map[string][]string{
342 "30": {"foo"},
343 }),
344 ).RunTestWithBp(t,
345 `
346 java_sdk_library {
347 name: "foo",
348 srcs: ["a.java", "b.java"],
349 min_device_sdk: "Tiramisu",
350 min_sdk_version: "S",
351 }
352`)
353 // test that updatability attributes are passed on correctly
354 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiro196d3e62021-12-22 19:53:01 +0000355 android.AssertStringDoesContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<apex-library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000356 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<library`)
357}
358
Colin Cross1d2b6b32021-06-01 13:18:08 -0700359func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
360 result := android.GroupFixturePreparers(
361 prepareForJavaTest,
362 PrepareForTestWithJavaSdkLibraryFiles,
363 FixtureWithLastReleaseApis("sdklib"),
364 ).RunTestWithBp(t, `
365 java_sdk_library {
366 name: "sdklib",
367 srcs: ["a.java"],
368 libs: ["lib"],
369 static_libs: ["static-lib"],
370 impl_only_libs: ["impl-only-lib"],
371 stub_only_libs: ["stub-only-lib"],
372 stub_only_static_libs: ["stub-only-static-lib"],
373 }
374 java_defaults {
375 name: "defaults",
376 srcs: ["a.java"],
377 sdk_version: "current",
378 }
379 java_library { name: "lib", defaults: ["defaults"] }
380 java_library { name: "static-lib", defaults: ["defaults"] }
381 java_library { name: "impl-only-lib", defaults: ["defaults"] }
382 java_library { name: "stub-only-lib", defaults: ["defaults"] }
383 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
384 `)
385 var expectations = []struct {
386 lib string
387 on_impl_classpath bool
388 on_stub_classpath bool
389 in_impl_combined bool
390 in_stub_combined bool
391 }{
392 {lib: "lib", on_impl_classpath: true},
393 {lib: "static-lib", in_impl_combined: true},
394 {lib: "impl-only-lib", on_impl_classpath: true},
395 {lib: "stub-only-lib", on_stub_classpath: true},
396 {lib: "stub-only-static-lib", in_stub_combined: true},
397 }
398 verify := func(sdklib, dep string, cp, combined bool) {
399 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
400 expected := cp || combined // Every combined jar is also on the classpath.
401 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
402
403 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
404 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
405 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
406 }
407 for _, expectation := range expectations {
408 verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
409 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
410
411 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
412 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
413 }
414}
415
416func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
417 result := android.GroupFixturePreparers(
418 prepareForJavaTest,
419 PrepareForTestWithJavaSdkLibraryFiles,
420 FixtureWithLastReleaseApis("foo"),
421 ).RunTestWithBp(t, `
422 java_sdk_library {
423 name: "foo",
424 srcs: ["a.java"],
425 api_only: true,
426 public: {
427 enabled: true,
428 },
429 }
430
431 java_library {
432 name: "bar",
433 srcs: ["b.java"],
434 libs: ["foo"],
435 }
436 `)
437
438 // The bar library should depend on the stubs jar.
439 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
440 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
441 t.Errorf("expected %q, found %#q", expected, actual)
442 }
443}
444
Anton Hanssond78eb762021-09-21 15:25:12 +0100445func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700446 android.GroupFixturePreparers(
447 prepareForJavaTest,
448 PrepareForTestWithJavaSdkLibraryFiles,
449 FixtureWithLastReleaseApis("foo"),
450 ).RunTestWithBp(t, `
451 java_sdk_library {
452 name: "foo",
453 srcs: ["a.java"],
454 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100455 annotations_enabled: true,
456 public: {
457 enabled: true,
458 },
459 }
460 java_library {
461 name: "bar",
462 srcs: ["b.java", ":foo{.public.stubs.source}"],
463 java_resources: [":foo{.public.annotations.zip}"],
464 }
465 `)
466}
467
468func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
469 android.GroupFixturePreparers(
470 prepareForJavaTest,
471 PrepareForTestWithJavaSdkLibraryFiles,
472 FixtureWithLastReleaseApis("foo"),
473 ).
474 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": path dependency ":foo{.public.annotations.zip}": annotations.zip not available for api scope public`)).
475 RunTestWithBp(t, `
476 java_sdk_library {
477 name: "foo",
478 srcs: ["a.java"],
479 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700480 public: {
481 enabled: true,
482 },
483 }
484
485 java_library {
486 name: "bar",
487 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100488 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700489 }
490 `)
491}
492
493func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
494 android.GroupFixturePreparers(
495 prepareForJavaTest,
496 PrepareForTestWithJavaSdkLibraryFiles,
497 FixtureWithLastReleaseApis("foo"),
498 ).
499 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
500 RunTestWithBp(t, `
501 java_sdk_library {
502 name: "foo",
503 srcs: ["a.java"],
504 api_packages: ["foo"],
505 public: {
506 enabled: true,
507 },
508 }
509
510 java_library {
511 name: "bar",
512 srcs: ["b.java", ":foo{.system.stubs.source}"],
513 }
514 `)
515}
516
517func TestJavaSdkLibrary_Deps(t *testing.T) {
518 result := android.GroupFixturePreparers(
519 prepareForJavaTest,
520 PrepareForTestWithJavaSdkLibraryFiles,
521 FixtureWithLastReleaseApis("sdklib"),
522 ).RunTestWithBp(t, `
523 java_sdk_library {
524 name: "sdklib",
525 srcs: ["a.java"],
526 sdk_version: "none",
527 system_modules: "none",
528 public: {
529 enabled: true,
530 },
531 }
532 `)
533
534 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
535 `dex2oatd`,
Paul Duffin958806b2022-05-16 13:10:47 +0000536 `sdklib-removed.api.public.latest`,
537 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700538 `sdklib.impl`,
539 `sdklib.stubs`,
540 `sdklib.stubs.source`,
541 `sdklib.xml`,
542 })
543}
544
545func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
546 prepareForJavaTest.RunTestWithBp(t, `
547 java_sdk_library_import {
548 name: "foo",
549 public: {
550 jars: ["a.jar"],
551 stub_srcs: ["a.java"],
552 current_api: "api/current.txt",
553 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100554 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700555 },
556 }
557
558 java_library {
559 name: "bar",
560 srcs: [":foo{.public.stubs.source}"],
561 java_resources: [
562 ":foo{.public.api.txt}",
563 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100564 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700565 ],
566 }
567 `)
568}
569
570func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
571 bp := `
572 java_sdk_library_import {
573 name: "foo",
574 public: {
575 jars: ["a.jar"],
576 },
577 }
578 `
579
580 t.Run("stubs.source", func(t *testing.T) {
581 prepareForJavaTest.
582 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
583 RunTestWithBp(t, bp+`
584 java_library {
585 name: "bar",
586 srcs: [":foo{.public.stubs.source}"],
587 java_resources: [
588 ":foo{.public.api.txt}",
589 ":foo{.public.removed-api.txt}",
590 ],
591 }
592 `)
593 })
594
595 t.Run("api.txt", func(t *testing.T) {
596 prepareForJavaTest.
597 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
598 RunTestWithBp(t, bp+`
599 java_library {
600 name: "bar",
601 srcs: ["a.java"],
602 java_resources: [
603 ":foo{.public.api.txt}",
604 ],
605 }
606 `)
607 })
608
609 t.Run("removed-api.txt", func(t *testing.T) {
610 prepareForJavaTest.
611 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
612 RunTestWithBp(t, bp+`
613 java_library {
614 name: "bar",
615 srcs: ["a.java"],
616 java_resources: [
617 ":foo{.public.removed-api.txt}",
618 ],
619 }
620 `)
621 })
622}
623
624func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
625 prepareForJavaTest.
626 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
627 RunTestWithBp(t, `
628 java_sdk_library {
629 name: "foo",
630 srcs: ["a.java", "b.java"],
631 api_packages: ["foo"],
632 // Explicitly disable public to test the check that ensures the set of enabled
633 // scopes is consistent.
634 public: {
635 enabled: false,
636 },
637 system: {
638 enabled: true,
639 },
640 }
641 `)
642}
643
644func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
645 android.GroupFixturePreparers(
646 prepareForJavaTest,
647 PrepareForTestWithJavaSdkLibraryFiles,
648 FixtureWithLastReleaseApis("foo"),
649 ).RunTestWithBp(t, `
650 java_sdk_library {
651 name: "foo",
652 srcs: ["a.java", "b.java"],
653 api_packages: ["foo"],
654 system: {
655 enabled: true,
656 sdk_version: "module_current",
657 },
658 }
659 `)
660}
661
662func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
663 android.GroupFixturePreparers(
664 prepareForJavaTest,
665 PrepareForTestWithJavaSdkLibraryFiles,
666 FixtureWithLastReleaseApis("foo"),
667 ).RunTestWithBp(t, `
668 java_sdk_library {
669 name: "foo",
670 srcs: ["a.java", "b.java"],
671 api_packages: ["foo"],
672 system: {
673 enabled: true,
674 },
675 module_lib: {
676 enabled: true,
677 },
678 }
679 `)
680}
681
682func TestJavaSdkLibrary_SystemServer(t *testing.T) {
683 android.GroupFixturePreparers(
684 prepareForJavaTest,
685 PrepareForTestWithJavaSdkLibraryFiles,
686 FixtureWithLastReleaseApis("foo"),
687 ).RunTestWithBp(t, `
688 java_sdk_library {
689 name: "foo",
690 srcs: ["a.java", "b.java"],
691 api_packages: ["foo"],
692 system: {
693 enabled: true,
694 },
695 system_server: {
696 enabled: true,
697 },
698 }
699 `)
700}
701
702func TestJavaSdkLibrary_MissingScope(t *testing.T) {
703 prepareForJavaTest.
704 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
705 RunTestWithBp(t, `
706 java_sdk_library {
707 name: "foo",
708 srcs: ["a.java"],
709 public: {
710 enabled: false,
711 },
712 }
713
714 java_library {
715 name: "baz",
716 srcs: ["a.java"],
717 libs: ["foo"],
718 sdk_version: "module_current",
719 }
720 `)
721}
722
723func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
724 android.GroupFixturePreparers(
725 prepareForJavaTest,
726 PrepareForTestWithJavaSdkLibraryFiles,
727 FixtureWithLastReleaseApis("foo"),
728 ).RunTestWithBp(t, `
729 java_sdk_library {
730 name: "foo",
731 srcs: ["a.java"],
732 system: {
733 enabled: true,
734 },
735 }
736
737 java_library {
738 name: "baz",
739 srcs: ["a.java"],
740 libs: ["foo"],
741 // foo does not have module-lib scope so it should fallback to system
742 sdk_version: "module_current",
743 }
744 `)
745}
746
747func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
748 result := android.GroupFixturePreparers(
749 prepareForJavaTest,
750 PrepareForTestWithJavaSdkLibraryFiles,
751 FixtureWithLastReleaseApis("foo"),
752 ).RunTestWithBp(t, `
753 java_sdk_library {
754 name: "foo",
755 srcs: ["a.java"],
756 system: {
757 enabled: true,
758 },
759 default_to_stubs: true,
760 }
761
762 java_library {
763 name: "baz",
764 srcs: ["a.java"],
765 libs: ["foo"],
766 // does not have sdk_version set, should fallback to module,
767 // which will then fallback to system because the module scope
768 // is not enabled.
769 }
770 `)
771 // The baz library should depend on the system stubs jar.
772 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
773 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
774 t.Errorf("expected %q, found %#q", expected, actual)
775 }
776}
777
778func TestJavaSdkLibraryImport(t *testing.T) {
779 result := prepareForJavaTest.RunTestWithBp(t, `
780 java_library {
781 name: "foo",
782 srcs: ["a.java"],
783 libs: ["sdklib"],
784 sdk_version: "current",
785 }
786
787 java_library {
788 name: "foo.system",
789 srcs: ["a.java"],
790 libs: ["sdklib"],
791 sdk_version: "system_current",
792 }
793
794 java_library {
795 name: "foo.test",
796 srcs: ["a.java"],
797 libs: ["sdklib"],
798 sdk_version: "test_current",
799 }
800
801 java_sdk_library_import {
802 name: "sdklib",
803 public: {
804 jars: ["a.jar"],
805 },
806 system: {
807 jars: ["b.jar"],
808 },
809 test: {
810 jars: ["c.jar"],
811 stub_srcs: ["c.java"],
812 },
813 }
814 `)
815
816 for _, scope := range []string{"", ".system", ".test"} {
817 fooModule := result.ModuleForTests("foo"+scope, "android_common")
818 javac := fooModule.Rule("javac")
819
820 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
821 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
822 }
823
824 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000825 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700826 `prebuilt_sdklib.stubs`,
827 `prebuilt_sdklib.stubs.source.test`,
828 `prebuilt_sdklib.stubs.system`,
829 `prebuilt_sdklib.stubs.test`,
830 })
831}
832
833func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
834 result := android.GroupFixturePreparers(
835 prepareForJavaTest,
836 PrepareForTestWithJavaSdkLibraryFiles,
837 FixtureWithLastReleaseApis("sdklib"),
838 ).RunTestWithBp(t, `
839 java_sdk_library {
840 name: "sdklib",
841 srcs: ["a.java"],
842 sdk_version: "none",
843 system_modules: "none",
844 public: {
845 enabled: true,
846 },
847 }
848
849 java_sdk_library_import {
850 name: "sdklib",
851 public: {
852 jars: ["a.jar"],
853 },
854 }
855 `)
856
857 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
858 `dex2oatd`,
859 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +0000860 `sdklib-removed.api.public.latest`,
861 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700862 `sdklib.impl`,
863 `sdklib.stubs`,
864 `sdklib.stubs.source`,
865 `sdklib.xml`,
866 })
867
868 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
869 `prebuilt_sdklib.stubs`,
870 `sdklib.impl`,
871 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
872 // dependency is added after prebuilts may have been renamed and so has to use
873 // the renamed name.
874 `sdklib.xml`,
875 })
876}
877
878func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
879 result := android.GroupFixturePreparers(
880 prepareForJavaTest,
881 PrepareForTestWithJavaSdkLibraryFiles,
882 FixtureWithLastReleaseApis("sdklib"),
883 ).RunTestWithBp(t, `
884 java_sdk_library {
885 name: "sdklib",
886 srcs: ["a.java"],
887 sdk_version: "none",
888 system_modules: "none",
889 public: {
890 enabled: true,
891 },
892 }
893
894 java_sdk_library_import {
895 name: "sdklib",
896 prefer: true,
897 public: {
898 jars: ["a.jar"],
899 },
900 }
901 `)
902
903 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -0700904 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +0000905 `sdklib-removed.api.public.latest`,
906 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700907 `sdklib.impl`,
908 `sdklib.stubs`,
909 `sdklib.stubs.source`,
910 `sdklib.xml`,
911 })
912
913 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000914 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700915 `prebuilt_sdklib.stubs`,
916 `sdklib.impl`,
917 `sdklib.xml`,
918 })
919}
920
921func TestJavaSdkLibraryEnforce(t *testing.T) {
922 partitionToBpOption := func(partition string) string {
923 switch partition {
924 case "system":
925 return ""
926 case "vendor":
927 return "soc_specific: true,"
928 case "product":
929 return "product_specific: true,"
930 default:
931 panic("Invalid partition group name: " + partition)
932 }
933 }
934
935 type testConfigInfo struct {
936 libraryType string
937 fromPartition string
938 toPartition string
939 enforceVendorInterface bool
940 enforceProductInterface bool
941 enforceJavaSdkLibraryCheck bool
942 allowList []string
943 }
944
945 createPreparer := func(info testConfigInfo) android.FixturePreparer {
946 bpFileTemplate := `
947 java_library {
948 name: "foo",
949 srcs: ["foo.java"],
950 libs: ["bar"],
951 sdk_version: "current",
952 %s
953 }
954
955 %s {
956 name: "bar",
957 srcs: ["bar.java"],
958 sdk_version: "current",
959 %s
960 }
961 `
962
963 bpFile := fmt.Sprintf(bpFileTemplate,
964 partitionToBpOption(info.fromPartition),
965 info.libraryType,
966 partitionToBpOption(info.toPartition))
967
968 return android.GroupFixturePreparers(
969 PrepareForTestWithJavaSdkLibraryFiles,
970 FixtureWithLastReleaseApis("bar"),
971 android.FixtureWithRootAndroidBp(bpFile),
972 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
973 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
974 if info.enforceVendorInterface {
975 variables.DeviceVndkVersion = proptools.StringPtr("current")
976 }
977 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
978 variables.InterPartitionJavaLibraryAllowList = info.allowList
979 }),
980 )
981 }
982
983 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
984 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
985 errorHandler := android.FixtureExpectsNoErrors
986 if expectedErrorPattern != "" {
987 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
988 }
989 android.GroupFixturePreparers(
990 prepareForJavaTest,
991 createPreparer(info),
992 ).
993 ExtendWithErrorHandler(errorHandler).
994 RunTest(t)
995 })
996 }
997
998 errorMessage := "is not allowed across the partitions"
999
1000 runTest(t, testConfigInfo{
1001 libraryType: "java_library",
1002 fromPartition: "product",
1003 toPartition: "system",
1004 enforceVendorInterface: true,
1005 enforceProductInterface: true,
1006 enforceJavaSdkLibraryCheck: false,
1007 }, "")
1008
1009 runTest(t, testConfigInfo{
1010 libraryType: "java_library",
1011 fromPartition: "product",
1012 toPartition: "system",
1013 enforceVendorInterface: true,
1014 enforceProductInterface: false,
1015 enforceJavaSdkLibraryCheck: true,
1016 }, "")
1017
1018 runTest(t, testConfigInfo{
1019 libraryType: "java_library",
1020 fromPartition: "product",
1021 toPartition: "system",
1022 enforceVendorInterface: true,
1023 enforceProductInterface: true,
1024 enforceJavaSdkLibraryCheck: true,
1025 }, errorMessage)
1026
1027 runTest(t, testConfigInfo{
1028 libraryType: "java_library",
1029 fromPartition: "vendor",
1030 toPartition: "system",
1031 enforceVendorInterface: true,
1032 enforceProductInterface: true,
1033 enforceJavaSdkLibraryCheck: true,
1034 }, errorMessage)
1035
1036 runTest(t, testConfigInfo{
1037 libraryType: "java_library",
1038 fromPartition: "vendor",
1039 toPartition: "system",
1040 enforceVendorInterface: true,
1041 enforceProductInterface: true,
1042 enforceJavaSdkLibraryCheck: true,
1043 allowList: []string{"bar"},
1044 }, "")
1045
1046 runTest(t, testConfigInfo{
1047 libraryType: "java_library",
1048 fromPartition: "vendor",
1049 toPartition: "product",
1050 enforceVendorInterface: true,
1051 enforceProductInterface: true,
1052 enforceJavaSdkLibraryCheck: true,
1053 }, errorMessage)
1054
1055 runTest(t, testConfigInfo{
1056 libraryType: "java_sdk_library",
1057 fromPartition: "product",
1058 toPartition: "system",
1059 enforceVendorInterface: true,
1060 enforceProductInterface: true,
1061 enforceJavaSdkLibraryCheck: true,
1062 }, "")
1063
1064 runTest(t, testConfigInfo{
1065 libraryType: "java_sdk_library",
1066 fromPartition: "vendor",
1067 toPartition: "system",
1068 enforceVendorInterface: true,
1069 enforceProductInterface: true,
1070 enforceJavaSdkLibraryCheck: true,
1071 }, "")
1072
1073 runTest(t, testConfigInfo{
1074 libraryType: "java_sdk_library",
1075 fromPartition: "vendor",
1076 toPartition: "product",
1077 enforceVendorInterface: true,
1078 enforceProductInterface: true,
1079 enforceJavaSdkLibraryCheck: true,
1080 }, "")
1081}
Colin Cross30c491b2021-06-01 13:39:09 -07001082
1083func TestJavaSdkLibraryDist(t *testing.T) {
1084 result := android.GroupFixturePreparers(
1085 PrepareForTestWithJavaBuildComponents,
1086 PrepareForTestWithJavaDefaultModules,
1087 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001088 FixtureWithLastReleaseApis(
1089 "sdklib_no_group",
1090 "sdklib_group_foo",
1091 "sdklib_owner_foo",
1092 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001093 ).RunTestWithBp(t, `
1094 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001095 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001096 srcs: ["foo.java"],
1097 }
1098
1099 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001100 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001101 srcs: ["foo.java"],
1102 dist_group: "foo",
1103 }
1104
1105 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001106 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001107 srcs: ["foo.java"],
1108 owner: "foo",
1109 }
1110
1111 java_sdk_library {
1112 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001113 srcs: ["foo.java"],
1114 dist_stem: "foo",
1115 }
Colin Cross30c491b2021-06-01 13:39:09 -07001116 `)
1117
1118 type testCase struct {
1119 module string
1120 distDir string
1121 distStem string
1122 }
1123 testCases := []testCase{
1124 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001125 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001126 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001127 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001128 },
1129 {
Colin Cross986b69a2021-06-01 13:13:40 -07001130 module: "sdklib_group_foo",
1131 distDir: "apistubs/foo/public",
1132 distStem: "sdklib_group_foo.jar",
1133 },
1134 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001135 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001136 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001137 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001138 distStem: "sdklib_owner_foo.jar",
1139 },
1140 {
1141 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001142 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001143 distStem: "foo.jar",
1144 },
Colin Cross30c491b2021-06-01 13:39:09 -07001145 }
1146
1147 for _, tt := range testCases {
1148 t.Run(tt.module, func(t *testing.T) {
1149 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1150 dists := m.Dists()
1151 if len(dists) != 1 {
1152 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1153 }
1154 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1155 t.Errorf("expected dist dir %q, got %q", w, g)
1156 }
1157 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1158 t.Errorf("expected dist stem %q, got %q", w, g)
1159 }
1160 })
1161 }
1162}
satayev8f088b02021-12-06 11:40:46 +00001163
1164func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1165 preparer := android.GroupFixturePreparers(
1166 PrepareForTestWithJavaBuildComponents,
1167 PrepareForTestWithJavaDefaultModules,
1168 PrepareForTestWithJavaSdkLibraryFiles,
1169 )
1170
1171 preparer.RunTestWithBp(t, `
1172 java_sdk_library {
1173 name: "sdklib",
1174 srcs: ["a.java"],
1175 static_libs: ["util"],
1176 min_sdk_version: "30",
1177 unsafe_ignore_missing_latest_api: true,
1178 }
1179
1180 java_library {
1181 name: "util",
1182 srcs: ["a.java"],
1183 min_sdk_version: "30",
1184 }
1185 `)
1186
1187 preparer.
1188 RunTestWithBp(t, `
1189 java_sdk_library {
1190 name: "sdklib",
1191 srcs: ["a.java"],
1192 libs: ["util"],
1193 impl_only_libs: ["util"],
1194 stub_only_libs: ["util"],
1195 stub_only_static_libs: ["util"],
1196 min_sdk_version: "30",
1197 unsafe_ignore_missing_latest_api: true,
1198 }
1199
1200 java_library {
1201 name: "util",
1202 srcs: ["a.java"],
1203 }
1204 `)
1205
1206 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1207 RunTestWithBp(t, `
1208 java_sdk_library {
1209 name: "sdklib",
1210 srcs: ["a.java"],
1211 static_libs: ["util"],
1212 min_sdk_version: "30",
1213 unsafe_ignore_missing_latest_api: true,
1214 }
1215
1216 java_library {
1217 name: "util",
1218 srcs: ["a.java"],
1219 min_sdk_version: "31",
1220 }
1221 `)
1222
1223 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1224 RunTestWithBp(t, `
1225 java_sdk_library {
1226 name: "sdklib",
1227 srcs: ["a.java"],
1228 static_libs: ["util"],
1229 min_sdk_version: "30",
1230 unsafe_ignore_missing_latest_api: true,
1231 }
1232
1233 java_library {
1234 name: "util",
1235 srcs: ["a.java"],
1236 static_libs: ["another_util"],
1237 min_sdk_version: "30",
1238 }
1239
1240 java_library {
1241 name: "another_util",
1242 srcs: ["a.java"],
1243 min_sdk_version: "31",
1244 }
1245 `)
1246}