Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: third_party/WebKit/LayoutTests/http/tests/streams/piping/close-propagation-forward.js

Issue 2561443004: Implementation of ReadableStream pipeTo and pipeThrough (Closed)
Patch Set: Stop waiting for writes to terminate at shutdown Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 'use strict';
2
3 if (self.importScripts) {
4 self.importScripts('/resources/testharness.js');
5 self.importScripts('../resources/test-utils.js');
6 self.importScripts('../resources/recording-streams.js');
7 }
8
9 const error1 = new Error('error1!');
10 error1.name = 'error1';
11
12 promise_test(() => {
13
14 const rs = recordingReadableStream({
15 start(controller) {
16 controller.close();
17 }
18 });
19
20 const ws = recordingWritableStream();
21
22 return rs.pipeTo(ws).then(value => {
23 assert_equals(value, undefined, 'the promise must fulfill with undefined');
24 })
25 .then(() => {
26 assert_array_equals(rs.events, []);
27 assert_array_equals(ws.events, ['close']);
28
29 return Promise.all([
30 rs.getReader().closed,
31 ws.getWriter().closed
32 ]);
33 });
34
35 }, 'Closing must be propagated forward: starts closed; preventClose omitted; ful filled close promise');
36
37 promise_test(t => {
38
39 const rs = recordingReadableStream({
40 start(controller) {
41 controller.close();
42 }
43 });
44
45 const ws = recordingWritableStream({
46 close() {
47 throw error1;
48 }
49 });
50
51 return promise_rejects(t, error1, rs.pipeTo(ws), 'pipeTo must reject with the same error').then(() => {
52 assert_array_equals(rs.events, []);
53 assert_array_equals(ws.events, ['close']);
54
55 return Promise.all([
56 rs.getReader().closed,
57 promise_rejects(t, error1, ws.getWriter().closed)
58 ]);
59 });
60
61 }, 'Closing must be propagated forward: starts closed; preventClose omitted; rej ected close promise');
62
63 for (const falsy of [undefined, null, false, +0, -0, NaN, '']) {
64 promise_test(() => {
65
66 const rs = recordingReadableStream({
67 start(controller) {
68 controller.close();
69 }
70 });
71
72 const ws = recordingWritableStream();
73
74 return rs.pipeTo(ws, { preventClose: falsy }).then(value => {
75 assert_equals(value, undefined, 'the promise must fulfill with undefined') ;
76 })
77 .then(() => {
78 assert_array_equals(rs.events, []);
79 assert_array_equals(ws.events, ['close']);
80
81 return Promise.all([
82 rs.getReader().closed,
83 ws.getWriter().closed
84 ]);
85 });
86
87 }, `Closing must be propagated forward: starts closed; preventClose = ${falsy} (falsy); fulfilled close promise`);
88 }
89
90 for (const truthy of [true, 'a', 1, Symbol(), { }]) {
91 promise_test(() => {
92
93 const rs = recordingReadableStream({
94 start(controller) {
95 controller.close();
96 }
97 });
98
99 const ws = recordingWritableStream();
100
101 return rs.pipeTo(ws, { preventClose: truthy }).then(value => {
102 assert_equals(value, undefined, 'the promise must fulfill with undefined') ;
103 })
104 .then(() => {
105 assert_array_equals(rs.events, []);
106 assert_array_equals(ws.events, []);
107
108 return rs.getReader().closed;
109 });
110
111 }, `Closing must be propagated forward: starts closed; preventClose = ${String (truthy)} (truthy)`);
112 }
113
114 promise_test(() => {
115
116 const rs = recordingReadableStream({
117 start(controller) {
118 controller.close();
119 }
120 });
121
122 const ws = recordingWritableStream();
123
124 return rs.pipeTo(ws, { preventClose: true, preventAbort: true }).then(value => {
125 assert_equals(value, undefined, 'the promise must fulfill with undefined');
126 })
127 .then(() => {
128 assert_array_equals(rs.events, []);
129 assert_array_equals(ws.events, []);
130
131 return rs.getReader().closed;
132 });
133
134 }, 'Closing must be propagated forward: starts closed; preventClose = true, prev entAbort = true');
135
136 promise_test(() => {
137
138 const rs = recordingReadableStream({
139 start(controller) {
140 controller.close();
141 }
142 });
143
144 const ws = recordingWritableStream();
145
146 return rs.pipeTo(ws, { preventClose: true, preventAbort: true, preventCancel: true }).then(value => {
147 assert_equals(value, undefined, 'the promise must fulfill with undefined');
148 })
149 .then(() => {
150 assert_array_equals(rs.events, []);
151 assert_array_equals(ws.events, []);
152
153 return rs.getReader().closed;
154 });
155
156 }, 'Closing must be propagated forward: starts closed; preventClose = true, prev entAbort = true, preventCancel = true');
157
158 promise_test(() => {
159
160 const rs = recordingReadableStream();
161
162 const ws = recordingWritableStream();
163
164 const pipePromise = rs.pipeTo(ws);
165
166 setTimeout(() => rs.controller.close());
167
168 return pipePromise.then(value => {
169 assert_equals(value, undefined, 'the promise must fulfill with undefined');
170 })
171 .then(() => {
172 assert_array_equals(rs.eventsWithoutPulls, []);
173 assert_array_equals(ws.events, ['close']);
174
175 return Promise.all([
176 rs.getReader().closed,
177 ws.getWriter().closed
178 ]);
179 });
180
181 }, 'Closing must be propagated forward: becomes closed asynchronously; preventCl ose omitted; fulfilled close promise');
182
183 promise_test(t => {
184
185 const rs = recordingReadableStream();
186
187 const ws = recordingWritableStream({
188 close() {
189 throw error1;
190 }
191 });
192
193 const pipePromise = promise_rejects(t, error1, rs.pipeTo(ws), 'pipeTo must rej ect with the same error');
194
195 setTimeout(() => rs.controller.close());
196
197 return pipePromise.then(() => {
198 assert_array_equals(rs.eventsWithoutPulls, []);
199 assert_array_equals(ws.events, ['close']);
200
201 return Promise.all([
202 rs.getReader().closed,
203 promise_rejects(t, error1, ws.getWriter().closed)
204 ]);
205 });
206
207 }, 'Closing must be propagated forward: becomes closed asynchronously; preventCl ose omitted; rejected close promise');
208
209 promise_test(() => {
210
211 const rs = recordingReadableStream();
212
213 const ws = recordingWritableStream();
214
215 const pipePromise = rs.pipeTo(ws, { preventClose: true });
216
217 setTimeout(() => rs.controller.close());
218
219 return pipePromise.then(value => {
220 assert_equals(value, undefined, 'the promise must fulfill with undefined');
221 })
222 .then(() => {
223 assert_array_equals(rs.eventsWithoutPulls, []);
224 assert_array_equals(ws.events, []);
225
226 return rs.getReader().closed;
227 });
228
229 }, 'Closing must be propagated forward: becomes closed asynchronously; preventCl ose = true');
230
231 promise_test(() => {
232
233 const rs = recordingReadableStream();
234
235 const ws = recordingWritableStream(undefined, new CountQueuingStrategy({ highW aterMark: 0 }));
236
237 const pipePromise = rs.pipeTo(ws);
238
239 setTimeout(() => rs.controller.close());
240
241 return pipePromise.then(value => {
242 assert_equals(value, undefined, 'the promise must fulfill with undefined');
243 })
244 .then(() => {
245 assert_array_equals(rs.eventsWithoutPulls, []);
246 assert_array_equals(ws.events, ['close']);
247
248 return Promise.all([
249 rs.getReader().closed,
250 ws.getWriter().closed
251 ]);
252 });
253
254 }, 'Closing must be propagated forward: becomes closed asynchronously; dest neve r desires chunks; ' +
255 'preventClose omitted; fulfilled close promise');
256
257 promise_test(t => {
258
259 const rs = recordingReadableStream();
260
261 const ws = recordingWritableStream({
262 close() {
263 throw error1;
264 }
265 }, new CountQueuingStrategy({ highWaterMark: 0 }));
266
267 const pipePromise = promise_rejects(t, error1, rs.pipeTo(ws), 'pipeTo must rej ect with the same error');
268
269 setTimeout(() => rs.controller.close());
270
271 return pipePromise.then(() => {
272 assert_array_equals(rs.eventsWithoutPulls, []);
273 assert_array_equals(ws.events, ['close']);
274
275 return Promise.all([
276 rs.getReader().closed,
277 promise_rejects(t, error1, ws.getWriter().closed)
278 ]);
279 });
280
281 }, 'Closing must be propagated forward: becomes closed asynchronously; dest neve r desires chunks; ' +
282 'preventClose omitted; rejected close promise');
283
284 promise_test(() => {
285
286 const rs = recordingReadableStream();
287
288 const ws = recordingWritableStream(undefined, new CountQueuingStrategy({ highW aterMark: 0 }));
289
290 const pipePromise = rs.pipeTo(ws, { preventClose: true });
291
292 setTimeout(() => rs.controller.close());
293
294 return pipePromise.then(value => {
295 assert_equals(value, undefined, 'the promise must fulfill with undefined');
296 })
297 .then(() => {
298 assert_array_equals(rs.eventsWithoutPulls, []);
299 assert_array_equals(ws.events, []);
300
301 return rs.getReader().closed;
302 });
303
304 }, 'Closing must be propagated forward: becomes closed asynchronously; dest neve r desires chunks; ' +
305 'preventClose = true');
306
307 promise_test(() => {
308
309 const rs = recordingReadableStream();
310
311 const ws = recordingWritableStream();
312
313 const pipePromise = rs.pipeTo(ws);
314
315 setTimeout(() => {
316 rs.controller.enqueue('Hello');
317 setTimeout(() => rs.controller.close());
318 }, 10);
319
320 return pipePromise.then(value => {
321 assert_equals(value, undefined, 'the promise must fulfill with undefined');
322 })
323 .then(() => {
324 assert_array_equals(rs.eventsWithoutPulls, []);
325 assert_array_equals(ws.events, ['write', 'Hello', 'close']);
326
327 return Promise.all([
328 rs.getReader().closed,
329 ws.getWriter().closed
330 ]);
331 });
332
333 }, 'Closing must be propagated forward: becomes closed after one chunk; preventC lose omitted; fulfilled close promise');
334
335 promise_test(t => {
336
337 const rs = recordingReadableStream();
338
339 const ws = recordingWritableStream({
340 close() {
341 throw error1;
342 }
343 });
344
345 const pipePromise = promise_rejects(t, error1, rs.pipeTo(ws), 'pipeTo must rej ect with the same error');
346
347 setTimeout(() => {
348 rs.controller.enqueue('Hello');
349 setTimeout(() => rs.controller.close());
350 }, 10);
351
352 return pipePromise.then(() => {
353 assert_array_equals(rs.eventsWithoutPulls, []);
354 assert_array_equals(ws.events, ['write', 'Hello', 'close']);
355
356 return Promise.all([
357 rs.getReader().closed,
358 promise_rejects(t, error1, ws.getWriter().closed)
359 ]);
360 });
361
362 }, 'Closing must be propagated forward: becomes closed after one chunk; preventC lose omitted; rejected close promise');
363
364 promise_test(() => {
365
366 const rs = recordingReadableStream();
367
368 const ws = recordingWritableStream();
369
370 const pipePromise = rs.pipeTo(ws, { preventClose: true });
371
372 setTimeout(() => {
373 rs.controller.enqueue('Hello');
374 setTimeout(() => rs.controller.close());
375 }, 10);
376
377 return pipePromise.then(value => {
378 assert_equals(value, undefined, 'the promise must fulfill with undefined');
379 })
380 .then(() => {
381 assert_array_equals(rs.eventsWithoutPulls, []);
382 assert_array_equals(ws.events, ['write', 'Hello']);
383
384 return rs.getReader().closed;
385 });
386
387 }, 'Closing must be propagated forward: becomes closed after one chunk; preventC lose = true');
388
389 promise_test(() => {
390
391 const rs = recordingReadableStream();
392
393 let resolveWritePromise;
394 const ws = recordingWritableStream({
395 write() {
396 return new Promise(resolve => {
397 resolveWritePromise = resolve;
398 });
399 }
400 });
401
402 let pipeComplete = false;
403 const pipePromise = rs.pipeTo(ws).then(() => {
404 pipeComplete = true;
405 });
406
407 rs.controller.enqueue('a');
408 rs.controller.close();
409
410 // Flush async events and verify that no shutdown occurs.
411 return flushAsyncEvents().then(() => {
412 assert_array_equals(ws.events, ['write', 'a']); // no 'close'
413 assert_equals(pipeComplete, false, 'the pipe must not be complete');
414
415 resolveWritePromise();
416
417 return pipePromise.then(() => {
418 assert_array_equals(ws.events, ['write', 'a', 'close']);
419 });
420 });
421
422 }, 'Closing must be propagated forward: shutdown must not occur until the final write completes');
423
424 done();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698