| '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(); |
| })); |
| })); |
| }); |
| }); |