message_handler_spec.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2019 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. var _util = require("../../shared/util");
  24. var _api = require("../../display/api");
  25. var _message_handler = require("../../shared/message_handler");
  26. function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
  27. describe('message_handler', function () {
  28. function sleep(ticks) {
  29. return Promise.resolve().then(function () {
  30. return ticks && sleep(ticks - 1);
  31. });
  32. }
  33. describe('sendWithStream', function () {
  34. it('should return a ReadableStream', function () {
  35. var port = new _api.LoopbackPort();
  36. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  37. var readable = messageHandler1.sendWithStream('fakeHandler');
  38. expect(_typeof(readable)).toEqual('object');
  39. expect(_typeof(readable.getReader)).toEqual('function');
  40. });
  41. it('should read using a reader', function (done) {
  42. var log = '';
  43. var port = new _api.LoopbackPort();
  44. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  45. var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
  46. messageHandler2.on('fakeHandler', function (data, sink) {
  47. sink.onPull = function () {
  48. log += 'p';
  49. };
  50. sink.onCancel = function (reason) {
  51. log += 'c';
  52. };
  53. sink.ready.then(function () {
  54. sink.enqueue('hi');
  55. return sink.ready;
  56. }).then(function () {
  57. sink.close();
  58. });
  59. return sleep(5);
  60. });
  61. var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
  62. highWaterMark: 1,
  63. size: function size() {
  64. return 1;
  65. }
  66. });
  67. var reader = readable.getReader();
  68. sleep(10).then(function () {
  69. expect(log).toEqual('');
  70. return reader.read();
  71. }).then(function (result) {
  72. expect(log).toEqual('p');
  73. expect(result.value).toEqual('hi');
  74. expect(result.done).toEqual(false);
  75. return sleep(10);
  76. }).then(function () {
  77. return reader.read();
  78. }).then(function (result) {
  79. expect(result.value).toEqual(undefined);
  80. expect(result.done).toEqual(true);
  81. done();
  82. });
  83. });
  84. it('should not read any data when cancelled', function (done) {
  85. var log = '';
  86. var port = new _api.LoopbackPort();
  87. var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
  88. messageHandler2.on('fakeHandler', function (data, sink) {
  89. sink.onPull = function () {
  90. log += 'p';
  91. };
  92. sink.onCancel = function (reason) {
  93. log += 'c';
  94. };
  95. log += '0';
  96. sink.ready.then(function () {
  97. log += '1';
  98. sink.enqueue([1, 2, 3, 4], 4);
  99. return sink.ready;
  100. }).then(function () {
  101. log += '2';
  102. sink.enqueue([5, 6, 7, 8], 4);
  103. return sink.ready;
  104. }).then(function () {
  105. log += '3';
  106. sink.close();
  107. }, function () {
  108. log += '4';
  109. });
  110. });
  111. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  112. var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
  113. highWaterMark: 4,
  114. size: function size(arr) {
  115. return arr.length;
  116. }
  117. });
  118. var reader = readable.getReader();
  119. sleep(10).then(function () {
  120. expect(log).toEqual('01');
  121. return reader.read();
  122. }).then(function (result) {
  123. expect(result.value).toEqual([1, 2, 3, 4]);
  124. expect(result.done).toEqual(false);
  125. return sleep(10);
  126. }).then(function () {
  127. expect(log).toEqual('01p2');
  128. return reader.cancel();
  129. }).then(function () {
  130. expect(log).toEqual('01p2c4');
  131. done();
  132. });
  133. });
  134. it('should not read when errored', function (done) {
  135. var log = '';
  136. var port = new _api.LoopbackPort();
  137. var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
  138. messageHandler2.on('fakeHandler', function (data, sink) {
  139. sink.onPull = function () {
  140. log += 'p';
  141. };
  142. sink.onCancel = function (reason) {
  143. log += 'c';
  144. };
  145. sink.ready.then(function () {
  146. sink.enqueue([1, 2, 3, 4], 4);
  147. return sink.ready;
  148. }).then(function () {
  149. log += 'error';
  150. sink.error('error');
  151. });
  152. });
  153. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  154. var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
  155. highWaterMark: 4,
  156. size: function size(arr) {
  157. return arr.length;
  158. }
  159. });
  160. var reader = readable.getReader();
  161. sleep(10).then(function () {
  162. expect(log).toEqual('');
  163. return reader.read();
  164. }).then(function (result) {
  165. expect(result.value).toEqual([1, 2, 3, 4]);
  166. expect(result.done).toEqual(false);
  167. return reader.read();
  168. }).then(function () {}, function (reason) {
  169. expect(reason).toEqual('error');
  170. done();
  171. });
  172. });
  173. it('should read data with blocking promise', function (done) {
  174. var log = '';
  175. var port = new _api.LoopbackPort();
  176. var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
  177. messageHandler2.on('fakeHandler', function (data, sink) {
  178. sink.onPull = function () {
  179. log += 'p';
  180. };
  181. sink.onCancel = function (reason) {
  182. log += 'c';
  183. };
  184. log += '0';
  185. sink.ready.then(function () {
  186. log += '1';
  187. sink.enqueue([1, 2, 3, 4], 4);
  188. return sink.ready;
  189. }).then(function () {
  190. log += '2';
  191. sink.enqueue([5, 6, 7, 8], 4);
  192. return sink.ready;
  193. }).then(function () {
  194. sink.close();
  195. });
  196. });
  197. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  198. var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
  199. highWaterMark: 4,
  200. size: function size(arr) {
  201. return arr.length;
  202. }
  203. });
  204. var reader = readable.getReader();
  205. sleep(10).then(function () {
  206. expect(log).toEqual('01');
  207. return reader.read();
  208. }).then(function (result) {
  209. expect(result.value).toEqual([1, 2, 3, 4]);
  210. expect(result.done).toEqual(false);
  211. return sleep(10);
  212. }).then(function () {
  213. expect(log).toEqual('01p2');
  214. return reader.read();
  215. }).then(function (result) {
  216. expect(result.value).toEqual([5, 6, 7, 8]);
  217. expect(result.done).toEqual(false);
  218. return sleep(10);
  219. }).then(function () {
  220. expect(log).toEqual('01p2p');
  221. return reader.read();
  222. }).then(function (result) {
  223. expect(result.value).toEqual(undefined);
  224. expect(result.done).toEqual(true);
  225. done();
  226. });
  227. });
  228. it('should read data with blocking promise and buffer whole data' + ' into stream', function (done) {
  229. var log = '';
  230. var port = new _api.LoopbackPort();
  231. var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
  232. messageHandler2.on('fakeHandler', function (data, sink) {
  233. sink.onPull = function () {
  234. log += 'p';
  235. };
  236. sink.onCancel = function (reason) {
  237. log += 'c';
  238. };
  239. log += '0';
  240. sink.ready.then(function () {
  241. log += '1';
  242. sink.enqueue([1, 2, 3, 4], 4);
  243. return sink.ready;
  244. }).then(function () {
  245. log += '2';
  246. sink.enqueue([5, 6, 7, 8], 4);
  247. return sink.ready;
  248. }).then(function () {
  249. sink.close();
  250. });
  251. return sleep(10);
  252. });
  253. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  254. var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
  255. highWaterMark: 8,
  256. size: function size(arr) {
  257. return arr.length;
  258. }
  259. });
  260. var reader = readable.getReader();
  261. sleep(10).then(function () {
  262. expect(log).toEqual('012');
  263. return reader.read();
  264. }).then(function (result) {
  265. expect(result.value).toEqual([1, 2, 3, 4]);
  266. expect(result.done).toEqual(false);
  267. return sleep(10);
  268. }).then(function () {
  269. expect(log).toEqual('012p');
  270. return reader.read();
  271. }).then(function (result) {
  272. expect(result.value).toEqual([5, 6, 7, 8]);
  273. expect(result.done).toEqual(false);
  274. return sleep(10);
  275. }).then(function () {
  276. expect(log).toEqual('012p');
  277. return reader.read();
  278. }).then(function (result) {
  279. expect(result.value).toEqual(undefined);
  280. expect(result.done).toEqual(true);
  281. done();
  282. });
  283. });
  284. it('should ignore any pull after close is called', function (done) {
  285. var log = '';
  286. var port = new _api.LoopbackPort();
  287. var capability = (0, _util.createPromiseCapability)();
  288. var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
  289. messageHandler2.on('fakeHandler', function (data, sink) {
  290. sink.onPull = function () {
  291. log += 'p';
  292. };
  293. sink.onCancel = function (reason) {
  294. log += 'c';
  295. };
  296. log += '0';
  297. sink.ready.then(function () {
  298. log += '1';
  299. sink.enqueue([1, 2, 3, 4], 4);
  300. });
  301. return capability.promise.then(function () {
  302. sink.close();
  303. });
  304. });
  305. var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
  306. var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
  307. highWaterMark: 10,
  308. size: function size(arr) {
  309. return arr.length;
  310. }
  311. });
  312. var reader = readable.getReader();
  313. sleep(10).then(function () {
  314. expect(log).toEqual('01');
  315. capability.resolve();
  316. return capability.promise.then(function () {
  317. return reader.read();
  318. });
  319. }).then(function (result) {
  320. expect(result.value).toEqual([1, 2, 3, 4]);
  321. expect(result.done).toEqual(false);
  322. return sleep(10);
  323. }).then(function () {
  324. expect(log).toEqual('01');
  325. return reader.read();
  326. }).then(function (result) {
  327. expect(result.value).toEqual(undefined);
  328. expect(result.done).toEqual(true);
  329. done();
  330. });
  331. });
  332. });
  333. });