vxx2 / vlib / fasthttp / fasthttp_linux_regression_test.v
58 lines · 52 sloc · 1.66 KB · b15632730f263e4586e84ba9c2f19d2f7d45a82d
Raw
1// vtest build: linux
2module fasthttp
3
4fn C.socketpair(domain i32, typ i32, protocol i32, sockets &i32) i32
5
6fn linux_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_epollin_after_consumed_edge() ! {
13 server := new_server(ServerConfig{
14 family: .ip
15 port: 0
16 max_request_buffer_size: 8192
17 handler: linux_reregistration_test_handler
18 })!
19 epoll_fd := C.epoll_create1(0)
20 assert epoll_fd >= 0
21 defer {
22 C.close(epoll_fd)
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_blocking(sockets[0], false)
31 assert add_fd_to_epoll(epoll_fd, sockets[0], u32(C.EPOLLIN | C.EPOLLET)) == 0
32 assert C.write(sockets[1], c'GET ', 4) == 4
33
34 mut event := C.epoll_event{}
35 assert C.epoll_wait(epoll_fd, &event, 1, 1000) == 1
36 assert unsafe { event.data.fd } == sockets[0]
37
38 server.begin_request()
39 mut state := &ClientWriteState{
40 request_active: true
41 }
42 mut client_fds := {
43 sockets[0]: true
44 }
45 mut client_buffers := map[int][]u8{}
46 mut client_read_starts := map[int]i64{}
47 mut closing_client_fds := map[int]bool{}
48 mut client_write_states := {
49 sockets[0]: state
50 }
51 complete_write(server, epoll_fd, sockets[0], mut client_fds, mut client_buffers, mut
52 client_read_starts, mut closing_client_fds, mut client_write_states)
53
54 assert server.active_request_count() == 0
55 assert sockets[0] in client_fds
56 assert C.epoll_wait(epoll_fd, &event, 1, 1000) == 1
57 assert unsafe { event.data.fd } == sockets[0]
58}
59