1// Copyright (C) 2021 The Android Open Source Project 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 sdk 16 17import ( 18 "testing" 19 20 "android/soong/android" 21 "android/soong/dexpreopt" 22 "android/soong/java" 23) 24 25func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, targetBuildRelease string, expectedSdkSnapshot string) { 26 result := android.GroupFixturePreparers( 27 prepareForSdkTestWithJava, 28 java.PrepareForTestWithJavaDefaultModules, 29 java.PrepareForTestWithJavaSdkLibraryFiles, 30 java.FixtureWithLastReleaseApis("mysdklibrary"), 31 dexpreopt.FixtureSetApexSystemServerJars("myapex:mylib", "myapex:mysdklibrary"), 32 android.FixtureModifyEnv(func(env map[string]string) { 33 if targetBuildRelease != "latest" { 34 env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = targetBuildRelease 35 } 36 }), 37 prepareForSdkTestWithApex, 38 39 android.FixtureWithRootAndroidBp(sdk+` 40 apex { 41 name: "myapex", 42 key: "myapex.key", 43 min_sdk_version: "2", 44 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 45 } 46 47 systemserverclasspath_fragment { 48 name: "mysystemserverclasspathfragment", 49 apex_available: ["myapex"], 50 contents: [ 51 "mylib", 52 "mysdklibrary", 53 ], 54 } 55 56 java_library { 57 name: "mylib", 58 apex_available: ["myapex"], 59 srcs: ["Test.java"], 60 system_modules: "none", 61 sdk_version: "none", 62 min_sdk_version: "2", 63 compile_dex: true, 64 permitted_packages: ["mylib"], 65 dex_preopt: { 66 profile: "art-profile", 67 }, 68 } 69 70 java_sdk_library { 71 name: "mysdklibrary", 72 apex_available: ["myapex"], 73 srcs: ["Test.java"], 74 shared_library: false, 75 public: {enabled: true}, 76 min_sdk_version: "2", 77 dex_preopt: { 78 profile: "art-profile", 79 }, 80 } 81 `), 82 ).RunTest(t) 83 84 CheckSnapshot(t, result, "mysdk", "", 85 checkAndroidBpContents(expectedSdkSnapshot), 86 ) 87} 88 89func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) { 90 commonSdk := ` 91 apex { 92 name: "myapex", 93 key: "myapex.key", 94 min_sdk_version: "Tiramisu", 95 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 96 } 97 systemserverclasspath_fragment { 98 name: "mysystemserverclasspathfragment", 99 apex_available: ["myapex"], 100 contents: ["mysdklibrary"], 101 } 102 java_sdk_library { 103 name: "mysdklibrary", 104 apex_available: ["myapex"], 105 srcs: ["Test.java"], 106 min_sdk_version: "34", // UpsideDownCake 107 } 108 sdk { 109 name: "mysdk", 110 apexes: ["myapex"], 111 } 112 ` 113 114 result := android.GroupFixturePreparers( 115 prepareForSdkTestWithJava, 116 java.PrepareForTestWithJavaDefaultModules, 117 java.PrepareForTestWithJavaSdkLibraryFiles, 118 java.FixtureWithLastReleaseApis("mysdklibrary"), 119 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"), 120 android.FixtureModifyEnv(func(env map[string]string) { 121 // targeting Tiramisu here means that we won't export mysdklibrary 122 env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu" 123 }), 124 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 125 variables.Platform_version_active_codenames = []string{"UpsideDownCake"} 126 }), 127 prepareForSdkTestWithApex, 128 android.FixtureWithRootAndroidBp(commonSdk), 129 ).RunTest(t) 130 131 CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`)) 132} 133 134func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) { 135 136 commonSdk := ` 137sdk { 138 name: "mysdk", 139 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 140 java_sdk_libs: [ 141 // This is not strictly needed as it should be automatically added to the sdk_snapshot as 142 // a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's 143 // contents property. However, it is specified here to ensure that duplicates are 144 // correctly deduped. 145 "mysdklibrary", 146 ], 147} 148 ` 149 150 expectedLatestSnapshot := ` 151// This is auto-generated. DO NOT EDIT. 152 153java_sdk_library_import { 154 name: "mysdklibrary", 155 prefer: false, 156 visibility: ["//visibility:public"], 157 apex_available: ["myapex"], 158 shared_library: false, 159 dex_preopt: { 160 profile_guided: true, 161 }, 162 public: { 163 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 164 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 165 current_api: "sdk_library/public/mysdklibrary.txt", 166 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 167 sdk_version: "current", 168 }, 169} 170 171java_import { 172 name: "mylib", 173 prefer: false, 174 visibility: ["//visibility:public"], 175 apex_available: ["myapex"], 176 jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], 177 min_sdk_version: "2", 178 permitted_packages: ["mylib"], 179 dex_preopt: { 180 profile_guided: true, 181 }, 182} 183 184prebuilt_systemserverclasspath_fragment { 185 name: "mysystemserverclasspathfragment", 186 prefer: false, 187 visibility: ["//visibility:public"], 188 apex_available: ["myapex"], 189 contents: [ 190 "mylib", 191 "mysdklibrary", 192 ], 193} 194` 195 196 t.Run("target-s", func(t *testing.T) { 197 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", ` 198// This is auto-generated. DO NOT EDIT. 199 200java_sdk_library_import { 201 name: "mysdklibrary", 202 prefer: false, 203 visibility: ["//visibility:public"], 204 apex_available: ["myapex"], 205 shared_library: false, 206 public: { 207 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 208 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 209 current_api: "sdk_library/public/mysdklibrary.txt", 210 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 211 sdk_version: "current", 212 }, 213} 214`) 215 }) 216 217 t.Run("target-t", func(t *testing.T) { 218 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", ` 219// This is auto-generated. DO NOT EDIT. 220 221java_sdk_library_import { 222 name: "mysdklibrary", 223 prefer: false, 224 visibility: ["//visibility:public"], 225 apex_available: ["myapex"], 226 shared_library: false, 227 public: { 228 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 229 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 230 current_api: "sdk_library/public/mysdklibrary.txt", 231 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 232 sdk_version: "current", 233 }, 234} 235 236java_import { 237 name: "mylib", 238 prefer: false, 239 visibility: ["//visibility:public"], 240 apex_available: ["myapex"], 241 jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], 242 min_sdk_version: "2", 243 permitted_packages: ["mylib"], 244} 245 246prebuilt_systemserverclasspath_fragment { 247 name: "mysystemserverclasspathfragment", 248 prefer: false, 249 visibility: ["//visibility:public"], 250 apex_available: ["myapex"], 251 contents: [ 252 "mylib", 253 "mysdklibrary", 254 ], 255} 256`) 257 }) 258 259 t.Run("target-u", func(t *testing.T) { 260 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", ` 261// This is auto-generated. DO NOT EDIT. 262 263java_sdk_library_import { 264 name: "mysdklibrary", 265 prefer: false, 266 visibility: ["//visibility:public"], 267 apex_available: ["myapex"], 268 shared_library: false, 269 dex_preopt: { 270 profile_guided: true, 271 }, 272 public: { 273 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 274 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 275 current_api: "sdk_library/public/mysdklibrary.txt", 276 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 277 sdk_version: "current", 278 }, 279} 280 281java_import { 282 name: "mylib", 283 prefer: false, 284 visibility: ["//visibility:public"], 285 apex_available: ["myapex"], 286 jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], 287 min_sdk_version: "2", 288 permitted_packages: ["mylib"], 289 dex_preopt: { 290 profile_guided: true, 291 }, 292} 293 294prebuilt_systemserverclasspath_fragment { 295 name: "mysystemserverclasspathfragment", 296 prefer: false, 297 visibility: ["//visibility:public"], 298 apex_available: ["myapex"], 299 contents: [ 300 "mylib", 301 "mysdklibrary", 302 ], 303} 304`) 305 }) 306 307 t.Run("added-directly", func(t *testing.T) { 308 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot) 309 }) 310 311 t.Run("added-via-apex", func(t *testing.T) { 312 testSnapshotWithSystemServerClasspathFragment(t, ` 313 sdk { 314 name: "mysdk", 315 apexes: ["myapex"], 316 } 317 `, `latest`, expectedLatestSnapshot) 318 }) 319} 320