diff options
Diffstat (limited to 'tests/async/tupcoming_async.nim')
-rw-r--r-- | tests/async/tupcoming_async.nim | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/tests/async/tupcoming_async.nim b/tests/async/tupcoming_async.nim new file mode 100644 index 000000000..0b6e53454 --- /dev/null +++ b/tests/async/tupcoming_async.nim @@ -0,0 +1,157 @@ +discard """ + output: ''' +OK +''' +""" + +when defined(upcoming): + import asyncdispatch, times, streams, posix + from ioselectors import ioselSupportedPlatform + + proc delayedSet(ev: AsyncEvent, timeout: int): Future[void] {.async.} = + await sleepAsync(timeout) + ev.trigger() + + proc waitEvent(ev: AsyncEvent, closeEvent = false): Future[void] = + var retFuture = newFuture[void]("waitEvent") + proc cb(fd: AsyncFD): bool = + retFuture.complete() + if closeEvent: + return true + else: + return false + addEvent(ev, cb) + return retFuture + + proc eventTest() = + var event = newAsyncEvent() + var fut = waitEvent(event) + asyncCheck(delayedSet(event, 500)) + waitFor(fut or sleepAsync(1000)) + if not fut.finished: + echo "eventTest: Timeout expired before event received!" + + proc eventTest5304() = + # Event should not be signaled if it was uregistered, + # even in case, when poll() was not called yet. + # Issue #5304. + var unregistered = false + let e = newAsyncEvent() + addEvent(e) do (fd: AsyncFD) -> bool: + assert(not unregistered) + e.trigger() + e.unregister() + unregistered = true + poll() + + proc eventTest5298() = + # Event must raise `AssertionDefect` if event was unregistered twice. + # Issue #5298. + let e = newAsyncEvent() + var eventReceived = false + addEvent(e) do (fd: AsyncFD) -> bool: + eventReceived = true + return true + e.trigger() + while not eventReceived: + poll() + try: + e.unregister() + except AssertionDefect: + discard + e.close() + + proc eventTest5331() = + # Event must not raise any exceptions while was unregistered inside of + # own callback. + # Issue #5331. + let e = newAsyncEvent() + addEvent(e) do (fd: AsyncFD) -> bool: + e.unregister() + e.close() + e.trigger() + poll() + + when ioselSupportedPlatform or defined(windows): + + import osproc + + proc waitTimer(timeout: int): Future[void] = + var retFuture = newFuture[void]("waitTimer") + proc cb(fd: AsyncFD): bool = + retFuture.complete() + addTimer(timeout, true, cb) + return retFuture + + proc waitProcess(p: Process): Future[void] = + var retFuture = newFuture[void]("waitProcess") + proc cb(fd: AsyncFD): bool = + retFuture.complete() + addProcess(p.processID(), cb) + return retFuture + + proc timerTest() = + waitFor(waitTimer(200)) + + proc processTest() = + when defined(windows): + var process = startProcess("ping.exe", "", + ["127.0.0.1", "-n", "2", "-w", "100"], nil, + {poStdErrToStdOut, poUsePath, poInteractive, + poDaemon}) + else: + var process = startProcess("sleep", "", ["1"], nil, + {poStdErrToStdOut, poUsePath}) + var fut = waitProcess(process) + waitFor(fut or waitTimer(2000)) + if fut.finished and process.peekExitCode() == 0: + discard + else: + echo "processTest: Timeout expired before process exited!" + + when ioselSupportedPlatform: + + proc waitSignal(signal: int): Future[void] = + var retFuture = newFuture[void]("waitSignal") + proc cb(fd: AsyncFD): bool = + retFuture.complete() + addSignal(signal, cb) + return retFuture + + proc delayedSignal(signal: int, timeout: int): Future[void] {.async.} = + await waitTimer(timeout) + var pid = posix.getpid() + discard posix.kill(pid, signal.cint) + + proc signalTest() = + var fut = waitSignal(posix.SIGINT) + asyncCheck(delayedSignal(posix.SIGINT, 500)) + waitFor(fut or waitTimer(1000)) + if not fut.finished: + echo "signalTest: Timeout expired before signal received!" + + when ioselSupportedPlatform: + timerTest() + eventTest() + eventTest5304() + eventTest5298() + eventTest5331() + processTest() + signalTest() + echo "OK" + elif defined(windows): + timerTest() + eventTest() + eventTest5304() + eventTest5298() + eventTest5331() + processTest() + echo "OK" + else: + eventTest() + eventTest5304() + eventTest5298() + eventTest5331() + echo "OK" +else: + echo "OK" |