Skip to content

Commit d76456f

Browse files
committed
TestCoroutineDispatcher code style cleanup and todos
* Kotlin libraries code style: explicit visibility and other style-issues * DelayController.currentTime() is val * Using atomicfu in place of AtomicXxx classes * Added version to ExperimentCoroutineApi annotations * Some todos are added for future consideration * Fixed long overflows on delay (clamp) and added test * License headers added to files * Tests moved to an appropriate package * Additional ordering tests using TestBase "expect" infrastructure
1 parent fac4860 commit d76456f

13 files changed

+249
-199
lines changed

binary-compatibility-validator/reference-public-api/kotlinx-coroutines-test.txt

+13-26
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,29 @@
11
public abstract interface class kotlinx/coroutines/test/DelayController {
2-
public abstract fun advanceTimeBy (JLjava/util/concurrent/TimeUnit;)J
3-
public abstract fun advanceTimeToNextDelayed ()J
2+
public abstract fun advanceTimeBy (J)J
43
public abstract fun advanceUntilIdle ()J
54
public abstract fun cleanupTestCoroutines ()V
6-
public abstract fun currentTime (Ljava/util/concurrent/TimeUnit;)J
5+
public abstract fun getCurrentTime ()J
76
public abstract fun pauseDispatcher ()V
87
public abstract fun pauseDispatcher (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
98
public abstract fun resumeDispatcher ()V
109
public abstract fun runCurrent ()V
1110
}
1211

13-
public final class kotlinx/coroutines/test/DelayController$DefaultImpls {
14-
public static synthetic fun advanceTimeBy$default (Lkotlinx/coroutines/test/DelayController;JLjava/util/concurrent/TimeUnit;ILjava/lang/Object;)J
15-
public static synthetic fun currentTime$default (Lkotlinx/coroutines/test/DelayController;Ljava/util/concurrent/TimeUnit;ILjava/lang/Object;)J
16-
}
17-
18-
public final class kotlinx/coroutines/test/TestBuilders {
12+
public final class kotlinx/coroutines/test/TestBuildersKt {
1913
public static final fun runBlockingTest (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V
2014
public static final fun runBlockingTest (Lkotlinx/coroutines/test/TestCoroutineDispatcher;Lkotlin/jvm/functions/Function2;)V
2115
public static final fun runBlockingTest (Lkotlinx/coroutines/test/TestCoroutineScope;Lkotlin/jvm/functions/Function2;)V
2216
public static synthetic fun runBlockingTest$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
23-
public static final fun withTestContext (Lkotlinx/coroutines/test/TestCoroutineScope;Lkotlin/jvm/functions/Function2;)V
24-
}
25-
26-
public final class kotlinx/coroutines/test/TestCoroutineCoroutineExceptionHandler : kotlinx/coroutines/CoroutineExceptionHandler, kotlinx/coroutines/test/UncaughtExceptionCaptor {
27-
public fun <init> ()V
28-
public fun cleanupTestCoroutines ()V
29-
public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
30-
public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element;
31-
public synthetic fun getKey ()Lkotlin/coroutines/CoroutineContext$Key;
32-
public fun getKey ()Lkotlinx/coroutines/CoroutineExceptionHandler$Key;
33-
public fun getUncaughtExceptions ()Ljava/util/List;
34-
public fun handleException (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V
35-
public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext;
36-
public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext;
3717
}
3818

3919
public final class kotlinx/coroutines/test/TestCoroutineDispatcher : kotlinx/coroutines/CoroutineDispatcher, kotlinx/coroutines/Delay, kotlinx/coroutines/test/DelayController {
4020
public fun <init> ()V
41-
public fun advanceTimeBy (JLjava/util/concurrent/TimeUnit;)J
42-
public fun advanceTimeToNextDelayed ()J
21+
public fun advanceTimeBy (J)J
4322
public fun advanceUntilIdle ()J
4423
public fun cleanupTestCoroutines ()V
45-
public fun currentTime (Ljava/util/concurrent/TimeUnit;)J
4624
public fun delay (JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
4725
public fun dispatch (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V
26+
public fun getCurrentTime ()J
4827
public fun invokeOnTimeout (JLjava/lang/Runnable;)Lkotlinx/coroutines/DisposableHandle;
4928
public fun pauseDispatcher ()V
5029
public fun pauseDispatcher (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@@ -54,7 +33,15 @@ public final class kotlinx/coroutines/test/TestCoroutineDispatcher : kotlinx/cor
5433
public fun toString ()Ljava/lang/String;
5534
}
5635

36+
public final class kotlinx/coroutines/test/TestCoroutineExceptionHandler : kotlin/coroutines/AbstractCoroutineContextElement, kotlinx/coroutines/CoroutineExceptionHandler, kotlinx/coroutines/test/UncaughtExceptionCaptor {
37+
public fun <init> ()V
38+
public fun cleanupTestCoroutines ()V
39+
public fun getUncaughtExceptions ()Ljava/util/List;
40+
public fun handleException (Lkotlin/coroutines/CoroutineContext;Ljava/lang/Throwable;)V
41+
}
42+
5743
public abstract interface class kotlinx/coroutines/test/TestCoroutineScope : kotlinx/coroutines/CoroutineScope, kotlinx/coroutines/test/DelayController, kotlinx/coroutines/test/UncaughtExceptionCaptor {
44+
public abstract fun cleanupTestCoroutines ()V
5845
}
5946

6047
public final class kotlinx/coroutines/test/TestCoroutineScopeKt {

kotlinx-coroutines-test/src/TestBuilders.kt

+11-21
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
@file:JvmName("TestBuilders")
1+
/*
2+
* Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
24

35
package kotlinx.coroutines.test
46

57
import kotlinx.coroutines.*
6-
import kotlin.coroutines.ContinuationInterceptor
7-
import kotlin.coroutines.CoroutineContext
8+
import kotlin.coroutines.*
89

910
/**
1011
* Executes a [testBody] inside an immediate execution dispatcher.
@@ -39,8 +40,8 @@ import kotlin.coroutines.CoroutineContext
3940
* @param context An optional context that MUST contain a [DelayController] and/or [TestCoroutineExceptionHandler]
4041
* @param testBody The code of the unit-test.
4142
*/
42-
@ExperimentalCoroutinesApi
43-
fun runBlockingTest(context: CoroutineContext? = null, testBody: suspend TestCoroutineScope.() -> Unit) {
43+
@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0
44+
public fun runBlockingTest(context: CoroutineContext? = null, testBody: suspend TestCoroutineScope.() -> Unit) {
4445
val (safeContext, dispatcher) = context.checkArguments()
4546
// smart cast dispatcher to expose interface
4647
dispatcher as DelayController
@@ -69,16 +70,17 @@ private fun CoroutineContext.activeJobs(): Set<Job> {
6970
/**
7071
* Convenience method for calling [runBlockingTest] on an existing [TestCoroutineScope].
7172
*/
72-
@ExperimentalCoroutinesApi
73-
fun TestCoroutineScope.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit) {
73+
// todo: need documentation on how this extension is supposed to be used
74+
@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0
75+
public fun TestCoroutineScope.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit) {
7476
runBlockingTest(coroutineContext, block)
7577
}
7678

7779
/**
7880
* Convenience method for calling [runBlockingTest] on an existing [TestCoroutineDispatcher].
7981
*/
80-
@ExperimentalCoroutinesApi
81-
fun TestCoroutineDispatcher.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit) {
82+
@ExperimentalCoroutinesApi // Since 1.2.1, tentatively till 1.3.0
83+
public fun TestCoroutineDispatcher.runBlockingTest(block: suspend TestCoroutineScope.() -> Unit) {
8284
runBlockingTest(this, block)
8385
}
8486

@@ -103,16 +105,4 @@ private fun CoroutineContext?.checkArguments(): Pair<CoroutineContext, Continuat
103105

104106
safeContext = safeContext + dispatcher + exceptionHandler + job
105107
return Pair(safeContext, dispatcher)
106-
}
107-
108-
/**
109-
* This method is deprecated.
110-
*
111-
* @see [runBlocking]
112-
*/
113-
@Deprecated("This API has been deprecated to integrate with Structured Concurrency.",
114-
ReplaceWith("scope.runBlockingTest(testBody)", "kotlinx.coroutines.test"),
115-
level = DeprecationLevel.ERROR)
116-
fun withTestContext(scope: TestCoroutineScope, testBody: suspend TestCoroutineScope.() -> Unit) {
117-
scope.runBlockingTest(testBody)
118108
}

0 commit comments

Comments
 (0)