aboutsummaryrefslogtreecommitdiff
path: root/test/js/node/net/node-net.test.ts
diff options
context:
space:
mode:
authorGravatar Ashcon Partovi <ashcon@partovi.net> 2023-03-07 12:22:34 -0800
committerGravatar GitHub <noreply@github.com> 2023-03-07 12:22:34 -0800
commitf7e4eb83694aa007a492ef66c28ffbe6a2dae791 (patch)
tree7af25aa5c42a2e1b2b47ba1df35f8caa9054cbeb /test/js/node/net/node-net.test.ts
parent36275a44ce7a33587bd26aad120042ab95470ff3 (diff)
downloadbun-f7e4eb83694aa007a492ef66c28ffbe6a2dae791.tar.gz
bun-f7e4eb83694aa007a492ef66c28ffbe6a2dae791.tar.zst
bun-f7e4eb83694aa007a492ef66c28ffbe6a2dae791.zip
Reorganize tests (#2332)
Diffstat (limited to 'test/js/node/net/node-net.test.ts')
-rw-r--r--test/js/node/net/node-net.test.ts268
1 files changed, 268 insertions, 0 deletions
diff --git a/test/js/node/net/node-net.test.ts b/test/js/node/net/node-net.test.ts
new file mode 100644
index 000000000..e6c17d931
--- /dev/null
+++ b/test/js/node/net/node-net.test.ts
@@ -0,0 +1,268 @@
+import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test";
+import { connect, isIP, isIPv4, isIPv6, Socket } from "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;
+ for (let [message, label] of [
+ // ["Hello World!".repeat(1024), "long message"],
+ ["Hello!", "short message"],
+ ]) {
+ describe(label, () => {
+ function runWithServer(cb) {
+ return done => {
+ function drain(socket) {
+ 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 = Bun.listen({
+ hostname: "localhost",
+ port: port++,
+ socket: {
+ open(socket) {
+ socket.data.message = message;
+ drain(socket);
+ },
+ drain,
+ error(socket, err) {
+ done(err);
+ },
+ },
+ data: {
+ message: "",
+ },
+ });
+
+ function onDone(err) {
+ 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);
+ }),
+ );
+ });
+ }
+});
+
+describe("net.Socket write", () => {
+ const message = "Hello World!".repeat(1024);
+ let port = 53213;
+
+ function runWithServer(cb) {
+ return done => {
+ let server;
+
+ function close(socket) {
+ expect(Buffer.concat(socket.data).toString("utf8")).toBe(message);
+ done();
+ }
+
+ var leaky;
+ server = Bun.listen({
+ hostname: "0.0.0.0",
+ port: port++,
+ 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) {
+ 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 = {};
+ 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();
+ });
+});