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