1'use strict';
2
3// This tests that weak references work across serialization.
4
5require('../common');
6const assert = require('assert');
7const { spawnSync } = require('child_process');
8const tmpdir = require('../common/tmpdir');
9const fixtures = require('../common/fixtures');
10const path = require('path');
11const fs = require('fs');
12
13tmpdir.refresh();
14const blobPath = path.join(tmpdir.path, 'snapshot.blob');
15
16function runTest(entry) {
17  console.log('running test with', entry);
18  {
19    const child = spawnSync(process.execPath, [
20      '--expose-internals',
21      '--expose-gc',
22      '--snapshot-blob',
23      blobPath,
24      '--build-snapshot',
25      entry,
26    ], {
27      cwd: tmpdir.path
28    });
29    if (child.status !== 0) {
30      console.log(child.stderr.toString());
31      console.log(child.stdout.toString());
32      assert.strictEqual(child.status, 0);
33    }
34    const stats = fs.statSync(path.join(tmpdir.path, 'snapshot.blob'));
35    assert(stats.isFile());
36  }
37
38  {
39    const child = spawnSync(process.execPath, [
40      '--expose-internals',
41      '--expose-gc',
42      '--snapshot-blob',
43      blobPath,
44    ], {
45      cwd: tmpdir.path,
46      env: {
47        ...process.env,
48      }
49    });
50
51    const stdout = child.stdout.toString().trim();
52    const stderr = child.stderr.toString().trim();
53    console.log(`[stdout]:\n${stdout}\n`);
54    console.log(`[stderr]:\n${stderr}\n`);
55    assert.strictEqual(child.status, 0);
56  }
57}
58
59runTest(fixtures.path('snapshot', 'weak-reference.js'));
60runTest(fixtures.path('snapshot', 'weak-reference-gc.js'));
61