arnaucube
arnaucube/raspberryGPIOhtmlserverPublic Self-hosted repository
raspberryGPIOhtmlserver/node_modules/ws/test/Receiver.test.js
node_modules/ws/test/Receiver.test.jsRaw
  1var assert = require('assert')
  2  , Receiver = require('../lib/Receiver');
  3require('should');
  4require('./hybi-common');
  5
  6describe('Receiver', function() {
  7  it('can parse unmasked text message', function() {
  8    var p = new Receiver();
  9    var packet = '81 05 48 65 6c 6c 6f';
 10
 11    var gotData = false;
 12    p.ontext = function(data) {
 13      gotData = true;
 14      assert.equal('Hello', data);
 15    };
 16
 17    p.add(getBufferFromHexString(packet));
 18    gotData.should.be.ok;
 19  });
 20  it('can parse close message', function() {
 21    var p = new Receiver();
 22    var packet = '88 00';
 23
 24    var gotClose = false;
 25    p.onclose = function(data) {
 26      gotClose = true;
 27    };
 28
 29    p.add(getBufferFromHexString(packet));
 30    gotClose.should.be.ok;
 31  });
 32  it('can parse masked text message', function() {
 33    var p = new Receiver();
 34    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';
 35
 36    var gotData = false;
 37    p.ontext = function(data) {
 38      gotData = true;
 39      assert.equal('5:::{"name":"echo"}', data);
 40    };
 41
 42    p.add(getBufferFromHexString(packet));
 43    gotData.should.be.ok;
 44  });
 45  it('can parse a masked text message longer than 125 bytes', function() {
 46    var p = new Receiver();
 47    var message = 'A';
 48    for (var i = 0; i < 300; ++i) message += (i % 5).toString();
 49    var packet = '81 FE ' + pack(4, message.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
 50
 51    var gotData = false;
 52    p.ontext = function(data) {
 53      gotData = true;
 54      assert.equal(message, data);
 55    };
 56
 57    p.add(getBufferFromHexString(packet));
 58    gotData.should.be.ok;
 59  });
 60  it('can parse a really long masked text message', function() {
 61    var p = new Receiver();
 62    var message = 'A';
 63    for (var i = 0; i < 64*1024; ++i) message += (i % 5).toString();
 64    var packet = '81 FF ' + pack(16, message.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
 65
 66    var gotData = false;
 67    p.ontext = function(data) {
 68      gotData = true;
 69      assert.equal(message, data);
 70    };
 71
 72    p.add(getBufferFromHexString(packet));
 73    gotData.should.be.ok;
 74  });
 75  it('can parse a fragmented masked text message of 300 bytes', function() {
 76    var p = new Receiver();
 77    var message = 'A';
 78    for (var i = 0; i < 300; ++i) message += (i % 5).toString();
 79    var msgpiece1 = message.substr(0, 150);
 80    var msgpiece2 = message.substr(150);
 81    var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
 82    var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
 83
 84    var gotData = false;
 85    p.ontext = function(data) {
 86      gotData = true;
 87      assert.equal(message, data);
 88    };
 89
 90    p.add(getBufferFromHexString(packet1));
 91    p.add(getBufferFromHexString(packet2));
 92    gotData.should.be.ok;
 93  });
 94  it('can parse a ping message', function() {
 95    var p = new Receiver();
 96    var message = 'Hello';
 97    var packet = '89 ' + getHybiLengthAsHexString(message.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
 98
 99    var gotPing = false;
100    p.onping = function(data) {
101      gotPing = true;
102      assert.equal(message, data);
103    };
104
105    p.add(getBufferFromHexString(packet));
106    gotPing.should.be.ok;
107  });
108  it('can parse a ping with no data', function() {
109    var p = new Receiver();
110    var packet = '89 00';
111
112    var gotPing = false;
113    p.onping = function(data) {
114      gotPing = true;
115    };
116
117    p.add(getBufferFromHexString(packet));
118    gotPing.should.be.ok;
119  });
120  it('can parse a fragmented masked text message of 300 bytes with a ping in the middle', function() {
121    var p = new Receiver();
122    var message = 'A';
123    for (var i = 0; i < 300; ++i) message += (i % 5).toString();
124
125    var msgpiece1 = message.substr(0, 150);
126    var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
127
128    var pingMessage = 'Hello';
129    var pingPacket = '89 ' + getHybiLengthAsHexString(pingMessage.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68'));
130
131    var msgpiece2 = message.substr(150);
132    var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
133
134    var gotData = false;
135    p.ontext = function(data) {
136      gotData = true;
137      assert.equal(message, data);
138    };
139    var gotPing = false;
140    p.onping = function(data) {
141      gotPing = true;
142      assert.equal(pingMessage, data);
143    };
144
145    p.add(getBufferFromHexString(packet1));
146    p.add(getBufferFromHexString(pingPacket));
147    p.add(getBufferFromHexString(packet2));
148    gotData.should.be.ok;
149    gotPing.should.be.ok;
150  });
151  it('can parse a fragmented masked text message of 300 bytes with a ping in the middle, which is delievered over sevaral tcp packets', function() {
152    var p = new Receiver();
153    var message = 'A';
154    for (var i = 0; i < 300; ++i) message += (i % 5).toString();
155
156    var msgpiece1 = message.substr(0, 150);
157    var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
158
159    var pingMessage = 'Hello';
160    var pingPacket = '89 ' + getHybiLengthAsHexString(pingMessage.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68'));
161
162    var msgpiece2 = message.substr(150);
163    var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
164
165    var gotData = false;
166    p.ontext = function(data) {
167      gotData = true;
168      assert.equal(message, data);
169    };
170    var gotPing = false;
171    p.onping = function(data) {
172      gotPing = true;
173      assert.equal(pingMessage, data);
174    };
175
176    var buffers = [];
177    buffers = buffers.concat(splitBuffer(getBufferFromHexString(packet1)));
178    buffers = buffers.concat(splitBuffer(getBufferFromHexString(pingPacket)));
179    buffers = buffers.concat(splitBuffer(getBufferFromHexString(packet2)));
180    for (var i = 0; i < buffers.length; ++i) {
181      p.add(buffers[i]);
182    }
183    gotData.should.be.ok;
184    gotPing.should.be.ok;
185  });
186  it('can parse a 100 byte long masked binary message', function() {
187    var p = new Receiver();
188    var length = 100;
189    var message = new Buffer(length);
190    for (var i = 0; i < length; ++i) message[i] = i % 256;
191    var originalMessage = getHexStringFromBuffer(message);
192    var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
193
194    var gotData = false;
195    p.onbinary = function(data) {
196      gotData = true;
197      assert.equal(originalMessage, getHexStringFromBuffer(data));
198    };
199
200    p.add(getBufferFromHexString(packet));
201    gotData.should.be.ok;
202  });
203  it('can parse a 256 byte long masked binary message', function() {
204    var p = new Receiver();
205    var length = 256;
206    var message = new Buffer(length);
207    for (var i = 0; i < length; ++i) message[i] = i % 256;
208    var originalMessage = getHexStringFromBuffer(message);
209    var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
210
211    var gotData = false;
212    p.onbinary = function(data) {
213      gotData = true;
214      assert.equal(originalMessage, getHexStringFromBuffer(data));
215    };
216
217    p.add(getBufferFromHexString(packet));
218    gotData.should.be.ok;
219  });
220  it('can parse a 200kb long masked binary message', function() {
221    var p = new Receiver();
222    var length = 200 * 1024;
223    var message = new Buffer(length);
224    for (var i = 0; i < length; ++i) message[i] = i % 256;
225    var originalMessage = getHexStringFromBuffer(message);
226    var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
227
228    var gotData = false;
229    p.onbinary = function(data) {
230      gotData = true;
231      assert.equal(originalMessage, getHexStringFromBuffer(data));
232    };
233
234    p.add(getBufferFromHexString(packet));
235    gotData.should.be.ok;
236  });
237  it('can parse a 200kb long unmasked binary message', function() {
238    var p = new Receiver();
239    var length = 200 * 1024;
240    var message = new Buffer(length);
241    for (var i = 0; i < length; ++i) message[i] = i % 256;
242    var originalMessage = getHexStringFromBuffer(message);
243    var packet = '82 ' + getHybiLengthAsHexString(length, false) + ' ' + getHexStringFromBuffer(message);
244
245    var gotData = false;
246    p.onbinary = function(data) {
247      gotData = true;
248      assert.equal(originalMessage, getHexStringFromBuffer(data));
249    };
250
251    p.add(getBufferFromHexString(packet));
252    gotData.should.be.ok;
253  });
254});
255