summary refs log tree commit diff stats
path: root/tests/async/tupcoming_async.nim
blob: 0a334709dbf9941eb890dc239087b6ad6f4839d1 (plain) (blame)
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"