diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-08-22 08:45:10 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-22 14:45:10 +0000 |
commit | c37b9655b6a6ccff1cedc6e43d245fd55415d76f (patch) | |
tree | 8850a4248ec05c5273f34ecf49c58ff7d6901e9e /cli/tests/unit_node | |
parent | 792dc754712ecf913a76c6bcbf3074ef7fb51cd7 (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/unit_node')
-rw-r--r-- | cli/tests/unit_node/net_test.ts | 57 |
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"]); +}); |