xref: /aosp_15_r20/build/soong/java/bootclasspath_fragment_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 java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"strings"
19*333d2b36SAndroid Build Coastguard Worker	"testing"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/dexpreopt"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker// Contains some simple tests for bootclasspath_fragment logic, additional tests can be found in
26*333d2b36SAndroid Build Coastguard Worker// apex/bootclasspath_fragment_test.go as the ART boot image requires modules from the ART apex.
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithBootclasspathFragment = android.GroupFixturePreparers(
29*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithJavaDefaultModules,
30*333d2b36SAndroid Build Coastguard Worker	dexpreopt.PrepareForTestByEnablingDexpreopt,
31*333d2b36SAndroid Build Coastguard Worker)
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_UnknownImageName(t *testing.T) {
34*333d2b36SAndroid Build Coastguard Worker	prepareForTestWithBootclasspathFragment.
35*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
36*333d2b36SAndroid Build Coastguard Worker			`\Qimage_name: unknown image name "unknown", expected "art"\E`)).
37*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
38*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
39*333d2b36SAndroid Build Coastguard Worker				name: "unknown-bootclasspath-fragment",
40*333d2b36SAndroid Build Coastguard Worker				image_name: "unknown",
41*333d2b36SAndroid Build Coastguard Worker				contents: ["foo"],
42*333d2b36SAndroid Build Coastguard Worker			}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker			java_library {
45*333d2b36SAndroid Build Coastguard Worker				name: "foo",
46*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.java"],
47*333d2b36SAndroid Build Coastguard Worker				installable: true,
48*333d2b36SAndroid Build Coastguard Worker			}
49*333d2b36SAndroid Build Coastguard Worker		`)
50*333d2b36SAndroid Build Coastguard Worker}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltBootclasspathFragment_UnknownImageName(t *testing.T) {
53*333d2b36SAndroid Build Coastguard Worker	prepareForTestWithBootclasspathFragment.
54*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
55*333d2b36SAndroid Build Coastguard Worker			`\Qimage_name: unknown image name "unknown", expected "art"\E`)).
56*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
57*333d2b36SAndroid Build Coastguard Worker			prebuilt_bootclasspath_fragment {
58*333d2b36SAndroid Build Coastguard Worker				name: "unknown-bootclasspath-fragment",
59*333d2b36SAndroid Build Coastguard Worker				image_name: "unknown",
60*333d2b36SAndroid Build Coastguard Worker				contents: ["foo"],
61*333d2b36SAndroid Build Coastguard Worker			}
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Worker			java_import {
64*333d2b36SAndroid Build Coastguard Worker				name: "foo",
65*333d2b36SAndroid Build Coastguard Worker				jars: ["foo.jar"],
66*333d2b36SAndroid Build Coastguard Worker			}
67*333d2b36SAndroid Build Coastguard Worker		`)
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragmentInconsistentArtConfiguration_Platform(t *testing.T) {
71*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
72*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
73*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetArtBootJars("platform:foo", "apex:bar"),
74*333d2b36SAndroid Build Coastguard Worker	).
75*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
76*333d2b36SAndroid Build Coastguard Worker			`\QArtApexJars is invalid as it requests a platform variant of "foo"\E`)).
77*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
78*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
79*333d2b36SAndroid Build Coastguard Worker				name: "bootclasspath-fragment",
80*333d2b36SAndroid Build Coastguard Worker				image_name: "art",
81*333d2b36SAndroid Build Coastguard Worker				contents: ["foo", "bar"],
82*333d2b36SAndroid Build Coastguard Worker				apex_available: [
83*333d2b36SAndroid Build Coastguard Worker					"apex",
84*333d2b36SAndroid Build Coastguard Worker				],
85*333d2b36SAndroid Build Coastguard Worker			}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker			java_library {
88*333d2b36SAndroid Build Coastguard Worker				name: "foo",
89*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.java"],
90*333d2b36SAndroid Build Coastguard Worker				installable: true,
91*333d2b36SAndroid Build Coastguard Worker			}
92*333d2b36SAndroid Build Coastguard Worker
93*333d2b36SAndroid Build Coastguard Worker			java_library {
94*333d2b36SAndroid Build Coastguard Worker				name: "bar",
95*333d2b36SAndroid Build Coastguard Worker				srcs: ["bar.java"],
96*333d2b36SAndroid Build Coastguard Worker				installable: true,
97*333d2b36SAndroid Build Coastguard Worker			}
98*333d2b36SAndroid Build Coastguard Worker		`)
99*333d2b36SAndroid Build Coastguard Worker}
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragmentInconsistentArtConfiguration_ApexMixture(t *testing.T) {
102*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
103*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
104*333d2b36SAndroid Build Coastguard Worker		dexpreopt.FixtureSetArtBootJars("apex1:foo", "apex2:bar"),
105*333d2b36SAndroid Build Coastguard Worker	).
106*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
107*333d2b36SAndroid Build Coastguard Worker			`\QArtApexJars configuration is inconsistent, expected all jars to be in the same apex but it specifies apex "apex1" and "apex2"\E`)).
108*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
109*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
110*333d2b36SAndroid Build Coastguard Worker				name: "bootclasspath-fragment",
111*333d2b36SAndroid Build Coastguard Worker				image_name: "art",
112*333d2b36SAndroid Build Coastguard Worker				contents: ["foo", "bar"],
113*333d2b36SAndroid Build Coastguard Worker				apex_available: [
114*333d2b36SAndroid Build Coastguard Worker					"apex1",
115*333d2b36SAndroid Build Coastguard Worker					"apex2",
116*333d2b36SAndroid Build Coastguard Worker				],
117*333d2b36SAndroid Build Coastguard Worker			}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker			java_library {
120*333d2b36SAndroid Build Coastguard Worker				name: "foo",
121*333d2b36SAndroid Build Coastguard Worker				srcs: ["foo.java"],
122*333d2b36SAndroid Build Coastguard Worker				installable: true,
123*333d2b36SAndroid Build Coastguard Worker			}
124*333d2b36SAndroid Build Coastguard Worker
125*333d2b36SAndroid Build Coastguard Worker			java_library {
126*333d2b36SAndroid Build Coastguard Worker				name: "bar",
127*333d2b36SAndroid Build Coastguard Worker				srcs: ["bar.java"],
128*333d2b36SAndroid Build Coastguard Worker				installable: true,
129*333d2b36SAndroid Build Coastguard Worker			}
130*333d2b36SAndroid Build Coastguard Worker		`)
131*333d2b36SAndroid Build Coastguard Worker}
132*333d2b36SAndroid Build Coastguard Worker
133*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_Coverage(t *testing.T) {
134*333d2b36SAndroid Build Coastguard Worker	prepareWithBp := android.FixtureWithRootAndroidBp(`
135*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
136*333d2b36SAndroid Build Coastguard Worker			name: "myfragment",
137*333d2b36SAndroid Build Coastguard Worker			contents: [
138*333d2b36SAndroid Build Coastguard Worker				"mybootlib",
139*333d2b36SAndroid Build Coastguard Worker			],
140*333d2b36SAndroid Build Coastguard Worker			api: {
141*333d2b36SAndroid Build Coastguard Worker				stub_libs: [
142*333d2b36SAndroid Build Coastguard Worker					"mysdklibrary",
143*333d2b36SAndroid Build Coastguard Worker				],
144*333d2b36SAndroid Build Coastguard Worker			},
145*333d2b36SAndroid Build Coastguard Worker			coverage: {
146*333d2b36SAndroid Build Coastguard Worker				contents: [
147*333d2b36SAndroid Build Coastguard Worker					"coveragelib",
148*333d2b36SAndroid Build Coastguard Worker				],
149*333d2b36SAndroid Build Coastguard Worker				api: {
150*333d2b36SAndroid Build Coastguard Worker					stub_libs: [
151*333d2b36SAndroid Build Coastguard Worker						"mycoveragestubs",
152*333d2b36SAndroid Build Coastguard Worker					],
153*333d2b36SAndroid Build Coastguard Worker				},
154*333d2b36SAndroid Build Coastguard Worker			},
155*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
156*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
157*333d2b36SAndroid Build Coastguard Worker			},
158*333d2b36SAndroid Build Coastguard Worker		}
159*333d2b36SAndroid Build Coastguard Worker
160*333d2b36SAndroid Build Coastguard Worker		java_library {
161*333d2b36SAndroid Build Coastguard Worker			name: "mybootlib",
162*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
163*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
164*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
165*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
166*333d2b36SAndroid Build Coastguard Worker		}
167*333d2b36SAndroid Build Coastguard Worker
168*333d2b36SAndroid Build Coastguard Worker		java_library {
169*333d2b36SAndroid Build Coastguard Worker			name: "coveragelib",
170*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
171*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
172*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
173*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
174*333d2b36SAndroid Build Coastguard Worker		}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
177*333d2b36SAndroid Build Coastguard Worker			name: "mysdklibrary",
178*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
179*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
180*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
181*333d2b36SAndroid Build Coastguard Worker			system: {enabled: true},
182*333d2b36SAndroid Build Coastguard Worker		}
183*333d2b36SAndroid Build Coastguard Worker
184*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
185*333d2b36SAndroid Build Coastguard Worker			name: "mycoveragestubs",
186*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
187*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
188*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
189*333d2b36SAndroid Build Coastguard Worker		}
190*333d2b36SAndroid Build Coastguard Worker	`)
191*333d2b36SAndroid Build Coastguard Worker
192*333d2b36SAndroid Build Coastguard Worker	checkContents := func(t *testing.T, result *android.TestResult, expected ...string) {
193*333d2b36SAndroid Build Coastguard Worker		module := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
194*333d2b36SAndroid Build Coastguard Worker		eval := module.ConfigurableEvaluator(android.PanickingConfigAndErrorContext(result.TestContext))
195*333d2b36SAndroid Build Coastguard Worker		android.AssertArrayString(t, "contents property", expected, module.properties.Contents.GetOrDefault(eval, nil))
196*333d2b36SAndroid Build Coastguard Worker	}
197*333d2b36SAndroid Build Coastguard Worker
198*333d2b36SAndroid Build Coastguard Worker	preparer := android.GroupFixturePreparers(
199*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
200*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
201*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("mysdklibrary", "mycoveragestubs"),
202*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureApexBootJars("someapex:mybootlib"),
203*333d2b36SAndroid Build Coastguard Worker		prepareWithBp,
204*333d2b36SAndroid Build Coastguard Worker	)
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Worker	t.Run("without coverage", func(t *testing.T) {
207*333d2b36SAndroid Build Coastguard Worker		result := preparer.RunTest(t)
208*333d2b36SAndroid Build Coastguard Worker		checkContents(t, result, "mybootlib")
209*333d2b36SAndroid Build Coastguard Worker	})
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Worker	t.Run("with coverage", func(t *testing.T) {
212*333d2b36SAndroid Build Coastguard Worker		result := android.GroupFixturePreparers(
213*333d2b36SAndroid Build Coastguard Worker			prepareForTestWithFrameworkJacocoInstrumentation,
214*333d2b36SAndroid Build Coastguard Worker			preparer,
215*333d2b36SAndroid Build Coastguard Worker		).RunTest(t)
216*333d2b36SAndroid Build Coastguard Worker		checkContents(t, result, "mybootlib", "coveragelib")
217*333d2b36SAndroid Build Coastguard Worker	})
218*333d2b36SAndroid Build Coastguard Worker}
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_StubLibs(t *testing.T) {
221*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
222*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
223*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
224*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("mysdklibrary", "myothersdklibrary", "mycoreplatform"),
225*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureApexBootJars("someapex:mysdklibrary"),
226*333d2b36SAndroid Build Coastguard Worker		android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
227*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
228*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
229*333d2b36SAndroid Build Coastguard Worker			name: "myfragment",
230*333d2b36SAndroid Build Coastguard Worker			contents: ["mysdklibrary"],
231*333d2b36SAndroid Build Coastguard Worker			api: {
232*333d2b36SAndroid Build Coastguard Worker				stub_libs: [
233*333d2b36SAndroid Build Coastguard Worker					"mystublib",
234*333d2b36SAndroid Build Coastguard Worker					"myothersdklibrary",
235*333d2b36SAndroid Build Coastguard Worker				],
236*333d2b36SAndroid Build Coastguard Worker			},
237*333d2b36SAndroid Build Coastguard Worker			core_platform_api: {
238*333d2b36SAndroid Build Coastguard Worker				stub_libs: ["mycoreplatform.stubs"],
239*333d2b36SAndroid Build Coastguard Worker			},
240*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
241*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
242*333d2b36SAndroid Build Coastguard Worker			},
243*333d2b36SAndroid Build Coastguard Worker		}
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Worker		java_library {
246*333d2b36SAndroid Build Coastguard Worker			name: "mystublib",
247*333d2b36SAndroid Build Coastguard Worker			srcs: ["Test.java"],
248*333d2b36SAndroid Build Coastguard Worker			system_modules: "none",
249*333d2b36SAndroid Build Coastguard Worker			sdk_version: "none",
250*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
251*333d2b36SAndroid Build Coastguard Worker		}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
254*333d2b36SAndroid Build Coastguard Worker			name: "mysdklibrary",
255*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
256*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
257*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
258*333d2b36SAndroid Build Coastguard Worker			system: {enabled: true},
259*333d2b36SAndroid Build Coastguard Worker		}
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
262*333d2b36SAndroid Build Coastguard Worker			name: "myothersdklibrary",
263*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
264*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
265*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
266*333d2b36SAndroid Build Coastguard Worker		}
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
269*333d2b36SAndroid Build Coastguard Worker			name: "mycoreplatform",
270*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
271*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
272*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
273*333d2b36SAndroid Build Coastguard Worker		}
274*333d2b36SAndroid Build Coastguard Worker	`)
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Worker	fragment := result.Module("myfragment", "android_common")
277*333d2b36SAndroid Build Coastguard Worker	info, _ := android.OtherModuleProvider(result, fragment, HiddenAPIInfoProvider)
278*333d2b36SAndroid Build Coastguard Worker
279*333d2b36SAndroid Build Coastguard Worker	stubsJar := "out/soong/.intermediates/mystublib/android_common/dex/mystublib.jar"
280*333d2b36SAndroid Build Coastguard Worker
281*333d2b36SAndroid Build Coastguard Worker	// Stubs jars for mysdklibrary
282*333d2b36SAndroid Build Coastguard Worker	publicStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.exportable/android_common/dex/mysdklibrary.stubs.exportable.jar"
283*333d2b36SAndroid Build Coastguard Worker	systemStubsJar := "out/soong/.intermediates/mysdklibrary.stubs.exportable.system/android_common/dex/mysdklibrary.stubs.exportable.system.jar"
284*333d2b36SAndroid Build Coastguard Worker
285*333d2b36SAndroid Build Coastguard Worker	// Stubs jars for myothersdklibrary
286*333d2b36SAndroid Build Coastguard Worker	otherPublicStubsJar := "out/soong/.intermediates/myothersdklibrary.stubs.exportable/android_common/dex/myothersdklibrary.stubs.exportable.jar"
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker	// Check that SdkPublic uses public stubs for all sdk libraries.
289*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "public dex stubs jar", []string{otherPublicStubsJar, publicStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(PublicHiddenAPIScope))
290*333d2b36SAndroid Build Coastguard Worker
291*333d2b36SAndroid Build Coastguard Worker	// Check that SdkSystem uses system stubs for mysdklibrary and public stubs for myothersdklibrary
292*333d2b36SAndroid Build Coastguard Worker	// as it does not provide system stubs.
293*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "system dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(SystemHiddenAPIScope))
294*333d2b36SAndroid Build Coastguard Worker
295*333d2b36SAndroid Build Coastguard Worker	// Check that SdkTest also uses system stubs for mysdklibrary as it does not provide test stubs
296*333d2b36SAndroid Build Coastguard Worker	// and public stubs for myothersdklibrary as it does not provide test stubs either.
297*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "test dex stubs jar", []string{otherPublicStubsJar, systemStubsJar, stubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(TestHiddenAPIScope))
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker	// Check that SdkCorePlatform uses public stubs from the mycoreplatform library.
300*333d2b36SAndroid Build Coastguard Worker	corePlatformStubsJar := "out/soong/.intermediates/mycoreplatform.stubs/android_common/dex/mycoreplatform.stubs.jar"
301*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "core platform dex stubs jar", []string{corePlatformStubsJar}, info.TransitiveStubDexJarsByScope.StubDexJarsForScope(CorePlatformHiddenAPIScope))
302*333d2b36SAndroid Build Coastguard Worker
303*333d2b36SAndroid Build Coastguard Worker	// Check the widest stubs.. The list contains the widest stub dex jar provided by each module.
304*333d2b36SAndroid Build Coastguard Worker	expectedWidestPaths := []string{
305*333d2b36SAndroid Build Coastguard Worker		// mycoreplatform's widest API is core platform.
306*333d2b36SAndroid Build Coastguard Worker		corePlatformStubsJar,
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker		// myothersdklibrary's widest API is public.
309*333d2b36SAndroid Build Coastguard Worker		otherPublicStubsJar,
310*333d2b36SAndroid Build Coastguard Worker
311*333d2b36SAndroid Build Coastguard Worker		// sdklibrary's widest API is system.
312*333d2b36SAndroid Build Coastguard Worker		systemStubsJar,
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Worker		// mystublib's only provides one API and so it must be the widest.
315*333d2b36SAndroid Build Coastguard Worker		stubsJar,
316*333d2b36SAndroid Build Coastguard Worker	}
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "widest dex stubs jar", expectedWidestPaths, info.TransitiveStubDexJarsByScope.StubDexJarsForWidestAPIScope())
319*333d2b36SAndroid Build Coastguard Worker}
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Workerfunc TestFromTextWidestApiScope(t *testing.T) {
322*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
323*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
324*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
325*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(func(config android.Config) {
326*333d2b36SAndroid Build Coastguard Worker			config.SetBuildFromTextStub(true)
327*333d2b36SAndroid Build Coastguard Worker		}),
328*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("mysdklibrary", "android-non-updatable"),
329*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureApexBootJars("someapex:mysdklibrary"),
330*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
331*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
332*333d2b36SAndroid Build Coastguard Worker			name: "myfragment",
333*333d2b36SAndroid Build Coastguard Worker			contents: ["mysdklibrary"],
334*333d2b36SAndroid Build Coastguard Worker			additional_stubs: [
335*333d2b36SAndroid Build Coastguard Worker				"android-non-updatable",
336*333d2b36SAndroid Build Coastguard Worker			],
337*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
338*333d2b36SAndroid Build Coastguard Worker				split_packages: ["*"],
339*333d2b36SAndroid Build Coastguard Worker			},
340*333d2b36SAndroid Build Coastguard Worker		}
341*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
342*333d2b36SAndroid Build Coastguard Worker			name: "mysdklibrary",
343*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
344*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
345*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
346*333d2b36SAndroid Build Coastguard Worker			system: {enabled: true},
347*333d2b36SAndroid Build Coastguard Worker		}
348*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
349*333d2b36SAndroid Build Coastguard Worker			name: "android-non-updatable",
350*333d2b36SAndroid Build Coastguard Worker			srcs: ["b.java"],
351*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
352*333d2b36SAndroid Build Coastguard Worker			public: {
353*333d2b36SAndroid Build Coastguard Worker				enabled: true,
354*333d2b36SAndroid Build Coastguard Worker			},
355*333d2b36SAndroid Build Coastguard Worker			system: {
356*333d2b36SAndroid Build Coastguard Worker				enabled: true,
357*333d2b36SAndroid Build Coastguard Worker			},
358*333d2b36SAndroid Build Coastguard Worker			test: {
359*333d2b36SAndroid Build Coastguard Worker				enabled: true,
360*333d2b36SAndroid Build Coastguard Worker			},
361*333d2b36SAndroid Build Coastguard Worker			module_lib: {
362*333d2b36SAndroid Build Coastguard Worker				enabled: true,
363*333d2b36SAndroid Build Coastguard Worker			},
364*333d2b36SAndroid Build Coastguard Worker		}
365*333d2b36SAndroid Build Coastguard Worker	`)
366*333d2b36SAndroid Build Coastguard Worker
367*333d2b36SAndroid Build Coastguard Worker	fragment := result.ModuleForTests("myfragment", "android_common")
368*333d2b36SAndroid Build Coastguard Worker	dependencyStubDexFlag := "--dependency-stub-dex=out/soong/.intermediates/default/java/android-non-updatable.stubs.test_module_lib/android_common/dex/android-non-updatable.stubs.test_module_lib.jar"
369*333d2b36SAndroid Build Coastguard Worker	stubFlagsCommand := fragment.Output("modular-hiddenapi/stub-flags.csv").RuleParams.Command
370*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
371*333d2b36SAndroid Build Coastguard Worker		"Stub flags generating command does not include the expected dependency stub dex file",
372*333d2b36SAndroid Build Coastguard Worker		stubFlagsCommand, dependencyStubDexFlag)
373*333d2b36SAndroid Build Coastguard Worker}
374*333d2b36SAndroid Build Coastguard Worker
375*333d2b36SAndroid Build Coastguard Workerfunc TestSnapshotWithBootclasspathFragment_HiddenAPI(t *testing.T) {
376*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
377*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
378*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
379*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("mysdklibrary", "mynewlibrary"),
380*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureApexBootJars("myapex:mybootlib", "myapex:mynewlibrary"),
381*333d2b36SAndroid Build Coastguard Worker		android.MockFS{
382*333d2b36SAndroid Build Coastguard Worker			"my-blocked.txt":                   nil,
383*333d2b36SAndroid Build Coastguard Worker			"my-max-target-o-low-priority.txt": nil,
384*333d2b36SAndroid Build Coastguard Worker			"my-max-target-p.txt":              nil,
385*333d2b36SAndroid Build Coastguard Worker			"my-max-target-q.txt":              nil,
386*333d2b36SAndroid Build Coastguard Worker			"my-max-target-r-low-priority.txt": nil,
387*333d2b36SAndroid Build Coastguard Worker			"my-removed.txt":                   nil,
388*333d2b36SAndroid Build Coastguard Worker			"my-unsupported-packages.txt":      nil,
389*333d2b36SAndroid Build Coastguard Worker			"my-unsupported.txt":               nil,
390*333d2b36SAndroid Build Coastguard Worker			"my-new-max-target-q.txt":          nil,
391*333d2b36SAndroid Build Coastguard Worker		}.AddToFixture(),
392*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
393*333d2b36SAndroid Build Coastguard Worker			bootclasspath_fragment {
394*333d2b36SAndroid Build Coastguard Worker				name: "mybootclasspathfragment",
395*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
396*333d2b36SAndroid Build Coastguard Worker				contents: ["mybootlib", "mynewlibrary"],
397*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
398*333d2b36SAndroid Build Coastguard Worker					unsupported: [
399*333d2b36SAndroid Build Coastguard Worker							"my-unsupported.txt",
400*333d2b36SAndroid Build Coastguard Worker					],
401*333d2b36SAndroid Build Coastguard Worker					removed: [
402*333d2b36SAndroid Build Coastguard Worker							"my-removed.txt",
403*333d2b36SAndroid Build Coastguard Worker					],
404*333d2b36SAndroid Build Coastguard Worker					max_target_r_low_priority: [
405*333d2b36SAndroid Build Coastguard Worker							"my-max-target-r-low-priority.txt",
406*333d2b36SAndroid Build Coastguard Worker					],
407*333d2b36SAndroid Build Coastguard Worker					max_target_q: [
408*333d2b36SAndroid Build Coastguard Worker							"my-max-target-q.txt",
409*333d2b36SAndroid Build Coastguard Worker					],
410*333d2b36SAndroid Build Coastguard Worker					max_target_p: [
411*333d2b36SAndroid Build Coastguard Worker							"my-max-target-p.txt",
412*333d2b36SAndroid Build Coastguard Worker					],
413*333d2b36SAndroid Build Coastguard Worker					max_target_o_low_priority: [
414*333d2b36SAndroid Build Coastguard Worker							"my-max-target-o-low-priority.txt",
415*333d2b36SAndroid Build Coastguard Worker					],
416*333d2b36SAndroid Build Coastguard Worker					blocked: [
417*333d2b36SAndroid Build Coastguard Worker							"my-blocked.txt",
418*333d2b36SAndroid Build Coastguard Worker					],
419*333d2b36SAndroid Build Coastguard Worker					unsupported_packages: [
420*333d2b36SAndroid Build Coastguard Worker							"my-unsupported-packages.txt",
421*333d2b36SAndroid Build Coastguard Worker					],
422*333d2b36SAndroid Build Coastguard Worker					split_packages: ["sdklibrary"],
423*333d2b36SAndroid Build Coastguard Worker					package_prefixes: ["sdklibrary.all.mine"],
424*333d2b36SAndroid Build Coastguard Worker					single_packages: ["sdklibrary.mine"],
425*333d2b36SAndroid Build Coastguard Worker				},
426*333d2b36SAndroid Build Coastguard Worker			}
427*333d2b36SAndroid Build Coastguard Worker
428*333d2b36SAndroid Build Coastguard Worker			java_library {
429*333d2b36SAndroid Build Coastguard Worker				name: "mybootlib",
430*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
431*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
432*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
433*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
434*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "1",
435*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
436*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["mybootlib"],
437*333d2b36SAndroid Build Coastguard Worker			}
438*333d2b36SAndroid Build Coastguard Worker
439*333d2b36SAndroid Build Coastguard Worker			java_sdk_library {
440*333d2b36SAndroid Build Coastguard Worker				name: "mynewlibrary",
441*333d2b36SAndroid Build Coastguard Worker				apex_available: ["myapex"],
442*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
443*333d2b36SAndroid Build Coastguard Worker				min_sdk_version: "10",
444*333d2b36SAndroid Build Coastguard Worker				compile_dex: true,
445*333d2b36SAndroid Build Coastguard Worker				public: {enabled: true},
446*333d2b36SAndroid Build Coastguard Worker				permitted_packages: ["mysdklibrary"],
447*333d2b36SAndroid Build Coastguard Worker				hidden_api: {
448*333d2b36SAndroid Build Coastguard Worker					max_target_q: [
449*333d2b36SAndroid Build Coastguard Worker							"my-new-max-target-q.txt",
450*333d2b36SAndroid Build Coastguard Worker					],
451*333d2b36SAndroid Build Coastguard Worker					split_packages: ["sdklibrary", "newlibrary"],
452*333d2b36SAndroid Build Coastguard Worker					package_prefixes: ["newlibrary.all.mine"],
453*333d2b36SAndroid Build Coastguard Worker					single_packages: ["newlibrary.mine"],
454*333d2b36SAndroid Build Coastguard Worker				},
455*333d2b36SAndroid Build Coastguard Worker			}
456*333d2b36SAndroid Build Coastguard Worker		`),
457*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
458*333d2b36SAndroid Build Coastguard Worker
459*333d2b36SAndroid Build Coastguard Worker	// Make sure that the library exports hidden API properties for use by the bootclasspath_fragment.
460*333d2b36SAndroid Build Coastguard Worker	library := result.Module("mynewlibrary", "android_common")
461*333d2b36SAndroid Build Coastguard Worker	info, _ := android.OtherModuleProvider(result, library, hiddenAPIPropertyInfoProvider)
462*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "split packages", []string{"sdklibrary", "newlibrary"}, info.SplitPackages)
463*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "package prefixes", []string{"newlibrary.all.mine"}, info.PackagePrefixes)
464*333d2b36SAndroid Build Coastguard Worker	android.AssertArrayString(t, "single packages", []string{"newlibrary.mine"}, info.SinglePackages)
465*333d2b36SAndroid Build Coastguard Worker	for _, c := range HiddenAPIFlagFileCategories {
466*333d2b36SAndroid Build Coastguard Worker		expectedMaxTargetQPaths := []string(nil)
467*333d2b36SAndroid Build Coastguard Worker		if c.PropertyName() == "max_target_q" {
468*333d2b36SAndroid Build Coastguard Worker			expectedMaxTargetQPaths = []string{"my-new-max-target-q.txt"}
469*333d2b36SAndroid Build Coastguard Worker		}
470*333d2b36SAndroid Build Coastguard Worker		android.AssertPathsRelativeToTopEquals(t, c.PropertyName(), expectedMaxTargetQPaths, info.FlagFilesByCategory[c])
471*333d2b36SAndroid Build Coastguard Worker	}
472*333d2b36SAndroid Build Coastguard Worker
473*333d2b36SAndroid Build Coastguard Worker	// Make sure that the signature-patterns.csv is passed all the appropriate package properties
474*333d2b36SAndroid Build Coastguard Worker	// from the bootclasspath_fragment and its contents.
475*333d2b36SAndroid Build Coastguard Worker	fragment := result.ModuleForTests("mybootclasspathfragment", "android_common")
476*333d2b36SAndroid Build Coastguard Worker	rule := fragment.Output("modular-hiddenapi/signature-patterns.csv")
477*333d2b36SAndroid Build Coastguard Worker	expectedCommand := strings.Join([]string{
478*333d2b36SAndroid Build Coastguard Worker		"--split-package newlibrary",
479*333d2b36SAndroid Build Coastguard Worker		"--split-package sdklibrary",
480*333d2b36SAndroid Build Coastguard Worker		"--package-prefix newlibrary.all.mine",
481*333d2b36SAndroid Build Coastguard Worker		"--package-prefix sdklibrary.all.mine",
482*333d2b36SAndroid Build Coastguard Worker		"--single-package newlibrary.mine",
483*333d2b36SAndroid Build Coastguard Worker		"--single-package sdklibrary",
484*333d2b36SAndroid Build Coastguard Worker	}, " ")
485*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "signature patterns command", rule.RuleParams.Command, expectedCommand)
486*333d2b36SAndroid Build Coastguard Worker}
487*333d2b36SAndroid Build Coastguard Worker
488*333d2b36SAndroid Build Coastguard Workerfunc TestBootclasspathFragment_Test(t *testing.T) {
489*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
490*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithBootclasspathFragment,
491*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
492*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("mysdklibrary"),
493*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
494*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment {
495*333d2b36SAndroid Build Coastguard Worker			name: "myfragment",
496*333d2b36SAndroid Build Coastguard Worker			contents: ["mysdklibrary"],
497*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
498*333d2b36SAndroid Build Coastguard Worker				split_packages: [],
499*333d2b36SAndroid Build Coastguard Worker			},
500*333d2b36SAndroid Build Coastguard Worker		}
501*333d2b36SAndroid Build Coastguard Worker
502*333d2b36SAndroid Build Coastguard Worker		bootclasspath_fragment_test {
503*333d2b36SAndroid Build Coastguard Worker			name: "a_test_fragment",
504*333d2b36SAndroid Build Coastguard Worker			contents: ["mysdklibrary"],
505*333d2b36SAndroid Build Coastguard Worker			hidden_api: {
506*333d2b36SAndroid Build Coastguard Worker				split_packages: [],
507*333d2b36SAndroid Build Coastguard Worker			},
508*333d2b36SAndroid Build Coastguard Worker		}
509*333d2b36SAndroid Build Coastguard Worker
510*333d2b36SAndroid Build Coastguard Worker
511*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
512*333d2b36SAndroid Build Coastguard Worker			name: "mysdklibrary",
513*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
514*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
515*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
516*333d2b36SAndroid Build Coastguard Worker			system: {enabled: true},
517*333d2b36SAndroid Build Coastguard Worker		}
518*333d2b36SAndroid Build Coastguard Worker	`)
519*333d2b36SAndroid Build Coastguard Worker
520*333d2b36SAndroid Build Coastguard Worker	fragment := result.Module("myfragment", "android_common").(*BootclasspathFragmentModule)
521*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "not a test fragment", false, fragment.isTestFragment())
522*333d2b36SAndroid Build Coastguard Worker
523*333d2b36SAndroid Build Coastguard Worker	fragment = result.Module("a_test_fragment", "android_common").(*BootclasspathFragmentModule)
524*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "is a test fragment by type", true, fragment.isTestFragment())
525*333d2b36SAndroid Build Coastguard Worker}
526