vxx2 / vlib / fasthttp / fasthttp_bsd_regression_test.c.v
61 lines · 55 sloc · 1.64 KB · b15632730f263e4586e84ba9c2f19d2f7d45a82d
Raw
1// vtest build: macos || freebsd || openbsd || netbsd || dragonfly
2module fasthttp
3
4fn C.socketpair(domain i32, typ i32, protocol i32, sockets &i32) i32
5
6fn bsd_reregistration_test_handler(_ HttpRequest) !HttpResponse {
7 return HttpResponse{
8 content: 'HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n'.bytes()
9 }
10}
11
12fn test_keep_alive_completion_rearms_kqueue_read_after_consumed_edge() ! {
13 server := new_server(ServerConfig{
14 family: .ip
15 port: 0
16 max_request_buffer_size: 8192
17 handler: bsd_reregistration_test_handler
18 })!
19 kq := C.kqueue()
20 assert kq >= 0
21 defer {
22 C.close(kq)
23 }
24 mut sockets := [2]int{}
25 assert C.socketpair(C.AF_UNIX, C.SOCK_STREAM, 0, &sockets[0]) == 0
26 defer {
27 C.close(sockets[0])
28 C.close(sockets[1])
29 }
30 set_nonblocking(sockets[0])
31 mut conn := &Conn{
32 fd: sockets[0]
33 request_active: true
34 file_fd: -1
35 }
36 assert add_event(kq, u64(sockets[0]), i16(C.EVFILT_READ),
37 u16(C.EV_ADD | C.EV_ENABLE | C.EV_CLEAR), conn) == 0
38 assert C.write(sockets[1], c'GET ', 4) == 4
39
40 mut event := C.kevent{}
41 mut timeout := C.timespec{
42 tv_sec: 1
43 }
44 assert C.kevent(kq, unsafe { nil }, 0, &event, 1, &timeout) == 1
45 assert event.ident == u64(sockets[0])
46
47 server.begin_request()
48 mut clients := {
49 sockets[0]: voidptr(conn)
50 }
51 complete_response(server, kq, conn, mut clients, false)
52
53 assert server.active_request_count() == 0
54 assert clients[sockets[0]] or { unsafe { nil } } == voidptr(conn)
55 timeout = C.timespec{
56 tv_sec: 1
57 }
58 assert C.kevent(kq, unsafe { nil }, 0, &event, 1, &timeout) == 1
59 assert event.ident == u64(sockets[0])
60 close_conn(server, kq, conn, mut clients)
61}
62