From a8350a3f5e3d1e47c0a92ed14f85c28135790469 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 6 Sep 2022 18:07:56 +0000 Subject: [PATCH 1/3] Make cancelable for tests --- .../src/test/scala/epollcat/TcpSuite.scala | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/shared/src/test/scala/epollcat/TcpSuite.scala b/tests/shared/src/test/scala/epollcat/TcpSuite.scala index 21780af..9811f7b 100644 --- a/tests/shared/src/test/scala/epollcat/TcpSuite.scala +++ b/tests/shared/src/test/scala/epollcat/TcpSuite.scala @@ -33,6 +33,8 @@ import java.nio.channels.AsynchronousSocketChannel import java.nio.channels.ClosedChannelException import java.nio.channels.CompletionHandler import java.nio.charset.StandardCharsets +import scala.concurrent.TimeoutException +import scala.concurrent.duration._ class TcpSuite extends EpollcatSuite { @@ -79,8 +81,15 @@ class TcpSuite extends EpollcatSuite { def accept: Resource[IO, IOSocketChannel] = Resource - .make(IO.async_[AsynchronousSocketChannel](cb => ch.accept(null, toHandler(cb))))(ch => - IO(ch.close())) + .makeFull[IO, AsynchronousSocketChannel] { poll => + poll { + IO.async { cb => + IO(ch.accept(null, toHandler(cb))) + // it seems the only way to cancel accept is to close the socket :( + .as(Some(IO(ch.close()))) + } + } + }(ch => IO(ch.close())) .map(new IOSocketChannel(_)) def setOption[T](option: SocketOption[T], value: T): IO[Unit] = @@ -270,4 +279,16 @@ class TcpSuite extends EpollcatSuite { } } + test("IOServerSocketChannel.accept is cancelable") { + // note that this test targets IOServerSocketChannel#accept, + // not the underlying AsynchronousSocketChannel#accept implementation + IOServerSocketChannel + .open + .evalTap(_.bind(new InetSocketAddress(0))) + .flatMap(_.accept) + .use_ + .timeout(100.millis) + .intercept[TimeoutException] + } + } From 7d8c992e8b6e87949ed4cd382a03326b0e338dbd Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 6 Sep 2022 18:11:00 +0000 Subject: [PATCH 2/3] Additional closes have no effect, per Javadoc --- .../epollcat/internal/ch/EpollAsyncServerSocketChannel.scala | 2 +- .../scala/epollcat/internal/ch/EpollAsyncSocketChannel.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/epollcat/internal/ch/EpollAsyncServerSocketChannel.scala b/core/src/main/scala/epollcat/internal/ch/EpollAsyncServerSocketChannel.scala index cb53096..8b98abf 100644 --- a/core/src/main/scala/epollcat/internal/ch/EpollAsyncServerSocketChannel.scala +++ b/core/src/main/scala/epollcat/internal/ch/EpollAsyncServerSocketChannel.scala @@ -54,7 +54,7 @@ final class EpollAsyncServerSocketChannel private (fd: Int) } } - def close(): Unit = { + def close(): Unit = if (isOpen()) { _isOpen = false unmonitor.run() if (posix.unistd.close(fd) == -1) diff --git a/core/src/main/scala/epollcat/internal/ch/EpollAsyncSocketChannel.scala b/core/src/main/scala/epollcat/internal/ch/EpollAsyncSocketChannel.scala index 351738f..4397375 100644 --- a/core/src/main/scala/epollcat/internal/ch/EpollAsyncSocketChannel.scala +++ b/core/src/main/scala/epollcat/internal/ch/EpollAsyncSocketChannel.scala @@ -67,7 +67,7 @@ final class EpollAsyncSocketChannel private (fd: Int) } } - def close(): Unit = { + def close(): Unit = if (isOpen()) { _isOpen = false unmonitor.run() if (posix.unistd.close(fd) == -1) From 4d628270b2d7ec66e6b8e1f1b018804ffd031b84 Mon Sep 17 00:00:00 2001 From: Arman Bilge Date: Tue, 6 Sep 2022 18:22:11 +0000 Subject: [PATCH 3/3] Simplify the test --- tests/shared/src/test/scala/epollcat/TcpSuite.scala | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/shared/src/test/scala/epollcat/TcpSuite.scala b/tests/shared/src/test/scala/epollcat/TcpSuite.scala index 9811f7b..5a85acf 100644 --- a/tests/shared/src/test/scala/epollcat/TcpSuite.scala +++ b/tests/shared/src/test/scala/epollcat/TcpSuite.scala @@ -33,7 +33,6 @@ import java.nio.channels.AsynchronousSocketChannel import java.nio.channels.ClosedChannelException import java.nio.channels.CompletionHandler import java.nio.charset.StandardCharsets -import scala.concurrent.TimeoutException import scala.concurrent.duration._ class TcpSuite extends EpollcatSuite { @@ -287,8 +286,7 @@ class TcpSuite extends EpollcatSuite { .evalTap(_.bind(new InetSocketAddress(0))) .flatMap(_.accept) .use_ - .timeout(100.millis) - .intercept[TimeoutException] + .timeoutTo(100.millis, IO.unit) } }