1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 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"
|