diff options
author | EuAndreh <eu@euandre.org> | 2024-03-16 08:14:27 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-03-16 08:14:27 -0300 |
commit | 2dfed1b7fbf19e5e874340340f764a90252b5537 (patch) | |
tree | 2695e700321093848f6824c00b6c6d1beeb8d691 /tests | |
parent | src/hero.mjs: use empty object as default value for renderHeaders() (diff) | |
download | papod-2dfed1b7fbf19e5e874340340f764a90252b5537.tar.gz papod-2dfed1b7fbf19e5e874340340f764a90252b5537.tar.xz |
src/hero.mjs: Add makeUpgradeListener() (again, now rewritten)
Diffstat (limited to 'tests')
-rw-r--r-- | tests/js/hero.mjs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/tests/js/hero.mjs b/tests/js/hero.mjs index ed876e7..a5166c5 100644 --- a/tests/js/hero.mjs +++ b/tests/js/hero.mjs @@ -40,6 +40,7 @@ import { handle404, make404Handler, handleRequest, + makeUpgradeListener, makeRequestListener, actionsFn, lineHandlerFn, @@ -1556,6 +1557,83 @@ const test_handleRequest = async t => { }); }; +const test_makeUpgradeListener = async t => { + t.start("makeUpgradeListener()"); + + await t.test("straightforward connection stablishing", async () => { + const calls = []; + const fn = x => calls.push([x.upgrade, x.socket]); + const routes = [[ "WEBSOCKET", "/socket", fn ]]; + const table = buildRoutes(routes, [ + interceptors.contentType, + interceptors.websocketHandshake, + ]); + const upgradeListener = makeUpgradeListener(table); + + const req = { + method: "GET", + url: "/socket", + upgrade: true, + headers: { + "upgrade": "websocket", + "sec-websocket-key": "aaaaabbbbbcccccdddddee==", + "sec-websocket-version": "13", + }, + }; + + const contents = []; + const socket = { + end: () => assert.ok(false), + write: x => contents.push(x), + }; + await upgradeListener(req, socket); + + assert.deepEqual(calls, [[true, socket]]); + assert.deepEqual(contents, [ + "HTTP/1.1 101 Switching Protocols\r\n" + + "Connection: Upgrade\r\n" + + "Content-Length: 20\r\n" + + "Content-Type: text/plain\r\n" + + "Sec-WebSocket-Accept: eHnDP9gUz224y002aFCe7swigxg=\r\n" + + "Upgrade: websocket\r\n" + + "\r\n", + "Switching Protocols\n", + ]); + }); + + await t.test("early termination cases", async () => { + const routes = [[ "WEBSOCKET", "/a-socket", null ]]; + const table = buildRoutes(routes, [ + interceptors.websocketHandshake, + ]); + const upgradeListener = makeUpgradeListener(table); + + const req = { + method: "GET", + url: "/a-socket", + upgrade: true, + headers: { + "upgrade": "websocket", + }, + }; + + let ended = false; + const contents = []; + const socket = { + end: () => ended = true, + write: x => contents.push(x), + }; + + await upgradeListener(req, socket); + + assert.ok(ended); + assert.deepEqual(contents, [ + "HTTP/1.1 400 Bad Request\r\n\r\n", + 'Missing "Sec-WebSocket-Key" header\n', + ]); + }); +}; + const test_makeRequestListener = async t => { t.start("makeRequestListener()"); @@ -2258,6 +2336,7 @@ await runner.runTests([ test_writeHead, test_make404Handler, test_handleRequest, + test_makeUpgradeListener, test_makeRequestListener, test_actionsFn, test_lineHandlerFn, |