blob: 65af9531468769a1c0dead3e0fcba05355531a66 [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 }
110 `)
111
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 Duffinb97b1572021-04-29 21:50:40 +0100125 exportedComponentsInfo := result.ModuleProvider(foo.Module(), ExportedComponentsInfoProvider).(ExportedComponentsInfo)
126 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 {
159 sdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
160 android.AssertDeepEquals(t, "qux exports", []string{"foo", "bar", "fred", "quuz"}, sdkLibs)
161 }
162}
163
164func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
165 result := android.GroupFixturePreparers(
166 prepareForJavaTest,
167 PrepareForTestWithJavaSdkLibraryFiles,
168 FixtureWithLastReleaseApis("sdklib"),
169 ).RunTestWithBp(t, `
170 java_sdk_library {
171 name: "sdklib",
172 srcs: ["a.java"],
173 libs: ["lib"],
174 static_libs: ["static-lib"],
175 impl_only_libs: ["impl-only-lib"],
176 stub_only_libs: ["stub-only-lib"],
177 stub_only_static_libs: ["stub-only-static-lib"],
178 }
179 java_defaults {
180 name: "defaults",
181 srcs: ["a.java"],
182 sdk_version: "current",
183 }
184 java_library { name: "lib", defaults: ["defaults"] }
185 java_library { name: "static-lib", defaults: ["defaults"] }
186 java_library { name: "impl-only-lib", defaults: ["defaults"] }
187 java_library { name: "stub-only-lib", defaults: ["defaults"] }
188 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
189 `)
190 var expectations = []struct {
191 lib string
192 on_impl_classpath bool
193 on_stub_classpath bool
194 in_impl_combined bool
195 in_stub_combined bool
196 }{
197 {lib: "lib", on_impl_classpath: true},
198 {lib: "static-lib", in_impl_combined: true},
199 {lib: "impl-only-lib", on_impl_classpath: true},
200 {lib: "stub-only-lib", on_stub_classpath: true},
201 {lib: "stub-only-static-lib", in_stub_combined: true},
202 }
203 verify := func(sdklib, dep string, cp, combined bool) {
204 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
205 expected := cp || combined // Every combined jar is also on the classpath.
206 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
207
208 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
209 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
210 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
211 }
212 for _, expectation := range expectations {
213 verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
214 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
215
216 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
217 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
218 }
219}
220
221func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
222 result := android.GroupFixturePreparers(
223 prepareForJavaTest,
224 PrepareForTestWithJavaSdkLibraryFiles,
225 FixtureWithLastReleaseApis("foo"),
226 ).RunTestWithBp(t, `
227 java_sdk_library {
228 name: "foo",
229 srcs: ["a.java"],
230 api_only: true,
231 public: {
232 enabled: true,
233 },
234 }
235
236 java_library {
237 name: "bar",
238 srcs: ["b.java"],
239 libs: ["foo"],
240 }
241 `)
242
243 // The bar library should depend on the stubs jar.
244 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
245 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
246 t.Errorf("expected %q, found %#q", expected, actual)
247 }
248}
249
250func TestJavaSdkLibrary_UseSourcesFromAnotherSdkLibrary(t *testing.T) {
251 android.GroupFixturePreparers(
252 prepareForJavaTest,
253 PrepareForTestWithJavaSdkLibraryFiles,
254 FixtureWithLastReleaseApis("foo"),
255 ).RunTestWithBp(t, `
256 java_sdk_library {
257 name: "foo",
258 srcs: ["a.java"],
259 api_packages: ["foo"],
260 public: {
261 enabled: true,
262 },
263 }
264
265 java_library {
266 name: "bar",
267 srcs: ["b.java", ":foo{.public.stubs.source}"],
268 }
269 `)
270}
271
272func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
273 android.GroupFixturePreparers(
274 prepareForJavaTest,
275 PrepareForTestWithJavaSdkLibraryFiles,
276 FixtureWithLastReleaseApis("foo"),
277 ).
278 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
279 RunTestWithBp(t, `
280 java_sdk_library {
281 name: "foo",
282 srcs: ["a.java"],
283 api_packages: ["foo"],
284 public: {
285 enabled: true,
286 },
287 }
288
289 java_library {
290 name: "bar",
291 srcs: ["b.java", ":foo{.system.stubs.source}"],
292 }
293 `)
294}
295
296func TestJavaSdkLibrary_Deps(t *testing.T) {
297 result := android.GroupFixturePreparers(
298 prepareForJavaTest,
299 PrepareForTestWithJavaSdkLibraryFiles,
300 FixtureWithLastReleaseApis("sdklib"),
301 ).RunTestWithBp(t, `
302 java_sdk_library {
303 name: "sdklib",
304 srcs: ["a.java"],
305 sdk_version: "none",
306 system_modules: "none",
307 public: {
308 enabled: true,
309 },
310 }
311 `)
312
313 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
314 `dex2oatd`,
315 `sdklib.impl`,
316 `sdklib.stubs`,
317 `sdklib.stubs.source`,
318 `sdklib.xml`,
319 })
320}
321
322func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
323 prepareForJavaTest.RunTestWithBp(t, `
324 java_sdk_library_import {
325 name: "foo",
326 public: {
327 jars: ["a.jar"],
328 stub_srcs: ["a.java"],
329 current_api: "api/current.txt",
330 removed_api: "api/removed.txt",
331 },
332 }
333
334 java_library {
335 name: "bar",
336 srcs: [":foo{.public.stubs.source}"],
337 java_resources: [
338 ":foo{.public.api.txt}",
339 ":foo{.public.removed-api.txt}",
340 ],
341 }
342 `)
343}
344
345func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
346 bp := `
347 java_sdk_library_import {
348 name: "foo",
349 public: {
350 jars: ["a.jar"],
351 },
352 }
353 `
354
355 t.Run("stubs.source", func(t *testing.T) {
356 prepareForJavaTest.
357 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
358 RunTestWithBp(t, bp+`
359 java_library {
360 name: "bar",
361 srcs: [":foo{.public.stubs.source}"],
362 java_resources: [
363 ":foo{.public.api.txt}",
364 ":foo{.public.removed-api.txt}",
365 ],
366 }
367 `)
368 })
369
370 t.Run("api.txt", func(t *testing.T) {
371 prepareForJavaTest.
372 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
373 RunTestWithBp(t, bp+`
374 java_library {
375 name: "bar",
376 srcs: ["a.java"],
377 java_resources: [
378 ":foo{.public.api.txt}",
379 ],
380 }
381 `)
382 })
383
384 t.Run("removed-api.txt", func(t *testing.T) {
385 prepareForJavaTest.
386 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
387 RunTestWithBp(t, bp+`
388 java_library {
389 name: "bar",
390 srcs: ["a.java"],
391 java_resources: [
392 ":foo{.public.removed-api.txt}",
393 ],
394 }
395 `)
396 })
397}
398
399func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
400 prepareForJavaTest.
401 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
402 RunTestWithBp(t, `
403 java_sdk_library {
404 name: "foo",
405 srcs: ["a.java", "b.java"],
406 api_packages: ["foo"],
407 // Explicitly disable public to test the check that ensures the set of enabled
408 // scopes is consistent.
409 public: {
410 enabled: false,
411 },
412 system: {
413 enabled: true,
414 },
415 }
416 `)
417}
418
419func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
420 android.GroupFixturePreparers(
421 prepareForJavaTest,
422 PrepareForTestWithJavaSdkLibraryFiles,
423 FixtureWithLastReleaseApis("foo"),
424 ).RunTestWithBp(t, `
425 java_sdk_library {
426 name: "foo",
427 srcs: ["a.java", "b.java"],
428 api_packages: ["foo"],
429 system: {
430 enabled: true,
431 sdk_version: "module_current",
432 },
433 }
434 `)
435}
436
437func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
438 android.GroupFixturePreparers(
439 prepareForJavaTest,
440 PrepareForTestWithJavaSdkLibraryFiles,
441 FixtureWithLastReleaseApis("foo"),
442 ).RunTestWithBp(t, `
443 java_sdk_library {
444 name: "foo",
445 srcs: ["a.java", "b.java"],
446 api_packages: ["foo"],
447 system: {
448 enabled: true,
449 },
450 module_lib: {
451 enabled: true,
452 },
453 }
454 `)
455}
456
457func TestJavaSdkLibrary_SystemServer(t *testing.T) {
458 android.GroupFixturePreparers(
459 prepareForJavaTest,
460 PrepareForTestWithJavaSdkLibraryFiles,
461 FixtureWithLastReleaseApis("foo"),
462 ).RunTestWithBp(t, `
463 java_sdk_library {
464 name: "foo",
465 srcs: ["a.java", "b.java"],
466 api_packages: ["foo"],
467 system: {
468 enabled: true,
469 },
470 system_server: {
471 enabled: true,
472 },
473 }
474 `)
475}
476
477func TestJavaSdkLibrary_MissingScope(t *testing.T) {
478 prepareForJavaTest.
479 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
480 RunTestWithBp(t, `
481 java_sdk_library {
482 name: "foo",
483 srcs: ["a.java"],
484 public: {
485 enabled: false,
486 },
487 }
488
489 java_library {
490 name: "baz",
491 srcs: ["a.java"],
492 libs: ["foo"],
493 sdk_version: "module_current",
494 }
495 `)
496}
497
498func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
499 android.GroupFixturePreparers(
500 prepareForJavaTest,
501 PrepareForTestWithJavaSdkLibraryFiles,
502 FixtureWithLastReleaseApis("foo"),
503 ).RunTestWithBp(t, `
504 java_sdk_library {
505 name: "foo",
506 srcs: ["a.java"],
507 system: {
508 enabled: true,
509 },
510 }
511
512 java_library {
513 name: "baz",
514 srcs: ["a.java"],
515 libs: ["foo"],
516 // foo does not have module-lib scope so it should fallback to system
517 sdk_version: "module_current",
518 }
519 `)
520}
521
522func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
523 result := android.GroupFixturePreparers(
524 prepareForJavaTest,
525 PrepareForTestWithJavaSdkLibraryFiles,
526 FixtureWithLastReleaseApis("foo"),
527 ).RunTestWithBp(t, `
528 java_sdk_library {
529 name: "foo",
530 srcs: ["a.java"],
531 system: {
532 enabled: true,
533 },
534 default_to_stubs: true,
535 }
536
537 java_library {
538 name: "baz",
539 srcs: ["a.java"],
540 libs: ["foo"],
541 // does not have sdk_version set, should fallback to module,
542 // which will then fallback to system because the module scope
543 // is not enabled.
544 }
545 `)
546 // The baz library should depend on the system stubs jar.
547 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
548 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
549 t.Errorf("expected %q, found %#q", expected, actual)
550 }
551}
552
553func TestJavaSdkLibraryImport(t *testing.T) {
554 result := prepareForJavaTest.RunTestWithBp(t, `
555 java_library {
556 name: "foo",
557 srcs: ["a.java"],
558 libs: ["sdklib"],
559 sdk_version: "current",
560 }
561
562 java_library {
563 name: "foo.system",
564 srcs: ["a.java"],
565 libs: ["sdklib"],
566 sdk_version: "system_current",
567 }
568
569 java_library {
570 name: "foo.test",
571 srcs: ["a.java"],
572 libs: ["sdklib"],
573 sdk_version: "test_current",
574 }
575
576 java_sdk_library_import {
577 name: "sdklib",
578 public: {
579 jars: ["a.jar"],
580 },
581 system: {
582 jars: ["b.jar"],
583 },
584 test: {
585 jars: ["c.jar"],
586 stub_srcs: ["c.java"],
587 },
588 }
589 `)
590
591 for _, scope := range []string{"", ".system", ".test"} {
592 fooModule := result.ModuleForTests("foo"+scope, "android_common")
593 javac := fooModule.Rule("javac")
594
595 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
596 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
597 }
598
599 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
600 `prebuilt_sdklib.stubs`,
601 `prebuilt_sdklib.stubs.source.test`,
602 `prebuilt_sdklib.stubs.system`,
603 `prebuilt_sdklib.stubs.test`,
604 })
605}
606
607func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
608 result := android.GroupFixturePreparers(
609 prepareForJavaTest,
610 PrepareForTestWithJavaSdkLibraryFiles,
611 FixtureWithLastReleaseApis("sdklib"),
612 ).RunTestWithBp(t, `
613 java_sdk_library {
614 name: "sdklib",
615 srcs: ["a.java"],
616 sdk_version: "none",
617 system_modules: "none",
618 public: {
619 enabled: true,
620 },
621 }
622
623 java_sdk_library_import {
624 name: "sdklib",
625 public: {
626 jars: ["a.jar"],
627 },
628 }
629 `)
630
631 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
632 `dex2oatd`,
633 `prebuilt_sdklib`,
634 `sdklib.impl`,
635 `sdklib.stubs`,
636 `sdklib.stubs.source`,
637 `sdklib.xml`,
638 })
639
640 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
641 `prebuilt_sdklib.stubs`,
642 `sdklib.impl`,
643 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
644 // dependency is added after prebuilts may have been renamed and so has to use
645 // the renamed name.
646 `sdklib.xml`,
647 })
648}
649
650func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
651 result := android.GroupFixturePreparers(
652 prepareForJavaTest,
653 PrepareForTestWithJavaSdkLibraryFiles,
654 FixtureWithLastReleaseApis("sdklib"),
655 ).RunTestWithBp(t, `
656 java_sdk_library {
657 name: "sdklib",
658 srcs: ["a.java"],
659 sdk_version: "none",
660 system_modules: "none",
661 public: {
662 enabled: true,
663 },
664 }
665
666 java_sdk_library_import {
667 name: "sdklib",
668 prefer: true,
669 public: {
670 jars: ["a.jar"],
671 },
672 }
673 `)
674
675 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
676 `dex2oatd`,
677 `prebuilt_sdklib`,
678 `sdklib.impl`,
679 `sdklib.stubs`,
680 `sdklib.stubs.source`,
681 `sdklib.xml`,
682 })
683
684 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
685 `prebuilt_sdklib.stubs`,
686 `sdklib.impl`,
687 `sdklib.xml`,
688 })
689}
690
691func TestJavaSdkLibraryEnforce(t *testing.T) {
692 partitionToBpOption := func(partition string) string {
693 switch partition {
694 case "system":
695 return ""
696 case "vendor":
697 return "soc_specific: true,"
698 case "product":
699 return "product_specific: true,"
700 default:
701 panic("Invalid partition group name: " + partition)
702 }
703 }
704
705 type testConfigInfo struct {
706 libraryType string
707 fromPartition string
708 toPartition string
709 enforceVendorInterface bool
710 enforceProductInterface bool
711 enforceJavaSdkLibraryCheck bool
712 allowList []string
713 }
714
715 createPreparer := func(info testConfigInfo) android.FixturePreparer {
716 bpFileTemplate := `
717 java_library {
718 name: "foo",
719 srcs: ["foo.java"],
720 libs: ["bar"],
721 sdk_version: "current",
722 %s
723 }
724
725 %s {
726 name: "bar",
727 srcs: ["bar.java"],
728 sdk_version: "current",
729 %s
730 }
731 `
732
733 bpFile := fmt.Sprintf(bpFileTemplate,
734 partitionToBpOption(info.fromPartition),
735 info.libraryType,
736 partitionToBpOption(info.toPartition))
737
738 return android.GroupFixturePreparers(
739 PrepareForTestWithJavaSdkLibraryFiles,
740 FixtureWithLastReleaseApis("bar"),
741 android.FixtureWithRootAndroidBp(bpFile),
742 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
743 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
744 if info.enforceVendorInterface {
745 variables.DeviceVndkVersion = proptools.StringPtr("current")
746 }
747 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
748 variables.InterPartitionJavaLibraryAllowList = info.allowList
749 }),
750 )
751 }
752
753 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
754 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
755 errorHandler := android.FixtureExpectsNoErrors
756 if expectedErrorPattern != "" {
757 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
758 }
759 android.GroupFixturePreparers(
760 prepareForJavaTest,
761 createPreparer(info),
762 ).
763 ExtendWithErrorHandler(errorHandler).
764 RunTest(t)
765 })
766 }
767
768 errorMessage := "is not allowed across the partitions"
769
770 runTest(t, testConfigInfo{
771 libraryType: "java_library",
772 fromPartition: "product",
773 toPartition: "system",
774 enforceVendorInterface: true,
775 enforceProductInterface: true,
776 enforceJavaSdkLibraryCheck: false,
777 }, "")
778
779 runTest(t, testConfigInfo{
780 libraryType: "java_library",
781 fromPartition: "product",
782 toPartition: "system",
783 enforceVendorInterface: true,
784 enforceProductInterface: false,
785 enforceJavaSdkLibraryCheck: true,
786 }, "")
787
788 runTest(t, testConfigInfo{
789 libraryType: "java_library",
790 fromPartition: "product",
791 toPartition: "system",
792 enforceVendorInterface: true,
793 enforceProductInterface: true,
794 enforceJavaSdkLibraryCheck: true,
795 }, errorMessage)
796
797 runTest(t, testConfigInfo{
798 libraryType: "java_library",
799 fromPartition: "vendor",
800 toPartition: "system",
801 enforceVendorInterface: true,
802 enforceProductInterface: true,
803 enforceJavaSdkLibraryCheck: true,
804 }, errorMessage)
805
806 runTest(t, testConfigInfo{
807 libraryType: "java_library",
808 fromPartition: "vendor",
809 toPartition: "system",
810 enforceVendorInterface: true,
811 enforceProductInterface: true,
812 enforceJavaSdkLibraryCheck: true,
813 allowList: []string{"bar"},
814 }, "")
815
816 runTest(t, testConfigInfo{
817 libraryType: "java_library",
818 fromPartition: "vendor",
819 toPartition: "product",
820 enforceVendorInterface: true,
821 enforceProductInterface: true,
822 enforceJavaSdkLibraryCheck: true,
823 }, errorMessage)
824
825 runTest(t, testConfigInfo{
826 libraryType: "java_sdk_library",
827 fromPartition: "product",
828 toPartition: "system",
829 enforceVendorInterface: true,
830 enforceProductInterface: true,
831 enforceJavaSdkLibraryCheck: true,
832 }, "")
833
834 runTest(t, testConfigInfo{
835 libraryType: "java_sdk_library",
836 fromPartition: "vendor",
837 toPartition: "system",
838 enforceVendorInterface: true,
839 enforceProductInterface: true,
840 enforceJavaSdkLibraryCheck: true,
841 }, "")
842
843 runTest(t, testConfigInfo{
844 libraryType: "java_sdk_library",
845 fromPartition: "vendor",
846 toPartition: "product",
847 enforceVendorInterface: true,
848 enforceProductInterface: true,
849 enforceJavaSdkLibraryCheck: true,
850 }, "")
851}
Colin Cross30c491b2021-06-01 13:39:09 -0700852
853func TestJavaSdkLibraryDist(t *testing.T) {
854 result := android.GroupFixturePreparers(
855 PrepareForTestWithJavaBuildComponents,
856 PrepareForTestWithJavaDefaultModules,
857 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -0700858 FixtureWithLastReleaseApis(
859 "sdklib_no_group",
860 "sdklib_group_foo",
861 "sdklib_owner_foo",
862 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -0700863 ).RunTestWithBp(t, `
864 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -0700865 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -0700866 srcs: ["foo.java"],
867 }
868
869 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -0700870 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -0700871 srcs: ["foo.java"],
872 dist_group: "foo",
873 }
874
875 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -0700876 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -0700877 srcs: ["foo.java"],
878 owner: "foo",
879 }
880
881 java_sdk_library {
882 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -0700883 srcs: ["foo.java"],
884 dist_stem: "foo",
885 }
Colin Cross30c491b2021-06-01 13:39:09 -0700886 `)
887
888 type testCase struct {
889 module string
890 distDir string
891 distStem string
892 }
893 testCases := []testCase{
894 {
Colin Cross59b92bf2021-06-01 14:07:56 -0700895 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -0700896 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -0700897 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -0700898 },
899 {
Colin Cross986b69a2021-06-01 13:13:40 -0700900 module: "sdklib_group_foo",
901 distDir: "apistubs/foo/public",
902 distStem: "sdklib_group_foo.jar",
903 },
904 {
Colin Cross59b92bf2021-06-01 14:07:56 -0700905 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -0700906 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -0700907 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -0700908 distStem: "sdklib_owner_foo.jar",
909 },
910 {
911 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -0700912 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -0700913 distStem: "foo.jar",
914 },
Colin Cross30c491b2021-06-01 13:39:09 -0700915 }
916
917 for _, tt := range testCases {
918 t.Run(tt.module, func(t *testing.T) {
919 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
920 dists := m.Dists()
921 if len(dists) != 1 {
922 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
923 }
924 if g, w := String(dists[0].Dir), tt.distDir; g != w {
925 t.Errorf("expected dist dir %q, got %q", w, g)
926 }
927 if g, w := String(dists[0].Dest), tt.distStem; g != w {
928 t.Errorf("expected dist stem %q, got %q", w, g)
929 }
930 })
931 }
932}