xref: /aosp_15_r20/build/soong/sdk/bootclasspath_fragment_sdk_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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	"strings"
21	"testing"
22
23	"android/soong/android"
24	"android/soong/java"
25)
26
27// fixtureAddPlatformBootclasspathForBootclasspathFragment adds a platform_bootclasspath module that
28// references the bootclasspath fragment.
29func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
30	return fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, "")
31}
32
33// fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra is the same as above, but also adds extra fragments.
34func fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, extraFragments string) android.FixturePreparer {
35	return android.GroupFixturePreparers(
36		// Add a platform_bootclasspath module.
37		android.FixtureAddTextFile("frameworks/base/boot/Android.bp", fmt.Sprintf(`
38			platform_bootclasspath {
39				name: "platform-bootclasspath",
40				fragments: [
41					{
42						apex: "%s",
43						module: "%s",
44					},
45					%s
46				],
47			}
48		`, apex, fragment, extraFragments)),
49		android.FixtureAddFile("frameworks/base/boot/boot-profile.txt", nil),
50		android.FixtureAddFile("frameworks/base/boot/boot-image-profile.txt", nil),
51		android.FixtureAddFile("art/build/boot/boot-image-profile.txt", nil),
52		android.FixtureAddFile("build/soong/scripts/check_boot_jars/package_allowed_list.txt", nil),
53	)
54}
55
56// fixtureAddPrebuiltApexForBootclasspathFragment adds a prebuilt_apex that exports the fragment.
57func fixtureAddPrebuiltApexForBootclasspathFragment(apex, fragment string) android.FixturePreparer {
58	apexFile := fmt.Sprintf("%s.apex", apex)
59	dir := "prebuilts/apex"
60	return android.GroupFixturePreparers(
61		// A preparer to add a prebuilt apex to the test fixture.
62		android.FixtureAddTextFile(filepath.Join(dir, "Android.bp"), fmt.Sprintf(`
63			prebuilt_apex {
64				name: "%s",
65				src: "%s",
66				exported_bootclasspath_fragments: [
67					"%s",
68				],
69			}
70		`, apex, apexFile, fragment)),
71		android.FixtureAddFile(filepath.Join(dir, apexFile), nil),
72	)
73}
74
75func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) {
76	result := android.GroupFixturePreparers(
77		prepareForSdkTestWithJava,
78		java.PrepareForTestWithDexpreopt,
79		prepareForSdkTestWithApex,
80
81		// Some additional files needed for the art apex.
82		android.FixtureMergeMockFs(android.MockFS{
83			"com.android.art.avbpubkey":                          nil,
84			"com.android.art.pem":                                nil,
85			"system/sepolicy/apex/com.android.art-file_contexts": nil,
86		}),
87
88		// Add a platform_bootclasspath that depends on the fragment.
89		fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(
90			"com.android.art", "art-bootclasspath-fragment", java.ApexBootJarFragmentsForPlatformBootclasspath),
91
92		java.PrepareForBootImageConfigTest,
93		java.PrepareApexBootJarConfigsAndModules,
94		android.FixtureWithRootAndroidBp(`
95			sdk {
96				name: "mysdk",
97				bootclasspath_fragments: ["art-bootclasspath-fragment"],
98			}
99
100			apex {
101				name: "com.android.art",
102				key: "com.android.art.key",
103				bootclasspath_fragments: [
104					"art-bootclasspath-fragment",
105				],
106				updatable: false,
107			}
108
109			bootclasspath_fragment {
110				name: "art-bootclasspath-fragment",
111				image_name: "art",
112				contents: ["core1", "core2"],
113				apex_available: ["com.android.art"],
114				hidden_api: {
115					split_packages: ["*"],
116				},
117			}
118
119			apex_key {
120				name: "com.android.art.key",
121				public_key: "com.android.art.avbpubkey",
122				private_key: "com.android.art.pem",
123			}
124
125			java_library {
126				name: "core1",
127				srcs: ["Test.java"],
128				system_modules: "none",
129				sdk_version: "none",
130				compile_dex: true,
131				apex_available: ["com.android.art"],
132			}
133
134			java_library {
135				name: "core2",
136				srcs: ["Test.java"],
137				system_modules: "none",
138				sdk_version: "none",
139				compile_dex: true,
140				apex_available: ["com.android.art"],
141			}
142`),
143	).RunTest(t)
144
145	// A preparer to update the test fixture used when processing an unpackage snapshot.
146	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("com.android.art", "art-bootclasspath-fragment")
147
148	// Check that source on its own configures the bootImageConfig correctly.
149	java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
150	java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
151
152	CheckSnapshot(t, result, "mysdk", "",
153		checkAndroidBpContents(`
154// This is auto-generated. DO NOT EDIT.
155
156apex_contributions_defaults {
157    name: "mysdk.contributions",
158    contents: [],
159}
160
161prebuilt_bootclasspath_fragment {
162    name: "art-bootclasspath-fragment",
163    prefer: false,
164    visibility: ["//visibility:public"],
165    apex_available: ["com.android.art"],
166    image_name: "art",
167    contents: [
168        "core1",
169        "core2",
170    ],
171    hidden_api: {
172        annotation_flags: "hiddenapi/annotation-flags.csv",
173        metadata: "hiddenapi/metadata.csv",
174        index: "hiddenapi/index.csv",
175        signature_patterns: "hiddenapi/signature-patterns.csv",
176        filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
177        filtered_flags: "hiddenapi/filtered-flags.csv",
178    },
179}
180
181java_import {
182    name: "core1",
183    prefer: false,
184    visibility: ["//visibility:public"],
185    apex_available: ["com.android.art"],
186    jars: ["java_boot_libs/snapshot/jars/are/invalid/core1.jar"],
187}
188
189java_import {
190    name: "core2",
191    prefer: false,
192    visibility: ["//visibility:public"],
193    apex_available: ["com.android.art"],
194    jars: ["java_boot_libs/snapshot/jars/are/invalid/core2.jar"],
195}
196
197`),
198		checkAllCopyRules(`
199.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
200.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
201.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
202.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
203.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
204.intermediates/art-bootclasspath-fragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
205.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/core1.jar
206.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/core2.jar
207		`),
208		snapshotTestPreparer(checkSnapshotWithoutSource, android.GroupFixturePreparers(
209			preparerForSnapshot,
210			// Flag ART prebuilts
211			android.FixtureMergeMockFs(android.MockFS{
212				"apex_contributions/Android.bp": []byte(`
213				apex_contributions {
214					name: "prebuilt_art_contributions",
215					contents: ["prebuilt_com.android.art"],
216					api_domain: "com.android.art",
217				}
218			`)}),
219			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "prebuilt_art_contributions"),
220		)),
221
222		// Check the behavior of the snapshot without the source.
223		snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
224			// Make sure that the boot jars package check rule includes the dex jars retrieved from the prebuilt apex.
225			checkBootJarsPackageCheckRule(t, result,
226				append(
227					[]string{
228						"out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_com.android.art/deapexer/javalib/core1.jar",
229						"out/soong/.intermediates/prebuilts/apex/com.android.art/android_common_com.android.art/deapexer/javalib/core2.jar",
230						"out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar",
231					},
232					java.ApexBootJarDexJarPaths...,
233				)...,
234			)
235			java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
236			java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
237		}),
238
239		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
240
241		// Check the behavior of the snapshot when the source is preferred.
242		snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) {
243			java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
244			java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
245		}),
246
247		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
248
249		// Check the behavior of the snapshot when it is preferred.
250		snapshotTestChecker(checkSnapshotPreferredWithSource, func(t *testing.T, result *android.TestResult) {
251			java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
252			java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/default/java/dex_bootjars/android_common/meta_lic")
253		}),
254	)
255
256	// Make sure that the boot jars package check rule includes the dex jars created from the source.
257	checkBootJarsPackageCheckRule(t, result,
258		append(
259			[]string{
260				"out/soong/.intermediates/core1/android_common_apex10000/aligned/core1.jar",
261				"out/soong/.intermediates/core2/android_common_apex10000/aligned/core2.jar",
262				"out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar",
263			},
264			java.ApexBootJarDexJarPaths...,
265		)...,
266	)
267}
268
269// checkBootJarsPackageCheckRule checks that the supplied module is an input to the boot jars
270// package check rule.
271func checkBootJarsPackageCheckRule(t *testing.T, result *android.TestResult, expectedModules ...string) {
272	t.Helper()
273	platformBcp := result.ModuleForTests("platform-bootclasspath", "android_common")
274	bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
275	command := bootJarsCheckRule.RuleParams.Command
276	expectedCommandArgs := " build/soong/scripts/check_boot_jars/package_allowed_list.txt " + strings.Join(expectedModules, " ") + " &&"
277	android.AssertStringDoesContain(t, "boot jars package check", command, expectedCommandArgs)
278}
279
280func testSnapshotWithBootClasspathFragment_Contents(t *testing.T, sdk string, copyRules string) {
281	result := android.GroupFixturePreparers(
282		prepareForSdkTestWithJava,
283		java.PrepareForTestWithJavaDefaultModules,
284		java.PrepareForTestWithJavaSdkLibraryFiles,
285		java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
286		java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:myothersdklibrary"),
287		prepareForSdkTestWithApex,
288
289		// Add a platform_bootclasspath that depends on the fragment.
290		fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
291
292		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
293		// Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
294		// file creation.
295		java.FixtureConfigureBootJars("platform:foo"),
296		android.FixtureModifyMockFS(func(fs android.MockFS) {
297			fs["platform/Android.bp"] = []byte(`
298		java_library {
299			name: "foo",
300			srcs: ["Test.java"],
301			compile_dex: true,
302		}
303		`)
304			fs["platform/Test.java"] = nil
305		}),
306
307		android.FixtureWithRootAndroidBp(sdk+`
308			apex {
309				name: "myapex",
310				key: "myapex.key",
311				min_sdk_version: "2",
312				bootclasspath_fragments: ["mybootclasspathfragment"],
313			}
314
315			bootclasspath_fragment {
316				name: "mybootclasspathfragment",
317				apex_available: ["myapex"],
318				contents: [
319					// This should be automatically added to the sdk_snapshot as a java_boot_libs module.
320					"mybootlib",
321					// This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
322					"myothersdklibrary",
323				],
324				api: {
325					stub_libs: ["mysdklibrary"],
326				},
327				core_platform_api: {
328					// This should be automatically added to the sdk_snapshot as a java_sdk_libs module.
329					stub_libs: ["mycoreplatform"],
330				},
331				hidden_api: {
332					split_packages: ["*"],
333				},
334			}
335
336			java_library {
337				name: "mybootlib",
338				apex_available: ["myapex"],
339				srcs: ["Test.java"],
340				system_modules: "none",
341				sdk_version: "none",
342				min_sdk_version: "2",
343				compile_dex: true,
344				permitted_packages: ["mybootlib"],
345			}
346
347			java_sdk_library {
348				name: "mysdklibrary",
349				apex_available: ["myapex"],
350				srcs: ["Test.java"],
351				shared_library: false,
352				public: {enabled: true},
353				min_sdk_version: "2",
354				sdk_version: "current",
355			}
356
357			java_sdk_library {
358				name: "myothersdklibrary",
359				apex_available: ["myapex"],
360				srcs: ["Test.java"],
361				compile_dex: true,
362				public: {enabled: true},
363				min_sdk_version: "2",
364				permitted_packages: ["myothersdklibrary"],
365				sdk_version: "current",
366			}
367
368			java_sdk_library {
369				name: "mycoreplatform",
370				apex_available: ["myapex"],
371				srcs: ["Test.java"],
372				compile_dex: true,
373				public: {enabled: true},
374				min_sdk_version: "2",
375				sdk_version: "current",
376			}
377		`),
378	).RunTest(t)
379
380	// A preparer to update the test fixture used when processing an unpackage snapshot.
381	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
382
383	CheckSnapshot(t, result, "mysdk", "",
384		checkAndroidBpContents(`
385// This is auto-generated. DO NOT EDIT.
386
387apex_contributions_defaults {
388    name: "mysdk.contributions",
389    contents: [
390        "prebuilt_myothersdklibrary",
391        "prebuilt_mysdklibrary",
392        "prebuilt_mycoreplatform",
393    ],
394}
395
396prebuilt_bootclasspath_fragment {
397    name: "mybootclasspathfragment",
398    prefer: false,
399    visibility: ["//visibility:public"],
400    apex_available: ["myapex"],
401    contents: [
402        "mybootlib",
403        "myothersdklibrary",
404    ],
405    api: {
406        stub_libs: ["mysdklibrary"],
407    },
408    core_platform_api: {
409        stub_libs: ["mycoreplatform"],
410    },
411    hidden_api: {
412        annotation_flags: "hiddenapi/annotation-flags.csv",
413        metadata: "hiddenapi/metadata.csv",
414        index: "hiddenapi/index.csv",
415        signature_patterns: "hiddenapi/signature-patterns.csv",
416        filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
417        filtered_flags: "hiddenapi/filtered-flags.csv",
418    },
419}
420
421java_import {
422    name: "mybootlib",
423    prefer: false,
424    visibility: ["//visibility:public"],
425    apex_available: ["myapex"],
426    jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
427    min_sdk_version: "2",
428    permitted_packages: ["mybootlib"],
429}
430
431java_sdk_library_import {
432    name: "myothersdklibrary",
433    prefer: false,
434    visibility: ["//visibility:public"],
435    apex_available: ["myapex"],
436    shared_library: true,
437    compile_dex: true,
438    permitted_packages: ["myothersdklibrary"],
439    public: {
440        jars: ["sdk_library/public/myothersdklibrary-stubs.jar"],
441        stub_srcs: ["sdk_library/public/myothersdklibrary_stub_sources"],
442        current_api: "sdk_library/public/myothersdklibrary.txt",
443        removed_api: "sdk_library/public/myothersdklibrary-removed.txt",
444        sdk_version: "current",
445    },
446}
447
448java_sdk_library_import {
449    name: "mysdklibrary",
450    prefer: false,
451    visibility: ["//visibility:public"],
452    apex_available: ["myapex"],
453    shared_library: false,
454    public: {
455        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
456        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
457        current_api: "sdk_library/public/mysdklibrary.txt",
458        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
459        sdk_version: "current",
460    },
461}
462
463java_sdk_library_import {
464    name: "mycoreplatform",
465    prefer: false,
466    visibility: ["//visibility:public"],
467    apex_available: ["myapex"],
468    shared_library: true,
469    compile_dex: true,
470    public: {
471        jars: ["sdk_library/public/mycoreplatform-stubs.jar"],
472        stub_srcs: ["sdk_library/public/mycoreplatform_stub_sources"],
473        current_api: "sdk_library/public/mycoreplatform.txt",
474        removed_api: "sdk_library/public/mycoreplatform-removed.txt",
475        sdk_version: "current",
476    },
477}
478		`),
479		checkAllCopyRules(copyRules),
480		snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
481		snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) {
482			module := result.ModuleForTests("platform-bootclasspath", "android_common")
483			var rule android.TestingBuildParams
484			rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv")
485			java.CheckHiddenAPIRuleInputs(t, "monolithic flags", `
486				out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/annotation-flags-from-classes.csv
487        out/soong/hiddenapi/hiddenapi-stub-flags.txt
488        snapshot/hiddenapi/annotation-flags.csv
489			`, rule)
490
491			rule = module.Output("out/soong/hiddenapi/hiddenapi-unsupported.csv")
492			java.CheckHiddenAPIRuleInputs(t, "monolithic metadata", `
493				out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/metadata-from-classes.csv
494        snapshot/hiddenapi/metadata.csv
495			`, rule)
496
497			rule = module.Output("out/soong/hiddenapi/hiddenapi-index.csv")
498			java.CheckHiddenAPIRuleInputs(t, "monolithic index", `
499				out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
500        snapshot/hiddenapi/index.csv
501			`, rule)
502
503			rule = module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid")
504			android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " snapshot/hiddenapi/filtered-flags.csv:snapshot/hiddenapi/signature-patterns.csv ")
505		}),
506		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
507		snapshotTestChecker(checkSnapshotWithSourcePreferred, func(t *testing.T, result *android.TestResult) {
508			module := result.ModuleForTests("platform-bootclasspath", "android_common")
509			rule := module.Output("out/soong/hiddenapi/hiddenapi-flags.csv.valid")
510			android.AssertStringDoesContain(t, "verify-overlaps", rule.RuleParams.Command, " out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv ")
511		}),
512		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
513	)
514}
515
516func TestSnapshotWithBootClasspathFragment_Contents(t *testing.T) {
517	t.Run("added-directly", func(t *testing.T) {
518		testSnapshotWithBootClasspathFragment_Contents(t, `
519			sdk {
520				name: "mysdk",
521				bootclasspath_fragments: ["mybootclasspathfragment"],
522				java_sdk_libs: [
523					// This is not strictly needed as it should be automatically added to the sdk_snapshot as
524					// a java_sdk_libs module because it is used in the mybootclasspathfragment's
525					// api.stub_libs property. However, it is specified here to ensure that duplicates are
526					// correctly deduped.
527					"mysdklibrary",
528				],
529			}
530		`, `
531.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
532.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
533.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
534.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
535.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
536.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
537.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
538.intermediates/myothersdklibrary.stubs.exportable/android_common/combined/myothersdklibrary.stubs.exportable.jar -> sdk_library/public/myothersdklibrary-stubs.jar
539.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
540.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
541.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar
542.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
543.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
544.intermediates/mycoreplatform.stubs.exportable/android_common/combined/mycoreplatform.stubs.exportable.jar -> sdk_library/public/mycoreplatform-stubs.jar
545.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
546.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
547`)
548	})
549
550	copyBootclasspathFragmentFromApexVariantRules := `
551.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
552.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
553.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv
554.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
555.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
556.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
557.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
558.intermediates/myothersdklibrary.stubs.exportable/android_common/combined/myothersdklibrary.stubs.exportable.jar -> sdk_library/public/myothersdklibrary-stubs.jar
559.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_api.txt -> sdk_library/public/myothersdklibrary.txt
560.intermediates/myothersdklibrary.stubs.source/android_common/exportable/myothersdklibrary.stubs.source_removed.txt -> sdk_library/public/myothersdklibrary-removed.txt
561.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar
562.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
563.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
564.intermediates/mycoreplatform.stubs.exportable/android_common/combined/mycoreplatform.stubs.exportable.jar -> sdk_library/public/mycoreplatform-stubs.jar
565.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_api.txt -> sdk_library/public/mycoreplatform.txt
566.intermediates/mycoreplatform.stubs.source/android_common/exportable/mycoreplatform.stubs.source_removed.txt -> sdk_library/public/mycoreplatform-removed.txt
567`
568	t.Run("added-via-apex", func(t *testing.T) {
569		testSnapshotWithBootClasspathFragment_Contents(t, `
570			sdk {
571				name: "mysdk",
572				apexes: ["myapex"],
573			}
574		`, copyBootclasspathFragmentFromApexVariantRules)
575	})
576
577	t.Run("added-directly-and-indirectly", func(t *testing.T) {
578		testSnapshotWithBootClasspathFragment_Contents(t, `
579			sdk {
580				name: "mysdk",
581				apexes: ["myapex"],
582				// This is not strictly needed as it should be automatically added to the sdk_snapshot as
583				// a bootclasspath_fragments module because it is used in the myapex's
584				// bootclasspath_fragments property. However, it is specified here to ensure that duplicates
585				// are correctly deduped.
586				bootclasspath_fragments: ["mybootclasspathfragment"],
587				java_sdk_libs: [
588					// This is not strictly needed as it should be automatically added to the sdk_snapshot as
589					// a java_sdk_libs module because it is used in the mybootclasspathfragment's
590					// api.stub_libs property. However, it is specified here to ensure that duplicates are
591					// correctly deduped.
592					"mysdklibrary",
593				],
594			}
595		`, copyBootclasspathFragmentFromApexVariantRules)
596	})
597}
598
599// TestSnapshotWithBootClasspathFragment_Fragments makes sure that the fragments property of a
600// bootclasspath_fragment is correctly output to the sdk snapshot.
601func TestSnapshotWithBootClasspathFragment_Fragments(t *testing.T) {
602	result := android.GroupFixturePreparers(
603		prepareForSdkTestWithJava,
604		java.PrepareForTestWithJavaDefaultModules,
605		java.PrepareForTestWithJavaSdkLibraryFiles,
606		java.FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary"),
607		java.FixtureConfigureApexBootJars("someapex:mysdklibrary", "myotherapex:myotherlib"),
608		prepareForSdkTestWithApex,
609
610		// Some additional files needed for the myotherapex.
611		android.FixtureMergeMockFs(android.MockFS{
612			"system/sepolicy/apex/myotherapex-file_contexts": nil,
613			"myotherapex/apex_manifest.json":                 nil,
614			"myotherapex/Test.java":                          nil,
615		}),
616
617		android.FixtureAddTextFile("myotherapex/Android.bp", `
618			apex {
619				name: "myotherapex",
620				key: "myapex.key",
621				min_sdk_version: "2",
622				bootclasspath_fragments: ["myotherbootclasspathfragment"],
623			}
624
625			bootclasspath_fragment {
626				name: "myotherbootclasspathfragment",
627				apex_available: ["myotherapex"],
628				contents: [
629					"myotherlib",
630				],
631				hidden_api: {
632					split_packages: ["*"],
633				},
634			}
635
636			java_library {
637				name: "myotherlib",
638				apex_available: ["myotherapex"],
639				srcs: ["Test.java"],
640				min_sdk_version: "2",
641				permitted_packages: ["myothersdklibrary"],
642				compile_dex: true,
643				sdk_version: "current",
644			}
645		`),
646
647		android.FixtureWithRootAndroidBp(`
648			sdk {
649				name: "mysdk",
650				bootclasspath_fragments: ["mybootclasspathfragment"],
651			}
652
653			bootclasspath_fragment {
654				name: "mybootclasspathfragment",
655				contents: [
656					"mysdklibrary",
657				],
658				fragments: [
659					{
660						apex: "myotherapex",
661						module: "myotherbootclasspathfragment"
662					},
663				],
664				hidden_api: {
665					split_packages: ["*"],
666				},
667			}
668
669			java_sdk_library {
670				name: "mysdklibrary",
671				srcs: ["Test.java"],
672				shared_library: false,
673				public: {enabled: true},
674				min_sdk_version: "2",
675				sdk_version: "current",
676			}
677		`),
678	).RunTest(t)
679
680	// A preparer to update the test fixture used when processing an unpackage snapshot.
681	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
682
683	CheckSnapshot(t, result, "mysdk", "",
684		checkAndroidBpContents(`
685// This is auto-generated. DO NOT EDIT.
686
687apex_contributions_defaults {
688    name: "mysdk.contributions",
689    contents: ["prebuilt_mysdklibrary"],
690}
691
692prebuilt_bootclasspath_fragment {
693    name: "mybootclasspathfragment",
694    prefer: false,
695    visibility: ["//visibility:public"],
696    apex_available: ["//apex_available:platform"],
697    contents: ["mysdklibrary"],
698    fragments: [
699        {
700            apex: "myotherapex",
701            module: "myotherbootclasspathfragment",
702        },
703    ],
704    hidden_api: {
705        annotation_flags: "hiddenapi/annotation-flags.csv",
706        metadata: "hiddenapi/metadata.csv",
707        index: "hiddenapi/index.csv",
708        signature_patterns: "hiddenapi/signature-patterns.csv",
709        filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
710        filtered_flags: "hiddenapi/filtered-flags.csv",
711    },
712}
713
714java_sdk_library_import {
715    name: "mysdklibrary",
716    prefer: false,
717    visibility: ["//visibility:public"],
718    apex_available: ["//apex_available:platform"],
719    shared_library: false,
720    public: {
721        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
722        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
723        current_api: "sdk_library/public/mysdklibrary.txt",
724        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
725        sdk_version: "current",
726    },
727}
728		`),
729		snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
730		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
731		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
732	)
733}
734
735// Test that bootclasspath_fragment works with sdk.
736func TestBasicSdkWithBootclasspathFragment(t *testing.T) {
737	android.GroupFixturePreparers(
738		prepareForSdkTestWithApex,
739		prepareForSdkTestWithJava,
740		android.FixtureMergeMockFs(android.MockFS{
741			"java/mybootlib.jar":                nil,
742			"hiddenapi/annotation-flags.csv":    nil,
743			"hiddenapi/index.csv":               nil,
744			"hiddenapi/metadata.csv":            nil,
745			"hiddenapi/signature-patterns.csv":  nil,
746			"hiddenapi/filtered-stub-flags.csv": nil,
747			"hiddenapi/filtered-flags.csv":      nil,
748		}),
749		android.FixtureWithRootAndroidBp(`
750		sdk {
751			name: "mysdk",
752			bootclasspath_fragments: ["mybootclasspathfragment"],
753		}
754
755		bootclasspath_fragment {
756			name: "mybootclasspathfragment",
757			image_name: "art",
758			contents: ["mybootlib"],
759			apex_available: ["myapex"],
760			hidden_api: {
761				split_packages: ["*"],
762			},
763		}
764
765		java_library {
766			name: "mybootlib",
767			apex_available: ["myapex"],
768			srcs: ["Test.java"],
769			system_modules: "none",
770			sdk_version: "none",
771			min_sdk_version: "1",
772			compile_dex: true,
773		}
774
775		prebuilt_bootclasspath_fragment {
776			name: "mybootclasspathfragment",
777			prefer: false,
778			visibility: ["//visibility:public"],
779			apex_available: [
780				"myapex",
781			],
782			image_name: "art",
783			contents: ["mybootlib"],
784			hidden_api: {
785				annotation_flags: "hiddenapi/annotation-flags.csv",
786				metadata: "hiddenapi/metadata.csv",
787				index: "hiddenapi/index.csv",
788				signature_patterns: "hiddenapi/signature-patterns.csv",
789				filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
790				filtered_flags: "hiddenapi/filtered-flags.csv",
791			},
792		}
793
794		java_import {
795			name: "mybootlib",
796			visibility: ["//visibility:public"],
797			apex_available: ["com.android.art"],
798			jars: ["java/mybootlib.jar"],
799		}
800	`),
801	).RunTest(t)
802}
803
804func TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
805	result := android.GroupFixturePreparers(
806		prepareForSdkTestWithJava,
807		java.PrepareForTestWithJavaDefaultModules,
808		java.PrepareForTestWithJavaSdkLibraryFiles,
809		java.FixtureWithLastReleaseApis("mysdklibrary", "mynewlibrary"),
810		java.FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:mynewlibrary"),
811		prepareForSdkTestWithApex,
812
813		// Add a platform_bootclasspath that depends on the fragment.
814		fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
815
816		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
817
818		android.MockFS{
819			"my-blocked.txt":                   nil,
820			"my-max-target-o-low-priority.txt": nil,
821			"my-max-target-p.txt":              nil,
822			"my-max-target-q.txt":              nil,
823			"my-max-target-r-low-priority.txt": nil,
824			"my-removed.txt":                   nil,
825			"my-unsupported-packages.txt":      nil,
826			"my-unsupported.txt":               nil,
827			"my-new-max-target-q.txt":          nil,
828		}.AddToFixture(),
829		android.FixtureWithRootAndroidBp(`
830			sdk {
831				name: "mysdk",
832				bootclasspath_fragments: ["mybootclasspathfragment"],
833			}
834
835			apex {
836				name: "myapex",
837				key: "myapex.key",
838				min_sdk_version: "1",
839				bootclasspath_fragments: ["mybootclasspathfragment"],
840			}
841
842			bootclasspath_fragment {
843				name: "mybootclasspathfragment",
844				apex_available: ["myapex"],
845				contents: ["mybootlib", "mynewlibrary"],
846				api: {
847					stub_libs: ["mysdklibrary"],
848				},
849				hidden_api: {
850					unsupported: [
851							"my-unsupported.txt",
852					],
853					removed: [
854							"my-removed.txt",
855					],
856					max_target_r_low_priority: [
857							"my-max-target-r-low-priority.txt",
858					],
859					max_target_q: [
860							"my-max-target-q.txt",
861					],
862					max_target_p: [
863							"my-max-target-p.txt",
864					],
865					max_target_o_low_priority: [
866							"my-max-target-o-low-priority.txt",
867					],
868					blocked: [
869							"my-blocked.txt",
870					],
871					unsupported_packages: [
872							"my-unsupported-packages.txt",
873					],
874					split_packages: ["sdklibrary"],
875					package_prefixes: ["sdklibrary.all.mine"],
876					single_packages: ["sdklibrary.mine"],
877				},
878			}
879
880			java_library {
881				name: "mybootlib",
882				apex_available: ["myapex"],
883				srcs: ["Test.java"],
884				system_modules: "none",
885				sdk_version: "none",
886				min_sdk_version: "1",
887				compile_dex: true,
888				permitted_packages: ["mybootlib"],
889			}
890
891			java_sdk_library {
892				name: "mysdklibrary",
893				srcs: ["Test.java"],
894				compile_dex: true,
895				public: {enabled: true},
896				permitted_packages: ["mysdklibrary"],
897				min_sdk_version: "current",
898				sdk_version: "current",
899			}
900
901			java_sdk_library {
902				name: "mynewlibrary",
903				apex_available: ["myapex"],
904				srcs: ["Test.java"],
905				min_sdk_version: "10",
906				compile_dex: true,
907				public: {enabled: true},
908				permitted_packages: ["mysdklibrary"],
909				hidden_api: {
910					max_target_q: [
911							"my-new-max-target-q.txt",
912					],
913					split_packages: ["sdklibrary", "newlibrary"],
914					package_prefixes: ["newlibrary.all.mine"],
915					single_packages: ["newlibrary.mine"],
916				},
917				sdk_version: "current",
918			}
919		`),
920	).RunTest(t)
921
922	// A preparer to update the test fixture used when processing an unpackage snapshot.
923	preparerForSnapshot := fixtureAddPrebuiltApexForBootclasspathFragment("myapex", "mybootclasspathfragment")
924
925	CheckSnapshot(t, result, "mysdk", "",
926		checkAndroidBpContents(`
927// This is auto-generated. DO NOT EDIT.
928
929apex_contributions_defaults {
930    name: "mysdk.contributions",
931    contents: [
932        "prebuilt_mynewlibrary",
933        "prebuilt_mysdklibrary",
934    ],
935}
936
937prebuilt_bootclasspath_fragment {
938    name: "mybootclasspathfragment",
939    prefer: false,
940    visibility: ["//visibility:public"],
941    apex_available: ["myapex"],
942    contents: [
943        "mybootlib",
944        "mynewlibrary",
945    ],
946    api: {
947        stub_libs: ["mysdklibrary"],
948    },
949    hidden_api: {
950        unsupported: ["hiddenapi/my-unsupported.txt"],
951        removed: ["hiddenapi/my-removed.txt"],
952        max_target_r_low_priority: ["hiddenapi/my-max-target-r-low-priority.txt"],
953        max_target_q: [
954            "hiddenapi/my-max-target-q.txt",
955            "hiddenapi/my-new-max-target-q.txt",
956        ],
957        max_target_p: ["hiddenapi/my-max-target-p.txt"],
958        max_target_o_low_priority: ["hiddenapi/my-max-target-o-low-priority.txt"],
959        blocked: ["hiddenapi/my-blocked.txt"],
960        unsupported_packages: ["hiddenapi/my-unsupported-packages.txt"],
961        annotation_flags: "hiddenapi/annotation-flags.csv",
962        metadata: "hiddenapi/metadata.csv",
963        index: "hiddenapi/index.csv",
964        signature_patterns: "hiddenapi/signature-patterns.csv",
965        filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
966        filtered_flags: "hiddenapi/filtered-flags.csv",
967    },
968}
969
970java_import {
971    name: "mybootlib",
972    prefer: false,
973    visibility: ["//visibility:public"],
974    apex_available: ["myapex"],
975    jars: ["java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar"],
976    min_sdk_version: "1",
977    permitted_packages: ["mybootlib"],
978}
979
980java_sdk_library_import {
981    name: "mynewlibrary",
982    prefer: false,
983    visibility: ["//visibility:public"],
984    apex_available: ["myapex"],
985    shared_library: true,
986    compile_dex: true,
987    permitted_packages: ["mysdklibrary"],
988    public: {
989        jars: ["sdk_library/public/mynewlibrary-stubs.jar"],
990        stub_srcs: ["sdk_library/public/mynewlibrary_stub_sources"],
991        current_api: "sdk_library/public/mynewlibrary.txt",
992        removed_api: "sdk_library/public/mynewlibrary-removed.txt",
993        sdk_version: "current",
994    },
995}
996
997java_sdk_library_import {
998    name: "mysdklibrary",
999    prefer: false,
1000    visibility: ["//visibility:public"],
1001    apex_available: ["//apex_available:platform"],
1002    shared_library: true,
1003    compile_dex: true,
1004    permitted_packages: ["mysdklibrary"],
1005    public: {
1006        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
1007        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
1008        current_api: "sdk_library/public/mysdklibrary.txt",
1009        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
1010        sdk_version: "current",
1011    },
1012}
1013`),
1014		checkAllCopyRules(`
1015my-unsupported.txt -> hiddenapi/my-unsupported.txt
1016my-removed.txt -> hiddenapi/my-removed.txt
1017my-max-target-r-low-priority.txt -> hiddenapi/my-max-target-r-low-priority.txt
1018my-max-target-q.txt -> hiddenapi/my-max-target-q.txt
1019my-new-max-target-q.txt -> hiddenapi/my-new-max-target-q.txt
1020my-max-target-p.txt -> hiddenapi/my-max-target-p.txt
1021my-max-target-o-low-priority.txt -> hiddenapi/my-max-target-o-low-priority.txt
1022my-blocked.txt -> hiddenapi/my-blocked.txt
1023my-unsupported-packages.txt -> hiddenapi/my-unsupported-packages.txt
1024.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
1025.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
1026.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/index.csv -> hiddenapi/index.csv
1027.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
1028.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
1029.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
1030.intermediates/mysdk/common_os/empty -> java_boot_libs/snapshot/jars/are/invalid/mybootlib.jar
1031.intermediates/mynewlibrary.stubs.exportable/android_common/combined/mynewlibrary.stubs.exportable.jar -> sdk_library/public/mynewlibrary-stubs.jar
1032.intermediates/mynewlibrary.stubs.source/android_common/exportable/mynewlibrary.stubs.source_api.txt -> sdk_library/public/mynewlibrary.txt
1033.intermediates/mynewlibrary.stubs.source/android_common/exportable/mynewlibrary.stubs.source_removed.txt -> sdk_library/public/mynewlibrary-removed.txt
1034.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar
1035.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
1036.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
1037`),
1038		snapshotTestPreparer(checkSnapshotWithoutSource, preparerForSnapshot),
1039		snapshotTestPreparer(checkSnapshotWithSourcePreferred, preparerForSnapshot),
1040		snapshotTestPreparer(checkSnapshotPreferredWithSource, preparerForSnapshot),
1041	)
1042}
1043
1044func testSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T, targetBuildRelease string,
1045	expectedSdkSnapshot string,
1046	expectedCopyRules string,
1047	expectedStubFlagsInputs []string,
1048	suffix string) {
1049
1050	result := android.GroupFixturePreparers(
1051		prepareForSdkTestWithJava,
1052		java.PrepareForTestWithJavaDefaultModules,
1053		java.PrepareForTestWithJavaSdkLibraryFiles,
1054		java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"),
1055		java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"),
1056		prepareForSdkTestWithApex,
1057
1058		// Add a platform_bootclasspath that depends on the fragment.
1059		fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
1060
1061		android.FixtureMergeEnv(map[string]string{
1062			"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": targetBuildRelease,
1063		}),
1064		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1065			variables.Platform_version_active_codenames = []string{"VanillaIceCream"}
1066		}),
1067
1068		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
1069
1070		android.FixtureWithRootAndroidBp(`
1071			sdk {
1072				name: "mysdk",
1073				apexes: ["myapex"],
1074			}
1075
1076			apex {
1077				name: "myapex",
1078				key: "myapex.key",
1079				min_sdk_version: "S",
1080				bootclasspath_fragments: ["mybootclasspathfragment"],
1081			}
1082
1083			bootclasspath_fragment {
1084				name: "mybootclasspathfragment",
1085				apex_available: ["myapex"],
1086				contents: [
1087					"mysdklibrary",
1088					"mynewsdklibrary",
1089				],
1090
1091				hidden_api: {
1092					split_packages: [],
1093				},
1094			}
1095
1096			java_sdk_library {
1097				name: "mysdklibrary",
1098				apex_available: ["myapex"],
1099				srcs: ["Test.java"],
1100				shared_library: false,
1101				public: {enabled: true},
1102				min_sdk_version: "S",
1103				sdk_version: "current",
1104			}
1105
1106			java_sdk_library {
1107				name: "mynewsdklibrary",
1108				apex_available: ["myapex"],
1109				srcs: ["Test.java"],
1110				compile_dex: true,
1111				public: {enabled: true},
1112				min_sdk_version: "Tiramisu",
1113				permitted_packages: ["mynewsdklibrary"],
1114				sdk_version: "current",
1115			}
1116		`),
1117	).RunTest(t)
1118
1119	bcpf := result.ModuleForTests("mybootclasspathfragment", "android_common")
1120	rule := bcpf.Output("out/soong/.intermediates/mybootclasspathfragment/android_common/modular-hiddenapi" + suffix + "/stub-flags.csv")
1121	android.AssertPathsRelativeToTopEquals(t, "stub flags inputs", android.SortedUniqueStrings(expectedStubFlagsInputs), android.SortedUniquePaths(rule.Implicits))
1122
1123	CheckSnapshot(t, result, "mysdk", "",
1124		checkAndroidBpContents(expectedSdkSnapshot),
1125		checkAllCopyRules(expectedCopyRules),
1126	)
1127}
1128
1129func TestSnapshotWithBootClasspathFragment_MinSdkVersion(t *testing.T) {
1130	t.Run("target S build", func(t *testing.T) {
1131		expectedSnapshot := `
1132// This is auto-generated. DO NOT EDIT.
1133
1134prebuilt_bootclasspath_fragment {
1135    name: "mybootclasspathfragment",
1136    prefer: false,
1137    visibility: ["//visibility:public"],
1138    apex_available: ["myapex"],
1139    contents: ["mysdklibrary"],
1140    hidden_api: {
1141        annotation_flags: "hiddenapi/annotation-flags.csv",
1142        metadata: "hiddenapi/metadata.csv",
1143        index: "hiddenapi/index.csv",
1144        stub_flags: "hiddenapi/stub-flags.csv",
1145        all_flags: "hiddenapi/all-flags.csv",
1146    },
1147}
1148
1149java_sdk_library_import {
1150    name: "mysdklibrary",
1151    prefer: false,
1152    visibility: ["//visibility:public"],
1153    apex_available: ["myapex"],
1154    shared_library: false,
1155    public: {
1156        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
1157        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
1158        current_api: "sdk_library/public/mysdklibrary.txt",
1159        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
1160        sdk_version: "current",
1161    },
1162}
1163`
1164		expectedCopyRules := `
1165.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/annotation-flags.csv -> hiddenapi/annotation-flags.csv
1166.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/metadata.csv -> hiddenapi/metadata.csv
1167.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/index.csv -> hiddenapi/index.csv
1168.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/stub-flags.csv -> hiddenapi/stub-flags.csv
1169.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi-for-sdk-snapshot/all-flags.csv -> hiddenapi/all-flags.csv
1170.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar
1171.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
1172.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
1173`
1174
1175		// On S the stub flags should only be generated from mysdklibrary as mynewsdklibrary is not part
1176		// of the snapshot.
1177		expectedStubFlagsInputs := []string{
1178			"out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar",
1179			"out/soong/.intermediates/mysdklibrary.impl/android_common/aligned/mysdklibrary.jar",
1180		}
1181
1182		testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "S",
1183			expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "-for-sdk-snapshot")
1184	})
1185
1186	t.Run("target-Tiramisu-build", func(t *testing.T) {
1187		expectedSnapshot := `
1188// This is auto-generated. DO NOT EDIT.
1189
1190prebuilt_bootclasspath_fragment {
1191    name: "mybootclasspathfragment",
1192    prefer: false,
1193    visibility: ["//visibility:public"],
1194    apex_available: ["myapex"],
1195    contents: [
1196        "mysdklibrary",
1197        "mynewsdklibrary",
1198    ],
1199    hidden_api: {
1200        annotation_flags: "hiddenapi/annotation-flags.csv",
1201        metadata: "hiddenapi/metadata.csv",
1202        index: "hiddenapi/index.csv",
1203        signature_patterns: "hiddenapi/signature-patterns.csv",
1204        filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
1205        filtered_flags: "hiddenapi/filtered-flags.csv",
1206    },
1207}
1208
1209java_sdk_library_import {
1210    name: "mysdklibrary",
1211    prefer: false,
1212    visibility: ["//visibility:public"],
1213    apex_available: ["myapex"],
1214    shared_library: false,
1215    public: {
1216        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
1217        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
1218        current_api: "sdk_library/public/mysdklibrary.txt",
1219        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
1220        sdk_version: "current",
1221    },
1222}
1223
1224java_sdk_library_import {
1225    name: "mynewsdklibrary",
1226    prefer: false,
1227    visibility: ["//visibility:public"],
1228    apex_available: ["myapex"],
1229    shared_library: true,
1230    compile_dex: true,
1231    permitted_packages: ["mynewsdklibrary"],
1232    public: {
1233        jars: ["sdk_library/public/mynewsdklibrary-stubs.jar"],
1234        stub_srcs: ["sdk_library/public/mynewsdklibrary_stub_sources"],
1235        current_api: "sdk_library/public/mynewsdklibrary.txt",
1236        removed_api: "sdk_library/public/mynewsdklibrary-removed.txt",
1237        sdk_version: "current",
1238    },
1239}
1240`
1241		expectedCopyRules := `
1242.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/annotation-flags.csv -> hiddenapi/annotation-flags.csv
1243.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/metadata.csv -> hiddenapi/metadata.csv
1244.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/index.csv -> hiddenapi/index.csv
1245.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv -> hiddenapi/signature-patterns.csv
1246.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-stub-flags.csv -> hiddenapi/filtered-stub-flags.csv
1247.intermediates/mybootclasspathfragment/android_common_myapex/modular-hiddenapi/filtered-flags.csv -> hiddenapi/filtered-flags.csv
1248.intermediates/mysdklibrary.stubs.exportable/android_common/combined/mysdklibrary.stubs.exportable.jar -> sdk_library/public/mysdklibrary-stubs.jar
1249.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_api.txt -> sdk_library/public/mysdklibrary.txt
1250.intermediates/mysdklibrary.stubs.source/android_common/exportable/mysdklibrary.stubs.source_removed.txt -> sdk_library/public/mysdklibrary-removed.txt
1251.intermediates/mynewsdklibrary.stubs.exportable/android_common/combined/mynewsdklibrary.stubs.exportable.jar -> sdk_library/public/mynewsdklibrary-stubs.jar
1252.intermediates/mynewsdklibrary.stubs.source/android_common/exportable/mynewsdklibrary.stubs.source_api.txt -> sdk_library/public/mynewsdklibrary.txt
1253.intermediates/mynewsdklibrary.stubs.source/android_common/exportable/mynewsdklibrary.stubs.source_removed.txt -> sdk_library/public/mynewsdklibrary-removed.txt
1254`
1255
1256		// On tiramisu the stub flags should be generated from both mynewsdklibrary and mysdklibrary as
1257		// they are both part of the snapshot.
1258		expectedStubFlagsInputs := []string{
1259			"out/soong/.intermediates/mynewsdklibrary.stubs.exportable/android_common/dex/mynewsdklibrary.stubs.exportable.jar",
1260			"out/soong/.intermediates/mynewsdklibrary.impl/android_common/aligned/mynewsdklibrary.jar",
1261			"out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar",
1262			"out/soong/.intermediates/mysdklibrary.impl/android_common/aligned/mysdklibrary.jar",
1263		}
1264
1265		testSnapshotWithBootClasspathFragment_MinSdkVersion(t, "Tiramisu",
1266			expectedSnapshot, expectedCopyRules, expectedStubFlagsInputs, "")
1267	})
1268}
1269
1270func TestSnapshotWithEmptyBootClasspathFragment(t *testing.T) {
1271	result := android.GroupFixturePreparers(
1272		prepareForSdkTestWithJava,
1273		java.PrepareForTestWithJavaDefaultModules,
1274		java.PrepareForTestWithJavaSdkLibraryFiles,
1275		java.FixtureWithLastReleaseApis("mysdklibrary", "mynewsdklibrary"),
1276		java.FixtureConfigureApexBootJars("myapex:mysdklibrary", "myapex:mynewsdklibrary"),
1277		prepareForSdkTestWithApex,
1278		// Add a platform_bootclasspath that depends on the fragment.
1279		fixtureAddPlatformBootclasspathForBootclasspathFragment("myapex", "mybootclasspathfragment"),
1280		android.FixtureMergeEnv(map[string]string{
1281			"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S",
1282		}),
1283		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1284			variables.Platform_version_active_codenames = []string{"VanillaIceCream"}
1285		}),
1286		android.FixtureWithRootAndroidBp(`
1287			sdk {
1288				name: "mysdk",
1289				apexes: ["myapex"],
1290			}
1291			apex {
1292				name: "myapex",
1293				key: "myapex.key",
1294				min_sdk_version: "S",
1295				bootclasspath_fragments: ["mybootclasspathfragment"],
1296			}
1297			bootclasspath_fragment {
1298				name: "mybootclasspathfragment",
1299				apex_available: ["myapex"],
1300				contents: ["mysdklibrary", "mynewsdklibrary"],
1301				hidden_api: {
1302					split_packages: [],
1303				},
1304			}
1305			java_sdk_library {
1306				name: "mysdklibrary",
1307				apex_available: ["myapex"],
1308				srcs: ["Test.java"],
1309				shared_library: false,
1310				public: {enabled: true},
1311				min_sdk_version: "Tiramisu",
1312				sdk_version: "current",
1313			}
1314			java_sdk_library {
1315				name: "mynewsdklibrary",
1316				apex_available: ["myapex"],
1317				srcs: ["Test.java"],
1318				compile_dex: true,
1319				public: {enabled: true},
1320				min_sdk_version: "Tiramisu",
1321				permitted_packages: ["mynewsdklibrary"],
1322				sdk_version: "current",
1323			}
1324		`),
1325	).RunTest(t)
1326
1327	CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
1328}
1329