xref: /aosp_15_r20/build/soong/java/hiddenapi_singleton_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2020 Google Inc. All rights reserved.
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	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Worker// TODO(b/177892522): Move these tests into a more appropriate place.
28*333d2b36SAndroid Build Coastguard Worker
29*333d2b36SAndroid Build Coastguard Workerfunc fixtureSetPrebuiltHiddenApiDirProductVariable(prebuiltHiddenApiDir *string) android.FixturePreparer {
30*333d2b36SAndroid Build Coastguard Worker	return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
31*333d2b36SAndroid Build Coastguard Worker		variables.PrebuiltHiddenApiDir = prebuiltHiddenApiDir
32*333d2b36SAndroid Build Coastguard Worker	})
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workervar prepareForTestWithDefaultPlatformBootclasspath = android.FixtureAddTextFile("frameworks/base/boot/Android.bp", `
36*333d2b36SAndroid Build Coastguard Worker	platform_bootclasspath {
37*333d2b36SAndroid Build Coastguard Worker		name: "platform-bootclasspath",
38*333d2b36SAndroid Build Coastguard Worker	}
39*333d2b36SAndroid Build Coastguard Worker`)
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Workervar hiddenApiFixtureFactory = android.GroupFixturePreparers(
42*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithJavaDefaultModules,
43*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithHiddenApiBuildComponents,
44*333d2b36SAndroid Build Coastguard Worker)
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingleton(t *testing.T) {
47*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
48*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
49*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
50*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithDefaultPlatformBootclasspath,
51*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
52*333d2b36SAndroid Build Coastguard Worker		java_library {
53*333d2b36SAndroid Build Coastguard Worker			name: "foo",
54*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
55*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
56*333d2b36SAndroid Build Coastguard Worker		}
57*333d2b36SAndroid Build Coastguard Worker	`)
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
60*333d2b36SAndroid Build Coastguard Worker	hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
61*333d2b36SAndroid Build Coastguard Worker	want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
62*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want)
63*333d2b36SAndroid Build Coastguard Worker}
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithSourceAndPrebuiltPreferredButNoDex(t *testing.T) {
66*333d2b36SAndroid Build Coastguard Worker	expectedErrorMessage := "module prebuilt_foo{os:android,arch:common} does not provide a dex jar"
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
69*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
70*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
71*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithDefaultPlatformBootclasspath,
72*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorMessage)).
73*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, `
74*333d2b36SAndroid Build Coastguard Worker		java_library {
75*333d2b36SAndroid Build Coastguard Worker			name: "foo",
76*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
77*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
78*333d2b36SAndroid Build Coastguard Worker		}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker		java_import {
81*333d2b36SAndroid Build Coastguard Worker			name: "foo",
82*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
83*333d2b36SAndroid Build Coastguard Worker			prefer: true,
84*333d2b36SAndroid Build Coastguard Worker		}
85*333d2b36SAndroid Build Coastguard Worker	`)
86*333d2b36SAndroid Build Coastguard Worker}
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuilt(t *testing.T) {
89*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
90*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
91*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
92*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithDefaultPlatformBootclasspath,
93*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
94*333d2b36SAndroid Build Coastguard Worker		java_import {
95*333d2b36SAndroid Build Coastguard Worker			name: "foo",
96*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
97*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
98*333d2b36SAndroid Build Coastguard Worker	}
99*333d2b36SAndroid Build Coastguard Worker	`)
100*333d2b36SAndroid Build Coastguard Worker
101*333d2b36SAndroid Build Coastguard Worker	hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
102*333d2b36SAndroid Build Coastguard Worker	hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
103*333d2b36SAndroid Build Coastguard Worker	want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
104*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want)
105*333d2b36SAndroid Build Coastguard Worker}
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) {
108*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
109*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
110*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
111*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithDefaultPlatformBootclasspath,
112*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
113*333d2b36SAndroid Build Coastguard Worker		java_library {
114*333d2b36SAndroid Build Coastguard Worker			name: "foo",
115*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
116*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
117*333d2b36SAndroid Build Coastguard Worker		}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker		java_import {
120*333d2b36SAndroid Build Coastguard Worker			name: "foo",
121*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
122*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
123*333d2b36SAndroid Build Coastguard Worker			prefer: false,
124*333d2b36SAndroid Build Coastguard Worker		}
125*333d2b36SAndroid Build Coastguard Worker	`)
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker	hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
128*333d2b36SAndroid Build Coastguard Worker	hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
129*333d2b36SAndroid Build Coastguard Worker	fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
130*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg)
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	prebuiltJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/dex/foo.jar"
133*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg)
134*333d2b36SAndroid Build Coastguard Worker}
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) {
137*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
138*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
139*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
140*333d2b36SAndroid Build Coastguard Worker		prepareForTestWithDefaultPlatformBootclasspath,
141*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
142*333d2b36SAndroid Build Coastguard Worker		java_library {
143*333d2b36SAndroid Build Coastguard Worker			name: "foo",
144*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
145*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
146*333d2b36SAndroid Build Coastguard Worker		}
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker		java_import {
149*333d2b36SAndroid Build Coastguard Worker			name: "foo",
150*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
151*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
152*333d2b36SAndroid Build Coastguard Worker			prefer: true,
153*333d2b36SAndroid Build Coastguard Worker		}
154*333d2b36SAndroid Build Coastguard Worker	`)
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Worker	hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
157*333d2b36SAndroid Build Coastguard Worker	hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
158*333d2b36SAndroid Build Coastguard Worker	prebuiltJarArg := "--boot-dex=out/soong/.intermediates/prebuilt_foo/android_common/dex/foo.jar"
159*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg)
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Worker	fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
162*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesNotContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg)
163*333d2b36SAndroid Build Coastguard Worker}
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonSdks(t *testing.T) {
166*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
167*333d2b36SAndroid Build Coastguard Worker		name             string
168*333d2b36SAndroid Build Coastguard Worker		unbundledBuild   bool
169*333d2b36SAndroid Build Coastguard Worker		publicStub       string
170*333d2b36SAndroid Build Coastguard Worker		systemStub       string
171*333d2b36SAndroid Build Coastguard Worker		testStub         string
172*333d2b36SAndroid Build Coastguard Worker		corePlatformStub string
173*333d2b36SAndroid Build Coastguard Worker
174*333d2b36SAndroid Build Coastguard Worker		// Additional test preparer
175*333d2b36SAndroid Build Coastguard Worker		preparer android.FixturePreparer
176*333d2b36SAndroid Build Coastguard Worker	}{
177*333d2b36SAndroid Build Coastguard Worker		{
178*333d2b36SAndroid Build Coastguard Worker			name:             "testBundled",
179*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:   false,
180*333d2b36SAndroid Build Coastguard Worker			publicStub:       "android_stubs_current_exportable",
181*333d2b36SAndroid Build Coastguard Worker			systemStub:       "android_system_stubs_current_exportable",
182*333d2b36SAndroid Build Coastguard Worker			testStub:         "android_test_stubs_current_exportable",
183*333d2b36SAndroid Build Coastguard Worker			corePlatformStub: "legacy.core.platform.api.stubs.exportable",
184*333d2b36SAndroid Build Coastguard Worker			preparer:         android.GroupFixturePreparers(),
185*333d2b36SAndroid Build Coastguard Worker		}, {
186*333d2b36SAndroid Build Coastguard Worker			name:             "testUnbundled",
187*333d2b36SAndroid Build Coastguard Worker			unbundledBuild:   true,
188*333d2b36SAndroid Build Coastguard Worker			publicStub:       "sdk_public_current_android",
189*333d2b36SAndroid Build Coastguard Worker			systemStub:       "sdk_system_current_android",
190*333d2b36SAndroid Build Coastguard Worker			testStub:         "sdk_test_current_android",
191*333d2b36SAndroid Build Coastguard Worker			corePlatformStub: "legacy.core.platform.api.stubs.exportable",
192*333d2b36SAndroid Build Coastguard Worker			preparer:         PrepareForTestWithPrebuiltsOfCurrentApi,
193*333d2b36SAndroid Build Coastguard Worker		},
194*333d2b36SAndroid Build Coastguard Worker	}
195*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
196*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
197*333d2b36SAndroid Build Coastguard Worker			result := android.GroupFixturePreparers(
198*333d2b36SAndroid Build Coastguard Worker				hiddenApiFixtureFactory,
199*333d2b36SAndroid Build Coastguard Worker				tc.preparer,
200*333d2b36SAndroid Build Coastguard Worker				prepareForTestWithDefaultPlatformBootclasspath,
201*333d2b36SAndroid Build Coastguard Worker				// Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
202*333d2b36SAndroid Build Coastguard Worker				// file creation.
203*333d2b36SAndroid Build Coastguard Worker				FixtureConfigureBootJars("platform:foo"),
204*333d2b36SAndroid Build Coastguard Worker				android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
205*333d2b36SAndroid Build Coastguard Worker					variables.Always_use_prebuilt_sdks = proptools.BoolPtr(tc.unbundledBuild)
206*333d2b36SAndroid Build Coastguard Worker				}),
207*333d2b36SAndroid Build Coastguard Worker				android.PrepareForTestWithBuildFlag("RELEASE_HIDDEN_API_EXPORTABLE_STUBS", "true"),
208*333d2b36SAndroid Build Coastguard Worker			).RunTestWithBp(t, `
209*333d2b36SAndroid Build Coastguard Worker		java_library {
210*333d2b36SAndroid Build Coastguard Worker			name: "foo",
211*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
212*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
213*333d2b36SAndroid Build Coastguard Worker		}
214*333d2b36SAndroid Build Coastguard Worker		`)
215*333d2b36SAndroid Build Coastguard Worker
216*333d2b36SAndroid Build Coastguard Worker			hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
217*333d2b36SAndroid Build Coastguard Worker			hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
218*333d2b36SAndroid Build Coastguard Worker			wantPublicStubs := "--public-stub-classpath=" + generateSdkDexPath(tc.publicStub, tc.unbundledBuild)
219*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantPublicStubs)
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Worker			wantSystemStubs := "--system-stub-classpath=" + generateSdkDexPath(tc.systemStub, tc.unbundledBuild)
222*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantSystemStubs)
223*333d2b36SAndroid Build Coastguard Worker
224*333d2b36SAndroid Build Coastguard Worker			wantTestStubs := "--test-stub-classpath=" + generateSdkDexPath(tc.testStub, tc.unbundledBuild)
225*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantTestStubs)
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker			wantCorePlatformStubs := "--core-platform-stub-classpath=" + generateDexPath(defaultJavaDir, tc.corePlatformStub)
228*333d2b36SAndroid Build Coastguard Worker			android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantCorePlatformStubs)
229*333d2b36SAndroid Build Coastguard Worker		})
230*333d2b36SAndroid Build Coastguard Worker	}
231*333d2b36SAndroid Build Coastguard Worker}
232*333d2b36SAndroid Build Coastguard Worker
233*333d2b36SAndroid Build Coastguard Workerfunc generateDexedPath(subDir, dex, module string) string {
234*333d2b36SAndroid Build Coastguard Worker	return fmt.Sprintf("out/soong/.intermediates/%s/android_common/%s/%s.jar", subDir, dex, module)
235*333d2b36SAndroid Build Coastguard Worker}
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Workerfunc generateDexPath(moduleDir string, module string) string {
238*333d2b36SAndroid Build Coastguard Worker	return generateDexedPath(filepath.Join(moduleDir, module), "dex", module)
239*333d2b36SAndroid Build Coastguard Worker}
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Workerfunc generateSdkDexPath(module string, unbundled bool) string {
242*333d2b36SAndroid Build Coastguard Worker	if unbundled {
243*333d2b36SAndroid Build Coastguard Worker		return generateDexedPath("prebuilts/sdk/"+module, "dex", module)
244*333d2b36SAndroid Build Coastguard Worker	}
245*333d2b36SAndroid Build Coastguard Worker	return generateDexPath(defaultJavaDir, module)
246*333d2b36SAndroid Build Coastguard Worker}
247*333d2b36SAndroid Build Coastguard Worker
248*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPISingletonWithPrebuiltCsvFile(t *testing.T) {
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker	// The idea behind this test is to ensure that when the build is
251*333d2b36SAndroid Build Coastguard Worker	// confugured with a PrebuiltHiddenApiDir that the rules for the
252*333d2b36SAndroid Build Coastguard Worker	// hiddenapi singleton copy the prebuilts to the typical output
253*333d2b36SAndroid Build Coastguard Worker	// location, and then use that output location for the hiddenapi encode
254*333d2b36SAndroid Build Coastguard Worker	// dex step.
255*333d2b36SAndroid Build Coastguard Worker
256*333d2b36SAndroid Build Coastguard Worker	// Where to find the prebuilt hiddenapi files:
257*333d2b36SAndroid Build Coastguard Worker	prebuiltHiddenApiDir := "path/to/prebuilt/hiddenapi"
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
260*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
261*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
262*333d2b36SAndroid Build Coastguard Worker		fixtureSetPrebuiltHiddenApiDirProductVariable(&prebuiltHiddenApiDir),
263*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
264*333d2b36SAndroid Build Coastguard Worker		java_import {
265*333d2b36SAndroid Build Coastguard Worker			name: "foo",
266*333d2b36SAndroid Build Coastguard Worker			jars: ["a.jar"],
267*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
268*333d2b36SAndroid Build Coastguard Worker	}
269*333d2b36SAndroid Build Coastguard Worker	`)
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker	expectedCpInput := prebuiltHiddenApiDir + "/hiddenapi-flags.csv"
272*333d2b36SAndroid Build Coastguard Worker	expectedCpOutput := "out/soong/hiddenapi/hiddenapi-flags.csv"
273*333d2b36SAndroid Build Coastguard Worker	expectedFlagsCsv := "out/soong/hiddenapi/hiddenapi-flags.csv"
274*333d2b36SAndroid Build Coastguard Worker
275*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
276*333d2b36SAndroid Build Coastguard Worker
277*333d2b36SAndroid Build Coastguard Worker	hiddenAPI := result.SingletonForTests("hiddenapi")
278*333d2b36SAndroid Build Coastguard Worker	cpRule := hiddenAPI.Rule("Cp")
279*333d2b36SAndroid Build Coastguard Worker	actualCpInput := cpRule.BuildParams.Input
280*333d2b36SAndroid Build Coastguard Worker	actualCpOutput := cpRule.BuildParams.Output
281*333d2b36SAndroid Build Coastguard Worker	encodeDexRule := foo.Rule("hiddenAPIEncodeDex")
282*333d2b36SAndroid Build Coastguard Worker	actualFlagsCsv := encodeDexRule.BuildParams.Args["flagsCsv"]
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker	android.AssertPathRelativeToTopEquals(t, "hiddenapi cp rule input", expectedCpInput, actualCpInput)
285*333d2b36SAndroid Build Coastguard Worker
286*333d2b36SAndroid Build Coastguard Worker	android.AssertPathRelativeToTopEquals(t, "hiddenapi cp rule output", expectedCpOutput, actualCpOutput)
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "hiddenapi encode dex rule flags csv", expectedFlagsCsv, actualFlagsCsv)
289*333d2b36SAndroid Build Coastguard Worker}
290*333d2b36SAndroid Build Coastguard Worker
291*333d2b36SAndroid Build Coastguard Workerfunc TestHiddenAPIEncoding_JavaSdkLibrary(t *testing.T) {
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
294*333d2b36SAndroid Build Coastguard Worker		hiddenApiFixtureFactory,
295*333d2b36SAndroid Build Coastguard Worker		FixtureConfigureBootJars("platform:foo"),
296*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaSdkLibraryFiles,
297*333d2b36SAndroid Build Coastguard Worker		FixtureWithLastReleaseApis("foo"),
298*333d2b36SAndroid Build Coastguard Worker
299*333d2b36SAndroid Build Coastguard Worker		// Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
300*333d2b36SAndroid Build Coastguard Worker		// is disabled.
301*333d2b36SAndroid Build Coastguard Worker		android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
302*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
303*333d2b36SAndroid Build Coastguard Worker		java_sdk_library {
304*333d2b36SAndroid Build Coastguard Worker			name: "foo",
305*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
306*333d2b36SAndroid Build Coastguard Worker			shared_library: false,
307*333d2b36SAndroid Build Coastguard Worker			compile_dex: true,
308*333d2b36SAndroid Build Coastguard Worker			public: {enabled: true},
309*333d2b36SAndroid Build Coastguard Worker		}
310*333d2b36SAndroid Build Coastguard Worker	`)
311*333d2b36SAndroid Build Coastguard Worker
312*333d2b36SAndroid Build Coastguard Worker	checkDexEncoded := func(t *testing.T, name, unencodedDexJar, encodedDexJar string) {
313*333d2b36SAndroid Build Coastguard Worker		moduleForTests := result.ModuleForTests(name+".impl", "android_common")
314*333d2b36SAndroid Build Coastguard Worker
315*333d2b36SAndroid Build Coastguard Worker		encodeDexRule := moduleForTests.Rule("hiddenAPIEncodeDex")
316*333d2b36SAndroid Build Coastguard Worker		actualUnencodedDexJar := encodeDexRule.Input
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Worker		// Make sure that the module has its dex jar encoded.
319*333d2b36SAndroid Build Coastguard Worker		android.AssertStringEquals(t, "encode embedded java_library", unencodedDexJar, actualUnencodedDexJar.String())
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Worker		// Make sure that the encoded dex jar is the exported one.
322*333d2b36SAndroid Build Coastguard Worker		errCtx := moduleErrorfTestCtx{}
323*333d2b36SAndroid Build Coastguard Worker		exportedDexJar := moduleForTests.Module().(UsesLibraryDependency).DexJarBuildPath(errCtx).Path()
324*333d2b36SAndroid Build Coastguard Worker		android.AssertPathRelativeToTopEquals(t, "encode embedded java_library", encodedDexJar, exportedDexJar)
325*333d2b36SAndroid Build Coastguard Worker	}
326*333d2b36SAndroid Build Coastguard Worker
327*333d2b36SAndroid Build Coastguard Worker	// The java_library embedded with the java_sdk_library must be dex encoded.
328*333d2b36SAndroid Build Coastguard Worker	t.Run("foo", func(t *testing.T) {
329*333d2b36SAndroid Build Coastguard Worker		expectedUnencodedDexJar := "out/soong/.intermediates/foo.impl/android_common/aligned/foo.jar"
330*333d2b36SAndroid Build Coastguard Worker		expectedEncodedDexJar := "out/soong/.intermediates/foo.impl/android_common/hiddenapi/foo.jar"
331*333d2b36SAndroid Build Coastguard Worker		checkDexEncoded(t, "foo", expectedUnencodedDexJar, expectedEncodedDexJar)
332*333d2b36SAndroid Build Coastguard Worker	})
333*333d2b36SAndroid Build Coastguard Worker}
334