1- import balls
1+ import unittest2
22import nimuring
33import posix
44import net
55
6- var q = newQueue (4 )
7-
8- proc findCqe (cqes: var seq [Cqe ]; userData: UserData ): Cqe =
9- for cqe in cqes:
10- if cqe.userData == userData.uint64 :
11- return cqe
12-
13- const
14- ACCEPT = 1
15- CONNECT = 2
16- SEND = 3
17- RECV = 4
18-
19-
20- let server = newSocket ()
21- let client = newSocket ()
22-
23- var listener: Socket
24- try :
25- server.bindAddr (Port (1234 ))
26- server.listen ()
6+ template withSockets (body: untyped ) =
7+ let server {.inject .} = newSocket ()
8+ let client {.inject .} = newSocket ()
9+ var listener {.inject .}: Socket = nil
10+ try :
11+ `body`
12+ finally :
13+ server.close ()
14+ client.close ()
15+ if listener != nil :
16+ listener.close ()
2717
28- var accept_addr: SockAddr
29- var accept_addr_len: SockLen
30- check accept_addr_len.int == 0
31- q.accept (userData= ACCEPT , server.getFd, addr accept_addr, addr accept_addr_len, 0 )
18+ template setupServer (server: Socket , port: Port , accept_addr: var SockAddr , accept_addr_len: var SockLen , q: var Queue ) =
19+ server.bindAddr (port)
20+ server.listen ()
21+ accept_addr_len = 0 .SockLen
22+ q.accept (userData= 1 , server.getFd, addr accept_addr, addr accept_addr_len, 0 )
3223
33- var sa: Sockaddr_storage
34- var sl: SockLen
35- toSockAddr (" 127.0.0.1" .parseIpAddress, Port (1234 ), sa, sl)
24+ template setupClientConnect (client: Socket , port: Port , q: var Queue ) =
25+ var sa: Sockaddr_storage = default (Sockaddr_storage)
26+ var sl: SockLen = 0
27+ toSockAddr (" 127.0.0.1" .parseIpAddress, port, sa, sl)
28+ q.connect (userData= 2 , client.getFd, cast [ptr SockAddr ](sa.addr ), sl)
3629
37- q.connect (userData= CONNECT , client.getFd, cast [ptr SockAddr ](sa.addr ), sl)
30+ proc findCqe (cqes: var seq [Cqe ]; userData: UserData ): Cqe =
31+ result = default (Cqe )
32+ for cqe in cqes:
33+ if cqe.userData == userData.uint64 :
34+ return cqe
3835
39- q.submit ()
40- var cqes = q.copyCqes (1 )
41- let acceptCqe = cqes.findCqe (ACCEPT )
42- listener = newSocket (cast [SocketHandle ](acceptCqe.res))
36+ suite " accept, connect, send, recv" :
37+ test " accept/connect" :
38+ withSockets:
39+ var q = newQueue (4 )
40+ var accept_addr: SockAddr
41+ var accept_addr_len: SockLen
42+ setupServer (server, Port (1234 ), accept_addr, accept_addr_len, q)
43+ setupClientConnect (client, Port (1234 ), q)
44+ q.submit ()
45+ var cqes = q.copyCqes (1 )
46+ let acceptCqe = cqes.findCqe (1 )
47+ listener = newSocket (cast [SocketHandle ](acceptCqe.res))
48+ check accept_addr_len.int == 16
4349
44- check accept_addr_len.int == 16
50+ test " send/recv" :
51+ withSockets:
52+ var q = newQueue (4 )
53+ var accept_addr: SockAddr
54+ var accept_addr_len: SockLen
55+ setupServer (server, Port (1234 ), accept_addr, accept_addr_len, q)
56+ setupClientConnect (client, Port (1234 ), q)
57+ q.submit ()
58+ var cqes = q.copyCqes (1 )
59+ let acceptCqe = cqes.findCqe (1 )
60+ listener = newSocket (cast [SocketHandle ](acceptCqe.res))
4561
46- var bufferSend = ['\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' ]
47- var bufferRecv: array [6 , char ]
62+ var bufferSend = ['\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' , '\x01 ' , '\x00 ' ]
63+ var bufferRecv: array [6 , char ] = [ ' \0 ' , ' \0 ' , ' \0 ' , ' \0 ' , ' \0 ' , ' \0 ' ]
4864
49- q.send (SEND , client.getFd, bufferSend.addr , bufferSend.len).linkNext ()
50- q.recv (RECV , listener.getFd, bufferRecv.addr , bufferRecv.len)
51- q.submit (2 )
65+ q.send (3 , client.getFd, bufferSend.addr , bufferSend.len).linkNext ()
66+ q.recv (4 , listener.getFd, bufferRecv.addr , bufferRecv.len)
67+ q.submit (2 )
5268
53- for i in 0 ..< bufferRecv.len:
54- check bufferSend[i] == bufferRecv[i]
55-
56- finally :
57- # Socket has no graceful =destroy
58- server.close ()
59- client.close ()
69+ for i in 0 ..< bufferRecv.len:
70+ check bufferSend[i] == bufferRecv[i]
0 commit comments