123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- // Copyright 2019 Google Inc. All rights reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package java
- import (
- "path/filepath"
- "reflect"
- "strings"
- "testing"
- "github.com/google/blueprint/proptools"
- "android/soong/android"
- "android/soong/java/config"
- )
- func TestClasspath(t *testing.T) {
- var classpathTestcases = []struct {
- name string
- unbundled bool
- moduleType string
- host android.OsClass
- properties string
- // for java 8
- bootclasspath []string
- java8classpath []string
- // for java 9
- system string
- java9classpath []string
- forces8 bool // if set, javac will always be called with java 8 arguments
- aidl string
- }{
- {
- name: "default",
- bootclasspath: config.StableCorePlatformBootclasspathLibraries,
- system: config.StableCorePlatformSystemModules,
- java8classpath: config.FrameworkLibraries,
- java9classpath: config.FrameworkLibraries,
- aidl: "-Iframework/aidl",
- },
- {
- name: `sdk_version:"core_platform"`,
- properties: `sdk_version:"core_platform"`,
- bootclasspath: config.StableCorePlatformBootclasspathLibraries,
- system: config.StableCorePlatformSystemModules,
- java8classpath: []string{},
- aidl: "",
- },
- {
- name: "blank sdk version",
- properties: `sdk_version: "",`,
- bootclasspath: config.StableCorePlatformBootclasspathLibraries,
- system: config.StableCorePlatformSystemModules,
- java8classpath: config.FrameworkLibraries,
- java9classpath: config.FrameworkLibraries,
- aidl: "-Iframework/aidl",
- },
- {
- name: "sdk v29",
- properties: `sdk_version: "29",`,
- bootclasspath: []string{`""`},
- forces8: true,
- java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/29/public/framework.aidl",
- },
- {
- name: "sdk v30",
- properties: `sdk_version: "30",`,
- bootclasspath: []string{`""`},
- system: "sdk_public_30_system_modules",
- java8classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- java9classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/30/public/framework.aidl",
- },
- {
- name: "current",
- properties: `sdk_version: "current",`,
- bootclasspath: []string{"android_stubs_current", "core-lambda-stubs"},
- system: "core-current-stubs-system-modules",
- java9classpath: []string{"android_stubs_current"},
- aidl: "-p" + buildDir + "/framework.aidl",
- },
- {
- name: "system_current",
- properties: `sdk_version: "system_current",`,
- bootclasspath: []string{"android_system_stubs_current", "core-lambda-stubs"},
- system: "core-current-stubs-system-modules",
- java9classpath: []string{"android_system_stubs_current"},
- aidl: "-p" + buildDir + "/framework.aidl",
- },
- {
- name: "system_29",
- properties: `sdk_version: "system_29",`,
- bootclasspath: []string{`""`},
- forces8: true,
- java8classpath: []string{"prebuilts/sdk/29/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/29/public/framework.aidl",
- },
- {
- name: "system_30",
- properties: `sdk_version: "system_30",`,
- bootclasspath: []string{`""`},
- system: "sdk_public_30_system_modules",
- java8classpath: []string{"prebuilts/sdk/30/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- java9classpath: []string{"prebuilts/sdk/30/system/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/30/public/framework.aidl",
- },
- {
- name: "test_current",
- properties: `sdk_version: "test_current",`,
- bootclasspath: []string{"android_test_stubs_current", "core-lambda-stubs"},
- system: "core-current-stubs-system-modules",
- java9classpath: []string{"android_test_stubs_current"},
- aidl: "-p" + buildDir + "/framework.aidl",
- },
- {
- name: "core_current",
- properties: `sdk_version: "core_current",`,
- bootclasspath: []string{"core.current.stubs", "core-lambda-stubs"},
- system: "core-current-stubs-system-modules",
- },
- {
- name: "nostdlib",
- properties: `sdk_version: "none", system_modules: "none"`,
- system: "none",
- bootclasspath: []string{`""`},
- java8classpath: []string{},
- },
- {
- name: "nostdlib system_modules",
- properties: `sdk_version: "none", system_modules: "stable-core-platform-api-stubs-system-modules"`,
- system: "stable-core-platform-api-stubs-system-modules",
- bootclasspath: []string{"stable-core-platform-api-stubs-system-modules-lib"},
- java8classpath: []string{},
- },
- {
- name: "host default",
- moduleType: "java_library_host",
- properties: ``,
- host: android.Host,
- bootclasspath: []string{"jdk8/jre/lib/jce.jar", "jdk8/jre/lib/rt.jar"},
- java8classpath: []string{},
- },
- {
- name: "host supported default",
- host: android.Host,
- properties: `host_supported: true,`,
- java8classpath: []string{},
- bootclasspath: []string{"jdk8/jre/lib/jce.jar", "jdk8/jre/lib/rt.jar"},
- },
- {
- name: "host supported nostdlib",
- host: android.Host,
- properties: `host_supported: true, sdk_version: "none", system_modules: "none"`,
- java8classpath: []string{},
- },
- {
- name: "unbundled sdk v29",
- unbundled: true,
- properties: `sdk_version: "29",`,
- bootclasspath: []string{`""`},
- forces8: true,
- java8classpath: []string{"prebuilts/sdk/29/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/29/public/framework.aidl",
- },
- {
- name: "unbundled sdk v30",
- unbundled: true,
- properties: `sdk_version: "30",`,
- bootclasspath: []string{`""`},
- system: "sdk_public_30_system_modules",
- java8classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- java9classpath: []string{"prebuilts/sdk/30/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/30/public/framework.aidl",
- },
- {
- name: "unbundled current",
- unbundled: true,
- properties: `sdk_version: "current",`,
- bootclasspath: []string{`""`},
- system: "sdk_public_current_system_modules",
- java8classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- java9classpath: []string{"prebuilts/sdk/current/public/android.jar", "prebuilts/sdk/tools/core-lambda-stubs.jar"},
- aidl: "-pprebuilts/sdk/current/public/framework.aidl",
- },
- {
- name: "module_current",
- properties: `sdk_version: "module_current",`,
- bootclasspath: []string{"android_module_lib_stubs_current", "core-lambda-stubs"},
- system: "core-current-stubs-system-modules",
- java9classpath: []string{"android_module_lib_stubs_current"},
- aidl: "-p" + buildDir + "/framework_non_updatable.aidl",
- },
- {
- name: "system_server_current",
- properties: `sdk_version: "system_server_current",`,
- bootclasspath: []string{"android_system_server_stubs_current", "core-lambda-stubs"},
- system: "core-current-stubs-system-modules",
- java9classpath: []string{"android_system_server_stubs_current"},
- aidl: "-p" + buildDir + "/framework.aidl",
- },
- }
- for _, testcase := range classpathTestcases {
- t.Run(testcase.name, func(t *testing.T) {
- moduleType := "java_library"
- if testcase.moduleType != "" {
- moduleType = testcase.moduleType
- }
- props := `
- name: "foo",
- srcs: ["a.java"],
- target: {
- android: {
- srcs: ["bar-doc/IFoo.aidl"],
- },
- },
- `
- bp := moduleType + " {" + props + testcase.properties + `
- }`
- bpJava8 := moduleType + " {" + props + `java_version: "1.8",
- ` + testcase.properties + `
- }`
- variant := "android_common"
- if testcase.host == android.Host {
- variant = android.BuildOs.String() + "_common"
- }
- convertModulesToPaths := func(cp []string) []string {
- ret := make([]string, len(cp))
- for i, e := range cp {
- ret[i] = moduleToPath(e)
- }
- return ret
- }
- bootclasspath := convertModulesToPaths(testcase.bootclasspath)
- java8classpath := convertModulesToPaths(testcase.java8classpath)
- java9classpath := convertModulesToPaths(testcase.java9classpath)
- bc := ""
- var bcDeps []string
- if len(bootclasspath) > 0 {
- bc = "-bootclasspath " + strings.Join(bootclasspath, ":")
- if bootclasspath[0] != `""` {
- bcDeps = bootclasspath
- }
- }
- j8c := ""
- if len(java8classpath) > 0 {
- j8c = "-classpath " + strings.Join(java8classpath, ":")
- }
- j9c := ""
- if len(java9classpath) > 0 {
- j9c = "-classpath " + strings.Join(java9classpath, ":")
- }
- system := ""
- var systemDeps []string
- if testcase.system == "none" {
- system = "--system=none"
- } else if testcase.system != "" {
- dir := ""
- if strings.HasPrefix(testcase.system, "sdk_public_") {
- dir = "prebuilts/sdk"
- }
- system = "--system=" + filepath.Join(buildDir, ".intermediates", dir, testcase.system, "android_common", "system")
- // The module-relative parts of these paths are hardcoded in system_modules.go:
- systemDeps = []string{
- filepath.Join(buildDir, ".intermediates", dir, testcase.system, "android_common", "system", "lib", "modules"),
- filepath.Join(buildDir, ".intermediates", dir, testcase.system, "android_common", "system", "lib", "jrt-fs.jar"),
- filepath.Join(buildDir, ".intermediates", dir, testcase.system, "android_common", "system", "release"),
- }
- }
- checkClasspath := func(t *testing.T, ctx *android.TestContext, isJava8 bool) {
- foo := ctx.ModuleForTests("foo", variant)
- javac := foo.Rule("javac")
- var deps []string
- aidl := foo.MaybeRule("aidl")
- if aidl.Rule != nil {
- deps = append(deps, aidl.Output.String())
- }
- got := javac.Args["bootClasspath"]
- expected := ""
- if isJava8 || testcase.forces8 {
- expected = bc
- deps = append(deps, bcDeps...)
- } else {
- expected = system
- deps = append(deps, systemDeps...)
- }
- if got != expected {
- t.Errorf("bootclasspath expected %q != got %q", expected, got)
- }
- if isJava8 || testcase.forces8 {
- expected = j8c
- deps = append(deps, java8classpath...)
- } else {
- expected = j9c
- deps = append(deps, java9classpath...)
- }
- got = javac.Args["classpath"]
- if got != expected {
- t.Errorf("classpath expected %q != got %q", expected, got)
- }
- if !reflect.DeepEqual(javac.Implicits.Strings(), deps) {
- t.Errorf("implicits expected %q != got %q", deps, javac.Implicits.Strings())
- }
- }
- // Test with legacy javac -source 1.8 -target 1.8
- t.Run("Java language level 8", func(t *testing.T) {
- config := testConfig(nil, bpJava8, nil)
- if testcase.unbundled {
- config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
- config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
- }
- ctx := testContext()
- run(t, ctx, config)
- checkClasspath(t, ctx, true /* isJava8 */)
- if testcase.host != android.Host {
- aidl := ctx.ModuleForTests("foo", variant).Rule("aidl")
- if g, w := aidl.RuleParams.Command, testcase.aidl+" -I."; !strings.Contains(g, w) {
- t.Errorf("want aidl command to contain %q, got %q", w, g)
- }
- }
- })
- // Test with default javac -source 9 -target 9
- t.Run("Java language level 9", func(t *testing.T) {
- config := testConfig(nil, bp, nil)
- if testcase.unbundled {
- config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
- config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
- }
- ctx := testContext()
- run(t, ctx, config)
- checkClasspath(t, ctx, false /* isJava8 */)
- if testcase.host != android.Host {
- aidl := ctx.ModuleForTests("foo", variant).Rule("aidl")
- if g, w := aidl.RuleParams.Command, testcase.aidl+" -I."; !strings.Contains(g, w) {
- t.Errorf("want aidl command to contain %q, got %q", w, g)
- }
- }
- })
- // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 8 -target 8
- t.Run("REL + Java language level 8", func(t *testing.T) {
- config := testConfig(nil, bpJava8, nil)
- config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL")
- config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true)
- if testcase.unbundled {
- config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
- config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
- }
- ctx := testContext()
- run(t, ctx, config)
- checkClasspath(t, ctx, true /* isJava8 */)
- })
- // Test again with PLATFORM_VERSION_CODENAME=REL, javac -source 9 -target 9
- t.Run("REL + Java language level 9", func(t *testing.T) {
- config := testConfig(nil, bp, nil)
- config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("REL")
- config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(true)
- if testcase.unbundled {
- config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
- config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
- }
- ctx := testContext()
- run(t, ctx, config)
- checkClasspath(t, ctx, false /* isJava8 */)
- })
- })
- }
- }
|