2
0

util_stream_spec.js 13 KB

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