Skip to content

Commit 34e9d51

Browse files
authored
KTOR-2914 Change exception type and clarify message (#3201)
* KTOR-2914 Change exception type and clarify message
1 parent 298e0ad commit 34e9d51

2 files changed

Lines changed: 54 additions & 8 deletions

File tree

ktor-network/jvm/src/io/ktor/network/selector/SelectorManagerSupport.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package io.ktor.network.selector
66

7+
import io.ktor.utils.io.errors.*
78
import kotlinx.coroutines.*
89
import java.nio.channels.*
910
import java.nio.channels.spi.*
@@ -33,15 +34,9 @@ public abstract class SelectorManagerSupport internal constructor() : SelectorMa
3334
public final override suspend fun select(selectable: Selectable, interest: SelectInterest) {
3435
val interestedOps = selectable.interestedOps
3536
val flag = interest.flag
36-
if (interestedOps and flag == 0) {
37-
val message = if (selectable.isClosed) {
38-
"Selectable is closed"
39-
} else {
40-
"Selectable is invalid state: $interestedOps, $flag"
41-
}
4237

43-
throw IllegalArgumentException(message)
44-
}
38+
if (selectable.isClosed) selectableIsClosed()
39+
if (interestedOps and flag == 0) selectableIsInvalid(interestedOps, flag)
4540

4641
suspendCancellableCoroutine<Unit> { continuation ->
4742
continuation.invokeOnCancellation {
@@ -179,3 +174,11 @@ public abstract class SelectorManagerSupport internal constructor() : SelectorMa
179174

180175
public class ClosedSelectorCancellationException : CancellationException("Closed selector")
181176
}
177+
178+
private fun selectableIsClosed(): Nothing {
179+
throw IOException("Selectable is already closed")
180+
}
181+
182+
private fun selectableIsInvalid(interestedOps: Int, flag: Int): Nothing {
183+
error("Selectable is invalid state: $interestedOps, $flag")
184+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2014-2022 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package io.ktor.network.selector
6+
7+
import io.mockk.*
8+
import kotlinx.coroutines.*
9+
import org.junit.*
10+
import org.junit.Test
11+
import java.io.*
12+
import kotlin.test.*
13+
14+
class ActorSelectorManagerTest {
15+
val manager = ActorSelectorManager(Dispatchers.Default)
16+
17+
@After
18+
fun tearDown() {
19+
manager.close()
20+
}
21+
22+
@Test
23+
fun testSelectableIsClosed(): Unit = runBlocking {
24+
val selectable: Selectable = mockk()
25+
every { selectable.interestedOps } returns SelectInterest.READ.flag
26+
every { selectable.isClosed } returns true
27+
28+
assertFailsWith<IOException> {
29+
manager.select(selectable, SelectInterest.READ)
30+
}
31+
}
32+
33+
@Test
34+
fun testSelectOnWrongInterest(): Unit = runBlocking {
35+
val selectable: Selectable = mockk()
36+
every { selectable.interestedOps } returns SelectInterest.READ.flag
37+
every { selectable.isClosed } returns false
38+
39+
assertFailsWith<IllegalStateException> {
40+
manager.select(selectable, SelectInterest.WRITE)
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)