summary refs log tree commit diff stats
path: root/tests/async/t12221.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/async/t12221.nim')
-rw-r--r--tests/async/t12221.nim40
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/async/t12221.nim b/tests/async/t12221.nim
new file mode 100644
index 000000000..e8bd9c11a
--- /dev/null
+++ b/tests/async/t12221.nim
@@ -0,0 +1,40 @@
+import asyncdispatch, os, times
+
+proc doubleSleep(hardSleep: int) {.async.} =
+  await sleepAsync(50)
+  sleep(hardSleep)
+
+template assertTime(target, timeTook: float): untyped {.dirty.} =
+  doAssert(timeTook*1000 > target - 1000, "Took too short, should've taken " &
+    $target & "ms, but took " & $(timeTook*1000) & "ms")
+  doAssert(timeTook*1000 < target + 1000, "Took too long, should've taken " &
+    $target & "ms, but took " & $(timeTook*1000) & "ms")
+
+var
+  start: float
+  fut: Future[void]
+
+# NOTE: this uses poll(3000) to limit timing error potential.
+start = epochTime()
+fut = sleepAsync(40) and sleepAsync(100) and doubleSleep(20)
+while not fut.finished:
+  poll(1000)
+assertTime(150, epochTime() - start)
+
+start = epochTime()
+fut = sleepAsync(40) and sleepAsync(100) and doubleSleep(50)
+while not fut.finished:
+  poll(1000)
+assertTime(200, epochTime() - start)
+
+start = epochTime()
+fut = sleepAsync(40) and sleepAsync(100) and doubleSleep(20) and sleepAsync(200)
+while not fut.finished:
+  poll(1000)
+assertTime(300, epochTime() - start)
+
+start = epochTime()
+fut = (sleepAsync(40) and sleepAsync(100) and doubleSleep(20)) or sleepAsync(300)
+while not fut.finished:
+  poll(1000)
+assertTime(150, epochTime() - start)