Skip to content

Commit 32217bd

Browse files
committed
Timed parking test improvements: parameterize tests, more slack in time asserts, cover parkUntil
1 parent 524811c commit 32217bd

File tree

1 file changed

+29
-144
lines changed

1 file changed

+29
-144
lines changed

atomicfu/src/concurrentTest/kotlin/kotlinx/atomicfu/locks/TimedParkingTest.kt

Lines changed: 29 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -6,176 +6,61 @@ import kotlin.test.assertTrue
66
import kotlin.time.measureTime
77
import kotlin.IllegalStateException
88
import kotlin.time.Duration.Companion.milliseconds
9-
import kotlin.time.Duration.Companion.nanoseconds
9+
import kotlin.time.TimeSource
1010

1111
class TimedParkingTest {
1212

1313
@Test
14-
fun testNanosFirstUnpark400() = retry(3) {
15-
var handle1: ParkingHandle? = null
16-
17-
val thread1 = Fut {
18-
handle1 = ParkingSupport.currentThreadHandle()
19-
val t = measureTime {
20-
ParkingSupport.park(600.milliseconds)
21-
}
22-
assertTrue(t.inWholeMilliseconds > 300)
23-
assertTrue(t.inWholeMilliseconds < 500)
24-
}
25-
26-
sleepMillis(400)
27-
ParkingSupport.unpark(handle1!!)
28-
29-
thread1.waitThrowing()
30-
}
31-
14+
fun testFirstUnpark400() = testFirstUnpark(400)
3215
@Test
33-
fun testNanosFirstUnpark700() = retry(3) {
34-
var handle1: ParkingHandle? = null
35-
36-
val thread1 = Fut {
37-
handle1 = ParkingSupport.currentThreadHandle()
38-
val t = measureTime {
39-
ParkingSupport.park(900.milliseconds)
40-
}
41-
assertTrue(t.inWholeMilliseconds > 600)
42-
assertTrue(t.inWholeMilliseconds < 800)
43-
}
44-
45-
sleepMillis(700)
46-
ParkingSupport.unpark(handle1!!)
47-
48-
thread1.waitThrowing()
49-
}
50-
16+
fun testFirstUnpark700() = testFirstUnpark(700)
5117
@Test
52-
fun testNanosFirstUnpark1000() = retry(3) {
53-
var handle1: ParkingHandle? = null
54-
55-
val thread1 = Fut {
56-
handle1 = ParkingSupport.currentThreadHandle()
57-
val t = measureTime {
58-
ParkingSupport.park(1200.milliseconds)
59-
}
60-
assertTrue(t.inWholeMilliseconds > 900)
61-
assertTrue(t.inWholeMilliseconds < 1100)
62-
}
63-
64-
sleepMillis(1000)
65-
ParkingSupport.unpark(handle1!!)
66-
67-
thread1.waitThrowing()
68-
}
69-
18+
fun testFirstUnpark1000() = testFirstUnpark(1000)
7019
@Test
71-
fun testNanosFirstUnparkLongMax() = retry(3) {
72-
var handle1: ParkingHandle? = null
73-
74-
val thread1 = Fut {
75-
handle1 = ParkingSupport.currentThreadHandle()
76-
val t = measureTime {
77-
ParkingSupport.park(Long.MAX_VALUE.nanoseconds)
78-
}
79-
assertTrue(t.inWholeMilliseconds > 900)
80-
assertTrue(t.inWholeMilliseconds < 1100)
81-
}
82-
83-
sleepMillis(1000)
84-
ParkingSupport.unpark(handle1!!)
85-
86-
thread1.waitThrowing()
87-
}
88-
20+
fun testFirstUnparkLongMax() = testFirstUnpark(1000, Long.MAX_VALUE)
8921
@Test
90-
fun testNanosFirstUnparkIntMax() = retry(3) {
91-
var handle1: ParkingHandle? = null
92-
93-
val thread1 = Fut {
94-
handle1 = ParkingSupport.currentThreadHandle()
95-
val t = measureTime {
96-
ParkingSupport.park(Int.MAX_VALUE.toLong().nanoseconds)
97-
}
98-
assertTrue(t.inWholeMilliseconds > 900)
99-
assertTrue(t.inWholeMilliseconds < 1100)
100-
}
22+
fun testFirstUnpark3rdLong() = testFirstUnpark(1000, Long.MAX_VALUE / 3)
10123

102-
sleepMillis(1000)
103-
ParkingSupport.unpark(handle1!!)
104-
105-
thread1.waitThrowing()
106-
}
107-
10824
@Test
109-
fun testNanosFirstUnpark3rdLong() = retry(3) {
110-
var handle1: ParkingHandle? = null
111-
112-
val thread1 = Fut {
113-
handle1 = ParkingSupport.currentThreadHandle()
114-
val t = measureTime {
115-
ParkingSupport.park((Long.MAX_VALUE / 3).nanoseconds)
116-
}
117-
assertTrue(t.inWholeMilliseconds > 900)
118-
assertTrue(t.inWholeMilliseconds < 1100)
119-
}
120-
121-
sleepMillis(1000)
122-
ParkingSupport.unpark(handle1!!)
123-
124-
thread1.waitThrowing()
125-
}
126-
25+
fun testFirstTimeout400() = testFirstTimeout(400)
12726
@Test
128-
fun testNanosFirstDeadline400() = retry(3) {
129-
var handle1: ParkingHandle? = null
27+
fun testFirstTimeout700() = testFirstTimeout(700)
28+
@Test
29+
fun testFirstTimeout1200() = testFirstTimeout(1200)
13030

31+
@Test
32+
fun testFirstDeadline400() = testFirstDeadline(400)
33+
@Test
34+
fun testFirstDeadline700() = testFirstDeadline(700)
35+
@Test
36+
fun testFirstDeadline1200() = testFirstDeadline(1200)
37+
38+
private fun testFirstTimeout(timeOutMillis: Long) = retry(3) {
13139
val thread1 = Fut {
132-
handle1 = ParkingSupport.currentThreadHandle()
133-
val t = measureTime {
134-
ParkingSupport.park(400.milliseconds)
135-
}
136-
assertTrue(t.inWholeMilliseconds > 300)
137-
assertTrue(t.inWholeMilliseconds < 500)
40+
val t = measureTime { ParkingSupport.park(timeOutMillis.milliseconds) }
41+
assertTrue(t.inWholeMilliseconds > timeOutMillis - 50)
13842
}
139-
140-
sleepMillis(600)
141-
ParkingSupport.unpark(handle1!!)
142-
14343
thread1.waitThrowing()
14444
}
145-
146-
@Test
147-
fun testNanosFirstDeadline700() = retry(3) {
148-
var handle1: ParkingHandle? = null
149-
45+
46+
private fun testFirstDeadline(timeOutMillis: Long) = retry(3) {
15047
val thread1 = Fut {
151-
handle1 = ParkingSupport.currentThreadHandle()
152-
val t = measureTime {
153-
ParkingSupport.park(700.milliseconds)
154-
}
155-
assertTrue(t.inWholeMilliseconds > 600)
156-
assertTrue(t.inWholeMilliseconds < 800)
48+
val mark = TimeSource.Monotonic.markNow() + timeOutMillis.milliseconds
49+
val t = measureTime { ParkingSupport.parkUntil(mark) }
50+
assertTrue(t.inWholeMilliseconds > timeOutMillis - 50)
15751
}
158-
159-
sleepMillis(900)
160-
ParkingSupport.unpark(handle1!!)
161-
16252
thread1.waitThrowing()
16353
}
16454

165-
@Test
166-
fun testNanosFirstDeadline1200() = retry(3) {
55+
private fun testFirstUnpark(unparkAfterMillis: Long, parkForMillis: Long = unparkAfterMillis + 500) = retry(3) {
16756
var handle1: ParkingHandle? = null
168-
16957
val thread1 = Fut {
17058
handle1 = ParkingSupport.currentThreadHandle()
171-
val t = measureTime {
172-
ParkingSupport.park(1000.milliseconds)
173-
}
174-
assertTrue(t.inWholeMilliseconds > 900)
175-
assertTrue(t.inWholeMilliseconds < 1100)
59+
val t = measureTime { ParkingSupport.park((parkForMillis).milliseconds) }
60+
assertTrue(t.inWholeMilliseconds < parkForMillis )
17661
}
17762

178-
sleepMillis(1200)
63+
sleepMillis(unparkAfterMillis)
17964
ParkingSupport.unpark(handle1!!)
18065

18166
thread1.waitThrowing()

0 commit comments

Comments
 (0)