1'use strict';
2
3// This tests snapshot JS API using the example in the docs.
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
13const v8 = require('v8');
14
15// By default it should be false. We'll test that it's true in snapshot
16// building mode in the fixture.
17assert(!v8.startupSnapshot.isBuildingSnapshot());
18
19tmpdir.refresh();
20const blobPath = path.join(tmpdir.path, 'snapshot.blob');
21const entry = fixtures.path('snapshot', 'v8-startup-snapshot-api.js');
22{
23  for (const book of [
24    'book1.en_US.txt',
25    'book1.es_ES.txt',
26    'book2.zh_CN.txt',
27  ]) {
28    const content = `This is ${book}`;
29    fs.writeFileSync(path.join(tmpdir.path, book), content, 'utf8');
30  }
31  fs.copyFileSync(entry, path.join(tmpdir.path, 'entry.js'));
32  const child = spawnSync(process.execPath, [
33    '--snapshot-blob',
34    blobPath,
35    '--build-snapshot',
36    'entry.js',
37  ], {
38    cwd: tmpdir.path
39  });
40  if (child.status !== 0) {
41    console.log(child.stderr.toString());
42    console.log(child.stdout.toString());
43    assert.strictEqual(child.status, 0);
44  }
45  const stats = fs.statSync(path.join(tmpdir.path, 'snapshot.blob'));
46  assert(stats.isFile());
47}
48
49{
50  const child = spawnSync(process.execPath, [
51    '--snapshot-blob',
52    blobPath,
53    'book1',
54  ], {
55    cwd: tmpdir.path,
56    env: {
57      ...process.env,
58      BOOK_LANG: 'en_US',
59    }
60  });
61
62  const stdout = child.stdout.toString().trim();
63  const stderr = child.stderr.toString().trim();
64  assert.strictEqual(stderr, 'Reading book1.en_US.txt');
65  assert.strictEqual(stdout, 'This is book1.en_US.txt');
66  assert.strictEqual(child.status, 0);
67}
68