blob: e0e5b5697b4ff7dc46a7188fe7737c3be97ea066 [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{
129 "foo.stubs",
130 "foo.stubs.source",
131 "foo.stubs.source.system",
132 "foo.stubs.source.test",
133 "foo.stubs.system",
134 "foo.stubs.test",
135 }
136 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
137
Colin Cross1d2b6b32021-06-01 13:18:08 -0700138 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
139 // tests if baz is actually linked to the stubs lib
140 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
141 // ... and not to the impl lib
142 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
143 // test if baz is not linked to the system variant of foo
144 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
145
146 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
147 // tests if baz-test is actually linked to the test stubs lib
148 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
149
150 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
151 // tests if baz-29 is actually linked to the system 29 stubs lib
152 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
153
154 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
155 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
156 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
157
158 // test if baz has exported SDK lib names foo and bar to qux
159 qux := result.ModuleForTests("qux", "android_common")
160 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100161 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100162 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100163 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700164 }
Wei Li1e73c652021-12-06 13:35:11 -0800165
166 fooDexJar := result.ModuleForTests("foo", "android_common").Rule("d8")
167 // tests if kotlinc generated files are NOT excluded from output of foo.
168 android.AssertStringDoesNotContain(t, "foo dex", fooDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
169
170 barDexJar := result.ModuleForTests("bar", "android_common").Rule("d8")
171 // tests if kotlinc generated files are excluded from output of bar.
172 android.AssertStringDoesContain(t, "bar dex", barDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700173}
174
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000175func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
176 result := android.GroupFixturePreparers(
177 prepareForJavaTest,
178 PrepareForTestWithJavaSdkLibraryFiles,
179 FixtureWithPrebuiltApis(map[string][]string{
180 "28": {"foo"},
181 "29": {"foo"},
182 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
183 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000184 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
185 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W"}
186 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000187 ).RunTestWithBp(t,
188 `
189 java_sdk_library {
190 name: "fooUpdatable",
191 srcs: ["a.java", "b.java"],
192 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000193 on_bootclasspath_since: "U",
194 on_bootclasspath_before: "V",
195 min_device_sdk: "W",
196 max_device_sdk: "current",
197 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000198 }
199 java_sdk_library {
200 name: "foo",
201 srcs: ["a.java", "b.java"],
202 api_packages: ["foo"],
203 }
204`)
205 // test that updatability attributes are passed on correctly
206 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiroba6682f2021-10-29 09:32:32 +0000207 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-since=\"9001\"`)
208 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-before=\"9002\"`)
209 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `min-device-sdk=\"9003\"`)
210 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `max-device-sdk=\"10000\"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000211
212 // double check that updatability attributes are not written if they don't exist in the bp file
213 // the permissions file for the foo library defined above
214 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiroba6682f2021-10-29 09:32:32 +0000215 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-since`)
216 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-before`)
217 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `min-device-sdk`)
218 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000219}
220
Pedro Loureiroc3621422021-09-28 15:40:23 +0000221func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000222 android.GroupFixturePreparers(
223 prepareForJavaTest,
224 PrepareForTestWithJavaSdkLibraryFiles,
225 FixtureWithPrebuiltApis(map[string][]string{
226 "30": {"fooUpdatable", "fooUpdatableErr"},
227 }),
228 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
229 []string{
230 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
231 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
232 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
233 `max_device_sdk: "ddd" could not be parsed as an integer and is not a recognized codename`,
234 })).RunTestWithBp(t,
235 `
236 java_sdk_library {
237 name: "fooUpdatableErr",
238 srcs: ["a.java", "b.java"],
239 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000240 on_bootclasspath_since: "aaa",
241 on_bootclasspath_before: "bbc",
242 min_device_sdk: "ccc",
243 max_device_sdk: "ddd",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000244 }
245`)
246}
247
Pedro Loureiroc3621422021-09-28 15:40:23 +0000248func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
249 android.GroupFixturePreparers(
250 prepareForJavaTest,
251 PrepareForTestWithJavaSdkLibraryFiles,
252 FixtureWithPrebuiltApis(map[string][]string{
253 "28": {"foo"},
254 }),
255 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
256 []string{
257 "on_bootclasspath_since: Attribute value needs to be at least T",
258 "on_bootclasspath_before: Attribute value needs to be at least T",
259 "min_device_sdk: Attribute value needs to be at least T",
260 "max_device_sdk: Attribute value needs to be at least T",
261 },
262 )).RunTestWithBp(t,
263 `
264 java_sdk_library {
265 name: "foo",
266 srcs: ["a.java", "b.java"],
267 api_packages: ["foo"],
268 on_bootclasspath_since: "S",
269 on_bootclasspath_before: "S",
270 min_device_sdk: "S",
271 max_device_sdk: "S",
272 min_sdk_version: "S",
273 }
274`)
275}
276
277func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
278 android.GroupFixturePreparers(
279 prepareForJavaTest,
280 PrepareForTestWithJavaSdkLibraryFiles,
281 FixtureWithPrebuiltApis(map[string][]string{
282 "28": {"foo"},
283 }),
284 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
285 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
286 }),
287 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
288 []string{
289 "min_device_sdk can't be greater than max_device_sdk",
290 },
291 )).RunTestWithBp(t,
292 `
293 java_sdk_library {
294 name: "foo",
295 srcs: ["a.java", "b.java"],
296 api_packages: ["foo"],
297 min_device_sdk: "V",
298 max_device_sdk: "U",
299 min_sdk_version: "S",
300 }
301`)
302}
303
304func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
305 android.GroupFixturePreparers(
306 prepareForJavaTest,
307 PrepareForTestWithJavaSdkLibraryFiles,
308 FixtureWithPrebuiltApis(map[string][]string{
309 "28": {"foo"},
310 }),
311 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
312 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
313 }),
314 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
315 []string{
316 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
317 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
318 },
319 )).RunTestWithBp(t,
320 `
321 java_sdk_library {
322 name: "foo",
323 srcs: ["a.java", "b.java"],
324 api_packages: ["foo"],
325 min_device_sdk: "U",
326 max_device_sdk: "U",
327 min_sdk_version: "V",
328 }
329`)
330}
331
332func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
333 result := android.GroupFixturePreparers(
334 prepareForJavaTest,
335 PrepareForTestWithJavaSdkLibraryFiles,
336 FixtureWithPrebuiltApis(map[string][]string{
337 "30": {"foo"},
338 }),
339 ).RunTestWithBp(t,
340 `
341 java_sdk_library {
342 name: "foo",
343 srcs: ["a.java", "b.java"],
344 min_device_sdk: "Tiramisu",
345 min_sdk_version: "S",
346 }
347`)
348 // test that updatability attributes are passed on correctly
349 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiro196d3e62021-12-22 19:53:01 +0000350 android.AssertStringDoesContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<apex-library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000351 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<library`)
352}
353
Colin Cross1d2b6b32021-06-01 13:18:08 -0700354func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
355 result := android.GroupFixturePreparers(
356 prepareForJavaTest,
357 PrepareForTestWithJavaSdkLibraryFiles,
358 FixtureWithLastReleaseApis("sdklib"),
359 ).RunTestWithBp(t, `
360 java_sdk_library {
361 name: "sdklib",
362 srcs: ["a.java"],
363 libs: ["lib"],
364 static_libs: ["static-lib"],
365 impl_only_libs: ["impl-only-lib"],
366 stub_only_libs: ["stub-only-lib"],
367 stub_only_static_libs: ["stub-only-static-lib"],
368 }
369 java_defaults {
370 name: "defaults",
371 srcs: ["a.java"],
372 sdk_version: "current",
373 }
374 java_library { name: "lib", defaults: ["defaults"] }
375 java_library { name: "static-lib", defaults: ["defaults"] }
376 java_library { name: "impl-only-lib", defaults: ["defaults"] }
377 java_library { name: "stub-only-lib", defaults: ["defaults"] }
378 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
379 `)
380 var expectations = []struct {
381 lib string
382 on_impl_classpath bool
383 on_stub_classpath bool
384 in_impl_combined bool
385 in_stub_combined bool
386 }{
387 {lib: "lib", on_impl_classpath: true},
388 {lib: "static-lib", in_impl_combined: true},
389 {lib: "impl-only-lib", on_impl_classpath: true},
390 {lib: "stub-only-lib", on_stub_classpath: true},
391 {lib: "stub-only-static-lib", in_stub_combined: true},
392 }
393 verify := func(sdklib, dep string, cp, combined bool) {
394 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
395 expected := cp || combined // Every combined jar is also on the classpath.
396 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
397
398 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
399 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
400 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
401 }
402 for _, expectation := range expectations {
403 verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
404 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
405
406 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
407 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
408 }
409}
410
411func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
412 result := android.GroupFixturePreparers(
413 prepareForJavaTest,
414 PrepareForTestWithJavaSdkLibraryFiles,
415 FixtureWithLastReleaseApis("foo"),
416 ).RunTestWithBp(t, `
417 java_sdk_library {
418 name: "foo",
419 srcs: ["a.java"],
420 api_only: true,
421 public: {
422 enabled: true,
423 },
424 }
425
426 java_library {
427 name: "bar",
428 srcs: ["b.java"],
429 libs: ["foo"],
430 }
431 `)
432
433 // The bar library should depend on the stubs jar.
434 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
435 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
436 t.Errorf("expected %q, found %#q", expected, actual)
437 }
438}
439
Anton Hanssond78eb762021-09-21 15:25:12 +0100440func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700441 android.GroupFixturePreparers(
442 prepareForJavaTest,
443 PrepareForTestWithJavaSdkLibraryFiles,
444 FixtureWithLastReleaseApis("foo"),
445 ).RunTestWithBp(t, `
446 java_sdk_library {
447 name: "foo",
448 srcs: ["a.java"],
449 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100450 annotations_enabled: true,
451 public: {
452 enabled: true,
453 },
454 }
455 java_library {
456 name: "bar",
457 srcs: ["b.java", ":foo{.public.stubs.source}"],
458 java_resources: [":foo{.public.annotations.zip}"],
459 }
460 `)
461}
462
463func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
464 android.GroupFixturePreparers(
465 prepareForJavaTest,
466 PrepareForTestWithJavaSdkLibraryFiles,
467 FixtureWithLastReleaseApis("foo"),
468 ).
469 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": path dependency ":foo{.public.annotations.zip}": annotations.zip not available for api scope public`)).
470 RunTestWithBp(t, `
471 java_sdk_library {
472 name: "foo",
473 srcs: ["a.java"],
474 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700475 public: {
476 enabled: true,
477 },
478 }
479
480 java_library {
481 name: "bar",
482 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100483 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700484 }
485 `)
486}
487
488func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
489 android.GroupFixturePreparers(
490 prepareForJavaTest,
491 PrepareForTestWithJavaSdkLibraryFiles,
492 FixtureWithLastReleaseApis("foo"),
493 ).
494 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
495 RunTestWithBp(t, `
496 java_sdk_library {
497 name: "foo",
498 srcs: ["a.java"],
499 api_packages: ["foo"],
500 public: {
501 enabled: true,
502 },
503 }
504
505 java_library {
506 name: "bar",
507 srcs: ["b.java", ":foo{.system.stubs.source}"],
508 }
509 `)
510}
511
512func TestJavaSdkLibrary_Deps(t *testing.T) {
513 result := android.GroupFixturePreparers(
514 prepareForJavaTest,
515 PrepareForTestWithJavaSdkLibraryFiles,
516 FixtureWithLastReleaseApis("sdklib"),
517 ).RunTestWithBp(t, `
518 java_sdk_library {
519 name: "sdklib",
520 srcs: ["a.java"],
521 sdk_version: "none",
522 system_modules: "none",
523 public: {
524 enabled: true,
525 },
526 }
527 `)
528
529 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
530 `dex2oatd`,
531 `sdklib.impl`,
532 `sdklib.stubs`,
533 `sdklib.stubs.source`,
534 `sdklib.xml`,
535 })
536}
537
538func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
539 prepareForJavaTest.RunTestWithBp(t, `
540 java_sdk_library_import {
541 name: "foo",
542 public: {
543 jars: ["a.jar"],
544 stub_srcs: ["a.java"],
545 current_api: "api/current.txt",
546 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100547 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700548 },
549 }
550
551 java_library {
552 name: "bar",
553 srcs: [":foo{.public.stubs.source}"],
554 java_resources: [
555 ":foo{.public.api.txt}",
556 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100557 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700558 ],
559 }
560 `)
561}
562
563func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
564 bp := `
565 java_sdk_library_import {
566 name: "foo",
567 public: {
568 jars: ["a.jar"],
569 },
570 }
571 `
572
573 t.Run("stubs.source", func(t *testing.T) {
574 prepareForJavaTest.
575 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
576 RunTestWithBp(t, bp+`
577 java_library {
578 name: "bar",
579 srcs: [":foo{.public.stubs.source}"],
580 java_resources: [
581 ":foo{.public.api.txt}",
582 ":foo{.public.removed-api.txt}",
583 ],
584 }
585 `)
586 })
587
588 t.Run("api.txt", func(t *testing.T) {
589 prepareForJavaTest.
590 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
591 RunTestWithBp(t, bp+`
592 java_library {
593 name: "bar",
594 srcs: ["a.java"],
595 java_resources: [
596 ":foo{.public.api.txt}",
597 ],
598 }
599 `)
600 })
601
602 t.Run("removed-api.txt", func(t *testing.T) {
603 prepareForJavaTest.
604 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
605 RunTestWithBp(t, bp+`
606 java_library {
607 name: "bar",
608 srcs: ["a.java"],
609 java_resources: [
610 ":foo{.public.removed-api.txt}",
611 ],
612 }
613 `)
614 })
615}
616
617func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
618 prepareForJavaTest.
619 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
620 RunTestWithBp(t, `
621 java_sdk_library {
622 name: "foo",
623 srcs: ["a.java", "b.java"],
624 api_packages: ["foo"],
625 // Explicitly disable public to test the check that ensures the set of enabled
626 // scopes is consistent.
627 public: {
628 enabled: false,
629 },
630 system: {
631 enabled: true,
632 },
633 }
634 `)
635}
636
637func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
638 android.GroupFixturePreparers(
639 prepareForJavaTest,
640 PrepareForTestWithJavaSdkLibraryFiles,
641 FixtureWithLastReleaseApis("foo"),
642 ).RunTestWithBp(t, `
643 java_sdk_library {
644 name: "foo",
645 srcs: ["a.java", "b.java"],
646 api_packages: ["foo"],
647 system: {
648 enabled: true,
649 sdk_version: "module_current",
650 },
651 }
652 `)
653}
654
655func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
656 android.GroupFixturePreparers(
657 prepareForJavaTest,
658 PrepareForTestWithJavaSdkLibraryFiles,
659 FixtureWithLastReleaseApis("foo"),
660 ).RunTestWithBp(t, `
661 java_sdk_library {
662 name: "foo",
663 srcs: ["a.java", "b.java"],
664 api_packages: ["foo"],
665 system: {
666 enabled: true,
667 },
668 module_lib: {
669 enabled: true,
670 },
671 }
672 `)
673}
674
675func TestJavaSdkLibrary_SystemServer(t *testing.T) {
676 android.GroupFixturePreparers(
677 prepareForJavaTest,
678 PrepareForTestWithJavaSdkLibraryFiles,
679 FixtureWithLastReleaseApis("foo"),
680 ).RunTestWithBp(t, `
681 java_sdk_library {
682 name: "foo",
683 srcs: ["a.java", "b.java"],
684 api_packages: ["foo"],
685 system: {
686 enabled: true,
687 },
688 system_server: {
689 enabled: true,
690 },
691 }
692 `)
693}
694
695func TestJavaSdkLibrary_MissingScope(t *testing.T) {
696 prepareForJavaTest.
697 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
698 RunTestWithBp(t, `
699 java_sdk_library {
700 name: "foo",
701 srcs: ["a.java"],
702 public: {
703 enabled: false,
704 },
705 }
706
707 java_library {
708 name: "baz",
709 srcs: ["a.java"],
710 libs: ["foo"],
711 sdk_version: "module_current",
712 }
713 `)
714}
715
716func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
717 android.GroupFixturePreparers(
718 prepareForJavaTest,
719 PrepareForTestWithJavaSdkLibraryFiles,
720 FixtureWithLastReleaseApis("foo"),
721 ).RunTestWithBp(t, `
722 java_sdk_library {
723 name: "foo",
724 srcs: ["a.java"],
725 system: {
726 enabled: true,
727 },
728 }
729
730 java_library {
731 name: "baz",
732 srcs: ["a.java"],
733 libs: ["foo"],
734 // foo does not have module-lib scope so it should fallback to system
735 sdk_version: "module_current",
736 }
737 `)
738}
739
740func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
741 result := android.GroupFixturePreparers(
742 prepareForJavaTest,
743 PrepareForTestWithJavaSdkLibraryFiles,
744 FixtureWithLastReleaseApis("foo"),
745 ).RunTestWithBp(t, `
746 java_sdk_library {
747 name: "foo",
748 srcs: ["a.java"],
749 system: {
750 enabled: true,
751 },
752 default_to_stubs: true,
753 }
754
755 java_library {
756 name: "baz",
757 srcs: ["a.java"],
758 libs: ["foo"],
759 // does not have sdk_version set, should fallback to module,
760 // which will then fallback to system because the module scope
761 // is not enabled.
762 }
763 `)
764 // The baz library should depend on the system stubs jar.
765 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
766 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
767 t.Errorf("expected %q, found %#q", expected, actual)
768 }
769}
770
771func TestJavaSdkLibraryImport(t *testing.T) {
772 result := prepareForJavaTest.RunTestWithBp(t, `
773 java_library {
774 name: "foo",
775 srcs: ["a.java"],
776 libs: ["sdklib"],
777 sdk_version: "current",
778 }
779
780 java_library {
781 name: "foo.system",
782 srcs: ["a.java"],
783 libs: ["sdklib"],
784 sdk_version: "system_current",
785 }
786
787 java_library {
788 name: "foo.test",
789 srcs: ["a.java"],
790 libs: ["sdklib"],
791 sdk_version: "test_current",
792 }
793
794 java_sdk_library_import {
795 name: "sdklib",
796 public: {
797 jars: ["a.jar"],
798 },
799 system: {
800 jars: ["b.jar"],
801 },
802 test: {
803 jars: ["c.jar"],
804 stub_srcs: ["c.java"],
805 },
806 }
807 `)
808
809 for _, scope := range []string{"", ".system", ".test"} {
810 fooModule := result.ModuleForTests("foo"+scope, "android_common")
811 javac := fooModule.Rule("javac")
812
813 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
814 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
815 }
816
817 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000818 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700819 `prebuilt_sdklib.stubs`,
820 `prebuilt_sdklib.stubs.source.test`,
821 `prebuilt_sdklib.stubs.system`,
822 `prebuilt_sdklib.stubs.test`,
823 })
824}
825
826func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
827 result := android.GroupFixturePreparers(
828 prepareForJavaTest,
829 PrepareForTestWithJavaSdkLibraryFiles,
830 FixtureWithLastReleaseApis("sdklib"),
831 ).RunTestWithBp(t, `
832 java_sdk_library {
833 name: "sdklib",
834 srcs: ["a.java"],
835 sdk_version: "none",
836 system_modules: "none",
837 public: {
838 enabled: true,
839 },
840 }
841
842 java_sdk_library_import {
843 name: "sdklib",
844 public: {
845 jars: ["a.jar"],
846 },
847 }
848 `)
849
850 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
851 `dex2oatd`,
852 `prebuilt_sdklib`,
853 `sdklib.impl`,
854 `sdklib.stubs`,
855 `sdklib.stubs.source`,
856 `sdklib.xml`,
857 })
858
859 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
860 `prebuilt_sdklib.stubs`,
861 `sdklib.impl`,
862 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
863 // dependency is added after prebuilts may have been renamed and so has to use
864 // the renamed name.
865 `sdklib.xml`,
866 })
867}
868
869func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
870 result := android.GroupFixturePreparers(
871 prepareForJavaTest,
872 PrepareForTestWithJavaSdkLibraryFiles,
873 FixtureWithLastReleaseApis("sdklib"),
874 ).RunTestWithBp(t, `
875 java_sdk_library {
876 name: "sdklib",
877 srcs: ["a.java"],
878 sdk_version: "none",
879 system_modules: "none",
880 public: {
881 enabled: true,
882 },
883 }
884
885 java_sdk_library_import {
886 name: "sdklib",
887 prefer: true,
888 public: {
889 jars: ["a.jar"],
890 },
891 }
892 `)
893
894 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -0700895 `prebuilt_sdklib`,
896 `sdklib.impl`,
897 `sdklib.stubs`,
898 `sdklib.stubs.source`,
899 `sdklib.xml`,
900 })
901
902 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000903 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700904 `prebuilt_sdklib.stubs`,
905 `sdklib.impl`,
906 `sdklib.xml`,
907 })
908}
909
910func TestJavaSdkLibraryEnforce(t *testing.T) {
911 partitionToBpOption := func(partition string) string {
912 switch partition {
913 case "system":
914 return ""
915 case "vendor":
916 return "soc_specific: true,"
917 case "product":
918 return "product_specific: true,"
919 default:
920 panic("Invalid partition group name: " + partition)
921 }
922 }
923
924 type testConfigInfo struct {
925 libraryType string
926 fromPartition string
927 toPartition string
928 enforceVendorInterface bool
929 enforceProductInterface bool
930 enforceJavaSdkLibraryCheck bool
931 allowList []string
932 }
933
934 createPreparer := func(info testConfigInfo) android.FixturePreparer {
935 bpFileTemplate := `
936 java_library {
937 name: "foo",
938 srcs: ["foo.java"],
939 libs: ["bar"],
940 sdk_version: "current",
941 %s
942 }
943
944 %s {
945 name: "bar",
946 srcs: ["bar.java"],
947 sdk_version: "current",
948 %s
949 }
950 `
951
952 bpFile := fmt.Sprintf(bpFileTemplate,
953 partitionToBpOption(info.fromPartition),
954 info.libraryType,
955 partitionToBpOption(info.toPartition))
956
957 return android.GroupFixturePreparers(
958 PrepareForTestWithJavaSdkLibraryFiles,
959 FixtureWithLastReleaseApis("bar"),
960 android.FixtureWithRootAndroidBp(bpFile),
961 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
962 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
963 if info.enforceVendorInterface {
964 variables.DeviceVndkVersion = proptools.StringPtr("current")
965 }
966 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
967 variables.InterPartitionJavaLibraryAllowList = info.allowList
968 }),
969 )
970 }
971
972 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
973 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
974 errorHandler := android.FixtureExpectsNoErrors
975 if expectedErrorPattern != "" {
976 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
977 }
978 android.GroupFixturePreparers(
979 prepareForJavaTest,
980 createPreparer(info),
981 ).
982 ExtendWithErrorHandler(errorHandler).
983 RunTest(t)
984 })
985 }
986
987 errorMessage := "is not allowed across the partitions"
988
989 runTest(t, testConfigInfo{
990 libraryType: "java_library",
991 fromPartition: "product",
992 toPartition: "system",
993 enforceVendorInterface: true,
994 enforceProductInterface: true,
995 enforceJavaSdkLibraryCheck: false,
996 }, "")
997
998 runTest(t, testConfigInfo{
999 libraryType: "java_library",
1000 fromPartition: "product",
1001 toPartition: "system",
1002 enforceVendorInterface: true,
1003 enforceProductInterface: false,
1004 enforceJavaSdkLibraryCheck: true,
1005 }, "")
1006
1007 runTest(t, testConfigInfo{
1008 libraryType: "java_library",
1009 fromPartition: "product",
1010 toPartition: "system",
1011 enforceVendorInterface: true,
1012 enforceProductInterface: true,
1013 enforceJavaSdkLibraryCheck: true,
1014 }, errorMessage)
1015
1016 runTest(t, testConfigInfo{
1017 libraryType: "java_library",
1018 fromPartition: "vendor",
1019 toPartition: "system",
1020 enforceVendorInterface: true,
1021 enforceProductInterface: true,
1022 enforceJavaSdkLibraryCheck: true,
1023 }, errorMessage)
1024
1025 runTest(t, testConfigInfo{
1026 libraryType: "java_library",
1027 fromPartition: "vendor",
1028 toPartition: "system",
1029 enforceVendorInterface: true,
1030 enforceProductInterface: true,
1031 enforceJavaSdkLibraryCheck: true,
1032 allowList: []string{"bar"},
1033 }, "")
1034
1035 runTest(t, testConfigInfo{
1036 libraryType: "java_library",
1037 fromPartition: "vendor",
1038 toPartition: "product",
1039 enforceVendorInterface: true,
1040 enforceProductInterface: true,
1041 enforceJavaSdkLibraryCheck: true,
1042 }, errorMessage)
1043
1044 runTest(t, testConfigInfo{
1045 libraryType: "java_sdk_library",
1046 fromPartition: "product",
1047 toPartition: "system",
1048 enforceVendorInterface: true,
1049 enforceProductInterface: true,
1050 enforceJavaSdkLibraryCheck: true,
1051 }, "")
1052
1053 runTest(t, testConfigInfo{
1054 libraryType: "java_sdk_library",
1055 fromPartition: "vendor",
1056 toPartition: "system",
1057 enforceVendorInterface: true,
1058 enforceProductInterface: true,
1059 enforceJavaSdkLibraryCheck: true,
1060 }, "")
1061
1062 runTest(t, testConfigInfo{
1063 libraryType: "java_sdk_library",
1064 fromPartition: "vendor",
1065 toPartition: "product",
1066 enforceVendorInterface: true,
1067 enforceProductInterface: true,
1068 enforceJavaSdkLibraryCheck: true,
1069 }, "")
1070}
Colin Cross30c491b2021-06-01 13:39:09 -07001071
1072func TestJavaSdkLibraryDist(t *testing.T) {
1073 result := android.GroupFixturePreparers(
1074 PrepareForTestWithJavaBuildComponents,
1075 PrepareForTestWithJavaDefaultModules,
1076 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001077 FixtureWithLastReleaseApis(
1078 "sdklib_no_group",
1079 "sdklib_group_foo",
1080 "sdklib_owner_foo",
1081 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001082 ).RunTestWithBp(t, `
1083 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001084 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001085 srcs: ["foo.java"],
1086 }
1087
1088 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001089 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001090 srcs: ["foo.java"],
1091 dist_group: "foo",
1092 }
1093
1094 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001095 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001096 srcs: ["foo.java"],
1097 owner: "foo",
1098 }
1099
1100 java_sdk_library {
1101 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001102 srcs: ["foo.java"],
1103 dist_stem: "foo",
1104 }
Colin Cross30c491b2021-06-01 13:39:09 -07001105 `)
1106
1107 type testCase struct {
1108 module string
1109 distDir string
1110 distStem string
1111 }
1112 testCases := []testCase{
1113 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001114 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001115 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001116 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001117 },
1118 {
Colin Cross986b69a2021-06-01 13:13:40 -07001119 module: "sdklib_group_foo",
1120 distDir: "apistubs/foo/public",
1121 distStem: "sdklib_group_foo.jar",
1122 },
1123 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001124 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001125 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001126 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001127 distStem: "sdklib_owner_foo.jar",
1128 },
1129 {
1130 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001131 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001132 distStem: "foo.jar",
1133 },
Colin Cross30c491b2021-06-01 13:39:09 -07001134 }
1135
1136 for _, tt := range testCases {
1137 t.Run(tt.module, func(t *testing.T) {
1138 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1139 dists := m.Dists()
1140 if len(dists) != 1 {
1141 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1142 }
1143 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1144 t.Errorf("expected dist dir %q, got %q", w, g)
1145 }
1146 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1147 t.Errorf("expected dist stem %q, got %q", w, g)
1148 }
1149 })
1150 }
1151}
satayev8f088b02021-12-06 11:40:46 +00001152
1153func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1154 preparer := android.GroupFixturePreparers(
1155 PrepareForTestWithJavaBuildComponents,
1156 PrepareForTestWithJavaDefaultModules,
1157 PrepareForTestWithJavaSdkLibraryFiles,
1158 )
1159
1160 preparer.RunTestWithBp(t, `
1161 java_sdk_library {
1162 name: "sdklib",
1163 srcs: ["a.java"],
1164 static_libs: ["util"],
1165 min_sdk_version: "30",
1166 unsafe_ignore_missing_latest_api: true,
1167 }
1168
1169 java_library {
1170 name: "util",
1171 srcs: ["a.java"],
1172 min_sdk_version: "30",
1173 }
1174 `)
1175
1176 preparer.
1177 RunTestWithBp(t, `
1178 java_sdk_library {
1179 name: "sdklib",
1180 srcs: ["a.java"],
1181 libs: ["util"],
1182 impl_only_libs: ["util"],
1183 stub_only_libs: ["util"],
1184 stub_only_static_libs: ["util"],
1185 min_sdk_version: "30",
1186 unsafe_ignore_missing_latest_api: true,
1187 }
1188
1189 java_library {
1190 name: "util",
1191 srcs: ["a.java"],
1192 }
1193 `)
1194
1195 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1196 RunTestWithBp(t, `
1197 java_sdk_library {
1198 name: "sdklib",
1199 srcs: ["a.java"],
1200 static_libs: ["util"],
1201 min_sdk_version: "30",
1202 unsafe_ignore_missing_latest_api: true,
1203 }
1204
1205 java_library {
1206 name: "util",
1207 srcs: ["a.java"],
1208 min_sdk_version: "31",
1209 }
1210 `)
1211
1212 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1213 RunTestWithBp(t, `
1214 java_sdk_library {
1215 name: "sdklib",
1216 srcs: ["a.java"],
1217 static_libs: ["util"],
1218 min_sdk_version: "30",
1219 unsafe_ignore_missing_latest_api: true,
1220 }
1221
1222 java_library {
1223 name: "util",
1224 srcs: ["a.java"],
1225 static_libs: ["another_util"],
1226 min_sdk_version: "30",
1227 }
1228
1229 java_library {
1230 name: "another_util",
1231 srcs: ["a.java"],
1232 min_sdk_version: "31",
1233 }
1234 `)
1235}