summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorvabresto <77133146+vabresto@users.noreply.github.com>2021-05-28 18:17:37 -0400
committerGitHub <noreply@github.com>2021-05-28 15:17:37 -0700
commit9eae6b4fe312035daadd8dcb0ca488a3e5897c11 (patch)
treeec27675b83f72bad41af40163510abe321d7152b
parentd62a298a2834b9a35aac4d922a810a772cd3bc1d (diff)
downloadNim-9eae6b4fe312035daadd8dcb0ca488a3e5897c11.tar.gz
fix #17456 flaky test tasynchttpserver_transferencoding (#18052)
-rw-r--r--tests/stdlib/tasynchttpserver_transferencoding.nim55
1 files changed, 32 insertions, 23 deletions
diff --git a/tests/stdlib/tasynchttpserver_transferencoding.nim b/tests/stdlib/tasynchttpserver_transferencoding.nim
index bfa0e2f69..fd79ce3a0 100644
--- a/tests/stdlib/tasynchttpserver_transferencoding.nim
+++ b/tests/stdlib/tasynchttpserver_transferencoding.nim
@@ -1,3 +1,7 @@
+discard """
+  matrix: "--gc:arc --threads:on; --gc:arc --threads:on -d:danger; --threads:on"
+"""
+
 import httpclient, asynchttpserver, asyncdispatch, asyncfutures
 import net
 
@@ -10,33 +14,38 @@ Transfer-Encoding:chunked
 
 """
 
-template genTest(input, expected) =
-  var sanity = false
-  proc handler(request: Request) {.async.} =
-      doAssert(request.body == expected)
-      doAssert(request.headers.hasKey("Transfer-Encoding"))
-      doAssert(not request.headers.hasKey("Content-Length"))
-      sanity = true
-      await request.respond(Http200, "Good")
+template genTest(input, expected: string) =
+  proc handler(request: Request, future: Future[bool]) {.async, gcsafe.} =
+    doAssert(request.body == expected)
+    doAssert(request.headers.hasKey("Transfer-Encoding"))
+    doAssert(not request.headers.hasKey("Content-Length"))
+    future.complete(true)
+    await request.respond(Http200, "Good")
+
+  proc sendData(data: string, port: Port) {.async.} =
+    var socket = newSocket()
+    defer: socket.close()
+
+    socket.connect("127.0.0.1", port)
+    socket.send(data)
 
-  proc runSleepLoop(server: AsyncHttpServer) {.async.} = 
+  proc runTest(): Future[bool] {.async.} =
+    var handlerFuture = newFuture[bool]("runTest")
+    let data = postBegin & input
+    let server = newAsyncHttpServer()
     server.listen(Port(0))
-    proc wrapper() = 
-      waitFor server.acceptRequest(handler)
-    asyncdispatch.callSoon wrapper
 
-  let server = newAsyncHttpServer()
-  waitFor runSleepLoop(server)
-  let data = postBegin & input
-  var socket = newSocket()
-  socket.connect("127.0.0.1", server.getPort)
-  socket.send(data)
-  waitFor sleepAsync(10)
-  socket.close()
-  server.close()
+    proc wrapper(request: Request): Future[void] {.gcsafe, closure.} =
+      handler(request, handlerFuture)
+    
+    asyncCheck sendData(data, server.getPort)
+    asyncCheck server.acceptRequest(wrapper)
+    doAssert await handlerFuture
+    
+    server.close()
+    return true
 
-  # Verify we ran the handler and its asserts
-  doAssert(sanity)
+  doAssert waitFor runTest()
 
 block:
   const expected = "hello=world"