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.setEvent()
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.setEvent()
e.unregister()
unregistered = true
poll()
proc eventTest5298() =
# Event must raise `AssertionError` if event was unregistered twice.
# Issue #5298.
let e = newAsyncEvent()
var eventReceived = false
addEvent(e) do (fd: AsyncFD) -> bool:
eventReceived = true
return true
e.setEvent()
while not eventReceived:
poll()
try:
e.unregister()
except AssertionError:
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.setEvent()
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,
poDemon})
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"
|