UNPKG

13.1 kBJavaScriptView Raw
1/**
2 * @licstart The following is the entire license notice for the
3 * Javascript code in this page
4 *
5 * Copyright 2017 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * Javascript code in this page
21 */
22'use strict';
23
24var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
25
26var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
27
28var _util = require('../../shared/util');
29
30function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
31
32describe('util_stream', function () {
33 var FakePort = function () {
34 function FakePort() {
35 _classCallCheck(this, FakePort);
36
37 this._listeners = [];
38 this._deferred = Promise.resolve(undefined);
39 }
40
41 _createClass(FakePort, [{
42 key: 'postMessage',
43 value: function postMessage(obj) {
44 var _this = this;
45
46 var event = { data: obj };
47 this._deferred.then(function () {
48 _this._listeners.forEach(function (listener) {
49 listener.call(this, event);
50 }, _this);
51 });
52 }
53 }, {
54 key: 'addEventListener',
55 value: function addEventListener(name, listener) {
56 this._listeners.push(listener);
57 }
58 }, {
59 key: 'removeEventListener',
60 value: function removeEventListener(name, listener) {
61 var i = this._listeners.indexOf(listener);
62 this._listeners.splice(i, 1);
63 }
64 }, {
65 key: 'terminate',
66 value: function terminate() {
67 this._listeners = [];
68 }
69 }]);
70
71 return FakePort;
72 }();
73
74 function sleep(ticks) {
75 return Promise.resolve().then(function () {
76 return ticks && sleep(ticks - 1);
77 });
78 }
79 describe('sendWithStream', function () {
80 it('should return a ReadableStream', function () {
81 var port = new FakePort();
82 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
83 var readable = messageHandler1.sendWithStream('fakeHandler');
84 expect(typeof readable === 'undefined' ? 'undefined' : _typeof(readable)).toEqual('object');
85 expect(_typeof(readable.getReader)).toEqual('function');
86 });
87 it('should read using a reader', function (done) {
88 var log = '';
89 var port = new FakePort();
90 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
91 var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
92 messageHandler2.on('fakeHandler', function (data, sink) {
93 sink.onPull = function () {
94 log += 'p';
95 };
96 sink.onCancel = function (reason) {
97 log += 'c';
98 };
99 sink.ready.then(function () {
100 sink.enqueue('hi');
101 return sink.ready;
102 }).then(function () {
103 sink.close();
104 });
105 return sleep(5);
106 });
107 var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
108 highWaterMark: 1,
109 size: function size() {
110 return 1;
111 }
112 });
113 var reader = readable.getReader();
114 sleep(10).then(function () {
115 expect(log).toEqual('');
116 return reader.read();
117 }).then(function (result) {
118 expect(log).toEqual('p');
119 expect(result.value).toEqual('hi');
120 expect(result.done).toEqual(false);
121 return sleep(10);
122 }).then(function () {
123 return reader.read();
124 }).then(function (result) {
125 expect(result.value).toEqual(undefined);
126 expect(result.done).toEqual(true);
127 done();
128 });
129 });
130 it('should not read any data when cancelled', function (done) {
131 var log = '';
132 var port = new FakePort();
133 var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
134 messageHandler2.on('fakeHandler', function (data, sink) {
135 sink.onPull = function () {
136 log += 'p';
137 };
138 sink.onCancel = function (reason) {
139 log += 'c';
140 };
141 log += '0';
142 sink.ready.then(function () {
143 log += '1';
144 sink.enqueue([1, 2, 3, 4], 4);
145 return sink.ready;
146 }).then(function () {
147 log += '2';
148 sink.enqueue([5, 6, 7, 8], 4);
149 return sink.ready;
150 }).then(function () {
151 log += '3';
152 sink.close();
153 }, function () {
154 log += '4';
155 });
156 });
157 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
158 var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
159 highWaterMark: 4,
160 size: function size(arr) {
161 return arr.length;
162 }
163 });
164 var reader = readable.getReader();
165 sleep(10).then(function () {
166 expect(log).toEqual('01');
167 return reader.read();
168 }).then(function (result) {
169 expect(result.value).toEqual([1, 2, 3, 4]);
170 expect(result.done).toEqual(false);
171 return sleep(10);
172 }).then(function () {
173 expect(log).toEqual('01p2');
174 return reader.cancel();
175 }).then(function () {
176 expect(log).toEqual('01p2c4');
177 done();
178 });
179 });
180 it('should not read when errored', function (done) {
181 var log = '';
182 var port = new FakePort();
183 var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
184 messageHandler2.on('fakeHandler', function (data, sink) {
185 sink.onPull = function () {
186 log += 'p';
187 };
188 sink.onCancel = function (reason) {
189 log += 'c';
190 };
191 sink.ready.then(function () {
192 sink.enqueue([1, 2, 3, 4], 4);
193 return sink.ready;
194 }).then(function () {
195 log += 'error';
196 sink.error('error');
197 });
198 });
199 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
200 var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
201 highWaterMark: 4,
202 size: function size(arr) {
203 return arr.length;
204 }
205 });
206 var reader = readable.getReader();
207 sleep(10).then(function () {
208 expect(log).toEqual('');
209 return reader.read();
210 }).then(function (result) {
211 expect(result.value).toEqual([1, 2, 3, 4]);
212 expect(result.done).toEqual(false);
213 return reader.read();
214 }).then(function () {}, function (reason) {
215 expect(reason).toEqual('error');
216 done();
217 });
218 });
219 it('should read data with blocking promise', function (done) {
220 var log = '';
221 var port = new FakePort();
222 var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
223 messageHandler2.on('fakeHandler', function (data, sink) {
224 sink.onPull = function () {
225 log += 'p';
226 };
227 sink.onCancel = function (reason) {
228 log += 'c';
229 };
230 log += '0';
231 sink.ready.then(function () {
232 log += '1';
233 sink.enqueue([1, 2, 3, 4], 4);
234 return sink.ready;
235 }).then(function () {
236 log += '2';
237 sink.enqueue([5, 6, 7, 8], 4);
238 return sink.ready;
239 }).then(function () {
240 sink.close();
241 });
242 });
243 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
244 var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
245 highWaterMark: 4,
246 size: function size(arr) {
247 return arr.length;
248 }
249 });
250 var reader = readable.getReader();
251 sleep(10).then(function () {
252 expect(log).toEqual('01');
253 return reader.read();
254 }).then(function (result) {
255 expect(result.value).toEqual([1, 2, 3, 4]);
256 expect(result.done).toEqual(false);
257 return sleep(10);
258 }).then(function () {
259 expect(log).toEqual('01p2');
260 return reader.read();
261 }).then(function (result) {
262 expect(result.value).toEqual([5, 6, 7, 8]);
263 expect(result.done).toEqual(false);
264 return sleep(10);
265 }).then(function () {
266 expect(log).toEqual('01p2p');
267 return reader.read();
268 }).then(function (result) {
269 expect(result.value).toEqual(undefined);
270 expect(result.done).toEqual(true);
271 done();
272 });
273 });
274 it('should read data with blocking promise and buffer whole data' + ' into stream', function (done) {
275 var log = '';
276 var port = new FakePort();
277 var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
278 messageHandler2.on('fakeHandler', function (data, sink) {
279 sink.onPull = function () {
280 log += 'p';
281 };
282 sink.onCancel = function (reason) {
283 log += 'c';
284 };
285 log += '0';
286 sink.ready.then(function () {
287 log += '1';
288 sink.enqueue([1, 2, 3, 4], 4);
289 return sink.ready;
290 }).then(function () {
291 log += '2';
292 sink.enqueue([5, 6, 7, 8], 4);
293 return sink.ready;
294 }).then(function () {
295 sink.close();
296 });
297 return sleep(10);
298 });
299 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
300 var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
301 highWaterMark: 8,
302 size: function size(arr) {
303 return arr.length;
304 }
305 });
306 var reader = readable.getReader();
307 sleep(10).then(function () {
308 expect(log).toEqual('012');
309 return reader.read();
310 }).then(function (result) {
311 expect(result.value).toEqual([1, 2, 3, 4]);
312 expect(result.done).toEqual(false);
313 return sleep(10);
314 }).then(function () {
315 expect(log).toEqual('012p');
316 return reader.read();
317 }).then(function (result) {
318 expect(result.value).toEqual([5, 6, 7, 8]);
319 expect(result.done).toEqual(false);
320 return sleep(10);
321 }).then(function () {
322 expect(log).toEqual('012p');
323 return reader.read();
324 }).then(function (result) {
325 expect(result.value).toEqual(undefined);
326 expect(result.done).toEqual(true);
327 done();
328 });
329 });
330 it('should ignore any pull after close is called', function (done) {
331 var log = '';
332 var port = new FakePort();
333 var capability = (0, _util.createPromiseCapability)();
334 var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
335 messageHandler2.on('fakeHandler', function (data, sink) {
336 sink.onPull = function () {
337 log += 'p';
338 };
339 sink.onCancel = function (reason) {
340 log += 'c';
341 };
342 log += '0';
343 sink.ready.then(function () {
344 log += '1';
345 sink.enqueue([1, 2, 3, 4], 4);
346 });
347 return capability.promise.then(function () {
348 sink.close();
349 });
350 });
351 var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
352 var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
353 highWaterMark: 10,
354 size: function size(arr) {
355 return arr.length;
356 }
357 });
358 var reader = readable.getReader();
359 sleep(10).then(function () {
360 expect(log).toEqual('01');
361 capability.resolve();
362 return capability.promise.then(function () {
363 return reader.read();
364 });
365 }).then(function (result) {
366 expect(result.value).toEqual([1, 2, 3, 4]);
367 expect(result.done).toEqual(false);
368 return sleep(10);
369 }).then(function () {
370 expect(log).toEqual('01');
371 return reader.read();
372 }).then(function (result) {
373 expect(result.value).toEqual(undefined);
374 expect(result.done).toEqual(true);
375 done();
376 });
377 });
378 });
379});
\No newline at end of file