1// 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 sdk
16
17import (
18	"fmt"
19	"path/filepath"
20	"testing"
21
22	"android/soong/android"
23	"android/soong/java"
24)
25
26// fixtureAddPlatformBootclasspathForBootclasspathFragment adds a platform_bootclasspath module that
27// references the bootclasspath fragment.
28func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
29	return android.GroupFixturePreparers(
30		// Add a platform_bootclasspath module.
31		android.FixtureAddTextFile("frameworks/base/boot/Android.bp", fmt.Sprintf(`
32			platform_bootclasspath {
33				name: "platform-bootclasspath",
34				fragments: [
35					{
36						apex: "%s",
37						module: "%s",
38					},
39				],
40			}
41		`, apex, fragment)),
42		android.FixtureAddFile("frameworks/base/config/boot-profile.txt", nil),
43		android.FixtureAddFile("build/soong/scripts/check_boot_jars/package_allowed_list.txt", nil),
44	)
45}
46
47// fixtureAddPrebuiltApexForBootclasspathFragment adds a prebuilt_apex that exports the fragment.
48func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
49	apexFile := fmt.Sprintf("%s.apex", apex)
50	dir := "prebuilts/apex"
51	return android.GroupFixturePreparers(
52		// A preparer to add a prebuilt apex to the test fixture.
53		android.FixtureAddTextFile(filepath.Join(dir, "Android.bp"), fmt.Sprintf(`
54			prebuilt_apex {
55				name: "%s",
56				src: "%s",
57				exported_bootclasspath_fragments: [
58					"%s",
59				],
60			}
61		`, apex, apexFile, fragment)),
62		android.FixtureAddFile(filepath.Join(dir, apexFile), nil),
63	)
64}
65
66func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) {
67	result := android.GroupFixturePreparers(
68		prepareForSdkTestWithJava,
69		java.PrepareForTestWithJavaDefaultModules,
70		prepareForSdkTestWithApex,
71
72		// Some additional files needed for the art apex.
73		android.FixtureMergeMockFs(android.MockFS{
74			"com.android.art.avbpubkey":                          nil,
75			"com.android.art.pem":                                nil,
76			"system/sepolicy/apex/com.android.art-file_contexts": nil,
77		}),
78
79		// Add a platform_bootclasspath that depends on the fragment.
80		fixtureAddPlatformBootclasspathForBootclasspathFragment("com.android.art", "mybootclasspathfragment"),
81
82		java.FixtureConfigureBootJars("com.android.art:mybootlib"),
83		android.FixtureWithRootAndroidBp(`
84			sdk {
85				name: "mysdk",
86				bootclasspath_fragments: ["mybootclasspathfragment"],
87			}
88
89			apex {
90				name: "com.android.art",
91				key: "com.android.art.key",
92				bootclasspath_fragments: [
93					"mybootclasspathfragment",
94				],
95				updatable: false,
96			}
97
98			bootclasspath_fragment {
99				name: "mybootclasspathfragment",
100				image_name: "art",
101				contents: ["mybootlib"],
102				apex_available: ["com.android.art"],
103			}
104
105			apex_key {
106				name: "com.android.art.key",
107				public_key: "com.android.art.avbpubkey",
108				private_key: "com.android.art.pem",
109			}
110
111			java_library {
112				name: "mybootlib",
113				srcs: ["Test.java"],
114				system_modules: "none",
115				sdk_version: "none",
116				compile_dex: true,
117				apex_available: ["com.android.art"],
118			}
119		`),
120	).RunTest(t)
121
122	// A preparer to update the test fixture used when processing an unpackage snapshot.
123	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("com.android.art", "mybootclasspathfragment")
124
125	CheckSnapshot(t, result, "mysdk", "",
126		checkUnversionedAndroidBpContents(`
127// This is auto-generated. DO NOT EDIT.
128
129prebuilt_bootclasspath_fragment {
130    name: "mybootclasspathfragment",
131    prefer: false,
132    visibility: ["//visibility:public"],
133    apex_available: ["com.android.art"],
134    image_name: "art",
135    contents: ["mybootlib"],
136    hidden_api: {
137        stub_flags: "hiddenapi/stub-flags.csv",
138        annotation_flags: "hiddenapi/annotation-flags.csv",
139        metadata: "hiddenapi/metadata.csv",
140        index: "hiddenapi/index.csv",
141        all_flags: "hiddenapi/all-flags.csv",
142    },
143}
144
145java_import {
146    name: "mybootlib",
147    prefer: false,
148    visibility: ["//visibility:public"],
149    apex_available: ["com.android.art"],
150    jars: ["java/mybootlib.jar"],
151}
152`),
153		checkVersionedAndroidBpContents(`
154// This is auto-generated. DO NOT EDIT.
155
156prebuilt_bootclasspath_fragment {
157    name: "mysdk_mybootclasspathfragment@current",
158    sdk_member_name: "mybootclasspathfragment",
159    visibility: ["//visibility:public"],
160    apex_available: ["com.android.art"],
161    image_name: "art",
162    contents: ["mysdk_mybootlib@current"],
163    hidden_api: {
164        stub_flags: "hiddenapi/stub-flags.csv",
165        annotation_flags: "hiddenapi/annotation-flags.csv",
166        metadata: "hiddenapi/metadata.csv",
167        index: "hiddenapi/index.csv",
168        all_flags: "hiddenapi/all-flags.csv",
169    },
170}
171
172java_import {
173    name: "mysdk_mybootlib@current",
174    sdk_member_name: "mybootlib",
175    visibility: ["//visibility:public"],
176    apex_available: ["com.android.art"],
177    jars: ["java/mybootlib.jar"],
178}
179
180sdk_snapshot {
181    name: "mysdk@current",
182    visibility: ["//visibility:public"],
183    bootclasspath_fragments: ["mysdk_mybootclasspathfragment@current"],
184    java_boot_libs: ["mysdk_mybootlib@current"],
185}
186`),
187		checkAllCopyRules(`
188.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/stub-flags.csv -> hiddenapi/stub-flags.csv
189.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
190.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
191.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
192.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/all-flags.csv -> hiddenapi/all-flags.csv
193.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
194		`),
195		snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
196
197		// Check the behavior of the snapshot without the source.
198		snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
199			// Make sure that the boot jars package check rule includes the dex jar retrieved from the prebuilt apex.
200			checkBootJarsPackageCheckRule(t, result, "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/mybootlib.jar")
201		}),
202
203		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
204		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
205	)
206
207	// Make sure that the boot jars package check rule includes the dex jar created from the source.
208	checkBootJarsPackageCheckRule(t, result, "out/soong/.intermediates/mybootlib/android_common_apex10000/aligned/mybootlib.jar")
209}
210
211// checkBootJarsPackageCheckRule checks that the supplied module is an input to the boot jars
212// package check rule.
213func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, expectedModule string) {
214	platformBcp := result.ModuleForTests("platform-bootclasspath", "android_common")
215	bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
216	command := bootJarsCheckRule.RuleParams.Command
217	expectedCommandArgs := " out/soong/host/linux-x86/bin/dexdump build/soong/scripts/check_boot_jars/package_allowed_list.txt " + expectedModule + " &&"
218	android.AssertStringDoesContain(t, "boot jars package check", command, expectedCommandArgs)
219}
220
221func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) {
222	result := android.GroupFixturePreparers(
223		prepareForSdkTestWithJava,
224		java.PrepareForTestWithJavaDefaultModules,
225		java.PrepareForTestWithJavaSdkLibraryFiles,
226		java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
227		java.FixtureConfigureUpdatableBootJars("myapex:mybootlib", "myapex:myothersdklibrary"),
228		prepareForSdkTestWithApex,
229
230		// Add a platform_bootclasspath that depends on the fragment.
231		fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
232
233		android.FixtureWithRootAndroidBp(`
234			sdk {
235				name: "mysdk",
236				bootclasspath_fragments: ["mybootclasspathfragment"],
237				java_sdk_libs: [
238					// This is not strictly needed as it should be automatically added to the sdk_snapshot as
239					// a java_sdk_libs module because it is used in the mybootclasspathfragment's
240					// api.stub_libs property. However, it is specified here to ensure that duplicates are
241					// correctly deduped.
242					"mysdklibrary",
243				],
244			}
245
246			apex {
247				name: "myapex",
248				key: "myapex.key",
249				min_sdk_version: "2",
250				bootclasspath_fragments: ["mybootclasspathfragment"],
251			}
252
253			bootclasspath_fragment {
254				name: "mybootclasspathfragment",
255				apex_available: ["myapex"],
256				contents: [
257					// This should be automatically added to the sdk_snapshot as a java_boot_libs module.
258					"mybootlib",
259					// This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
260					"myothersdklibrary",
261				],
262				api: {
263					stub_libs: ["mysdklibrary"],
264				},
265				core_platform_api: {
266					// This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
267					stub_libs: ["mycoreplatform"],
268				},
269			}
270
271			java_library {
272				name: "mybootlib",
273				apex_available: ["myapex"],
274				srcs: ["Test.java"],
275				system_modules: "none",
276				sdk_version: "none",
277				min_sdk_version: "2",
278				compile_dex: true,
279				permitted_packages: ["mybootlib"],
280			}
281
282			java_sdk_library {
283				name: "mysdklibrary",
284				apex_available: ["myapex"],
285				srcs: ["Test.java"],
286				shared_library: false,
287				public: {enabled: true},
288				min_sdk_version: "2",
289			}
290
291			java_sdk_library {
292				name: "myothersdklibrary",
293				apex_available: ["myapex"],
294				srcs: ["Test.java"],
295				compile_dex: true,
296				public: {enabled: true},
297				min_sdk_version: "2",
298				permitted_packages: ["myothersdklibrary"],
299			}
300
301			java_sdk_library {
302				name: "mycoreplatform",
303				apex_available: ["myapex"],
304				srcs: ["Test.java"],
305				compile_dex: true,
306				public: {enabled: true},
307				min_sdk_version: "2",
308			}
309		`),
310	).RunTest(t)
311
312	// A preparer to update the test fixture used when processing an unpackage snapshot.
313	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
314
315	CheckSnapshot(t, result, "mysdk", "",
316		checkUnversionedAndroidBpContents(`
317// This is auto-generated. DO NOT EDIT.
318
319prebuilt_bootclasspath_fragment {
320    name: "mybootclasspathfragment",
321    prefer: false,
322    visibility: ["//visibility:public"],
323    apex_available: ["myapex"],
324    contents: [
325        "mybootlib",
326        "myothersdklibrary",
327    ],
328    api: {
329        stub_libs: ["mysdklibrary"],
330    },
331    core_platform_api: {
332        stub_libs: ["mycoreplatform"],
333    },
334    hidden_api: {
335        stub_flags: "hiddenapi/stub-flags.csv",
336        annotation_flags: "hiddenapi/annotation-flags.csv",
337        metadata: "hiddenapi/metadata.csv",
338        index: "hiddenapi/index.csv",
339        all_flags: "hiddenapi/all-flags.csv",
340    },
341}
342
343java_import {
344    name: "mybootlib",
345    prefer: false,
346    visibility: ["//visibility:public"],
347    apex_available: ["myapex"],
348    jars: ["java/mybootlib.jar"],
349    permitted_packages: ["mybootlib"],
350}
351
352java_sdk_library_import {
353    name: "myothersdklibrary",
354    prefer: false,
355    visibility: ["//visibility:public"],
356    apex_available: ["myapex"],
357    shared_library: true,
358    compile_dex: true,
359    permitted_packages: ["myothersdklibrary"],
360    public: {
361        jars: ["sdk_library/public/myothersdklibrary-stubs.jar"],
362        stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"],
363        current_api: "sdk_library/public/myothersdklibrary.txt",
364        removed_api: "sdk_library/public/myothersdklibrary-removed.txt",
365        sdk_version: "current",
366    },
367}
368
369java_sdk_library_import {
370    name: "mysdklibrary",
371    prefer: false,
372    visibility: ["//visibility:public"],
373    apex_available: ["myapex"],
374    shared_library: false,
375    public: {
376        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
377        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
378        current_api: "sdk_library/public/mysdklibrary.txt",
379        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
380        sdk_version: "current",
381    },
382}
383
384java_sdk_library_import {
385    name: "mycoreplatform",
386    prefer: false,
387    visibility: ["//visibility:public"],
388    apex_available: ["myapex"],
389    shared_library: true,
390    compile_dex: true,
391    public: {
392        jars: ["sdk_library/public/mycoreplatform-stubs.jar"],
393        stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"],
394        current_api: "sdk_library/public/mycoreplatform.txt",
395        removed_api: "sdk_library/public/mycoreplatform-removed.txt",
396        sdk_version: "current",
397    },
398}
399		`),
400		checkVersionedAndroidBpContents(`
401// This is auto-generated. DO NOT EDIT.
402
403prebuilt_bootclasspath_fragment {
404    name: "mysdk_mybootclasspathfragment@current",
405    sdk_member_name: "mybootclasspathfragment",
406    visibility: ["//visibility:public"],
407    apex_available: ["myapex"],
408    contents: [
409        "mysdk_mybootlib@current",
410        "mysdk_myothersdklibrary@current",
411    ],
412    api: {
413        stub_libs: ["mysdk_mysdklibrary@current"],
414    },
415    core_platform_api: {
416        stub_libs: ["mysdk_mycoreplatform@current"],
417    },
418    hidden_api: {
419        stub_flags: "hiddenapi/stub-flags.csv",
420        annotation_flags: "hiddenapi/annotation-flags.csv",
421        metadata: "hiddenapi/metadata.csv",
422        index: "hiddenapi/index.csv",
423        all_flags: "hiddenapi/all-flags.csv",
424    },
425}
426
427java_import {
428    name: "mysdk_mybootlib@current",
429    sdk_member_name: "mybootlib",
430    visibility: ["//visibility:public"],
431    apex_available: ["myapex"],
432    jars: ["java/mybootlib.jar"],
433    permitted_packages: ["mybootlib"],
434}
435
436java_sdk_library_import {
437    name: "mysdk_myothersdklibrary@current",
438    sdk_member_name: "myothersdklibrary",
439    visibility: ["//visibility:public"],
440    apex_available: ["myapex"],
441    shared_library: true,
442    compile_dex: true,
443    permitted_packages: ["myothersdklibrary"],
444    public: {
445        jars: ["sdk_library/public/myothersdklibrary-stubs.jar"],
446        stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"],
447        current_api: "sdk_library/public/myothersdklibrary.txt",
448        removed_api: "sdk_library/public/myothersdklibrary-removed.txt",
449        sdk_version: "current",
450    },
451}
452
453java_sdk_library_import {
454    name: "mysdk_mysdklibrary@current",
455    sdk_member_name: "mysdklibrary",
456    visibility: ["//visibility:public"],
457    apex_available: ["myapex"],
458    shared_library: false,
459    public: {
460        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
461        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
462        current_api: "sdk_library/public/mysdklibrary.txt",
463        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
464        sdk_version: "current",
465    },
466}
467
468java_sdk_library_import {
469    name: "mysdk_mycoreplatform@current",
470    sdk_member_name: "mycoreplatform",
471    visibility: ["//visibility:public"],
472    apex_available: ["myapex"],
473    shared_library: true,
474    compile_dex: true,
475    public: {
476        jars: ["sdk_library/public/mycoreplatform-stubs.jar"],
477        stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"],
478        current_api: "sdk_library/public/mycoreplatform.txt",
479        removed_api: "sdk_library/public/mycoreplatform-removed.txt",
480        sdk_version: "current",
481    },
482}
483
484sdk_snapshot {
485    name: "mysdk@current",
486    visibility: ["//visibility:public"],
487    bootclasspath_fragments: ["mysdk_mybootclasspathfragment@current"],
488    java_boot_libs: ["mysdk_mybootlib@current"],
489    java_sdk_libs: [
490        "mysdk_myothersdklibrary@current",
491        "mysdk_mysdklibrary@current",
492        "mysdk_mycoreplatform@current",
493    ],
494}
495		`),
496		checkAllCopyRules(`
497.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/stub-flags.csv -> hiddenapi/stub-flags.csv
498.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
499.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
500.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
501.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/all-flags.csv -> hiddenapi/all-flags.csv
502.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
503.intermediates/myothersdklibrary.stubs/android_common/javac/myothersdklibrary.stubs.jar -> sdk_library/public/myothersdklibrary-stubs.jar
504.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
505.intermediates/myothersdklibrary.stubs.source/android_common/metalava/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
506.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
507.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
508.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
509.intermediates/mycoreplatform.stubs/android_common/javac/mycoreplatform.stubs.jar -> sdk_library/public/mycoreplatform-stubs.jar
510.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
511.intermediates/mycoreplatform.stubs.source/android_common/metalava/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
512`),
513		snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
514		snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
515			module := result.ModuleForTests("platform-bootclasspath", "android_common")
516			var rule android.TestingBuildParams
517			rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv")
518			java.CheckHiddenAPIRuleInputs(t, "monolithic flags", `
519				out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv
520        out/soong/hiddenapi/hiddenapi-stub-flags.txt
521        snapshot/hiddenapi/annotation-flags.csv
522			`, rule)
523
524			rule = module.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv")
525			java.CheckHiddenAPIRuleInputs(t, "monolithic metadata", `
526				out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv
527        snapshot/hiddenapi/metadata.csv
528			`, rule)
529
530			rule = module.Output("out/soong/hiddenapi/hiddenapi-index.csv")
531			java.CheckHiddenAPIRuleInputs(t, "monolithic index", `
532				out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
533        snapshot/hiddenapi/index.csv
534			`, rule)
535
536			// Make sure that the permitted packages from the prebuilts end up in the
537			// updatable-bcp-packages.txt file.
538			rule = module.Output("updatable-bcp-packages.txt")
539			expectedContents := `'mybootlib\nmyothersdklibrary\n'`
540			android.AssertStringEquals(t, "updatable-bcp-packages.txt", expectedContents, rule.Args["content"])
541		}),
542		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
543		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
544	)
545}
546
547// Test that bootclasspath_fragment works with sdk.
548func TestBasicSdkWithBootclasspathFragment(t *testing.T) {
549	android.GroupFixturePreparers(
550		prepareForSdkTestWithApex,
551		prepareForSdkTestWithJava,
552		android.FixtureAddFile("java/mybootlib.jar", nil),
553		android.FixtureWithRootAndroidBp(`
554		sdk {
555			name: "mysdk",
556			bootclasspath_fragments: ["mybootclasspathfragment"],
557		}
558
559		bootclasspath_fragment {
560			name: "mybootclasspathfragment",
561			image_name: "art",
562			contents: ["mybootlib"],
563			apex_available: ["myapex"],
564		}
565
566		java_library {
567			name: "mybootlib",
568			apex_available: ["myapex"],
569			srcs: ["Test.java"],
570			system_modules: "none",
571			sdk_version: "none",
572			min_sdk_version: "1",
573			compile_dex: true,
574		}
575
576		sdk_snapshot {
577			name: "mysdk@1",
578			bootclasspath_fragments: ["mysdk_mybootclasspathfragment@1"],
579		}
580
581		prebuilt_bootclasspath_fragment {
582			name: "mysdk_mybootclasspathfragment@1",
583			sdk_member_name: "mybootclasspathfragment",
584			prefer: false,
585			visibility: ["//visibility:public"],
586			apex_available: [
587				"myapex",
588			],
589			image_name: "art",
590			contents: ["mysdk_mybootlib@1"],
591		}
592
593		java_import {
594			name: "mysdk_mybootlib@1",
595			sdk_member_name: "mybootlib",
596			visibility: ["//visibility:public"],
597			apex_available: ["com.android.art"],
598			jars: ["java/mybootlib.jar"],
599		}
600	`),
601	).RunTest(t)
602}
603
604func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
605	result := android.GroupFixturePreparers(
606		prepareForSdkTestWithJava,
607		java.PrepareForTestWithJavaDefaultModules,
608		java.PrepareForTestWithJavaSdkLibraryFiles,
609		java.FixtureWithLastReleaseApis("mysdklibrary"),
610		java.FixtureConfigureUpdatableBootJars("myapex:mybootlib"),
611		prepareForSdkTestWithApex,
612
613		// Add a platform_bootclasspath that depends on the fragment.
614		fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
615
616		android.MockFS{
617			"my-blocked.txt":                   nil,
618			"my-max-target-o-low-priority.txt": nil,
619			"my-max-target-p.txt":              nil,
620			"my-max-target-q.txt":              nil,
621			"my-max-target-r-low-priority.txt": nil,
622			"my-removed.txt":                   nil,
623			"my-unsupported-packages.txt":      nil,
624			"my-unsupported.txt":               nil,
625		}.AddToFixture(),
626		android.FixtureWithRootAndroidBp(`
627			sdk {
628				name: "mysdk",
629				bootclasspath_fragments: ["mybootclasspathfragment"],
630			}
631
632			apex {
633				name: "myapex",
634				key: "myapex.key",
635				min_sdk_version: "1",
636				bootclasspath_fragments: ["mybootclasspathfragment"],
637			}
638
639			bootclasspath_fragment {
640				name: "mybootclasspathfragment",
641				apex_available: ["myapex"],
642				contents: ["mybootlib"],
643				api: {
644					stub_libs: ["mysdklibrary"],
645				},
646				hidden_api: {
647					unsupported: [
648							"my-unsupported.txt",
649					],
650					removed: [
651							"my-removed.txt",
652					],
653					max_target_r_low_priority: [
654							"my-max-target-r-low-priority.txt",
655					],
656					max_target_q: [
657							"my-max-target-q.txt",
658					],
659					max_target_p: [
660							"my-max-target-p.txt",
661					],
662					max_target_o_low_priority: [
663							"my-max-target-o-low-priority.txt",
664					],
665					blocked: [
666							"my-blocked.txt",
667					],
668					unsupported_packages: [
669							"my-unsupported-packages.txt",
670					],
671				},
672			}
673
674			java_library {
675				name: "mybootlib",
676				apex_available: ["myapex"],
677				srcs: ["Test.java"],
678				system_modules: "none",
679				sdk_version: "none",
680				min_sdk_version: "1",
681				compile_dex: true,
682				permitted_packages: ["mybootlib"],
683			}
684
685			java_sdk_library {
686				name: "mysdklibrary",
687				srcs: ["Test.java"],
688				compile_dex: true,
689				public: {enabled: true},
690				permitted_packages: ["mysdklibrary"],
691			}
692		`),
693	).RunTest(t)
694
695	// A preparer to update the test fixture used when processing an unpackage snapshot.
696	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
697
698	CheckSnapshot(t, result, "mysdk", "",
699		checkUnversionedAndroidBpContents(`
700// This is auto-generated. DO NOT EDIT.
701
702prebuilt_bootclasspath_fragment {
703    name: "mybootclasspathfragment",
704    prefer: false,
705    visibility: ["//visibility:public"],
706    apex_available: ["myapex"],
707    contents: ["mybootlib"],
708    api: {
709        stub_libs: ["mysdklibrary"],
710    },
711    hidden_api: {
712        unsupported: ["hiddenapi/my-unsupported.txt"],
713        removed: ["hiddenapi/my-removed.txt"],
714        max_target_r_low_priority: ["hiddenapi/my-max-target-r-low-priority.txt"],
715        max_target_q: ["hiddenapi/my-max-target-q.txt"],
716        max_target_p: ["hiddenapi/my-max-target-p.txt"],
717        max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"],
718        blocked: ["hiddenapi/my-blocked.txt"],
719        unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"],
720        stub_flags: "hiddenapi/stub-flags.csv",
721        annotation_flags: "hiddenapi/annotation-flags.csv",
722        metadata: "hiddenapi/metadata.csv",
723        index: "hiddenapi/index.csv",
724        all_flags: "hiddenapi/all-flags.csv",
725    },
726}
727
728java_import {
729    name: "mybootlib",
730    prefer: false,
731    visibility: ["//visibility:public"],
732    apex_available: ["myapex"],
733    jars: ["java/mybootlib.jar"],
734    permitted_packages: ["mybootlib"],
735}
736
737java_sdk_library_import {
738    name: "mysdklibrary",
739    prefer: false,
740    visibility: ["//visibility:public"],
741    apex_available: ["//apex_available:platform"],
742    shared_library: true,
743    compile_dex: true,
744    permitted_packages: ["mysdklibrary"],
745    public: {
746        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
747        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
748        current_api: "sdk_library/public/mysdklibrary.txt",
749        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
750        sdk_version: "current",
751    },
752}
753`),
754		checkAllCopyRules(`
755my-unsupported.txt -> hiddenapi/my-unsupported.txt
756my-removed.txt -> hiddenapi/my-removed.txt
757my-max-target-r-low-priority.txt -> hiddenapi/my-max-target-r-low-priority.txt
758my-max-target-q.txt -> hiddenapi/my-max-target-q.txt
759my-max-target-p.txt -> hiddenapi/my-max-target-p.txt
760my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt
761my-blocked.txt -> hiddenapi/my-blocked.txt
762my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt
763.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/stub-flags.csv -> hiddenapi/stub-flags.csv
764.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
765.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
766.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
767.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/all-flags.csv -> hiddenapi/all-flags.csv
768.intermediates/mybootlib/android_common/javac/mybootlib.jar -> java/mybootlib.jar
769.intermediates/mysdklibrary.stubs/android_common/javac/mysdklibrary.stubs.jar -> sdk_library/public/mysdklibrary-stubs.jar
770.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
771.intermediates/mysdklibrary.stubs.source/android_common/metalava/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
772`),
773		snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
774		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
775		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
776	)
777}
778