|  | // Copyright (C) 2021 The Android Open Source Project | 
|  | // | 
|  | // 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 sdk | 
|  |  | 
|  | import ( | 
|  | "testing" | 
|  |  | 
|  | "android/soong/android" | 
|  | "android/soong/dexpreopt" | 
|  | "android/soong/java" | 
|  | ) | 
|  |  | 
|  | func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, targetBuildRelease string, expectedSdkSnapshot string) { | 
|  | result := android.GroupFixturePreparers( | 
|  | prepareForSdkTestWithJava, | 
|  | java.PrepareForTestWithJavaDefaultModules, | 
|  | java.PrepareForTestWithJavaSdkLibraryFiles, | 
|  | java.FixtureWithLastReleaseApis("mysdklibrary"), | 
|  | dexpreopt.FixtureSetApexSystemServerJars("myapex:mylib", "myapex:mysdklibrary"), | 
|  | android.FixtureModifyEnv(func(env map[string]string) { | 
|  | if targetBuildRelease != "latest" { | 
|  | env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = targetBuildRelease | 
|  | } | 
|  | }), | 
|  | prepareForSdkTestWithApex, | 
|  |  | 
|  | android.FixtureWithRootAndroidBp(sdk+` | 
|  | apex { | 
|  | name: "myapex", | 
|  | key: "myapex.key", | 
|  | min_sdk_version: "2", | 
|  | systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], | 
|  | } | 
|  |  | 
|  | systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | apex_available: ["myapex"], | 
|  | contents: [ | 
|  | "mylib", | 
|  | "mysdklibrary", | 
|  | ], | 
|  | } | 
|  |  | 
|  | java_library { | 
|  | name: "mylib", | 
|  | apex_available: ["myapex"], | 
|  | srcs: ["Test.java"], | 
|  | system_modules: "none", | 
|  | sdk_version: "none", | 
|  | min_sdk_version: "2", | 
|  | compile_dex: true, | 
|  | permitted_packages: ["mylib"], | 
|  | dex_preopt: { | 
|  | profile: "art-profile", | 
|  | }, | 
|  | } | 
|  |  | 
|  | java_sdk_library { | 
|  | name: "mysdklibrary", | 
|  | apex_available: ["myapex"], | 
|  | srcs: ["Test.java"], | 
|  | shared_library: false, | 
|  | public: {enabled: true}, | 
|  | min_sdk_version: "2", | 
|  | dex_preopt: { | 
|  | profile: "art-profile", | 
|  | }, | 
|  | } | 
|  | `), | 
|  | ).RunTest(t) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", | 
|  | checkAndroidBpContents(expectedSdkSnapshot), | 
|  | ) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) { | 
|  | commonSdk := ` | 
|  | apex { | 
|  | name: "myapex", | 
|  | key: "myapex.key", | 
|  | min_sdk_version: "Tiramisu", | 
|  | systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], | 
|  | } | 
|  | systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | apex_available: ["myapex"], | 
|  | contents: [ | 
|  | "mysdklibrary", | 
|  | "mysdklibrary-future", | 
|  | ], | 
|  | } | 
|  | java_sdk_library { | 
|  | name: "mysdklibrary", | 
|  | apex_available: ["myapex"], | 
|  | srcs: ["Test.java"], | 
|  | min_sdk_version: "33", // Tiramisu | 
|  | } | 
|  | java_sdk_library { | 
|  | name: "mysdklibrary-future", | 
|  | apex_available: ["myapex"], | 
|  | srcs: ["Test.java"], | 
|  | min_sdk_version: "34", // UpsideDownCake | 
|  | } | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | apexes: ["myapex"], | 
|  | } | 
|  | ` | 
|  |  | 
|  | result := android.GroupFixturePreparers( | 
|  | prepareForSdkTestWithJava, | 
|  | java.PrepareForTestWithJavaDefaultModules, | 
|  | java.PrepareForTestWithJavaSdkLibraryFiles, | 
|  | java.FixtureWithLastReleaseApis("mysdklibrary", "mysdklibrary-future"), | 
|  | dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary", "myapex:mysdklibrary-future"), | 
|  | android.FixtureModifyEnv(func(env map[string]string) { | 
|  | // targeting Tiramisu here means that we won't export mysdklibrary-future | 
|  | env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu" | 
|  | }), | 
|  | android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { | 
|  | variables.Platform_version_active_codenames = []string{"UpsideDownCake"} | 
|  | }), | 
|  | prepareForSdkTestWithApex, | 
|  | android.FixtureWithRootAndroidBp(commonSdk), | 
|  | ).RunTest(t) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents( | 
|  | `// This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | java_sdk_library_import { | 
|  | name: "mysdklibrary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | shared_library: true, | 
|  | public: { | 
|  | jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/public/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
|  | sdk_version: "current", | 
|  | }, | 
|  | system: { | 
|  | jars: ["sdk_library/system/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/system/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/system/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/system/mysdklibrary-removed.txt", | 
|  | sdk_version: "system_current", | 
|  | }, | 
|  | test: { | 
|  | jars: ["sdk_library/test/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/test/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/test/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/test/mysdklibrary-removed.txt", | 
|  | sdk_version: "test_current", | 
|  | }, | 
|  | } | 
|  |  | 
|  | prebuilt_systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | contents: ["mysdklibrary"], | 
|  | } `)) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) { | 
|  | commonSdk := ` | 
|  | apex { | 
|  | name: "myapex", | 
|  | key: "myapex.key", | 
|  | min_sdk_version: "Tiramisu", | 
|  | systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], | 
|  | } | 
|  | systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | apex_available: ["myapex"], | 
|  | contents: ["mysdklibrary"], | 
|  | } | 
|  | java_sdk_library { | 
|  | name: "mysdklibrary", | 
|  | apex_available: ["myapex"], | 
|  | srcs: ["Test.java"], | 
|  | min_sdk_version: "34", // UpsideDownCake | 
|  | } | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | apexes: ["myapex"], | 
|  | } | 
|  | ` | 
|  |  | 
|  | result := android.GroupFixturePreparers( | 
|  | prepareForSdkTestWithJava, | 
|  | java.PrepareForTestWithJavaDefaultModules, | 
|  | java.PrepareForTestWithJavaSdkLibraryFiles, | 
|  | java.FixtureWithLastReleaseApis("mysdklibrary"), | 
|  | dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"), | 
|  | android.FixtureModifyEnv(func(env map[string]string) { | 
|  | // targeting Tiramisu here means that we won't export mysdklibrary | 
|  | env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu" | 
|  | }), | 
|  | android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { | 
|  | variables.Platform_version_active_codenames = []string{"UpsideDownCake"} | 
|  | }), | 
|  | prepareForSdkTestWithApex, | 
|  | android.FixtureWithRootAndroidBp(commonSdk), | 
|  | ).RunTest(t) | 
|  |  | 
|  | CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`)) | 
|  | } | 
|  |  | 
|  | func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) { | 
|  |  | 
|  | commonSdk := ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], | 
|  | java_sdk_libs: [ | 
|  | // This is not strictly needed as it should be automatically added to the sdk_snapshot as | 
|  | // a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's | 
|  | // contents property. However, it is specified here to ensure that duplicates are | 
|  | // correctly deduped. | 
|  | "mysdklibrary", | 
|  | ], | 
|  | } | 
|  | ` | 
|  |  | 
|  | expectedLatestSnapshot := ` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | java_sdk_library_import { | 
|  | name: "mysdklibrary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | shared_library: false, | 
|  | dex_preopt: { | 
|  | profile_guided: true, | 
|  | }, | 
|  | public: { | 
|  | jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/public/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
|  | sdk_version: "current", | 
|  | }, | 
|  | } | 
|  |  | 
|  | java_import { | 
|  | name: "mylib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], | 
|  | min_sdk_version: "2", | 
|  | permitted_packages: ["mylib"], | 
|  | dex_preopt: { | 
|  | profile_guided: true, | 
|  | }, | 
|  | } | 
|  |  | 
|  | prebuilt_systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | contents: [ | 
|  | "mylib", | 
|  | "mysdklibrary", | 
|  | ], | 
|  | } | 
|  | ` | 
|  |  | 
|  | t.Run("target-s", func(t *testing.T) { | 
|  | testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", ` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | java_sdk_library_import { | 
|  | name: "mysdklibrary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | shared_library: false, | 
|  | public: { | 
|  | jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/public/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
|  | sdk_version: "current", | 
|  | }, | 
|  | } | 
|  | `) | 
|  | }) | 
|  |  | 
|  | t.Run("target-t", func(t *testing.T) { | 
|  | testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", ` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | java_sdk_library_import { | 
|  | name: "mysdklibrary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | shared_library: false, | 
|  | public: { | 
|  | jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/public/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
|  | sdk_version: "current", | 
|  | }, | 
|  | } | 
|  |  | 
|  | java_import { | 
|  | name: "mylib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], | 
|  | min_sdk_version: "2", | 
|  | permitted_packages: ["mylib"], | 
|  | } | 
|  |  | 
|  | prebuilt_systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | contents: [ | 
|  | "mylib", | 
|  | "mysdklibrary", | 
|  | ], | 
|  | } | 
|  | `) | 
|  | }) | 
|  |  | 
|  | t.Run("target-u", func(t *testing.T) { | 
|  | testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", ` | 
|  | // This is auto-generated. DO NOT EDIT. | 
|  |  | 
|  | java_sdk_library_import { | 
|  | name: "mysdklibrary", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | shared_library: false, | 
|  | dex_preopt: { | 
|  | profile_guided: true, | 
|  | }, | 
|  | public: { | 
|  | jars: ["sdk_library/public/mysdklibrary-stubs.jar"], | 
|  | stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], | 
|  | current_api: "sdk_library/public/mysdklibrary.txt", | 
|  | removed_api: "sdk_library/public/mysdklibrary-removed.txt", | 
|  | sdk_version: "current", | 
|  | }, | 
|  | } | 
|  |  | 
|  | java_import { | 
|  | name: "mylib", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], | 
|  | min_sdk_version: "2", | 
|  | permitted_packages: ["mylib"], | 
|  | dex_preopt: { | 
|  | profile_guided: true, | 
|  | }, | 
|  | } | 
|  |  | 
|  | prebuilt_systemserverclasspath_fragment { | 
|  | name: "mysystemserverclasspathfragment", | 
|  | prefer: false, | 
|  | visibility: ["//visibility:public"], | 
|  | apex_available: ["myapex"], | 
|  | contents: [ | 
|  | "mylib", | 
|  | "mysdklibrary", | 
|  | ], | 
|  | } | 
|  | `) | 
|  | }) | 
|  |  | 
|  | t.Run("added-directly", func(t *testing.T) { | 
|  | testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot) | 
|  | }) | 
|  |  | 
|  | t.Run("added-via-apex", func(t *testing.T) { | 
|  | testSnapshotWithSystemServerClasspathFragment(t, ` | 
|  | sdk { | 
|  | name: "mysdk", | 
|  | apexes: ["myapex"], | 
|  | } | 
|  | `, `latest`, expectedLatestSnapshot) | 
|  | }) | 
|  | } |