Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: ensure stream preprocessing order #7741

Closed
wants to merge 11 commits into from
3 changes: 3 additions & 0 deletions test/fixtures/file-to-read-with-bom.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
abc
def
ghi
3 changes: 3 additions & 0 deletions test/fixtures/file-to-read-without-bom.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
abc
def
ghi
67 changes: 67 additions & 0 deletions test/parallel/test-stream-preprocess.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
'use strict';
const common = require('../common');
const assert = require('assert');

const fs = require('fs');
const path = require('path');
const rl = require('readline');

const BOM = '\uFEFF';

// Get the data using a non-stream way to compare with the streamed data.
const modelData = fs.readFileSync(
path.join(common.fixturesDir, 'file-to-read-without-bom.txt'), 'utf8'
);
const modelDataFirstCharacter = modelData[0];

// Detect the number of forthcoming 'line' events for mustCall() 'expected' arg.
const lineCount = modelData.match(/\n/g).length;

// Ensure both without-bom and with-bom test files are textwise equal.
assert.strictEqual(
fs.readFileSync(
path.join(common.fixturesDir, 'file-to-read-with-bom.txt'), 'utf8'
),
`${BOM}${modelData}`
);

// An unjustified BOM stripping with a non-BOM character unshifted to a stream.
const inputWithoutBOM = fs.createReadStream(
path.join(common.fixturesDir, 'file-to-read-without-bom.txt'), 'utf8'
);

inputWithoutBOM.once('readable', common.mustCall(() => {
const maybeBOM = inputWithoutBOM.read(1);
assert.strictEqual(maybeBOM, modelDataFirstCharacter);
assert.notStrictEqual(maybeBOM, BOM);

inputWithoutBOM.unshift(maybeBOM);

let streamedData = '';
rl.createInterface({
input: inputWithoutBOM,
}).on('line', common.mustCall((line) => {
streamedData += `${line}\n`;
}, lineCount)).on('close', common.mustCall(() => {
assert.strictEqual(streamedData, modelData);
}));
}));

// A justified BOM stripping.
const inputWithBOM = fs.createReadStream(
path.join(common.fixturesDir, 'file-to-read-with-bom.txt'), 'utf8'
);

inputWithBOM.once('readable', common.mustCall(() => {
const maybeBOM = inputWithBOM.read(1);
assert.strictEqual(maybeBOM, BOM);

let streamedData = '';
rl.createInterface({
input: inputWithBOM,
}).on('line', common.mustCall((line) => {
streamedData += `${line}\n`;
}, lineCount)).on('close', common.mustCall(() => {
assert.strictEqual(streamedData, modelData);
}));
}));