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 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 38 variables.Platform_version_active_codenames = []string{"VanillaIceCream"} 39 }), 40 prepareForSdkTestWithApex, 41 42 android.FixtureWithRootAndroidBp(sdk+` 43 apex { 44 name: "myapex", 45 key: "myapex.key", 46 min_sdk_version: "2", 47 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 48 } 49 50 systemserverclasspath_fragment { 51 name: "mysystemserverclasspathfragment", 52 apex_available: ["myapex"], 53 contents: [ 54 "mylib", 55 "mysdklibrary", 56 ], 57 } 58 59 java_library { 60 name: "mylib", 61 apex_available: ["myapex"], 62 srcs: ["Test.java"], 63 system_modules: "none", 64 sdk_version: "none", 65 min_sdk_version: "2", 66 compile_dex: true, 67 permitted_packages: ["mylib"], 68 dex_preopt: { 69 profile: "art-profile", 70 }, 71 } 72 73 java_sdk_library { 74 name: "mysdklibrary", 75 apex_available: ["myapex"], 76 srcs: ["Test.java"], 77 shared_library: false, 78 public: {enabled: true}, 79 min_sdk_version: "2", 80 dex_preopt: { 81 profile: "art-profile", 82 }, 83 sdk_version: "current", 84 } 85 `), 86 ).RunTest(t) 87 88 CheckSnapshot(t, result, "mysdk", "", 89 checkAndroidBpContents(expectedSdkSnapshot), 90 ) 91} 92 93func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) { 94 commonSdk := ` 95 apex { 96 name: "myapex", 97 key: "myapex.key", 98 min_sdk_version: "Tiramisu", 99 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 100 } 101 systemserverclasspath_fragment { 102 name: "mysystemserverclasspathfragment", 103 apex_available: ["myapex"], 104 contents: [ 105 "mysdklibrary", 106 "mysdklibrary-future", 107 ], 108 } 109 java_sdk_library { 110 name: "mysdklibrary", 111 apex_available: ["myapex"], 112 srcs: ["Test.java"], 113 min_sdk_version: "33", // Tiramisu 114 sdk_version: "current", 115 } 116 java_sdk_library { 117 name: "mysdklibrary-future", 118 apex_available: ["myapex"], 119 srcs: ["Test.java"], 120 min_sdk_version: "34", // UpsideDownCake 121 sdk_version: "current", 122 } 123 sdk { 124 name: "mysdk", 125 apexes: ["myapex"], 126 } 127 ` 128 129 result := android.GroupFixturePreparers( 130 prepareForSdkTestWithJava, 131 java.PrepareForTestWithJavaDefaultModules, 132 java.PrepareForTestWithJavaSdkLibraryFiles, 133 java.FixtureWithLastReleaseApis("mysdklibrary", "mysdklibrary-future"), 134 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary", "myapex:mysdklibrary-future"), 135 android.FixtureModifyEnv(func(env map[string]string) { 136 // targeting Tiramisu here means that we won't export mysdklibrary-future 137 env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu" 138 }), 139 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 140 variables.Platform_version_active_codenames = []string{"UpsideDownCake"} 141 }), 142 prepareForSdkTestWithApex, 143 android.FixtureWithRootAndroidBp(commonSdk), 144 ).RunTest(t) 145 146 CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents( 147 `// This is auto-generated. DO NOT EDIT. 148 149java_sdk_library_import { 150 name: "mysdklibrary", 151 prefer: false, 152 visibility: ["//visibility:public"], 153 apex_available: ["myapex"], 154 shared_library: true, 155 public: { 156 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 157 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 158 current_api: "sdk_library/public/mysdklibrary.txt", 159 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 160 sdk_version: "current", 161 }, 162 system: { 163 jars: ["sdk_library/system/mysdklibrary-stubs.jar"], 164 stub_srcs: ["sdk_library/system/mysdklibrary_stub_sources"], 165 current_api: "sdk_library/system/mysdklibrary.txt", 166 removed_api: "sdk_library/system/mysdklibrary-removed.txt", 167 sdk_version: "system_current", 168 }, 169 test: { 170 jars: ["sdk_library/test/mysdklibrary-stubs.jar"], 171 stub_srcs: ["sdk_library/test/mysdklibrary_stub_sources"], 172 current_api: "sdk_library/test/mysdklibrary.txt", 173 removed_api: "sdk_library/test/mysdklibrary-removed.txt", 174 sdk_version: "test_current", 175 }, 176} 177 178prebuilt_systemserverclasspath_fragment { 179 name: "mysystemserverclasspathfragment", 180 prefer: false, 181 visibility: ["//visibility:public"], 182 apex_available: ["myapex"], 183 contents: ["mysdklibrary"], 184} `)) 185} 186 187func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) { 188 commonSdk := ` 189 apex { 190 name: "myapex", 191 key: "myapex.key", 192 min_sdk_version: "Tiramisu", 193 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 194 } 195 systemserverclasspath_fragment { 196 name: "mysystemserverclasspathfragment", 197 apex_available: ["myapex"], 198 contents: ["mysdklibrary"], 199 } 200 java_sdk_library { 201 name: "mysdklibrary", 202 apex_available: ["myapex"], 203 srcs: ["Test.java"], 204 min_sdk_version: "34", // UpsideDownCake 205 sdk_version: "current", 206 } 207 sdk { 208 name: "mysdk", 209 apexes: ["myapex"], 210 } 211 ` 212 213 result := android.GroupFixturePreparers( 214 prepareForSdkTestWithJava, 215 java.PrepareForTestWithJavaDefaultModules, 216 java.PrepareForTestWithJavaSdkLibraryFiles, 217 java.FixtureWithLastReleaseApis("mysdklibrary"), 218 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"), 219 android.FixtureModifyEnv(func(env map[string]string) { 220 // targeting Tiramisu here means that we won't export mysdklibrary 221 env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu" 222 }), 223 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 224 variables.Platform_version_active_codenames = []string{"UpsideDownCake"} 225 }), 226 prepareForSdkTestWithApex, 227 android.FixtureWithRootAndroidBp(commonSdk), 228 ).RunTest(t) 229 230 CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`)) 231} 232 233func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) { 234 235 commonSdk := ` 236sdk { 237 name: "mysdk", 238 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"], 239 java_sdk_libs: [ 240 // This is not strictly needed as it should be automatically added to the sdk_snapshot as 241 // a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's 242 // contents property. However, it is specified here to ensure that duplicates are 243 // correctly deduped. 244 "mysdklibrary", 245 ], 246} 247 ` 248 249 expectedLatestSnapshot := ` 250// This is auto-generated. DO NOT EDIT. 251 252apex_contributions_defaults { 253 name: "mysdk.contributions", 254 contents: ["prebuilt_mysdklibrary"], 255} 256 257java_sdk_library_import { 258 name: "mysdklibrary", 259 prefer: false, 260 visibility: ["//visibility:public"], 261 apex_available: ["myapex"], 262 shared_library: false, 263 dex_preopt: { 264 profile_guided: true, 265 }, 266 public: { 267 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 268 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 269 current_api: "sdk_library/public/mysdklibrary.txt", 270 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 271 sdk_version: "current", 272 }, 273} 274 275java_import { 276 name: "mylib", 277 prefer: false, 278 visibility: ["//visibility:public"], 279 apex_available: ["myapex"], 280 jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], 281 min_sdk_version: "2", 282 permitted_packages: ["mylib"], 283 dex_preopt: { 284 profile_guided: true, 285 }, 286} 287 288prebuilt_systemserverclasspath_fragment { 289 name: "mysystemserverclasspathfragment", 290 prefer: false, 291 visibility: ["//visibility:public"], 292 apex_available: ["myapex"], 293 contents: [ 294 "mylib", 295 "mysdklibrary", 296 ], 297} 298` 299 300 t.Run("target-s", func(t *testing.T) { 301 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", ` 302// This is auto-generated. DO NOT EDIT. 303 304java_sdk_library_import { 305 name: "mysdklibrary", 306 prefer: false, 307 visibility: ["//visibility:public"], 308 apex_available: ["myapex"], 309 shared_library: false, 310 public: { 311 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 312 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 313 current_api: "sdk_library/public/mysdklibrary.txt", 314 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 315 sdk_version: "current", 316 }, 317} 318`) 319 }) 320 321 t.Run("target-t", func(t *testing.T) { 322 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", ` 323// This is auto-generated. DO NOT EDIT. 324 325java_sdk_library_import { 326 name: "mysdklibrary", 327 prefer: false, 328 visibility: ["//visibility:public"], 329 apex_available: ["myapex"], 330 shared_library: false, 331 public: { 332 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 333 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 334 current_api: "sdk_library/public/mysdklibrary.txt", 335 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 336 sdk_version: "current", 337 }, 338} 339 340java_import { 341 name: "mylib", 342 prefer: false, 343 visibility: ["//visibility:public"], 344 apex_available: ["myapex"], 345 jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], 346 min_sdk_version: "2", 347 permitted_packages: ["mylib"], 348} 349 350prebuilt_systemserverclasspath_fragment { 351 name: "mysystemserverclasspathfragment", 352 prefer: false, 353 visibility: ["//visibility:public"], 354 apex_available: ["myapex"], 355 contents: [ 356 "mylib", 357 "mysdklibrary", 358 ], 359} 360`) 361 }) 362 363 t.Run("target-u", func(t *testing.T) { 364 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", ` 365// This is auto-generated. DO NOT EDIT. 366 367java_sdk_library_import { 368 name: "mysdklibrary", 369 prefer: false, 370 visibility: ["//visibility:public"], 371 apex_available: ["myapex"], 372 shared_library: false, 373 dex_preopt: { 374 profile_guided: true, 375 }, 376 public: { 377 jars: ["sdk_library/public/mysdklibrary-stubs.jar"], 378 stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"], 379 current_api: "sdk_library/public/mysdklibrary.txt", 380 removed_api: "sdk_library/public/mysdklibrary-removed.txt", 381 sdk_version: "current", 382 }, 383} 384 385java_import { 386 name: "mylib", 387 prefer: false, 388 visibility: ["//visibility:public"], 389 apex_available: ["myapex"], 390 jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"], 391 min_sdk_version: "2", 392 permitted_packages: ["mylib"], 393 dex_preopt: { 394 profile_guided: true, 395 }, 396} 397 398prebuilt_systemserverclasspath_fragment { 399 name: "mysystemserverclasspathfragment", 400 prefer: false, 401 visibility: ["//visibility:public"], 402 apex_available: ["myapex"], 403 contents: [ 404 "mylib", 405 "mysdklibrary", 406 ], 407} 408`) 409 }) 410 411 t.Run("added-directly", func(t *testing.T) { 412 testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot) 413 }) 414 415 t.Run("added-via-apex", func(t *testing.T) { 416 testSnapshotWithSystemServerClasspathFragment(t, ` 417 sdk { 418 name: "mysdk", 419 apexes: ["myapex"], 420 } 421 `, `latest`, expectedLatestSnapshot) 422 }) 423} 424