1// Flags: --expose-gc
2'use strict';
3const common = require('../common');
4const tmpdir = require('../common/tmpdir');
5const assert = require('assert');
6const path = require('path');
7
8// Regression test for https://github.com/nodejs/node-v0.x-archive/issues/814:
9// Make sure that Buffers passed to fs.write() are not garbage-collected
10// even when the callback is being reused.
11
12const fs = require('fs');
13
14tmpdir.refresh();
15const filename = path.join(tmpdir.path, 'test.txt');
16const fd = fs.openSync(filename, 'w');
17
18const size = 16 * 1024;
19const writes = 1000;
20let done = 0;
21
22const ondone = common.mustSucceed(() => {
23  if (++done < writes) {
24    if (done % 25 === 0) global.gc();
25    setImmediate(write);
26  } else {
27    assert.strictEqual(
28      fs.readFileSync(filename, 'utf8'),
29      'x'.repeat(writes * size));
30    fs.closeSync(fd);
31  }
32}, writes);
33
34write();
35function write() {
36  const buf = Buffer.alloc(size, 'x');
37  fs.write(fd, buf, 0, buf.length, -1, ondone);
38}
39