Skip to content

Commit b681059

Browse files
committed
Add browser tests and use saucelabs to test them.
This also finds and fixes errors related to string encoding and some compatablity issues which allow it to work as far back as IE 9 (probably IE 8 with an ES5 shm).
1 parent 53b588e commit b681059

File tree

51 files changed

+3938
-35
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3938
-35
lines changed

.travis.yml

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
11
language: node_js
22
before_install:
33
- npm install -g npm
4-
node_js:
5-
- "0.8"
6-
- "0.10"
7-
- "0.11"
8-
- "0.12"
9-
- "iojs"
4+
notifications:
5+
email: false
6+
matrix:
7+
include:
8+
- node_js: '0.8'
9+
env: TASK=test
10+
- node_js: '0.10'
11+
env: TASK=test
12+
- node_js: '0.11'
13+
env: TASK=test
14+
- node_js: '0.12'
15+
env: TASK=test
16+
- node_js: 'iojs'
17+
env: TASK=test
18+
- node_js: 'iojs'
19+
env: TASK=browser BROWSER_NAME=opera BROWSER_VERSION="11..latest"
20+
- node_js: 'iojs'
21+
env: TASK=browser BROWSER_NAME=ie BROWSER_VERSION="9..latest"
22+
- node_js: 'iojs'
23+
env: TASK=browser BROWSER_NAME=chrome BROWSER_VERSION="39..beta"
24+
- node_js: 'iojs'
25+
env: TASK=browser BROWSER_NAME=firefox BROWSER_VERSION="34..beta"
26+
- node_js: 'iojs'
27+
env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
28+
- node_js: 'iojs'
29+
env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
30+
- node_js: 'iojs'
31+
env: TASK=browser BROWSER_NAME=safari BROWSER_VERSION="5..latest"
32+
- node_js: 'iojs'
33+
env: TASK=browser BROWSER_NAME=android BROWSER_VERSION="4.0..latest"
34+
script: "npm run $TASK"
35+
env:
36+
global:
37+
- secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc=
38+
- secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI=

