From de0cc63155b7ad91e4b631e0bddcd2170442b060 Mon Sep 17 00:00:00 2001 From: inoway46 Date: Thu, 10 Sep 2026 14:47:40 +0900 Subject: [PATCH] test_runner: avoid reusing v8 serializers A serializer must not be used after releaseBuffer() is called. Use a dedicated instance to calculate the header length and create a new serializer for each test event. Add a regression test that serializes the same object twice and verifies that both frames can be deserialized independently. Signed-off-by: inoway46 Assisted-by: Codex --- lib/internal/test_runner/reporter/v8-serializer.js | 7 ++++--- test/parallel/test-runner-v8-deserializer.mjs | 9 +++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/internal/test_runner/reporter/v8-serializer.js b/lib/internal/test_runner/reporter/v8-serializer.js index c75bfcdac478..0f0cf20902b5 100644 --- a/lib/internal/test_runner/reporter/v8-serializer.js +++ b/lib/internal/test_runner/reporter/v8-serializer.js @@ -9,11 +9,12 @@ const { serializeError } = require('internal/error_serdes'); module.exports = async function* v8Reporter(source) { - const serializer = new DefaultSerializer(); - serializer.writeHeader(); - const headerLength = TypedArrayPrototypeGetLength(serializer.releaseBuffer()); + const headerSerializer = new DefaultSerializer(); + headerSerializer.writeHeader(); + const headerLength = TypedArrayPrototypeGetLength(headerSerializer.releaseBuffer()); for await (const item of source) { + const serializer = new DefaultSerializer(); const originalError = item.data.details?.error; if (originalError) { // Error is overridden with a serialized version, so that it can be diff --git a/test/parallel/test-runner-v8-deserializer.mjs b/test/parallel/test-runner-v8-deserializer.mjs index 7f2c0155c973..3a4db367ca6d 100644 --- a/test/parallel/test-runner-v8-deserializer.mjs +++ b/test/parallel/test-runner-v8-deserializer.mjs @@ -85,6 +85,15 @@ describe('v8 deserializer', common.mustCall(() => { assert.deepStrictEqual(reported, [reportedDiagnosticEvent]); }); + it('should serialize a repeated object as independent messages', async () => { + const repeatedChunks = await toArray(serializer([diagnosticEvent, diagnosticEvent])); + const reported = await collectReported(repeatedChunks); + assert.deepStrictEqual(reported, [ + reportedDiagnosticEvent, + reportedDiagnosticEvent, + ]); + }); + it('should deserialize a serialized chunk after non-serialized chunk', async () => { const reported = await collectReported([Buffer.concat([Buffer.from('unknown'), ...chunks])]); assert.deepStrictEqual(reported, [