| /* |
| * Copyright (C) 2019 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 com.android.build.gradle.internal |
| |
| import com.android.SdkConstants |
| import com.android.SdkConstants.FN_CORE_FOR_SYSTEM_MODULES |
| import com.android.build.gradle.internal.fixtures.FakeSyncIssueReporter |
| import com.android.build.gradle.internal.packaging.JarCreatorFactory |
| import com.android.builder.core.ToolsRevisionUtils |
| import com.android.builder.internal.compiler.RenderScriptProcessor |
| import com.android.repository.Revision |
| import com.android.sdklib.AndroidTargetHash |
| import com.android.sdklib.BuildToolInfo |
| import com.google.common.truth.Truth.assertThat |
| import org.junit.After |
| import org.junit.Before |
| import org.junit.Rule |
| import org.junit.Test |
| import org.junit.rules.TemporaryFolder |
| import java.io.File |
| import java.nio.file.Path |
| import java.util.Properties |
| |
| class SdkDirectLoadingStrategyTest { |
| private data class SystemImageInfo( |
| val api: Int, |
| val vendor: String, |
| val abi: String, |
| val directory: String |
| ) { |
| val repository = "system-images;android-$api;$vendor;$abi" |
| } |
| |
| private val PLATFORM_TOOLS_XML = """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <license id="android-sdk-license" type="text">Very valid license</license> |
| <localPackage path="platform-tools" obsolete="false"> |
| <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:genericDetailsType"/> |
| <revision><major>28</major><minor>0</minor><micro>1</micro></revision> |
| <display-name>Android SDK Platform-Tools</display-name> |
| <uses-license ref="android-sdk-license"/> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private val SUPPORT_TOOLS_XML = """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <license id="android-sdk-license" type="text">Very valid license</license> |
| <localPackage path="tools" obsolete="false"> |
| <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:genericDetailsType"/> |
| <revision><major>26</major><minor>1</minor><micro>1</micro></revision> |
| <display-name>Android SDK Tools</display-name> |
| <uses-license ref="android-sdk-license"/> |
| <dependencies> |
| <dependency path="patcher;v4"/> |
| <dependency path="emulator"/> |
| <dependency path="platform-tools"> |
| <min-revision><major>20</major></min-revision> |
| </dependency> |
| </dependencies> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private val BUILD_TOOL_LATEST_XML = """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <license id="android-sdk-license" type="text">Very valid license</license> |
| <localPackage path="build-tools;${SdkConstants.CURRENT_BUILD_TOOLS_VERSION}" obsolete="false"> |
| <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:genericDetailsType"/> |
| <revision> |
| <major>${ToolsRevisionUtils.MIN_BUILD_TOOLS_REV.major}</major> |
| <minor>${ToolsRevisionUtils.MIN_BUILD_TOOLS_REV.minor}</minor> |
| <micro>${ToolsRevisionUtils.MIN_BUILD_TOOLS_REV.micro}</micro> |
| </revision> |
| <display-name>Android SDK Build-Tools ${SdkConstants.CURRENT_BUILD_TOOLS_VERSION}</display-name> |
| <uses-license ref="android-sdk-license"/> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private val ADD_ON_XML = """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <localPackage path="add-ons;addon-vendor_addon-name" obsolete="false"> |
| <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns4:addonDetailsType"> |
| <api-level>28</api-level> |
| <vendor> |
| <id>addon-vendor</id> |
| <display>Add-On Vendor</display> |
| </vendor> |
| <tag> |
| <id>addon-name</id> |
| <display>Add-On Name</display> |
| </tag> |
| <libraries> |
| <library name="com.example.addon"> |
| <description>Example Add-On.</description> |
| </library> |
| </libraries> |
| </type-details> |
| <revision> |
| <major>42</major> |
| </revision> |
| <display-name>Add-On Name</display-name> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private fun getPlatformXml(version: Int = 28) = """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <license id="android-sdk-license" type="text">Very valid license</license> |
| <localPackage path="platforms;android-$version" obsolete="false"> |
| <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns5:platformDetailsType"> |
| <api-level>$version</api-level> |
| <codename></codename> |
| <layoutlib api="15"/> |
| </type-details> |
| <revision><major>6</major></revision> |
| <display-name>Android SDK Platform $version</display-name> |
| <uses-license ref="android-sdk-license"/> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private val PLATFORM_28_OPTIONAL_JSON = """ |
| [ |
| { |
| "name": "org.apache.http.legacy", |
| "jar": "org.apache.http.legacy.jar", |
| "manifest": false |
| }, |
| { |
| "name": "android.test.mock", |
| "jar": "android.test.mock.jar", |
| "manifest": false |
| }, |
| { |
| "name": "android.test.base", |
| "jar": "android.test.base.jar", |
| "manifest": false |
| }, |
| { |
| "name": "android.test.runner", |
| "jar": "android.test.runner.jar", |
| "manifest": false |
| } |
| ] |
| """.trimIndent() |
| |
| private fun getSystemImageXml( |
| systemImageInfo: SystemImageInfo) = |
| """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <license id="android-sdk-license" type="text">Very valid license</license> |
| <localPackage |
| path="${systemImageInfo.repository}" |
| obsolete="false"> |
| |
| <type-details |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:type="ns6:sysImgDetailsType"> |
| <api-level>${systemImageInfo.api}</api-level> |
| <tag> |
| <id>${systemImageInfo.vendor}</id> |
| <display>A Valid Display Name</display> |
| </tag> |
| <vendor> |
| <id>validVendorShortId</id> |
| <display>A Valid Display Name</display> |
| </vendor> |
| <abi>${systemImageInfo.abi}</abi> |
| </type-details> |
| <revision> |
| <major>8</major> |
| </revision> |
| <display-name>A Valid Display Name</display-name> |
| <uses-license ref="android-sdk-license"/> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private val EMULATOR_XML = """ |
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| <ns2:repository |
| xmlns:ns2="http://schemas.android.com/repository/android/common/01" |
| xmlns:ns3="http://schemas.android.com/repository/android/generic/01" |
| xmlns:ns4="http://schemas.android.com/sdk/android/repo/addon2/01" |
| xmlns:ns5="http://schemas.android.com/sdk/android/repo/repository2/01" |
| xmlns:ns6="http://schemas.android.com/sdk/android/repo/sys-img2/01"> |
| |
| <license id="android-sdk-license" type="text">Very valid license</license> |
| <localPackage path="emulator" obsolete="false"> |
| <type-details |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:type="ns3:genericDetailsType"/> |
| <revision> |
| <major>30</major> |
| <minor>0</minor> |
| <micro>26</micro> |
| </revision> |
| <display-name>Android Emulator</display-name> |
| <uses-license ref="android-sdk-license"/> |
| </localPackage> |
| </ns2:repository> |
| """.trimIndent() |
| |
| private fun createCoreForSystemModulesJar(jarFile: Path, platformApiLevel: Int) { |
| // A empty fake jar represents core-for-system-modules.jar available from android sdk 30 |
| if (platformApiLevel >= 30) { |
| JarCreatorFactory.make(jarFile).use { } |
| } |
| } |
| |
| @get:Rule |
| val testFolder = TemporaryFolder() |
| |
| @Before |
| fun setup() { |
| SdkDirectLoadingStrategy.clearCaches() |
| SdkLocator.sdkTestDirectory = testFolder.newFolder("sdk") |
| } |
| |
| @After |
| fun tearDown() { |
| SdkDirectLoadingStrategy.clearCaches() |
| SdkLocator.sdkTestDirectory = null |
| SdkLocator.resetCache() |
| } |
| |
| @Test |
| fun load_ok() { |
| configureSdkDirectory() |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader) |
| } |
| |
| @Test |
| fun load_cacheHit() { |
| configureSdkDirectory() |
| |
| // Add it to the cache. |
| getDirectLoader() |
| |
| // We delete the sdk files to make sure it's not going to the disk again. |
| testFolder.root.resolve("platforms").deleteRecursively() |
| |
| // We request it again, should be fetched direct from the cache. |
| val directLoader = getDirectLoader() |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader) |
| } |
| |
| @Test |
| fun load_badSdkDirectory() { |
| SdkLocator.sdkTestDirectory = testFolder.root.resolve("bad_sdk") |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_missingPlatform() { |
| configureSdkDirectory(configurePlatform = false) |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_wrongPlatform() { |
| // We put the 28 API in the "android-27" directory and request it. |
| configureSdkDirectory(platformDirectory = "android-27") |
| val directLoader = getDirectLoader(platformHash = "android-27") |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_addOnSdk() { |
| configureSdkDirectory() |
| val directLoader = getDirectLoader(platformHash = "Add-On Vendor:Add-On Name:28") |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_missingBuildTools() { |
| configureSdkDirectory(configureBuildTools = false) |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_oldBuildTools() { |
| // Even if we request an older version, it should bump to the one in |
| // ToolsRevisionUtils.DEFAULT_BUILD_TOOLS_REVISION and look for it. |
| configureSdkDirectory() |
| val directLoader = getDirectLoader(buildTools = "27.0.0") |
| |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader) |
| } |
| |
| @Test |
| fun load_missingPlatformTools() { |
| configureSdkDirectory(configurePlatformTools = false) |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_missingSupportTools_apiGreaterThan16() { |
| configureSdkDirectory( |
| platformDirectory = "android-16", platformApiLevel = 16, configureSupportTools = false) |
| val directLoader = getDirectLoader("android-16") |
| |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader, "android-16") |
| } |
| |
| @Test |
| fun load_missingSupportTools_apiLessThan16() { |
| configureSdkDirectory( |
| platformDirectory = "android-15", platformApiLevel = 15, configureSupportTools = false) |
| val directLoader = getDirectLoader("android-15") |
| |
| assertThat(directLoader.loadedSuccessfully()).isFalse() |
| assertAllComponentsAreNull(directLoader) |
| } |
| |
| @Test |
| fun load_missingSystemImage() { |
| configureSdkDirectory(configureSystemImages = false) |
| val directLoader = getDirectLoader() |
| |
| assertThat( |
| directLoader.getSystemImageLibFolder( |
| "system-images;android-30;google-apis-playstore;x86")) |
| .isNull() |
| // A missing system image should not interfere with whether or not the loader is successful. |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader) |
| } |
| |
| @Test |
| fun load_systemImage() { |
| configureSdkDirectory( |
| systemImageInfos = listOf( |
| SystemImageInfo( |
| 30, |
| "google-apis-playstore", |
| "x86", |
| "system-images/android-30/google-apis-playstore/x86"), |
| SystemImageInfo( |
| 30, |
| "default", |
| "x86", |
| "system-images/android-30/default/x86"))) |
| |
| val directLoader = getDirectLoader() |
| |
| assertThat( |
| directLoader.getSystemImageLibFolder( |
| "system-images;android-30;google-apis-playstore;x86")) |
| .isNotNull() |
| assertThat( |
| directLoader.getSystemImageLibFolder( |
| "system-images;android-30;default;x86")) |
| .isNotNull() |
| assertThat( |
| directLoader.getSystemImageLibFolder( |
| "system-images;android-28;default;x86")) |
| .isNull() |
| } |
| |
| @Test |
| fun load_cacheHitSystemImage() { |
| configureSdkDirectory( |
| systemImageInfos = listOf( |
| SystemImageInfo( |
| 30, |
| "google-apis-playstore", |
| "x86", |
| "system-images/android-30/google-apis-playstore/x86"))) |
| |
| val directLoader = getDirectLoader() |
| |
| assertThat( |
| directLoader.getSystemImageLibFolder( |
| "system-images;android-30;google-apis-playstore;x86")) |
| .isNotNull() |
| |
| testFolder.root.resolve("system-images").deleteRecursively() |
| |
| assertThat( |
| directLoader.getSystemImageLibFolder( |
| "system-images;android-30;google-apis-playstore;x86")) |
| .isNotNull() |
| } |
| |
| @Test |
| fun load_missingEmulator() { |
| configureSdkDirectory(configureEmulator = false) |
| |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.getEmulatorLibFolder()).isNull() |
| // A missing emulator should not interfere with whether or not the loader is successful. |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader) |
| } |
| |
| @Test |
| fun load_emulator() { |
| configureSdkDirectory() |
| |
| val directLoader = getDirectLoader() |
| |
| assertThat(directLoader.getEmulatorLibFolder()).isNotNull() |
| } |
| |
| @Test |
| fun loadCoreForSystemModulesJar() { |
| val platformVersion = "android-30" |
| configureSdkDirectory(platformDirectory = platformVersion, platformApiLevel = 30) |
| |
| val directLoader = getDirectLoader(platformVersion) |
| assertThat(directLoader.loadedSuccessfully()).isTrue() |
| assertAllComponentsArePresent(directLoader, platformVersion) |
| } |
| |
| private fun getDirectLoader( |
| platformHash: String = "android-28", |
| buildTools: String = SdkConstants.CURRENT_BUILD_TOOLS_VERSION): SdkDirectLoadingStrategy { |
| return SdkDirectLoadingStrategy( |
| SdkLocationSourceSet(testFolder.root, Properties(), Properties(), Properties()), |
| platformHash, |
| Revision.parseRevision(buildTools), |
| true, |
| FakeSyncIssueReporter() |
| ) |
| } |
| |
| // Configures the SDK Test directory and return the root of the SDK dir. |
| private fun configureSdkDirectory( |
| configurePlatform: Boolean = true, |
| platformDirectory: String = "android-28", |
| platformApiLevel: Int = 28, |
| configureBuildTools: Boolean = true, |
| buildToolsDirectory: String = SdkConstants.CURRENT_BUILD_TOOLS_VERSION, |
| configurePlatformTools: Boolean = true, |
| configureSupportTools: Boolean = true, |
| configureTestAddOn: Boolean = true, |
| configureSystemImages: Boolean = true, |
| systemImageInfos: List<SystemImageInfo> = listOf(), |
| configureEmulator: Boolean = true) { |
| |
| val sdkDir = SdkLocator.sdkTestDirectory!! |
| |
| if (configurePlatform) { |
| val platformRoot = sdkDir.resolve("platforms/$platformDirectory") |
| platformRoot.mkdirs() |
| |
| val platformPackageXml = platformRoot.resolve("package.xml") |
| platformPackageXml.createNewFile() |
| platformPackageXml.writeText(getPlatformXml(platformApiLevel), Charsets.UTF_8) |
| |
| val optionalDir = platformRoot.resolve("optional") |
| optionalDir.mkdir() |
| val optionalJson = optionalDir.resolve("optional.json") |
| optionalJson.createNewFile() |
| optionalJson.writeText(PLATFORM_28_OPTIONAL_JSON) |
| createCoreForSystemModulesJar(platformRoot.resolve(FN_CORE_FOR_SYSTEM_MODULES).toPath(), platformApiLevel) |
| } |
| |
| if (configureBuildTools) { |
| val buildToolsRoot = sdkDir.resolve("build-tools/$buildToolsDirectory") |
| buildToolsRoot.mkdirs() |
| |
| val buildToolInfo = BuildToolInfo.fromStandardDirectoryLayout( |
| ToolsRevisionUtils.DEFAULT_BUILD_TOOLS_REVISION, buildToolsRoot.toPath()) |
| for (id in BuildToolInfo.PathId.values()) { |
| if (!id.isPresentIn(ToolsRevisionUtils.DEFAULT_BUILD_TOOLS_REVISION)) { |
| continue |
| } |
| val buildToolComponent = File(buildToolInfo.getPath(id)) |
| buildToolComponent.parentFile.mkdirs() |
| buildToolComponent.createNewFile() |
| } |
| |
| val buildToolsPackageXml = buildToolsRoot.resolve("package.xml") |
| buildToolsPackageXml.createNewFile() |
| buildToolsPackageXml.writeText(BUILD_TOOL_LATEST_XML, Charsets.UTF_8) |
| } |
| |
| if (configurePlatformTools) { |
| val platformToolsRoot = sdkDir.resolve("platform-tools") |
| platformToolsRoot.mkdirs() |
| |
| val platformToolsPackageXml = platformToolsRoot.resolve("package.xml") |
| platformToolsPackageXml.createNewFile() |
| platformToolsPackageXml.writeText(PLATFORM_TOOLS_XML, Charsets.UTF_8) |
| } |
| |
| if (configureSupportTools) { |
| val supportToolsRoot = sdkDir.resolve("tools") |
| supportToolsRoot.mkdirs() |
| |
| val supportToolsPackageXml = supportToolsRoot.resolve("package.xml") |
| supportToolsPackageXml.createNewFile() |
| supportToolsPackageXml.writeText(SUPPORT_TOOLS_XML, Charsets.UTF_8) |
| } |
| |
| if (configureTestAddOn) { |
| val testAddOnRoot = sdkDir.resolve("add-ons/addon-vendor_addon-name") |
| testAddOnRoot.mkdirs() |
| |
| val testAddOnPackageXml = testAddOnRoot.resolve("package.xml") |
| testAddOnPackageXml.createNewFile() |
| testAddOnPackageXml.writeText(ADD_ON_XML) |
| } |
| |
| if (configureSystemImages) { |
| for (info in systemImageInfos) { |
| val systemImageRoot = |
| sdkDir.resolve(info.directory) |
| systemImageRoot.mkdirs() |
| |
| val systemImagePackageXml = systemImageRoot.resolve("package.xml") |
| systemImagePackageXml.createNewFile() |
| systemImagePackageXml.writeText(getSystemImageXml(info)) |
| } |
| } |
| |
| if (configureEmulator) { |
| val emulatorRoot = sdkDir.resolve("emulator") |
| emulatorRoot.mkdirs() |
| |
| val emulatorPackageXml = emulatorRoot.resolve("package.xml") |
| emulatorPackageXml.createNewFile() |
| emulatorPackageXml.writeText(EMULATOR_XML) |
| } |
| } |
| |
| private fun assertAllComponentsAreNull(sdkDirectLoadingStrategy: SdkDirectLoadingStrategy) { |
| assertThat(sdkDirectLoadingStrategy.getAdbExecutable()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getAnnotationsJar()).isNull() |
| |
| assertThat(sdkDirectLoadingStrategy.getAidlFramework()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getAndroidJar()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getAdditionalLibraries()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getOptionalLibraries()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getTargetPlatformVersion()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getTargetBootClasspath()).isNull() |
| |
| assertThat(sdkDirectLoadingStrategy.getBuildToolsRevision()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getAidlExecutable()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getCoreLambaStubs()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getSplitSelectExecutable()).isNull() |
| |
| assertThat(sdkDirectLoadingStrategy.getRenderScriptSupportJar()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getSupportNativeLibFolder()).isNull() |
| assertThat(sdkDirectLoadingStrategy.getSupportBlasLibFolder()).isNull() |
| } |
| |
| private fun assertAllComponentsArePresent(sdkDirectLoadingStrategy: SdkDirectLoadingStrategy, platformHash: String = "android-28") { |
| val sdkRoot = testFolder.root.resolve("sdk") |
| |
| assertThat(sdkDirectLoadingStrategy.getAdbExecutable()).isEqualTo( |
| sdkRoot.resolve("platform-tools/${SdkConstants.FN_ADB}")) |
| |
| assertThat(sdkDirectLoadingStrategy.getAnnotationsJar()).isEqualTo( |
| sdkRoot.resolve("tools/support/${SdkConstants.FN_ANNOTATIONS_JAR}")) |
| |
| assertThat(sdkDirectLoadingStrategy.getAidlFramework()).isEqualTo( |
| sdkRoot.resolve("platforms/$platformHash/${SdkConstants.FN_FRAMEWORK_AIDL}")) |
| assertThat(sdkDirectLoadingStrategy.getAndroidJar()).isEqualTo( |
| sdkRoot.resolve("platforms/$platformHash/${SdkConstants.FN_FRAMEWORK_LIBRARY}")) |
| assertThat(sdkDirectLoadingStrategy.getAdditionalLibraries()).isEmpty() |
| assertThat(sdkDirectLoadingStrategy.getOptionalLibraries()!!.map { it.jar }) |
| .containsExactlyElementsIn(getExpectedOptionalJars(platformHash)) |
| assertThat(sdkDirectLoadingStrategy.getTargetPlatformVersion()!!).isEqualTo( |
| AndroidTargetHash.getVersionFromHash(platformHash)) |
| assertThat(sdkDirectLoadingStrategy.getTargetBootClasspath()).containsExactly( |
| sdkRoot.resolve("platforms/$platformHash/${SdkConstants.FN_FRAMEWORK_LIBRARY}")) |
| if (platformHash.largerThanAndroidSdk30()) { |
| assertThat(sdkDirectLoadingStrategy.getCoreForSystemModulesJar()).isEqualTo( |
| sdkRoot.resolve("platforms/$platformHash/$FN_CORE_FOR_SYSTEM_MODULES") |
| ) |
| } |
| |
| val buildToolDirectory = sdkRoot.resolve("build-tools/30.0.2") |
| assertThat(sdkDirectLoadingStrategy.getBuildToolsRevision()).isEqualTo( |
| ToolsRevisionUtils.MIN_BUILD_TOOLS_REV) |
| assertThat(sdkDirectLoadingStrategy.getAidlExecutable()).isEqualTo( |
| buildToolDirectory.resolve(SdkConstants.FN_AIDL)) |
| assertThat(sdkDirectLoadingStrategy.getCoreLambaStubs()).isEqualTo( |
| buildToolDirectory.resolve(SdkConstants.FN_CORE_LAMBDA_STUBS)) |
| assertThat(sdkDirectLoadingStrategy.getSplitSelectExecutable()).isEqualTo( |
| buildToolDirectory.resolve(SdkConstants.FN_SPLIT_SELECT)) |
| |
| assertThat(sdkDirectLoadingStrategy.getRenderScriptSupportJar()).isEqualTo( |
| RenderScriptProcessor.getSupportJar(buildToolDirectory, true)) |
| assertThat(sdkDirectLoadingStrategy.getSupportNativeLibFolder()).isEqualTo( |
| RenderScriptProcessor.getSupportNativeLibFolder(buildToolDirectory)) |
| assertThat(sdkDirectLoadingStrategy.getSupportBlasLibFolder()).isEqualTo( |
| RenderScriptProcessor.getSupportBlasLibFolder(buildToolDirectory)) |
| } |
| |
| private fun getExpectedOptionalJars(platformHash: String): List<Path> { |
| val optionalDir = testFolder.root.toPath().resolve("sdk/platforms/$platformHash/optional/") |
| return listOf( |
| "org.apache.http.legacy.jar", |
| "android.test.mock.jar", |
| "android.test.base.jar", |
| "android.test.runner.jar").map { optionalDir.resolve(it) } |
| } |
| |
| private fun String.largerThanAndroidSdk30(): Boolean { |
| return this.split("-").last().toInt() >= 30 |
| } |
| } |