| 'use strict'; |
| |
| const common = require('../common'); |
| const tmpdir = require('../common/tmpdir'); |
| const assert = require('node:assert'); |
| const fs = require('node:fs'); |
| const { Utf8Stream } = require('node:fs'); |
| const { join } = require('node:path'); |
| const { isMainThread } = require('node:worker_threads'); |
| |
| tmpdir.refresh(); |
| let fileCounter = 0; |
| |
| if (isMainThread) { |
| process.umask(0o000); |
| } |
| |
| function getTempFile() { |
| return join(tmpdir.path, `fastutf8stream-${process.pid}-${Date.now()}-${fileCounter++}.log`); |
| } |
| |
| runTests(false); |
| runTests(true); |
| |
| function runTests(sync) { |
| { |
| const dest = getTempFile(); |
| const stream = new Utf8Stream({ dest, minLength: 4096, sync }); |
| |
| stream.once('ready', common.mustCall(() => { |
| const after = `${dest}-moved`; |
| stream.reopen(after); |
| stream.write('after reopen\n'); |
| stream.on('finish', common.mustCall(() => { |
| fs.readFile(after, 'utf8', common.mustSucceed((data) => { |
| assert.strictEqual(data, 'after reopen\n'); |
| })); |
| })); |
| stream.end(); |
| })); |
| } |
| |
| { |
| const dest = getTempFile(); |
| const stream = new Utf8Stream({ dest, minLength: 4096, sync }); |
| |
| stream.once('ready', common.mustCall(() => { |
| stream.reopen(`${dest}-moved`); |
| const after = `${dest}-moved-moved`; |
| stream.reopen(after); |
| stream.write('after reopen\n'); |
| stream.on('finish', common.mustCall(() => { |
| fs.readFile(after, 'utf8', common.mustSucceed((data) => { |
| assert.strictEqual(data, 'after reopen\n'); |
| })); |
| })); |
| stream.end(); |
| })); |
| } |
| |
| { |
| const dest = getTempFile(); |
| const stream = new Utf8Stream({ dest, minLength: 4096, sync }); |
| const after = dest + '-moved'; |
| |
| stream.reopen(after); |
| stream.write('after reopen\n'); |
| stream.on('finish', common.mustCall(() => { |
| fs.readFile(after, 'utf8', common.mustSucceed((data) => { |
| assert.strictEqual(data, 'after reopen\n'); |
| })); |
| })); |
| |
| stream.end(); |
| } |
| |
| { |
| const dest = getTempFile(); |
| const stream = new Utf8Stream({ dest, sync }); |
| const str = Buffer.alloc(10000).fill('a').toString(); |
| |
| let totalWritten = 0; |
| function writeData() { |
| if (totalWritten >= 10000) { |
| stream.end(); |
| return; |
| } |
| |
| const chunk = str.slice(totalWritten, totalWritten + 1000); |
| if (stream.write(chunk)) { |
| totalWritten += chunk.length; |
| setImmediate(common.mustCall(writeData)); |
| } else { |
| stream.once('drain', common.mustCall(() => { |
| totalWritten += chunk.length; |
| setImmediate(common.mustCall(writeData)); |
| })); |
| } |
| }; |
| |
| stream.on('finish', common.mustCall(() => { |
| fs.readFile(dest, 'utf8', common.mustSucceed((data) => { |
| assert.strictEqual(data.length, 10000); |
| assert.strictEqual(data, str); |
| })); |
| })); |
| |
| writeData(); |
| } |
| } |