blob: 9cabd777204f909a09160613fa973dcd8c6f025e [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"
19 "reflect"
20 "strings"
21 "testing"
22
23 "github.com/google/blueprint/proptools"
Colin Cross60405e52019-04-18 12:31:22 -070024
25 "android/soong/android"
26 "android/soong/java/config"
Colin Crossfb6d7812019-01-09 22:17:55 -080027)
28
Colin Crossfb6d7812019-01-09 22:17:55 -080029func TestClasspath(t *testing.T) {
Colin Cross3047fa22019-04-18 10:56:44 -070030 var classpathTestcases = []struct {
Colin Cross617b1452019-10-25 15:22:50 -070031 name string
32 unbundled bool
33 pdk bool
34 moduleType string
35 host android.OsClass
36 properties string
37
38 // for java 8
39 bootclasspath []string
40 java8classpath []string
41
42 // for java 9
43 system string
44 java9classpath []string
45
46 forces8 bool // if set, javac will always be called with java 8 arguments
47
48 aidl string
Colin Cross3047fa22019-04-18 10:56:44 -070049 }{
50 {
Colin Cross617b1452019-10-25 15:22:50 -070051 name: "default",
52 bootclasspath: config.DefaultBootclasspathLibraries,
53 system: config.DefaultSystemModules,
54 java8classpath: config.DefaultLibraries,
55 java9classpath: config.DefaultLibraries,
56 aidl: "-Iframework/aidl",
Colin Cross3047fa22019-04-18 10:56:44 -070057 },
58 {
Colin Cross617b1452019-10-25 15:22:50 -070059 name: `sdk_version:"core_platform"`,
60 properties: `sdk_version:"core_platform"`,
61 bootclasspath: config.DefaultBootclasspathLibraries,
62 system: config.DefaultSystemModules,
63 java8classpath: []string{},
64 aidl: "",
Paul Duffin50c217c2019-06-12 13:25:22 +010065 },
66 {
Colin Cross617b1452019-10-25 15:22:50 -070067 name: "blank sdk version",
68 properties: `sdk_version: "",`,
69 bootclasspath: config.DefaultBootclasspathLibraries,
70 system: config.DefaultSystemModules,
71 java8classpath: config.DefaultLibraries,
72 java9classpath: config.DefaultLibraries,
73 aidl: "-Iframework/aidl",
Colin Cross3047fa22019-04-18 10:56:44 -070074 },
75 {
76
Colin Cross74362a42019-10-28 08:05:02 -070077 name: "sdk v29",
78 properties: `sdk_version: "29",`,
Colin Cross617b1452019-10-25 15:22:50 -070079 bootclasspath: []string{`""`},
80 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -070081 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
82 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -070083 },
84 {
85
Colin Cross6cef4812019-10-17 14:23:50 -070086 name: "current",
87 properties: `sdk_version: "current",`,
88 bootclasspath: []string{"android_stubs_current", "core-lambda-stubs"},
89 system: "core-current-stubs-system-modules",
90 java9classpath: []string{"android_stubs_current"},
91 aidl: "-p" + buildDir + "/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -070092 },
93 {
94
Colin Cross6cef4812019-10-17 14:23:50 -070095 name: "system_current",
96 properties: `sdk_version: "system_current",`,
97 bootclasspath: []string{"android_system_stubs_current", "core-lambda-stubs"},
98 system: "core-current-stubs-system-modules",
99 java9classpath: []string{"android_system_stubs_current"},
100 aidl: "-p" + buildDir + "/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700101 },
102 {
103
Colin Cross74362a42019-10-28 08:05:02 -0700104 name: "system_29",
105 properties: `sdk_version: "system_29",`,
Colin Cross617b1452019-10-25 15:22:50 -0700106 bootclasspath: []string{`""`},
107 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700108 java8classpath: []string{"prebuilts/sdk/29/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
109 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700110 },
111 {
112
Colin Cross6cef4812019-10-17 14:23:50 -0700113 name: "test_current",
114 properties: `sdk_version: "test_current",`,
115 bootclasspath: []string{"android_test_stubs_current", "core-lambda-stubs"},
116 system: "core-current-stubs-system-modules",
117 java9classpath: []string{"android_test_stubs_current"},
118 aidl: "-p" + buildDir + "/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700119 },
120 {
121
Colin Cross6cef4812019-10-17 14:23:50 -0700122 name: "core_current",
123 properties: `sdk_version: "core_current",`,
124 bootclasspath: []string{"core.current.stubs", "core-lambda-stubs"},
125 system: "core-current-stubs-system-modules",
126 java9classpath: []string{"core.current.stubs"},
Colin Cross3047fa22019-04-18 10:56:44 -0700127 },
128 {
129
Colin Cross617b1452019-10-25 15:22:50 -0700130 name: "nostdlib",
131 properties: `sdk_version: "none", system_modules: "none"`,
132 system: "none",
133 bootclasspath: []string{`""`},
134 java8classpath: []string{},
Paul Duffin52d398a2019-06-11 12:31:14 +0100135 },
136 {
137
Colin Cross617b1452019-10-25 15:22:50 -0700138 name: "nostdlib system_modules",
139 properties: `sdk_version: "none", system_modules: "core-platform-api-stubs-system-modules"`,
140 system: "core-platform-api-stubs-system-modules",
141 bootclasspath: []string{"core-platform-api-stubs-system-modules-lib"},
142 java8classpath: []string{},
Paul Duffin52d398a2019-06-11 12:31:14 +0100143 },
144 {
145
Colin Cross617b1452019-10-25 15:22:50 -0700146 name: "host default",
147 moduleType: "java_library_host",
148 properties: ``,
149 host: android.Host,
150 bootclasspath: []string{"jdk8/jre/lib/jce.jar", "jdk8/jre/lib/rt.jar"},
151 java8classpath: []string{},
Colin Cross3047fa22019-04-18 10:56:44 -0700152 },
153 {
Colin Cross3047fa22019-04-18 10:56:44 -0700154
Colin Cross617b1452019-10-25 15:22:50 -0700155 name: "host supported default",
156 host: android.Host,
157 properties: `host_supported: true,`,
158 java8classpath: []string{},
159 bootclasspath: []string{"jdk8/jre/lib/jce.jar", "jdk8/jre/lib/rt.jar"},
Colin Cross3047fa22019-04-18 10:56:44 -0700160 },
161 {
Colin Cross617b1452019-10-25 15:22:50 -0700162 name: "host supported nostdlib",
163 host: android.Host,
164 properties: `host_supported: true, sdk_version: "none", system_modules: "none"`,
165 java8classpath: []string{},
Paul Duffin52d398a2019-06-11 12:31:14 +0100166 },
167 {
Colin Cross3047fa22019-04-18 10:56:44 -0700168
Colin Cross74362a42019-10-28 08:05:02 -0700169 name: "unbundled sdk v29",
Colin Cross617b1452019-10-25 15:22:50 -0700170 unbundled: true,
Colin Cross74362a42019-10-28 08:05:02 -0700171 properties: `sdk_version: "29",`,
Colin Cross617b1452019-10-25 15:22:50 -0700172 bootclasspath: []string{`""`},
173 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700174 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
175 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700176 },
177 {
178
Colin Cross617b1452019-10-25 15:22:50 -0700179 name: "unbundled current",
180 unbundled: true,
181 properties: `sdk_version: "current",`,
182 bootclasspath: []string{`""`},
183 forces8: true,
184 java8classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
185 aidl: "-pprebuilts/sdk/current/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700186 },
187
188 {
Colin Cross617b1452019-10-25 15:22:50 -0700189 name: "pdk default",
190 pdk: true,
191 bootclasspath: []string{`""`},
192 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700193 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
194 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700195 },
196 {
Colin Cross617b1452019-10-25 15:22:50 -0700197 name: "pdk current",
198 pdk: true,
199 properties: `sdk_version: "current",`,
200 bootclasspath: []string{`""`},
201 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700202 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
203 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700204 },
205 {
Colin Cross74362a42019-10-28 08:05:02 -0700206 name: "pdk 29",
Colin Cross617b1452019-10-25 15:22:50 -0700207 pdk: true,
Colin Cross74362a42019-10-28 08:05:02 -0700208 properties: `sdk_version: "29",`,
Colin Cross617b1452019-10-25 15:22:50 -0700209 bootclasspath: []string{`""`},
210 forces8: true,
Colin Cross74362a42019-10-28 08:05:02 -0700211 java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
212 aidl: "-pprebuilts/sdk/29/public/framework.aidl",
Colin Cross3047fa22019-04-18 10:56:44 -0700213 },
214 }
215
Colin Crossfb6d7812019-01-09 22:17:55 -0800216 for _, testcase := range classpathTestcases {
217 t.Run(testcase.name, func(t *testing.T) {
218 moduleType := "java_library"
219 if testcase.moduleType != "" {
220 moduleType = testcase.moduleType
221 }
222
Pete Gillinbdf5d712019-10-21 14:29:58 +0100223 props := `
Colin Crossfb6d7812019-01-09 22:17:55 -0800224 name: "foo",
225 srcs: ["a.java"],
Colin Cross3047fa22019-04-18 10:56:44 -0700226 target: {
227 android: {
228 srcs: ["bar-doc/IFoo.aidl"],
229 },
230 },
Pete Gillinbdf5d712019-10-21 14:29:58 +0100231 `
232 bp := moduleType + " {" + props + testcase.properties + `
233 }`
234 bpJava8 := moduleType + " {" + props + `java_version: "1.8",
Colin Crossfb6d7812019-01-09 22:17:55 -0800235 ` + testcase.properties + `
236 }`
237
238 variant := "android_common"
239 if testcase.host == android.Host {
240 variant = android.BuildOs.String() + "_common"
241 }
242
243 convertModulesToPaths := func(cp []string) []string {
244 ret := make([]string, len(cp))
245 for i, e := range cp {
246 ret[i] = moduleToPath(e)
247 }
248 return ret
249 }
250
251 bootclasspath := convertModulesToPaths(testcase.bootclasspath)
Colin Cross617b1452019-10-25 15:22:50 -0700252 java8classpath := convertModulesToPaths(testcase.java8classpath)
253 java9classpath := convertModulesToPaths(testcase.java9classpath)
Colin Crossfb6d7812019-01-09 22:17:55 -0800254
Pete Gillinbdf5d712019-10-21 14:29:58 +0100255 bc := ""
256 var bcDeps []string
257 if len(bootclasspath) > 0 {
258 bc = "-bootclasspath " + strings.Join(bootclasspath, ":")
259 if bootclasspath[0] != `""` {
260 bcDeps = bootclasspath
261 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800262 }
263
Colin Cross617b1452019-10-25 15:22:50 -0700264 j8c := ""
265 if len(java8classpath) > 0 {
266 j8c = "-classpath " + strings.Join(java8classpath, ":")
267 }
268
269 j9c := ""
270 if len(java9classpath) > 0 {
271 j9c = "-classpath " + strings.Join(java9classpath, ":")
Colin Crossfb6d7812019-01-09 22:17:55 -0800272 }
Pete Gillinbdf5d712019-10-21 14:29:58 +0100273
Colin Crossfb6d7812019-01-09 22:17:55 -0800274 system := ""
Pete Gillinbdf5d712019-10-21 14:29:58 +0100275 var systemDeps []string
Colin Crossfb6d7812019-01-09 22:17:55 -0800276 if testcase.system == "none" {
277 system = "--system=none"
278 } else if testcase.system != "" {
Dan Willemsenff60a732019-06-13 16:52:01 +0000279 system = "--system=" + filepath.Join(buildDir, ".intermediates", testcase.system, "android_common", "system")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100280 // The module-relative parts of these paths are hardcoded in system_modules.go:
281 systemDeps = []string{
282 filepath.Join(buildDir, ".intermediates", testcase.system, "android_common", "system", "lib", "modules"),
283 filepath.Join(buildDir, ".intermediates", testcase.system, "android_common", "system", "lib", "jrt-fs.jar"),
284 filepath.Join(buildDir, ".intermediates", testcase.system, "android_common", "system", "release"),
285 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800286 }
287
Pete Gillinbdf5d712019-10-21 14:29:58 +0100288 checkClasspath := func(t *testing.T, ctx *android.TestContext, isJava8 bool) {
Colin Crossc0806172019-06-14 18:51:47 -0700289 foo := ctx.ModuleForTests("foo", variant)
290 javac := foo.Rule("javac")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100291 var deps []string
Colin Crossc0806172019-06-14 18:51:47 -0700292
293 aidl := foo.MaybeRule("aidl")
Pete Gillinbdf5d712019-10-21 14:29:58 +0100294 if aidl.Rule != nil {
295 deps = append(deps, aidl.Output.String())
296 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800297
298 got := javac.Args["bootClasspath"]
Pete Gillinbdf5d712019-10-21 14:29:58 +0100299 expected := ""
Colin Cross617b1452019-10-25 15:22:50 -0700300 if isJava8 || testcase.forces8 {
Pete Gillinbdf5d712019-10-21 14:29:58 +0100301 expected = bc
302 deps = append(deps, bcDeps...)
303 } else {
304 expected = system
305 deps = append(deps, systemDeps...)
306 }
307 if got != expected {
308 t.Errorf("bootclasspath expected %q != got %q", expected, got)
Colin Crossfb6d7812019-01-09 22:17:55 -0800309 }
310
Colin Cross617b1452019-10-25 15:22:50 -0700311 if isJava8 || testcase.forces8 {
312 expected = j8c
313 deps = append(deps, java8classpath...)
314 } else {
315 expected = j9c
316 deps = append(deps, java9classpath...)
Colin Crossfb6d7812019-01-09 22:17:55 -0800317 }
Colin Cross617b1452019-10-25 15:22:50 -0700318 got = javac.Args["classpath"]
319 if got != expected {
320 t.Errorf("classpath expected %q != got %q", expected, got)
321 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800322
323 if !reflect.DeepEqual(javac.Implicits.Strings(), deps) {
324 t.Errorf("implicits expected %q != got %q", deps, javac.Implicits.Strings())
325 }
Colin Cross3047fa22019-04-18 10:56:44 -0700326 }
327
Pete Gillin1b3370f2019-10-01 13:57:31 +0100328 // Test with legacy javac -source 1.8 -target 1.8
Pete Gillin0c2143e2019-05-02 15:32:11 +0100329 t.Run("Java language level 8", func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800330 config := testConfig(nil, bpJava8, nil)
Colin Cross3047fa22019-04-18 10:56:44 -0700331 if testcase.unbundled {
332 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
333 }
334 if testcase.pdk {
335 config.TestProductVariables.Pdk = proptools.BoolPtr(true)
336 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800337 ctx := testContext()
Colin Cross3047fa22019-04-18 10:56:44 -0700338 run(t, ctx, config)
339
Pete Gillinbdf5d712019-10-21 14:29:58 +0100340 checkClasspath(t, ctx, true /* isJava8 */)
Colin Cross3047fa22019-04-18 10:56:44 -0700341
342 if testcase.host != android.Host {
343 aidl := ctx.ModuleForTests("foo", variant).Rule("aidl")
344
Colin Crossc0806172019-06-14 18:51:47 -0700345 if g, w := aidl.RuleParams.Command, testcase.aidl+" -I."; !strings.Contains(g, w) {
346 t.Errorf("want aidl command to contain %q, got %q", w, g)
Colin Cross3047fa22019-04-18 10:56:44 -0700347 }
348 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800349 })
350
Pete Gillin1b3370f2019-10-01 13:57:31 +0100351 // Test with default javac -source 9 -target 9
Pete Gillin0c2143e2019-05-02 15:32:11 +0100352 t.Run("Java language level 9", func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800353 config := testConfig(nil, bp, nil)
Colin Crossfb6d7812019-01-09 22:17:55 -0800354 if testcase.unbundled {
355 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
356 }
Colin Cross98fd5742019-01-09 23:04:25 -0800357 if testcase.pdk {
358 config.TestProductVariables.Pdk = proptools.BoolPtr(true)
359 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800360 ctx := testContext()
Colin Crossfb6d7812019-01-09 22:17:55 -0800361 run(t, ctx, config)
362
Pete Gillinbdf5d712019-10-21 14:29:58 +0100363 checkClasspath(t, ctx, false /* isJava8 */)
364
365 if testcase.host != android.Host {
366 aidl := ctx.ModuleForTests("foo", variant).Rule("aidl")
367
368 if g, w := aidl.RuleParams.Command, testcase.aidl+" -I."; !strings.Contains(g, w) {
369 t.Errorf("want aidl command to contain %q, got %q", w, g)
370 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800371 }
372 })
Colin Crossff0daf42019-04-02 16:10:56 -0700373
Pete Gillinbdf5d712019-10-21 14:29:58 +0100374 // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 8 -target 8
375 t.Run("REL + Java language level 8", func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800376 config := testConfig(nil, bpJava8, nil)
Colin Crossff0daf42019-04-02 16:10:56 -0700377 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL")
378 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true)
379
380 if testcase.unbundled {
381 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
382 }
383 if testcase.pdk {
384 config.TestProductVariables.Pdk = proptools.BoolPtr(true)
385 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800386 ctx := testContext()
Colin Crossff0daf42019-04-02 16:10:56 -0700387 run(t, ctx, config)
388
Pete Gillinbdf5d712019-10-21 14:29:58 +0100389 checkClasspath(t, ctx, true /* isJava8 */)
Colin Crossff0daf42019-04-02 16:10:56 -0700390 })
Pete Gillinbdf5d712019-10-21 14:29:58 +0100391
Colin Cross6cef4812019-10-17 14:23:50 -0700392 // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 9 -target 9
393 t.Run("REL + Java language level 9", func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800394 config := testConfig(nil, bp, nil)
Colin Cross6cef4812019-10-17 14:23:50 -0700395 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL")
396 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true)
397
398 if testcase.unbundled {
399 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
400 }
401 if testcase.pdk {
402 config.TestProductVariables.Pdk = proptools.BoolPtr(true)
403 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800404 ctx := testContext()
Colin Cross6cef4812019-10-17 14:23:50 -0700405 run(t, ctx, config)
406
407 checkClasspath(t, ctx, false /* isJava8 */)
408 })
Colin Crossfb6d7812019-01-09 22:17:55 -0800409 })
410 }
Colin Crossfb6d7812019-01-09 22:17:55 -0800411}