xref: /aosp_15_r20/build/soong/apex/platform_bootclasspath_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage apex
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
27*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker// Contains tests for platform_bootclasspath logic from java/platform_bootclasspath.go that requires
31*333d2b36SAndroid Build Coastguard Worker// apexes.
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithPlatformBootclasspath = android.GroupFixturePreparers(
34*333d2b36SAndroid Build Coastguard Worker	java.PrepareForTestWithJavaDefaultModules,
35*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithApexBuildComponents,
36*333d2b36SAndroid Build Coastguard Worker)
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformBootclasspath_Fragments(t *testing.T) {
39*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
40*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
41*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
42*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
43*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
44*333d2b36SAndroid Build Coastguard Worker		java.FixtureWithLastReleaseApis("foo"),
45*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:bar"),
46*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
47*333d2b36SAndroid Build Coastguard Worker			platform_bootclasspath {
48*333d2b36SAndroid Build Coastguard Worker				name: "platform-bootclasspath",
49*333d2b36SAndroid Build Coastguard Worker				fragments: [
50*333d2b36SAndroid Build Coastguard Worker					{
51*333d2b36SAndroid Build Coastguard Worker						apex: "myapex",
52*333d2b36SAndroid Build Coastguard Worker						module:"bar-fragment",
53*333d2b36SAndroid Build Coastguard Worker					},
54*333d2b36SAndroid Build Coastguard Worker				],
55*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
56*333d2b36SAndroid Build Coastguard Worker					unsupported: [
57*333d2b36SAndroid Build Coastguard Worker							"unsupported.txt",
58*333d2b36SAndroid Build Coastguard Worker					],
59*333d2b36SAndroid Build Coastguard Worker					removed: [
60*333d2b36SAndroid Build Coastguard Worker							"removed.txt",
61*333d2b36SAndroid Build Coastguard Worker					],
62*333d2b36SAndroid Build Coastguard Worker					max_target_r_low_priority: [
63*333d2b36SAndroid Build Coastguard Worker							"max-target-r-low-priority.txt",
64*333d2b36SAndroid Build Coastguard Worker					],
65*333d2b36SAndroid Build Coastguard Worker					max_target_q: [
66*333d2b36SAndroid Build Coastguard Worker							"max-target-q.txt",
67*333d2b36SAndroid Build Coastguard Worker					],
68*333d2b36SAndroid Build Coastguard Worker					max_target_p: [
69*333d2b36SAndroid Build Coastguard Worker							"max-target-p.txt",
70*333d2b36SAndroid Build Coastguard Worker					],
71*333d2b36SAndroid Build Coastguard Worker					max_target_o_low_priority: [
72*333d2b36SAndroid Build Coastguard Worker							"max-target-o-low-priority.txt",
73*333d2b36SAndroid Build Coastguard Worker					],
74*333d2b36SAndroid Build Coastguard Worker					blocked: [
75*333d2b36SAndroid Build Coastguard Worker							"blocked.txt",
76*333d2b36SAndroid Build Coastguard Worker					],
77*333d2b36SAndroid Build Coastguard Worker					unsupported_packages: [
78*333d2b36SAndroid Build Coastguard Worker							"unsupported-packages.txt",
79*333d2b36SAndroid Build Coastguard Worker					],
80*333d2b36SAndroid Build Coastguard Worker				},
81*333d2b36SAndroid Build Coastguard Worker			}
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker			apex {
84*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
85*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
86*333d2b36SAndroid Build Coastguard Worker				bootclasspath_fragments: [
87*333d2b36SAndroid Build Coastguard Worker					"bar-fragment",
88*333d2b36SAndroid Build Coastguard Worker				],
89*333d2b36SAndroid Build Coastguard Worker				updatable: false,
90*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30", // R
91*333d2b36SAndroid Build Coastguard Worker			}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker			apex_key {
94*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
95*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
96*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
97*333d2b36SAndroid Build Coastguard Worker			}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
100*333d2b36SAndroid Build Coastguard Worker				name: "bar-fragment",
101*333d2b36SAndroid Build Coastguard Worker				contents: ["bar"],
102*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
103*333d2b36SAndroid Build Coastguard Worker				api: {
104*333d2b36SAndroid Build Coastguard Worker					stub_libs: ["foo"],
105*333d2b36SAndroid Build Coastguard Worker				},
106*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
107*333d2b36SAndroid Build Coastguard Worker					unsupported: [
108*333d2b36SAndroid Build Coastguard Worker							"bar-unsupported.txt",
109*333d2b36SAndroid Build Coastguard Worker					],
110*333d2b36SAndroid Build Coastguard Worker					removed: [
111*333d2b36SAndroid Build Coastguard Worker							"bar-removed.txt",
112*333d2b36SAndroid Build Coastguard Worker					],
113*333d2b36SAndroid Build Coastguard Worker					max_target_r_low_priority: [
114*333d2b36SAndroid Build Coastguard Worker							"bar-max-target-r-low-priority.txt",
115*333d2b36SAndroid Build Coastguard Worker					],
116*333d2b36SAndroid Build Coastguard Worker					max_target_q: [
117*333d2b36SAndroid Build Coastguard Worker							"bar-max-target-q.txt",
118*333d2b36SAndroid Build Coastguard Worker					],
119*333d2b36SAndroid Build Coastguard Worker					max_target_p: [
120*333d2b36SAndroid Build Coastguard Worker							"bar-max-target-p.txt",
121*333d2b36SAndroid Build Coastguard Worker					],
122*333d2b36SAndroid Build Coastguard Worker					max_target_o_low_priority: [
123*333d2b36SAndroid Build Coastguard Worker							"bar-max-target-o-low-priority.txt",
124*333d2b36SAndroid Build Coastguard Worker					],
125*333d2b36SAndroid Build Coastguard Worker					blocked: [
126*333d2b36SAndroid Build Coastguard Worker							"bar-blocked.txt",
127*333d2b36SAndroid Build Coastguard Worker					],
128*333d2b36SAndroid Build Coastguard Worker					unsupported_packages: [
129*333d2b36SAndroid Build Coastguard Worker							"bar-unsupported-packages.txt",
130*333d2b36SAndroid Build Coastguard Worker					],
131*333d2b36SAndroid Build Coastguard Worker					split_packages: ["*"],
132*333d2b36SAndroid Build Coastguard Worker				},
133*333d2b36SAndroid Build Coastguard Worker			}
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker			java_library {
136*333d2b36SAndroid Build Coastguard Worker				name: "bar",
137*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
138*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
139*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
140*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
141*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
142*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["bar"],
143*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "30", // R
144*333d2b36SAndroid Build Coastguard Worker			}
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
147*333d2b36SAndroid Build Coastguard Worker				name: "foo",
148*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
149*333d2b36SAndroid Build Coastguard Worker				public: {
150*333d2b36SAndroid Build Coastguard Worker					enabled: true,
151*333d2b36SAndroid Build Coastguard Worker				},
152*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
153*333d2b36SAndroid Build Coastguard Worker			}
154*333d2b36SAndroid Build Coastguard Worker		`),
155*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
156*333d2b36SAndroid Build Coastguard Worker
157*333d2b36SAndroid Build Coastguard Worker	pbcp := result.Module("platform-bootclasspath", "android_common")
158*333d2b36SAndroid Build Coastguard Worker	info, _ := android.OtherModuleProvider(result, pbcp, java.MonolithicHiddenAPIInfoProvider)
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker	for _, category := range java.HiddenAPIFlagFileCategories {
161*333d2b36SAndroid Build Coastguard Worker		name := category.PropertyName()
162*333d2b36SAndroid Build Coastguard Worker		message := fmt.Sprintf("category %s", name)
163*333d2b36SAndroid Build Coastguard Worker		filename := strings.ReplaceAll(name, "_", "-")
164*333d2b36SAndroid Build Coastguard Worker		expected := []string{fmt.Sprintf("%s.txt", filename), fmt.Sprintf("bar-%s.txt", filename)}
165*333d2b36SAndroid Build Coastguard Worker		android.AssertPathsRelativeToTopEquals(t, message, expected, info.FlagsFilesByCategory[category])
166*333d2b36SAndroid Build Coastguard Worker	}
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "annotation flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/annotation-flags.csv"}, info.AnnotationFlagsPaths)
169*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "metadata flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/metadata.csv"}, info.MetadataPaths)
170*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "index flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/index.csv"}, info.IndexPaths)
171*333d2b36SAndroid Build Coastguard Worker
172*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "stub flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/filtered-stub-flags.csv:out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/signature-patterns.csv"}, info.StubFlagSubsets.RelativeToTop())
173*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "all flags", []string{"out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/filtered-flags.csv:out/soong/.intermediates/bar-fragment/android_common_apex30/modular-hiddenapi/signature-patterns.csv"}, info.FlagSubsets.RelativeToTop())
174*333d2b36SAndroid Build Coastguard Worker}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker// TestPlatformBootclasspath_LegacyPrebuiltFragment verifies that the
177*333d2b36SAndroid Build Coastguard Worker// prebuilt_bootclasspath_fragment falls back to using the complete stub-flags/all-flags if the
178*333d2b36SAndroid Build Coastguard Worker// filtered files are not provided.
179*333d2b36SAndroid Build Coastguard Worker//
180*333d2b36SAndroid Build Coastguard Worker// TODO: Remove once all prebuilts use the filtered_... properties.
181*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformBootclasspath_LegacyPrebuiltFragment(t *testing.T) {
182*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
183*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
184*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
185*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:foo"),
186*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
187*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
188*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
189*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
190*333d2b36SAndroid Build Coastguard Worker			src: "myapex.apex",
191*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["mybootclasspath-fragment"],
192*333d2b36SAndroid Build Coastguard Worker		}
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker		// A prebuilt java_sdk_library_import that is not preferred by default but will be preferred
195*333d2b36SAndroid Build Coastguard Worker		// because AlwaysUsePrebuiltSdks() is true.
196*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
197*333d2b36SAndroid Build Coastguard Worker			name: "foo",
198*333d2b36SAndroid Build Coastguard Worker			prefer: false,
199*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
200*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
201*333d2b36SAndroid Build Coastguard Worker			public: {
202*333d2b36SAndroid Build Coastguard Worker				jars: ["sdk_library/public/foo-stubs.jar"],
203*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["sdk_library/public/foo_stub_sources"],
204*333d2b36SAndroid Build Coastguard Worker				current_api: "sdk_library/public/foo.txt",
205*333d2b36SAndroid Build Coastguard Worker				removed_api: "sdk_library/public/foo-removed.txt",
206*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
207*333d2b36SAndroid Build Coastguard Worker			},
208*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
209*333d2b36SAndroid Build Coastguard Worker		}
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
212*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspath-fragment",
213*333d2b36SAndroid Build Coastguard Worker			apex_available: [
214*333d2b36SAndroid Build Coastguard Worker				"myapex",
215*333d2b36SAndroid Build Coastguard Worker			],
216*333d2b36SAndroid Build Coastguard Worker			contents: [
217*333d2b36SAndroid Build Coastguard Worker				"foo",
218*333d2b36SAndroid Build Coastguard Worker			],
219*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
220*333d2b36SAndroid Build Coastguard Worker				stub_flags: "prebuilt-stub-flags.csv",
221*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "prebuilt-annotation-flags.csv",
222*333d2b36SAndroid Build Coastguard Worker				metadata: "prebuilt-metadata.csv",
223*333d2b36SAndroid Build Coastguard Worker				index: "prebuilt-index.csv",
224*333d2b36SAndroid Build Coastguard Worker				all_flags: "prebuilt-all-flags.csv",
225*333d2b36SAndroid Build Coastguard Worker			},
226*333d2b36SAndroid Build Coastguard Worker		}
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Worker		platform_bootclasspath {
229*333d2b36SAndroid Build Coastguard Worker			name: "myplatform-bootclasspath",
230*333d2b36SAndroid Build Coastguard Worker			fragments: [
231*333d2b36SAndroid Build Coastguard Worker				{
232*333d2b36SAndroid Build Coastguard Worker					apex: "myapex",
233*333d2b36SAndroid Build Coastguard Worker					module:"mybootclasspath-fragment",
234*333d2b36SAndroid Build Coastguard Worker				},
235*333d2b36SAndroid Build Coastguard Worker			],
236*333d2b36SAndroid Build Coastguard Worker		}
237*333d2b36SAndroid Build Coastguard Worker`,
238*333d2b36SAndroid Build Coastguard Worker	)
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Worker	pbcp := result.Module("myplatform-bootclasspath", "android_common")
241*333d2b36SAndroid Build Coastguard Worker	info, _ := android.OtherModuleProvider(result, pbcp, java.MonolithicHiddenAPIInfoProvider)
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "stub flags", []string{"prebuilt-stub-flags.csv:out/soong/.intermediates/mybootclasspath-fragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv"}, info.StubFlagSubsets.RelativeToTop())
244*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "all flags", []string{"prebuilt-all-flags.csv:out/soong/.intermediates/mybootclasspath-fragment/android_common_myapex/modular-hiddenapi/signature-patterns.csv"}, info.FlagSubsets.RelativeToTop())
245*333d2b36SAndroid Build Coastguard Worker}
246*333d2b36SAndroid Build Coastguard Worker
247*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformBootclasspathDependencies(t *testing.T) {
248*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
249*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
250*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
251*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithArtApex,
252*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
253*333d2b36SAndroid Build Coastguard Worker		// Configure some libraries in the art and framework boot images.
254*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureBootJars("com.android.art:baz", "com.android.art:quuz", "platform:foo"),
255*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:bar"),
256*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
257*333d2b36SAndroid Build Coastguard Worker		java.FixtureWithLastReleaseApis("foo"),
258*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithDexpreopt,
259*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureDisableDexpreoptBootImages(false),
260*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
261*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
262*333d2b36SAndroid Build Coastguard Worker		apex {
263*333d2b36SAndroid Build Coastguard Worker			name: "com.android.art",
264*333d2b36SAndroid Build Coastguard Worker			key: "com.android.art.key",
265*333d2b36SAndroid Build Coastguard Worker 			bootclasspath_fragments: [
266*333d2b36SAndroid Build Coastguard Worker				"art-bootclasspath-fragment",
267*333d2b36SAndroid Build Coastguard Worker			],
268*333d2b36SAndroid Build Coastguard Worker			updatable: false,
269*333d2b36SAndroid Build Coastguard Worker		}
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker		apex_key {
272*333d2b36SAndroid Build Coastguard Worker			name: "com.android.art.key",
273*333d2b36SAndroid Build Coastguard Worker			public_key: "com.android.art.avbpubkey",
274*333d2b36SAndroid Build Coastguard Worker			private_key: "com.android.art.pem",
275*333d2b36SAndroid Build Coastguard Worker		}
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
278*333d2b36SAndroid Build Coastguard Worker			name: "art-bootclasspath-fragment",
279*333d2b36SAndroid Build Coastguard Worker			image_name: "art",
280*333d2b36SAndroid Build Coastguard Worker			apex_available: [
281*333d2b36SAndroid Build Coastguard Worker				"com.android.art",
282*333d2b36SAndroid Build Coastguard Worker			],
283*333d2b36SAndroid Build Coastguard Worker			contents: [
284*333d2b36SAndroid Build Coastguard Worker				"baz",
285*333d2b36SAndroid Build Coastguard Worker				"quuz",
286*333d2b36SAndroid Build Coastguard Worker			],
287*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
288*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
289*333d2b36SAndroid Build Coastguard Worker			},
290*333d2b36SAndroid Build Coastguard Worker		}
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Worker		java_library {
293*333d2b36SAndroid Build Coastguard Worker			name: "baz",
294*333d2b36SAndroid Build Coastguard Worker			apex_available: [
295*333d2b36SAndroid Build Coastguard Worker				"com.android.art",
296*333d2b36SAndroid Build Coastguard Worker			],
297*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
298*333d2b36SAndroid Build Coastguard Worker			installable: true,
299*333d2b36SAndroid Build Coastguard Worker			sdk_version: "core_current",
300*333d2b36SAndroid Build Coastguard Worker		}
301*333d2b36SAndroid Build Coastguard Worker
302*333d2b36SAndroid Build Coastguard Worker		// Add a java_import that is not preferred and so won't have an appropriate apex variant created
303*333d2b36SAndroid Build Coastguard Worker		// for it to make sure that the platform_bootclasspath doesn't try and add a dependency onto it.
304*333d2b36SAndroid Build Coastguard Worker		java_import {
305*333d2b36SAndroid Build Coastguard Worker			name: "baz",
306*333d2b36SAndroid Build Coastguard Worker			apex_available: [
307*333d2b36SAndroid Build Coastguard Worker				"com.android.art",
308*333d2b36SAndroid Build Coastguard Worker			],
309*333d2b36SAndroid Build Coastguard Worker			jars: ["b.jar"],
310*333d2b36SAndroid Build Coastguard Worker		}
311*333d2b36SAndroid Build Coastguard Worker
312*333d2b36SAndroid Build Coastguard Worker		java_library {
313*333d2b36SAndroid Build Coastguard Worker			name: "quuz",
314*333d2b36SAndroid Build Coastguard Worker			apex_available: [
315*333d2b36SAndroid Build Coastguard Worker				"com.android.art",
316*333d2b36SAndroid Build Coastguard Worker			],
317*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
318*333d2b36SAndroid Build Coastguard Worker			installable: true,
319*333d2b36SAndroid Build Coastguard Worker		}
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Worker		apex {
322*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
323*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
324*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: [
325*333d2b36SAndroid Build Coastguard Worker				"my-bootclasspath-fragment",
326*333d2b36SAndroid Build Coastguard Worker			],
327*333d2b36SAndroid Build Coastguard Worker			updatable: false,
328*333d2b36SAndroid Build Coastguard Worker		}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
331*333d2b36SAndroid Build Coastguard Worker			name: "my-bootclasspath-fragment",
332*333d2b36SAndroid Build Coastguard Worker			contents: ["bar"],
333*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
334*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
335*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
336*333d2b36SAndroid Build Coastguard Worker			},
337*333d2b36SAndroid Build Coastguard Worker		}
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Worker		apex_key {
340*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
341*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
342*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
343*333d2b36SAndroid Build Coastguard Worker		}
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
346*333d2b36SAndroid Build Coastguard Worker			name: "foo",
347*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
348*333d2b36SAndroid Build Coastguard Worker		}
349*333d2b36SAndroid Build Coastguard Worker
350*333d2b36SAndroid Build Coastguard Worker		java_library {
351*333d2b36SAndroid Build Coastguard Worker			name: "bar",
352*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
353*333d2b36SAndroid Build Coastguard Worker			installable: true,
354*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
355*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
356*333d2b36SAndroid Build Coastguard Worker		}
357*333d2b36SAndroid Build Coastguard Worker
358*333d2b36SAndroid Build Coastguard Worker		platform_bootclasspath {
359*333d2b36SAndroid Build Coastguard Worker			name: "myplatform-bootclasspath",
360*333d2b36SAndroid Build Coastguard Worker
361*333d2b36SAndroid Build Coastguard Worker			fragments: [
362*333d2b36SAndroid Build Coastguard Worker				{
363*333d2b36SAndroid Build Coastguard Worker					apex: "com.android.art",
364*333d2b36SAndroid Build Coastguard Worker					module: "art-bootclasspath-fragment",
365*333d2b36SAndroid Build Coastguard Worker				},
366*333d2b36SAndroid Build Coastguard Worker				{
367*333d2b36SAndroid Build Coastguard Worker					apex: "myapex",
368*333d2b36SAndroid Build Coastguard Worker					module: "my-bootclasspath-fragment",
369*333d2b36SAndroid Build Coastguard Worker				},
370*333d2b36SAndroid Build Coastguard Worker			],
371*333d2b36SAndroid Build Coastguard Worker		}
372*333d2b36SAndroid Build Coastguard Worker`,
373*333d2b36SAndroid Build Coastguard Worker	)
374*333d2b36SAndroid Build Coastguard Worker
375*333d2b36SAndroid Build Coastguard Worker	java.CheckPlatformBootclasspathModules(t, result, "myplatform-bootclasspath", []string{
376*333d2b36SAndroid Build Coastguard Worker		// The configured contents of BootJars.
377*333d2b36SAndroid Build Coastguard Worker		"com.android.art:baz",
378*333d2b36SAndroid Build Coastguard Worker		"com.android.art:quuz",
379*333d2b36SAndroid Build Coastguard Worker		"platform:foo",
380*333d2b36SAndroid Build Coastguard Worker
381*333d2b36SAndroid Build Coastguard Worker		// The configured contents of ApexBootJars.
382*333d2b36SAndroid Build Coastguard Worker		"myapex:bar",
383*333d2b36SAndroid Build Coastguard Worker	})
384*333d2b36SAndroid Build Coastguard Worker
385*333d2b36SAndroid Build Coastguard Worker	java.CheckPlatformBootclasspathFragments(t, result, "myplatform-bootclasspath", []string{
386*333d2b36SAndroid Build Coastguard Worker		"com.android.art:art-bootclasspath-fragment",
387*333d2b36SAndroid Build Coastguard Worker		"myapex:my-bootclasspath-fragment",
388*333d2b36SAndroid Build Coastguard Worker	})
389*333d2b36SAndroid Build Coastguard Worker
390*333d2b36SAndroid Build Coastguard Worker	// Make sure that the myplatform-bootclasspath has the correct dependencies.
391*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "myplatform-bootclasspath", "android_common", []string{
392*333d2b36SAndroid Build Coastguard Worker		// source vs prebuilt selection metadata module
393*333d2b36SAndroid Build Coastguard Worker		`platform:all_apex_contributions`,
394*333d2b36SAndroid Build Coastguard Worker
395*333d2b36SAndroid Build Coastguard Worker		// The following are stubs.
396*333d2b36SAndroid Build Coastguard Worker		`platform:android_stubs_current_exportable`,
397*333d2b36SAndroid Build Coastguard Worker		`platform:android_system_stubs_current_exportable`,
398*333d2b36SAndroid Build Coastguard Worker		`platform:android_test_stubs_current_exportable`,
399*333d2b36SAndroid Build Coastguard Worker		`platform:legacy.core.platform.api.stubs.exportable`,
400*333d2b36SAndroid Build Coastguard Worker
401*333d2b36SAndroid Build Coastguard Worker		// Needed for generating the boot image.
402*333d2b36SAndroid Build Coastguard Worker		`platform:dex2oatd`,
403*333d2b36SAndroid Build Coastguard Worker
404*333d2b36SAndroid Build Coastguard Worker		// The configured contents of BootJars.
405*333d2b36SAndroid Build Coastguard Worker		`com.android.art:baz`,
406*333d2b36SAndroid Build Coastguard Worker		`com.android.art:quuz`,
407*333d2b36SAndroid Build Coastguard Worker		`platform:foo`,
408*333d2b36SAndroid Build Coastguard Worker
409*333d2b36SAndroid Build Coastguard Worker		// The configured contents of ApexBootJars.
410*333d2b36SAndroid Build Coastguard Worker		`myapex:bar`,
411*333d2b36SAndroid Build Coastguard Worker
412*333d2b36SAndroid Build Coastguard Worker		// The fragments.
413*333d2b36SAndroid Build Coastguard Worker		`com.android.art:art-bootclasspath-fragment`,
414*333d2b36SAndroid Build Coastguard Worker		`myapex:my-bootclasspath-fragment`,
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Worker		// Impl lib of sdk_library for transitive srcjar generation
417*333d2b36SAndroid Build Coastguard Worker		`platform:foo.impl`,
418*333d2b36SAndroid Build Coastguard Worker	})
419*333d2b36SAndroid Build Coastguard Worker}
420*333d2b36SAndroid Build Coastguard Worker
421*333d2b36SAndroid Build Coastguard Worker// TestPlatformBootclasspath_AlwaysUsePrebuiltSdks verifies that the build does not fail when
422*333d2b36SAndroid Build Coastguard Worker// AlwaysUsePrebuiltSdk() returns true.
423*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) {
424*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
425*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
426*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
427*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
428*333d2b36SAndroid Build Coastguard Worker		// Configure two libraries, the first is a java_sdk_library whose prebuilt will be used because
429*333d2b36SAndroid Build Coastguard Worker		// of AlwaysUsePrebuiltsSdk(). The second is a normal library that is unaffected. The order
430*333d2b36SAndroid Build Coastguard Worker		// matters, so that the dependencies resolved by the platform_bootclasspath matches the
431*333d2b36SAndroid Build Coastguard Worker		// configured list.
432*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:foo", "myapex:bar"),
433*333d2b36SAndroid Build Coastguard Worker		java.PrepareForTestWithJavaSdkLibraryFiles,
434*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
435*333d2b36SAndroid Build Coastguard Worker			variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
436*333d2b36SAndroid Build Coastguard Worker		}),
437*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Worker		java.FixtureWithPrebuiltApis(map[string][]string{
440*333d2b36SAndroid Build Coastguard Worker			"current": {},
441*333d2b36SAndroid Build Coastguard Worker			"30":      {"foo"},
442*333d2b36SAndroid Build Coastguard Worker		}),
443*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
444*333d2b36SAndroid Build Coastguard Worker		apex {
445*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
446*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
447*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: [
448*333d2b36SAndroid Build Coastguard Worker				"mybootclasspath-fragment",
449*333d2b36SAndroid Build Coastguard Worker			],
450*333d2b36SAndroid Build Coastguard Worker			updatable: false,
451*333d2b36SAndroid Build Coastguard Worker		}
452*333d2b36SAndroid Build Coastguard Worker
453*333d2b36SAndroid Build Coastguard Worker		apex_key {
454*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
455*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
456*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
457*333d2b36SAndroid Build Coastguard Worker		}
458*333d2b36SAndroid Build Coastguard Worker
459*333d2b36SAndroid Build Coastguard Worker		java_library {
460*333d2b36SAndroid Build Coastguard Worker			name: "bar",
461*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
462*333d2b36SAndroid Build Coastguard Worker			installable: true,
463*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
464*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
465*333d2b36SAndroid Build Coastguard Worker		}
466*333d2b36SAndroid Build Coastguard Worker
467*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
468*333d2b36SAndroid Build Coastguard Worker			name: "foo",
469*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
470*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
471*333d2b36SAndroid Build Coastguard Worker			public: {
472*333d2b36SAndroid Build Coastguard Worker				enabled: true,
473*333d2b36SAndroid Build Coastguard Worker			},
474*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
475*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
476*333d2b36SAndroid Build Coastguard Worker		}
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
479*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
480*333d2b36SAndroid Build Coastguard Worker			src: "myapex.apex",
481*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["mybootclasspath-fragment"],
482*333d2b36SAndroid Build Coastguard Worker		}
483*333d2b36SAndroid Build Coastguard Worker
484*333d2b36SAndroid Build Coastguard Worker		// A prebuilt java_sdk_library_import that is not preferred by default but will be preferred
485*333d2b36SAndroid Build Coastguard Worker		// because AlwaysUsePrebuiltSdks() is true.
486*333d2b36SAndroid Build Coastguard Worker		java_sdk_library_import {
487*333d2b36SAndroid Build Coastguard Worker			name: "foo",
488*333d2b36SAndroid Build Coastguard Worker			prefer: false,
489*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
490*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
491*333d2b36SAndroid Build Coastguard Worker			public: {
492*333d2b36SAndroid Build Coastguard Worker				jars: ["sdk_library/public/foo-stubs.jar"],
493*333d2b36SAndroid Build Coastguard Worker				stub_srcs: ["sdk_library/public/foo_stub_sources"],
494*333d2b36SAndroid Build Coastguard Worker				current_api: "sdk_library/public/foo.txt",
495*333d2b36SAndroid Build Coastguard Worker				removed_api: "sdk_library/public/foo-removed.txt",
496*333d2b36SAndroid Build Coastguard Worker				sdk_version: "current",
497*333d2b36SAndroid Build Coastguard Worker			},
498*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
499*333d2b36SAndroid Build Coastguard Worker		}
500*333d2b36SAndroid Build Coastguard Worker
501*333d2b36SAndroid Build Coastguard Worker		// This always depends on the source foo module, its dependencies are not affected by the
502*333d2b36SAndroid Build Coastguard Worker		// AlwaysUsePrebuiltSdks().
503*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
504*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspath-fragment",
505*333d2b36SAndroid Build Coastguard Worker			apex_available: [
506*333d2b36SAndroid Build Coastguard Worker				"myapex",
507*333d2b36SAndroid Build Coastguard Worker			],
508*333d2b36SAndroid Build Coastguard Worker			contents: [
509*333d2b36SAndroid Build Coastguard Worker				"foo", "bar",
510*333d2b36SAndroid Build Coastguard Worker			],
511*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
512*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
513*333d2b36SAndroid Build Coastguard Worker			},
514*333d2b36SAndroid Build Coastguard Worker		}
515*333d2b36SAndroid Build Coastguard Worker
516*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
517*333d2b36SAndroid Build Coastguard Worker			name: "mybootclasspath-fragment",
518*333d2b36SAndroid Build Coastguard Worker			apex_available: [
519*333d2b36SAndroid Build Coastguard Worker				"myapex",
520*333d2b36SAndroid Build Coastguard Worker			],
521*333d2b36SAndroid Build Coastguard Worker			contents: [
522*333d2b36SAndroid Build Coastguard Worker				"foo",
523*333d2b36SAndroid Build Coastguard Worker			],
524*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
525*333d2b36SAndroid Build Coastguard Worker				stub_flags: "",
526*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "",
527*333d2b36SAndroid Build Coastguard Worker				metadata: "",
528*333d2b36SAndroid Build Coastguard Worker				index: "",
529*333d2b36SAndroid Build Coastguard Worker				all_flags: "",
530*333d2b36SAndroid Build Coastguard Worker			},
531*333d2b36SAndroid Build Coastguard Worker		}
532*333d2b36SAndroid Build Coastguard Worker
533*333d2b36SAndroid Build Coastguard Worker		platform_bootclasspath {
534*333d2b36SAndroid Build Coastguard Worker			name: "myplatform-bootclasspath",
535*333d2b36SAndroid Build Coastguard Worker			fragments: [
536*333d2b36SAndroid Build Coastguard Worker				{
537*333d2b36SAndroid Build Coastguard Worker					apex: "myapex",
538*333d2b36SAndroid Build Coastguard Worker					module:"mybootclasspath-fragment",
539*333d2b36SAndroid Build Coastguard Worker				},
540*333d2b36SAndroid Build Coastguard Worker			],
541*333d2b36SAndroid Build Coastguard Worker		}
542*333d2b36SAndroid Build Coastguard Worker`,
543*333d2b36SAndroid Build Coastguard Worker	)
544*333d2b36SAndroid Build Coastguard Worker
545*333d2b36SAndroid Build Coastguard Worker	java.CheckPlatformBootclasspathModules(t, result, "myplatform-bootclasspath", []string{
546*333d2b36SAndroid Build Coastguard Worker		// The configured contents of BootJars.
547*333d2b36SAndroid Build Coastguard Worker		"myapex:prebuilt_foo",
548*333d2b36SAndroid Build Coastguard Worker		"myapex:bar",
549*333d2b36SAndroid Build Coastguard Worker	})
550*333d2b36SAndroid Build Coastguard Worker
551*333d2b36SAndroid Build Coastguard Worker	// Make sure that the myplatform-bootclasspath has the correct dependencies.
552*333d2b36SAndroid Build Coastguard Worker	CheckModuleDependencies(t, result.TestContext, "myplatform-bootclasspath", "android_common", []string{
553*333d2b36SAndroid Build Coastguard Worker		// source vs prebuilt selection metadata module
554*333d2b36SAndroid Build Coastguard Worker		`platform:all_apex_contributions`,
555*333d2b36SAndroid Build Coastguard Worker
556*333d2b36SAndroid Build Coastguard Worker		// The following are stubs.
557*333d2b36SAndroid Build Coastguard Worker		"platform:prebuilt_sdk_public_current_android",
558*333d2b36SAndroid Build Coastguard Worker		"platform:prebuilt_sdk_system_current_android",
559*333d2b36SAndroid Build Coastguard Worker		"platform:prebuilt_sdk_test_current_android",
560*333d2b36SAndroid Build Coastguard Worker
561*333d2b36SAndroid Build Coastguard Worker		// Not a prebuilt as no prebuilt existed when it was added.
562*333d2b36SAndroid Build Coastguard Worker		"platform:legacy.core.platform.api.stubs.exportable",
563*333d2b36SAndroid Build Coastguard Worker
564*333d2b36SAndroid Build Coastguard Worker		// The platform_bootclasspath intentionally adds dependencies on both source and prebuilt
565*333d2b36SAndroid Build Coastguard Worker		// modules when available as it does not know which one will be preferred.
566*333d2b36SAndroid Build Coastguard Worker		"myapex:foo",
567*333d2b36SAndroid Build Coastguard Worker		"myapex:prebuilt_foo",
568*333d2b36SAndroid Build Coastguard Worker
569*333d2b36SAndroid Build Coastguard Worker		// Only a source module exists.
570*333d2b36SAndroid Build Coastguard Worker		"myapex:bar",
571*333d2b36SAndroid Build Coastguard Worker
572*333d2b36SAndroid Build Coastguard Worker		// The fragments.
573*333d2b36SAndroid Build Coastguard Worker		"myapex:mybootclasspath-fragment",
574*333d2b36SAndroid Build Coastguard Worker		"myapex:prebuilt_mybootclasspath-fragment",
575*333d2b36SAndroid Build Coastguard Worker
576*333d2b36SAndroid Build Coastguard Worker		// Impl lib of sdk_library for transitive srcjar generation
577*333d2b36SAndroid Build Coastguard Worker		"platform:foo.impl",
578*333d2b36SAndroid Build Coastguard Worker	})
579*333d2b36SAndroid Build Coastguard Worker}
580*333d2b36SAndroid Build Coastguard Worker
581*333d2b36SAndroid Build Coastguard Worker// CheckModuleDependencies checks the dependencies of the selected module against the expected list.
582*333d2b36SAndroid Build Coastguard Worker//
583*333d2b36SAndroid Build Coastguard Worker// The expected list must be a list of strings of the form "<apex>:<module>", where <apex> is the
584*333d2b36SAndroid Build Coastguard Worker// name of the apex, or platform is it is not part of an apex and <module> is the module name.
585*333d2b36SAndroid Build Coastguard Workerfunc CheckModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) {
586*333d2b36SAndroid Build Coastguard Worker	t.Helper()
587*333d2b36SAndroid Build Coastguard Worker	module := ctx.ModuleForTests(name, variant).Module()
588*333d2b36SAndroid Build Coastguard Worker	modules := []android.Module{}
589*333d2b36SAndroid Build Coastguard Worker	ctx.VisitDirectDeps(module, func(m blueprint.Module) {
590*333d2b36SAndroid Build Coastguard Worker		modules = append(modules, m.(android.Module))
591*333d2b36SAndroid Build Coastguard Worker	})
592*333d2b36SAndroid Build Coastguard Worker
593*333d2b36SAndroid Build Coastguard Worker	pairs := java.ApexNamePairsFromModules(ctx, modules)
594*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "module dependencies", expected, pairs)
595*333d2b36SAndroid Build Coastguard Worker}
596*333d2b36SAndroid Build Coastguard Worker
597*333d2b36SAndroid Build Coastguard Worker// TestPlatformBootclasspath_IncludesRemainingApexJars verifies that any apex boot jar is present in
598*333d2b36SAndroid Build Coastguard Worker// platform_bootclasspath's classpaths.proto config, if the apex does not generate its own config
599*333d2b36SAndroid Build Coastguard Worker// by setting generate_classpaths_proto property to false.
600*333d2b36SAndroid Build Coastguard Workerfunc TestPlatformBootclasspath_IncludesRemainingApexJars(t *testing.T) {
601*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
602*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
603*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
604*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
605*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:foo"),
606*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
607*333d2b36SAndroid Build Coastguard Worker			platform_bootclasspath {
608*333d2b36SAndroid Build Coastguard Worker				name: "platform-bootclasspath",
609*333d2b36SAndroid Build Coastguard Worker				fragments: [
610*333d2b36SAndroid Build Coastguard Worker					{
611*333d2b36SAndroid Build Coastguard Worker						apex: "myapex",
612*333d2b36SAndroid Build Coastguard Worker						module:"foo-fragment",
613*333d2b36SAndroid Build Coastguard Worker					},
614*333d2b36SAndroid Build Coastguard Worker				],
615*333d2b36SAndroid Build Coastguard Worker			}
616*333d2b36SAndroid Build Coastguard Worker
617*333d2b36SAndroid Build Coastguard Worker			apex {
618*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
619*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
620*333d2b36SAndroid Build Coastguard Worker				bootclasspath_fragments: ["foo-fragment"],
621*333d2b36SAndroid Build Coastguard Worker				updatable: false,
622*333d2b36SAndroid Build Coastguard Worker			}
623*333d2b36SAndroid Build Coastguard Worker
624*333d2b36SAndroid Build Coastguard Worker			apex_key {
625*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
626*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
627*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
628*333d2b36SAndroid Build Coastguard Worker			}
629*333d2b36SAndroid Build Coastguard Worker
630*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
631*333d2b36SAndroid Build Coastguard Worker				name: "foo-fragment",
632*333d2b36SAndroid Build Coastguard Worker				generate_classpaths_proto: false,
633*333d2b36SAndroid Build Coastguard Worker				contents: ["foo"],
634*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
635*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
636*333d2b36SAndroid Build Coastguard Worker					split_packages: ["*"],
637*333d2b36SAndroid Build Coastguard Worker				},
638*333d2b36SAndroid Build Coastguard Worker			}
639*333d2b36SAndroid Build Coastguard Worker
640*333d2b36SAndroid Build Coastguard Worker			java_library {
641*333d2b36SAndroid Build Coastguard Worker				name: "foo",
642*333d2b36SAndroid Build Coastguard Worker				srcs: ["a.java"],
643*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
644*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
645*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
646*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
647*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["foo"],
648*333d2b36SAndroid Build Coastguard Worker			}
649*333d2b36SAndroid Build Coastguard Worker		`),
650*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
651*333d2b36SAndroid Build Coastguard Worker
652*333d2b36SAndroid Build Coastguard Worker	java.CheckClasspathFragmentProtoContentInfoProvider(t, result,
653*333d2b36SAndroid Build Coastguard Worker		true,         // proto should be generated
654*333d2b36SAndroid Build Coastguard Worker		"myapex:foo", // apex doesn't generate its own config, so must be in platform_bootclasspath
655*333d2b36SAndroid Build Coastguard Worker		"bootclasspath.pb",
656*333d2b36SAndroid Build Coastguard Worker		"out/soong/target/product/test_device/system/etc/classpaths",
657*333d2b36SAndroid Build Coastguard Worker	)
658*333d2b36SAndroid Build Coastguard Worker}
659*333d2b36SAndroid Build Coastguard Worker
660*333d2b36SAndroid Build Coastguard Workerfunc TestBootJarNotInApex(t *testing.T) {
661*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
662*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
663*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
664*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
665*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
666*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:foo"),
667*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
668*333d2b36SAndroid Build Coastguard Worker		`dependency "foo" of "myplatform-bootclasspath" missing variant`)).
669*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
670*333d2b36SAndroid Build Coastguard Worker			apex {
671*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
672*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
673*333d2b36SAndroid Build Coastguard Worker				updatable: false,
674*333d2b36SAndroid Build Coastguard Worker			}
675*333d2b36SAndroid Build Coastguard Worker
676*333d2b36SAndroid Build Coastguard Worker			apex_key {
677*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
678*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
679*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
680*333d2b36SAndroid Build Coastguard Worker			}
681*333d2b36SAndroid Build Coastguard Worker
682*333d2b36SAndroid Build Coastguard Worker			java_library {
683*333d2b36SAndroid Build Coastguard Worker				name: "foo",
684*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
685*333d2b36SAndroid Build Coastguard Worker				installable: true,
686*333d2b36SAndroid Build Coastguard Worker				apex_available: [
687*333d2b36SAndroid Build Coastguard Worker					"myapex",
688*333d2b36SAndroid Build Coastguard Worker				],
689*333d2b36SAndroid Build Coastguard Worker			}
690*333d2b36SAndroid Build Coastguard Worker
691*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
692*333d2b36SAndroid Build Coastguard Worker				name: "not-in-apex-fragment",
693*333d2b36SAndroid Build Coastguard Worker				contents: [
694*333d2b36SAndroid Build Coastguard Worker					"foo",
695*333d2b36SAndroid Build Coastguard Worker				],
696*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
697*333d2b36SAndroid Build Coastguard Worker					split_packages: ["*"],
698*333d2b36SAndroid Build Coastguard Worker				},
699*333d2b36SAndroid Build Coastguard Worker			}
700*333d2b36SAndroid Build Coastguard Worker
701*333d2b36SAndroid Build Coastguard Worker			platform_bootclasspath {
702*333d2b36SAndroid Build Coastguard Worker				name: "myplatform-bootclasspath",
703*333d2b36SAndroid Build Coastguard Worker			}
704*333d2b36SAndroid Build Coastguard Worker		`)
705*333d2b36SAndroid Build Coastguard Worker}
706*333d2b36SAndroid Build Coastguard Worker
707*333d2b36SAndroid Build Coastguard Workerfunc TestBootFragmentNotInApex(t *testing.T) {
708*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
709*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
710*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
711*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
712*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
713*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:foo"),
714*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
715*333d2b36SAndroid Build Coastguard Worker		`library foo.*have no corresponding fragment.*`)).RunTestWithBp(t, `
716*333d2b36SAndroid Build Coastguard Worker			apex {
717*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
718*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
719*333d2b36SAndroid Build Coastguard Worker				java_libs: ["foo"],
720*333d2b36SAndroid Build Coastguard Worker				updatable: false,
721*333d2b36SAndroid Build Coastguard Worker			}
722*333d2b36SAndroid Build Coastguard Worker
723*333d2b36SAndroid Build Coastguard Worker			apex_key {
724*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
725*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
726*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
727*333d2b36SAndroid Build Coastguard Worker			}
728*333d2b36SAndroid Build Coastguard Worker
729*333d2b36SAndroid Build Coastguard Worker			java_library {
730*333d2b36SAndroid Build Coastguard Worker				name: "foo",
731*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
732*333d2b36SAndroid Build Coastguard Worker				installable: true,
733*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
734*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["foo"],
735*333d2b36SAndroid Build Coastguard Worker			}
736*333d2b36SAndroid Build Coastguard Worker
737*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
738*333d2b36SAndroid Build Coastguard Worker				name: "not-in-apex-fragment",
739*333d2b36SAndroid Build Coastguard Worker				contents: ["foo"],
740*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
741*333d2b36SAndroid Build Coastguard Worker					split_packages: ["*"],
742*333d2b36SAndroid Build Coastguard Worker				},
743*333d2b36SAndroid Build Coastguard Worker			}
744*333d2b36SAndroid Build Coastguard Worker
745*333d2b36SAndroid Build Coastguard Worker			platform_bootclasspath {
746*333d2b36SAndroid Build Coastguard Worker				name: "myplatform-bootclasspath",
747*333d2b36SAndroid Build Coastguard Worker			}
748*333d2b36SAndroid Build Coastguard Worker		`)
749*333d2b36SAndroid Build Coastguard Worker}
750*333d2b36SAndroid Build Coastguard Worker
751*333d2b36SAndroid Build Coastguard Workerfunc TestNonBootJarInFragment(t *testing.T) {
752*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
753*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
754*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithPlatformBootclasspath,
755*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithApexBuildComponents,
756*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithMyapex,
757*333d2b36SAndroid Build Coastguard Worker		java.FixtureConfigureApexBootJars("myapex:foo"),
758*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
759*333d2b36SAndroid Build Coastguard Worker		`in contents must also be declared in PRODUCT_APEX_BOOT_JARS`)).
760*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
761*333d2b36SAndroid Build Coastguard Worker			apex {
762*333d2b36SAndroid Build Coastguard Worker				name: "myapex",
763*333d2b36SAndroid Build Coastguard Worker				key: "myapex.key",
764*333d2b36SAndroid Build Coastguard Worker				bootclasspath_fragments: ["apex-fragment"],
765*333d2b36SAndroid Build Coastguard Worker				updatable: false,
766*333d2b36SAndroid Build Coastguard Worker			}
767*333d2b36SAndroid Build Coastguard Worker
768*333d2b36SAndroid Build Coastguard Worker			apex_key {
769*333d2b36SAndroid Build Coastguard Worker				name: "myapex.key",
770*333d2b36SAndroid Build Coastguard Worker				public_key: "testkey.avbpubkey",
771*333d2b36SAndroid Build Coastguard Worker				private_key: "testkey.pem",
772*333d2b36SAndroid Build Coastguard Worker			}
773*333d2b36SAndroid Build Coastguard Worker
774*333d2b36SAndroid Build Coastguard Worker			java_library {
775*333d2b36SAndroid Build Coastguard Worker				name: "foo",
776*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
777*333d2b36SAndroid Build Coastguard Worker				installable: true,
778*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
779*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["foo"],
780*333d2b36SAndroid Build Coastguard Worker			}
781*333d2b36SAndroid Build Coastguard Worker
782*333d2b36SAndroid Build Coastguard Worker			java_library {
783*333d2b36SAndroid Build Coastguard Worker				name: "bar",
784*333d2b36SAndroid Build Coastguard Worker				srcs: ["b.java"],
785*333d2b36SAndroid Build Coastguard Worker				installable: true,
786*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
787*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["bar"],
788*333d2b36SAndroid Build Coastguard Worker			}
789*333d2b36SAndroid Build Coastguard Worker
790*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
791*333d2b36SAndroid Build Coastguard Worker				name: "apex-fragment",
792*333d2b36SAndroid Build Coastguard Worker				contents: ["foo", "bar"],
793*333d2b36SAndroid Build Coastguard Worker				apex_available:[ "myapex" ],
794*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
795*333d2b36SAndroid Build Coastguard Worker					split_packages: ["*"],
796*333d2b36SAndroid Build Coastguard Worker				},
797*333d2b36SAndroid Build Coastguard Worker			}
798*333d2b36SAndroid Build Coastguard Worker
799*333d2b36SAndroid Build Coastguard Worker			platform_bootclasspath {
800*333d2b36SAndroid Build Coastguard Worker				name: "myplatform-bootclasspath",
801*333d2b36SAndroid Build Coastguard Worker				fragments: [{
802*333d2b36SAndroid Build Coastguard Worker						apex: "myapex",
803*333d2b36SAndroid Build Coastguard Worker						module:"apex-fragment",
804*333d2b36SAndroid Build Coastguard Worker				}],
805*333d2b36SAndroid Build Coastguard Worker			}
806*333d2b36SAndroid Build Coastguard Worker		`)
807*333d2b36SAndroid Build Coastguard Worker}
808*333d2b36SAndroid Build Coastguard Worker
809*333d2b36SAndroid Build Coastguard Worker// Skip bcp_fragment content validation of source apexes if prebuilts are active.
810*333d2b36SAndroid Build Coastguard Workerfunc TestNonBootJarInPrebuilts(t *testing.T) {
811*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
812*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
813*333d2b36SAndroid Build Coastguard Worker		description               string
814*333d2b36SAndroid Build Coastguard Worker		selectedApexContributions string
815*333d2b36SAndroid Build Coastguard Worker		expectedError             string
816*333d2b36SAndroid Build Coastguard Worker	}{
817*333d2b36SAndroid Build Coastguard Worker		{
818*333d2b36SAndroid Build Coastguard Worker			description:               "source is active",
819*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "",
820*333d2b36SAndroid Build Coastguard Worker			expectedError:             "in contents must also be declared in PRODUCT_APEX_BOOT_JARS",
821*333d2b36SAndroid Build Coastguard Worker		},
822*333d2b36SAndroid Build Coastguard Worker		{
823*333d2b36SAndroid Build Coastguard Worker			description:               "prebuilts are active",
824*333d2b36SAndroid Build Coastguard Worker			selectedApexContributions: "myapex.prebuilt.contributions",
825*333d2b36SAndroid Build Coastguard Worker			expectedError:             "", // skip content validation of source bcp fragment
826*333d2b36SAndroid Build Coastguard Worker		},
827*333d2b36SAndroid Build Coastguard Worker	}
828*333d2b36SAndroid Build Coastguard Worker	bp := `
829*333d2b36SAndroid Build Coastguard Worker// Source
830*333d2b36SAndroid Build Coastguard Workerapex {
831*333d2b36SAndroid Build Coastguard Worker	name: "myapex",
832*333d2b36SAndroid Build Coastguard Worker	key: "myapex.key",
833*333d2b36SAndroid Build Coastguard Worker	bootclasspath_fragments: ["apex-fragment"],
834*333d2b36SAndroid Build Coastguard Worker	updatable: false,
835*333d2b36SAndroid Build Coastguard Worker	min_sdk_version: "29",
836*333d2b36SAndroid Build Coastguard Worker}
837*333d2b36SAndroid Build Coastguard Worker
838*333d2b36SAndroid Build Coastguard Workeroverride_apex {
839*333d2b36SAndroid Build Coastguard Worker	name: "myapex.override", // overrides the min_sdk_version, thereby creating different variants of its transitive deps
840*333d2b36SAndroid Build Coastguard Worker	base: "myapex",
841*333d2b36SAndroid Build Coastguard Worker	min_sdk_version: "34",
842*333d2b36SAndroid Build Coastguard Worker}
843*333d2b36SAndroid Build Coastguard Worker
844*333d2b36SAndroid Build Coastguard Workerapex_key {
845*333d2b36SAndroid Build Coastguard Worker	name: "myapex.key",
846*333d2b36SAndroid Build Coastguard Worker	public_key: "testkey.avbpubkey",
847*333d2b36SAndroid Build Coastguard Worker	private_key: "testkey.pem",
848*333d2b36SAndroid Build Coastguard Worker}
849*333d2b36SAndroid Build Coastguard Worker
850*333d2b36SAndroid Build Coastguard Workerjava_library {
851*333d2b36SAndroid Build Coastguard Worker	name: "foo",
852*333d2b36SAndroid Build Coastguard Worker	srcs: ["b.java"],
853*333d2b36SAndroid Build Coastguard Worker	installable: true,
854*333d2b36SAndroid Build Coastguard Worker	apex_available: ["myapex"],
855*333d2b36SAndroid Build Coastguard Worker	permitted_packages: ["foo"],
856*333d2b36SAndroid Build Coastguard Worker	min_sdk_version: "29",
857*333d2b36SAndroid Build Coastguard Worker}
858*333d2b36SAndroid Build Coastguard Worker
859*333d2b36SAndroid Build Coastguard Workerjava_library {
860*333d2b36SAndroid Build Coastguard Worker	name: "bar",
861*333d2b36SAndroid Build Coastguard Worker	srcs: ["b.java"],
862*333d2b36SAndroid Build Coastguard Worker	installable: true,
863*333d2b36SAndroid Build Coastguard Worker	apex_available: ["myapex"],
864*333d2b36SAndroid Build Coastguard Worker	permitted_packages: ["bar"],
865*333d2b36SAndroid Build Coastguard Worker	min_sdk_version: "29",
866*333d2b36SAndroid Build Coastguard Worker}
867*333d2b36SAndroid Build Coastguard Worker
868*333d2b36SAndroid Build Coastguard Workerbootclasspath_fragment {
869*333d2b36SAndroid Build Coastguard Worker	name: "apex-fragment",
870*333d2b36SAndroid Build Coastguard Worker	contents: ["foo", "bar"],
871*333d2b36SAndroid Build Coastguard Worker	apex_available:[ "myapex" ],
872*333d2b36SAndroid Build Coastguard Worker	hidden_api: {
873*333d2b36SAndroid Build Coastguard Worker		split_packages: ["*"],
874*333d2b36SAndroid Build Coastguard Worker	},
875*333d2b36SAndroid Build Coastguard Worker}
876*333d2b36SAndroid Build Coastguard Worker
877*333d2b36SAndroid Build Coastguard Workerplatform_bootclasspath {
878*333d2b36SAndroid Build Coastguard Worker	name: "myplatform-bootclasspath",
879*333d2b36SAndroid Build Coastguard Worker	fragments: [{
880*333d2b36SAndroid Build Coastguard Worker			apex: "myapex",
881*333d2b36SAndroid Build Coastguard Worker			module:"apex-fragment",
882*333d2b36SAndroid Build Coastguard Worker	}],
883*333d2b36SAndroid Build Coastguard Worker}
884*333d2b36SAndroid Build Coastguard Worker
885*333d2b36SAndroid Build Coastguard Worker// prebuilts
886*333d2b36SAndroid Build Coastguard Workerprebuilt_apex {
887*333d2b36SAndroid Build Coastguard Worker	name: "myapex",
888*333d2b36SAndroid Build Coastguard Worker		apex_name: "myapex",
889*333d2b36SAndroid Build Coastguard Worker		src: "myapex.apex",
890*333d2b36SAndroid Build Coastguard Worker		exported_bootclasspath_fragments: ["apex-fragment"],
891*333d2b36SAndroid Build Coastguard Worker	}
892*333d2b36SAndroid Build Coastguard Worker
893*333d2b36SAndroid Build Coastguard Worker	prebuilt_bootclasspath_fragment {
894*333d2b36SAndroid Build Coastguard Worker		name: "apex-fragment",
895*333d2b36SAndroid Build Coastguard Worker		contents: ["foo"],
896*333d2b36SAndroid Build Coastguard Worker		hidden_api: {
897*333d2b36SAndroid Build Coastguard Worker			annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
898*333d2b36SAndroid Build Coastguard Worker			metadata: "my-bootclasspath-fragment/metadata.csv",
899*333d2b36SAndroid Build Coastguard Worker			index: "my-bootclasspath-fragment/index.csv",
900*333d2b36SAndroid Build Coastguard Worker			stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
901*333d2b36SAndroid Build Coastguard Worker			all_flags: "my-bootclasspath-fragment/all-flags.csv",
902*333d2b36SAndroid Build Coastguard Worker		},
903*333d2b36SAndroid Build Coastguard Worker	}
904*333d2b36SAndroid Build Coastguard Worker	java_import {
905*333d2b36SAndroid Build Coastguard Worker		name: "foo",
906*333d2b36SAndroid Build Coastguard Worker		jars: ["foo.jar"],
907*333d2b36SAndroid Build Coastguard Worker	}
908*333d2b36SAndroid Build Coastguard Worker
909*333d2b36SAndroid Build Coastguard Workerapex_contributions {
910*333d2b36SAndroid Build Coastguard Worker	name: "myapex.prebuilt.contributions",
911*333d2b36SAndroid Build Coastguard Worker	api_domain: "myapex",
912*333d2b36SAndroid Build Coastguard Worker	contents: ["prebuilt_myapex"],
913*333d2b36SAndroid Build Coastguard Worker}
914*333d2b36SAndroid Build Coastguard Worker`
915*333d2b36SAndroid Build Coastguard Worker
916*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
917*333d2b36SAndroid Build Coastguard Worker		fixture := android.GroupFixturePreparers(
918*333d2b36SAndroid Build Coastguard Worker			prepareForTestWithPlatformBootclasspath,
919*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithApexBuildComponents,
920*333d2b36SAndroid Build Coastguard Worker			prepareForTestWithMyapex,
921*333d2b36SAndroid Build Coastguard Worker			java.FixtureConfigureApexBootJars("myapex:foo"),
922*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
923*333d2b36SAndroid Build Coastguard Worker		)
924*333d2b36SAndroid Build Coastguard Worker		if tc.expectedError != "" {
925*333d2b36SAndroid Build Coastguard Worker			fixture = fixture.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError))
926*333d2b36SAndroid Build Coastguard Worker		}
927*333d2b36SAndroid Build Coastguard Worker		fixture.RunTestWithBp(t, bp)
928*333d2b36SAndroid Build Coastguard Worker	}
929*333d2b36SAndroid Build Coastguard Worker
930*333d2b36SAndroid Build Coastguard Worker}
931*333d2b36SAndroid Build Coastguard Worker
932*333d2b36SAndroid Build Coastguard Worker// Source and prebuilt apex provide different set of boot jars
933*333d2b36SAndroid Build Coastguard Workerfunc TestNonBootJarMissingInPrebuiltFragment(t *testing.T) {
934*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
935*333d2b36SAndroid Build Coastguard Worker	bp := `
936*333d2b36SAndroid Build Coastguard Worker		apex {
937*333d2b36SAndroid Build Coastguard Worker			name: "myapex",
938*333d2b36SAndroid Build Coastguard Worker			key: "myapex.key",
939*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragments: ["apex-fragment"],
940*333d2b36SAndroid Build Coastguard Worker			updatable: false,
941*333d2b36SAndroid Build Coastguard Worker		}
942*333d2b36SAndroid Build Coastguard Worker
943*333d2b36SAndroid Build Coastguard Worker		apex_key {
944*333d2b36SAndroid Build Coastguard Worker			name: "myapex.key",
945*333d2b36SAndroid Build Coastguard Worker			public_key: "testkey.avbpubkey",
946*333d2b36SAndroid Build Coastguard Worker			private_key: "testkey.pem",
947*333d2b36SAndroid Build Coastguard Worker		}
948*333d2b36SAndroid Build Coastguard Worker
949*333d2b36SAndroid Build Coastguard Worker		java_library {
950*333d2b36SAndroid Build Coastguard Worker			name: "foo",
951*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
952*333d2b36SAndroid Build Coastguard Worker			installable: true,
953*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
954*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
955*333d2b36SAndroid Build Coastguard Worker		}
956*333d2b36SAndroid Build Coastguard Worker
957*333d2b36SAndroid Build Coastguard Worker		java_library {
958*333d2b36SAndroid Build Coastguard Worker			name: "bar",
959*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
960*333d2b36SAndroid Build Coastguard Worker			installable: true,
961*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
962*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
963*333d2b36SAndroid Build Coastguard Worker		}
964*333d2b36SAndroid Build Coastguard Worker
965*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
966*333d2b36SAndroid Build Coastguard Worker			name: "apex-fragment",
967*333d2b36SAndroid Build Coastguard Worker			contents: ["foo", "bar"],
968*333d2b36SAndroid Build Coastguard Worker			apex_available:[ "myapex" ],
969*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
970*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
971*333d2b36SAndroid Build Coastguard Worker			},
972*333d2b36SAndroid Build Coastguard Worker		}
973*333d2b36SAndroid Build Coastguard Worker
974*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
975*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.myapex", // mainline prebuilt selection logic in soong relies on the naming convention com.google.android
976*333d2b36SAndroid Build Coastguard Worker			apex_name: "myapex",
977*333d2b36SAndroid Build Coastguard Worker			source_apex_name: "myapex",
978*333d2b36SAndroid Build Coastguard Worker			src: "myapex.apex",
979*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["apex-fragment"],
980*333d2b36SAndroid Build Coastguard Worker		}
981*333d2b36SAndroid Build Coastguard Worker
982*333d2b36SAndroid Build Coastguard Worker		java_import {
983*333d2b36SAndroid Build Coastguard Worker			name: "foo",
984*333d2b36SAndroid Build Coastguard Worker			jars: ["foo.jar"],
985*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
986*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["foo"],
987*333d2b36SAndroid Build Coastguard Worker		}
988*333d2b36SAndroid Build Coastguard Worker
989*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
990*333d2b36SAndroid Build Coastguard Worker			name: "apex-fragment",
991*333d2b36SAndroid Build Coastguard Worker			contents: ["foo"], // Unlike the source fragment, this is missing bar
992*333d2b36SAndroid Build Coastguard Worker			apex_available:[ "myapex" ],
993*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
994*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
995*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
996*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
997*333d2b36SAndroid Build Coastguard Worker				stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
998*333d2b36SAndroid Build Coastguard Worker				all_flags: "my-bootclasspath-fragment/all-flags.csv",
999*333d2b36SAndroid Build Coastguard Worker			},
1000*333d2b36SAndroid Build Coastguard Worker		}
1001*333d2b36SAndroid Build Coastguard Worker
1002*333d2b36SAndroid Build Coastguard Worker		// Another prebuilt apex, but this is not selected during the build.
1003*333d2b36SAndroid Build Coastguard Worker		prebuilt_apex {
1004*333d2b36SAndroid Build Coastguard Worker			name: "com.google.android.myapex.v2", // mainline prebuilt selection logic in soong relies on the naming convention com.google.android
1005*333d2b36SAndroid Build Coastguard Worker			apex_name: "myapex",
1006*333d2b36SAndroid Build Coastguard Worker			source_apex_name: "myapex",
1007*333d2b36SAndroid Build Coastguard Worker			src: "myapex.apex",
1008*333d2b36SAndroid Build Coastguard Worker			exported_bootclasspath_fragments: ["apex-fragment.v2"],
1009*333d2b36SAndroid Build Coastguard Worker		}
1010*333d2b36SAndroid Build Coastguard Worker
1011*333d2b36SAndroid Build Coastguard Worker		java_import {
1012*333d2b36SAndroid Build Coastguard Worker			name: "bar",
1013*333d2b36SAndroid Build Coastguard Worker			jars: ["bar.jar"],
1014*333d2b36SAndroid Build Coastguard Worker			apex_available: ["myapex"],
1015*333d2b36SAndroid Build Coastguard Worker			permitted_packages: ["bar"],
1016*333d2b36SAndroid Build Coastguard Worker		}
1017*333d2b36SAndroid Build Coastguard Worker
1018*333d2b36SAndroid Build Coastguard Worker		prebuilt_bootclasspath_fragment {
1019*333d2b36SAndroid Build Coastguard Worker			name: "apex-fragment.v2",
1020*333d2b36SAndroid Build Coastguard Worker			contents: ["bar"], // Unlike the source fragment, this is missing foo
1021*333d2b36SAndroid Build Coastguard Worker			apex_available:[ "myapex" ],
1022*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
1023*333d2b36SAndroid Build Coastguard Worker				annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
1024*333d2b36SAndroid Build Coastguard Worker				metadata: "my-bootclasspath-fragment/metadata.csv",
1025*333d2b36SAndroid Build Coastguard Worker				index: "my-bootclasspath-fragment/index.csv",
1026*333d2b36SAndroid Build Coastguard Worker				stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
1027*333d2b36SAndroid Build Coastguard Worker				all_flags: "my-bootclasspath-fragment/all-flags.csv",
1028*333d2b36SAndroid Build Coastguard Worker			},
1029*333d2b36SAndroid Build Coastguard Worker		}
1030*333d2b36SAndroid Build Coastguard Worker
1031*333d2b36SAndroid Build Coastguard Worker
1032*333d2b36SAndroid Build Coastguard Worker		apex_contributions {
1033*333d2b36SAndroid Build Coastguard Worker			name: "my_apex_contributions",
1034*333d2b36SAndroid Build Coastguard Worker			api_domain: "myapex",
1035*333d2b36SAndroid Build Coastguard Worker			contents: [%v],
1036*333d2b36SAndroid Build Coastguard Worker		}
1037*333d2b36SAndroid Build Coastguard Worker	`
1038*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
1039*333d2b36SAndroid Build Coastguard Worker		desc                     string
1040*333d2b36SAndroid Build Coastguard Worker		configuredBootJars       []string
1041*333d2b36SAndroid Build Coastguard Worker		apexContributionContents string
1042*333d2b36SAndroid Build Coastguard Worker		errorExpected            bool
1043*333d2b36SAndroid Build Coastguard Worker	}{
1044*333d2b36SAndroid Build Coastguard Worker		{
1045*333d2b36SAndroid Build Coastguard Worker			desc:               "Source apex is selected, and APEX_BOOT_JARS is correctly configured for source apex builds",
1046*333d2b36SAndroid Build Coastguard Worker			configuredBootJars: []string{"myapex:foo", "myapex:bar"},
1047*333d2b36SAndroid Build Coastguard Worker		},
1048*333d2b36SAndroid Build Coastguard Worker		{
1049*333d2b36SAndroid Build Coastguard Worker			desc:               "Source apex is selected, and APEX_BOOT_JARS is missing bar",
1050*333d2b36SAndroid Build Coastguard Worker			configuredBootJars: []string{"myapex:foo"},
1051*333d2b36SAndroid Build Coastguard Worker			errorExpected:      true,
1052*333d2b36SAndroid Build Coastguard Worker		},
1053*333d2b36SAndroid Build Coastguard Worker		{
1054*333d2b36SAndroid Build Coastguard Worker			desc:                     "Prebuilt apex is selected, and APEX_BOOT_JARS is correctly configured for prebuilt apex build",
1055*333d2b36SAndroid Build Coastguard Worker			configuredBootJars:       []string{"myapex:foo"},
1056*333d2b36SAndroid Build Coastguard Worker			apexContributionContents: `"prebuilt_com.google.android.myapex"`,
1057*333d2b36SAndroid Build Coastguard Worker		},
1058*333d2b36SAndroid Build Coastguard Worker		{
1059*333d2b36SAndroid Build Coastguard Worker			desc:                     "Prebuilt apex is selected, and APEX_BOOT_JARS is missing foo",
1060*333d2b36SAndroid Build Coastguard Worker			configuredBootJars:       []string{"myapex:bar"},
1061*333d2b36SAndroid Build Coastguard Worker			apexContributionContents: `"prebuilt_com.google.android.myapex"`,
1062*333d2b36SAndroid Build Coastguard Worker			errorExpected:            true,
1063*333d2b36SAndroid Build Coastguard Worker		},
1064*333d2b36SAndroid Build Coastguard Worker	}
1065*333d2b36SAndroid Build Coastguard Worker
1066*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
1067*333d2b36SAndroid Build Coastguard Worker		fixture := android.GroupFixturePreparers(
1068*333d2b36SAndroid Build Coastguard Worker			prepareForTestWithPlatformBootclasspath,
1069*333d2b36SAndroid Build Coastguard Worker			PrepareForTestWithApexBuildComponents,
1070*333d2b36SAndroid Build Coastguard Worker			prepareForTestWithMyapex,
1071*333d2b36SAndroid Build Coastguard Worker			java.FixtureConfigureApexBootJars(tc.configuredBootJars...),
1072*333d2b36SAndroid Build Coastguard Worker			android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "my_apex_contributions"),
1073*333d2b36SAndroid Build Coastguard Worker		)
1074*333d2b36SAndroid Build Coastguard Worker		if tc.errorExpected {
1075*333d2b36SAndroid Build Coastguard Worker			fixture = fixture.ExtendWithErrorHandler(
1076*333d2b36SAndroid Build Coastguard Worker				android.FixtureExpectsAtLeastOneErrorMatchingPattern(`in contents.*must also be declared in PRODUCT_APEX_BOOT_JARS`),
1077*333d2b36SAndroid Build Coastguard Worker			)
1078*333d2b36SAndroid Build Coastguard Worker		}
1079*333d2b36SAndroid Build Coastguard Worker		fixture.RunTestWithBp(t, fmt.Sprintf(bp, tc.apexContributionContents))
1080*333d2b36SAndroid Build Coastguard Worker	}
1081*333d2b36SAndroid Build Coastguard Worker}
1082