@@ -6,9 +6,11 @@ package kotlinx.rpc.krpc.test.compat
66
77import ch.qos.logback.classic.Logger
88import kotlinx.coroutines.CoroutineScope
9+ import kotlinx.coroutines.Dispatchers
910import kotlinx.coroutines.ExperimentalCoroutinesApi
10- import kotlinx.coroutines.debug.DebugProbes
1111import kotlinx.coroutines.test.TestScope
12+ import kotlinx.coroutines.withContext
13+ import kotlinx.rpc.krpc.test.compat.service.TestStarter
1214import kotlinx.rpc.test.runTestWithCoroutinesProbes
1315import org.junit.jupiter.api.DynamicTest
1416import org.slf4j.LoggerFactory
@@ -22,6 +24,7 @@ import kotlin.time.Duration.Companion.seconds
2224enum class Versions {
2325 v0_9,
2426 v0_8,
27+ Latest
2528 ;
2629}
2730
@@ -36,29 +39,48 @@ class VersionRolePair(
3639
3740@Suppress(" unused" )
3841val Versions .client get() = VersionRolePair (this , Role .Client )
42+
3943@Suppress(" unused" )
4044val Versions .server get() = VersionRolePair (this , Role .Server )
4145
4246abstract class KrpcProtocolCompatibilityTestsBase {
43- class LoadedStarter (val version : Versions , val classLoader : URLClassLoader ) {
44- val starter = classLoader
47+ interface LoadedStarter {
48+ val version: Versions
49+ val starter: Starter
50+ suspend fun close ()
51+ }
52+
53+ class LoadedStarterImpl (override val version : Versions , val classLoader : URLClassLoader ) : LoadedStarter {
54+ override val starter = classLoader
4555 .loadClass(" kotlinx.rpc.krpc.test.compat.service.TestStarter" )
4656 .getDeclaredConstructor()
4757 .newInstance() as Starter
4858
49- suspend fun close () {
50- classLoader.close()
59+ override suspend fun close () {
60+ withContext(Dispatchers .IO ) {
61+ classLoader.close()
62+ }
5163 starter.stopClient()
5264 starter.stopServer()
5365 }
5466 }
5567
5668 private fun prepareStarters (exclude : List <Versions >): List <LoadedStarter > {
57- return Versions .entries.filter { it !in exclude }.map { version ->
69+ return Versions .entries.filter { it !in exclude && it != Versions . Latest }.map { version ->
5870 val versionResourcePath = javaClass.classLoader.getResource(version.name)!!
5971 val versionClassLoader = URLClassLoader (arrayOf(versionResourcePath), javaClass.classLoader)
6072
61- LoadedStarter (version, versionClassLoader)
73+ LoadedStarterImpl (version, versionClassLoader)
74+ } + latestStarter()
75+ }
76+
77+ private fun latestStarter () = object : LoadedStarter {
78+ override val version: Versions = Versions .Latest
79+ override val starter: Starter = TestStarter ()
80+
81+ override suspend fun close () {
82+ starter.stopClient()
83+ starter.stopServer()
6284 }
6385 }
6486
@@ -80,20 +102,20 @@ abstract class KrpcProtocolCompatibilityTestsBase {
80102 timeout : Duration = 10.seconds,
81103 body : suspend TestEnv .() -> Unit ,
82104 ): Stream <DynamicTest > {
83- return prepareStarters(exclude).map {
84- DynamicTest .dynamicTest(" $role ${it .version} " ) {
105+ return prepareStarters(exclude).map { old ->
106+ DynamicTest .dynamicTest(" $role ${old .version} " ) {
85107 runTestWithCoroutinesProbes(timeout = timeout) {
86- DebugProbes .withDebugProbes {
87- val root = LoggerFactory .getLogger(org.slf4j.Logger .ROOT_LOGGER_NAME ) as Logger
88- val testAppender = root.getAppender(" TEST" ) as TestLogAppender
108+ val root = LoggerFactory .getLogger(org.slf4j.Logger .ROOT_LOGGER_NAME ) as Logger
109+ val testAppender = root.getAppender(" TEST" ) as TestLogAppender
110+ testAppender.events.clear()
111+ val new = latestStarter()
112+ try {
113+ val env = TestEnv (old.starter, new.starter, testAppender, this )
114+ body(env)
115+ } finally {
89116 testAppender.events.clear()
90- try {
91- val env = TestEnv (it.starter, it.starter, testAppender, this )
92- body(env)
93- } finally {
94- testAppender.events.clear()
95- it.close()
96- }
117+ old.close()
118+ new.close()
97119 }
98120 }
99121 }
0 commit comments