diff options
author | Vse Mozhet Byt <vsemozhetbyt@gmail.com> | 2016-07-15 02:24:38 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2016-07-27 13:56:55 +0200 |
commit | ea725eda426add1d684c80f2c2c585cd2ca797c9 (patch) | |
tree | be840f780dbb7f498ed688ee88d62d94b18ccc9d /test/parallel/test-stream-preprocess.js | |
parent | 1d83013d19d859836d817cdabf1823018f384ea3 (diff) | |
download | android-node-v8-ea725eda426add1d684c80f2c2c585cd2ca797c9.tar.gz android-node-v8-ea725eda426add1d684c80f2c2c585cd2ca797c9.tar.bz2 android-node-v8-ea725eda426add1d684c80f2c2c585cd2ca797c9.zip |
test: ensure stream preprocessing order
Sometimes it is necessary to preprocess some initial bit
of a stream data before giving the entire stream
to the main processing function. Sometimes this bit should be extracted
from the stream before the main processing; sometimes it should be
returned to the stream. This test checks an order of stream
modes, methods and events for a possible preprocessing algorithm.
Stream BOM stripping is selected as a use case.
See https://github.com/nodejs/help/issues/221 as the prehistory.
PR-URL: https://github.com/nodejs/node/pull/7741
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'test/parallel/test-stream-preprocess.js')
-rw-r--r-- | test/parallel/test-stream-preprocess.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/parallel/test-stream-preprocess.js b/test/parallel/test-stream-preprocess.js new file mode 100644 index 0000000000..9cb4c1d3cc --- /dev/null +++ b/test/parallel/test-stream-preprocess.js @@ -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); + })); +})); |