summaryrefslogtreecommitdiff
path: root/test/parallel/test-stream-preprocess.js
diff options
context:
space:
mode:
authorVse Mozhet Byt <vsemozhetbyt@gmail.com>2016-07-15 02:24:38 +0300
committerAnna Henningsen <anna@addaleax.net>2016-07-27 13:56:55 +0200
commitea725eda426add1d684c80f2c2c585cd2ca797c9 (patch)
treebe840f780dbb7f498ed688ee88d62d94b18ccc9d /test/parallel/test-stream-preprocess.js
parent1d83013d19d859836d817cdabf1823018f384ea3 (diff)
downloadandroid-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.js67
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);
+ }));
+}));