summaryrefslogtreecommitdiff
path: root/cli/tests
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-08-22 08:45:10 -0600
committerGitHub <noreply@github.com>2023-08-22 14:45:10 +0000
commitc37b9655b6a6ccff1cedc6e43d245fd55415d76f (patch)
tree8850a4248ec05c5273f34ecf49c58ff7d6901e9e /cli/tests
parent792dc754712ecf913a76c6bcbf3074ef7fb51cd7 (diff)
fix(ext/node): simultaneous reads can leak into each other (#20223)
Reported in #20188 This was caused by re-use of a global buffer `BUF` during simultaneous async reads.
Diffstat (limited to 'cli/tests')
-rw-r--r--cli/tests/unit_node/net_test.ts57
1 files changed, 57 insertions, 0 deletions
diff --git a/cli/tests/unit_node/net_test.ts b/cli/tests/unit_node/net_test.ts
index 3b78cbe32..312271f88 100644
--- a/cli/tests/unit_node/net_test.ts
+++ b/cli/tests/unit_node/net_test.ts
@@ -130,3 +130,60 @@ Deno.test("[node/net] connection event has socket value", async () => {
await Promise.all([p, p2]);
});
+
+// https://github.com/denoland/deno/issues/20188
+Deno.test("[node/net] multiple Sockets should get correct server data", async () => {
+ const p = deferred();
+ const p2 = deferred();
+
+ const dataReceived1 = deferred();
+ const dataReceived2 = deferred();
+
+ const events1: string[] = [];
+ const events2: string[] = [];
+
+ const server = net.createServer();
+ server.on("connection", (socket) => {
+ assert(socket !== undefined);
+ socket.on("data", (data) => {
+ socket.write(new TextDecoder().decode(data));
+ });
+ });
+
+ server.listen(async () => {
+ // deno-lint-ignore no-explicit-any
+ const { port } = server.address() as any;
+
+ const socket1 = net.createConnection(port);
+ const socket2 = net.createConnection(port);
+
+ socket1.on("data", (data) => {
+ events1.push(new TextDecoder().decode(data));
+ dataReceived1.resolve();
+ });
+
+ socket2.on("data", (data) => {
+ events2.push(new TextDecoder().decode(data));
+ dataReceived2.resolve();
+ });
+
+ socket1.write("111");
+ socket2.write("222");
+
+ await Promise.all([dataReceived1, dataReceived2]);
+
+ socket1.end();
+ socket2.end();
+
+ server.close(() => {
+ p.resolve();
+ });
+
+ p2.resolve();
+ });
+
+ await Promise.all([p, p2]);
+
+ assertEquals(events1, ["111"]);
+ assertEquals(events2, ["222"]);
+});