From 7a790581e0a6f3ac0ee69adff39590d8bcaac42c Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 2 Jun 2025 17:15:39 -0800 Subject: [PATCH 1/3] Revert "fix test-net-bytes-stats.js" (#20154) --- .../test/parallel/test-net-bytes-stats.js | 78 ------------------- 1 file changed, 78 deletions(-) delete mode 100644 test/js/node/test/parallel/test-net-bytes-stats.js diff --git a/test/js/node/test/parallel/test-net-bytes-stats.js b/test/js/node/test/parallel/test-net-bytes-stats.js deleted file mode 100644 index 40fa13d415..0000000000 --- a/test/js/node/test/parallel/test-net-bytes-stats.js +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -let bytesRead = 0; -let bytesWritten = 0; -let count = 0; - -const tcp = net.Server(function(s) { - console.log('tcp server connection'); - - // trigger old mode. - s.resume(); - - s.on('end', function() { - bytesRead += s.bytesRead; - console.log(`tcp socket disconnect #${count}`); - }); -}); - -tcp.listen(0, function doTest() { - console.error('listening'); - const socket = net.createConnection(this.address().port); - - socket.on('connect', function() { - count++; - console.error('CLIENT connect #%d', count); - - socket.write('foo', function() { - console.error('CLIENT: write cb'); - socket.end('bar'); - }); - }); - - socket.on('finish', function() { - bytesWritten += socket.bytesWritten; - console.error('CLIENT end event #%d', count); - }); - - socket.on('close', function() { - console.error('CLIENT close event #%d', count); - console.log(`Bytes read: ${bytesRead}`); - console.log(`Bytes written: ${bytesWritten}`); - if (count < 2) { - console.error('RECONNECTING'); - socket.connect(tcp.address().port); - } else { - tcp.close(); - } - }); -}); - -process.on('exit', function() { - assert.strictEqual(bytesRead, 12); - assert.strictEqual(bytesWritten, 12); -}); From 7a88bb0e1c1104bd6c70232b6b10b81c483226fa Mon Sep 17 00:00:00 2001 From: 190n Date: Mon, 2 Jun 2025 18:17:05 -0700 Subject: [PATCH 2/3] add gamble.ts (#20153) --- scripts/gamble.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 scripts/gamble.ts diff --git a/scripts/gamble.ts b/scripts/gamble.ts new file mode 100755 index 0000000000..c2b2f7eb23 --- /dev/null +++ b/scripts/gamble.ts @@ -0,0 +1,63 @@ +#!/usr/bin/env bun +// usage: bun scripts/gamble.ts + +import assert from "node:assert"; + +const attempts = parseInt(process.argv[2]); +const timeout = parseFloat(process.argv[3]); +const argv = process.argv.slice(4); + +let numTimedOut = 0; +const signals = new Map(); +const codes = new Map(); +let numOk = 0; + +for (let i = 0; i < attempts; i++) { + const proc = Bun.spawn({ + cmd: argv, + timeout: 1000 * timeout, + stdin: null, + stdout: "ignore", + stderr: "pipe", + }); + await proc.exited; + const errors = await new Response(proc.stderr).text(); + + const { signalCode: signal, exitCode } = proc; + + if (signal === "SIGTERM") { + // sent for timeouts + numTimedOut += 1; + } else if (signal) { + const newCount = 1 + (signals.get(signal) ?? 0); + signals.set(signal, newCount); + } else if (exitCode !== 0) { + // if null there should have been a signal + assert(exitCode !== null); + const newCount = 1 + (codes.get(exitCode) ?? 0); + codes.set(exitCode, newCount); + } else { + numOk += 1; + } + if (exitCode !== 0) console.log(errors); + process.stdout.write(exitCode === 0 ? "." : "!"); +} +process.stdout.write("\n"); + +const width = attempts.toString().length; +const pad = (num: number): string => num.toString().padStart(width, " "); +const green = (text: string) => console.log(`\x1b[32m${text}\x1b[0m`); +const red = (text: string) => console.log(`\x1b[31m${text}\x1b[0m`); + +green(`${pad(numOk)}/${attempts} OK`); +if (numTimedOut > 0) { + red(`${pad(numTimedOut)}/${attempts} timeout`); +} +for (const [signal, count] of signals.entries()) { + red(`${pad(count)}/${attempts} ${signal}`); +} +for (const [code, count] of codes.entries()) { + red(`${pad(count)}/${attempts} code ${code}`); +} + +process.exit(numOk === attempts ? 0 : 1); From 3e1075410be6f8ecd9ce98368a12c624ff216e57 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Mon, 2 Jun 2025 19:01:49 -0700 Subject: [PATCH 3/3] Delete test-net-allow-half-open.js turned out to be flaky --- .../test/parallel/test-net-allow-half-open.js | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 test/js/node/test/parallel/test-net-allow-half-open.js diff --git a/test/js/node/test/parallel/test-net-allow-half-open.js b/test/js/node/test/parallel/test-net-allow-half-open.js deleted file mode 100644 index c7f829a986..0000000000 --- a/test/js/node/test/parallel/test-net-allow-half-open.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -{ - const server = net.createServer(common.mustCall((socket) => { - socket.end(Buffer.alloc(1024)); - })).listen(0, common.mustCall(() => { - const socket = net.connect(server.address().port); - assert.strictEqual(socket.allowHalfOpen, false); - socket.resume(); - socket.on('end', common.mustCall(() => { - process.nextTick(() => { - // Ensure socket is not destroyed straight away - // without proper shutdown. - assert(!socket.destroyed); - server.close(); - }); - })); - socket.on('finish', common.mustCall(() => { - assert(!socket.destroyed); - })); - socket.on('close', common.mustCall()); - })); -} - -{ - const server = net.createServer(common.mustCall((socket) => { - socket.end(Buffer.alloc(1024)); - })).listen(0, common.mustCall(() => { - const socket = net.connect(server.address().port); - assert.strictEqual(socket.allowHalfOpen, false); - socket.resume(); - socket.on('end', common.mustCall(() => { - assert(!socket.destroyed); - })); - socket.end('asd'); - socket.on('finish', common.mustCall(() => { - assert(!socket.destroyed); - })); - socket.on('close', common.mustCall(() => { - server.close(); - })); - })); -}