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