| 'use strict'; |
| |
| // Regression test for buffer content mode: the first buffer of every |
| // batch used to be dropped, corrupting the output and eventually |
| // crashing in mergeBuf(). Refs: https://github.com/nodejs/node/pull/58897 |
| |
| const common = require('../common'); |
| const tmpdir = require('../common/tmpdir'); |
| const assert = require('node:assert'); |
| const { |
| readFile, |
| Utf8Stream, |
| } = require('node:fs'); |
| const { join } = require('node:path'); |
| |
| tmpdir.refresh(); |
| let fileCounter = 0; |
| |
| function getTempFile() { |
| return join(tmpdir.path, `fastutf8stream-${process.pid}-${Date.now()}-${fileCounter++}.log`); |
| } |
| |
| runTests(false); |
| runTests(true); |
| |
| function runTests(sync) { |
| { |
| // A single buffer write must end up in the file. |
| const dest = getTempFile(); |
| const stream = new Utf8Stream({ dest, sync, contentMode: 'buffer' }); |
| |
| stream.on('ready', common.mustCall(() => { |
| assert.ok(stream.write(Buffer.from('hello world\n'))); |
| stream.end(); |
| |
| stream.on('finish', common.mustCall(() => { |
| readFile(dest, 'utf8', common.mustSucceed((data) => { |
| assert.strictEqual(data, 'hello world\n'); |
| })); |
| })); |
| })); |
| } |
| |
| { |
| // Writes that exceed maxWrite start a new batch; data must survive |
| // the batch boundary and be written in order. |
| const dest = getTempFile(); |
| const stream = new Utf8Stream({ |
| dest, |
| sync, |
| contentMode: 'buffer', |
| minLength: 60, |
| maxWrite: 64, |
| }); |
| |
| stream.on('ready', common.mustCall(() => { |
| stream.write(Buffer.from('a'.repeat(40))); |
| stream.write(Buffer.from('b'.repeat(40))); |
| stream.write(Buffer.from('c'.repeat(40))); |
| stream.end(); |
| |
| stream.on('finish', common.mustCall(() => { |
| readFile(dest, 'utf8', common.mustSucceed((data) => { |
| assert.strictEqual( |
| data, |
| 'a'.repeat(40) + 'b'.repeat(40) + 'c'.repeat(40), |
| ); |
| })); |
| })); |
| })); |
| } |
| } |