import { ServerWebSocket, TCPSocket, Socket as _BunSocket, TCPSocketListener } from "bun"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test"; import { connect, isIP, isIPv4, isIPv6, Socket, createConnection } from "net"; import { realpathSync, mkdtempSync } from "fs"; import { tmpdir } from "os"; import { join } from "path"; const socket_domain = mkdtempSync(join(realpathSync(tmpdir()), "node-net")); it("should support net.isIP()", () => { expect(isIP("::1")).toBe(6); expect(isIP("foobar")).toBe(0); expect(isIP("127.0.0.1")).toBe(4); expect(isIP("127.0.0.1/24")).toBe(0); expect(isIP("127.000.000.001")).toBe(0); }); it("should support net.isIPv4()", () => { expect(isIPv4("::1")).toBe(false); expect(isIPv4("foobar")).toBe(false); expect(isIPv4("127.0.0.1")).toBe(true); expect(isIPv4("127.0.0.1/24")).toBe(false); expect(isIPv4("127.000.000.001")).toBe(false); }); it("should support net.isIPv6()", () => { expect(isIPv6("::1")).toBe(true); expect(isIPv6("foobar")).toBe(false); expect(isIPv6("127.0.0.1")).toBe(false); expect(isIPv6("127.0.0.1/24")).toBe(false); expect(isIPv6("127.000.000.001")).toBe(false); }); describe("net.Socket read", () => { var port = 12345; var unix_servers = 0; for (let [message, label] of [ // ["Hello World!".repeat(1024), "long message"], ["Hello!", "short message"], ]) { describe(label, () => { function runWithServer(cb: (..._: any[]) => void, unix_domain_path?: any) { return (done: (_: any) => void) => { function drain(socket: _BunSocket<{ message: string }>) { const message = socket.data.message; const written = socket.write(message); if (written < message.length) { socket.data.message = message.slice(written); } else { socket.end(); } } var server = unix_domain_path ? Bun.listen({ unix: join(unix_domain_path, `${unix_servers++}.sock`), socket: { open(socket) { socket.data.message = message; drain(socket); }, drain, error(socket, err) { done(err); }, }, data: { message: "", }, }) : Bun.listen({ hostname: "localhost", port: 0, socket: { open(socket) { socket.data.message = message; drain(socket); }, drain, error(socket, err) { done(err); }, }, data: { message: "", }, }); function onDone(err: any) { server.stop(); done(err); } try { cb(server, drain, onDone); } catch (e) { onDone(e); } }; } it( "should work with .connect(port)", runWithServer((server, drain, done) => { var data = ""; const socket = new Socket() .connect(server.port) .on("connect", () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .setEncoding("utf8") .on("data", chunk => { data += chunk; }) .on("end", () => { try { expect(data).toBe(message); done(); } catch (e) { server.stop(); done(e); } }) .on("error", done); }), ); it( "should work with .connect(port, listener)", runWithServer((server, drain, done) => { var data = ""; const socket = new Socket() .connect(server.port, () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .setEncoding("utf8") .on("data", chunk => { data += chunk; }) .on("end", () => { try { expect(data).toBe(message); done(); } catch (e) { server.stop(); done(e); } }) .on("error", done); }), ); it( "should work with .connect(port, host, listener)", runWithServer((server, drain, done) => { var data = ""; const socket = new Socket() .connect(server.port, "localhost", () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .setEncoding("utf8") .on("data", chunk => { data += chunk; }) .on("end", () => { try { expect(data).toBe(message); done(); } catch (e) { done(e); } }) .on("error", done); }), ); it( "should work with .createConnection(path)", runWithServer((server, drain, done) => { var data = ""; const socket = createConnection(server.unix) .on("connect", () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .setEncoding("utf8") .on("data", chunk => { data += chunk; }) .on("end", () => { try { expect(data).toBe(message); done(); } catch (e) { server.stop(); done(e); } }) .on("error", done); }, socket_domain), ); it( "should work with .connect(path)", runWithServer((server, drain, done) => { var data = ""; const socket = new Socket() .connect(server.unix) .on("connect", () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .setEncoding("utf8") .on("data", chunk => { data += chunk; }) .on("end", () => { try { expect(data).toBe(message); done(); } catch (e) { server.stop(); done(e); } }) .on("error", done); }, socket_domain), ); it( "should work with .connect(path, listener)", runWithServer((server, drain, done) => { var data = ""; const socket = new Socket() .connect(server.unix, () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .setEncoding("utf8") .on("data", chunk => { data += chunk; }) .on("end", () => { try { expect(data).toBe(message); done(); } catch (e) { done(e); } }) .on("error", done); }, socket_domain), ); }); } }); describe("net.Socket write", () => { const message = "Hello World!".repeat(1024); let port = 53213; function runWithServer(cb: (..._: any[]) => void) { return (done: (_?: any) => void) => { let server: TCPSocketListener; function close(socket: _BunSocket) { expect(Buffer.concat(socket.data).toString("utf8")).toBe(message); done(); } var leaky; server = Bun.listen({ hostname: "0.0.0.0", port: 0, socket: { close, data(socket, buffer) { leaky = socket; if (!Buffer.isBuffer(buffer)) { done(new Error("buffer is not a Buffer")); } socket.data.push(buffer); }, end: close, error(socket, err) { leaky = socket; done(err); }, open(socket) { leaky = socket; socket.data = []; }, }, data: [] as Buffer[], }); function onDone(err: any) { server.stop(); done(err); } try { cb(server, onDone); } catch (e) { onDone(e); } }; } it( "should work with .end(data)", runWithServer((server, done) => { const socket = new Socket() .connect(server.port) .on("ready", () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .on("error", done) .end(message); }), ); it( "should work with .write(data).end()", runWithServer((server, done) => { const socket = new Socket() .connect(server.port, () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .on("error", done); socket.write(message); socket.end(); }), ); it( "should work with multiple .write()s", runWithServer((server, done) => { const socket = new Socket() .connect(server.port, server.hostname, () => { expect(socket).toBeDefined(); expect(socket.connecting).toBe(false); }) .on("error", done); const size = 10; for (let i = 0; i < message.length; i += size) { socket.write(message.slice(i, i + size)); } socket.end(); }), ); }); it("should handle connection error", done => { var data = {}; // @ts-ignore connect(55555, () => { done(new Error("Should not have connected")); }).on("error", error => { expect(error).toBeDefined(); expect(error.name).toBe("SystemError"); expect(error.message).toBe("Failed to connect"); done(); }); }); ion> Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2022-05-12Serialize route generation (#3354)Gravatar Juan Martín Seery 5-59/+61
2022-05-12Corrected the default value of trailingSlash (#3353)Gravatar Rafid Muhymin Wafi 1-1/+1
2022-05-12[ci] formatGravatar matthewp 1-85/+78
2022-05-12Fixed search bar of the docs example not working (#3247)Gravatar Rafid Muhymin Wafi 1-76/+94
2022-05-12Add config option customPages (#3315)Gravatar Eloi-Perez 1-0/+14
2022-05-12fix: vite types (#3352)Gravatar Juan Martín Seery 4-5/+16
2022-05-12[ci] update lockfile (#3287)Gravatar Fred K. Schott 33-1038/+1096
2022-05-12[ci] formatGravatar matthewp 2-2/+2
2022-05-12add error hints (#3350)Gravatar Fred K. Schott 3-0/+19
2022-05-12[ci] formatGravatar matthewp 2-10/+6
2022-05-12Fix: React - Use "createRoot" instead of "hydrateRoot" for `client:only` (#3337)Gravatar Ben Holmes 4-22/+34
2022-05-12[ci] formatGravatar matthewp 1-2/+8
2022-05-12Resolve components by module ID during compilation (#3300)Gravatar Tony Sullivan 22-41/+407
2022-05-12[ci] collect statsGravatar FredKSchott 1-0/+1
2022-05-11Exclude `node-fetch` from vite.optimizeDeps (#3348)Gravatar Nate Moore 2-0/+6
2022-05-11fix: updated blog template with existing address (#3312)Gravatar Gautier Ben Aïm 1-2/+2
2022-05-11refactor(vercel): Build Output API v3 (#3216)Gravatar Juan Martín Seery 42-231/+659
2022-05-11Fix APIRoute type (#3344)Gravatar Matthew Phillips 3-11/+8
2022-05-11[create-astro] Finalize developer experience... with gradients 🚀 (#3313)Gravatar Ben Holmes 5-23/+123