aboutsummaryrefslogtreecommitdiff
path: root/packages/bun-uws/fuzzing/AsyncEpollHelloWorld.cpp
blob: 04a5fa45f6a15858096eb8f6b58382bde8f85b4e (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
/* We rely on wrapped syscalls */
#include "libEpollFuzzer/epoll_fuzzer.h"

#include "App.h"

/* We keep this one for teardown later on */
struct us_listen_socket_t *listen_socket;

/* This test is run by libEpollFuzzer */
void test() {

    {
        /* Keep in mind that uWS::SSLApp({options}) is the same as uWS::App() when compiled without SSL support.
        * You may swap to using uWS:App() if you don't need SSL */
        auto app = uWS::App({
            /* There are example certificates in uWebSockets.js repo */
            .key_file_name = "../misc/key.pem",
            .cert_file_name = "../misc/cert.pem",
            .passphrase = "1234"
        }).get("/*", [](auto *res, auto *req) {
            auto aborted = std::make_shared<bool>();
            *aborted = false;
            res->onAborted([aborted]() {
                *aborted = true;
            });

            uWS::Loop::get()->defer([res, aborted]() {
                if (!*aborted) {
                    res->cork([res, aborted]() {
                        // Todo: also test upgrade to websocket here
                        res->end("Hello async!");
                    });
                }
            });
        }).listen(9001, [](auto *listenSocket) {
            listen_socket = listenSocket;
        });

        app.run();
    }
    uWS::Loop::get()->free();
}

/* Thus function should shutdown the event-loop and let the test fall through */
void teardown() {
	/* If we are called twice there's a bug (it potentially could if
	 * all open sockets cannot be error-closed in one epoll_wait call).
	 * But we only allow 1k FDs and we have a buffer of 1024 from epoll_wait */
	if (!listen_socket) {
		exit(-1);
	}

	/* We might have open sockets still, and these will be error-closed by epoll_wait */
	// us_socket_context_close - close all open sockets created with this socket context
    if (listen_socket) {
        us_listen_socket_close(0, listen_socket);
        listen_socket = NULL;
    }
}