Skip to content

Commit 46b2f86

Browse files
committed
added hybi07 tests
1 parent e5c8617 commit 46b2f86

File tree

1 file changed

+235
-0
lines changed

1 file changed

+235
-0
lines changed
Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
var assert = require('assert');
2+
var Parser = require('../lib/transports/wsver/7.js').Parser;
3+
4+
function makeBufferFromHexString(byteStr) {
5+
var bytes = byteStr.split(' ');
6+
var buf = new Buffer(bytes.length);
7+
for (var i = 0; i < bytes.length; ++i) {
8+
buf[i] = parseInt(bytes[i], 16);
9+
}
10+
return buf;
11+
}
12+
13+
function splitBuffer(buffer) {
14+
var b1 = new Buffer(Math.ceil(buffer.length / 2));
15+
var b2 = new Buffer(Math.floor(buffer.length / 2));
16+
buffer.copy(b1, 0, 0, b1.length);
17+
buffer.copy(b2, 0, b1.length, b1.length + b2.length);
18+
return [b1, b2];
19+
}
20+
21+
function mask(str, maskString) {
22+
var buf = new Buffer(str);
23+
var mask = makeBufferFromHexString(maskString || '34 83 a8 68');
24+
for (var i = 0; i < buf.length; ++i) {
25+
buf[i] ^= mask[i % 4];
26+
}
27+
return buf;
28+
}
29+
30+
function unpack(buffer) {
31+
var n = 0;
32+
for (var i = 0; i < buffer.length; ++i) {
33+
n = (i == 0) ? buffer[i] : (n * 256) + buffer[i];
34+
}
35+
return n;
36+
}
37+
38+
function pack(length, number) {
39+
return padl(number.toString(16), length, '0').replace(/(\d\d)/g, '$1 ').trim();
40+
}
41+
42+
function padl(s,n,c) {
43+
return new Array(1 + n - s.length).join(c) + s;
44+
}
45+
46+
function dump(data) {
47+
var s = '';
48+
for (var i = 0; i < data.length; ++i) {
49+
s += padl(data[i].toString(16), 2, '0') + ' ';
50+
}
51+
return s.trim();
52+
}
53+
54+
module.exports = {
55+
'can parse unmasked text message': function() {
56+
var p = new Parser();
57+
var packet = '81 05 48 65 6c 6c 6f';
58+
59+
var gotData = false;
60+
p.on('data', function(data) {
61+
gotData = true;
62+
assert.equal('Hello', data);
63+
});
64+
65+
p.add(makeBufferFromHexString(packet));
66+
assert.ok(gotData);
67+
},
68+
'can parse close message': function() {
69+
var p = new Parser();
70+
var packet = '88 00';
71+
72+
var gotClose = false;
73+
p.on('close', function(data) {
74+
gotClose = true;
75+
});
76+
77+
p.add(makeBufferFromHexString(packet));
78+
assert.ok(gotClose);
79+
},
80+
'can parse masked text message': function() {
81+
var p = new Parser();
82+
var packet = '81 93 34 83 a8 68 01 b9 92 52 4f a1 c6 09 59 e6 8a 52 16 e6 cb 00 5b a1 d5';
83+
84+
var gotData = false;
85+
p.on('data', function(data) {
86+
gotData = true;
87+
assert.equal('5:::{"name":"echo"}', data);
88+
});
89+
90+
p.add(makeBufferFromHexString(packet));
91+
assert.ok(gotData);
92+
},
93+
'can parse a masked text message longer than 125 bytes': function() {
94+
var p = new Parser();
95+
var message = 'A';
96+
for (var i = 0; i < 300; ++i) message += (i % 5).toString();
97+
var packet = '81 FE ' + pack(4, message.length) + ' 34 83 a8 68 ' + dump(mask(message, '34 83 a8 68'));
98+
99+
var gotData = false;
100+
p.on('data', function(data) {
101+
gotData = true;
102+
assert.equal(message, data);
103+
});
104+
105+
p.add(makeBufferFromHexString(packet));
106+
assert.ok(gotData);
107+
},
108+
'can parse a really long masked text message': function() {
109+
var p = new Parser();
110+
var message = 'A';
111+
for (var i = 0; i < 64*1024; ++i) message += (i % 5).toString();
112+
var packet = '81 FF ' + pack(16, message.length) + ' 34 83 a8 68 ' + dump(mask(message, '34 83 a8 68'));
113+
114+
var gotData = false;
115+
p.on('data', function(data) {
116+
gotData = true;
117+
assert.equal(message, data);
118+
});
119+
120+
p.add(makeBufferFromHexString(packet));
121+
assert.ok(gotData);
122+
},
123+
'can parse a fragmented masked text message of 300 bytes': function() {
124+
var p = new Parser();
125+
var message = 'A';
126+
for (var i = 0; i < 300; ++i) message += (i % 5).toString();
127+
var msgpiece1 = message.substr(0, 150);
128+
var msgpiece2 = message.substr(150);
129+
var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + dump(mask(msgpiece1, '34 83 a8 68'));
130+
var packet2 = '81 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + dump(mask(msgpiece2, '34 83 a8 68'));
131+
132+
var gotData = false;
133+
p.on('data', function(data) {
134+
gotData = true;
135+
assert.equal(message, data);
136+
});
137+
138+
p.add(makeBufferFromHexString(packet1));
139+
p.add(makeBufferFromHexString(packet2));
140+
assert.ok(gotData);
141+
},
142+
'can parse a ping message': function() {
143+
var p = new Parser();
144+
var message = 'Hello';
145+
var packet = '89 FE ' + pack(4, message.length) + ' 34 83 a8 68 ' + dump(mask(message, '34 83 a8 68'));
146+
147+
var gotPing = false;
148+
p.on('ping', function(data) {
149+
gotPing = true;
150+
assert.equal(message, data);
151+
});
152+
153+
p.add(makeBufferFromHexString(packet));
154+
assert.ok(gotPing);
155+
},
156+
'can parse a ping with no data': function() {
157+
var p = new Parser();
158+
var packet = '89 00';
159+
160+
var gotPing = false;
161+
p.on('ping', function(data) {
162+
gotPing = true;
163+
});
164+
165+
p.add(makeBufferFromHexString(packet));
166+
assert.ok(gotPing);
167+
},
168+
'can parse a fragmented masked text message of 300 bytes with a ping in the middle': function() {
169+
var p = new Parser();
170+
var message = 'A';
171+
for (var i = 0; i < 300; ++i) message += (i % 5).toString();
172+
173+
var msgpiece1 = message.substr(0, 150);
174+
var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + dump(mask(msgpiece1, '34 83 a8 68'));
175+
176+
var pingMessage = 'Hello';
177+
var pingPacket = '89 FE ' + pack(4, pingMessage.length) + ' 34 83 a8 68 ' + dump(mask(pingMessage, '34 83 a8 68'));
178+
179+
var msgpiece2 = message.substr(150);
180+
var packet2 = '81 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + dump(mask(msgpiece2, '34 83 a8 68'));
181+
182+
var gotData = false;
183+
p.on('data', function(data) {
184+
gotData = true;
185+
assert.equal(message, data);
186+
});
187+
var gotPing = false;
188+
p.on('ping', function(data) {
189+
gotPing = true;
190+
assert.equal(pingMessage, data);
191+
});
192+
193+
p.add(makeBufferFromHexString(packet1));
194+
p.add(makeBufferFromHexString(pingPacket));
195+
p.add(makeBufferFromHexString(packet2));
196+
assert.ok(gotData);
197+
assert.ok(gotPing);
198+
},
199+
'can parse a fragmented masked text message of 300 bytes with a ping in the middle, which is delievered over sevaral tcp packets': function() {
200+
var p = new Parser();
201+
var message = 'A';
202+
for (var i = 0; i < 300; ++i) message += (i % 5).toString();
203+
204+
var msgpiece1 = message.substr(0, 150);
205+
var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + dump(mask(msgpiece1, '34 83 a8 68'));
206+
207+
var pingMessage = 'Hello';
208+
var pingPacket = '89 FE ' + pack(4, pingMessage.length) + ' 34 83 a8 68 ' + dump(mask(pingMessage, '34 83 a8 68'));
209+
210+
var msgpiece2 = message.substr(150);
211+
var packet2 = '81 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + dump(mask(msgpiece2, '34 83 a8 68'));
212+
213+
var gotData = false;
214+
p.on('data', function(data) {
215+
gotData = true;
216+
assert.equal(message, data);
217+
});
218+
var gotPing = false;
219+
p.on('ping', function(data) {
220+
gotPing = true;
221+
assert.equal(pingMessage, data);
222+
});
223+
224+
var buffers = [];
225+
buffers = buffers.concat(splitBuffer(makeBufferFromHexString(packet1)));
226+
buffers = buffers.concat(splitBuffer(makeBufferFromHexString(pingPacket)));
227+
buffers = buffers.concat(splitBuffer(makeBufferFromHexString(packet2)));
228+
for (var i = 0; i < buffers.length; ++i) {
229+
p.add(buffers[i]);
230+
}
231+
assert.ok(gotData);
232+
assert.ok(gotPing);
233+
},
234+
};
235+

0 commit comments

Comments
 (0)