summary refs log tree commit diff stats
path: root/tests/async/tasynciossl.nim
blob: 118b9e74d9d272d5fa7b77490f2c2c1bec71c060 (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
discard """
  file: "tasynciossl.nim"
  cmd: "nim $target --hints:on --define:ssl $options $file"
  output: "20000"
"""
import sockets, asyncio, strutils, times

var disp {.threadvar.}: PDispatcher
disp = newDispatcher()
var msgCount = 0

when defined(ssl):
  var ctx = newContext(verifyMode = CVerifyNone, 
      certFile = "tests/testdata/mycert.pem", keyFile = "tests/testdata/mycert.pem")

  var ctx1 = newContext(verifyMode = CVerifyNone)

const 
  swarmSize = 50
  messagesToSend = 100

proc swarmConnect(s: PAsyncSocket) =
  #echo("Connected")
  for i in 1..messagesToSend:
    s.send("Message " & $i & "\c\L")
  s.close()

proc serverRead(s: PAsyncSocket) =
  var line = ""
  assert s.readLine(line)
  if line != "":
    #echo(line)
    if line.startsWith("Message "):
      msgCount.inc()
    else:
      assert(false)
  else:
    s.close()

proc serverAccept(s: PAsyncSocket) =
  var client: PAsyncSocket
  new(client)
  s.accept(client)
  client.handleRead = serverRead
  disp.register(client)

proc launchSwarm(disp: var PDispatcher, port: TPort, count: int,
                 buffered = true, useSSL = false) =
  for i in 1..count:
    var client = asyncSocket()
    when defined(ssl):
      if useSSL:
        ctx1.wrapSocket(client)
    client.handleConnect = swarmConnect
    disp.register(client)
    client.connect("localhost", port)

proc createSwarm(port: TPort, buffered = true, useSSL = false) =
  var server = asyncSocket()
  when defined(ssl):
    if useSSL:
      ctx.wrapSocket(server)
  server.handleAccept = serverAccept
  disp.register(server)
  server.bindAddr(port)
  server.listen()
  disp.launchSwarm(port, swarmSize, buffered, useSSL)

when defined(ssl):
  const serverCount = 4
else:
  const serverCount = 2

createSwarm(TPort(10235))
createSwarm(TPort(10236), false)

when defined(ssl):
  createSwarm(TPort(10237), true, true)
  createSwarm(TPort(10238), false, true)

var startTime = epochTime()
while true:
  if epochTime() - startTime >= 300.0:
    break
  if not disp.poll(): break
  if disp.len == serverCount:
    # Only the servers are left in the dispatcher. All clients finished,
    # we need to therefore break.
    break

assert msgCount == (swarmSize * messagesToSend) * serverCount
echo(msgCount)