mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-12 14:09:12 +00:00
redbean_test: add websocket test
This commit is contained in:
parent
ecb47384f8
commit
195961caca
2 changed files with 48 additions and 2 deletions
|
@ -291,3 +291,45 @@ Z\n",
|
||||||
EXPECT_NE(-1, wait(0));
|
EXPECT_NE(-1, wait(0));
|
||||||
EXPECT_NE(-1, sigprocmask(SIG_SETMASK, &savemask, 0));
|
EXPECT_NE(-1, sigprocmask(SIG_SETMASK, &savemask, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(redbean, testWebSockets) {
|
||||||
|
if (IsWindows())
|
||||||
|
return;
|
||||||
|
char portbuf[16];
|
||||||
|
int pid, pipefds[2];
|
||||||
|
sigset_t chldmask, savemask;
|
||||||
|
sigaddset(&chldmask, SIGCHLD);
|
||||||
|
EXPECT_NE(-1, sigprocmask(SIG_BLOCK, &chldmask, &savemask));
|
||||||
|
ASSERT_NE(-1, pipe(pipefds));
|
||||||
|
ASSERT_NE(-1, (pid = fork()));
|
||||||
|
if (!pid) {
|
||||||
|
setpgrp();
|
||||||
|
close(0);
|
||||||
|
open("/dev/null", O_RDWR);
|
||||||
|
close(pipefds[0]);
|
||||||
|
dup2(pipefds[1], 1);
|
||||||
|
sigprocmask(SIG_SETMASK, &savemask, NULL);
|
||||||
|
execv("bin/redbean-tester",
|
||||||
|
(char *const[]){"bin/redbean-tester", "-vvszXp0", "-l127.0.0.1", // "-L/tmp/redbean-tester.log",
|
||||||
|
__strace > 0 ? "--strace" : 0, 0});
|
||||||
|
_exit(127);
|
||||||
|
}
|
||||||
|
EXPECT_NE(-1, close(pipefds[1]));
|
||||||
|
EXPECT_NE(-1, read(pipefds[0], portbuf, sizeof(portbuf)));
|
||||||
|
port = atoi(portbuf);
|
||||||
|
EXPECT_TRUE(Matches("HTTP/1.1 101 Switching Protocols\r\n"
|
||||||
|
"Upgrade: websocket\r\n"
|
||||||
|
"Connection: Upgrade\r\n"
|
||||||
|
"Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
|
||||||
|
"Date: .*\r\n"
|
||||||
|
"Server: redbean/.*\r\n"
|
||||||
|
"\r\n",
|
||||||
|
gc(SendHttpRequest("GET /ws HTTP/1.1\r\n"
|
||||||
|
"Upgrade: websocket\r\n"
|
||||||
|
"Connection: Upgrade\r\n"
|
||||||
|
"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n"))));
|
||||||
|
EXPECT_EQ(0, close(pipefds[0]));
|
||||||
|
EXPECT_NE(-1, kill(pid, SIGTERM));
|
||||||
|
EXPECT_NE(-1, wait(0));
|
||||||
|
EXPECT_NE(-1, sigprocmask(SIG_SETMASK, &savemask, 0));
|
||||||
|
}
|
||||||
|
|
|
@ -10,10 +10,14 @@ function OnHttpRequest()
|
||||||
ws.Write(nil) -- upgrade without sending a response
|
ws.Write(nil) -- upgrade without sending a response
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
|
|
||||||
local fds = {[GetClientFd()] = unix.POLLIN}
|
local fd = GetClientFd()
|
||||||
|
local fds = {[fd] = unix.POLLIN | unix.POLLHUP | unix.POLLRDHUP}
|
||||||
-- simple echo server
|
-- simple echo server
|
||||||
while true do
|
while true do
|
||||||
unix.poll(fds)
|
res = unix.poll(fds)
|
||||||
|
if (res[fd] & unix.POLLHUP == unix.POLLHUP) or (res[fd] & unix.POLLRDHUP == unix.POLLRDHUP) then
|
||||||
|
return
|
||||||
|
end
|
||||||
local s, t = ws.Read()
|
local s, t = ws.Read()
|
||||||
if t == ws.CLOSE then
|
if t == ws.CLOSE then
|
||||||
return
|
return
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue