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

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

Powered by Google App Engine
This is Rietveld 408576698