blob: 6386a00d5339c030c6551e57847958ae4d4d68f7 [file] [log] [blame]
Colin Crossfb6d7812019-01-09 22:17:55 -08001// Copyright 2019 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 (
Colin Crossfb6d7812019-01-09 22:17:55 -080018 "path/filepath"
Colin Crossfb6d7812019-01-09 22:17:55 -080019 "strings"
20 "testing"
21
22 "github.com/google/blueprint/proptools"
Colin Cross60405e52019-04-18 12:31:22 -070023
24 "android/soong/android"
25 "android/soong/java/config"
Colin Crossfb6d7812019-01-09 22:17:55 -080026)
27
Paul Duffin0b3b36a2021-10-28 18:05:53 +010028type classpathTestCase struct {
29 name string
30 unbundled bool
31 moduleType string
32 host android.OsClass
33 properties string
34
35 // for java 8
36 bootclasspath []string
37 java8classpath []string
38
39 // for java 9
40 system string
41 java9classpath []string
42
43 forces8 bool // if set, javac will always be called with java 8 arguments
44
45 aidl string
Paul Duffin132c3e62021-10-28 18:16:14 +010046
47 // Indicates how this test case is affected by the setting of Always_use_prebuilt_sdks.
48 //
49 // If this is nil then the test case is unaffected by the setting of Always_use_prebuilt_sdks.
50 // Otherwise, the test case can only be used when
51 // Always_use_prebuilt_sdks=*forAlwaysUsePrebuiltSdks.
52 forAlwaysUsePrebuiltSdks *bool
Paul Duffin0b3b36a2021-10-28 18:05:53 +010053}
54
Colin Crossfb6d7812019-01-09 22:17:55 -080055func TestClasspath(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080056 t.Parallel()
Paul Duffin76101fa2021-03-13 09:55:25 +000057 const frameworkAidl = "-I" + defaultJavaDir + "/framework/aidl"
Paul Duffin0b3b36a2021-10-28 18:05:53 +010058 var classpathTestcases = []classpathTestCase{
Colin Cross3047fa22019-04-18 10:56:44 -070059 {
Colin Cross617b1452019-10-25 15:22:50 -070060 name: "default",
Pete Gillin84c38072020-07-09 18:03:41 +010061 bootclasspath: config.StableCorePlatformBootclasspathLibraries,
62 system: config.StableCorePlatformSystemModules,
Pete Gillin0638dfc2020-07-01 10:48:14 +010063 java8classpath: config.FrameworkLibraries,
64 java9classpath: config.FrameworkLibraries,
Paul Duffin76101fa2021-03-13 09:55:25 +000065 aidl: frameworkAidl,
Colin Cross3047fa22019-04-18 10:56:44 -070066 },
67 {
Colin Cross617b1452019-10-25 15:22:50 -070068 name: `sdk_version:"core_platform"`,
69 properties: `sdk_version:"core_platform"`,
Pete Gillin84c38072020-07-09 18:03:41 +010070 bootclasspath: config.StableCorePlatformBootclasspathLibraries,
71 system: config.StableCorePlatformSystemModules,
Colin Cross617b1452019-10-25 15:22:50 -070072 java8classpath: []string{},
73 aidl: "",
Paul Duffin50c217c2019-06-12 13:25:22 +010074 },
75 {
Colin Cross617b1452019-10-25 15:22:50 -070076 name: "blank sdk version",
77 properties: `sdk_version: "",`,
Pete Gillin84c38072020-07-09 18:03:41 +010078 bootclasspath: config.StableCorePlatformBootclasspathLibraries,
79 system: config.StableCorePlatformSystemModules,
Pete Gillin0638dfc2020-07-01 10:48:14 +010080 java8classpath: config.FrameworkLibraries,
81 java9classpath: config.FrameworkLibraries,
Paul Duffin76101fa2021-03-13 09:55:25 +000082 aidl: frameworkAidl,
Colin Cross3047fa22019-04-18 10:56:44 -070083 },
84 {
85
Colin Cross74362a42019-10-28 08:05:02 -070086 name: "sdk v29",
87 properties: `sdk_version: "29",`,
Colin Cross617b1452019-10-25 15:22:50 -070088 bootclasspath: []string{`""`},
89 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -070090 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
91 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -070092 },
93 {
94
Colin Cross17dec172020-05-14 18:05:32 -070095 name: "sdk v30",
96 properties: `sdk_version: "30",`,
97 bootclasspath: []string{`""`},
98 system: "sdk_public_30_system_modules",
99 java8classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
100 java9classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
101 aidl: "-pprebuilts/sdk/30/public/framework.aidl",
102 },
103 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100104 // Test case only applies when Always_use_prebuilt_sdks=false (the default).
105 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
Colin Cross17dec172020-05-14 18:05:32 -0700106
Colin Cross6cef4812019-10-17 14:23:50 -0700107 name: "current",
108 properties: `sdk_version: "current",`,
109 bootclasspath: []string{"android_stubs_current", "core-lambda-stubs"},
Paul Duffin10fb76f2021-11-03 16:53:31 +0000110 system: "core-public-stubs-system-modules",
Colin Cross6cef4812019-10-17 14:23:50 -0700111 java9classpath: []string{"android_stubs_current"},
Paul Duffin414ea5e2021-03-22 17:31:52 +0000112 aidl: "-pout/soong/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700113 },
114 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100115 // Test case only applies when Always_use_prebuilt_sdks=true.
116 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
117
118 name: "current",
119 properties: `sdk_version: "current",`,
120 bootclasspath: []string{`""`},
121 system: "sdk_public_current_system_modules",
122 java8classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
123 java9classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
124 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
125 },
126 {
127 // Test case only applies when Always_use_prebuilt_sdks=false (the default).
128 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
Colin Cross3047fa22019-04-18 10:56:44 -0700129
Colin Cross6cef4812019-10-17 14:23:50 -0700130 name: "system_current",
131 properties: `sdk_version: "system_current",`,
132 bootclasspath: []string{"android_system_stubs_current", "core-lambda-stubs"},
Paul Duffin10fb76f2021-11-03 16:53:31 +0000133 system: "core-public-stubs-system-modules",
Colin Cross6cef4812019-10-17 14:23:50 -0700134 java9classpath: []string{"android_system_stubs_current"},
Paul Duffin414ea5e2021-03-22 17:31:52 +0000135 aidl: "-pout/soong/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700136 },
137 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100138 // Test case only applies when Always_use_prebuilt_sdks=true.
139 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
Colin Cross3047fa22019-04-18 10:56:44 -0700140
Paul Duffin132c3e62021-10-28 18:16:14 +0100141 name: "system_current",
142 properties: `sdk_version: "system_current",`,
143 bootclasspath: []string{`""`},
144 system: "sdk_public_current_system_modules",
145 java8classpath: []string{"prebuilts/sdk/current/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
146 java9classpath: []string{"prebuilts/sdk/current/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
147 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
148 },
149 {
Colin Cross74362a42019-10-28 08:05:02 -0700150 name: "system_29",
151 properties: `sdk_version: "system_29",`,
Colin Cross617b1452019-10-25 15:22:50 -0700152 bootclasspath: []string{`""`},
153 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700154 java8classpath: []string{"prebuilts/sdk/29/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
155 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700156 },
157 {
Colin Cross17dec172020-05-14 18:05:32 -0700158 name: "system_30",
159 properties: `sdk_version: "system_30",`,
160 bootclasspath: []string{`""`},
161 system: "sdk_public_30_system_modules",
162 java8classpath: []string{"prebuilts/sdk/30/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
163 java9classpath: []string{"prebuilts/sdk/30/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
164 aidl: "-pprebuilts/sdk/30/public/framework.aidl",
165 },
166 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100167 // Test case only applies when Always_use_prebuilt_sdks=false (the default).
168 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
169
Colin Cross6cef4812019-10-17 14:23:50 -0700170 name: "test_current",
171 properties: `sdk_version: "test_current",`,
172 bootclasspath: []string{"android_test_stubs_current", "core-lambda-stubs"},
Paul Duffin10fb76f2021-11-03 16:53:31 +0000173 system: "core-public-stubs-system-modules",
Colin Cross6cef4812019-10-17 14:23:50 -0700174 java9classpath: []string{"android_test_stubs_current"},
Paul Duffin414ea5e2021-03-22 17:31:52 +0000175 aidl: "-pout/soong/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700176 },
177 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100178 // Test case only applies when Always_use_prebuilt_sdks=true.
179 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
180
181 name: "test_current",
182 properties: `sdk_version: "test_current",`,
183 bootclasspath: []string{`""`},
184 system: "sdk_public_current_system_modules",
185 java8classpath: []string{"prebuilts/sdk/current/test/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
186 java9classpath: []string{"prebuilts/sdk/current/test/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
187 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
188 },
189 {
Paul Duffin12e311d2021-10-28 17:42:16 +0100190 name: "test_30",
191 properties: `sdk_version: "test_30",`,
192 bootclasspath: []string{`""`},
193 system: "sdk_public_30_system_modules",
194 java8classpath: []string{"prebuilts/sdk/30/test/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
195 java9classpath: []string{"prebuilts/sdk/30/test/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
196 aidl: "-pprebuilts/sdk/30/public/framework.aidl",
197 },
198 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100199 // Test case only applies when Always_use_prebuilt_sdks=false (the default).
200 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
Colin Cross3047fa22019-04-18 10:56:44 -0700201
Pete Gillin880f9642020-07-01 13:17:16 +0100202 name: "core_current",
203 properties: `sdk_version: "core_current",`,
204 bootclasspath: []string{"core.current.stubs", "core-lambda-stubs"},
Paul Duffin10fb76f2021-11-03 16:53:31 +0000205 system: "core-public-stubs-system-modules",
Colin Cross3047fa22019-04-18 10:56:44 -0700206 },
207 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100208 // Test case only applies when Always_use_prebuilt_sdks=true.
209 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
210
211 name: "core_current",
212 properties: `sdk_version: "core_current",`,
213 bootclasspath: []string{`""`},
214 system: "sdk_public_current_system_modules",
215 java8classpath: []string{"prebuilts/sdk/current/core/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
216 java9classpath: []string{"prebuilts/sdk/current/core/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
217 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
218 },
219 {
Colin Cross3047fa22019-04-18 10:56:44 -0700220
Colin Cross617b1452019-10-25 15:22:50 -0700221 name: "nostdlib",
222 properties: `sdk_version: "none", system_modules: "none"`,
223 system: "none",
224 bootclasspath: []string{`""`},
225 java8classpath: []string{},
Paul Duffin52d398a2019-06-11 12:31:14 +0100226 },
227 {
228
Colin Cross617b1452019-10-25 15:22:50 -0700229 name: "nostdlib system_modules",
Pete Gillin84c38072020-07-09 18:03:41 +0100230 properties: `sdk_version: "none", system_modules: "stable-core-platform-api-stubs-system-modules"`,
231 system: "stable-core-platform-api-stubs-system-modules",
232 bootclasspath: []string{"stable-core-platform-api-stubs-system-modules-lib"},
Colin Cross617b1452019-10-25 15:22:50 -0700233 java8classpath: []string{},
Paul Duffin52d398a2019-06-11 12:31:14 +0100234 },
235 {
236
Colin Cross617b1452019-10-25 15:22:50 -0700237 name: "host default",
238 moduleType: "java_library_host",
239 properties: ``,
240 host: android.Host,
241 bootclasspath: []string{"jdk8/jre/lib/jce.jar", "jdk8/jre/lib/rt.jar"},
242 java8classpath: []string{},
Colin Cross3047fa22019-04-18 10:56:44 -0700243 },
244 {
Colin Cross3047fa22019-04-18 10:56:44 -0700245
Colin Cross617b1452019-10-25 15:22:50 -0700246 name: "host supported default",
247 host: android.Host,
248 properties: `host_supported: true,`,
249 java8classpath: []string{},
250 bootclasspath: []string{"jdk8/jre/lib/jce.jar", "jdk8/jre/lib/rt.jar"},
Colin Cross3047fa22019-04-18 10:56:44 -0700251 },
252 {
Colin Cross617b1452019-10-25 15:22:50 -0700253 name: "host supported nostdlib",
254 host: android.Host,
255 properties: `host_supported: true, sdk_version: "none", system_modules: "none"`,
256 java8classpath: []string{},
Paul Duffin52d398a2019-06-11 12:31:14 +0100257 },
258 {
Colin Cross3047fa22019-04-18 10:56:44 -0700259
Colin Cross74362a42019-10-28 08:05:02 -0700260 name: "unbundled sdk v29",
Colin Cross617b1452019-10-25 15:22:50 -0700261 unbundled: true,
Colin Cross74362a42019-10-28 08:05:02 -0700262 properties: `sdk_version: "29",`,
Colin Cross617b1452019-10-25 15:22:50 -0700263 bootclasspath: []string{`""`},
264 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700265 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
266 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700267 },
268 {
269
Colin Cross17dec172020-05-14 18:05:32 -0700270 name: "unbundled sdk v30",
271 unbundled: true,
272 properties: `sdk_version: "30",`,
273 bootclasspath: []string{`""`},
274 system: "sdk_public_30_system_modules",
275 java8classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
276 java9classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
277 aidl: "-pprebuilts/sdk/30/public/framework.aidl",
278 },
279 {
280
Colin Cross617b1452019-10-25 15:22:50 -0700281 name: "unbundled current",
282 unbundled: true,
283 properties: `sdk_version: "current",`,
284 bootclasspath: []string{`""`},
Colin Cross17dec172020-05-14 18:05:32 -0700285 system: "sdk_public_current_system_modules",
Colin Cross617b1452019-10-25 15:22:50 -0700286 java8classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
Colin Cross17dec172020-05-14 18:05:32 -0700287 java9classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
Colin Cross617b1452019-10-25 15:22:50 -0700288 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700289 },
Colin Cross3047fa22019-04-18 10:56:44 -0700290 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100291 // Test case only applies when Always_use_prebuilt_sdks=false (the default).
292 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
293
Jiyong Park50146e92020-01-30 18:00:15 +0900294 name: "module_current",
295 properties: `sdk_version: "module_current",`,
296 bootclasspath: []string{"android_module_lib_stubs_current", "core-lambda-stubs"},
Victor Changb54f5aa2021-06-29 22:05:58 +0100297 system: "core-module-lib-stubs-system-modules",
Jiyong Park50146e92020-01-30 18:00:15 +0900298 java9classpath: []string{"android_module_lib_stubs_current"},
Paul Duffin414ea5e2021-03-22 17:31:52 +0000299 aidl: "-pout/soong/framework_non_updatable.aidl",
Jiyong Park50146e92020-01-30 18:00:15 +0900300 },
Jiyong Parkaae9bd12020-02-12 04:36:43 +0900301 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100302 // Test case only applies when Always_use_prebuilt_sdks=true.
303 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
304
305 name: "module_current",
306 properties: `sdk_version: "module_current",`,
307 bootclasspath: []string{`""`},
Paul Duffin004547f2021-10-29 13:50:24 +0100308 system: "sdk_module-lib_current_system_modules",
Paul Duffin132c3e62021-10-28 18:16:14 +0100309 java8classpath: []string{"prebuilts/sdk/current/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
310 java9classpath: []string{"prebuilts/sdk/current/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
311 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
312 },
313 {
Paul Duffin12e311d2021-10-28 17:42:16 +0100314 name: "module_30",
315 properties: `sdk_version: "module_30",`,
316 bootclasspath: []string{`""`},
317 system: "sdk_public_30_system_modules",
318 java8classpath: []string{"prebuilts/sdk/30/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
319 java9classpath: []string{"prebuilts/sdk/30/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
320 aidl: "-pprebuilts/sdk/30/public/framework.aidl",
321 },
322 {
323 name: "module_31",
324 properties: `sdk_version: "module_31",`,
325 bootclasspath: []string{`""`},
326 system: "sdk_public_31_system_modules",
327 java8classpath: []string{"prebuilts/sdk/31/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
328 java9classpath: []string{"prebuilts/sdk/31/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
329 aidl: "-pprebuilts/sdk/31/public/framework.aidl",
330 },
331 {
332 name: "module_32",
333 properties: `sdk_version: "module_32",`,
334 bootclasspath: []string{`""`},
Paul Duffin004547f2021-10-29 13:50:24 +0100335 system: "sdk_module-lib_32_system_modules",
Paul Duffin12e311d2021-10-28 17:42:16 +0100336 java8classpath: []string{"prebuilts/sdk/32/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
337 java9classpath: []string{"prebuilts/sdk/32/module-lib/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
338 aidl: "-pprebuilts/sdk/32/public/framework.aidl",
339 },
340 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100341 // Test case only applies when Always_use_prebuilt_sdks=false (the default).
342 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
343
Jiyong Parkaae9bd12020-02-12 04:36:43 +0900344 name: "system_server_current",
345 properties: `sdk_version: "system_server_current",`,
Anton Hanssonba6ab2e2020-03-19 15:23:38 +0000346 bootclasspath: []string{"android_system_server_stubs_current", "core-lambda-stubs"},
Victor Changb54f5aa2021-06-29 22:05:58 +0100347 system: "core-module-lib-stubs-system-modules",
Anton Hanssonba6ab2e2020-03-19 15:23:38 +0000348 java9classpath: []string{"android_system_server_stubs_current"},
Paul Duffin414ea5e2021-03-22 17:31:52 +0000349 aidl: "-pout/soong/framework.aidl",
Jiyong Parkaae9bd12020-02-12 04:36:43 +0900350 },
Paul Duffin12e311d2021-10-28 17:42:16 +0100351 {
Paul Duffin132c3e62021-10-28 18:16:14 +0100352 // Test case only applies when Always_use_prebuilt_sdks=true.
353 forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
354
355 name: "system_server_current",
356 properties: `sdk_version: "system_server_current",`,
357 bootclasspath: []string{`""`},
Paul Duffin004547f2021-10-29 13:50:24 +0100358 system: "sdk_module-lib_current_system_modules",
Paul Duffin132c3e62021-10-28 18:16:14 +0100359 java8classpath: []string{"prebuilts/sdk/current/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
360 java9classpath: []string{"prebuilts/sdk/current/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
361 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
362 },
363 {
Paul Duffin12e311d2021-10-28 17:42:16 +0100364 name: "system_server_30",
365 properties: `sdk_version: "system_server_30",`,
366 bootclasspath: []string{`""`},
367 system: "sdk_public_30_system_modules",
368 java8classpath: []string{"prebuilts/sdk/30/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
369 java9classpath: []string{"prebuilts/sdk/30/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
370 aidl: "-pprebuilts/sdk/30/public/framework.aidl",
371 },
372 {
373 name: "system_server_31",
374 properties: `sdk_version: "system_server_31",`,
375 bootclasspath: []string{`""`},
376 system: "sdk_public_31_system_modules",
377 java8classpath: []string{"prebuilts/sdk/31/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
378 java9classpath: []string{"prebuilts/sdk/31/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
379 aidl: "-pprebuilts/sdk/31/public/framework.aidl",
380 },
381 {
382 name: "system_server_32",
383 properties: `sdk_version: "system_server_32",`,
384 bootclasspath: []string{`""`},
Paul Duffin004547f2021-10-29 13:50:24 +0100385 system: "sdk_module-lib_32_system_modules",
Paul Duffin12e311d2021-10-28 17:42:16 +0100386 java8classpath: []string{"prebuilts/sdk/32/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
387 java9classpath: []string{"prebuilts/sdk/32/system-server/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
388 aidl: "-pprebuilts/sdk/32/public/framework.aidl",
389 },
Colin Cross3047fa22019-04-18 10:56:44 -0700390 }
391
Paul Duffin132c3e62021-10-28 18:16:14 +0100392 t.Run("basic", func(t *testing.T) {
Colin Crosse0aa52f2024-07-18 15:35:44 -0700393 t.Parallel()
Colin Cross8ff4af32025-02-19 15:17:02 -0800394 testClasspathTestCases(t, classpathTestcases, false)
Paul Duffin132c3e62021-10-28 18:16:14 +0100395 })
396
397 t.Run("Always_use_prebuilt_sdks=true", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800398 t.Parallel()
Colin Cross8ff4af32025-02-19 15:17:02 -0800399 testClasspathTestCases(t, classpathTestcases, true)
Paul Duffin132c3e62021-10-28 18:16:14 +0100400 })
Paul Duffin0b3b36a2021-10-28 18:05:53 +0100401}
402
Colin Cross8ff4af32025-02-19 15:17:02 -0800403func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase, alwaysUsePrebuiltSdks bool) {
Colin Crossfb6d7812019-01-09 22:17:55 -0800404 for _, testcase := range classpathTestcases {
Paul Duffin132c3e62021-10-28 18:16:14 +0100405 if testcase.forAlwaysUsePrebuiltSdks != nil && *testcase.forAlwaysUsePrebuiltSdks != alwaysUsePrebuiltSdks {
406 continue
407 }
408
Colin Crossfb6d7812019-01-09 22:17:55 -0800409 t.Run(testcase.name, func(t *testing.T) {
Colin Crosse0aa52f2024-07-18 15:35:44 -0700410 t.Parallel()
Colin Crossfb6d7812019-01-09 22:17:55 -0800411 moduleType := "java_library"
412 if testcase.moduleType != "" {
413 moduleType = testcase.moduleType
414 }
415
Pete Gillinbdf5d712019-10-21 14:29:58 +0100416 props := `
Colin Crossfb6d7812019-01-09 22:17:55 -0800417 name: "foo",
418 srcs: ["a.java"],
Colin Cross3047fa22019-04-18 10:56:44 -0700419 target: {
420 android: {
421 srcs: ["bar-doc/IFoo.aidl"],
422 },
423 },
Pete Gillinbdf5d712019-10-21 14:29:58 +0100424 `
425 bp := moduleType + " {" + props + testcase.properties + `
426 }`
427 bpJava8 := moduleType + " {" + props + `java_version: "1.8",
Colin Crossfb6d7812019-01-09 22:17:55 -0800428 ` + testcase.properties + `
429 }`
430
Colin Cross0c66bc62021-07-20 09:47:41 -0700431 variant := func(result *android.TestResult) string {
432 if testcase.host == android.Host {
433 return result.Config.BuildOS.String() + "_common"
434 }
435 return "android_common"
Colin Crossfb6d7812019-01-09 22:17:55 -0800436 }
437
438 convertModulesToPaths := func(cp []string) []string {
439 ret := make([]string, len(cp))
440 for i, e := range cp {
Colin Crossc9b4f6b2024-07-26 15:25:46 -0700441 switch {
442 case e == `""`, strings.HasSuffix(e, ".jar"):
443 ret[i] = e
Colin Crossc9b4f6b2024-07-26 15:25:46 -0700444 default:
Colin Cross8ff4af32025-02-19 15:17:02 -0800445 ret[i] = filepath.Join("out", "soong", ".intermediates", defaultJavaDir, e, "android_common", "turbine", e+".jar")
Colin Crossc9b4f6b2024-07-26 15:25:46 -0700446 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800447 }
448 return ret
449 }
450
451 bootclasspath := convertModulesToPaths(testcase.bootclasspath)
Colin Cross617b1452019-10-25 15:22:50 -0700452 java8classpath := convertModulesToPaths(testcase.java8classpath)
453 java9classpath := convertModulesToPaths(testcase.java9classpath)
Colin Crossfb6d7812019-01-09 22:17:55 -0800454
Pete Gillinbdf5d712019-10-21 14:29:58 +0100455 bc := ""
456 var bcDeps []string
457 if len(bootclasspath) > 0 {
458 bc = "-bootclasspath " + strings.Join(bootclasspath, ":")
459 if bootclasspath[0] != `""` {
460 bcDeps = bootclasspath
461 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800462 }
463
Colin Cross617b1452019-10-25 15:22:50 -0700464 j8c := ""
465 if len(java8classpath) > 0 {
466 j8c = "-classpath " + strings.Join(java8classpath, ":")
467 }
468
469 j9c := ""
470 if len(java9classpath) > 0 {
471 j9c = "-classpath " + strings.Join(java9classpath, ":")
Colin Crossfb6d7812019-01-09 22:17:55 -0800472 }
Pete Gillinbdf5d712019-10-21 14:29:58 +0100473
Colin Crossfb6d7812019-01-09 22:17:55 -0800474 system := ""
Pete Gillinbdf5d712019-10-21 14:29:58 +0100475 var systemDeps []string
Colin Crossfb6d7812019-01-09 22:17:55 -0800476 if testcase.system == "none" {
477 system = "--system=none"
478 } else if testcase.system != "" {
Colin Cross17dec172020-05-14 18:05:32 -0700479 dir := ""
Paul Duffin12e311d2021-10-28 17:42:16 +0100480 // If the system modules name starts with sdk_ then it is a prebuilt module and so comes
481 // from the prebuilt directory.
482 if strings.HasPrefix(testcase.system, "sdk_") {
Colin Cross17dec172020-05-14 18:05:32 -0700483 dir = "prebuilts/sdk"
Paul Duffin76101fa2021-03-13 09:55:25 +0000484 } else {
485 dir = defaultJavaDir
Colin Cross17dec172020-05-14 18:05:32 -0700486 }
Paul Duffin414ea5e2021-03-22 17:31:52 +0000487 system = "--system=" + filepath.Join("out", "soong", ".intermediates", dir, testcase.system, "android_common", "system")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100488 // The module-relative parts of these paths are hardcoded in system_modules.go:
489 systemDeps = []string{
Paul Duffin414ea5e2021-03-22 17:31:52 +0000490 filepath.Join("out", "soong", ".intermediates", dir, testcase.system, "android_common", "system", "lib", "modules"),
491 filepath.Join("out", "soong", ".intermediates", dir, testcase.system, "android_common", "system", "lib", "jrt-fs.jar"),
492 filepath.Join("out", "soong", ".intermediates", dir, testcase.system, "android_common", "system", "release"),
Pete Gillinbdf5d712019-10-21 14:29:58 +0100493 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800494 }
495
Paul Duffin76101fa2021-03-13 09:55:25 +0000496 checkClasspath := func(t *testing.T, result *android.TestResult, isJava8 bool) {
Colin Cross90607e92025-02-11 14:58:07 -0800497 foo := result.ModuleForTests(t, "foo", variant(result))
Paul Duffina71a67a2021-03-29 00:42:57 +0100498 javac := foo.Rule("javac")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100499 var deps []string
Colin Crossc0806172019-06-14 18:51:47 -0700500
Paul Duffina71a67a2021-03-29 00:42:57 +0100501 aidl := foo.MaybeRule("aidl")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100502 if aidl.Rule != nil {
Paul Duffin414ea5e2021-03-22 17:31:52 +0000503 deps = append(deps, android.PathRelativeToTop(aidl.Output))
Pete Gillinbdf5d712019-10-21 14:29:58 +0100504 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800505
506 got := javac.Args["bootClasspath"]
Pete Gillinbdf5d712019-10-21 14:29:58 +0100507 expected := ""
Colin Cross617b1452019-10-25 15:22:50 -0700508 if isJava8 || testcase.forces8 {
Pete Gillinbdf5d712019-10-21 14:29:58 +0100509 expected = bc
510 deps = append(deps, bcDeps...)
511 } else {
512 expected = system
513 deps = append(deps, systemDeps...)
514 }
515 if got != expected {
516 t.Errorf("bootclasspath expected %q != got %q", expected, got)
Colin Crossfb6d7812019-01-09 22:17:55 -0800517 }
518
Colin Cross617b1452019-10-25 15:22:50 -0700519 if isJava8 || testcase.forces8 {
520 expected = j8c
521 deps = append(deps, java8classpath...)
522 } else {
523 expected = j9c
524 deps = append(deps, java9classpath...)
Colin Crossfb6d7812019-01-09 22:17:55 -0800525 }
Colin Cross617b1452019-10-25 15:22:50 -0700526 got = javac.Args["classpath"]
527 if got != expected {
528 t.Errorf("classpath expected %q != got %q", expected, got)
529 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800530
Paul Duffin414ea5e2021-03-22 17:31:52 +0000531 android.AssertPathsRelativeToTopEquals(t, "implicits", deps, javac.Implicits)
Colin Cross3047fa22019-04-18 10:56:44 -0700532 }
533
Paul Duffin132c3e62021-10-28 18:16:14 +0100534 preparer := android.NullFixturePreparer
535 if alwaysUsePrebuiltSdks {
536 preparer = android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
537 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
538 })
539 }
540
Paul Duffin71ae5942021-03-22 15:36:52 +0000541 fixtureFactory := android.GroupFixturePreparers(
542 prepareForJavaTest,
Paul Duffin171de3e2021-03-13 10:18:26 +0000543 FixtureWithPrebuiltApis(map[string][]string{
544 "29": {},
545 "30": {},
Paul Duffin12e311d2021-10-28 17:42:16 +0100546 "31": {},
547 "32": {},
Paul Duffin171de3e2021-03-13 10:18:26 +0000548 "current": {},
549 }),
Paul Duffin76101fa2021-03-13 09:55:25 +0000550 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
551 if testcase.unbundled {
552 variables.Unbundled_build = proptools.BoolPtr(true)
553 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
554 }
555 }),
556 android.FixtureModifyEnv(func(env map[string]string) {
557 if env["ANDROID_JAVA8_HOME"] == "" {
558 env["ANDROID_JAVA8_HOME"] = "jdk8"
559 }
560 }),
Paul Duffin132c3e62021-10-28 18:16:14 +0100561 preparer,
Paul Duffin76101fa2021-03-13 09:55:25 +0000562 )
563
Pete Gillin1b3370f2019-10-01 13:57:31 +0100564 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillin0c2143e2019-05-02 15:32:11 +0100565 t.Run("Java language level 8", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800566 t.Parallel()
Paul Duffin76101fa2021-03-13 09:55:25 +0000567 result := fixtureFactory.RunTestWithBp(t, bpJava8)
Colin Cross3047fa22019-04-18 10:56:44 -0700568
Paul Duffin76101fa2021-03-13 09:55:25 +0000569 checkClasspath(t, result, true /* isJava8 */)
Colin Cross3047fa22019-04-18 10:56:44 -0700570
571 if testcase.host != android.Host {
Colin Cross90607e92025-02-11 14:58:07 -0800572 aidl := result.ModuleForTests(t, "foo", variant(result)).Rule("aidl")
Colin Cross3047fa22019-04-18 10:56:44 -0700573
Paul Duffin76101fa2021-03-13 09:55:25 +0000574 android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.")
Colin Cross3047fa22019-04-18 10:56:44 -0700575 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800576 })
577
Pete Gillin1b3370f2019-10-01 13:57:31 +0100578 // Test with default javac -source 9 -target 9
Pete Gillin0c2143e2019-05-02 15:32:11 +0100579 t.Run("Java language level 9", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800580 t.Parallel()
Paul Duffin76101fa2021-03-13 09:55:25 +0000581 result := fixtureFactory.RunTestWithBp(t, bp)
Colin Crossfb6d7812019-01-09 22:17:55 -0800582
Paul Duffin76101fa2021-03-13 09:55:25 +0000583 checkClasspath(t, result, false /* isJava8 */)
Pete Gillinbdf5d712019-10-21 14:29:58 +0100584
585 if testcase.host != android.Host {
Colin Cross90607e92025-02-11 14:58:07 -0800586 aidl := result.ModuleForTests(t, "foo", variant(result)).Rule("aidl")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100587
Paul Duffin76101fa2021-03-13 09:55:25 +0000588 android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.")
Colin Crossfb6d7812019-01-09 22:17:55 -0800589 }
590 })
Colin Crossff0daf42019-04-02 16:10:56 -0700591
Paul Duffin76101fa2021-03-13 09:55:25 +0000592 prepareWithPlatformVersionRel := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
593 variables.Platform_sdk_codename = proptools.StringPtr("REL")
594 variables.Platform_sdk_final = proptools.BoolPtr(true)
595 })
596
Pete Gillinbdf5d712019-10-21 14:29:58 +0100597 // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 8 -target 8
598 t.Run("REL + Java language level 8", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800599 t.Parallel()
Paul Duffin79abe572021-03-29 02:16:14 +0100600 result := android.GroupFixturePreparers(
601 fixtureFactory, prepareWithPlatformVersionRel).RunTestWithBp(t, bpJava8)
Colin Crossff0daf42019-04-02 16:10:56 -0700602
Paul Duffin76101fa2021-03-13 09:55:25 +0000603 checkClasspath(t, result, true /* isJava8 */)
Colin Crossff0daf42019-04-02 16:10:56 -0700604 })
Pete Gillinbdf5d712019-10-21 14:29:58 +0100605
Colin Cross6cef4812019-10-17 14:23:50 -0700606 // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 9 -target 9
607 t.Run("REL + Java language level 9", func(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800608 t.Parallel()
Paul Duffin79abe572021-03-29 02:16:14 +0100609 result := android.GroupFixturePreparers(
610 fixtureFactory, prepareWithPlatformVersionRel).RunTestWithBp(t, bp)
Colin Cross6cef4812019-10-17 14:23:50 -0700611
Paul Duffin76101fa2021-03-13 09:55:25 +0000612 checkClasspath(t, result, false /* isJava8 */)
Colin Cross6cef4812019-10-17 14:23:50 -0700613 })
Colin Crossfb6d7812019-01-09 22:17:55 -0800614 })
615 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800616}