[Native][tests] Refactoring: Move configuration properties that can be overridden to class-level settings

This commit is contained in:
Dmitriy Dolovov
2022-01-26 16:47:48 +03:00
parent 709101a56b
commit 5d1884d8dc
@@ -71,10 +71,42 @@ class NativeSimpleTestSupport : BeforeEachCallback {
} }
private object NativeTestSupport { private object NativeTestSupport {
private val NAMESPACE = ExtensionContext.Namespace.create(NativeBlackBoxTestSupport::class.java.simpleName)
/*************** Test process settings ***************/ /*************** Test process settings ***************/
fun ExtensionContext.getOrCreateTestProcessSettings(): TestProcessSettings = fun ExtensionContext.getOrCreateTestProcessSettings(): TestProcessSettings =
root.getStore(NAMESPACE).getOrComputeIfAbsent(TestProcessSettings::class.java.name) { root.getStore(NAMESPACE).getOrComputeIfAbsent(TestProcessSettings::class.java.name) {
TestProcessSettings(
computeNativeHome(),
computeNativeClassLoader(),
computeBaseDirs()
)
}.cast()
private fun computeNativeHome(): KotlinNativeHome = KotlinNativeHome(File(ProcessLevelProperty.KOTLIN_NATIVE_HOME.readValue()))
private fun computeNativeClassLoader(): KotlinNativeClassLoader = KotlinNativeClassLoader(
lazy {
val nativeClassPath = ProcessLevelProperty.COMPILER_CLASSPATH.readValue()
.split(':', ';')
.map { File(it).toURI().toURL() }
.toTypedArray()
URLClassLoader(nativeClassPath, /* no parent class loader */ null).apply { setDefaultAssertionStatus(true) }
}
)
private fun computeBaseDirs(): BaseDirs {
val testBuildDir = File(EnvironmentVariable.PROJECT_BUILD_DIR.readValue()).resolve("t")
testBuildDir.mkdirs() // Make sure it exists. Don't clean up.
return BaseDirs(testBuildDir)
}
/*************** Test class settings (common part) ***************/
private fun ExtensionContext.addCommonTestClassSettingsTo(output: MutableCollection<Any>) {
val optimizationMode = computeOptimizationMode() val optimizationMode = computeOptimizationMode()
val memoryModel = computeMemoryModel() val memoryModel = computeMemoryModel()
@@ -95,49 +127,21 @@ private object NativeTestSupport {
} }
} }
val nativeHome = computeNativeHome() val nativeHome = getOrCreateTestProcessSettings().get<KotlinNativeHome>()
val hostManager = HostManager(distribution = Distribution(nativeHome.dir.path), experimental = false)
val hostManager = HostManager(distribution = Distribution(nativeHome.dir.path), experimental = false)
val nativeTargets = computeNativeTargets(hostManager) val nativeTargets = computeNativeTargets(hostManager)
TestProcessSettings( output += optimizationMode
nativeTargets, output += memoryModel
nativeHome, output += threadStateChecker
computeNativeClassLoader(), output += gcType
computeTestMode(), output += nativeTargets
optimizationMode, output += CacheMode::class to computeCacheMode(nativeHome, nativeTargets, optimizationMode)
memoryModel, output += computeTestMode()
threadStateChecker, output += computeTimeouts()
gcType,
CacheMode::class to computeCacheMode(nativeHome, nativeTargets, optimizationMode),
computeBaseDirs(),
computeTimeouts()
)
}.cast()
private fun computeNativeTargets(hostManager: HostManager): KotlinNativeTargets {
val hostTarget = HostManager.host
return KotlinNativeTargets(
testTarget = ClassLevelProperty.TEST_TARGET.readValue(hostManager::targetByName, default = hostTarget),
hostTarget = hostTarget
)
} }
private fun computeNativeHome(): KotlinNativeHome = KotlinNativeHome(File(ProcessLevelProperty.KOTLIN_NATIVE_HOME.readValue()))
private fun computeNativeClassLoader(): KotlinNativeClassLoader = KotlinNativeClassLoader(
lazy {
val nativeClassPath = ProcessLevelProperty.COMPILER_CLASSPATH.readValue()
.split(':', ';')
.map { File(it).toURI().toURL() }
.toTypedArray()
URLClassLoader(nativeClassPath, /* no parent class loader */ null).apply { setDefaultAssertionStatus(true) }
}
)
private fun computeTestMode(): TestMode = ClassLevelProperty.TEST_MODE.readValue(TestMode.values(), default = TestMode.WITH_MODULES)
private fun computeOptimizationMode(): OptimizationMode = private fun computeOptimizationMode(): OptimizationMode =
ClassLevelProperty.OPTIMIZATION_MODE.readValue(OptimizationMode.values(), default = OptimizationMode.DEBUG) ClassLevelProperty.OPTIMIZATION_MODE.readValue(OptimizationMode.values(), default = OptimizationMode.DEBUG)
@@ -151,6 +155,14 @@ private object NativeTestSupport {
private fun computeGCType(): GCType = ClassLevelProperty.GC_TYPE.readValue(GCType.values(), default = GCType.UNSPECIFIED) private fun computeGCType(): GCType = ClassLevelProperty.GC_TYPE.readValue(GCType.values(), default = GCType.UNSPECIFIED)
private fun computeNativeTargets(hostManager: HostManager): KotlinNativeTargets {
val hostTarget = HostManager.host
return KotlinNativeTargets(
testTarget = ClassLevelProperty.TEST_TARGET.readValue(hostManager::targetByName, default = hostTarget),
hostTarget = hostTarget
)
}
private fun computeCacheMode( private fun computeCacheMode(
kotlinNativeHome: KotlinNativeHome, kotlinNativeHome: KotlinNativeHome,
kotlinNativeTargets: KotlinNativeTargets, kotlinNativeTargets: KotlinNativeTargets,
@@ -175,20 +187,13 @@ private object NativeTestSupport {
return CacheMode.WithStaticCache(kotlinNativeHome, kotlinNativeTargets, optimizationMode, staticCacheRequiredForEveryLibrary) return CacheMode.WithStaticCache(kotlinNativeHome, kotlinNativeTargets, optimizationMode, staticCacheRequiredForEveryLibrary)
} }
private fun computeBaseDirs(): BaseDirs { private fun computeTestMode(): TestMode = ClassLevelProperty.TEST_MODE.readValue(TestMode.values(), default = TestMode.WITH_MODULES)
val testBuildDir = File(EnvironmentVariable.PROJECT_BUILD_DIR.readValue()).resolve("t")
testBuildDir.mkdirs() // Make sure it exists. Don't clean up.
return BaseDirs(testBuildDir)
}
private fun computeTimeouts(): Timeouts { private fun computeTimeouts(): Timeouts {
val executionTimeout = ClassLevelProperty.EXECUTION_TIMEOUT.readValue({ it.toLongOrNull()?.milliseconds }, default = 10.seconds) val executionTimeout = ClassLevelProperty.EXECUTION_TIMEOUT.readValue({ it.toLongOrNull()?.milliseconds }, default = 10.seconds)
return Timeouts(executionTimeout) return Timeouts(executionTimeout)
} }
private val NAMESPACE = ExtensionContext.Namespace.create(NativeBlackBoxTestSupport::class.java.simpleName)
/*************** Test class settings (for black box tests only) ***************/ /*************** Test class settings (for black box tests only) ***************/
private fun ExtensionContext.getOrCreateTestClassSettings(): TestClassSettings = private fun ExtensionContext.getOrCreateTestClassSettings(): TestClassSettings =
@@ -198,15 +203,17 @@ private object NativeTestSupport {
val testProcessSettings = getOrCreateTestProcessSettings() val testProcessSettings = getOrCreateTestProcessSettings()
val computedTestConfiguration = computeTestConfiguration(enclosingTestClass) val computedTestConfiguration = computeTestConfiguration(enclosingTestClass)
val settings = buildList {
// Put common settings:
addCommonTestClassSettingsTo(this)
// Put settings that are always required: // Put settings that are always required:
val settings = mutableListOf( this += computedTestConfiguration
computedTestConfiguration, this += computeBinariesDirs(testProcessSettings.get(), testProcessSettings.get(), enclosingTestClass)
computeBinariesDirs(testProcessSettings.get(), testProcessSettings.get(), enclosingTestClass)
)
// Add custom settings: // Add custom settings:
computedTestConfiguration.configuration.requiredSettings.mapTo(settings) { clazz -> computedTestConfiguration.configuration.requiredSettings.forEach { clazz ->
when (clazz) { this += when (clazz) {
TestRoots::class -> computeTestRoots(enclosingTestClass) TestRoots::class -> computeTestRoots(enclosingTestClass)
GeneratedSources::class -> computeGeneratedSourceDirs( GeneratedSources::class -> computeGeneratedSourceDirs(
testProcessSettings.get(), testProcessSettings.get(),
@@ -216,6 +223,7 @@ private object NativeTestSupport {
else -> fail { "Unknown test class setting type: $clazz" } else -> fail { "Unknown test class setting type: $clazz" }
} }
} }
}
TestClassSettings(parent = testProcessSettings, settings) TestClassSettings(parent = testProcessSettings, settings)
}.cast() }.cast()
@@ -315,13 +323,13 @@ private object NativeTestSupport {
fun ExtensionContext.createSimpleTestRunSettings(): SimpleTestRunSettings { fun ExtensionContext.createSimpleTestRunSettings(): SimpleTestRunSettings {
val testProcessSettings = getOrCreateTestProcessSettings() val testProcessSettings = getOrCreateTestProcessSettings()
return SimpleTestRunSettings( val settings = buildList {
parent = testProcessSettings, addCommonTestClassSettingsTo(this)
listOf( this += computeSimpleTestInstances()
computeSimpleTestInstances(), this += computeSimpleTestDirectories(testProcessSettings.get(), testProcessSettings.get())
computeSimpleTestDirectories(testProcessSettings.get(), testProcessSettings.get()) }
)
) return SimpleTestRunSettings(parent = testProcessSettings, settings)
} }
private fun ExtensionContext.computeSimpleTestInstances(): SimpleTestInstances = SimpleTestInstances(requiredTestInstances.allInstances) private fun ExtensionContext.computeSimpleTestInstances(): SimpleTestInstances = SimpleTestInstances(requiredTestInstances.allInstances)