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