diff --git a/src/node.cc b/src/node.cc index a18660d388be9d..8367227dd56ed4 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1374,6 +1374,21 @@ ExitCode GenerateAndWriteSnapshotData(const SnapshotData** snapshot_data_ptr, DCHECK(snapshot_config.builder_script_path.has_value()); const std::string& builder_script = snapshot_config.builder_script_path.value(); + + // For the special builder node:generate_default_snapshot_source, generate + // the snapshot as C++ source and write it to snapshot.cc (for testing). + if (builder_script == "node:generate_default_snapshot_source") { + // Reset to empty to generate from scratch. + snapshot_config.builder_script_path = {}; + exit_code = + node::SnapshotBuilder::GenerateAsSource("snapshot.cc", + args_maybe_patched, + result->exec_args(), + snapshot_config, + true /* use_array_literals */); + return exit_code; + } + // node:embedded_snapshot_main indicates that we are using the // embedded snapshot and we are not supposed to clean it up. if (builder_script == "node:embedded_snapshot_main") { diff --git a/test/parallel/test-snapshot-reproducible.js b/test/parallel/test-snapshot-reproducible.js index f9392a7fb4adfc..efb664d1e6dc85 100644 --- a/test/parallel/test-snapshot-reproducible.js +++ b/test/parallel/test-snapshot-reproducible.js @@ -21,7 +21,7 @@ function generateSnapshot() { '--random_seed=42', '--predictable', '--build-snapshot', - 'node:generate_default_snapshot', + 'node:generate_default_snapshot_source', ], { env: { ...process.env, NODE_DEBUG_NATIVE: 'SNAPSHOT_SERDES' }, @@ -38,33 +38,10 @@ function generateSnapshot() { }, } ); - const blobPath = tmpdir.resolve('snapshot.blob'); - return fs.readFileSync(blobPath); + const outputPath = tmpdir.resolve('snapshot.cc'); + return fs.readFileSync(outputPath, 'utf-8').split('\n'); } -const buf1 = generateSnapshot(); -const buf2 = generateSnapshot(); - -const diff = []; -let offset = 0; -const step = 16; -do { - const length = Math.min(buf1.length - offset, step); - const slice1 = buf1.slice(offset, offset + length).toString('hex'); - const slice2 = buf2.slice(offset, offset + length).toString('hex'); - if (slice1 !== slice2) { - diff.push({ offset: '0x' + (offset).toString(16), slice1, slice2 }); - } - offset += length; -} while (offset < buf1.length); - -assert.strictEqual(offset, buf1.length); -if (offset < buf2.length) { - const length = Math.min(buf2.length - offset, step); - const slice2 = buf2.slice(offset, offset + length).toString('hex'); - diff.push({ offset, slice1: '', slice2 }); - offset += length; -} while (offset < buf2.length); - -assert.deepStrictEqual(diff, []); -assert.strictEqual(buf1.length, buf2.length); +const source1 = generateSnapshot(); +const source2 = generateSnapshot(); +assert.deepStrictEqual(source1, source2);