blob: 141e16bf7ad1f90f924fa58225b8de6e4063b2ae [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"
Paul Duffind0b9fca2022-09-30 18:11:41 +010021 "strings"
Colin Cross1d2b6b32021-06-01 13:18:08 -070022 "testing"
23
Pedro Loureiroc3621422021-09-28 15:40:23 +000024 "android/soong/android"
25
Colin Cross1d2b6b32021-06-01 13:18:08 -070026 "github.com/google/blueprint/proptools"
27)
28
29func TestJavaSdkLibrary(t *testing.T) {
30 result := android.GroupFixturePreparers(
31 prepareForJavaTest,
32 PrepareForTestWithJavaSdkLibraryFiles,
33 FixtureWithPrebuiltApis(map[string][]string{
34 "28": {"foo"},
35 "29": {"foo"},
36 "30": {"bar", "barney", "baz", "betty", "foo", "fred", "quuz", "wilma"},
37 }),
Jihoon Kang1c92c3e2023-03-23 17:44:51 +000038 android.FixtureModifyConfig(func(config android.Config) {
39 config.SetApiLibraries([]string{"foo"})
40 }),
Colin Cross1d2b6b32021-06-01 13:18:08 -070041 ).RunTestWithBp(t, `
42 droiddoc_exported_dir {
43 name: "droiddoc-templates-sdk",
44 path: ".",
45 }
46 java_sdk_library {
47 name: "foo",
48 srcs: ["a.java", "b.java"],
49 api_packages: ["foo"],
50 }
51 java_sdk_library {
52 name: "bar",
53 srcs: ["a.java", "b.java"],
54 api_packages: ["bar"],
Wei Li1e73c652021-12-06 13:35:11 -080055 exclude_kotlinc_generated_files: true,
Colin Cross1d2b6b32021-06-01 13:18:08 -070056 }
57 java_library {
58 name: "baz",
59 srcs: ["c.java"],
60 libs: ["foo", "bar.stubs"],
61 sdk_version: "system_current",
62 }
63 java_sdk_library {
64 name: "barney",
65 srcs: ["c.java"],
66 api_only: true,
67 }
68 java_sdk_library {
69 name: "betty",
70 srcs: ["c.java"],
71 shared_library: false,
72 }
73 java_sdk_library_import {
74 name: "quuz",
75 public: {
76 jars: ["c.jar"],
77 },
78 }
79 java_sdk_library_import {
80 name: "fred",
81 public: {
82 jars: ["b.jar"],
83 },
84 }
85 java_sdk_library_import {
86 name: "wilma",
87 public: {
88 jars: ["b.jar"],
89 },
90 shared_library: false,
91 }
92 java_library {
93 name: "qux",
94 srcs: ["c.java"],
95 libs: ["baz", "fred", "quuz.stubs", "wilma", "barney", "betty"],
96 sdk_version: "system_current",
97 }
98 java_library {
99 name: "baz-test",
100 srcs: ["c.java"],
101 libs: ["foo"],
102 sdk_version: "test_current",
103 }
104 java_library {
105 name: "baz-29",
106 srcs: ["c.java"],
107 libs: ["foo"],
108 sdk_version: "system_29",
109 }
110 java_library {
111 name: "baz-module-30",
112 srcs: ["c.java"],
113 libs: ["foo"],
114 sdk_version: "module_30",
115 }
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000116 `)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700117
118 // check the existence of the internal modules
Paul Duffinb97b1572021-04-29 21:50:40 +0100119 foo := result.ModuleForTests("foo", "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700120 result.ModuleForTests(apiScopePublic.stubsLibraryModuleName("foo"), "android_common")
121 result.ModuleForTests(apiScopeSystem.stubsLibraryModuleName("foo"), "android_common")
122 result.ModuleForTests(apiScopeTest.stubsLibraryModuleName("foo"), "android_common")
123 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo"), "android_common")
124 result.ModuleForTests(apiScopeSystem.stubsSourceModuleName("foo"), "android_common")
125 result.ModuleForTests(apiScopeTest.stubsSourceModuleName("foo"), "android_common")
Jihoon Kangd48abd52023-02-02 22:32:31 +0000126 result.ModuleForTests(apiScopePublic.stubsSourceModuleName("foo")+".api.contribution", "")
Jihoon Kang1c92c3e2023-03-23 17:44:51 +0000127 result.ModuleForTests(apiScopePublic.apiLibraryModuleName("foo"), "android_common")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700128 result.ModuleForTests("foo"+sdkXmlFileSuffix, "android_common")
129 result.ModuleForTests("foo.api.public.28", "")
130 result.ModuleForTests("foo.api.system.28", "")
131 result.ModuleForTests("foo.api.test.28", "")
132
Paul Duffin9fc208e2021-06-27 20:42:04 +0100133 exportedComponentsInfo := result.ModuleProvider(foo.Module(), android.ExportedComponentsInfoProvider).(android.ExportedComponentsInfo)
Paul Duffinb97b1572021-04-29 21:50:40 +0100134 expectedFooExportedComponents := []string{
Paul Duffin958806b2022-05-16 13:10:47 +0000135 "foo-removed.api.public.latest",
136 "foo-removed.api.system.latest",
137 "foo.api.public.latest",
138 "foo.api.system.latest",
Paul Duffinb97b1572021-04-29 21:50:40 +0100139 "foo.stubs",
140 "foo.stubs.source",
141 "foo.stubs.source.system",
142 "foo.stubs.source.test",
143 "foo.stubs.system",
144 "foo.stubs.test",
145 }
146 android.AssertArrayString(t, "foo exported components", expectedFooExportedComponents, exportedComponentsInfo.Components)
147
Colin Cross1d2b6b32021-06-01 13:18:08 -0700148 bazJavac := result.ModuleForTests("baz", "android_common").Rule("javac")
149 // tests if baz is actually linked to the stubs lib
150 android.AssertStringDoesContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.system.jar")
151 // ... and not to the impl lib
152 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.jar")
153 // test if baz is not linked to the system variant of foo
154 android.AssertStringDoesNotContain(t, "baz javac classpath", bazJavac.Args["classpath"], "foo.stubs.jar")
155
156 bazTestJavac := result.ModuleForTests("baz-test", "android_common").Rule("javac")
157 // tests if baz-test is actually linked to the test stubs lib
158 android.AssertStringDoesContain(t, "baz-test javac classpath", bazTestJavac.Args["classpath"], "foo.stubs.test.jar")
159
160 baz29Javac := result.ModuleForTests("baz-29", "android_common").Rule("javac")
161 // tests if baz-29 is actually linked to the system 29 stubs lib
162 android.AssertStringDoesContain(t, "baz-29 javac classpath", baz29Javac.Args["classpath"], "prebuilts/sdk/29/system/foo.jar")
163
164 bazModule30Javac := result.ModuleForTests("baz-module-30", "android_common").Rule("javac")
165 // tests if "baz-module-30" is actually linked to the module 30 stubs lib
166 android.AssertStringDoesContain(t, "baz-module-30 javac classpath", bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar")
167
168 // test if baz has exported SDK lib names foo and bar to qux
169 qux := result.ModuleForTests("qux", "android_common")
170 if quxLib, ok := qux.Module().(*Library); ok {
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100171 requiredSdkLibs, optionalSdkLibs := quxLib.ClassLoaderContexts().UsesLibs()
Ulya Trafimoviche4432872021-08-18 16:57:11 +0100172 android.AssertDeepEquals(t, "qux exports (required)", []string{"fred", "quuz", "foo", "bar"}, requiredSdkLibs)
Ulya Trafimovichfc0f6e32021-08-12 16:16:11 +0100173 android.AssertDeepEquals(t, "qux exports (optional)", []string{}, optionalSdkLibs)
Colin Cross1d2b6b32021-06-01 13:18:08 -0700174 }
Wei Li1e73c652021-12-06 13:35:11 -0800175
176 fooDexJar := result.ModuleForTests("foo", "android_common").Rule("d8")
177 // tests if kotlinc generated files are NOT excluded from output of foo.
178 android.AssertStringDoesNotContain(t, "foo dex", fooDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
179
180 barDexJar := result.ModuleForTests("bar", "android_common").Rule("d8")
181 // tests if kotlinc generated files are excluded from output of bar.
182 android.AssertStringDoesContain(t, "bar dex", barDexJar.BuildParams.Args["mergeZipsFlags"], "-stripFile META-INF/*.kotlin_module")
Colin Cross1d2b6b32021-06-01 13:18:08 -0700183}
184
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000185func TestJavaSdkLibrary_UpdatableLibrary(t *testing.T) {
186 result := android.GroupFixturePreparers(
187 prepareForJavaTest,
188 PrepareForTestWithJavaSdkLibraryFiles,
189 FixtureWithPrebuiltApis(map[string][]string{
190 "28": {"foo"},
191 "29": {"foo"},
192 "30": {"foo", "fooUpdatable", "fooUpdatableErr"},
193 }),
Pedro Loureiroc3621422021-09-28 15:40:23 +0000194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Pedro Loureirob638c622021-12-22 15:28:05 +0000195 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V", "W", "X"}
Pedro Loureiroc3621422021-09-28 15:40:23 +0000196 }),
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000197 ).RunTestWithBp(t,
198 `
199 java_sdk_library {
200 name: "fooUpdatable",
201 srcs: ["a.java", "b.java"],
202 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000203 on_bootclasspath_since: "U",
204 on_bootclasspath_before: "V",
205 min_device_sdk: "W",
Pedro Loureirob638c622021-12-22 15:28:05 +0000206 max_device_sdk: "X",
Pedro Loureiroc3621422021-09-28 15:40:23 +0000207 min_sdk_version: "S",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000208 }
209 java_sdk_library {
210 name: "foo",
211 srcs: ["a.java", "b.java"],
212 api_packages: ["foo"],
213 }
214`)
Pedro Loureirob638c622021-12-22 15:28:05 +0000215
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000216 // test that updatability attributes are passed on correctly
217 fooUpdatable := result.ModuleForTests("fooUpdatable.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureirob638c622021-12-22 15:28:05 +0000218 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-since=\"U\"`)
219 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `on-bootclasspath-before=\"V\"`)
220 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `min-device-sdk=\"W\"`)
221 android.AssertStringDoesContain(t, "fooUpdatable.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `max-device-sdk=\"X\"`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000222
223 // double check that updatability attributes are not written if they don't exist in the bp file
224 // the permissions file for the foo library defined above
225 fooPermissions := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiroba6682f2021-10-29 09:32:32 +0000226 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-since`)
227 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `on-bootclasspath-before`)
228 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `min-device-sdk`)
229 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooPermissions.RuleParams.Command, `max-device-sdk`)
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000230}
231
Pedro Loureiroc3621422021-09-28 15:40:23 +0000232func TestJavaSdkLibrary_UpdatableLibrary_Validation_ValidVersion(t *testing.T) {
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000233 android.GroupFixturePreparers(
234 prepareForJavaTest,
235 PrepareForTestWithJavaSdkLibraryFiles,
236 FixtureWithPrebuiltApis(map[string][]string{
237 "30": {"fooUpdatable", "fooUpdatableErr"},
238 }),
239 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
240 []string{
241 `on_bootclasspath_since: "aaa" could not be parsed as an integer and is not a recognized codename`,
242 `on_bootclasspath_before: "bbc" could not be parsed as an integer and is not a recognized codename`,
243 `min_device_sdk: "ccc" could not be parsed as an integer and is not a recognized codename`,
Pedro Loureirob638c622021-12-22 15:28:05 +0000244 `max_device_sdk: "current" is not an allowed value for this attribute`,
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000245 })).RunTestWithBp(t,
246 `
247 java_sdk_library {
248 name: "fooUpdatableErr",
249 srcs: ["a.java", "b.java"],
250 api_packages: ["foo"],
Pedro Loureiroc3621422021-09-28 15:40:23 +0000251 on_bootclasspath_since: "aaa",
252 on_bootclasspath_before: "bbc",
253 min_device_sdk: "ccc",
Pedro Loureirob638c622021-12-22 15:28:05 +0000254 max_device_sdk: "current",
Pedro Loureiro9956e5e2021-09-07 17:21:59 +0000255 }
256`)
257}
258
Pedro Loureiroc3621422021-09-28 15:40:23 +0000259func TestJavaSdkLibrary_UpdatableLibrary_Validation_AtLeastTAttributes(t *testing.T) {
260 android.GroupFixturePreparers(
261 prepareForJavaTest,
262 PrepareForTestWithJavaSdkLibraryFiles,
263 FixtureWithPrebuiltApis(map[string][]string{
264 "28": {"foo"},
265 }),
266 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
267 []string{
268 "on_bootclasspath_since: Attribute value needs to be at least T",
269 "on_bootclasspath_before: Attribute value needs to be at least T",
270 "min_device_sdk: Attribute value needs to be at least T",
271 "max_device_sdk: Attribute value needs to be at least T",
272 },
273 )).RunTestWithBp(t,
274 `
275 java_sdk_library {
276 name: "foo",
277 srcs: ["a.java", "b.java"],
278 api_packages: ["foo"],
279 on_bootclasspath_since: "S",
280 on_bootclasspath_before: "S",
281 min_device_sdk: "S",
282 max_device_sdk: "S",
283 min_sdk_version: "S",
284 }
285`)
286}
287
288func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdk(t *testing.T) {
289 android.GroupFixturePreparers(
290 prepareForJavaTest,
291 PrepareForTestWithJavaSdkLibraryFiles,
292 FixtureWithPrebuiltApis(map[string][]string{
293 "28": {"foo"},
294 }),
295 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
296 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
297 }),
298 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
299 []string{
300 "min_device_sdk can't be greater than max_device_sdk",
301 },
302 )).RunTestWithBp(t,
303 `
304 java_sdk_library {
305 name: "foo",
306 srcs: ["a.java", "b.java"],
307 api_packages: ["foo"],
308 min_device_sdk: "V",
309 max_device_sdk: "U",
310 min_sdk_version: "S",
311 }
312`)
313}
314
315func TestJavaSdkLibrary_UpdatableLibrary_Validation_MinAndMaxDeviceSdkAndModuleMinSdk(t *testing.T) {
316 android.GroupFixturePreparers(
317 prepareForJavaTest,
318 PrepareForTestWithJavaSdkLibraryFiles,
319 FixtureWithPrebuiltApis(map[string][]string{
320 "28": {"foo"},
321 }),
322 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
323 variables.Platform_version_active_codenames = []string{"Tiramisu", "U", "V"}
324 }),
325 ).ExtendWithErrorHandler(android.FixtureExpectsAllErrorsToMatchAPattern(
326 []string{
327 regexp.QuoteMeta("min_device_sdk: Can't be less than module's min sdk (V)"),
328 regexp.QuoteMeta("max_device_sdk: Can't be less than module's min sdk (V)"),
329 },
330 )).RunTestWithBp(t,
331 `
332 java_sdk_library {
333 name: "foo",
334 srcs: ["a.java", "b.java"],
335 api_packages: ["foo"],
336 min_device_sdk: "U",
337 max_device_sdk: "U",
338 min_sdk_version: "V",
339 }
340`)
341}
342
343func TestJavaSdkLibrary_UpdatableLibrary_usesNewTag(t *testing.T) {
344 result := android.GroupFixturePreparers(
345 prepareForJavaTest,
346 PrepareForTestWithJavaSdkLibraryFiles,
347 FixtureWithPrebuiltApis(map[string][]string{
348 "30": {"foo"},
349 }),
350 ).RunTestWithBp(t,
351 `
352 java_sdk_library {
353 name: "foo",
354 srcs: ["a.java", "b.java"],
355 min_device_sdk: "Tiramisu",
356 min_sdk_version: "S",
357 }
358`)
359 // test that updatability attributes are passed on correctly
360 fooUpdatable := result.ModuleForTests("foo.xml", "android_common").Rule("java_sdk_xml")
Pedro Loureiro196d3e62021-12-22 19:53:01 +0000361 android.AssertStringDoesContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<apex-library`)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000362 android.AssertStringDoesNotContain(t, "foo.xml java_sdk_xml command", fooUpdatable.RuleParams.Command, `<library`)
363}
364
Colin Cross1d2b6b32021-06-01 13:18:08 -0700365func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) {
366 result := android.GroupFixturePreparers(
367 prepareForJavaTest,
368 PrepareForTestWithJavaSdkLibraryFiles,
369 FixtureWithLastReleaseApis("sdklib"),
370 ).RunTestWithBp(t, `
371 java_sdk_library {
372 name: "sdklib",
373 srcs: ["a.java"],
374 libs: ["lib"],
375 static_libs: ["static-lib"],
376 impl_only_libs: ["impl-only-lib"],
377 stub_only_libs: ["stub-only-lib"],
378 stub_only_static_libs: ["stub-only-static-lib"],
379 }
380 java_defaults {
381 name: "defaults",
382 srcs: ["a.java"],
383 sdk_version: "current",
384 }
385 java_library { name: "lib", defaults: ["defaults"] }
386 java_library { name: "static-lib", defaults: ["defaults"] }
387 java_library { name: "impl-only-lib", defaults: ["defaults"] }
388 java_library { name: "stub-only-lib", defaults: ["defaults"] }
389 java_library { name: "stub-only-static-lib", defaults: ["defaults"] }
390 `)
391 var expectations = []struct {
392 lib string
393 on_impl_classpath bool
394 on_stub_classpath bool
395 in_impl_combined bool
396 in_stub_combined bool
397 }{
398 {lib: "lib", on_impl_classpath: true},
399 {lib: "static-lib", in_impl_combined: true},
400 {lib: "impl-only-lib", on_impl_classpath: true},
401 {lib: "stub-only-lib", on_stub_classpath: true},
402 {lib: "stub-only-static-lib", in_stub_combined: true},
403 }
404 verify := func(sdklib, dep string, cp, combined bool) {
405 sdklibCp := result.ModuleForTests(sdklib, "android_common").Rule("javac").Args["classpath"]
406 expected := cp || combined // Every combined jar is also on the classpath.
407 android.AssertStringContainsEquals(t, "bad classpath for "+sdklib, sdklibCp, "/"+dep+".jar", expected)
408
409 combineJarInputs := result.ModuleForTests(sdklib, "android_common").Rule("combineJar").Inputs.Strings()
410 depPath := filepath.Join("out", "soong", ".intermediates", dep, "android_common", "turbine-combined", dep+".jar")
411 android.AssertStringListContainsEquals(t, "bad combined inputs for "+sdklib, combineJarInputs, depPath, combined)
412 }
413 for _, expectation := range expectations {
414 verify("sdklib", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
415 verify("sdklib.impl", expectation.lib, expectation.on_impl_classpath, expectation.in_impl_combined)
416
417 stubName := apiScopePublic.stubsLibraryModuleName("sdklib")
418 verify(stubName, expectation.lib, expectation.on_stub_classpath, expectation.in_stub_combined)
419 }
420}
421
422func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) {
423 result := android.GroupFixturePreparers(
424 prepareForJavaTest,
425 PrepareForTestWithJavaSdkLibraryFiles,
426 FixtureWithLastReleaseApis("foo"),
427 ).RunTestWithBp(t, `
428 java_sdk_library {
429 name: "foo",
430 srcs: ["a.java"],
431 api_only: true,
432 public: {
433 enabled: true,
434 },
435 }
436
437 java_library {
438 name: "bar",
439 srcs: ["b.java"],
440 libs: ["foo"],
441 }
442 `)
443
444 // The bar library should depend on the stubs jar.
445 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
446 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
447 t.Errorf("expected %q, found %#q", expected, actual)
448 }
449}
450
Anton Hanssond78eb762021-09-21 15:25:12 +0100451func TestJavaSdkLibrary_AccessOutputFiles(t *testing.T) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700452 android.GroupFixturePreparers(
453 prepareForJavaTest,
454 PrepareForTestWithJavaSdkLibraryFiles,
455 FixtureWithLastReleaseApis("foo"),
456 ).RunTestWithBp(t, `
457 java_sdk_library {
458 name: "foo",
459 srcs: ["a.java"],
460 api_packages: ["foo"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100461 annotations_enabled: true,
462 public: {
463 enabled: true,
464 },
465 }
466 java_library {
467 name: "bar",
468 srcs: ["b.java", ":foo{.public.stubs.source}"],
469 java_resources: [":foo{.public.annotations.zip}"],
470 }
471 `)
472}
473
474func TestJavaSdkLibrary_AccessOutputFiles_NoAnnotations(t *testing.T) {
475 android.GroupFixturePreparers(
476 prepareForJavaTest,
477 PrepareForTestWithJavaSdkLibraryFiles,
478 FixtureWithLastReleaseApis("foo"),
479 ).
480 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "bar" variant "android_common": path dependency ":foo{.public.annotations.zip}": annotations.zip not available for api scope public`)).
481 RunTestWithBp(t, `
482 java_sdk_library {
483 name: "foo",
484 srcs: ["a.java"],
485 api_packages: ["foo"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700486 public: {
487 enabled: true,
488 },
489 }
490
491 java_library {
492 name: "bar",
493 srcs: ["b.java", ":foo{.public.stubs.source}"],
Anton Hanssond78eb762021-09-21 15:25:12 +0100494 java_resources: [":foo{.public.annotations.zip}"],
Colin Cross1d2b6b32021-06-01 13:18:08 -0700495 }
496 `)
497}
498
499func TestJavaSdkLibrary_AccessOutputFiles_MissingScope(t *testing.T) {
500 android.GroupFixturePreparers(
501 prepareForJavaTest,
502 PrepareForTestWithJavaSdkLibraryFiles,
503 FixtureWithLastReleaseApis("foo"),
504 ).
505 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`"foo" does not provide api scope system`)).
506 RunTestWithBp(t, `
507 java_sdk_library {
508 name: "foo",
509 srcs: ["a.java"],
510 api_packages: ["foo"],
511 public: {
512 enabled: true,
513 },
514 }
515
516 java_library {
517 name: "bar",
518 srcs: ["b.java", ":foo{.system.stubs.source}"],
519 }
520 `)
521}
522
523func TestJavaSdkLibrary_Deps(t *testing.T) {
524 result := android.GroupFixturePreparers(
525 prepareForJavaTest,
526 PrepareForTestWithJavaSdkLibraryFiles,
527 FixtureWithLastReleaseApis("sdklib"),
528 ).RunTestWithBp(t, `
529 java_sdk_library {
530 name: "sdklib",
531 srcs: ["a.java"],
532 sdk_version: "none",
533 system_modules: "none",
534 public: {
535 enabled: true,
536 },
537 }
538 `)
539
540 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
541 `dex2oatd`,
Paul Duffin958806b2022-05-16 13:10:47 +0000542 `sdklib-removed.api.public.latest`,
543 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700544 `sdklib.impl`,
545 `sdklib.stubs`,
546 `sdklib.stubs.source`,
547 `sdklib.xml`,
548 })
549}
550
551func TestJavaSdkLibraryImport_AccessOutputFiles(t *testing.T) {
552 prepareForJavaTest.RunTestWithBp(t, `
553 java_sdk_library_import {
554 name: "foo",
555 public: {
556 jars: ["a.jar"],
557 stub_srcs: ["a.java"],
558 current_api: "api/current.txt",
559 removed_api: "api/removed.txt",
Anton Hanssond78eb762021-09-21 15:25:12 +0100560 annotations: "x/annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700561 },
562 }
563
564 java_library {
565 name: "bar",
566 srcs: [":foo{.public.stubs.source}"],
567 java_resources: [
568 ":foo{.public.api.txt}",
569 ":foo{.public.removed-api.txt}",
Anton Hanssond78eb762021-09-21 15:25:12 +0100570 ":foo{.public.annotations.zip}",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700571 ],
572 }
573 `)
574}
575
576func TestJavaSdkLibraryImport_AccessOutputFiles_Invalid(t *testing.T) {
577 bp := `
578 java_sdk_library_import {
579 name: "foo",
580 public: {
581 jars: ["a.jar"],
582 },
583 }
584 `
585
586 t.Run("stubs.source", func(t *testing.T) {
587 prepareForJavaTest.
588 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`stubs.source not available for api scope public`)).
589 RunTestWithBp(t, bp+`
590 java_library {
591 name: "bar",
592 srcs: [":foo{.public.stubs.source}"],
593 java_resources: [
594 ":foo{.public.api.txt}",
595 ":foo{.public.removed-api.txt}",
596 ],
597 }
598 `)
599 })
600
601 t.Run("api.txt", func(t *testing.T) {
602 prepareForJavaTest.
603 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`api.txt not available for api scope public`)).
604 RunTestWithBp(t, bp+`
605 java_library {
606 name: "bar",
607 srcs: ["a.java"],
608 java_resources: [
609 ":foo{.public.api.txt}",
610 ],
611 }
612 `)
613 })
614
615 t.Run("removed-api.txt", func(t *testing.T) {
616 prepareForJavaTest.
617 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`removed-api.txt not available for api scope public`)).
618 RunTestWithBp(t, bp+`
619 java_library {
620 name: "bar",
621 srcs: ["a.java"],
622 java_resources: [
623 ":foo{.public.removed-api.txt}",
624 ],
625 }
626 `)
627 })
628}
629
630func TestJavaSdkLibrary_InvalidScopes(t *testing.T) {
631 prepareForJavaTest.
632 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "foo": enabled api scope "system" depends on disabled scope "public"`)).
633 RunTestWithBp(t, `
634 java_sdk_library {
635 name: "foo",
636 srcs: ["a.java", "b.java"],
637 api_packages: ["foo"],
638 // Explicitly disable public to test the check that ensures the set of enabled
639 // scopes is consistent.
640 public: {
641 enabled: false,
642 },
643 system: {
644 enabled: true,
645 },
646 }
647 `)
648}
649
650func TestJavaSdkLibrary_SdkVersion_ForScope(t *testing.T) {
651 android.GroupFixturePreparers(
652 prepareForJavaTest,
653 PrepareForTestWithJavaSdkLibraryFiles,
654 FixtureWithLastReleaseApis("foo"),
655 ).RunTestWithBp(t, `
656 java_sdk_library {
657 name: "foo",
658 srcs: ["a.java", "b.java"],
659 api_packages: ["foo"],
660 system: {
661 enabled: true,
662 sdk_version: "module_current",
663 },
664 }
665 `)
666}
667
668func TestJavaSdkLibrary_ModuleLib(t *testing.T) {
669 android.GroupFixturePreparers(
670 prepareForJavaTest,
671 PrepareForTestWithJavaSdkLibraryFiles,
672 FixtureWithLastReleaseApis("foo"),
673 ).RunTestWithBp(t, `
674 java_sdk_library {
675 name: "foo",
676 srcs: ["a.java", "b.java"],
677 api_packages: ["foo"],
678 system: {
679 enabled: true,
680 },
681 module_lib: {
682 enabled: true,
683 },
684 }
685 `)
686}
687
688func TestJavaSdkLibrary_SystemServer(t *testing.T) {
689 android.GroupFixturePreparers(
690 prepareForJavaTest,
691 PrepareForTestWithJavaSdkLibraryFiles,
692 FixtureWithLastReleaseApis("foo"),
693 ).RunTestWithBp(t, `
694 java_sdk_library {
695 name: "foo",
696 srcs: ["a.java", "b.java"],
697 api_packages: ["foo"],
698 system: {
699 enabled: true,
700 },
701 system_server: {
702 enabled: true,
703 },
704 }
705 `)
706}
707
Paul Duffind0b9fca2022-09-30 18:11:41 +0100708func TestJavaSdkLibrary_SystemServer_AccessToStubScopeLibs(t *testing.T) {
709 result := android.GroupFixturePreparers(
710 prepareForJavaTest,
711 PrepareForTestWithJavaSdkLibraryFiles,
712 FixtureWithLastReleaseApis("foo-public", "foo-system", "foo-module-lib", "foo-system-server"),
713 ).RunTestWithBp(t, `
714 java_sdk_library {
715 name: "foo-public",
716 srcs: ["a.java"],
717 api_packages: ["foo"],
718 public: {
719 enabled: true,
720 },
721 }
722
723 java_sdk_library {
724 name: "foo-system",
725 srcs: ["a.java"],
726 api_packages: ["foo"],
727 system: {
728 enabled: true,
729 },
730 }
731
732 java_sdk_library {
733 name: "foo-module-lib",
734 srcs: ["a.java"],
735 api_packages: ["foo"],
736 system: {
737 enabled: true,
738 },
739 module_lib: {
740 enabled: true,
741 },
742 }
743
744 java_sdk_library {
745 name: "foo-system-server",
746 srcs: ["a.java"],
747 api_packages: ["foo"],
748 system_server: {
749 enabled: true,
750 },
751 }
752
753 java_library {
754 name: "bar",
755 srcs: ["a.java"],
756 libs: ["foo-public", "foo-system", "foo-module-lib", "foo-system-server"],
757 sdk_version: "system_server_current",
758 }
759 `)
760
761 stubsPath := func(name string, scope *apiScope) string {
762 name = scope.stubsLibraryModuleName(name)
763 return fmt.Sprintf("out/soong/.intermediates/%[1]s/android_common/turbine-combined/%[1]s.jar", name)
764 }
765
766 // The bar library should depend on the highest (where system server is highest and public is
767 // lowest) API scopes provided by each of the foo-* modules. The highest API scope provided by the
768 // foo-<x> module is <x>.
769 barLibrary := result.ModuleForTests("bar", "android_common").Rule("javac")
770 stubLibraries := []string{
771 stubsPath("foo-public", apiScopePublic),
772 stubsPath("foo-system", apiScopeSystem),
773 stubsPath("foo-module-lib", apiScopeModuleLib),
774 stubsPath("foo-system-server", apiScopeSystemServer),
775 }
776 expectedPattern := fmt.Sprintf(`^-classpath .*:\Q%s\E$`, strings.Join(stubLibraries, ":"))
777 if expected, actual := expectedPattern, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
778 t.Errorf("expected pattern %q to match %#q", expected, actual)
779 }
780}
781
Colin Cross1d2b6b32021-06-01 13:18:08 -0700782func TestJavaSdkLibrary_MissingScope(t *testing.T) {
783 prepareForJavaTest.
784 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`requires api scope module-lib from foo but it only has \[\] available`)).
785 RunTestWithBp(t, `
786 java_sdk_library {
787 name: "foo",
788 srcs: ["a.java"],
789 public: {
790 enabled: false,
791 },
792 }
793
794 java_library {
795 name: "baz",
796 srcs: ["a.java"],
797 libs: ["foo"],
798 sdk_version: "module_current",
799 }
800 `)
801}
802
803func TestJavaSdkLibrary_FallbackScope(t *testing.T) {
804 android.GroupFixturePreparers(
805 prepareForJavaTest,
806 PrepareForTestWithJavaSdkLibraryFiles,
807 FixtureWithLastReleaseApis("foo"),
808 ).RunTestWithBp(t, `
809 java_sdk_library {
810 name: "foo",
811 srcs: ["a.java"],
812 system: {
813 enabled: true,
814 },
815 }
816
817 java_library {
818 name: "baz",
819 srcs: ["a.java"],
820 libs: ["foo"],
821 // foo does not have module-lib scope so it should fallback to system
822 sdk_version: "module_current",
823 }
824 `)
825}
826
827func TestJavaSdkLibrary_DefaultToStubs(t *testing.T) {
828 result := android.GroupFixturePreparers(
829 prepareForJavaTest,
830 PrepareForTestWithJavaSdkLibraryFiles,
831 FixtureWithLastReleaseApis("foo"),
832 ).RunTestWithBp(t, `
833 java_sdk_library {
834 name: "foo",
835 srcs: ["a.java"],
836 system: {
837 enabled: true,
838 },
839 default_to_stubs: true,
840 }
841
842 java_library {
843 name: "baz",
844 srcs: ["a.java"],
845 libs: ["foo"],
846 // does not have sdk_version set, should fallback to module,
847 // which will then fallback to system because the module scope
848 // is not enabled.
849 }
850 `)
851 // The baz library should depend on the system stubs jar.
852 bazLibrary := result.ModuleForTests("baz", "android_common").Rule("javac")
853 if expected, actual := `^-classpath .*:out/soong/[^:]*/turbine-combined/foo\.stubs.system\.jar$`, bazLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
854 t.Errorf("expected %q, found %#q", expected, actual)
855 }
856}
857
858func TestJavaSdkLibraryImport(t *testing.T) {
859 result := prepareForJavaTest.RunTestWithBp(t, `
860 java_library {
861 name: "foo",
862 srcs: ["a.java"],
863 libs: ["sdklib"],
864 sdk_version: "current",
865 }
866
867 java_library {
868 name: "foo.system",
869 srcs: ["a.java"],
870 libs: ["sdklib"],
871 sdk_version: "system_current",
872 }
873
874 java_library {
875 name: "foo.test",
876 srcs: ["a.java"],
877 libs: ["sdklib"],
878 sdk_version: "test_current",
879 }
880
881 java_sdk_library_import {
882 name: "sdklib",
883 public: {
884 jars: ["a.jar"],
885 },
886 system: {
887 jars: ["b.jar"],
888 },
889 test: {
890 jars: ["c.jar"],
891 stub_srcs: ["c.java"],
892 },
893 }
894 `)
895
896 for _, scope := range []string{"", ".system", ".test"} {
897 fooModule := result.ModuleForTests("foo"+scope, "android_common")
898 javac := fooModule.Rule("javac")
899
900 sdklibStubsJar := result.ModuleForTests("sdklib.stubs"+scope, "android_common").Rule("combineJar").Output
901 android.AssertStringDoesContain(t, "foo classpath", javac.Args["classpath"], sdklibStubsJar.String())
902 }
903
904 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +0000905 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700906 `prebuilt_sdklib.stubs`,
907 `prebuilt_sdklib.stubs.source.test`,
908 `prebuilt_sdklib.stubs.system`,
909 `prebuilt_sdklib.stubs.test`,
910 })
911}
912
913func TestJavaSdkLibraryImport_WithSource(t *testing.T) {
914 result := android.GroupFixturePreparers(
915 prepareForJavaTest,
916 PrepareForTestWithJavaSdkLibraryFiles,
917 FixtureWithLastReleaseApis("sdklib"),
918 ).RunTestWithBp(t, `
919 java_sdk_library {
920 name: "sdklib",
921 srcs: ["a.java"],
922 sdk_version: "none",
923 system_modules: "none",
924 public: {
925 enabled: true,
926 },
927 }
928
929 java_sdk_library_import {
930 name: "sdklib",
931 public: {
932 jars: ["a.jar"],
933 },
934 }
935 `)
936
937 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
938 `dex2oatd`,
939 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +0000940 `sdklib-removed.api.public.latest`,
941 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700942 `sdklib.impl`,
943 `sdklib.stubs`,
944 `sdklib.stubs.source`,
945 `sdklib.xml`,
946 })
947
948 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
949 `prebuilt_sdklib.stubs`,
950 `sdklib.impl`,
951 // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the
952 // dependency is added after prebuilts may have been renamed and so has to use
953 // the renamed name.
954 `sdklib.xml`,
955 })
956}
957
Paul Duffinbf4de042022-09-27 12:41:52 +0100958func testJavaSdkLibraryImport_Preferred(t *testing.T, prefer string, preparer android.FixturePreparer) {
Colin Cross1d2b6b32021-06-01 13:18:08 -0700959 result := android.GroupFixturePreparers(
960 prepareForJavaTest,
961 PrepareForTestWithJavaSdkLibraryFiles,
962 FixtureWithLastReleaseApis("sdklib"),
Paul Duffinbf4de042022-09-27 12:41:52 +0100963 preparer,
Colin Cross1d2b6b32021-06-01 13:18:08 -0700964 ).RunTestWithBp(t, `
965 java_sdk_library {
966 name: "sdklib",
967 srcs: ["a.java"],
968 sdk_version: "none",
969 system_modules: "none",
970 public: {
971 enabled: true,
972 },
973 }
974
975 java_sdk_library_import {
976 name: "sdklib",
Paul Duffinbf4de042022-09-27 12:41:52 +0100977 `+prefer+`
Colin Cross1d2b6b32021-06-01 13:18:08 -0700978 public: {
979 jars: ["a.jar"],
Paul Duffinbf4de042022-09-27 12:41:52 +0100980 stub_srcs: ["a.java"],
981 current_api: "current.txt",
982 removed_api: "removed.txt",
983 annotations: "annotations.zip",
Colin Cross1d2b6b32021-06-01 13:18:08 -0700984 },
985 }
Paul Duffinbf4de042022-09-27 12:41:52 +0100986
987 java_library {
988 name: "combined",
989 static_libs: [
990 "sdklib.stubs",
991 ],
992 java_resources: [
993 ":sdklib.stubs.source",
994 ":sdklib{.public.api.txt}",
995 ":sdklib{.public.removed-api.txt}",
996 ":sdklib{.public.annotations.zip}",
997 ],
998 sdk_version: "none",
999 system_modules: "none",
1000 }
1001
1002 java_library {
1003 name: "public",
1004 srcs: ["a.java"],
1005 libs: ["sdklib"],
1006 sdk_version: "current",
1007 }
Colin Cross1d2b6b32021-06-01 13:18:08 -07001008 `)
1009
1010 CheckModuleDependencies(t, result.TestContext, "sdklib", "android_common", []string{
Colin Cross1d2b6b32021-06-01 13:18:08 -07001011 `prebuilt_sdklib`,
Paul Duffin958806b2022-05-16 13:10:47 +00001012 `sdklib-removed.api.public.latest`,
1013 `sdklib.api.public.latest`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001014 `sdklib.impl`,
1015 `sdklib.stubs`,
1016 `sdklib.stubs.source`,
1017 `sdklib.xml`,
1018 })
1019
1020 CheckModuleDependencies(t, result.TestContext, "prebuilt_sdklib", "android_common", []string{
Jiakai Zhang204356f2021-09-09 08:12:46 +00001021 `dex2oatd`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001022 `prebuilt_sdklib.stubs`,
Paul Duffinbf4de042022-09-27 12:41:52 +01001023 `prebuilt_sdklib.stubs.source`,
Colin Cross1d2b6b32021-06-01 13:18:08 -07001024 `sdklib.impl`,
1025 `sdklib.xml`,
1026 })
Paul Duffinbf4de042022-09-27 12:41:52 +01001027
1028 // Make sure that dependencies on child modules use the prebuilt when preferred.
1029 CheckModuleDependencies(t, result.TestContext, "combined", "android_common", []string{
1030 // Each use of :sdklib{...} adds a dependency onto prebuilt_sdklib.
1031 `prebuilt_sdklib`,
1032 `prebuilt_sdklib`,
1033 `prebuilt_sdklib`,
1034 `prebuilt_sdklib.stubs`,
1035 `prebuilt_sdklib.stubs.source`,
1036 })
1037
1038 // Make sure that dependencies on sdklib that resolve to one of the child libraries use the
1039 // prebuilt library.
1040 public := result.ModuleForTests("public", "android_common")
1041 rule := public.Output("javac/public.jar")
1042 inputs := rule.Implicits.Strings()
1043 expected := "out/soong/.intermediates/prebuilt_sdklib.stubs/android_common/combined/sdklib.stubs.jar"
1044 if !android.InList(expected, inputs) {
1045 t.Errorf("expected %q to contain %q", inputs, expected)
1046 }
1047}
1048
1049func TestJavaSdkLibraryImport_Preferred(t *testing.T) {
1050 t.Run("prefer", func(t *testing.T) {
1051 testJavaSdkLibraryImport_Preferred(t, "prefer: true,", android.NullFixturePreparer)
1052 })
1053
1054 t.Run("use_source_config_var", func(t *testing.T) {
1055 testJavaSdkLibraryImport_Preferred(t,
1056 "use_source_config_var: {config_namespace: \"acme\", var_name: \"use_source\"},",
1057 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1058 variables.VendorVars = map[string]map[string]string{
1059 "acme": {
1060 "use_source": "false",
1061 },
1062 }
1063 }))
1064 })
Colin Cross1d2b6b32021-06-01 13:18:08 -07001065}
1066
1067func TestJavaSdkLibraryEnforce(t *testing.T) {
1068 partitionToBpOption := func(partition string) string {
1069 switch partition {
1070 case "system":
1071 return ""
1072 case "vendor":
1073 return "soc_specific: true,"
1074 case "product":
1075 return "product_specific: true,"
1076 default:
1077 panic("Invalid partition group name: " + partition)
1078 }
1079 }
1080
1081 type testConfigInfo struct {
1082 libraryType string
1083 fromPartition string
1084 toPartition string
1085 enforceVendorInterface bool
1086 enforceProductInterface bool
1087 enforceJavaSdkLibraryCheck bool
1088 allowList []string
1089 }
1090
1091 createPreparer := func(info testConfigInfo) android.FixturePreparer {
1092 bpFileTemplate := `
1093 java_library {
1094 name: "foo",
1095 srcs: ["foo.java"],
1096 libs: ["bar"],
1097 sdk_version: "current",
1098 %s
1099 }
1100
1101 %s {
1102 name: "bar",
1103 srcs: ["bar.java"],
1104 sdk_version: "current",
1105 %s
1106 }
1107 `
1108
1109 bpFile := fmt.Sprintf(bpFileTemplate,
1110 partitionToBpOption(info.fromPartition),
1111 info.libraryType,
1112 partitionToBpOption(info.toPartition))
1113
1114 return android.GroupFixturePreparers(
1115 PrepareForTestWithJavaSdkLibraryFiles,
1116 FixtureWithLastReleaseApis("bar"),
1117 android.FixtureWithRootAndroidBp(bpFile),
1118 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1119 variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface)
1120 if info.enforceVendorInterface {
1121 variables.DeviceVndkVersion = proptools.StringPtr("current")
1122 }
1123 variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck)
1124 variables.InterPartitionJavaLibraryAllowList = info.allowList
1125 }),
1126 )
1127 }
1128
1129 runTest := func(t *testing.T, info testConfigInfo, expectedErrorPattern string) {
1130 t.Run(fmt.Sprintf("%v", info), func(t *testing.T) {
1131 errorHandler := android.FixtureExpectsNoErrors
1132 if expectedErrorPattern != "" {
1133 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorPattern)
1134 }
1135 android.GroupFixturePreparers(
1136 prepareForJavaTest,
1137 createPreparer(info),
1138 ).
1139 ExtendWithErrorHandler(errorHandler).
1140 RunTest(t)
1141 })
1142 }
1143
1144 errorMessage := "is not allowed across the partitions"
1145
1146 runTest(t, testConfigInfo{
1147 libraryType: "java_library",
1148 fromPartition: "product",
1149 toPartition: "system",
1150 enforceVendorInterface: true,
1151 enforceProductInterface: true,
1152 enforceJavaSdkLibraryCheck: false,
1153 }, "")
1154
1155 runTest(t, testConfigInfo{
1156 libraryType: "java_library",
1157 fromPartition: "product",
1158 toPartition: "system",
1159 enforceVendorInterface: true,
1160 enforceProductInterface: false,
1161 enforceJavaSdkLibraryCheck: true,
1162 }, "")
1163
1164 runTest(t, testConfigInfo{
1165 libraryType: "java_library",
1166 fromPartition: "product",
1167 toPartition: "system",
1168 enforceVendorInterface: true,
1169 enforceProductInterface: true,
1170 enforceJavaSdkLibraryCheck: true,
1171 }, errorMessage)
1172
1173 runTest(t, testConfigInfo{
1174 libraryType: "java_library",
1175 fromPartition: "vendor",
1176 toPartition: "system",
1177 enforceVendorInterface: true,
1178 enforceProductInterface: true,
1179 enforceJavaSdkLibraryCheck: true,
1180 }, errorMessage)
1181
1182 runTest(t, testConfigInfo{
1183 libraryType: "java_library",
1184 fromPartition: "vendor",
1185 toPartition: "system",
1186 enforceVendorInterface: true,
1187 enforceProductInterface: true,
1188 enforceJavaSdkLibraryCheck: true,
1189 allowList: []string{"bar"},
1190 }, "")
1191
1192 runTest(t, testConfigInfo{
1193 libraryType: "java_library",
1194 fromPartition: "vendor",
1195 toPartition: "product",
1196 enforceVendorInterface: true,
1197 enforceProductInterface: true,
1198 enforceJavaSdkLibraryCheck: true,
1199 }, errorMessage)
1200
1201 runTest(t, testConfigInfo{
1202 libraryType: "java_sdk_library",
1203 fromPartition: "product",
1204 toPartition: "system",
1205 enforceVendorInterface: true,
1206 enforceProductInterface: true,
1207 enforceJavaSdkLibraryCheck: true,
1208 }, "")
1209
1210 runTest(t, testConfigInfo{
1211 libraryType: "java_sdk_library",
1212 fromPartition: "vendor",
1213 toPartition: "system",
1214 enforceVendorInterface: true,
1215 enforceProductInterface: true,
1216 enforceJavaSdkLibraryCheck: true,
1217 }, "")
1218
1219 runTest(t, testConfigInfo{
1220 libraryType: "java_sdk_library",
1221 fromPartition: "vendor",
1222 toPartition: "product",
1223 enforceVendorInterface: true,
1224 enforceProductInterface: true,
1225 enforceJavaSdkLibraryCheck: true,
1226 }, "")
1227}
Colin Cross30c491b2021-06-01 13:39:09 -07001228
1229func TestJavaSdkLibraryDist(t *testing.T) {
1230 result := android.GroupFixturePreparers(
1231 PrepareForTestWithJavaBuildComponents,
1232 PrepareForTestWithJavaDefaultModules,
1233 PrepareForTestWithJavaSdkLibraryFiles,
Colin Cross67c17ae2021-06-02 13:02:51 -07001234 FixtureWithLastReleaseApis(
1235 "sdklib_no_group",
1236 "sdklib_group_foo",
1237 "sdklib_owner_foo",
1238 "foo"),
Colin Cross30c491b2021-06-01 13:39:09 -07001239 ).RunTestWithBp(t, `
1240 java_sdk_library {
Colin Cross59b92bf2021-06-01 14:07:56 -07001241 name: "sdklib_no_group",
Colin Cross30c491b2021-06-01 13:39:09 -07001242 srcs: ["foo.java"],
1243 }
1244
1245 java_sdk_library {
Colin Cross986b69a2021-06-01 13:13:40 -07001246 name: "sdklib_group_foo",
Colin Cross986b69a2021-06-01 13:13:40 -07001247 srcs: ["foo.java"],
1248 dist_group: "foo",
1249 }
1250
1251 java_sdk_library {
Colin Cross30c491b2021-06-01 13:39:09 -07001252 name: "sdklib_owner_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001253 srcs: ["foo.java"],
1254 owner: "foo",
1255 }
1256
1257 java_sdk_library {
1258 name: "sdklib_stem_foo",
Colin Cross30c491b2021-06-01 13:39:09 -07001259 srcs: ["foo.java"],
1260 dist_stem: "foo",
1261 }
Colin Cross30c491b2021-06-01 13:39:09 -07001262 `)
1263
1264 type testCase struct {
1265 module string
1266 distDir string
1267 distStem string
1268 }
1269 testCases := []testCase{
1270 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001271 module: "sdklib_no_group",
Colin Cross3dd66252021-06-01 14:05:09 -07001272 distDir: "apistubs/unknown/public",
Colin Cross59b92bf2021-06-01 14:07:56 -07001273 distStem: "sdklib_no_group.jar",
Colin Cross30c491b2021-06-01 13:39:09 -07001274 },
1275 {
Colin Cross986b69a2021-06-01 13:13:40 -07001276 module: "sdklib_group_foo",
1277 distDir: "apistubs/foo/public",
1278 distStem: "sdklib_group_foo.jar",
1279 },
1280 {
Colin Cross59b92bf2021-06-01 14:07:56 -07001281 // Owner doesn't affect distDir after b/186723288.
Colin Cross30c491b2021-06-01 13:39:09 -07001282 module: "sdklib_owner_foo",
Colin Cross59b92bf2021-06-01 14:07:56 -07001283 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001284 distStem: "sdklib_owner_foo.jar",
1285 },
1286 {
1287 module: "sdklib_stem_foo",
Colin Cross3dd66252021-06-01 14:05:09 -07001288 distDir: "apistubs/unknown/public",
Colin Cross30c491b2021-06-01 13:39:09 -07001289 distStem: "foo.jar",
1290 },
Colin Cross30c491b2021-06-01 13:39:09 -07001291 }
1292
1293 for _, tt := range testCases {
1294 t.Run(tt.module, func(t *testing.T) {
1295 m := result.ModuleForTests(tt.module+".stubs", "android_common").Module().(*Library)
1296 dists := m.Dists()
1297 if len(dists) != 1 {
1298 t.Fatalf("expected exactly 1 dist entry, got %d", len(dists))
1299 }
1300 if g, w := String(dists[0].Dir), tt.distDir; g != w {
1301 t.Errorf("expected dist dir %q, got %q", w, g)
1302 }
1303 if g, w := String(dists[0].Dest), tt.distStem; g != w {
1304 t.Errorf("expected dist stem %q, got %q", w, g)
1305 }
1306 })
1307 }
1308}
satayev8f088b02021-12-06 11:40:46 +00001309
1310func TestSdkLibrary_CheckMinSdkVersion(t *testing.T) {
1311 preparer := android.GroupFixturePreparers(
1312 PrepareForTestWithJavaBuildComponents,
1313 PrepareForTestWithJavaDefaultModules,
1314 PrepareForTestWithJavaSdkLibraryFiles,
1315 )
1316
1317 preparer.RunTestWithBp(t, `
1318 java_sdk_library {
1319 name: "sdklib",
1320 srcs: ["a.java"],
1321 static_libs: ["util"],
1322 min_sdk_version: "30",
1323 unsafe_ignore_missing_latest_api: true,
1324 }
1325
1326 java_library {
1327 name: "util",
1328 srcs: ["a.java"],
1329 min_sdk_version: "30",
1330 }
1331 `)
1332
1333 preparer.
1334 RunTestWithBp(t, `
1335 java_sdk_library {
1336 name: "sdklib",
1337 srcs: ["a.java"],
1338 libs: ["util"],
1339 impl_only_libs: ["util"],
1340 stub_only_libs: ["util"],
1341 stub_only_static_libs: ["util"],
1342 min_sdk_version: "30",
1343 unsafe_ignore_missing_latest_api: true,
1344 }
1345
1346 java_library {
1347 name: "util",
1348 srcs: ["a.java"],
1349 }
1350 `)
1351
1352 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "util".*should support min_sdk_version\(30\)`)).
1353 RunTestWithBp(t, `
1354 java_sdk_library {
1355 name: "sdklib",
1356 srcs: ["a.java"],
1357 static_libs: ["util"],
1358 min_sdk_version: "30",
1359 unsafe_ignore_missing_latest_api: true,
1360 }
1361
1362 java_library {
1363 name: "util",
1364 srcs: ["a.java"],
1365 min_sdk_version: "31",
1366 }
1367 `)
1368
1369 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "another_util".*should support min_sdk_version\(30\)`)).
1370 RunTestWithBp(t, `
1371 java_sdk_library {
1372 name: "sdklib",
1373 srcs: ["a.java"],
1374 static_libs: ["util"],
1375 min_sdk_version: "30",
1376 unsafe_ignore_missing_latest_api: true,
1377 }
1378
1379 java_library {
1380 name: "util",
1381 srcs: ["a.java"],
1382 static_libs: ["another_util"],
1383 min_sdk_version: "30",
1384 }
1385
1386 java_library {
1387 name: "another_util",
1388 srcs: ["a.java"],
1389 min_sdk_version: "31",
1390 }
1391 `)
1392}
Nikita Ioffed732da72022-11-21 12:38:25 +00001393
1394func TestJavaSdkLibrary_StubOnlyLibs_PassedToDroidstubs(t *testing.T) {
1395 result := android.GroupFixturePreparers(
1396 prepareForJavaTest,
1397 PrepareForTestWithJavaSdkLibraryFiles,
1398 FixtureWithLastReleaseApis("foo"),
1399 ).RunTestWithBp(t, `
1400 java_sdk_library {
1401 name: "foo",
1402 srcs: ["a.java"],
1403 public: {
1404 enabled: true,
1405 },
1406 stub_only_libs: ["bar-lib"],
1407 }
1408
1409 java_library {
1410 name: "bar-lib",
1411 srcs: ["b.java"],
1412 }
1413 `)
1414
1415 // The foo.stubs.source should depend on bar-lib
1416 fooStubsSources := result.ModuleForTests("foo.stubs.source", "android_common").Module().(*Droidstubs)
1417 android.AssertStringListContains(t, "foo stubs should depend on bar-lib", fooStubsSources.Javadoc.properties.Libs, "bar-lib")
1418}
Jihoon Kang1c92c3e2023-03-23 17:44:51 +00001419
1420func TestJavaSdkLibrary_ApiLibrary(t *testing.T) {
1421 result := android.GroupFixturePreparers(
1422 prepareForJavaTest,
1423 PrepareForTestWithJavaSdkLibraryFiles,
1424 FixtureWithLastReleaseApis("foo"),
1425 android.FixtureModifyConfig(func(config android.Config) {
1426 config.SetApiLibraries([]string{"foo"})
1427 }),
1428 ).RunTestWithBp(t, `
1429 java_sdk_library {
1430 name: "foo",
1431 srcs: ["a.java", "b.java"],
1432 api_packages: ["foo"],
1433 system: {
1434 enabled: true,
1435 },
1436 module_lib: {
1437 enabled: true,
1438 },
1439 test: {
1440 enabled: true,
1441 },
1442 }
1443 `)
1444
1445 testCases := []struct {
1446 scope *apiScope
1447 apiContributions []string
1448 depApiSrcs string
1449 }{
1450 {
1451 scope: apiScopePublic,
1452 apiContributions: []string{"foo.stubs.source.api.contribution"},
1453 depApiSrcs: "android_stubs_current.from-text",
1454 },
1455 {
1456 scope: apiScopeSystem,
1457 apiContributions: []string{"foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1458 depApiSrcs: "android_system_stubs_current.from-text",
1459 },
1460 {
1461 scope: apiScopeTest,
1462 apiContributions: []string{"foo.stubs.source.test.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1463 depApiSrcs: "android_test_stubs_current.from-text",
1464 },
1465 {
1466 scope: apiScopeModuleLib,
1467 apiContributions: []string{"foo.stubs.source.module_lib.api.contribution", "foo.stubs.source.system.api.contribution", "foo.stubs.source.api.contribution"},
1468 depApiSrcs: "android_module_lib_stubs_current_full.from-text",
1469 },
1470 }
1471
1472 for _, c := range testCases {
1473 m := result.ModuleForTests(c.scope.apiLibraryModuleName("foo"), "android_common").Module().(*ApiLibrary)
1474 android.AssertArrayString(t, "Module expected to contain api contributions", c.apiContributions, m.properties.Api_contributions)
1475 android.AssertStringEquals(t, "Module expected to contain full api surface api library", c.depApiSrcs, *m.properties.Dep_api_srcs)
1476 }
1477}