• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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 (
18	"path/filepath"
19	"strings"
20	"testing"
21
22	"github.com/google/blueprint/proptools"
23
24	"android/soong/android"
25	"android/soong/java/config"
26)
27
28type 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
46
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
53}
54
55func TestClasspath(t *testing.T) {
56	t.Parallel()
57	const frameworkAidl = "-I" + defaultJavaDir + "/framework/aidl"
58	var classpathTestcases = []classpathTestCase{
59		{
60			name:           "default",
61			bootclasspath:  config.StableCorePlatformBootclasspathLibraries,
62			system:         config.StableCorePlatformSystemModules,
63			java8classpath: config.FrameworkLibraries,
64			java9classpath: config.FrameworkLibraries,
65			aidl:           frameworkAidl,
66		},
67		{
68			name:           `sdk_version:"core_platform"`,
69			properties:     `sdk_version:"core_platform"`,
70			bootclasspath:  config.StableCorePlatformBootclasspathLibraries,
71			system:         config.StableCorePlatformSystemModules,
72			java8classpath: []string{},
73			aidl:           "",
74		},
75		{
76			name:           "blank sdk version",
77			properties:     `sdk_version: "",`,
78			bootclasspath:  config.StableCorePlatformBootclasspathLibraries,
79			system:         config.StableCorePlatformSystemModules,
80			java8classpath: config.FrameworkLibraries,
81			java9classpath: config.FrameworkLibraries,
82			aidl:           frameworkAidl,
83		},
84		{
85
86			name:           "sdk v29",
87			properties:     `sdk_version: "29",`,
88			bootclasspath:  []string{`""`},
89			forces8:        true,
90			java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
91			aidl:           "-pprebuilts/sdk/29/public/framework.aidl",
92		},
93		{
94
95			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		{
104			// Test case only applies when Always_use_prebuilt_sdks=false (the default).
105			forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
106
107			name:           "current",
108			properties:     `sdk_version: "current",`,
109			bootclasspath:  []string{"android_stubs_current", "core-lambda-stubs"},
110			system:         "core-public-stubs-system-modules",
111			java9classpath: []string{"android_stubs_current"},
112			aidl:           "-pout/soong/framework.aidl",
113		},
114		{
115			// 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),
129
130			name:           "system_current",
131			properties:     `sdk_version: "system_current",`,
132			bootclasspath:  []string{"android_system_stubs_current", "core-lambda-stubs"},
133			system:         "core-public-stubs-system-modules",
134			java9classpath: []string{"android_system_stubs_current"},
135			aidl:           "-pout/soong/framework.aidl",
136		},
137		{
138			// Test case only applies when Always_use_prebuilt_sdks=true.
139			forAlwaysUsePrebuiltSdks: proptools.BoolPtr(true),
140
141			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		{
150			name:           "system_29",
151			properties:     `sdk_version: "system_29",`,
152			bootclasspath:  []string{`""`},
153			forces8:        true,
154			java8classpath: []string{"prebuilts/sdk/29/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
155			aidl:           "-pprebuilts/sdk/29/public/framework.aidl",
156		},
157		{
158			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		{
167			// Test case only applies when Always_use_prebuilt_sdks=false (the default).
168			forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
169
170			name:           "test_current",
171			properties:     `sdk_version: "test_current",`,
172			bootclasspath:  []string{"android_test_stubs_current", "core-lambda-stubs"},
173			system:         "core-public-stubs-system-modules",
174			java9classpath: []string{"android_test_stubs_current"},
175			aidl:           "-pout/soong/framework.aidl",
176		},
177		{
178			// 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		{
190			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		{
199			// Test case only applies when Always_use_prebuilt_sdks=false (the default).
200			forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
201
202			name:          "core_current",
203			properties:    `sdk_version: "core_current",`,
204			bootclasspath: []string{"core.current.stubs", "core-lambda-stubs"},
205			system:        "core-public-stubs-system-modules",
206		},
207		{
208			// 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		{
220
221			name:           "nostdlib",
222			properties:     `sdk_version: "none", system_modules: "none"`,
223			system:         "none",
224			bootclasspath:  []string{`""`},
225			java8classpath: []string{},
226		},
227		{
228
229			name:           "nostdlib system_modules",
230			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"},
233			java8classpath: []string{},
234		},
235		{
236
237			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{},
243		},
244		{
245
246			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"},
251		},
252		{
253			name:           "host supported nostdlib",
254			host:           android.Host,
255			properties:     `host_supported: true, sdk_version: "none", system_modules: "none"`,
256			java8classpath: []string{},
257		},
258		{
259
260			name:           "unbundled sdk v29",
261			unbundled:      true,
262			properties:     `sdk_version: "29",`,
263			bootclasspath:  []string{`""`},
264			forces8:        true,
265			java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
266			aidl:           "-pprebuilts/sdk/29/public/framework.aidl",
267		},
268		{
269
270			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
281			name:           "unbundled current",
282			unbundled:      true,
283			properties:     `sdk_version: "current",`,
284			bootclasspath:  []string{`""`},
285			system:         "sdk_public_current_system_modules",
286			java8classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
287			java9classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
288			aidl:           "-pprebuilts/sdk/current/public/framework.aidl",
289		},
290		{
291			// Test case only applies when Always_use_prebuilt_sdks=false (the default).
292			forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
293
294			name:           "module_current",
295			properties:     `sdk_version: "module_current",`,
296			bootclasspath:  []string{"android_module_lib_stubs_current", "core-lambda-stubs"},
297			system:         "core-module-lib-stubs-system-modules",
298			java9classpath: []string{"android_module_lib_stubs_current"},
299			aidl:           "-pout/soong/framework_non_updatable.aidl",
300		},
301		{
302			// 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{`""`},
308			system:         "sdk_module-lib_current_system_modules",
309			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		{
314			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{`""`},
335			system:         "sdk_module-lib_32_system_modules",
336			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		{
341			// Test case only applies when Always_use_prebuilt_sdks=false (the default).
342			forAlwaysUsePrebuiltSdks: proptools.BoolPtr(false),
343
344			name:           "system_server_current",
345			properties:     `sdk_version: "system_server_current",`,
346			bootclasspath:  []string{"android_system_server_stubs_current", "core-lambda-stubs"},
347			system:         "core-module-lib-stubs-system-modules",
348			java9classpath: []string{"android_system_server_stubs_current"},
349			aidl:           "-pout/soong/framework.aidl",
350		},
351		{
352			// 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{`""`},
358			system:         "sdk_module-lib_current_system_modules",
359			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		{
364			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{`""`},
385			system:         "sdk_module-lib_32_system_modules",
386			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		},
390	}
391
392	t.Run("basic", func(t *testing.T) {
393		t.Parallel()
394		testClasspathTestCases(t, classpathTestcases, false)
395	})
396
397	t.Run("Always_use_prebuilt_sdks=true", func(t *testing.T) {
398		t.Parallel()
399		testClasspathTestCases(t, classpathTestcases, true)
400	})
401}
402
403func testClasspathTestCases(t *testing.T, classpathTestcases []classpathTestCase, alwaysUsePrebuiltSdks bool) {
404	for _, testcase := range classpathTestcases {
405		if testcase.forAlwaysUsePrebuiltSdks != nil && *testcase.forAlwaysUsePrebuiltSdks != alwaysUsePrebuiltSdks {
406			continue
407		}
408
409		t.Run(testcase.name, func(t *testing.T) {
410			t.Parallel()
411			moduleType := "java_library"
412			if testcase.moduleType != "" {
413				moduleType = testcase.moduleType
414			}
415
416			props := `
417				name: "foo",
418				srcs: ["a.java"],
419				target: {
420					android: {
421						srcs: ["bar-doc/IFoo.aidl"],
422					},
423				},
424				`
425			bp := moduleType + " {" + props + testcase.properties + `
426			}`
427			bpJava8 := moduleType + " {" + props + `java_version: "1.8",
428				` + testcase.properties + `
429			}`
430
431			variant := func(result *android.TestResult) string {
432				if testcase.host == android.Host {
433					return result.Config.BuildOS.String() + "_common"
434				}
435				return "android_common"
436			}
437
438			convertModulesToPaths := func(cp []string) []string {
439				ret := make([]string, len(cp))
440				for i, e := range cp {
441					switch {
442					case e == `""`, strings.HasSuffix(e, ".jar"):
443						ret[i] = e
444					default:
445						ret[i] = filepath.Join("out", "soong", ".intermediates", defaultJavaDir, e, "android_common", "turbine", e+".jar")
446					}
447				}
448				return ret
449			}
450
451			bootclasspath := convertModulesToPaths(testcase.bootclasspath)
452			java8classpath := convertModulesToPaths(testcase.java8classpath)
453			java9classpath := convertModulesToPaths(testcase.java9classpath)
454
455			bc := ""
456			var bcDeps []string
457			if len(bootclasspath) > 0 {
458				bc = "-bootclasspath " + strings.Join(bootclasspath, ":")
459				if bootclasspath[0] != `""` {
460					bcDeps = bootclasspath
461				}
462			}
463
464			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, ":")
472			}
473
474			system := ""
475			var systemDeps []string
476			if testcase.system == "none" {
477				system = "--system=none"
478			} else if testcase.system != "" {
479				dir := ""
480				// 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_") {
483					dir = "prebuilts/sdk"
484				} else {
485					dir = defaultJavaDir
486				}
487				system = "--system=" + filepath.Join("out", "soong", ".intermediates", dir, testcase.system, "android_common", "system")
488				// The module-relative parts of these paths are hardcoded in system_modules.go:
489				systemDeps = []string{
490					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"),
493				}
494			}
495
496			checkClasspath := func(t *testing.T, result *android.TestResult, isJava8 bool) {
497				foo := result.ModuleForTests(t, "foo", variant(result))
498				javac := foo.Rule("javac")
499				var deps []string
500
501				aidl := foo.MaybeRule("aidl")
502				if aidl.Rule != nil {
503					deps = append(deps, android.PathRelativeToTop(aidl.Output))
504				}
505
506				got := javac.Args["bootClasspath"]
507				expected := ""
508				if isJava8 || testcase.forces8 {
509					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)
517				}
518
519				if isJava8 || testcase.forces8 {
520					expected = j8c
521					deps = append(deps, java8classpath...)
522				} else {
523					expected = j9c
524					deps = append(deps, java9classpath...)
525				}
526				got = javac.Args["classpath"]
527				if got != expected {
528					t.Errorf("classpath expected %q != got %q", expected, got)
529				}
530
531				android.AssertPathsRelativeToTopEquals(t, "implicits", deps, javac.Implicits)
532			}
533
534			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
541			fixtureFactory := android.GroupFixturePreparers(
542				prepareForJavaTest,
543				FixtureWithPrebuiltApis(map[string][]string{
544					"29":      {},
545					"30":      {},
546					"31":      {},
547					"32":      {},
548					"current": {},
549				}),
550				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				}),
561				preparer,
562			)
563
564			// Test with legacy javac -source 1.8 -target 1.8
565			t.Run("Java language level 8", func(t *testing.T) {
566				t.Parallel()
567				result := fixtureFactory.RunTestWithBp(t, bpJava8)
568
569				checkClasspath(t, result, true /* isJava8 */)
570
571				if testcase.host != android.Host {
572					aidl := result.ModuleForTests(t, "foo", variant(result)).Rule("aidl")
573
574					android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.")
575				}
576			})
577
578			// Test with default javac -source 9 -target 9
579			t.Run("Java language level 9", func(t *testing.T) {
580				t.Parallel()
581				result := fixtureFactory.RunTestWithBp(t, bp)
582
583				checkClasspath(t, result, false /* isJava8 */)
584
585				if testcase.host != android.Host {
586					aidl := result.ModuleForTests(t, "foo", variant(result)).Rule("aidl")
587
588					android.AssertStringDoesContain(t, "aidl command", aidl.RuleParams.Command, testcase.aidl+" -I.")
589				}
590			})
591
592			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
597			// Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 8 -target 8
598			t.Run("REL + Java language level 8", func(t *testing.T) {
599				t.Parallel()
600				result := android.GroupFixturePreparers(
601					fixtureFactory, prepareWithPlatformVersionRel).RunTestWithBp(t, bpJava8)
602
603				checkClasspath(t, result, true /* isJava8 */)
604			})
605
606			// Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 9 -target 9
607			t.Run("REL + Java language level 9", func(t *testing.T) {
608				t.Parallel()
609				result := android.GroupFixturePreparers(
610					fixtureFactory, prepareWithPlatformVersionRel).RunTestWithBp(t, bp)
611
612				checkClasspath(t, result, false /* isJava8 */)
613			})
614		})
615	}
616}
617