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