blob: e22118b0bfa78029414bb79cbcfe292b7313644b [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 (
18 "android/soong/android"
19 "fmt"
20 "path/filepath"
21 "regexp"
22 "testing"
23
24 "github.com/google/blueprint/proptools"
25)
26
27func TestJavaSdkLibrary(t *testing.T) {
28 result := android.GroupFixturePreparers(
29 prepareForJavaTest,
30 PrepareForTestWithJavaSdkLibraryFiles,
31 FixtureWithPrebuiltApis(map[string][]string{
32 "28": {"foo"},
33 "29": {"foo"},
34 "30": {"bar", "barney", "baz", "betty", "foo", "fred", "quuz", "wilma"},
35 }),
36 ).RunTestWithBp(t, `
37 droiddoc_exported_dir {
38 name: "droiddoc-templates-sdk",
39 path: ".",
40 }
41 java_sdk_library {
42 name: "foo",
43 srcs: ["a.java", "b.java"],
44 api_packages: ["foo"],
45 }
46 java_sdk_library {
47 name: "bar",
48 srcs: ["a.java", "b.java"],
49 api_packages: ["bar"],
50 }
51 java_library {
52 name: "baz",
53 srcs: ["c.java"],
54 libs: ["foo", "bar.stubs"],
55 sdk_version: "system_current",
56 }
57 java_sdk_library {
58 name: "barney",
59 srcs: ["c.java"],
60 api_only: true,
61 }
62 java_sdk_library {
63 name: "betty",
64 srcs: ["c.java"],
65 shared_library: false,
66 }
67 java_sdk_library_import {
68 name: "quuz",
69 public: {
70 jars: ["c.jar"],
71 },
72 }
73 java_sdk_library_import {
74 name: "fred",
75 public: {
76 jars: ["b.jar"],
77 },
78 }
79 java_sdk_library_import {
80 name: "wilma",
81 public: {
82 jars: ["b.jar"],
83 },
84 shared_library: false,
85 }
86 java_library {
87 name: "qux",
88 srcs: ["c.java"],
89 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
90 sdk_version: "system_current",
91 }
92 java_library {
93 name: "baz-test",
94 srcs: ["c.java"],
95 libs: ["foo"],
96 sdk_version: "test_current",
97 }
98 java_library {
99 name: "baz-29",
100 srcs: ["c.java"],
101 libs: ["foo"],
102 sdk_version: "system_29",
103 }
104 java_library {
105 name: "baz-module-30",
106 srcs: ["c.java"],
107 libs: ["foo"],
108 sdk_version: "module_30",
109 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000110 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700111
112 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100113 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700114 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
115 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
116 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
117 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
118 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
119 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
120 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
121 result.ModuleForTests("foo.api.public.28", "")
122 result.ModuleForTests("foo.api.system.28", "")
123 result.ModuleForTests("foo.api.test.28", "")
124
Paul Duffin9fc208e2021-06-27 20:42:04 +0100125 exportedComponentsInfo := result.ModuleProvider(foo.Module(), android.ExportedComponentsInfoProvider).(android.ExportedComponentsInfo)
Paul Duffinb97b1572021-04-29 21:50:40 +0100126 expectedFooExportedComponents := []string{
127 "foo.stubs",
128 "foo.stubs.source",
129 "foo.stubs.source.system",
130 "foo.stubs.source.test",
131 "foo.stubs.system",
132 "foo.stubs.test",
133 }
134 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
135
Colin Cross1d2b6b32021-06-01 13:18:08 -0700136 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
137 // tests if baz is actually linked to the stubs lib
138 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
139 // ... and not to the impl lib
140 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
141 // test if baz is not linked to the system variant of foo
142 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
143
144 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
145 // tests if baz-test is actually linked to the test stubs lib
146 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
147
148 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
149 // tests if baz-29 is actually linked to the system 29 stubs lib
150 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
151
152 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
153 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
154 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
155
156 // test if baz has exported SDK lib names foo and bar to qux
157 qux := result.ModuleForTests("qux", "android_common")
158 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100159 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100160 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100161 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700162 }
163}
164
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000165func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
166 result := android.GroupFixturePreparers(
167 prepareForJavaTest,
168 PrepareForTestWithJavaSdkLibraryFiles,
169 FixtureWithPrebuiltApis(map[string][]string{
170 "28": {"foo"},
171 "29": {"foo"},
172 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
173 }),
174 ).RunTestWithBp(t,
175 `
176 java_sdk_library {
177 name: "fooUpdatable",
178 srcs: ["a.java", "b.java"],
179 api_packages: ["foo"],
180 on_bootclasspath_since: "29",
181 on_bootclasspath_before: "30",
182 min_device_sdk: "R",
183 max_device_sdk: "current",
184 }
185 java_sdk_library {
186 name: "foo",
187 srcs: ["a.java", "b.java"],
188 api_packages: ["foo"],
189 }
190`)
191 // test that updatability attributes are passed on correctly
192 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Rule("java_sdk_xml")
193 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on_bootclasspath_since=\"29\"`)
194 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on_bootclasspath_before=\"30\"`)
195 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `min_device_sdk=\"30\"`)
196 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `max_device_sdk=\"10000\"`)
197
198 // double check that updatability attributes are not written if they don't exist in the bp file
199 // the permissions file for the foo library defined above
200 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
201 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on_bootclasspath_since`)
202 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on_bootclasspath_before`)
203 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `min_device_sdk`)
204 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `max_device_sdk`)
205}
206
207func TestJavaSdkLibrary_UpdatableLibrary_Validation(t *testing.T) {
208 android.GroupFixturePreparers(
209 prepareForJavaTest,
210 PrepareForTestWithJavaSdkLibraryFiles,
211 FixtureWithPrebuiltApis(map[string][]string{
212 "30": {"fooUpdatable", "fooUpdatableErr"},
213 }),
214 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
215 []string{
216 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
217 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
218 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
219 `max_device_sdk: "ddd" could not be parsed as an integer and is not a recognized codename`,
220 })).RunTestWithBp(t,
221 `
222 java_sdk_library {
223 name: "fooUpdatableErr",
224 srcs: ["a.java", "b.java"],
225 api_packages: ["foo"],
226 on_bootclasspath_since: "aaa",
227 on_bootclasspath_before: "bbc",
228 min_device_sdk: "ccc",
229 max_device_sdk: "ddd",
230 }
231`)
232}
233
Colin Cross1d2b6b32021-06-01 13:18:08 -0700234func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
235 result := android.GroupFixturePreparers(
236 prepareForJavaTest,
237 PrepareForTestWithJavaSdkLibraryFiles,
238 FixtureWithLastReleaseApis("sdklib"),
239 ).RunTestWithBp(t, `
240 java_sdk_library {
241 name: "sdklib",
242 srcs: ["a.java"],
243 libs: ["lib"],
244 static_libs: ["static-lib"],
245 impl_only_libs: ["impl-only-lib"],
246 stub_only_libs: ["stub-only-lib"],
247 stub_only_static_libs: ["stub-only-static-lib"],
248 }
249 java_defaults {
250 name: "defaults",
251 srcs: ["a.java"],
252 sdk_version: "current",
253 }
254 java_library { name: "lib", defaults: ["defaults"] }
255 java_library { name: "static-lib", defaults: ["defaults"] }
256 java_library { name: "impl-only-lib", defaults: ["defaults"] }
257 java_library { name: "stub-only-lib", defaults: ["defaults"] }
258 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
259 `)
260 var expectations = []struct {
261 lib string
262 on_impl_classpath bool
263 on_stub_classpath bool
264 in_impl_combined bool
265 in_stub_combined bool
266 }{
267 {lib: "lib", on_impl_classpath: true},
268 {lib: "static-lib", in_impl_combined: true},
269 {lib: "impl-only-lib", on_impl_classpath: true},
270 {lib: "stub-only-lib", on_stub_classpath: true},
271 {lib: "stub-only-static-lib", in_stub_combined: true},
272 }
273 verify := func(sdklib, dep string, cp, combined bool) {
274 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
275 expected := cp || combined // Every combined jar is also on the classpath.
276 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
277
278 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
279 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
280 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
281 }
282 for _, expectation := range expectations {
283 verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
284 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
285
286 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
287 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
288 }
289}
290
291func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
292 result := android.GroupFixturePreparers(
293 prepareForJavaTest,
294 PrepareForTestWithJavaSdkLibraryFiles,
295 FixtureWithLastReleaseApis("foo"),
296 ).RunTestWithBp(t, `
297 java_sdk_library {
298 name: "foo",
299 srcs: ["a.java"],
300 api_only: true,
301 public: {
302 enabled: true,
303 },
304 }
305
306 java_library {
307 name: "bar",
308 srcs: ["b.java"],
309 libs: ["foo"],
310 }
311 `)
312
313 // The bar library should depend on the stubs jar.
314 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
315 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
316 t.Errorf("expected %q, found %#q", expected, actual)
317 }
318}
319
Anton Hanssond78eb762021-09-21 15:25:12 +0100320func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700321 android.GroupFixturePreparers(
322 prepareForJavaTest,
323 PrepareForTestWithJavaSdkLibraryFiles,
324 FixtureWithLastReleaseApis("foo"),
325 ).RunTestWithBp(t, `
326 java_sdk_library {
327 name: "foo",
328 srcs: ["a.java"],
329 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100330 annotations_enabled: true,
331 public: {
332 enabled: true,
333 },
334 }
335 java_library {
336 name: "bar",
337 srcs: ["b.java", ":foo{.public.stubs.source}"],
338 java_resources: [":foo{.public.annotations.zip}"],
339 }
340 `)
341}
342
343func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
344 android.GroupFixturePreparers(
345 prepareForJavaTest,
346 PrepareForTestWithJavaSdkLibraryFiles,
347 FixtureWithLastReleaseApis("foo"),
348 ).
349 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": path dependency ":foo{.public.annotations.zip}": annotations.zip not available for api scope public`)).
350 RunTestWithBp(t, `
351 java_sdk_library {
352 name: "foo",
353 srcs: ["a.java"],
354 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700355 public: {
356 enabled: true,
357 },
358 }
359
360 java_library {
361 name: "bar",
362 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100363 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700364 }
365 `)
366}
367
368func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
369 android.GroupFixturePreparers(
370 prepareForJavaTest,
371 PrepareForTestWithJavaSdkLibraryFiles,
372 FixtureWithLastReleaseApis("foo"),
373 ).
374 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
375 RunTestWithBp(t, `
376 java_sdk_library {
377 name: "foo",
378 srcs: ["a.java"],
379 api_packages: ["foo"],
380 public: {
381 enabled: true,
382 },
383 }
384
385 java_library {
386 name: "bar",
387 srcs: ["b.java", ":foo{.system.stubs.source}"],
388 }
389 `)
390}
391
392func TestJavaSdkLibrary_Deps(t *testing.T) {
393 result := android.GroupFixturePreparers(
394 prepareForJavaTest,
395 PrepareForTestWithJavaSdkLibraryFiles,
396 FixtureWithLastReleaseApis("sdklib"),
397 ).RunTestWithBp(t, `
398 java_sdk_library {
399 name: "sdklib",
400 srcs: ["a.java"],
401 sdk_version: "none",
402 system_modules: "none",
403 public: {
404 enabled: true,
405 },
406 }
407 `)
408
409 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
410 `dex2oatd`,
411 `sdklib.impl`,
412 `sdklib.stubs`,
413 `sdklib.stubs.source`,
414 `sdklib.xml`,
415 })
416}
417
418func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
419 prepareForJavaTest.RunTestWithBp(t, `
420 java_sdk_library_import {
421 name: "foo",
422 public: {
423 jars: ["a.jar"],
424 stub_srcs: ["a.java"],
425 current_api: "api/current.txt",
426 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100427 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700428 },
429 }
430
431 java_library {
432 name: "bar",
433 srcs: [":foo{.public.stubs.source}"],
434 java_resources: [
435 ":foo{.public.api.txt}",
436 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100437 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700438 ],
439 }
440 `)
441}
442
443func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
444 bp := `
445 java_sdk_library_import {
446 name: "foo",
447 public: {
448 jars: ["a.jar"],
449 },
450 }
451 `
452
453 t.Run("stubs.source", func(t *testing.T) {
454 prepareForJavaTest.
455 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
456 RunTestWithBp(t, bp+`
457 java_library {
458 name: "bar",
459 srcs: [":foo{.public.stubs.source}"],
460 java_resources: [
461 ":foo{.public.api.txt}",
462 ":foo{.public.removed-api.txt}",
463 ],
464 }
465 `)
466 })
467
468 t.Run("api.txt", func(t *testing.T) {
469 prepareForJavaTest.
470 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
471 RunTestWithBp(t, bp+`
472 java_library {
473 name: "bar",
474 srcs: ["a.java"],
475 java_resources: [
476 ":foo{.public.api.txt}",
477 ],
478 }
479 `)
480 })
481
482 t.Run("removed-api.txt", func(t *testing.T) {
483 prepareForJavaTest.
484 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
485 RunTestWithBp(t, bp+`
486 java_library {
487 name: "bar",
488 srcs: ["a.java"],
489 java_resources: [
490 ":foo{.public.removed-api.txt}",
491 ],
492 }
493 `)
494 })
495}
496
497func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
498 prepareForJavaTest.
499 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
500 RunTestWithBp(t, `
501 java_sdk_library {
502 name: "foo",
503 srcs: ["a.java", "b.java"],
504 api_packages: ["foo"],
505 // Explicitly disable public to test the check that ensures the set of enabled
506 // scopes is consistent.
507 public: {
508 enabled: false,
509 },
510 system: {
511 enabled: true,
512 },
513 }
514 `)
515}
516
517func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
518 android.GroupFixturePreparers(
519 prepareForJavaTest,
520 PrepareForTestWithJavaSdkLibraryFiles,
521 FixtureWithLastReleaseApis("foo"),
522 ).RunTestWithBp(t, `
523 java_sdk_library {
524 name: "foo",
525 srcs: ["a.java", "b.java"],
526 api_packages: ["foo"],
527 system: {
528 enabled: true,
529 sdk_version: "module_current",
530 },
531 }
532 `)
533}
534
535func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
536 android.GroupFixturePreparers(
537 prepareForJavaTest,
538 PrepareForTestWithJavaSdkLibraryFiles,
539 FixtureWithLastReleaseApis("foo"),
540 ).RunTestWithBp(t, `
541 java_sdk_library {
542 name: "foo",
543 srcs: ["a.java", "b.java"],
544 api_packages: ["foo"],
545 system: {
546 enabled: true,
547 },
548 module_lib: {
549 enabled: true,
550 },
551 }
552 `)
553}
554
555func TestJavaSdkLibrary_SystemServer(t *testing.T) {
556 android.GroupFixturePreparers(
557 prepareForJavaTest,
558 PrepareForTestWithJavaSdkLibraryFiles,
559 FixtureWithLastReleaseApis("foo"),
560 ).RunTestWithBp(t, `
561 java_sdk_library {
562 name: "foo",
563 srcs: ["a.java", "b.java"],
564 api_packages: ["foo"],
565 system: {
566 enabled: true,
567 },
568 system_server: {
569 enabled: true,
570 },
571 }
572 `)
573}
574
575func TestJavaSdkLibrary_MissingScope(t *testing.T) {
576 prepareForJavaTest.
577 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
578 RunTestWithBp(t, `
579 java_sdk_library {
580 name: "foo",
581 srcs: ["a.java"],
582 public: {
583 enabled: false,
584 },
585 }
586
587 java_library {
588 name: "baz",
589 srcs: ["a.java"],
590 libs: ["foo"],
591 sdk_version: "module_current",
592 }
593 `)
594}
595
596func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
597 android.GroupFixturePreparers(
598 prepareForJavaTest,
599 PrepareForTestWithJavaSdkLibraryFiles,
600 FixtureWithLastReleaseApis("foo"),
601 ).RunTestWithBp(t, `
602 java_sdk_library {
603 name: "foo",
604 srcs: ["a.java"],
605 system: {
606 enabled: true,
607 },
608 }
609
610 java_library {
611 name: "baz",
612 srcs: ["a.java"],
613 libs: ["foo"],
614 // foo does not have module-lib scope so it should fallback to system
615 sdk_version: "module_current",
616 }
617 `)
618}
619
620func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
621 result := android.GroupFixturePreparers(
622 prepareForJavaTest,
623 PrepareForTestWithJavaSdkLibraryFiles,
624 FixtureWithLastReleaseApis("foo"),
625 ).RunTestWithBp(t, `
626 java_sdk_library {
627 name: "foo",
628 srcs: ["a.java"],
629 system: {
630 enabled: true,
631 },
632 default_to_stubs: true,
633 }
634
635 java_library {
636 name: "baz",
637 srcs: ["a.java"],
638 libs: ["foo"],
639 // does not have sdk_version set, should fallback to module,
640 // which will then fallback to system because the module scope
641 // is not enabled.
642 }
643 `)
644 // The baz library should depend on the system stubs jar.
645 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
646 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
647 t.Errorf("expected %q, found %#q", expected, actual)
648 }
649}
650
651func TestJavaSdkLibraryImport(t *testing.T) {
652 result := prepareForJavaTest.RunTestWithBp(t, `
653 java_library {
654 name: "foo",
655 srcs: ["a.java"],
656 libs: ["sdklib"],
657 sdk_version: "current",
658 }
659
660 java_library {
661 name: "foo.system",
662 srcs: ["a.java"],
663 libs: ["sdklib"],
664 sdk_version: "system_current",
665 }
666
667 java_library {
668 name: "foo.test",
669 srcs: ["a.java"],
670 libs: ["sdklib"],
671 sdk_version: "test_current",
672 }
673
674 java_sdk_library_import {
675 name: "sdklib",
676 public: {
677 jars: ["a.jar"],
678 },
679 system: {
680 jars: ["b.jar"],
681 },
682 test: {
683 jars: ["c.jar"],
684 stub_srcs: ["c.java"],
685 },
686 }
687 `)
688
689 for _, scope := range []string{"", ".system", ".test"} {
690 fooModule := result.ModuleForTests("foo"+scope, "android_common")
691 javac := fooModule.Rule("javac")
692
693 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
694 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
695 }
696
697 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000698 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700699 `prebuilt_sdklib.stubs`,
700 `prebuilt_sdklib.stubs.source.test`,
701 `prebuilt_sdklib.stubs.system`,
702 `prebuilt_sdklib.stubs.test`,
703 })
704}
705
706func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
707 result := android.GroupFixturePreparers(
708 prepareForJavaTest,
709 PrepareForTestWithJavaSdkLibraryFiles,
710 FixtureWithLastReleaseApis("sdklib"),
711 ).RunTestWithBp(t, `
712 java_sdk_library {
713 name: "sdklib",
714 srcs: ["a.java"],
715 sdk_version: "none",
716 system_modules: "none",
717 public: {
718 enabled: true,
719 },
720 }
721
722 java_sdk_library_import {
723 name: "sdklib",
724 public: {
725 jars: ["a.jar"],
726 },
727 }
728 `)
729
730 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
731 `dex2oatd`,
732 `prebuilt_sdklib`,
733 `sdklib.impl`,
734 `sdklib.stubs`,
735 `sdklib.stubs.source`,
736 `sdklib.xml`,
737 })
738
739 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
740 `prebuilt_sdklib.stubs`,
741 `sdklib.impl`,
742 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
743 // dependency is added after prebuilts may have been renamed and so has to use
744 // the renamed name.
745 `sdklib.xml`,
746 })
747}
748
749func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
750 result := android.GroupFixturePreparers(
751 prepareForJavaTest,
752 PrepareForTestWithJavaSdkLibraryFiles,
753 FixtureWithLastReleaseApis("sdklib"),
754 ).RunTestWithBp(t, `
755 java_sdk_library {
756 name: "sdklib",
757 srcs: ["a.java"],
758 sdk_version: "none",
759 system_modules: "none",
760 public: {
761 enabled: true,
762 },
763 }
764
765 java_sdk_library_import {
766 name: "sdklib",
767 prefer: true,
768 public: {
769 jars: ["a.jar"],
770 },
771 }
772 `)
773
774 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -0700775 `prebuilt_sdklib`,
776 `sdklib.impl`,
777 `sdklib.stubs`,
778 `sdklib.stubs.source`,
779 `sdklib.xml`,
780 })
781
782 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000783 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700784 `prebuilt_sdklib.stubs`,
785 `sdklib.impl`,
786 `sdklib.xml`,
787 })
788}
789
790func TestJavaSdkLibraryEnforce(t *testing.T) {
791 partitionToBpOption := func(partition string) string {
792 switch partition {
793 case "system":
794 return ""
795 case "vendor":
796 return "soc_specific: true,"
797 case "product":
798 return "product_specific: true,"
799 default:
800 panic("Invalid partition group name: " + partition)
801 }
802 }
803
804 type testConfigInfo struct {
805 libraryType string
806 fromPartition string
807 toPartition string
808 enforceVendorInterface bool
809 enforceProductInterface bool
810 enforceJavaSdkLibraryCheck bool
811 allowList []string
812 }
813
814 createPreparer := func(info testConfigInfo) android.FixturePreparer {
815 bpFileTemplate := `
816 java_library {
817 name: "foo",
818 srcs: ["foo.java"],
819 libs: ["bar"],
820 sdk_version: "current",
821 %s
822 }
823
824 %s {
825 name: "bar",
826 srcs: ["bar.java"],
827 sdk_version: "current",
828 %s
829 }
830 `
831
832 bpFile := fmt.Sprintf(bpFileTemplate,
833 partitionToBpOption(info.fromPartition),
834 info.libraryType,
835 partitionToBpOption(info.toPartition))
836
837 return android.GroupFixturePreparers(
838 PrepareForTestWithJavaSdkLibraryFiles,
839 FixtureWithLastReleaseApis("bar"),
840 android.FixtureWithRootAndroidBp(bpFile),
841 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
842 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
843 if info.enforceVendorInterface {
844 variables.DeviceVndkVersion = proptools.StringPtr("current")
845 }
846 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
847 variables.InterPartitionJavaLibraryAllowList = info.allowList
848 }),
849 )
850 }
851
852 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
853 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
854 errorHandler := android.FixtureExpectsNoErrors
855 if expectedErrorPattern != "" {
856 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
857 }
858 android.GroupFixturePreparers(
859 prepareForJavaTest,
860 createPreparer(info),
861 ).
862 ExtendWithErrorHandler(errorHandler).
863 RunTest(t)
864 })
865 }
866
867 errorMessage := "is not allowed across the partitions"
868
869 runTest(t, testConfigInfo{
870 libraryType: "java_library",
871 fromPartition: "product",
872 toPartition: "system",
873 enforceVendorInterface: true,
874 enforceProductInterface: true,
875 enforceJavaSdkLibraryCheck: false,
876 }, "")
877
878 runTest(t, testConfigInfo{
879 libraryType: "java_library",
880 fromPartition: "product",
881 toPartition: "system",
882 enforceVendorInterface: true,
883 enforceProductInterface: false,
884 enforceJavaSdkLibraryCheck: true,
885 }, "")
886
887 runTest(t, testConfigInfo{
888 libraryType: "java_library",
889 fromPartition: "product",
890 toPartition: "system",
891 enforceVendorInterface: true,
892 enforceProductInterface: true,
893 enforceJavaSdkLibraryCheck: true,
894 }, errorMessage)
895
896 runTest(t, testConfigInfo{
897 libraryType: "java_library",
898 fromPartition: "vendor",
899 toPartition: "system",
900 enforceVendorInterface: true,
901 enforceProductInterface: true,
902 enforceJavaSdkLibraryCheck: true,
903 }, errorMessage)
904
905 runTest(t, testConfigInfo{
906 libraryType: "java_library",
907 fromPartition: "vendor",
908 toPartition: "system",
909 enforceVendorInterface: true,
910 enforceProductInterface: true,
911 enforceJavaSdkLibraryCheck: true,
912 allowList: []string{"bar"},
913 }, "")
914
915 runTest(t, testConfigInfo{
916 libraryType: "java_library",
917 fromPartition: "vendor",
918 toPartition: "product",
919 enforceVendorInterface: true,
920 enforceProductInterface: true,
921 enforceJavaSdkLibraryCheck: true,
922 }, errorMessage)
923
924 runTest(t, testConfigInfo{
925 libraryType: "java_sdk_library",
926 fromPartition: "product",
927 toPartition: "system",
928 enforceVendorInterface: true,
929 enforceProductInterface: true,
930 enforceJavaSdkLibraryCheck: true,
931 }, "")
932
933 runTest(t, testConfigInfo{
934 libraryType: "java_sdk_library",
935 fromPartition: "vendor",
936 toPartition: "system",
937 enforceVendorInterface: true,
938 enforceProductInterface: true,
939 enforceJavaSdkLibraryCheck: true,
940 }, "")
941
942 runTest(t, testConfigInfo{
943 libraryType: "java_sdk_library",
944 fromPartition: "vendor",
945 toPartition: "product",
946 enforceVendorInterface: true,
947 enforceProductInterface: true,
948 enforceJavaSdkLibraryCheck: true,
949 }, "")
950}
Colin Cross30c491b2021-06-01 13:39:09 -0700951
952func TestJavaSdkLibraryDist(t *testing.T) {
953 result := android.GroupFixturePreparers(
954 PrepareForTestWithJavaBuildComponents,
955 PrepareForTestWithJavaDefaultModules,
956 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -0700957 FixtureWithLastReleaseApis(
958 "sdklib_no_group",
959 "sdklib_group_foo",
960 "sdklib_owner_foo",
961 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -0700962 ).RunTestWithBp(t, `
963 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -0700964 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -0700965 srcs: ["foo.java"],
966 }
967
968 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -0700969 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -0700970 srcs: ["foo.java"],
971 dist_group: "foo",
972 }
973
974 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -0700975 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -0700976 srcs: ["foo.java"],
977 owner: "foo",
978 }
979
980 java_sdk_library {
981 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -0700982 srcs: ["foo.java"],
983 dist_stem: "foo",
984 }
Colin Cross30c491b2021-06-01 13:39:09 -0700985 `)
986
987 type testCase struct {
988 module string
989 distDir string
990 distStem string
991 }
992 testCases := []testCase{
993 {
Colin Cross59b92bf2021-06-01 14:07:56 -0700994 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -0700995 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -0700996 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -0700997 },
998 {
Colin Cross986b69a2021-06-01 13:13:40 -0700999 module: "sdklib_group_foo",
1000 distDir: "apistubs/foo/public",
1001 distStem: "sdklib_group_foo.jar",
1002 },
1003 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001004 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001005 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001006 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001007 distStem: "sdklib_owner_foo.jar",
1008 },
1009 {
1010 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001011 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001012 distStem: "foo.jar",
1013 },
Colin Cross30c491b2021-06-01 13:39:09 -07001014 }
1015
1016 for _, tt := range testCases {
1017 t.Run(tt.module, func(t *testing.T) {
1018 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1019 dists := m.Dists()
1020 if len(dists) != 1 {
1021 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1022 }
1023 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1024 t.Errorf("expected dist dir %q, got %q", w, g)
1025 }
1026 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1027 t.Errorf("expected dist stem %q, got %q", w, g)
1028 }
1029 })
1030 }
1031}