Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions test/expectations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,24 @@ test/js/bun/spawn/spawn-maxbuf.test.ts [ FLAKY ]
# Tests failed due to ASAN: SEGV on unknown address
[ ASAN ] test/integration/next-pages/test/dev-server.test.ts [ CRASH ]

# worker.terminate() lands while a process.* lazy PropertyCallback builder
# (stdout/stderr/stdin/nextTick/mainModule, via setupWorkerStdio) is in JS;
# tryClearException() refuses to clear the TerminationException, so the
# builder returns with it pending and reifyStaticProperty reports the slot
# found, tripping JSC's "ASSERTION FAILED: !scope.exception() || !result"
# in getOwnPropertyDescriptor / JSValue::get. Tracked in #34095; fix PRs
# #33966 and #33418. x64-asan only (e.g. builds 75570, 75601); release
# lanes are unaffected. Remove once either fix PR lands.
[ ASAN ] test/js/node/test/parallel/test-worker-message-port-transfer-terminate.js [ CRASH ] # #34095: JSC assertion when terminate() interrupts a lazy PropertyCallback builder
# The stress test is the bun-owned 8×10-worker amplification of the above,
# but on CI it only ever hits JSC::ExceptionScope::assertNoException at
# ExceptionScope.h:61 (6/6: builds 75493/75495/75514/75597/75604/75606),
# which #33966 reports still reproducing at ~1/4000 workers AFTER its
# lazy-builder fix ("termination landing later in the bootstrap, after the
# stdio builders have completed"). Tracked separately in #34690; this entry
# is NOT removable with the one above.
[ ASAN ] test/js/node/worker_threads/worker-transfer-terminate-stress.test.ts [ CRASH ] # #34690: ExceptionScope::assertNoException during worker terminate bootstrap

# Tests failed due to ASAN: use-after-poison
[ ASAN ] test/js/node/test/parallel/test-worker-unref-from-message-during-exit.js [ CRASH ]
[ ASAN ] test/napi/napi.test.ts [ CRASH ] # can throw an exception from an async_complete_callback
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const http = require('http');
const dc = require('diagnostics_channel');

const isOutgoingMessage = (object) => object instanceof http.OutgoingMessage;
const isIncomingMessage = (object) => object instanceof http.IncomingMessage;

dc.subscribe('http.server.response.created', common.mustCall(({
request,
response,
}) => {
assert.strictEqual(request.headers.foo, 'bar');
assert.strictEqual(response.getHeader('baz'), undefined);
assert.strictEqual(isIncomingMessage(request), true);
assert.strictEqual(isOutgoingMessage(response), true);
}));

dc.subscribe('http.server.response.finish', common.mustCall(({
request,
response,
}) => {
assert.strictEqual(request.headers.foo, 'bar');
assert.strictEqual(response.getHeader('baz'), 'bar');
assert.strictEqual(isIncomingMessage(request), true);
assert.strictEqual(isOutgoingMessage(response), true);
}));

const server = http.createServer(common.mustCall((_, res) => {
res.setHeader('baz', 'bar');
res.end('done');
}));

server.listen(common.mustCall(() => {
const { port } = server.address();
http.get({
port,
headers: {
'foo': 'bar',
}
}, common.mustCall(() => {
server.close();
}));
}));
87 changes: 87 additions & 0 deletions test/js/node/test/parallel/test-diagnostics-channel-http.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
'use strict';
const common = require('../common');
const { addresses } = require('../common/internet');
const assert = require('assert');
const http = require('http');
const net = require('net');
const dc = require('diagnostics_channel');

const isHTTPServer = (server) => server instanceof http.Server;
const isIncomingMessage = (object) => object instanceof http.IncomingMessage;
const isOutgoingMessage = (object) => object instanceof http.OutgoingMessage;
const isNetSocket = (socket) => socket instanceof net.Socket;
const isError = (error) => error instanceof Error;

dc.subscribe('http.client.request.start', common.mustCall(({ request }) => {
assert.strictEqual(isOutgoingMessage(request), true);
}, 2));

dc.subscribe('http.client.request.error', common.mustCall(({ request, error }) => {
assert.strictEqual(isOutgoingMessage(request), true);
assert.strictEqual(isError(error), true);
}));

dc.subscribe('http.client.response.finish', common.mustCall(({
request,
response
}) => {
assert.strictEqual(isOutgoingMessage(request), true);
assert.strictEqual(isIncomingMessage(response), true);
}));

dc.subscribe('http.server.request.start', common.mustCall(({
request,
response,
socket,
server,
}) => {
assert.strictEqual(isIncomingMessage(request), true);
assert.strictEqual(isOutgoingMessage(response), true);
assert.strictEqual(isNetSocket(socket), true);
assert.strictEqual(isHTTPServer(server), true);
}));

dc.subscribe('http.server.response.finish', common.mustCall(({
request,
response,
socket,
server,
}) => {
assert.strictEqual(isIncomingMessage(request), true);
assert.strictEqual(isOutgoingMessage(response), true);
assert.strictEqual(isNetSocket(socket), true);
assert.strictEqual(isHTTPServer(server), true);
}));

dc.subscribe('http.server.response.created', common.mustCall(({
request,
response,
}) => {
assert.strictEqual(isIncomingMessage(request), true);
assert.strictEqual(isOutgoingMessage(response), true);
}));

dc.subscribe('http.client.request.created', common.mustCall(({ request }) => {
assert.strictEqual(isOutgoingMessage(request), true);
assert.strictEqual(isHTTPServer(server), true);
}, 2));

const server = http.createServer(common.mustCall((req, res) => {
res.end('done');
}));

server.listen(async () => {
const { port } = server.address();
const invalidRequest = http.get({
host: addresses.INVALID_HOST,
});
await new Promise((resolve) => {
invalidRequest.on('error', resolve);
});
Comment thread
cirospaciari marked this conversation as resolved.
http.get(`http://localhost:${port}`, (res) => {
res.resume();
res.on('end', () => {
server.close();
});
});
});
Loading