mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
8a49735bae
This commit adds a 'flush' option to the createWriteStream() family of functions. Refs: https://github.com/nodejs/node/issues/49886 PR-URL: https://github.com/nodejs/node/pull/50093 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
82 lines
2.3 KiB
JavaScript
82 lines
2.3 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const tmpdir = require('../common/tmpdir');
|
|
const assert = require('node:assert');
|
|
const fs = require('node:fs');
|
|
const fsp = require('node:fs/promises');
|
|
const test = require('node:test');
|
|
const data = 'foo';
|
|
let cnt = 0;
|
|
|
|
function nextFile() {
|
|
return tmpdir.resolve(`${cnt++}.out`);
|
|
}
|
|
|
|
tmpdir.refresh();
|
|
|
|
test('validation', () => {
|
|
for (const flush of ['true', '', 0, 1, [], {}, Symbol()]) {
|
|
assert.throws(() => {
|
|
fs.createWriteStream(nextFile(), { flush });
|
|
}, { code: 'ERR_INVALID_ARG_TYPE' });
|
|
}
|
|
});
|
|
|
|
test('performs flush', (t, done) => {
|
|
const spy = t.mock.method(fs, 'fsync');
|
|
const file = nextFile();
|
|
const stream = fs.createWriteStream(file, { flush: true });
|
|
|
|
stream.write(data, common.mustSucceed(() => {
|
|
stream.close(common.mustSucceed(() => {
|
|
const calls = spy.mock.calls;
|
|
assert.strictEqual(calls.length, 1);
|
|
assert.strictEqual(calls[0].result, undefined);
|
|
assert.strictEqual(calls[0].error, undefined);
|
|
assert.strictEqual(calls[0].arguments.length, 2);
|
|
assert.strictEqual(typeof calls[0].arguments[0], 'number');
|
|
assert.strictEqual(typeof calls[0].arguments[1], 'function');
|
|
assert.strictEqual(fs.readFileSync(file, 'utf8'), data);
|
|
done();
|
|
}));
|
|
}));
|
|
});
|
|
|
|
test('does not perform flush', (t, done) => {
|
|
const values = [undefined, null, false];
|
|
const spy = t.mock.method(fs, 'fsync');
|
|
let cnt = 0;
|
|
|
|
for (const flush of values) {
|
|
const file = nextFile();
|
|
const stream = fs.createWriteStream(file, { flush });
|
|
|
|
stream.write(data, common.mustSucceed(() => {
|
|
stream.close(common.mustSucceed(() => {
|
|
assert.strictEqual(fs.readFileSync(file, 'utf8'), data);
|
|
cnt++;
|
|
|
|
if (cnt === values.length) {
|
|
assert.strictEqual(spy.mock.calls.length, 0);
|
|
done();
|
|
}
|
|
}));
|
|
}));
|
|
}
|
|
});
|
|
|
|
test('works with file handles', async () => {
|
|
const file = nextFile();
|
|
const handle = await fsp.open(file, 'w');
|
|
const stream = handle.createWriteStream({ flush: true });
|
|
|
|
return new Promise((resolve) => {
|
|
stream.write(data, common.mustSucceed(() => {
|
|
stream.close(common.mustSucceed(() => {
|
|
assert.strictEqual(fs.readFileSync(file, 'utf8'), data);
|
|
resolve();
|
|
}));
|
|
}));
|
|
});
|
|
});
|