summary refs log blame commit diff stats
path: root/tests/run/tasynciossl.nim
blob: fbed46efb09fdb6360ca66404209e62c1dbe88ca (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                 
                                                                                    






                                                 
                                    




                                    
                                  
               
                         








                                   
                                    













































                                                                

                                                                        



                                                             
discard """
  file: "tasynciossl.nim"
  cmd: "nimrod cc --hints:on --define:ssl $# $#"
  output: "20000"
"""
import sockets, asyncio, strutils, times

var 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)