blob: ea7b2f74f50af5b2ce85e9786a27e2ca7ccdbef8 [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
Paul Duffinbf4de042022-09-27 12:41:52 +0100878func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700879 result := android.GroupFixturePreparers(
880 prepareForJavaTest,
881 PrepareForTestWithJavaSdkLibraryFiles,
882 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100883 preparer,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700884 ).RunTestWithBp(t, `
885 java_sdk_library {
886 name: "sdklib",
887 srcs: ["a.java"],
888 sdk_version: "none",
889 system_modules: "none",
890 public: {
891 enabled: true,
892 },
893 }
894
895 java_sdk_library_import {
896 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +0100897 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -0700898 public: {
899 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100900 stub_srcs: ["a.java"],
901 current_api: "current.txt",
902 removed_api: "removed.txt",
903 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700904 },
905 }
Paul Duffinbf4de042022-09-27 12:41:52 +0100906
907 java_library {
908 name: "combined",
909 static_libs: [
910 "sdklib.stubs",
911 ],
912 java_resources: [
913 ":sdklib.stubs.source",
914 ":sdklib{.public.api.txt}",
915 ":sdklib{.public.removed-api.txt}",
916 ":sdklib{.public.annotations.zip}",
917 ],
918 sdk_version: "none",
919 system_modules: "none",
920 }
921
922 java_library {
923 name: "public",
924 srcs: ["a.java"],
925 libs: ["sdklib"],
926 sdk_version: "current",
927 }
Colin Cross1d2b6b32021-06-01 13:18:08 -0700928 `)
929
930 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -0700931 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +0000932 `sdklib-removed.api.public.latest`,
933 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700934 `sdklib.impl`,
935 `sdklib.stubs`,
936 `sdklib.stubs.source`,
937 `sdklib.xml`,
938 })
939
940 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000941 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700942 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +0100943 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700944 `sdklib.impl`,
945 `sdklib.xml`,
946 })
Paul Duffinbf4de042022-09-27 12:41:52 +0100947
948 // Make sure that dependencies on child modules use the prebuilt when preferred.
949 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
950 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
951 `prebuilt_sdklib`,
952 `prebuilt_sdklib`,
953 `prebuilt_sdklib`,
954 `prebuilt_sdklib.stubs`,
955 `prebuilt_sdklib.stubs.source`,
956 })
957
958 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
959 // prebuilt library.
960 public := result.ModuleForTests("public", "android_common")
961 rule := public.Output("javac/public.jar")
962 inputs := rule.Implicits.Strings()
963 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
964 if !android.InList(expected, inputs) {
965 t.Errorf("expected %q to contain %q", inputs, expected)
966 }
967}
968
969func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
970 t.Run("prefer", func(t *testing.T) {
971 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
972 })
973
974 t.Run("use_source_config_var", func(t *testing.T) {
975 testJavaSdkLibraryImport_Preferred(t,
976 "use_source_config_var: {config_namespace: \"acme\", var_name: \"use_source\"},",
977 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
978 variables.VendorVars = map[string]map[string]string{
979 "acme": {
980 "use_source": "false",
981 },
982 }
983 }))
984 })
Colin Cross1d2b6b32021-06-01 13:18:08 -0700985}
986
987func TestJavaSdkLibraryEnforce(t *testing.T) {
988 partitionToBpOption := func(partition string) string {
989 switch partition {
990 case "system":
991 return ""
992 case "vendor":
993 return "soc_specific: true,"
994 case "product":
995 return "product_specific: true,"
996 default:
997 panic("Invalid partition group name: " + partition)
998 }
999 }
1000
1001 type testConfigInfo struct {
1002 libraryType string
1003 fromPartition string
1004 toPartition string
1005 enforceVendorInterface bool
1006 enforceProductInterface bool
1007 enforceJavaSdkLibraryCheck bool
1008 allowList []string
1009 }
1010
1011 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1012 bpFileTemplate := `
1013 java_library {
1014 name: "foo",
1015 srcs: ["foo.java"],
1016 libs: ["bar"],
1017 sdk_version: "current",
1018 %s
1019 }
1020
1021 %s {
1022 name: "bar",
1023 srcs: ["bar.java"],
1024 sdk_version: "current",
1025 %s
1026 }
1027 `
1028
1029 bpFile := fmt.Sprintf(bpFileTemplate,
1030 partitionToBpOption(info.fromPartition),
1031 info.libraryType,
1032 partitionToBpOption(info.toPartition))
1033
1034 return android.GroupFixturePreparers(
1035 PrepareForTestWithJavaSdkLibraryFiles,
1036 FixtureWithLastReleaseApis("bar"),
1037 android.FixtureWithRootAndroidBp(bpFile),
1038 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1039 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
1040 if info.enforceVendorInterface {
1041 variables.DeviceVndkVersion = proptools.StringPtr("current")
1042 }
1043 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1044 variables.InterPartitionJavaLibraryAllowList = info.allowList
1045 }),
1046 )
1047 }
1048
1049 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1050 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1051 errorHandler := android.FixtureExpectsNoErrors
1052 if expectedErrorPattern != "" {
1053 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1054 }
1055 android.GroupFixturePreparers(
1056 prepareForJavaTest,
1057 createPreparer(info),
1058 ).
1059 ExtendWithErrorHandler(errorHandler).
1060 RunTest(t)
1061 })
1062 }
1063
1064 errorMessage := "is not allowed across the partitions"
1065
1066 runTest(t, testConfigInfo{
1067 libraryType: "java_library",
1068 fromPartition: "product",
1069 toPartition: "system",
1070 enforceVendorInterface: true,
1071 enforceProductInterface: true,
1072 enforceJavaSdkLibraryCheck: false,
1073 }, "")
1074
1075 runTest(t, testConfigInfo{
1076 libraryType: "java_library",
1077 fromPartition: "product",
1078 toPartition: "system",
1079 enforceVendorInterface: true,
1080 enforceProductInterface: false,
1081 enforceJavaSdkLibraryCheck: true,
1082 }, "")
1083
1084 runTest(t, testConfigInfo{
1085 libraryType: "java_library",
1086 fromPartition: "product",
1087 toPartition: "system",
1088 enforceVendorInterface: true,
1089 enforceProductInterface: true,
1090 enforceJavaSdkLibraryCheck: true,
1091 }, errorMessage)
1092
1093 runTest(t, testConfigInfo{
1094 libraryType: "java_library",
1095 fromPartition: "vendor",
1096 toPartition: "system",
1097 enforceVendorInterface: true,
1098 enforceProductInterface: true,
1099 enforceJavaSdkLibraryCheck: true,
1100 }, errorMessage)
1101
1102 runTest(t, testConfigInfo{
1103 libraryType: "java_library",
1104 fromPartition: "vendor",
1105 toPartition: "system",
1106 enforceVendorInterface: true,
1107 enforceProductInterface: true,
1108 enforceJavaSdkLibraryCheck: true,
1109 allowList: []string{"bar"},
1110 }, "")
1111
1112 runTest(t, testConfigInfo{
1113 libraryType: "java_library",
1114 fromPartition: "vendor",
1115 toPartition: "product",
1116 enforceVendorInterface: true,
1117 enforceProductInterface: true,
1118 enforceJavaSdkLibraryCheck: true,
1119 }, errorMessage)
1120
1121 runTest(t, testConfigInfo{
1122 libraryType: "java_sdk_library",
1123 fromPartition: "product",
1124 toPartition: "system",
1125 enforceVendorInterface: true,
1126 enforceProductInterface: true,
1127 enforceJavaSdkLibraryCheck: true,
1128 }, "")
1129
1130 runTest(t, testConfigInfo{
1131 libraryType: "java_sdk_library",
1132 fromPartition: "vendor",
1133 toPartition: "system",
1134 enforceVendorInterface: true,
1135 enforceProductInterface: true,
1136 enforceJavaSdkLibraryCheck: true,
1137 }, "")
1138
1139 runTest(t, testConfigInfo{
1140 libraryType: "java_sdk_library",
1141 fromPartition: "vendor",
1142 toPartition: "product",
1143 enforceVendorInterface: true,
1144 enforceProductInterface: true,
1145 enforceJavaSdkLibraryCheck: true,
1146 }, "")
1147}
Colin Cross30c491b2021-06-01 13:39:09 -07001148
1149func TestJavaSdkLibraryDist(t *testing.T) {
1150 result := android.GroupFixturePreparers(
1151 PrepareForTestWithJavaBuildComponents,
1152 PrepareForTestWithJavaDefaultModules,
1153 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001154 FixtureWithLastReleaseApis(
1155 "sdklib_no_group",
1156 "sdklib_group_foo",
1157 "sdklib_owner_foo",
1158 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001159 ).RunTestWithBp(t, `
1160 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001161 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001162 srcs: ["foo.java"],
1163 }
1164
1165 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001166 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001167 srcs: ["foo.java"],
1168 dist_group: "foo",
1169 }
1170
1171 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001172 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001173 srcs: ["foo.java"],
1174 owner: "foo",
1175 }
1176
1177 java_sdk_library {
1178 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001179 srcs: ["foo.java"],
1180 dist_stem: "foo",
1181 }
Colin Cross30c491b2021-06-01 13:39:09 -07001182 `)
1183
1184 type testCase struct {
1185 module string
1186 distDir string
1187 distStem string
1188 }
1189 testCases := []testCase{
1190 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001191 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001192 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001193 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001194 },
1195 {
Colin Cross986b69a2021-06-01 13:13:40 -07001196 module: "sdklib_group_foo",
1197 distDir: "apistubs/foo/public",
1198 distStem: "sdklib_group_foo.jar",
1199 },
1200 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001201 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001202 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001203 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001204 distStem: "sdklib_owner_foo.jar",
1205 },
1206 {
1207 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001208 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001209 distStem: "foo.jar",
1210 },
Colin Cross30c491b2021-06-01 13:39:09 -07001211 }
1212
1213 for _, tt := range testCases {
1214 t.Run(tt.module, func(t *testing.T) {
1215 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1216 dists := m.Dists()
1217 if len(dists) != 1 {
1218 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1219 }
1220 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1221 t.Errorf("expected dist dir %q, got %q", w, g)
1222 }
1223 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1224 t.Errorf("expected dist stem %q, got %q", w, g)
1225 }
1226 })
1227 }
1228}
satayev8f088b02021-12-06 11:40:46 +00001229
1230func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1231 preparer := android.GroupFixturePreparers(
1232 PrepareForTestWithJavaBuildComponents,
1233 PrepareForTestWithJavaDefaultModules,
1234 PrepareForTestWithJavaSdkLibraryFiles,
1235 )
1236
1237 preparer.RunTestWithBp(t, `
1238 java_sdk_library {
1239 name: "sdklib",
1240 srcs: ["a.java"],
1241 static_libs: ["util"],
1242 min_sdk_version: "30",
1243 unsafe_ignore_missing_latest_api: true,
1244 }
1245
1246 java_library {
1247 name: "util",
1248 srcs: ["a.java"],
1249 min_sdk_version: "30",
1250 }
1251 `)
1252
1253 preparer.
1254 RunTestWithBp(t, `
1255 java_sdk_library {
1256 name: "sdklib",
1257 srcs: ["a.java"],
1258 libs: ["util"],
1259 impl_only_libs: ["util"],
1260 stub_only_libs: ["util"],
1261 stub_only_static_libs: ["util"],
1262 min_sdk_version: "30",
1263 unsafe_ignore_missing_latest_api: true,
1264 }
1265
1266 java_library {
1267 name: "util",
1268 srcs: ["a.java"],
1269 }
1270 `)
1271
1272 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1273 RunTestWithBp(t, `
1274 java_sdk_library {
1275 name: "sdklib",
1276 srcs: ["a.java"],
1277 static_libs: ["util"],
1278 min_sdk_version: "30",
1279 unsafe_ignore_missing_latest_api: true,
1280 }
1281
1282 java_library {
1283 name: "util",
1284 srcs: ["a.java"],
1285 min_sdk_version: "31",
1286 }
1287 `)
1288
1289 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1290 RunTestWithBp(t, `
1291 java_sdk_library {
1292 name: "sdklib",
1293 srcs: ["a.java"],
1294 static_libs: ["util"],
1295 min_sdk_version: "30",
1296 unsafe_ignore_missing_latest_api: true,
1297 }
1298
1299 java_library {
1300 name: "util",
1301 srcs: ["a.java"],
1302 static_libs: ["another_util"],
1303 min_sdk_version: "30",
1304 }
1305
1306 java_library {
1307 name: "another_util",
1308 srcs: ["a.java"],
1309 min_sdk_version: "31",
1310 }
1311 `)
1312}