@@ -6,9 +6,11 @@ package kotlinx.rpc.krpc.test.compat
6
6
7
7
import ch.qos.logback.classic.Logger
8
8
import kotlinx.coroutines.CoroutineScope
9
+ import kotlinx.coroutines.Dispatchers
9
10
import kotlinx.coroutines.ExperimentalCoroutinesApi
10
- import kotlinx.coroutines.debug.DebugProbes
11
11
import kotlinx.coroutines.test.TestScope
12
+ import kotlinx.coroutines.withContext
13
+ import kotlinx.rpc.krpc.test.compat.service.TestStarter
12
14
import kotlinx.rpc.test.runTestWithCoroutinesProbes
13
15
import org.junit.jupiter.api.DynamicTest
14
16
import org.slf4j.LoggerFactory
@@ -22,6 +24,7 @@ import kotlin.time.Duration.Companion.seconds
22
24
enum class Versions {
23
25
v0_9,
24
26
v0_8,
27
+ Latest
25
28
;
26
29
}
27
30
@@ -36,29 +39,48 @@ class VersionRolePair(
36
39
37
40
@Suppress(" unused" )
38
41
val Versions .client get() = VersionRolePair (this , Role .Client )
42
+
39
43
@Suppress(" unused" )
40
44
val Versions .server get() = VersionRolePair (this , Role .Server )
41
45
42
46
abstract 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
45
55
.loadClass(" kotlinx.rpc.krpc.test.compat.service.TestStarter" )
46
56
.getDeclaredConstructor()
47
57
.newInstance() as Starter
48
58
49
- suspend fun close () {
50
- classLoader.close()
59
+ override suspend fun close () {
60
+ withContext(Dispatchers .IO ) {
61
+ classLoader.close()
62
+ }
51
63
starter.stopClient()
52
64
starter.stopServer()
53
65
}
54
66
}
55
67
56
68
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 ->
58
70
val versionResourcePath = javaClass.classLoader.getResource(version.name)!!
59
71
val versionClassLoader = URLClassLoader (arrayOf(versionResourcePath), javaClass.classLoader)
60
72
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()
62
84
}
63
85
}
64
86
@@ -80,20 +102,20 @@ abstract class KrpcProtocolCompatibilityTestsBase {
80
102
timeout : Duration = 10.seconds,
81
103
body : suspend TestEnv .() -> Unit ,
82
104
): 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} " ) {
85
107
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 {
89
116
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()
97
119
}
98
120
}
99
121
}
0 commit comments