summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/async/tasyncnetudp.nim99
1 files changed, 99 insertions, 0 deletions
diff --git a/tests/async/tasyncnetudp.nim b/tests/async/tasyncnetudp.nim
new file mode 100644
index 000000000..bb0f244e5
--- /dev/null
+++ b/tests/async/tasyncnetudp.nim
@@ -0,0 +1,99 @@
+# It is a reproduction of the 'tnewasyncudp' test code, but using a high level
+# of asynchronous procedures. Output: "5000"
+import asyncdispatch, asyncnet, nativesockets, net, strutils
+
+var msgCount = 0
+var recvCount = 0
+
+const
+  messagesToSend = 100
+  swarmSize = 50
+  serverPort = 10333
+
+var
+  sendports = 0
+  recvports = 0
+
+proc saveSendingPort(port: Port) =
+  sendports = sendports + int(port)
+
+proc saveReceivedPort(port: Port) =
+  recvports = recvports + int(port)
+
+proc launchSwarm(serverIp: string, serverPort: Port) {.async.} =
+  var
+    buffer = newString(16384)
+    i = 0
+
+  while i < swarmSize:
+    var sock = newAsyncSocket(nativesockets.AF_INET, nativesockets.SOCK_DGRAM,
+                              Protocol.IPPROTO_UDP, false)
+
+    bindAddr(sock, address = "127.0.0.1")
+
+    let (null, localPort) = getLocalAddr(sock)
+
+    var k = 0
+    
+    while k < messagesToSend:
+      zeroMem(addr(buffer[0]), 16384)
+
+      let message = "Message " & $(i * messagesToSend + k)
+
+      await sendTo(sock, message, serverIp, serverPort)
+
+      let (size, fromIp, fromPort) = await recvFrom(sock, addr buffer[0],
+                                                    16384)
+
+      if buffer[0 .. (size - 1)] == message:
+        saveSendingPort(localPort)
+
+        inc(recvCount)
+
+      inc(k)
+    
+    close(sock)
+
+    inc(i)
+
+proc readMessages(server: AsyncSocket) {.async.} =
+  let maxResponses = (swarmSize * messagesToSend)
+
+  var
+    buffer = newString(16384)
+    i = 0
+  
+  while i < maxResponses:
+    zeroMem(addr(buffer[0]), 16384)
+    
+    let (size, fromIp, fromPort) = await recvFrom(server, addr buffer[0], 16384)
+
+    if buffer.startswith("Message ") and fromIp == "127.0.0.1":
+      await sendTo(server, buffer[0 .. (size - 1)], fromIp, fromPort)
+
+      inc(msgCount)
+
+      saveReceivedPort(fromPort)
+
+    inc(i)
+
+proc createServer() {.async.} =
+  var server = newAsyncSocket(nativesockets.AF_INET, nativesockets.SOCK_DGRAM, Protocol.IPPROTO_UDP, false)
+  
+  bindAddr(server, Port(serverPort), "127.0.0.1")
+
+  asyncCheck readMessages(server)
+
+asyncCheck createServer()
+asyncCheck launchSwarm("127.0.0.1", Port(serverPort))
+
+while true:
+  poll()
+
+  if recvCount == swarmSize * messagesToSend:
+    break
+
+assert msgCount == swarmSize * messagesToSend
+assert sendports == recvports
+
+echo msgCount
\ No newline at end of file