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