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

Side by Side Diff: third_party/WebKit/LayoutTests/http/tests/streams/writable-streams/aborting.js

Issue 2596883002: Update writable streams for the latest spec changes (Closed)
Patch Set: Adjust indents 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
« no previous file with comments | « no previous file | third_party/WebKit/LayoutTests/http/tests/streams/writable-streams/close.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 'use strict'; 1 'use strict';
2 2
3 if (self.importScripts) { 3 if (self.importScripts) {
4 self.importScripts('/resources/testharness.js'); 4 self.importScripts('/resources/testharness.js');
5 self.importScripts('../resources/test-utils.js'); 5 self.importScripts('../resources/test-utils.js');
6 self.importScripts('../resources/recording-streams.js'); 6 self.importScripts('../resources/recording-streams.js');
7 } 7 }
8 8
9 const error1 = new Error('error1'); 9 const error1 = new Error('error1');
10 error1.name = 'error1'; 10 error1.name = 'error1';
11 11
12 const error2 = new Error('error2');
13 error2.name = 'error2';
14
12 promise_test(t => { 15 promise_test(t => {
13 const ws = new WritableStream({ 16 const ws = new WritableStream({
14 write() { 17 write() {
15 return new Promise(() => { }); // forever-pending, so normally .ready woul d not fulfill. 18 return new Promise(() => { }); // forever-pending, so normally .ready woul d not fulfill.
16 } 19 }
17 }); 20 });
18 21
19 const writer = ws.getWriter(); 22 const writer = ws.getWriter();
20 writer.write('a'); 23 const writePromise = writer.write('a');
21 24
22 const readyPromise = writer.ready; 25 const readyPromise = writer.ready;
23 26
24 writer.abort(error1); 27 writer.abort(error1);
25 28
26 assert_equals(writer.ready, readyPromise, 'the ready promise property should n ot change'); 29 assert_equals(writer.ready, readyPromise, 'the ready promise property should n ot change');
27 30
28 return promise_rejects(t, new TypeError(), readyPromise, 'the ready promise sh ould reject with a TypeError'); 31 return Promise.all([
32 promise_rejects(t, new TypeError(), readyPromise, 'the ready promise should reject with a TypeError'),
33 promise_rejects(t, new TypeError(), writePromise, 'the write() promise shoul d reject with a TypeError')
34 ]);
29 }, 'Aborting a WritableStream should cause the writer\'s unsettled ready promise to reject'); 35 }, 'Aborting a WritableStream should cause the writer\'s unsettled ready promise to reject');
30 36
31 promise_test(t => { 37 promise_test(t => {
32 const ws = new WritableStream(); 38 const ws = new WritableStream();
33 39
34 const writer = ws.getWriter(); 40 const writer = ws.getWriter();
35 writer.write('a'); 41 writer.write('a');
36 42
37 const readyPromise = writer.ready; 43 const readyPromise = writer.ready;
38 44
39 return readyPromise.then(() => { 45 return readyPromise.then(() => {
40 writer.abort(error1); 46 writer.abort(error1);
41 47
42 assert_not_equals(writer.ready, readyPromise, 'the ready promise property sh ould change'); 48 assert_not_equals(writer.ready, readyPromise, 'the ready promise property sh ould change');
43 return promise_rejects(t, new TypeError(), writer.ready, 'the ready promise should reject with a TypeError'); 49 return promise_rejects(t, new TypeError(), writer.ready, 'the ready promise should reject with a TypeError');
44 }); 50 });
45 }, 'Aborting a WritableStream should cause the writer\'s fulfilled ready promise to reset to a rejected one'); 51 }, 'Aborting a WritableStream should cause the writer\'s fulfilled ready promise to reset to a rejected one');
46 52
47 promise_test(t => { 53 promise_test(t => {
48 const ws = new WritableStream(); 54 const ws = new WritableStream();
49 const writer = ws.getWriter(); 55 const writer = ws.getWriter();
50 56
51 writer.releaseLock(); 57 writer.releaseLock();
52 58
53 return promise_rejects(t, new TypeError(), writer.abort(), 'abort() should rej ect with a TypeError'); 59 return promise_rejects(t, new TypeError(), writer.abort(), 'abort() should rej ect with a TypeError');
54 }, 'abort() on a released writer rejects'); 60 }, 'abort() on a released writer rejects');
55 61
56 promise_test(() => { 62 promise_test(t => {
57 const ws = recordingWritableStream(); 63 const ws = recordingWritableStream();
58 64
59 return delay(0) 65 return delay(0)
60 .then(() => { 66 .then(() => {
61 const writer = ws.getWriter(); 67 const writer = ws.getWriter();
62 68
63 writer.abort(); 69 writer.abort();
64 writer.write(1); 70
65 writer.write(2); 71 return Promise.all([
72 promise_rejects(t, new TypeError(), writer.write(1), 'write(1) must reje ct with a TypeError'),
73 promise_rejects(t, new TypeError(), writer.write(2), 'write(2) must reje ct with a TypeError')
74 ]);
66 }) 75 })
67 .then(() => { 76 .then(() => {
68 assert_array_equals(ws.events, ['abort', undefined]); 77 assert_array_equals(ws.events, ['abort', undefined]);
69 }); 78 });
70 }, 'Aborting a WritableStream immediately prevents future writes'); 79 }, 'Aborting a WritableStream immediately prevents future writes');
71 80
72 promise_test(() => { 81 promise_test(t => {
73 const ws = recordingWritableStream(); 82 const ws = recordingWritableStream();
83 const results = [];
74 84
75 return delay(0) 85 return delay(0)
76 .then(() => { 86 .then(() => {
77 const writer = ws.getWriter(); 87 const writer = ws.getWriter();
78 88
79 writer.write(1); 89 results.push(
80 writer.write(2); 90 writer.write(1),
81 writer.write(3); 91 promise_rejects(t, new TypeError(), writer.write(2), 'write(2) must reje ct with a TypeError'),
82 writer.abort(); 92 promise_rejects(t, new TypeError(), writer.write(3), 'write(3) must reje ct with a TypeError')
83 writer.write(4); 93 );
84 writer.write(5); 94
95 const abortPromise = writer.abort();
96
97 results.push(
98 promise_rejects(t, new TypeError(), writer.write(4), 'write(4) must reje ct with a TypeError'),
99 promise_rejects(t, new TypeError(), writer.write(5), 'write(5) must reje ct with a TypeError')
100 );
101
102 return abortPromise;
85 }).then(() => { 103 }).then(() => {
86 assert_array_equals(ws.events, ['write', 1, 'abort', undefined]); 104 assert_array_equals(ws.events, ['write', 1, 'abort', undefined]);
105
106 return Promise.all(results);
87 }); 107 });
88 }, 'Aborting a WritableStream prevents further writes after any that are in prog ress'); 108 }, 'Aborting a WritableStream prevents further writes after any that are in prog ress');
89 109
90 promise_test(() => { 110 promise_test(() => {
91 const ws = new WritableStream({ 111 const ws = new WritableStream({
92 abort() { 112 abort() {
93 return 'Hello'; 113 return 'Hello';
94 } 114 }
95 }); 115 });
96 const writer = ws.getWriter(); 116 const writer = ws.getWriter();
(...skipping 19 matching lines...) Expand all
116 const ws = new WritableStream({ 136 const ws = new WritableStream({
117 abort() { 137 abort() {
118 throw error1; 138 throw error1;
119 } 139 }
120 }); 140 });
121 141
122 return promise_rejects(t, error1, ws.abort(undefined), 142 return promise_rejects(t, error1, ws.abort(undefined),
123 'rejection reason of abortPromise must be the error thrown by abort'); 143 'rejection reason of abortPromise must be the error thrown by abort');
124 }, 'WritableStream if sink\'s abort throws, the promise returned by ws.abort() r ejects'); 144 }, 'WritableStream if sink\'s abort throws, the promise returned by ws.abort() r ejects');
125 145
146 promise_test(t => {
147 let resolveWritePromise;
148 const ws = new WritableStream({
149 write() {
150 return new Promise(resolve => {
151 resolveWritePromise = resolve;
152 });
153 },
154 abort() {
155 throw error1;
156 }
157 });
158
159 const writer = ws.getWriter();
160
161 writer.write().catch(() => {});
162 return flushAsyncEvents().then(() => {
163 const abortPromise = writer.abort(undefined);
164
165 resolveWritePromise();
166 return promise_rejects(t, error1, abortPromise,
167 'rejection reason of abortPromise must be the error thrown by abort');
168 });
169 }, 'WritableStream if sink\'s abort throws, for an abort performed during a writ e, the promise returned by ' +
170 'ws.abort() rejects');
171
126 test(() => { 172 test(() => {
127 const ws = recordingWritableStream(); 173 const ws = recordingWritableStream();
128 const writer = ws.getWriter(); 174 const writer = ws.getWriter();
129 175
130 writer.abort(error1); 176 writer.abort(error1);
131 177
132 assert_array_equals(ws.events, ['abort', error1]); 178 assert_array_equals(ws.events, ['abort', error1]);
133 }, 'Aborting a WritableStream passes through the given reason'); 179 }, 'Aborting a WritableStream passes through the given reason');
134 180
135 promise_test(t => { 181 promise_test(t => {
(...skipping 19 matching lines...) Expand all
155 201
156 writer.abort(error1); 202 writer.abort(error1);
157 203
158 return writePromise; 204 return writePromise;
159 }, 'Aborting a WritableStream causes any outstanding write() promises to be reje cted with a TypeError'); 205 }, 'Aborting a WritableStream causes any outstanding write() promises to be reje cted with a TypeError');
160 206
161 promise_test(t => { 207 promise_test(t => {
162 const ws = new WritableStream(); 208 const ws = new WritableStream();
163 const writer = ws.getWriter(); 209 const writer = ws.getWriter();
164 210
165 writer.close(); 211 const closePromise = writer.close();
166 writer.abort(error1); 212 writer.abort(error1);
167 213
168 return promise_rejects(t, new TypeError(), writer.closed, 'closed should rejec t with a TypeError'); 214 return Promise.all([
215 promise_rejects(t, new TypeError(), writer.closed, 'closed should reject wit h a TypeError'),
216 promise_rejects(t, new TypeError(), closePromise, 'close() should reject wit h a TypeError')
217 ]);
169 }, 'Closing but then immediately aborting a WritableStream causes the stream to error'); 218 }, 'Closing but then immediately aborting a WritableStream causes the stream to error');
170 219
171 promise_test(t => { 220 promise_test(t => {
221 let resolveClose;
172 const ws = new WritableStream({ 222 const ws = new WritableStream({
173 close() { 223 close() {
174 return new Promise(() => { }); // forever-pending 224 return new Promise(resolve => {
225 resolveClose = resolve;
226 });
175 } 227 }
176 }); 228 });
177 const writer = ws.getWriter(); 229 const writer = ws.getWriter();
178 230
179 writer.close(); 231 const closePromise = writer.close();
180 232
181 return delay(0).then(() => { 233 return delay(0).then(() => {
182 writer.abort(error1); 234 writer.abort(error1);
183 }) 235 resolveClose();
184 .then(() => promise_rejects(t, new TypeError(), writer.closed, 'closed should reject with a TypeError')); 236 return Promise.all([
237 promise_rejects(t, new TypeError(), writer.closed, 'closed should reject w ith a TypeError'),
238 closePromise
239 ]);
240 });
185 }, 'Closing a WritableStream and aborting it while it closes causes the stream t o error'); 241 }, 'Closing a WritableStream and aborting it while it closes causes the stream t o error');
186 242
187 promise_test(() => { 243 promise_test(() => {
188 const ws = new WritableStream(); 244 const ws = new WritableStream();
189 const writer = ws.getWriter(); 245 const writer = ws.getWriter();
190 246
191 writer.close(); 247 writer.close();
192 248
193 return delay(0).then(() => writer.abort()); 249 return delay(0).then(() => writer.abort());
194 }, 'Aborting a WritableStream after it is closed is a no-op'); 250 }, 'Aborting a WritableStream after it is closed is a no-op');
195 251
196 test(() => { 252 promise_test(t => {
197 const ws = recordingWritableStream(); 253 // Cannot use recordingWritableStream since it always has an abort
254 let controller;
255 let closeArgs;
256 const ws = new WritableStream({
257 start(c) {
258 controller = c;
259 },
260 close(...args) {
261 closeArgs = args;
262 }
263 });
264
198 const writer = ws.getWriter(); 265 const writer = ws.getWriter();
199 266
200 writer.abort(); 267 writer.abort();
201 268
202 return writer.closed.then(() => { 269 return promise_rejects(t, new TypeError(), writer.closed, 'closed should rejec t with a TypeError').then(() => {
203 assert_array_equals(ws.events, ['close']); 270 assert_array_equals(closeArgs, [controller], 'close must have been called, w ith the controller as its argument');
204 }); 271 });
205 }, 'WritableStream should call underlying sink\'s close if no abort is supplied' ); 272 }, 'WritableStream should call underlying sink\'s close if no abort is supplied' );
206 273
207 promise_test(() => { 274 promise_test(() => {
208 let thenCalled = false; 275 let thenCalled = false;
209 const ws = new WritableStream({ 276 const ws = new WritableStream({
210 abort() { 277 abort() {
211 return { 278 return {
212 then(onFulfilled) { 279 then(onFulfilled) {
213 thenCalled = true; 280 thenCalled = true;
214 onFulfilled(); 281 onFulfilled();
215 } 282 }
216 }; 283 };
217 } 284 }
218 }); 285 });
219 const writer = ws.getWriter(); 286 const writer = ws.getWriter();
220 return writer.abort().then(() => assert_true(thenCalled, 'then() should be cal led')); 287 return writer.abort().then(() => assert_true(thenCalled, 'then() should be cal led'));
221 }, 'returning a thenable from abort() should work'); 288 }, 'returning a thenable from abort() should work');
222 289
290 promise_test(t => {
291 const ws = new WritableStream({
292 write() {
293 return flushAsyncEvents();
294 }
295 });
296 const writer = ws.getWriter();
297 return writer.ready.then(() => {
298 const writePromise = writer.write('a');
299 writer.abort(error1);
300 let closedResolved = false;
301 return Promise.all([
302 writePromise.then(() => assert_false(closedResolved, '.closed should not r esolve before write()')),
303 promise_rejects(t, new TypeError(), writer.closed, '.closed should reject' ).then(() => {
304 closedResolved = true;
305 })
306 ]);
307 });
308 }, '.closed should not resolve before fulfilled write()');
309
310 promise_test(t => {
311 const ws = new WritableStream({
312 write() {
313 return Promise.reject(error1);
314 }
315 });
316 const writer = ws.getWriter();
317 return writer.ready.then(() => {
318 const writePromise = writer.write('a');
319 const abortPromise = writer.abort(error2);
320 let closedResolved = false;
321 return Promise.all([
322 promise_rejects(t, error1, writePromise, 'write() should reject')
323 .then(() => assert_false(closedResolved, '.closed should not resolve b efore write()')),
324 promise_rejects(t, error1, writer.closed, '.closed should reject')
325 .then(() => {
326 closedResolved = true;
327 }),
328 promise_rejects(t, error1, abortPromise, 'abort() should reject')]);
329 });
330 }, '.closed should not resolve before rejected write(); write() error should ove rwrite abort() error');
331
332 promise_test(t => {
333 const ws = new WritableStream({
334 write() {
335 return flushAsyncEvents();
336 }
337 }, new CountQueuingStrategy(4));
338 const writer = ws.getWriter();
339 return writer.ready.then(() => {
340 const settlementOrder = [];
341 return Promise.all([
342 writer.write('1').then(() => settlementOrder.push(1)),
343 promise_rejects(t, new TypeError(), writer.write('2'), 'first queued write should be rejected')
344 .then(() => settlementOrder.push(2)),
345 promise_rejects(t, new TypeError(), writer.write('3'), 'second queued writ e should be rejected')
346 .then(() => settlementOrder.push(3)),
347 writer.abort(error1)
348 ]).then(() => assert_array_equals([1, 2, 3], settlementOrder, 'writes should be satisfied in order'));
349 });
350 }, 'writes should be satisfied in order when aborting');
351
352 promise_test(t => {
353 const ws = new WritableStream({
354 write() {
355 return Promise.reject(error1);
356 }
357 }, new CountQueuingStrategy(4));
358 const writer = ws.getWriter();
359 return writer.ready.then(() => {
360 const settlementOrder = [];
361 return Promise.all([
362 promise_rejects(t, error1, writer.write('1'), 'pending write should be rej ected')
363 .then(() => settlementOrder.push(1)),
364 promise_rejects(t, error1, writer.write('2'), 'first queued write should b e rejected')
365 .then(() => settlementOrder.push(2)),
366 promise_rejects(t, error1, writer.write('3'), 'second queued write should be rejected')
367 .then(() => settlementOrder.push(3)),
368 promise_rejects(t, error1, writer.abort(error1), 'abort should be rejected ')
369 ]).then(() => assert_array_equals([1, 2, 3], settlementOrder, 'writes should be satisfied in order'));
370 });
371 }, 'writes should be satisfied in order after rejected write when aborting');
372
373 promise_test(t => {
374 const ws = new WritableStream({
375 write() {
376 return Promise.reject(error1);
377 }
378 });
379 const writer = ws.getWriter();
380 return writer.ready.then(() => {
381 return Promise.all([
382 promise_rejects(t, error1, writer.write('a'), 'writer.write() should rejec t with error from underlying write()'),
383 promise_rejects(t, error1, writer.close(), 'writer.close() should reject w ith error from underlying write()'),
384 promise_rejects(t, error1, writer.abort(), 'writer.abort() should reject w ith error from underlying write()')
385 ]);
386 });
387 }, 'close() should use error from underlying write() on abort');
388
389 promise_test(() => {
390 let resolveWrite;
391 let abortCalled = false;
392 const ws = new WritableStream({
393 write() {
394 return new Promise(resolve => {
395 resolveWrite = resolve;
396 });
397 },
398 abort() {
399 abortCalled = true;
400 }
401 });
402
403 const writer = ws.getWriter();
404 return writer.ready.then(() => {
405 writer.write('a');
406 const abortPromise = writer.abort();
407 return flushAsyncEvents().then(() => {
408 assert_false(abortCalled, 'abort should not be called while write is pendi ng');
409 resolveWrite();
410 return abortPromise.then(() => assert_true(abortCalled, 'abort should be c alled'));
411 });
412 });
413 }, 'underlying abort() should not be called until underlying write() completes') ;
414
415 promise_test(() => {
416 let resolveClose;
417 let abortCalled = false;
418 const ws = new WritableStream({
419 close() {
420 return new Promise(resolve => {
421 resolveClose = resolve;
422 });
423 },
424 abort() {
425 abortCalled = true;
426 }
427 });
428
429 const writer = ws.getWriter();
430 return writer.ready.then(() => {
431 writer.close();
432 const abortPromise = writer.abort();
433 return flushAsyncEvents().then(() => {
434 assert_false(abortCalled, 'underlying abort should not be called while clo se is pending');
435 resolveClose();
436 return abortPromise.then(() => {
437 assert_false(abortCalled, 'underlying abort should not be called after c lose completes');
438 });
439 });
440 });
441 }, 'underlying abort() should not be called if underlying close() has started');
442
443 promise_test(t => {
444 let rejectClose;
445 let abortCalled = false;
446 const ws = new WritableStream({
447 close() {
448 return new Promise((resolve, reject) => {
449 rejectClose = reject;
450 });
451 },
452 abort() {
453 abortCalled = true;
454 }
455 });
456
457 const writer = ws.getWriter();
458 return writer.ready.then(() => {
459 const closePromise = writer.close();
460 const abortPromise = writer.abort();
461 return flushAsyncEvents().then(() => {
462 assert_false(abortCalled, 'underlying abort should not be called while clo se is pending');
463 rejectClose(error1);
464 return promise_rejects(t, error1, abortPromise, 'abort should reject with the same reason').then(() => {
465 return promise_rejects(t, error1, closePromise, 'close should reject wit h the same reason');
466 }).then(() => {
467 assert_false(abortCalled, 'underlying abort should not be called after c lose completes');
468 });
469 });
470 });
471 }, 'if underlying close() has started and then rejects, the abort() and close() promises should reject with the ' +
472 'underlying close rejection reason');
473
474 promise_test(t => {
475 let resolveWrite;
476 let abortCalled = false;
477 const ws = new WritableStream({
478 write() {
479 return new Promise(resolve => {
480 resolveWrite = resolve;
481 });
482 },
483 abort() {
484 abortCalled = true;
485 }
486 });
487
488 const writer = ws.getWriter();
489 return writer.ready.then(() => {
490 writer.write('a');
491 const closePromise = writer.close();
492 const abortPromise = writer.abort();
493 return flushAsyncEvents().then(() => {
494 assert_false(abortCalled, 'abort should not be called while write is pendi ng');
495 resolveWrite();
496 return abortPromise.then(() => {
497 assert_true(abortCalled, 'abort should be called after write completes') ;
498 return promise_rejects(t, new TypeError(), closePromise, 'promise return ed by close() should be rejected');
499 });
500 });
501 });
502 }, 'underlying abort() should be called while closing if underlying close() has not started yet');
503
504 promise_test(() => {
505 const ws = new WritableStream();
506 const writer = ws.getWriter();
507 return writer.ready.then(() => {
508 const closePromise = writer.close();
509 const abortPromise = writer.abort();
510 let closeResolved = false;
511 Promise.all([
512 closePromise.then(() => { closeResolved = true; }),
513 abortPromise.then(() => { assert_true(closeResolved, 'close() promise shou ld resolve before abort() promise'); })
514 ]);
515 });
516 }, 'writer close() promise should resolve before abort() promise');
517
518 promise_test(t => {
519 const ws = new WritableStream({
520 write(chunk, controller) {
521 controller.error(error1);
522 return new Promise(() => {});
523 }
524 });
525 const writer = ws.getWriter();
526 return writer.ready.then(() => {
527 writer.write('a');
528 return promise_rejects(t, error1, writer.ready, 'writer.ready should reject' );
529 });
530 }, 'writer.ready should reject on controller error without waiting for underlyin g write');
531
532 promise_test(t => {
533 let resolveWrite;
534 const ws = new WritableStream({
535 write() {
536 return new Promise(resolve => {
537 resolveWrite = resolve;
538 });
539 }
540 });
541 const writer = ws.getWriter();
542 return writer.ready.then(() => {
543 const writePromise = writer.write('a');
544 const closed = writer.closed;
545 const abortPromise = writer.abort();
546 writer.releaseLock();
547 resolveWrite();
548 return Promise.all([
549 writePromise,
550 abortPromise,
551 promise_rejects(t, new TypeError(), closed, 'closed should reject')]);
552 });
553 }, 'releaseLock() while aborting should reject the original closed promise');
554
555 promise_test(t => {
556 let resolveWrite;
557 let resolveAbort;
558 let resolveAbortStarted;
559 const abortStarted = new Promise(resolve => {
560 resolveAbortStarted = resolve;
561 });
562 const ws = new WritableStream({
563 write() {
564 return new Promise(resolve => {
565 resolveWrite = resolve;
566 });
567 },
568 abort() {
569 resolveAbortStarted();
570 return new Promise(resolve => {
571 resolveAbort = resolve;
572 });
573 }
574 });
575 const writer = ws.getWriter();
576 return writer.ready.then(() => {
577 const writePromise = writer.write('a');
578 const closed = writer.closed;
579 const abortPromise = writer.abort();
580 resolveWrite();
581 return abortStarted.then(() => {
582 writer.releaseLock();
583 assert_not_equals(writer.closed, closed, 'closed promise should have chang ed');
584 resolveAbort();
585 return Promise.all([
586 writePromise,
587 abortPromise,
588 promise_rejects(t, new TypeError(), closed, 'original closed should reje ct'),
589 promise_rejects(t, new TypeError(), writer.closed, 'new closed should re ject')]);
590 });
591 });
592 }, 'releaseLock() during delayed async abort() should create a new rejected clos ed promise');
593
223 done(); 594 done();
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/LayoutTests/http/tests/streams/writable-streams/close.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698