blob: d492dbb751db311464943f4c5975dd236c235dcc [file] [log] [blame]
/*
* Copyright 2020 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 androidx.testutils.gradle
import org.junit.rules.ExternalResource
import org.junit.rules.TemporaryFolder
import org.junit.runner.Description
import org.junit.runners.model.Statement
import java.io.File
import java.lang.IllegalStateException
import java.util.Properties
/**
* Test rule that helps to setup android project in tests that run gradle.
*
* It should be used along side with SdkResourceGenerator in your build.gradle file
*/
class ProjectSetupRule : ExternalResource() {
val testProjectDir = TemporaryFolder()
lateinit var props: ProjectProps
val rootDir: File
get() = testProjectDir.root
val buildFile: File
get() = File(rootDir, "build.gradle")
val gradlePropertiesFile: File
get() = File(rootDir, "gradle.properties")
private val repositories: String
get() = """
repositories {
maven { url "${props.prebuiltsRoot}/androidx/external" }
maven { url "${props.prebuiltsRoot}/androidx/internal" }
}
""".trimIndent()
val androidProject: String
get() = """
android {
compileSdkVersion ${props.compileSdkVersion}
buildToolsVersion "${props.buildToolsVersion}"
defaultConfig {
minSdkVersion ${props.minSdkVersion}
}
signingConfigs {
debug {
storeFile file("${props.debugKeystore}")
}
}
}
""".trimIndent()
private val defaultBuildGradle: String
get() = "\n$repositories\n\n$androidProject\n\n"
fun writeDefaultBuildGradle(prefix: String, suffix: String) {
buildFile.writeText(prefix)
buildFile.appendText(defaultBuildGradle)
buildFile.appendText(suffix)
println(buildFile.readText())
}
override fun apply(base: Statement, description: Description): Statement {
return testProjectDir.apply(super.apply(base, description), description)
}
override fun before() {
props = ProjectProps.load()
buildFile.createNewFile()
copyLocalProperties()
writeGradleProperties()
}
private fun copyLocalProperties() {
val localProperties = File(props.rootProjectPath, "local.properties")
if (localProperties.exists()) {
localProperties.copyTo(File(rootDir, "local.properties"), overwrite = true)
} else {
throw IllegalStateException("local.properties doesn't exist at: $localProperties")
}
}
private fun writeGradleProperties() {
gradlePropertiesFile.writer().use {
val props = Properties()
props.setProperty("android.useAndroidX", "true")
props.store(it, null)
}
}
}
data class ProjectProps(
val prebuiltsRoot: String,
val compileSdkVersion: String,
val buildToolsVersion: String,
val minSdkVersion: String,
val debugKeystore: String,
var navigationCommon: String,
val kotlinStblib: String,
val rootProjectPath: String,
val localSupportRepo: String,
val agpDependency: String
) {
companion object {
fun load(): ProjectProps {
val stream = ProjectSetupRule::class.java.classLoader.getResourceAsStream("sdk.prop")
val properties = Properties()
properties.load(stream)
return ProjectProps(
prebuiltsRoot = properties.getProperty("prebuiltsRoot"),
compileSdkVersion = properties.getProperty("compileSdkVersion"),
buildToolsVersion = properties.getProperty("buildToolsVersion"),
minSdkVersion = properties.getProperty("minSdkVersion"),
debugKeystore = properties.getProperty("debugKeystore"),
navigationCommon = properties.getProperty("navigationCommon"),
kotlinStblib = properties.getProperty("kotlinStdlib"),
rootProjectPath = properties.getProperty("rootProjectPath"),
localSupportRepo = properties.getProperty("localSupportRepo"),
agpDependency = properties.getProperty("agpDependency")
)
}
}
}