.zuul.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ui: tape

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
77
[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
88

9+
10+
[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
11+
912
```bash
1013
npm install --save readable-stream
1114
```

build/common-replacements.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,16 @@ module.exports.altIndexOfUseReplacement = [
2626
/(\W)([\w\.\(\),\[\]]+)(\.indexOf\()/gm
2727
, '$1indexOf($2, '
2828
]
29+
module.exports.objectKeysDefine = [
30+
/^('use strict';)$/m
31+
, '$1\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n'
32+
+ ' var keys = [];\n'
33+
+ ' for (var key in obj) keys.push(key);\n'
34+
+ ' return keys;\n'
35+
+ '}\n/*</replacement>*/\n'
36+
]
37+
38+
module.exports.objectKeysReplacement = [
39+
/Object\.keys/g
40+
, 'objectKeys'
41+
]

build/files.js

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,15 @@ const headRegexp = /(^module.exports = \w+;?)/m
6363
]
6464

6565
, objectDefinePropertyReplacement = [
66-
/Object.defineProperties/
66+
/(Object\.defineProperties)/
6767
, 'if (Object.defineProperties) $1'
6868
]
69-
69+
, objectDefinePropertySingReplacement = [
70+
/Object\.defineProperty\(([\w\W]+?)\}\);/
71+
, '(function (){try {\n'
72+
+ 'Object.defineProperty\($1});\n'
73+
+ '}catch(_){}}());\n'
74+
]
7075

7176
, isArrayDefine = [
7277
headRegexp
@@ -78,19 +83,9 @@ const headRegexp = /(^module.exports = \w+;?)/m
7883
, 'isArray'
7984
]
8085

81-
, objectKeysDefine = [
82-
headRegexp
83-
, '$1\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n'
84-
+ ' var keys = [];\n'
85-
+ ' for (var key in obj) keys.push(key);\n'
86-
+ ' return keys;\n'
87-
+ '}\n/*</replacement>*/\n'
88-
]
86+
, objectKeysDefine = require('./common-replacements').objectKeysDefine
8987

90-
, objectKeysReplacement = [
91-
/Object\.keys/g
92-
, 'objectKeys'
93-
]
88+
, objectKeysReplacement = require('./common-replacements').objectKeysReplacement
9489

9590
, eventEmittterReplacement = [
9691
/(require\('events'\)\.EventEmitter;)/
@@ -122,7 +117,7 @@ const headRegexp = /(^module.exports = \w+;?)/m
122117
]
123118

124119
, isBufferReplacement = [
125-
/(\w+) instanceof Buffer/
120+
/(\w+) instanceof Buffer/g
126121
, 'Buffer.isBuffer($1)'
127122
]
128123

@@ -202,6 +197,7 @@ module.exports['_stream_writable.js'] = [
202197
, debugLogReplacement
203198
, deprecateReplacement
204199
, objectDefinePropertyReplacement
200+
, objectDefinePropertySingReplacement
205201
, bufferIsEncodingReplacement
206202
, [ /^var assert = require\('assert'\);$/m, '' ]
207203
, requireStreamReplacement

build/test-replacements.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ const altForEachImplReplacement = require('./common-replacements').altForEachImp
22
, altForEachUseReplacement = require('./common-replacements').altForEachUseReplacement
33
, altIndexOfImplReplacement = require('./common-replacements').altIndexOfImplReplacement
44
, altIndexOfUseReplacement = require('./common-replacements').altIndexOfUseReplacement
5+
, objectKeysDefine =
6+
require('./common-replacements').objectKeysDefine
7+
, objectKeysReplacement =
8+
require('./common-replacements').objectKeysReplacement
59

610
module.exports.all = [
711
[
@@ -55,7 +59,9 @@ module.exports['test-stream-big-packet.js'] = [
5559
]
5660

5761
module.exports['common.js'] = [
58-
altForEachImplReplacement
62+
objectKeysDefine
63+
, objectKeysReplacement
64+
, altForEachImplReplacement
5965
, altForEachUseReplacement
6066

6167
, [
@@ -106,6 +112,18 @@ module.exports['common.js'] = [
106112
+ '}\n'
107113
+ '/*</replacement>*/\n'
108114
]
115+
, [
116+
/^if \(global\.ArrayBuffer\) \{([^\}]+)\}$/m
117+
, '/*<replacement>*/if (!process.browser) {'
118+
+ '\nif \(global\.ArrayBuffer\) {$1}\n'
119+
+ '}/*</replacement>*/\n'
120+
]
121+
, [
122+
/^Object\.defineProperty\(([\w\W]+?)\}\)\;/mg
123+
, '/*<replacement>*/if (!process.browser) {'
124+
+ '\nObject\.defineProperty($1});\n'
125+
+ '}/*</replacement>*/\n'
126+
]
109127
]
110128

111129
// this test has some trouble with the nextTick depth when run

lib/_stream_duplex.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,6 @@
55

66
'use strict';
77

8-
module.exports = Duplex;
9-
10-
/*<replacement>*/
11-
var processNextTick = require('process-nextick-args');
12-
/*</replacement>*/
13-
14-
158
/*<replacement>*/
169
var objectKeys = Object.keys || function (obj) {
1710
var keys = [];
@@ -21,6 +14,13 @@ var objectKeys = Object.keys || function (obj) {
2114
/*</replacement>*/
2215

2316

17+
module.exports = Duplex;
18+
19+
/*<replacement>*/
20+
var processNextTick = require('process-nextick-args');
21+
/*</replacement>*/
22+
23+
2424

2525
/*<replacement>*/
2626
var util = require('core-util-is');

lib/_stream_writable.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,15 @@ WritableState.prototype.getBuffer = function writableStateGetBuffer() {
143143
return out;
144144
};
145145

146+
(function (){try {
146147
Object.defineProperty(WritableState.prototype, 'buffer', {
147148
get: require('util-deprecate')(function() {
148149
return this.getBuffer();
149150
}, '_writableState.buffer is deprecated. Use ' +
150151
'_writableState.getBuffer() instead.')
151152
});
153+
}catch(_){}}());
154+
152155

153156
function Writable(options) {
154157
var Duplex = require('./_stream_duplex');
@@ -217,7 +220,7 @@ Writable.prototype.write = function(chunk, encoding, cb) {
217220
encoding = null;
218221
}
219222

220-
if (chunk instanceof Buffer)
223+
if (Buffer.isBuffer(chunk))
221224
encoding = 'buffer';
222225
else if (!encoding)
223226
encoding = state.defaultEncoding;
@@ -282,7 +285,7 @@ function decodeChunk(state, chunk, encoding) {
282285
function writeOrBuffer(stream, state, chunk, encoding, cb) {
283286
chunk = decodeChunk(state, chunk, encoding);
284287

285-
if (chunk instanceof Buffer)
288+
if (Buffer.isBuffer(chunk))
286289
encoding = 'buffer';
287290
var len = state.objectMode ? 1 : chunk.length;
288291

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
"main": "readable.js",
66
"dependencies": {
77
"core-util-is": "~1.0.0",
8-
"process-nextick-args": "~1.0.0",
98
"inherits": "~2.0.1",
109
"isarray": "0.0.1",
10+
"process-nextick-args": "~1.0.0",
1111
"string_decoder": "~0.10.x",
1212
"util-deprecate": "~1.0.1"
1313
},
1414
"devDependencies": {
15-
"tap": "~0.2.6"
15+
"tap": "~0.2.6",
16+
"tape": "~4.0.0",
17+
"zuul": "~3.0.0"
1618
},
1719
"scripts": {
18-
"test": "tap test/parallel/*.js"
20+
"test": "tap test/parallel/*.js",
21+
"browser": "zuul --browser-name $BROWSER_NAME --browser-version $BROWSER_VERSION -- test/browser.js"
1922
},
2023
"repository": {
2124
"type": "git",

test/browser.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
if (!global.console) {
2+
global.console = {};
3+
}
4+
if (!global.console.log) {
5+
global.console.log = function () {};
6+
}
7+
if (!global.console.error) {
8+
global.console.error = global.console.log;
9+
}
10+
if (!global.console.info) {
11+
global.console.info = global.console.log;
12+
}
13+
var test = require('tape');
14+
15+
test('streams', function (t) {
16+
require('./browser/test-stream-big-packet')(t);
17+
require('./browser/test-stream-big-push')(t);
18+
require('./browser/test-stream-duplex')(t);
19+
require('./browser/test-stream-end-paused')(t);
20+
require('./browser/test-stream-ispaused')(t);
21+
require('./browser/test-stream-pipe-after-end')(t);
22+
require('./browser/test-stream-pipe-cleanup')(t);
23+
require('./browser/test-stream-pipe-error-handling')(t);
24+
require('./browser/test-stream-pipe-event')(t);
25+
require('./browser/test-stream-push-order')(t);
26+
require('./browser/test-stream-push-strings')(t);
27+
require('./browser/test-stream-readable-constructor-set-methods')(t);
28+
require('./browser/test-stream-readable-event')(t);
29+
require('./browser/test-stream-transform-constructor-set-methods')(t);
30+
require('./browser/test-stream-transform-objectmode-falsey-value')(t);
31+
require('./browser/test-stream-transform-split-objectmode')(t);
32+
require('./browser/test-stream-unshift-empty-chunk')(t);
33+
require('./browser/test-stream-unshift-read-race')(t);
34+
require('./browser/test-stream-writable-change-default-encoding')(t);
35+
require('./browser/test-stream-writable-constructor-set-methods')(t);
36+
require('./browser/test-stream-writable-decoded-encoding')(t);
37+
require('./browser/test-stream-writev')(t);
38+
});
39+
40+
test('streams 2', function (t) {
41+
require('./browser/test-stream2-base64-single-char-read-end')(t);
42+
require('./browser/test-stream2-compatibility')(t);
43+
require('./browser/test-stream2-large-read-stall')(t);
44+
require('./browser/test-stream2-objects')(t);
45+
require('./browser/test-stream2-pipe-error-handling')(t);
46+
require('./browser/test-stream2-pipe-error-once-listener')(t);
47+
require('./browser/test-stream2-push')(t);
48+
require('./browser/test-stream2-readable-empty-buffer-no-eof')(t);
49+
require('./browser/test-stream2-readable-from-list')(t);
50+
require('./browser/test-stream2-transform')(t);
51+
require('./browser/test-stream2-set-encoding')(t);
52+
require('./browser/test-stream2-readable-legacy-drain')(t);
53+
require('./browser/test-stream2-readable-wrap-empty')(t);
54+
require('./browser/test-stream2-readable-non-empty-end')(t);
55+
require('./browser/test-stream2-readable-wrap')(t);
56+
require('./browser/test-stream2-unpipe-drain')(t);
57+
require('./browser/test-stream2-writable')(t);
58+
});
59+
test('streams 3', function (t) {
60+
require('./browser/test-stream3-pause-then-read')(t);
61+
});

0 commit comments

Comments
 (0)