blob: 87b853c56aba9a5643dd2d464182cf36787d2e05 [file] [log] [blame]
Paul Duffin3451e162021-01-20 15:16:56 +00001// Copyright (C) 2021 The Android Open Source Project
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 (
Paul Duffin3f1ae0b2022-07-27 16:27:42 +000018 "strings"
Paul Duffin3451e162021-01-20 15:16:56 +000019 "testing"
Paul Duffin837486d2021-03-23 23:13:53 +000020
21 "android/soong/android"
22 "android/soong/dexpreopt"
Paul Duffin3451e162021-01-20 15:16:56 +000023)
24
Paul Duffin7771eba2021-04-23 14:25:28 +010025// Contains some simple tests for bootclasspath_fragment logic, additional tests can be found in
26// apex/bootclasspath_fragment_test.go as the ART boot image requires modules from the ART apex.
Paul Duffin3451e162021-01-20 15:16:56 +000027
Paul Duffin7771eba2021-04-23 14:25:28 +010028var prepareForTestWithBootclasspathFragment = android.GroupFixturePreparers(
Paul Duffin837486d2021-03-23 23:13:53 +000029 PrepareForTestWithJavaDefaultModules,
30 dexpreopt.PrepareForTestByEnablingDexpreopt,
31)
32
Paul Duffin8018e502021-05-21 19:28:09 +010033func TestBootclasspathFragment_UnknownImageName(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080034 t.Parallel()
Paul Duffin7771eba2021-04-23 14:25:28 +010035 prepareForTestWithBootclasspathFragment.
Paul Duffin837486d2021-03-23 23:13:53 +000036 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Paul Duffin8018e502021-05-21 19:28:09 +010037 `\Qimage_name: unknown image name "unknown", expected "art"\E`)).
Paul Duffin837486d2021-03-23 23:13:53 +000038 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010039 bootclasspath_fragment {
40 name: "unknown-bootclasspath-fragment",
Paul Duffin837486d2021-03-23 23:13:53 +000041 image_name: "unknown",
Paul Duffin8018e502021-05-21 19:28:09 +010042 contents: ["foo"],
Paul Duffin837486d2021-03-23 23:13:53 +000043 }
Jiakai Zhangb69e8952023-07-11 14:31:22 +010044
45 java_library {
46 name: "foo",
47 srcs: ["foo.java"],
48 installable: true,
49 }
Paul Duffin837486d2021-03-23 23:13:53 +000050 `)
Paul Duffin3451e162021-01-20 15:16:56 +000051}
Paul Duffinf7f65da2021-03-10 15:00:46 +000052
Paul Duffin8018e502021-05-21 19:28:09 +010053func TestPrebuiltBootclasspathFragment_UnknownImageName(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080054 t.Parallel()
Paul Duffin7771eba2021-04-23 14:25:28 +010055 prepareForTestWithBootclasspathFragment.
Paul Duffin4b64ba02021-03-29 11:02:53 +010056 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Paul Duffin8018e502021-05-21 19:28:09 +010057 `\Qimage_name: unknown image name "unknown", expected "art"\E`)).
Paul Duffin837486d2021-03-23 23:13:53 +000058 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010059 prebuilt_bootclasspath_fragment {
60 name: "unknown-bootclasspath-fragment",
Paul Duffin837486d2021-03-23 23:13:53 +000061 image_name: "unknown",
Paul Duffin8018e502021-05-21 19:28:09 +010062 contents: ["foo"],
Paul Duffin837486d2021-03-23 23:13:53 +000063 }
Jiakai Zhangb69e8952023-07-11 14:31:22 +010064
65 java_import {
66 name: "foo",
67 jars: ["foo.jar"],
68 }
Paul Duffin837486d2021-03-23 23:13:53 +000069 `)
Paul Duffinf7f65da2021-03-10 15:00:46 +000070}
Paul Duffinc7ef9892021-03-23 23:21:59 +000071
Paul Duffin7771eba2021-04-23 14:25:28 +010072func TestBootclasspathFragmentInconsistentArtConfiguration_Platform(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080073 t.Parallel()
Paul Duffinc7ef9892021-03-23 23:21:59 +000074 android.GroupFixturePreparers(
Paul Duffin7771eba2021-04-23 14:25:28 +010075 prepareForTestWithBootclasspathFragment,
Paul Duffinc7ef9892021-03-23 23:21:59 +000076 dexpreopt.FixtureSetArtBootJars("platform:foo", "apex:bar"),
77 ).
78 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
79 `\QArtApexJars is invalid as it requests a platform variant of "foo"\E`)).
80 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +010081 bootclasspath_fragment {
82 name: "bootclasspath-fragment",
Paul Duffinc7ef9892021-03-23 23:21:59 +000083 image_name: "art",
Paul Duffin8018e502021-05-21 19:28:09 +010084 contents: ["foo", "bar"],
Paul Duffinc7ef9892021-03-23 23:21:59 +000085 apex_available: [
86 "apex",
87 ],
88 }
Jiakai Zhangb69e8952023-07-11 14:31:22 +010089
90 java_library {
91 name: "foo",
92 srcs: ["foo.java"],
93 installable: true,
94 }
95
96 java_library {
97 name: "bar",
98 srcs: ["bar.java"],
99 installable: true,
100 }
Paul Duffinc7ef9892021-03-23 23:21:59 +0000101 `)
102}
103
Paul Duffin7771eba2021-04-23 14:25:28 +0100104func TestBootclasspathFragmentInconsistentArtConfiguration_ApexMixture(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800105 t.Parallel()
Paul Duffinc7ef9892021-03-23 23:21:59 +0000106 android.GroupFixturePreparers(
Paul Duffin7771eba2021-04-23 14:25:28 +0100107 prepareForTestWithBootclasspathFragment,
Paul Duffinc7ef9892021-03-23 23:21:59 +0000108 dexpreopt.FixtureSetArtBootJars("apex1:foo", "apex2:bar"),
109 ).
110 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
111 `\QArtApexJars configuration is inconsistent, expected all jars to be in the same apex but it specifies apex "apex1" and "apex2"\E`)).
112 RunTestWithBp(t, `
Paul Duffin7771eba2021-04-23 14:25:28 +0100113 bootclasspath_fragment {
114 name: "bootclasspath-fragment",
Paul Duffinc7ef9892021-03-23 23:21:59 +0000115 image_name: "art",
Paul Duffin8018e502021-05-21 19:28:09 +0100116 contents: ["foo", "bar"],
Paul Duffinc7ef9892021-03-23 23:21:59 +0000117 apex_available: [
118 "apex1",
119 "apex2",
120 ],
121 }
Jiakai Zhangb69e8952023-07-11 14:31:22 +0100122
123 java_library {
124 name: "foo",
125 srcs: ["foo.java"],
126 installable: true,
127 }
128
129 java_library {
130 name: "bar",
131 srcs: ["bar.java"],
132 installable: true,
133 }
Paul Duffinc7ef9892021-03-23 23:21:59 +0000134 `)
135}
Paul Duffin82886d62021-03-24 01:34:57 +0000136
Paul Duffinc7d16442021-04-23 13:55:49 +0100137func TestBootclasspathFragment_Coverage(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800138 t.Parallel()
Paul Duffinc7d16442021-04-23 13:55:49 +0100139 prepareWithBp := android.FixtureWithRootAndroidBp(`
140 bootclasspath_fragment {
141 name: "myfragment",
142 contents: [
143 "mybootlib",
144 ],
Paul Duffin895c7142021-04-25 13:40:15 +0100145 api: {
146 stub_libs: [
147 "mysdklibrary",
148 ],
149 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100150 coverage: {
151 contents: [
152 "coveragelib",
153 ],
Paul Duffin895c7142021-04-25 13:40:15 +0100154 api: {
155 stub_libs: [
156 "mycoveragestubs",
157 ],
158 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100159 },
Paul Duffin9fd56472022-03-31 15:42:30 +0100160 hidden_api: {
161 split_packages: ["*"],
162 },
Paul Duffinc7d16442021-04-23 13:55:49 +0100163 }
164
165 java_library {
166 name: "mybootlib",
167 srcs: ["Test.java"],
168 system_modules: "none",
169 sdk_version: "none",
170 compile_dex: true,
171 }
172
173 java_library {
174 name: "coveragelib",
175 srcs: ["Test.java"],
176 system_modules: "none",
177 sdk_version: "none",
178 compile_dex: true,
179 }
Paul Duffin895c7142021-04-25 13:40:15 +0100180
181 java_sdk_library {
182 name: "mysdklibrary",
183 srcs: ["Test.java"],
184 compile_dex: true,
185 public: {enabled: true},
186 system: {enabled: true},
187 }
188
189 java_sdk_library {
190 name: "mycoveragestubs",
191 srcs: ["Test.java"],
192 compile_dex: true,
193 public: {enabled: true},
194 }
Paul Duffinc7d16442021-04-23 13:55:49 +0100195 `)
196
197 checkContents := func(t *testing.T, result *android.TestResult, expected ...string) {
198 module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
Spandan Das7103c4f2024-11-11 22:31:55 +0000199 eval := module.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
200 android.AssertArrayString(t, "contents property", expected, module.properties.Contents.GetOrDefault(eval, nil))
Paul Duffinc7d16442021-04-23 13:55:49 +0100201 }
202
Paul Duffin895c7142021-04-25 13:40:15 +0100203 preparer := android.GroupFixturePreparers(
204 prepareForTestWithBootclasspathFragment,
205 PrepareForTestWithJavaSdkLibraryFiles,
206 FixtureWithLastReleaseApis("mysdklibrary", "mycoveragestubs"),
satayevabcd5972021-08-06 17:49:46 +0100207 FixtureConfigureApexBootJars("someapex:mybootlib"),
Paul Duffin895c7142021-04-25 13:40:15 +0100208 prepareWithBp,
209 )
210
Paul Duffinc7d16442021-04-23 13:55:49 +0100211 t.Run("without coverage", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800212 t.Parallel()
Paul Duffin895c7142021-04-25 13:40:15 +0100213 result := preparer.RunTest(t)
Paul Duffinc7d16442021-04-23 13:55:49 +0100214 checkContents(t, result, "mybootlib")
215 })
216
217 t.Run("with coverage", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800218 t.Parallel()
Paul Duffinc7d16442021-04-23 13:55:49 +0100219 result := android.GroupFixturePreparers(
Sam Delmerico1e3f78f2022-09-07 12:07:07 -0400220 prepareForTestWithFrameworkJacocoInstrumentation,
Paul Duffin895c7142021-04-25 13:40:15 +0100221 preparer,
Paul Duffinc7d16442021-04-23 13:55:49 +0100222 ).RunTest(t)
223 checkContents(t, result, "mybootlib", "coveragelib")
224 })
225}
Paul Duffin10931582021-04-25 10:13:54 +0100226
227func TestBootclasspathFragment_StubLibs(t *testing.T) {
228 result := android.GroupFixturePreparers(
229 prepareForTestWithBootclasspathFragment,
230 PrepareForTestWithJavaSdkLibraryFiles,
Paul Duffin34827d42021-05-13 21:25:05 +0100231 FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
satayevabcd5972021-08-06 17:49:46 +0100232 FixtureConfigureApexBootJars("someapex:mysdklibrary"),
Colin Crossa66b4632024-08-08 15:50:47 -0700233 android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
Paul Duffin10931582021-04-25 10:13:54 +0100234 ).RunTestWithBp(t, `
235 bootclasspath_fragment {
236 name: "myfragment",
237 contents: ["mysdklibrary"],
238 api: {
239 stub_libs: [
240 "mystublib",
Paul Duffin34827d42021-05-13 21:25:05 +0100241 "myothersdklibrary",
Paul Duffin10931582021-04-25 10:13:54 +0100242 ],
243 },
244 core_platform_api: {
Paul Duffin3f0290e2021-06-30 18:25:36 +0100245 stub_libs: ["mycoreplatform.stubs"],
Paul Duffin10931582021-04-25 10:13:54 +0100246 },
Paul Duffin9fd56472022-03-31 15:42:30 +0100247 hidden_api: {
248 split_packages: ["*"],
249 },
Paul Duffin10931582021-04-25 10:13:54 +0100250 }
251
252 java_library {
253 name: "mystublib",
254 srcs: ["Test.java"],
255 system_modules: "none",
256 sdk_version: "none",
257 compile_dex: true,
258 }
259
260 java_sdk_library {
261 name: "mysdklibrary",
262 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100263 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100264 public: {enabled: true},
265 system: {enabled: true},
266 }
267
268 java_sdk_library {
Paul Duffin34827d42021-05-13 21:25:05 +0100269 name: "myothersdklibrary",
270 srcs: ["a.java"],
271 shared_library: false,
272 public: {enabled: true},
273 }
274
275 java_sdk_library {
Paul Duffin10931582021-04-25 10:13:54 +0100276 name: "mycoreplatform",
277 srcs: ["a.java"],
Paul Duffinf4600f62021-05-13 22:34:45 +0100278 shared_library: false,
Paul Duffin10931582021-04-25 10:13:54 +0100279 public: {enabled: true},
280 }
281 `)
282
283 fragment := result.Module("myfragment", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000284 info, _ := android.OtherModuleProvider(result, fragment, HiddenAPIInfoProvider)
Paul Duffin10931582021-04-25 10:13:54 +0100285
286 stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
287
Paul Duffin34827d42021-05-13 21:25:05 +0100288 // Stubs jars for mysdklibrary
Jihoon Kangbd093452023-12-26 19:08:01 +0000289 publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar"
290 systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.exportable.system/android_common/dex/mysdklibrary.stubs.exportable.system.jar"
Paul Duffin10931582021-04-25 10:13:54 +0100291
Paul Duffin34827d42021-05-13 21:25:05 +0100292 // Stubs jars for myothersdklibrary
Jihoon Kangbd093452023-12-26 19:08:01 +0000293 otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs.exportable/android_common/dex/myothersdklibrary.stubs.exportable.jar"
Paul Duffin34827d42021-05-13 21:25:05 +0100294
295 // Check that SdkPublic uses public stubs for all sdk libraries.
Paul Duffin280a31a2021-06-27 20:28:29 +0100296 android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(PublicHiddenAPIScope))
Paul Duffin34827d42021-05-13 21:25:05 +0100297
298 // Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary
299 // as it does not provide system stubs.
Paul Duffin280a31a2021-06-27 20:28:29 +0100300 android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(SystemHiddenAPIScope))
Paul Duffin34827d42021-05-13 21:25:05 +0100301
302 // Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs
303 // and public stubs for myothersdklibrary as it does not provide test stubs either.
Paul Duffin280a31a2021-06-27 20:28:29 +0100304 android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(TestHiddenAPIScope))
Paul Duffin10931582021-04-25 10:13:54 +0100305
306 // Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
307 corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
Paul Duffin280a31a2021-06-27 20:28:29 +0100308 android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(CorePlatformHiddenAPIScope))
Paul Duffind2b1e0c2021-06-27 20:53:39 +0100309
Paul Duffin280a31a2021-06-27 20:28:29 +0100310 // Check the widest stubs.. The list contains the widest stub dex jar provided by each module.
311 expectedWidestPaths := []string{
312 // mycoreplatform's widest API is core platform.
313 corePlatformStubsJar,
314
315 // myothersdklibrary's widest API is public.
316 otherPublicStubsJar,
317
318 // sdklibrary's widest API is system.
319 systemStubsJar,
320
321 // mystublib's only provides one API and so it must be the widest.
322 stubsJar,
323 }
324
325 android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", expectedWidestPaths, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope())
Paul Duffin10931582021-04-25 10:13:54 +0100326}
Paul Duffinc15b9e92022-03-31 15:42:30 +0100327
Jihoon Kang244d42a2023-10-06 16:54:58 +0000328func TestFromTextWidestApiScope(t *testing.T) {
329 result := android.GroupFixturePreparers(
330 prepareForTestWithBootclasspathFragment,
331 PrepareForTestWithJavaSdkLibraryFiles,
332 android.FixtureModifyConfig(func(config android.Config) {
333 config.SetBuildFromTextStub(true)
334 }),
335 FixtureWithLastReleaseApis("mysdklibrary", "android-non-updatable"),
336 FixtureConfigureApexBootJars("someapex:mysdklibrary"),
337 ).RunTestWithBp(t, `
338 bootclasspath_fragment {
339 name: "myfragment",
340 contents: ["mysdklibrary"],
341 additional_stubs: [
342 "android-non-updatable",
343 ],
344 hidden_api: {
345 split_packages: ["*"],
346 },
347 }
348 java_sdk_library {
349 name: "mysdklibrary",
350 srcs: ["a.java"],
351 shared_library: false,
352 public: {enabled: true},
353 system: {enabled: true},
354 }
355 java_sdk_library {
356 name: "android-non-updatable",
357 srcs: ["b.java"],
358 compile_dex: true,
359 public: {
360 enabled: true,
361 },
362 system: {
363 enabled: true,
364 },
365 test: {
366 enabled: true,
367 },
368 module_lib: {
369 enabled: true,
370 },
371 }
372 `)
373
Colin Cross90607e92025-02-11 14:58:07 -0800374 fragment := result.ModuleForTests(t, "myfragment", "android_common")
Jihoon Kang244d42a2023-10-06 16:54:58 +0000375 dependencyStubDexFlag := "--dependency-stub-dex=out/soong/.intermediates/default/java/android-non-updatable.stubs.test_module_lib/android_common/dex/android-non-updatable.stubs.test_module_lib.jar"
376 stubFlagsCommand := fragment.Output("modular-hiddenapi/stub-flags.csv").RuleParams.Command
377 android.AssertStringDoesContain(t,
378 "Stub flags generating command does not include the expected dependency stub dex file",
379 stubFlagsCommand, dependencyStubDexFlag)
380}
381
Paul Duffin3f1ae0b2022-07-27 16:27:42 +0000382func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
383 result := android.GroupFixturePreparers(
384 prepareForTestWithBootclasspathFragment,
385 PrepareForTestWithJavaSdkLibraryFiles,
386 FixtureWithLastReleaseApis("mysdklibrary", "mynewlibrary"),
387 FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:mynewlibrary"),
388 android.MockFS{
389 "my-blocked.txt": nil,
390 "my-max-target-o-low-priority.txt": nil,
391 "my-max-target-p.txt": nil,
392 "my-max-target-q.txt": nil,
393 "my-max-target-r-low-priority.txt": nil,
394 "my-removed.txt": nil,
395 "my-unsupported-packages.txt": nil,
396 "my-unsupported.txt": nil,
397 "my-new-max-target-q.txt": nil,
398 }.AddToFixture(),
399 android.FixtureWithRootAndroidBp(`
400 bootclasspath_fragment {
401 name: "mybootclasspathfragment",
402 apex_available: ["myapex"],
403 contents: ["mybootlib", "mynewlibrary"],
404 hidden_api: {
405 unsupported: [
406 "my-unsupported.txt",
407 ],
408 removed: [
409 "my-removed.txt",
410 ],
411 max_target_r_low_priority: [
412 "my-max-target-r-low-priority.txt",
413 ],
414 max_target_q: [
415 "my-max-target-q.txt",
416 ],
417 max_target_p: [
418 "my-max-target-p.txt",
419 ],
420 max_target_o_low_priority: [
421 "my-max-target-o-low-priority.txt",
422 ],
423 blocked: [
424 "my-blocked.txt",
425 ],
426 unsupported_packages: [
427 "my-unsupported-packages.txt",
428 ],
429 split_packages: ["sdklibrary"],
430 package_prefixes: ["sdklibrary.all.mine"],
431 single_packages: ["sdklibrary.mine"],
432 },
433 }
434
435 java_library {
436 name: "mybootlib",
437 apex_available: ["myapex"],
438 srcs: ["Test.java"],
439 system_modules: "none",
440 sdk_version: "none",
441 min_sdk_version: "1",
442 compile_dex: true,
443 permitted_packages: ["mybootlib"],
444 }
445
446 java_sdk_library {
447 name: "mynewlibrary",
448 apex_available: ["myapex"],
449 srcs: ["Test.java"],
450 min_sdk_version: "10",
451 compile_dex: true,
452 public: {enabled: true},
453 permitted_packages: ["mysdklibrary"],
454 hidden_api: {
455 max_target_q: [
456 "my-new-max-target-q.txt",
457 ],
458 split_packages: ["sdklibrary", "newlibrary"],
459 package_prefixes: ["newlibrary.all.mine"],
460 single_packages: ["newlibrary.mine"],
461 },
462 }
463 `),
464 ).RunTest(t)
465
466 // Make sure that the library exports hidden API properties for use by the bootclasspath_fragment.
467 library := result.Module("mynewlibrary", "android_common")
Yu Liu663e4502024-08-12 18:23:59 +0000468 info, _ := android.OtherModuleProvider(result, library, hiddenAPIPropertyInfoProvider)
Paul Duffin3f1ae0b2022-07-27 16:27:42 +0000469 android.AssertArrayString(t, "split packages", []string{"sdklibrary", "newlibrary"}, info.SplitPackages)
470 android.AssertArrayString(t, "package prefixes", []string{"newlibrary.all.mine"}, info.PackagePrefixes)
471 android.AssertArrayString(t, "single packages", []string{"newlibrary.mine"}, info.SinglePackages)
472 for _, c := range HiddenAPIFlagFileCategories {
473 expectedMaxTargetQPaths := []string(nil)
Cole Faust22e8abc2024-01-23 17:52:13 -0800474 if c.PropertyName() == "max_target_q" {
Paul Duffin3f1ae0b2022-07-27 16:27:42 +0000475 expectedMaxTargetQPaths = []string{"my-new-max-target-q.txt"}
476 }
Cole Faust22e8abc2024-01-23 17:52:13 -0800477 android.AssertPathsRelativeToTopEquals(t, c.PropertyName(), expectedMaxTargetQPaths, info.FlagFilesByCategory[c])
Paul Duffin3f1ae0b2022-07-27 16:27:42 +0000478 }
479
480 // Make sure that the signature-patterns.csv is passed all the appropriate package properties
481 // from the bootclasspath_fragment and its contents.
Colin Cross90607e92025-02-11 14:58:07 -0800482 fragment := result.ModuleForTests(t, "mybootclasspathfragment", "android_common")
Paul Duffin3f1ae0b2022-07-27 16:27:42 +0000483 rule := fragment.Output("modular-hiddenapi/signature-patterns.csv")
484 expectedCommand := strings.Join([]string{
485 "--split-package newlibrary",
486 "--split-package sdklibrary",
487 "--package-prefix newlibrary.all.mine",
488 "--package-prefix sdklibrary.all.mine",
489 "--single-package newlibrary.mine",
490 "--single-package sdklibrary",
491 }, " ")
492 android.AssertStringDoesContain(t, "signature patterns command", rule.RuleParams.Command, expectedCommand)
493}
494
Paul Duffinc15b9e92022-03-31 15:42:30 +0100495func TestBootclasspathFragment_Test(t *testing.T) {
496 result := android.GroupFixturePreparers(
497 prepareForTestWithBootclasspathFragment,
498 PrepareForTestWithJavaSdkLibraryFiles,
499 FixtureWithLastReleaseApis("mysdklibrary"),
500 ).RunTestWithBp(t, `
501 bootclasspath_fragment {
502 name: "myfragment",
503 contents: ["mysdklibrary"],
504 hidden_api: {
505 split_packages: [],
506 },
507 }
508
509 bootclasspath_fragment_test {
510 name: "a_test_fragment",
511 contents: ["mysdklibrary"],
512 hidden_api: {
513 split_packages: [],
514 },
515 }
516
517
518 java_sdk_library {
519 name: "mysdklibrary",
520 srcs: ["a.java"],
521 shared_library: false,
522 public: {enabled: true},
523 system: {enabled: true},
524 }
525 `)
526
527 fragment := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
528 android.AssertBoolEquals(t, "not a test fragment", false, fragment.isTestFragment())
529
530 fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule)
531 android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment())
532}