summaryrefslogtreecommitdiff
path: root/cli/tests/unit_node/net_test.ts
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2024-02-10 13:22:13 -0700
committerGitHub <noreply@github.com>2024-02-10 20:22:13 +0000
commitf5e46c9bf2f50d66a953fa133161fc829cecff06 (patch)
tree8faf2f5831c1c7b11d842cd9908d141082c869a5 /cli/tests/unit_node/net_test.ts
parentd2477f780630a812bfd65e3987b70c0d309385bb (diff)
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests -> tests, and updates of relative paths for files. This is the first step towards aggregate all of the integration test files under tests/, which will lead to a set of integration tests that can run without the CLI binary being built. While we could leave these tests under `cli`, it would require us to keep a more complex directory structure for the various test runners. In addition, we have a lot of complexity to ignore various test files in the `cli` project itself (cargo publish exclusion rules, autotests = false, etc). And finally, the `tests/` folder will eventually house the `test_ffi`, `test_napi` and other testing code, reducing the size of the root repo directory. For easier review, the extremely large and noisy "move" is in the first commit (with no changes -- just a move), while the remainder of the changes to actual files is in the second commit.
Diffstat (limited to 'cli/tests/unit_node/net_test.ts')
-rw-r--r--cli/tests/unit_node/net_test.ts201
1 files changed, 0 insertions, 201 deletions
diff --git a/cli/tests/unit_node/net_test.ts b/cli/tests/unit_node/net_test.ts
deleted file mode 100644
index 60cf9d8fc..000000000
--- a/cli/tests/unit_node/net_test.ts
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import * as net from "node:net";
-import { assert, assertEquals } from "@test_util/std/assert/mod.ts";
-import * as path from "@test_util/std/path/mod.ts";
-import * as http from "node:http";
-
-Deno.test("[node/net] close event emits after error event", async () => {
- const socket = net.createConnection(27009, "doesnotexist");
- const events: ("error" | "close")[] = [];
- const errorEmitted = Promise.withResolvers<void>();
- const closeEmitted = Promise.withResolvers<void>();
- socket.once("error", () => {
- events.push("error");
- errorEmitted.resolve();
- });
- socket.once("close", () => {
- events.push("close");
- closeEmitted.resolve();
- });
- await Promise.all([errorEmitted.promise, closeEmitted.promise]);
-
- // `error` happens before `close`
- assertEquals(events, ["error", "close"]);
-});
-
-Deno.test("[node/net] the port is available immediately after close callback", async () => {
- const deferred = Promise.withResolvers<void>();
-
- // This simulates what get-port@5.1.1 does.
- const getAvailablePort = (port: number) =>
- new Promise((resolve, reject) => {
- const server = net.createServer();
- server.on("error", reject);
- server.listen({ port }, () => {
- // deno-lint-ignore no-explicit-any
- const { port } = server.address() as any;
- server.close(() => {
- resolve(port);
- });
- });
- });
-
- const port = await getAvailablePort(5555);
-
- const httpServer = http.createServer();
- httpServer.on("error", (e) => deferred.reject(e));
- httpServer.listen(port, () => {
- httpServer.close(() => deferred.resolve());
- });
- await deferred.promise;
-});
-
-Deno.test("[node/net] net.connect().unref() works", async () => {
- const ctl = new AbortController();
- const server = Deno.serve({
- signal: ctl.signal,
- handler: () => new Response("hello"),
- onListen: async ({ port, hostname }) => {
- const { stdout, stderr } = await new Deno.Command(Deno.execPath(), {
- args: [
- "eval",
- `
- import * as net from "node:net";
- const socket = net.connect(${port}, "${hostname}", () => {
- console.log("connected");
- socket.unref();
- socket.on("data", (data) => console.log(data.toString()));
- socket.write("GET / HTTP/1.1\\n\\n");
- });
- `,
- ],
- cwd: path.dirname(path.fromFileUrl(import.meta.url)),
- }).output();
- if (stderr.length > 0) {
- console.log(new TextDecoder().decode(stderr));
- }
- assertEquals(new TextDecoder().decode(stdout), "connected\n");
- ctl.abort();
- },
- });
- await server.finished;
-});
-
-Deno.test({
- name: "[node/net] throws permission error instead of unknown error",
- permissions: "none",
- fn: () => {
- try {
- const s = new net.Server();
- s.listen(3000);
- } catch (e) {
- assert(e instanceof Deno.errors.PermissionDenied);
- }
- },
-});
-
-Deno.test("[node/net] connection event has socket value", async () => {
- const deferred = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
-
- const server = net.createServer();
- server.on("error", deferred.reject);
- server.on("connection", (socket) => {
- assert(socket !== undefined);
- socket.end();
- server.close(() => {
- deferred.resolve();
- });
- });
- server.listen(async () => {
- // deno-lint-ignore no-explicit-any
- const { port } = server.address() as any;
-
- const conn = await Deno.connect({
- port,
- transport: "tcp",
- });
-
- for await (const _ of conn.readable) {
- //
- }
-
- deferred2.resolve();
- });
-
- await Promise.all([deferred.promise, deferred2.promise]);
-});
-
-/// We need to make sure that any shared buffers are never used concurrently by two reads.
-// https://github.com/denoland/deno/issues/20188
-Deno.test("[node/net] multiple Sockets should get correct server data", async () => {
- const socketCount = 9;
-
- class TestSocket {
- dataReceived: ReturnType<typeof Promise.withResolvers<void>> = Promise
- .withResolvers<void>();
- events: string[] = [];
- socket: net.Socket | undefined;
- }
-
- const finished = Promise.withResolvers<void>();
- const serverSocketsClosed: ReturnType<typeof Promise.withResolvers<void>>[] =
- [];
- const server = net.createServer();
- server.on("connection", (socket) => {
- assert(socket !== undefined);
- const i = serverSocketsClosed.push(Promise.withResolvers<void>());
- socket.on("data", (data) => {
- socket.write(new TextDecoder().decode(data));
- });
- socket.on("close", () => {
- serverSocketsClosed[i - 1].resolve();
- });
- });
-
- const sockets: TestSocket[] = [];
- for (let i = 0; i < socketCount; i++) {
- sockets[i] = new TestSocket();
- }
-
- server.listen(async () => {
- // deno-lint-ignore no-explicit-any
- const { port } = server.address() as any;
-
- for (let i = 0; i < socketCount; i++) {
- const socket = sockets[i].socket = net.createConnection(port);
- socket.on("data", (data) => {
- const count = sockets[i].events.length;
- sockets[i].events.push(new TextDecoder().decode(data));
- if (count === 0) {
- // Trigger an immediate second write
- sockets[i].socket?.write(`${i}`.repeat(3));
- } else {
- sockets[i].dataReceived.resolve();
- }
- });
- }
-
- for (let i = 0; i < socketCount; i++) {
- sockets[i].socket?.write(`${i}`.repeat(3));
- }
-
- await Promise.all(sockets.map((socket) => socket.dataReceived.promise));
-
- for (let i = 0; i < socketCount; i++) {
- sockets[i].socket?.end();
- }
-
- server.close(() => {
- finished.resolve();
- });
- });
-
- await finished.promise;
- await Promise.all(serverSocketsClosed.map(({ promise }) => promise));
-
- for (let i = 0; i < socketCount; i++) {
- assertEquals(sockets[i].events, [`${i}`.repeat(3), `${i}`.repeat(3)]);
- }
-});