Build: Make robolectric tests run offline without downloading artifacts

#KTI-1367
This commit is contained in:
Vyacheslav Gerasimov
2023-09-01 14:02:34 +02:00
committed by Space Team
parent bb8d3a0f80
commit 009cda0c60
5 changed files with 54 additions and 15 deletions
+4 -10
View File
@@ -4775,16 +4775,10 @@
<sha256 value="938a2d08fe54050d7610b944d8ddc3a09355710d9e6be0aac838dbc04e9a2825" origin="Generated by Gradle"/> <sha256 value="938a2d08fe54050d7610b944d8ddc3a09355710d9e6be0aac838dbc04e9a2825" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.robolectric" name="android-all" version="4.4_r1-robolectric-1"> <component group="org.robolectric" name="android-all" version="5.0.2_r3-robolectric-r0">
<artifact name="android-all-4.4_r1-robolectric-1.jar"> <artifact name="android-all-5.0.2_r3-robolectric-r0.jar">
<md5 value="1e478f10e107d1dddad09d32508f2ec9" origin="Generated by Gradle"/> <md5 value="6b57219b0d85fe3131f9628c454ca616" origin="Generated by Gradle"/>
<sha256 value="d41d3ffa6c89398c9e8c3c3659de405994151c040b4a898fc4c885c226732e28" origin="Generated by Gradle"/> <sha256 value="5e63d4c7f2c691afed648bf0675e0b0a76d19f0e23d93705f4faf9ed3b2734de" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.robolectric" name="android-all" version="4.4_r1-robolectric-r2">
<artifact name="android-all-4.4_r1-robolectric-r2.jar">
<md5 value="3098240c179f04b929699e8f2d4b11cf" origin="Generated by Gradle"/>
<sha256 value="5c68ab0a11d6f46e303505e75da62215f45b6a46ff7877441a31d527899359f9" origin="Generated by Gradle"/>
</artifact> </artifact>
</component> </component>
<component group="org.robolectric" name="annotations" version="4.0"> <component group="org.robolectric" name="annotations" version="4.0">
@@ -7,6 +7,8 @@ plugins {
} }
val robolectricClasspath by configurations.creating val robolectricClasspath by configurations.creating
val robolectricDependency by configurations.creating
val androidExtensionsRuntimeForTests by configurations.creating val androidExtensionsRuntimeForTests by configurations.creating
val layoutLib by configurations.creating val layoutLib by configurations.creating
val layoutLibApi by configurations.creating val layoutLibApi by configurations.creating
@@ -37,8 +39,9 @@ dependencies {
testApi(project(":kotlin-test:kotlin-test-jvm")) testApi(project(":kotlin-test:kotlin-test-jvm"))
testApi(commonDependency("junit:junit")) testApi(commonDependency("junit:junit"))
robolectricDependency("org.robolectric:android-all:5.0.2_r3-robolectric-r0")
robolectricClasspath(commonDependency("org.robolectric", "robolectric")) robolectricClasspath(commonDependency("org.robolectric", "robolectric"))
robolectricClasspath("org.robolectric:android-all:4.4_r1-robolectric-1")
robolectricClasspath(project(":kotlin-android-extensions-runtime")) { isTransitive = false } robolectricClasspath(project(":kotlin-android-extensions-runtime")) { isTransitive = false }
embedded(project(":kotlin-android-extensions-runtime")) { isTransitive = false } embedded(project(":kotlin-android-extensions-runtime")) { isTransitive = false }
@@ -65,10 +68,19 @@ javadocJar()
testsJar() testsJar()
val robolectricDependencyDir = "$buildDir/robolectricDependencies"
val prepareRobolectricDependencies by tasks.registering(Copy::class) {
from(robolectricDependency)
into(robolectricDependencyDir)
}
projectTest { projectTest {
dependsOn(androidExtensionsRuntimeForTests) dependsOn(androidExtensionsRuntimeForTests)
dependsOn(robolectricClasspath) dependsOn(robolectricClasspath)
dependsOn(prepareRobolectricDependencies)
dependsOn(":dist") dependsOn(":dist")
workingDir = rootDir workingDir = rootDir
useAndroidJar() useAndroidJar()
@@ -86,6 +98,10 @@ projectTest {
doFirst { doFirst {
systemProperty("androidExtensionsRuntime.classpath", androidExtensionsRuntimeProvider.get()) systemProperty("androidExtensionsRuntime.classpath", androidExtensionsRuntimeProvider.get())
systemProperty("robolectric.classpath", robolectricClasspathProvider.get()) systemProperty("robolectric.classpath", robolectricClasspathProvider.get())
systemProperty("robolectric.offline", "true")
systemProperty("robolectric.dependency.dir", robolectricDependencyDir)
systemProperty("layoutLib.path", layoutLibConf.singleFile.canonicalPath) systemProperty("layoutLib.path", layoutLibConf.singleFile.canonicalPath)
systemProperty("layoutLibApi.path", layoutLibApiConf.singleFile.canonicalPath) systemProperty("layoutLibApi.path", layoutLibApiConf.singleFile.canonicalPath)
} }
@@ -144,13 +144,20 @@ abstract class AbstractParcelBoxTest : CodegenTestCase() {
classFileFactory.getClassFiles().forEach { writeClass(it.relativePath, it.asByteArray()) } classFileFactory.getClassFiles().forEach { writeClass(it.relativePath, it.asByteArray()) }
javaClassesOutputDirectory?.listFiles()?.forEach { writeClass(it.name, it.readBytes()) } javaClassesOutputDirectory?.listFiles()?.forEach { writeClass(it.name, it.readBytes()) }
val robolectricProperties = System.getProperties().propertyNames().asSequence()
.map { it.toString() }.filter { it.startsWith("robolectric") }
.map { "-D$it=${System.getProperty(it)}" }
.toList()
.toTypedArray()
val process = ProcessBuilder( val process = ProcessBuilder(
javaExe.absolutePath, javaExe.absolutePath,
"-ea", "-ea",
"-classpath", "-classpath",
(libraryClasspath + dirForTestClasses).joinToString(File.pathSeparator), (libraryClasspath + dirForTestClasses).joinToString(File.pathSeparator),
*robolectricProperties,
JUnitCore::class.java.name, JUnitCore::class.java.name,
JUNIT_GENERATED_TEST_CLASS_FQNAME JUNIT_GENERATED_TEST_CLASS_FQNAME,
).start() ).start()
val out = process.inputStream.bufferedReader().lineSequence().joinToString("\n") val out = process.inputStream.bufferedReader().lineSequence().joinToString("\n")
@@ -6,6 +6,8 @@ plugins {
} }
val robolectricClasspath by configurations.creating val robolectricClasspath by configurations.creating
val robolectricDependency by configurations.creating
val parcelizeRuntimeForTests by configurations.creating val parcelizeRuntimeForTests by configurations.creating
val layoutLib by configurations.creating val layoutLib by configurations.creating
val layoutLibApi by configurations.creating val layoutLibApi by configurations.creating
@@ -53,8 +55,9 @@ dependencies {
testApi(commonDependency("junit:junit")) testApi(commonDependency("junit:junit"))
robolectricDependency("org.robolectric:android-all:5.0.2_r3-robolectric-r0")
robolectricClasspath(commonDependency("org.robolectric", "robolectric")) robolectricClasspath(commonDependency("org.robolectric", "robolectric"))
robolectricClasspath("org.robolectric:android-all:4.4_r1-robolectric-r2")
robolectricClasspath(project(":plugins:parcelize:parcelize-runtime")) { isTransitive = false } robolectricClasspath(project(":plugins:parcelize:parcelize-runtime")) { isTransitive = false }
robolectricClasspath(project(":kotlin-android-extensions-runtime")) { isTransitive = false } robolectricClasspath(project(":kotlin-android-extensions-runtime")) { isTransitive = false }
@@ -81,10 +84,19 @@ sourcesJar()
javadocJar() javadocJar()
testsJar() testsJar()
val robolectricDependencyDir = "$buildDir/robolectricDependencies"
val prepareRobolectricDependencies by tasks.registering(Copy::class) {
from(robolectricDependency)
into(robolectricDependencyDir)
}
projectTest(jUnitMode = JUnitMode.JUnit5) { projectTest(jUnitMode = JUnitMode.JUnit5) {
useJUnitPlatform() useJUnitPlatform()
dependsOn(parcelizeRuntimeForTests) dependsOn(parcelizeRuntimeForTests)
dependsOn(robolectricClasspath) dependsOn(robolectricClasspath)
dependsOn(robolectricDependency)
dependsOn(prepareRobolectricDependencies)
dependsOn(":dist") dependsOn(":dist")
workingDir = rootDir workingDir = rootDir
useAndroidJar() useAndroidJar()
@@ -96,6 +108,10 @@ projectTest(jUnitMode = JUnitMode.JUnit5) {
doFirst { doFirst {
systemProperty("parcelizeRuntime.classpath", parcelizeRuntimeForTestsConf.asPath) systemProperty("parcelizeRuntime.classpath", parcelizeRuntimeForTestsConf.asPath)
systemProperty("robolectric.classpath", robolectricClasspathConf.asPath) systemProperty("robolectric.classpath", robolectricClasspathConf.asPath)
systemProperty("robolectric.offline", "true")
systemProperty("robolectric.dependency.dir", robolectricDependencyDir)
systemProperty("layoutLib.path", layoutLibConf.singleFile.canonicalPath) systemProperty("layoutLib.path", layoutLibConf.singleFile.canonicalPath)
systemProperty("layoutLibApi.path", layoutLibApiConf.singleFile.canonicalPath) systemProperty("layoutLibApi.path", layoutLibApiConf.singleFile.canonicalPath)
} }
@@ -8,13 +8,19 @@ package org.jetbrains.kotlin.parcelize.test.services
import org.jetbrains.kotlin.parcelize.test.services.ParcelizeRuntimeClasspathProvider.Companion.JUNIT_GENERATED_TEST_CLASS_FQNAME import org.jetbrains.kotlin.parcelize.test.services.ParcelizeRuntimeClasspathProvider.Companion.JUNIT_GENERATED_TEST_CLASS_FQNAME
import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.jvm.JvmBoxMainClassProvider import org.jetbrains.kotlin.test.services.jvm.JvmBoxMainClassProvider
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.junit.runner.JUnitCore import org.junit.runner.JUnitCore
class ParcelizeMainClassProvider(testServices: TestServices) : JvmBoxMainClassProvider(testServices) { class ParcelizeMainClassProvider(testServices: TestServices) : JvmBoxMainClassProvider(testServices) {
override fun getMainClassNameAndAdditionalArguments(): List<String> { override fun getMainClassNameAndAdditionalArguments(): List<String> {
val robolectricProperties = System.getProperties().propertyNames().asSequence()
.map { it.toString() }.filter { it.startsWith("robolectric") }
.map { "-D$it=${System.getProperty(it)}" }
.toList()
.toTypedArray()
return listOfNotNull( return listOfNotNull(
"-Drobolectric.dependency.repo.url=https://cache-redirector.jetbrains.com/maven-central" *robolectricProperties,
.takeIf { "true" == System.getProperty("cacheRedirectorEnabled") },
JUnitCore::class.java.name, JUnitCore::class.java.name,
JUNIT_GENERATED_TEST_CLASS_FQNAME JUNIT_GENERATED_TEST_CLASS_FQNAME
) )