blob: 62297978c0a106e00c283cea733647656c690f0e [file] [log] [blame]
Liz Kammer5ca3a622020-08-05 15:40:41 -07001// Copyright 2020 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Anton Hanssona2adc372020-07-03 15:31:32 +010018 "fmt"
Paul Duffin175947f2021-03-12 21:44:02 +000019 "path/filepath"
Liz Kammer5ca3a622020-08-05 15:40:41 -070020 "testing"
Anton Hanssona2adc372020-07-03 15:31:32 +010021
Paul Duffin01289a22021-02-04 17:49:33 +000022 "android/soong/android"
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +010023
Anton Hanssona2adc372020-07-03 15:31:32 +010024 "github.com/google/blueprint/proptools"
Liz Kammer5ca3a622020-08-05 15:40:41 -070025)
26
Paul Duffin74431d52021-04-21 14:10:42 +010027// TODO(b/177892522): Move these tests into a more appropriate place.
28
Paul Duffin175947f2021-03-12 21:44:02 +000029func fixtureSetPrebuiltHiddenApiDirProductVariable(prebuiltHiddenApiDir *string) android.FixturePreparer {
30 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
31 variables.PrebuiltHiddenApiDir = prebuiltHiddenApiDir
32 })
Liz Kammer5ca3a622020-08-05 15:40:41 -070033}
34
Paul Duffin74431d52021-04-21 14:10:42 +010035var prepareForTestWithDefaultPlatformBootclasspath = android.FixtureAddTextFile("frameworks/base/boot/Android.bp", `
36 platform_bootclasspath {
37 name: "platform-bootclasspath",
38 }
39`)
40
Paul Duffin71ae5942021-03-22 15:36:52 +000041var hiddenApiFixtureFactory = android.GroupFixturePreparers(
Jiakai Zhangb95998b2023-05-11 16:39:27 +010042 PrepareForTestWithJavaDefaultModules,
43 PrepareForTestWithHiddenApiBuildComponents,
44)
Liz Kammer5ca3a622020-08-05 15:40:41 -070045
46func TestHiddenAPISingleton(t *testing.T) {
Paul Duffin79abe572021-03-29 02:16:14 +010047 result := android.GroupFixturePreparers(
48 hiddenApiFixtureFactory,
Paul Duffin60264a02021-04-12 20:02:36 +010049 FixtureConfigureBootJars("platform:foo"),
Paul Duffin74431d52021-04-21 14:10:42 +010050 prepareForTestWithDefaultPlatformBootclasspath,
Paul Duffin175947f2021-03-12 21:44:02 +000051 ).RunTestWithBp(t, `
Liz Kammer5ca3a622020-08-05 15:40:41 -070052 java_library {
53 name: "foo",
54 srcs: ["a.java"],
55 compile_dex: true,
Paul Duffin01289a22021-02-04 17:49:33 +000056 }
Paul Duffin175947f2021-03-12 21:44:02 +000057 `)
Liz Kammer5ca3a622020-08-05 15:40:41 -070058
Paul Duffin74431d52021-04-21 14:10:42 +010059 hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
60 hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
Paul Duffin2f9e71e2021-03-22 16:24:49 +000061 want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
Paul Duffin175947f2021-03-12 21:44:02 +000062 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want)
Liz Kammer5ca3a622020-08-05 15:40:41 -070063}
64
Paul Duffinec0fe172021-02-25 15:34:13 +000065func TestHiddenAPISingletonWithSourceAndPrebuiltPreferredButNoDex(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +010066 expectedErrorMessage := "module prebuilt_foo{os:android,arch:common} does not provide a dex jar"
Paul Duffin175947f2021-03-12 21:44:02 +000067
Paul Duffin79abe572021-03-29 02:16:14 +010068 android.GroupFixturePreparers(
69 hiddenApiFixtureFactory,
Paul Duffin60264a02021-04-12 20:02:36 +010070 FixtureConfigureBootJars("platform:foo"),
Paul Duffin74431d52021-04-21 14:10:42 +010071 prepareForTestWithDefaultPlatformBootclasspath,
Paul Duffin175947f2021-03-12 21:44:02 +000072 ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(expectedErrorMessage)).
73 RunTestWithBp(t, `
Paul Duffinec0fe172021-02-25 15:34:13 +000074 java_library {
75 name: "foo",
76 srcs: ["a.java"],
77 compile_dex: true,
78 }
79
80 java_import {
81 name: "foo",
82 jars: ["a.jar"],
83 prefer: true,
84 }
Paul Duffin175947f2021-03-12 21:44:02 +000085 `)
Paul Duffinec0fe172021-02-25 15:34:13 +000086}
87
Liz Kammer5ca3a622020-08-05 15:40:41 -070088func TestHiddenAPISingletonWithPrebuilt(t *testing.T) {
Paul Duffin79abe572021-03-29 02:16:14 +010089 result := android.GroupFixturePreparers(
90 hiddenApiFixtureFactory,
Paul Duffin60264a02021-04-12 20:02:36 +010091 FixtureConfigureBootJars("platform:foo"),
Paul Duffin74431d52021-04-21 14:10:42 +010092 prepareForTestWithDefaultPlatformBootclasspath,
Paul Duffin175947f2021-03-12 21:44:02 +000093 ).RunTestWithBp(t, `
Liz Kammer5ca3a622020-08-05 15:40:41 -070094 java_import {
95 name: "foo",
96 jars: ["a.jar"],
97 compile_dex: true,
98 }
Paul Duffin175947f2021-03-12 21:44:02 +000099 `)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700100
Paul Duffin74431d52021-04-21 14:10:42 +0100101 hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
102 hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000103 want := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
Paul Duffin175947f2021-03-12 21:44:02 +0000104 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, want)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700105}
106
107func TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) {
Paul Duffin79abe572021-03-29 02:16:14 +0100108 result := android.GroupFixturePreparers(
109 hiddenApiFixtureFactory,
Paul Duffin60264a02021-04-12 20:02:36 +0100110 FixtureConfigureBootJars("platform:foo"),
Paul Duffin74431d52021-04-21 14:10:42 +0100111 prepareForTestWithDefaultPlatformBootclasspath,
Paul Duffin175947f2021-03-12 21:44:02 +0000112 ).RunTestWithBp(t, `
Liz Kammer5ca3a622020-08-05 15:40:41 -0700113 java_library {
114 name: "foo",
115 srcs: ["a.java"],
116 compile_dex: true,
Paul Duffin01289a22021-02-04 17:49:33 +0000117 }
Liz Kammer5ca3a622020-08-05 15:40:41 -0700118
119 java_import {
120 name: "foo",
121 jars: ["a.jar"],
122 compile_dex: true,
123 prefer: false,
Paul Duffin01289a22021-02-04 17:49:33 +0000124 }
Paul Duffin175947f2021-03-12 21:44:02 +0000125 `)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700126
Paul Duffin74431d52021-04-21 14:10:42 +0100127 hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
128 hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000129 fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
Paul Duffin175947f2021-03-12 21:44:02 +0000130 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700131
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000132 prebuiltJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/dex/foo.jar"
Paul Duffin175947f2021-03-12 21:44:02 +0000133 android.AssertStringDoesNotContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700134}
135
136func TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) {
Paul Duffin79abe572021-03-29 02:16:14 +0100137 result := android.GroupFixturePreparers(
138 hiddenApiFixtureFactory,
Paul Duffin60264a02021-04-12 20:02:36 +0100139 FixtureConfigureBootJars("platform:foo"),
Paul Duffin74431d52021-04-21 14:10:42 +0100140 prepareForTestWithDefaultPlatformBootclasspath,
Paul Duffin175947f2021-03-12 21:44:02 +0000141 ).RunTestWithBp(t, `
Liz Kammer5ca3a622020-08-05 15:40:41 -0700142 java_library {
143 name: "foo",
144 srcs: ["a.java"],
145 compile_dex: true,
Paul Duffin01289a22021-02-04 17:49:33 +0000146 }
Liz Kammer5ca3a622020-08-05 15:40:41 -0700147
148 java_import {
149 name: "foo",
150 jars: ["a.jar"],
151 compile_dex: true,
152 prefer: true,
Paul Duffin01289a22021-02-04 17:49:33 +0000153 }
Paul Duffin175947f2021-03-12 21:44:02 +0000154 `)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700155
Paul Duffin74431d52021-04-21 14:10:42 +0100156 hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
157 hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000158 prebuiltJarArg := "--boot-dex=out/soong/.intermediates/prebuilt_foo/android_common/dex/foo.jar"
Paul Duffin175947f2021-03-12 21:44:02 +0000159 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, prebuiltJarArg)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700160
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000161 fromSourceJarArg := "--boot-dex=out/soong/.intermediates/foo/android_common/aligned/foo.jar"
Paul Duffin175947f2021-03-12 21:44:02 +0000162 android.AssertStringDoesNotContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, fromSourceJarArg)
Liz Kammer5ca3a622020-08-05 15:40:41 -0700163}
Anton Hanssona2adc372020-07-03 15:31:32 +0100164
165func TestHiddenAPISingletonSdks(t *testing.T) {
166 testCases := []struct {
167 name string
168 unbundledBuild bool
169 publicStub string
170 systemStub string
171 testStub string
172 corePlatformStub string
Paul Duffindc92abb2021-03-13 08:28:35 +0000173
174 // Additional test preparer
175 preparer android.FixturePreparer
Anton Hanssona2adc372020-07-03 15:31:32 +0100176 }{
177 {
178 name: "testBundled",
179 unbundledBuild: false,
Jihoon Kangbd093452023-12-26 19:08:01 +0000180 publicStub: "android_stubs_current_exportable",
181 systemStub: "android_system_stubs_current_exportable",
182 testStub: "android_test_stubs_current_exportable",
183 corePlatformStub: "legacy.core.platform.api.stubs.exportable",
Paul Duffindc92abb2021-03-13 08:28:35 +0000184 preparer: android.GroupFixturePreparers(),
Anton Hanssona2adc372020-07-03 15:31:32 +0100185 }, {
186 name: "testUnbundled",
187 unbundledBuild: true,
188 publicStub: "sdk_public_current_android",
189 systemStub: "sdk_system_current_android",
190 testStub: "sdk_test_current_android",
Jihoon Kangbd093452023-12-26 19:08:01 +0000191 corePlatformStub: "legacy.core.platform.api.stubs.exportable",
Paul Duffindc92abb2021-03-13 08:28:35 +0000192 preparer: PrepareForTestWithPrebuiltsOfCurrentApi,
Anton Hanssona2adc372020-07-03 15:31:32 +0100193 },
194 }
195 for _, tc := range testCases {
196 t.Run(tc.name, func(t *testing.T) {
Paul Duffin79abe572021-03-29 02:16:14 +0100197 result := android.GroupFixturePreparers(
198 hiddenApiFixtureFactory,
Paul Duffindc92abb2021-03-13 08:28:35 +0000199 tc.preparer,
Paul Duffin74431d52021-04-21 14:10:42 +0100200 prepareForTestWithDefaultPlatformBootclasspath,
Spandan Das81fe4d12024-05-15 18:43:47 +0000201 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
202 // file creation.
203 FixtureConfigureBootJars("platform:foo"),
Paul Duffin175947f2021-03-12 21:44:02 +0000204 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
205 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(tc.unbundledBuild)
Jihoon Kangbd093452023-12-26 19:08:01 +0000206 variables.BuildFlags = map[string]string{
207 "RELEASE_HIDDEN_API_EXPORTABLE_STUBS": "true",
208 }
Paul Duffin175947f2021-03-12 21:44:02 +0000209 }),
Spandan Das81fe4d12024-05-15 18:43:47 +0000210 ).RunTestWithBp(t, `
211 java_library {
212 name: "foo",
213 srcs: ["a.java"],
214 compile_dex: true,
215 }
216 `)
Anton Hanssona2adc372020-07-03 15:31:32 +0100217
Paul Duffin74431d52021-04-21 14:10:42 +0100218 hiddenAPI := result.ModuleForTests("platform-bootclasspath", "android_common")
219 hiddenapiRule := hiddenAPI.Rule("platform-bootclasspath-monolithic-hiddenapi-stub-flags")
Anton Hanssona2adc372020-07-03 15:31:32 +0100220 wantPublicStubs := "--public-stub-classpath=" + generateSdkDexPath(tc.publicStub, tc.unbundledBuild)
Paul Duffin175947f2021-03-12 21:44:02 +0000221 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantPublicStubs)
Anton Hanssona2adc372020-07-03 15:31:32 +0100222
223 wantSystemStubs := "--system-stub-classpath=" + generateSdkDexPath(tc.systemStub, tc.unbundledBuild)
Paul Duffin175947f2021-03-12 21:44:02 +0000224 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantSystemStubs)
Anton Hanssona2adc372020-07-03 15:31:32 +0100225
226 wantTestStubs := "--test-stub-classpath=" + generateSdkDexPath(tc.testStub, tc.unbundledBuild)
Paul Duffin175947f2021-03-12 21:44:02 +0000227 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantTestStubs)
Anton Hanssona2adc372020-07-03 15:31:32 +0100228
Paul Duffin175947f2021-03-12 21:44:02 +0000229 wantCorePlatformStubs := "--core-platform-stub-classpath=" + generateDexPath(defaultJavaDir, tc.corePlatformStub)
230 android.AssertStringDoesContain(t, "hiddenapi command", hiddenapiRule.RuleParams.Command, wantCorePlatformStubs)
Anton Hanssona2adc372020-07-03 15:31:32 +0100231 })
232 }
233}
234
235func generateDexedPath(subDir, dex, module string) string {
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000236 return fmt.Sprintf("out/soong/.intermediates/%s/android_common/%s/%s.jar", subDir, dex, module)
Anton Hanssona2adc372020-07-03 15:31:32 +0100237}
238
Paul Duffin175947f2021-03-12 21:44:02 +0000239func generateDexPath(moduleDir string, module string) string {
240 return generateDexedPath(filepath.Join(moduleDir, module), "dex", module)
Anton Hanssona2adc372020-07-03 15:31:32 +0100241}
242
243func generateSdkDexPath(module string, unbundled bool) string {
244 if unbundled {
245 return generateDexedPath("prebuilts/sdk/"+module, "dex", module)
246 }
Paul Duffin175947f2021-03-12 21:44:02 +0000247 return generateDexPath(defaultJavaDir, module)
Anton Hanssona2adc372020-07-03 15:31:32 +0100248}
Bill Peckhambae47492021-01-08 09:34:44 -0800249
250func TestHiddenAPISingletonWithPrebuiltCsvFile(t *testing.T) {
251
252 // The idea behind this test is to ensure that when the build is
253 // confugured with a PrebuiltHiddenApiDir that the rules for the
254 // hiddenapi singleton copy the prebuilts to the typical output
255 // location, and then use that output location for the hiddenapi encode
256 // dex step.
257
258 // Where to find the prebuilt hiddenapi files:
259 prebuiltHiddenApiDir := "path/to/prebuilt/hiddenapi"
260
Paul Duffin79abe572021-03-29 02:16:14 +0100261 result := android.GroupFixturePreparers(
262 hiddenApiFixtureFactory,
Paul Duffin60264a02021-04-12 20:02:36 +0100263 FixtureConfigureBootJars("platform:foo"),
Paul Duffin175947f2021-03-12 21:44:02 +0000264 fixtureSetPrebuiltHiddenApiDirProductVariable(&prebuiltHiddenApiDir),
265 ).RunTestWithBp(t, `
Bill Peckhambae47492021-01-08 09:34:44 -0800266 java_import {
267 name: "foo",
268 jars: ["a.jar"],
269 compile_dex: true,
270 }
Paul Duffin175947f2021-03-12 21:44:02 +0000271 `)
Bill Peckhambae47492021-01-08 09:34:44 -0800272
273 expectedCpInput := prebuiltHiddenApiDir + "/hiddenapi-flags.csv"
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000274 expectedCpOutput := "out/soong/hiddenapi/hiddenapi-flags.csv"
275 expectedFlagsCsv := "out/soong/hiddenapi/hiddenapi-flags.csv"
Bill Peckhambae47492021-01-08 09:34:44 -0800276
Paul Duffin175947f2021-03-12 21:44:02 +0000277 foo := result.ModuleForTests("foo", "android_common")
Bill Peckhambae47492021-01-08 09:34:44 -0800278
Paul Duffin175947f2021-03-12 21:44:02 +0000279 hiddenAPI := result.SingletonForTests("hiddenapi")
Bill Peckhambae47492021-01-08 09:34:44 -0800280 cpRule := hiddenAPI.Rule("Cp")
281 actualCpInput := cpRule.BuildParams.Input
282 actualCpOutput := cpRule.BuildParams.Output
Paul Duffina71a67a2021-03-29 00:42:57 +0100283 encodeDexRule := foo.Rule("hiddenAPIEncodeDex")
Bill Peckhambae47492021-01-08 09:34:44 -0800284 actualFlagsCsv := encodeDexRule.BuildParams.Args["flagsCsv"]
285
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000286 android.AssertPathRelativeToTopEquals(t, "hiddenapi cp rule input", expectedCpInput, actualCpInput)
Bill Peckhambae47492021-01-08 09:34:44 -0800287
Paul Duffin2f9e71e2021-03-22 16:24:49 +0000288 android.AssertPathRelativeToTopEquals(t, "hiddenapi cp rule output", expectedCpOutput, actualCpOutput)
Bill Peckhambae47492021-01-08 09:34:44 -0800289
Paul Duffin175947f2021-03-12 21:44:02 +0000290 android.AssertStringEquals(t, "hiddenapi encode dex rule flags csv", expectedFlagsCsv, actualFlagsCsv)
Bill Peckhambae47492021-01-08 09:34:44 -0800291}
Paul Duffin0d586582021-05-14 15:03:30 +0100292
293func TestHiddenAPIEncoding_JavaSdkLibrary(t *testing.T) {
294
295 result := android.GroupFixturePreparers(
296 hiddenApiFixtureFactory,
297 FixtureConfigureBootJars("platform:foo"),
298 PrepareForTestWithJavaSdkLibraryFiles,
299 FixtureWithLastReleaseApis("foo"),
300
301 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
302 // is disabled.
303 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
304 ).RunTestWithBp(t, `
305 java_sdk_library {
306 name: "foo",
307 srcs: ["a.java"],
308 shared_library: false,
309 compile_dex: true,
310 public: {enabled: true},
311 }
312 `)
313
314 checkDexEncoded := func(t *testing.T, name, unencodedDexJar, encodedDexJar string) {
Jihoon Kanga3a05462024-04-05 00:36:44 +0000315 moduleForTests := result.ModuleForTests(name+".impl", "android_common")
Paul Duffin0d586582021-05-14 15:03:30 +0100316
317 encodeDexRule := moduleForTests.Rule("hiddenAPIEncodeDex")
318 actualUnencodedDexJar := encodeDexRule.Input
319
320 // Make sure that the module has its dex jar encoded.
321 android.AssertStringEquals(t, "encode embedded java_library", unencodedDexJar, actualUnencodedDexJar.String())
322
323 // Make sure that the encoded dex jar is the exported one.
Spandan Das59a4a2b2024-01-09 21:35:56 +0000324 errCtx := moduleErrorfTestCtx{}
325 exportedDexJar := moduleForTests.Module().(UsesLibraryDependency).DexJarBuildPath(errCtx).Path()
Paul Duffin0d586582021-05-14 15:03:30 +0100326 android.AssertPathRelativeToTopEquals(t, "encode embedded java_library", encodedDexJar, exportedDexJar)
327 }
328
329 // The java_library embedded with the java_sdk_library must be dex encoded.
330 t.Run("foo", func(t *testing.T) {
Jihoon Kanga3a05462024-04-05 00:36:44 +0000331 expectedUnencodedDexJar := "out/soong/.intermediates/foo.impl/android_common/aligned/foo.jar"
332 expectedEncodedDexJar := "out/soong/.intermediates/foo.impl/android_common/hiddenapi/foo.jar"
Paul Duffin0d586582021-05-14 15:03:30 +0100333 checkDexEncoded(t, "foo", expectedUnencodedDexJar, expectedEncodedDexJar)
334 })
Paul Duffin0d586582021-05-14 15:03:30 +0100335}