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

Side by Side Diff: third_party/WebKit/LayoutTests/external/wpt/streams/readable-byte-streams/general.js

Issue 2642393002: Import wpt@40665266227e475bc4a56884247d8c09d78dfb6a (Closed)
Patch Set: rebaseline-cl 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/rs-utils.js');
5 self.importScripts('/resources/testharness.js');
6 }
7
8 const error1 = new Error('error1');
9 error1.name = 'error1';
10
11 test(() => {
12 assert_throws(new TypeError(), () => new ReadableStream().getReader({ mode: 'b yob' }));
13 }, 'getReader({mode: "byob"}) throws on non-bytes streams');
14
15
16 test(() => {
17 // Constructing ReadableStream with an empty underlying byte source object as parameter shouldn't throw.
18 new ReadableStream({ type: 'bytes' });
19 }, 'ReadableStream with byte source can be constructed with no errors');
20
21 promise_test(() => {
22 let startCalled = false;
23 let controller;
24
25 let resolveTestPromise;
26 const testPromise = new Promise(resolve => {
27 resolveTestPromise = resolve;
28 });
29
30 new ReadableStream({
31 start(c) {
32 controller = c;
33 startCalled = true;
34 },
35 pull() {
36 assert_true(startCalled, 'start has been called');
37 assert_equals(controller.desiredSize, 256, 'desiredSize');
38 resolveTestPromise();
39 },
40 type: 'bytes'
41 }, {
42 highWaterMark: 256
43 });
44
45 return testPromise;
46
47 }, 'ReadableStream with byte source: Construct and expect start and pull being c alled');
48
49 promise_test(() => {
50 let pullCount = 0;
51 let checkedNoPull = false;
52
53 let resolveTestPromise;
54 const testPromise = new Promise(resolve => {
55 resolveTestPromise = resolve;
56 });
57 let resolveStartPromise;
58
59 new ReadableStream({
60 start() {
61 return new Promise(resolve => {
62 resolveStartPromise = resolve;
63 });
64 },
65 pull() {
66 if (checkedNoPull) {
67 resolveTestPromise();
68 }
69
70 ++pullCount;
71 },
72 type: 'bytes'
73 }, {
74 highWaterMark: 256
75 });
76
77 Promise.resolve().then(() => {
78 assert_equals(pullCount, 0);
79 checkedNoPull = true;
80 resolveStartPromise();
81 });
82
83 return testPromise;
84
85 }, 'ReadableStream with byte source: No automatic pull call if start doesn\'t fi nish');
86
87 promise_test(() => {
88 new ReadableStream({
89 pull() {
90 assert_unreached('pull must not be called');
91 },
92 type: 'bytes'
93 }, {
94 highWaterMark: 0
95 });
96
97 return Promise.resolve().then(() => {});
98 }, 'ReadableStream with byte source: Construct with highWaterMark of 0');
99
100 promise_test(t => {
101 const stream = new ReadableStream({
102 type: 'bytes'
103 });
104
105 const reader = stream.getReader();
106 reader.releaseLock();
107
108 return promise_rejects(t, new TypeError(), reader.closed, 'closed must reject' );
109 }, 'ReadableStream with byte source: getReader(), then releaseLock()');
110
111 promise_test(t => {
112 const stream = new ReadableStream({
113 type: 'bytes'
114 });
115
116 const reader = stream.getReader({ mode: 'byob' });
117 reader.releaseLock();
118
119 return promise_rejects(t, new TypeError(), reader.closed, 'closed must reject' );
120 }, 'ReadableStream with byte source: getReader() with mode set to byob, then rel easeLock()');
121
122 promise_test(() => {
123 const stream = new ReadableStream({
124 start(c) {
125 c.close();
126 },
127 pull() {
128 assert_unreached('pull must not be called');
129 },
130 type: 'bytes'
131 });
132
133 const reader = stream.getReader();
134
135 return reader.closed.then(() => {
136 assert_throws(new TypeError(), () => stream.getReader(), 'getReader() must t hrow');
137 });
138 }, 'ReadableStream with byte source: Test that closing a stream does not release a reader automatically');
139
140 promise_test(() => {
141 const stream = new ReadableStream({
142 start(c) {
143 c.close();
144 },
145 pull() {
146 assert_unreached('pull must not be called');
147 },
148 type: 'bytes'
149 });
150
151 const reader = stream.getReader({ mode: 'byob' });
152
153 return reader.closed.then(() => {
154 assert_throws(new TypeError(), () => stream.getReader({ mode: 'byob' }), 'ge tReader() must throw');
155 });
156 }, 'ReadableStream with byte source: Test that closing a stream does not release a BYOB reader automatically');
157
158 promise_test(t => {
159 const stream = new ReadableStream({
160 start(c) {
161 c.error(error1);
162 },
163 pull() {
164 assert_unreached('pull must not be called');
165 },
166 type: 'bytes'
167 });
168
169 const reader = stream.getReader();
170
171 return promise_rejects(t, error1, reader.closed, 'closed must reject').then(() => {
172 assert_throws(new TypeError(), () => stream.getReader(), 'getReader() must t hrow');
173 });
174 }, 'ReadableStream with byte source: Test that erroring a stream does not releas e a reader automatically');
175
176 promise_test(t => {
177 const stream = new ReadableStream({
178 start(c) {
179 c.error(error1);
180 },
181 pull() {
182 assert_unreached('pull must not be called');
183 },
184 type: 'bytes'
185 });
186
187 const reader = stream.getReader({ mode: 'byob' });
188
189 return promise_rejects(t, error1, reader.closed, 'closed must reject').then(() => {
190 assert_throws(new TypeError(), () => stream.getReader({ mode: 'byob' }), 'ge tReader() must throw');
191 });
192 }, 'ReadableStream with byte source: Test that erroring a stream does not releas e a BYOB reader automatically');
193
194 test(() => {
195 const stream = new ReadableStream({
196 type: 'bytes'
197 });
198
199 const reader = stream.getReader();
200 reader.read();
201 assert_throws(new TypeError(), () => reader.releaseLock(), 'reader.releaseLock () must throw');
202 }, 'ReadableStream with byte source: releaseLock() on ReadableStreamReader with pending read() must throw');
203
204 promise_test(() => {
205 let pullCount = 0;
206
207 const stream = new ReadableStream({
208 pull() {
209 ++pullCount;
210 },
211 type: 'bytes'
212 }, {
213 highWaterMark: 8
214 });
215
216 stream.getReader();
217
218 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r eflected to the state of the stream');
219
220 return Promise.resolve().then(() => {
221 assert_equals(pullCount, 1, 'pull must be invoked');
222 });
223 }, 'ReadableStream with byte source: Automatic pull() after start()');
224
225 promise_test(() => {
226 let pullCount = 0;
227
228 const stream = new ReadableStream({
229 pull() {
230 ++pullCount;
231 },
232 type: 'bytes'
233 }, {
234 highWaterMark: 0
235 });
236
237 const reader = stream.getReader();
238 reader.read();
239
240 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r eflected to the state of the stream');
241
242 return Promise.resolve().then(() => {
243 assert_equals(pullCount, 1, 'pull must be invoked');
244 });
245 }, 'ReadableStream with byte source: Automatic pull() after start() and read()') ;
246
247 promise_test(() => {
248 let pullCount = 0;
249 let controller;
250
251 const stream = new ReadableStream({
252 start(c) {
253 controller = c;
254 },
255 pull() {
256 if (pullCount === 0) {
257 const byobRequest = controller.byobRequest;
258 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undef ined');
259
260 const view = byobRequest.view;
261 assert_not_equals(view, undefined, 'byobRequest.view must no be undefine d');
262 assert_equals(view.constructor, Uint8Array);
263 assert_equals(view.buffer.byteLength, 16);
264 assert_equals(view.byteOffset, 0);
265 assert_equals(view.byteLength, 16);
266
267 view[0] = 0x01;
268 byobRequest.respond(1);
269 } else {
270 assert_unreached('Too many pull() calls');
271 }
272
273 ++pullCount;
274 },
275 type: 'bytes',
276 autoAllocateChunkSize: 16
277 }, {
278 highWaterMark: 0
279 });
280
281 const reader = stream.getReader();
282 const readPromise = reader.read();
283
284 assert_equals(pullCount, 0, 'No pull() as start() just finished and is not yet reflected to the state of the stream');
285
286 return Promise.resolve().then(() => {
287 assert_equals(pullCount, 1, 'pull() must have been invoked once');
288 return readPromise;
289 }).then(result => {
290 assert_not_equals(result.value, undefined);
291 assert_equals(result.value.constructor, Uint8Array);
292 assert_equals(result.value.buffer.byteLength, 16);
293 assert_equals(result.value.byteOffset, 0);
294 assert_equals(result.value.byteLength, 1);
295 assert_equals(result.value[0], 0x01);
296 });
297 }, 'ReadableStream with byte source: autoAllocateChunkSize');
298
299 promise_test(() => {
300 let pullCount = 0;
301 let controller;
302
303 const stream = new ReadableStream({
304 start(c) {
305 controller = c;
306 },
307 pull() {
308 if (pullCount === 0) {
309 const byobRequest = controller.byobRequest;
310 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undef ined');
311
312 const view = byobRequest.view;
313 assert_not_equals(view, undefined, 'byobRequest.view must no be undefine d');
314 assert_equals(view.constructor, Uint8Array);
315 assert_equals(view.buffer.byteLength, 16);
316 assert_equals(view.byteOffset, 0);
317 assert_equals(view.byteLength, 16);
318
319 view[0] = 0x01;
320 byobRequest.respond(1);
321 } else if (pullCount === 1) {
322 const byobRequest = controller.byobRequest;
323 assert_not_equals(byobRequest, undefined, 'byobRequest must not be undef ined');
324
325 const view = byobRequest.view;
326 assert_not_equals(view, undefined, 'byobRequest.view must no be undefine d');
327 assert_equals(view.constructor, Uint8Array);
328 assert_equals(view.buffer.byteLength, 32);
329 assert_equals(view.byteOffset, 0);
330 assert_equals(view.byteLength, 32);
331
332 view[0] = 0x02;
333 view[1] = 0x03;
334 byobRequest.respond(2);
335 } else {
336 assert_unreached('Too many pull() calls');
337 }
338
339 ++pullCount;
340 },
341 type: 'bytes',
342 autoAllocateChunkSize: 16
343 }, {
344 highWaterMark: 0
345 });
346
347 const reader = stream.getReader();
348 return reader.read().then(result => {
349 assert_not_equals(result.value, undefined);
350 assert_equals(result.value.constructor, Uint8Array);
351 assert_equals(result.value.buffer.byteLength, 16);
352 assert_equals(result.value.byteOffset, 0);
353 assert_equals(result.value.byteLength, 1);
354 assert_equals(result.value[0], 0x01);
355
356 reader.releaseLock();
357 const byobReader = stream.getReader({ mode: 'byob' });
358 return byobReader.read(new Uint8Array(32));
359 }).then(result => {
360 assert_not_equals(result.value, undefined);
361 assert_equals(result.value.constructor, Uint8Array);
362 assert_equals(result.value.buffer.byteLength, 32);
363 assert_equals(result.value.byteOffset, 0);
364 assert_equals(result.value.byteLength, 2);
365 assert_equals(result.value[0], 0x02);
366 assert_equals(result.value[1], 0x03);
367 });
368 }, 'ReadableStream with byte source: Mix of auto allocate and BYOB');
369
370 promise_test(() => {
371 let pullCount = 0;
372
373 const stream = new ReadableStream({
374 pull() {
375 ++pullCount;
376 },
377 type: 'bytes'
378 }, {
379 highWaterMark: 0
380 });
381
382 const reader = stream.getReader();
383 reader.read(new Uint8Array(8));
384
385 assert_equals(pullCount, 0, 'No pull as start() just finished and is not yet r eflected to the state of the stream');
386
387 return Promise.resolve().then(() => {
388 assert_equals(pullCount, 1, 'pull must be invoked');
389 });
390 }, 'ReadableStream with byte source: Automatic pull() after start() and read(vie w)');
391
392 promise_test(() => {
393 let pullCount = 0;
394
395 let controller;
396
397 const stream = new ReadableStream({
398 start(c) {
399 c.enqueue(new Uint8Array(16));
400 assert_equals(c.desiredSize, -8, 'desiredSize after enqueue() in start()') ;
401
402 controller = c;
403 },
404 pull() {
405 ++pullCount;
406
407 if (pullCount === 1) {
408 assert_equals(controller.desiredSize, 8, 'desiredSize in pull()');
409 }
410 },
411 type: 'bytes'
412 }, {
413 highWaterMark: 8
414 });
415
416 return Promise.resolve().then(() => {
417 assert_equals(pullCount, 0, 'No pull as the queue was filled by start()');
418
419 const reader = stream.getReader();
420
421 const promise = reader.read();
422 assert_equals(pullCount, 1, 'The first pull() should be made on read()');
423
424 return promise.then(result => {
425 assert_equals(result.done, false, 'result.done');
426
427 const view = result.value;
428 assert_equals(view.constructor, Uint8Array, 'view.constructor');
429 assert_equals(view.buffer.byteLength, 16, 'view.buffer');
430 assert_equals(view.byteOffset, 0, 'view.byteOffset');
431 assert_equals(view.byteLength, 16, 'view.byteLength');
432 });
433 });
434 }, 'ReadableStream with byte source: enqueue(), getReader(), then read()');
435
436 promise_test(() => {
437 let controller;
438
439 const stream = new ReadableStream({
440 start(c) {
441 controller = c;
442 },
443 type: 'bytes'
444 });
445
446 const reader = stream.getReader();
447
448 const promise = reader.read().then(result => {
449 assert_equals(result.done, false);
450
451 const view = result.value;
452 assert_equals(view.constructor, Uint8Array);
453 assert_equals(view.buffer.byteLength, 1);
454 assert_equals(view.byteOffset, 0);
455 assert_equals(view.byteLength, 1);
456 });
457
458 controller.enqueue(new Uint8Array(1));
459
460 return promise;
461 }, 'ReadableStream with byte source: Push source that doesn\'t understand pull s ignal');
462
463 promise_test(t => {
464 const stream = new ReadableStream({
465 pull: 'foo',
466 type: 'bytes'
467 });
468
469 const reader = stream.getReader();
470
471 return promise_rejects(t, new TypeError(), reader.read(), 'read() must fail');
472 }, 'ReadableStream with byte source: read(), but pull() function is not callable ');
473
474 promise_test(t => {
475 const stream = new ReadableStream({
476 pull: 'foo',
477 type: 'bytes'
478 });
479
480 const reader = stream.getReader({ mode: 'byob' });
481
482 return promise_rejects(t, new TypeError(), reader.read(new Uint8Array(1)), 're ad() must fail');
483 }, 'ReadableStream with byte source: read(view), but pull() function is not call able');
484
485 promise_test(() => {
486 const stream = new ReadableStream({
487 start(c) {
488 c.enqueue(new Uint16Array(16));
489 },
490 type: 'bytes'
491 });
492
493 const reader = stream.getReader();
494
495 return reader.read().then(result => {
496 assert_equals(result.done, false);
497
498 const view = result.value;
499 assert_equals(view.constructor, Uint8Array);
500 assert_equals(view.buffer.byteLength, 32);
501 assert_equals(view.byteOffset, 0);
502 assert_equals(view.byteLength, 32);
503 });
504 }, 'ReadableStream with byte source: enqueue() with Uint16Array, getReader(), th en read()');
505
506 promise_test(() => {
507 const stream = new ReadableStream({
508 start(c) {
509 const view = new Uint8Array(16);
510 view[0] = 0x01;
511 view[8] = 0x02;
512 c.enqueue(view);
513 },
514 pull() {
515 assert_unreached('pull must not be called');
516 },
517 type: 'bytes'
518 });
519
520 const byobReader = stream.getReader({ mode: 'byob' });
521
522 return byobReader.read(new Uint8Array(8)).then(result => {
523 assert_equals(result.done, false, 'done');
524
525 const view = result.value;
526 assert_equals(view.constructor, Uint8Array, 'value.constructor');
527 assert_equals(view.buffer.byteLength, 8, 'value.buffer.byteLength');
528 assert_equals(view.byteOffset, 0, 'value.byteOffset');
529 assert_equals(view.byteLength, 8, 'value.byteLength');
530 assert_equals(view[0], 0x01);
531
532 byobReader.releaseLock();
533
534 const reader = stream.getReader();
535
536 return reader.read();
537 }).then(result => {
538 assert_equals(result.done, false, 'done');
539
540 const view = result.value;
541 assert_equals(view.constructor, Uint8Array, 'value.constructor');
542 assert_equals(view.buffer.byteLength, 16, 'value.buffer.byteLength');
543 assert_equals(view.byteOffset, 8, 'value.byteOffset');
544 assert_equals(view.byteLength, 8, 'value.byteLength');
545 assert_equals(view[0], 0x02);
546 });
547 }, 'ReadableStream with byte source: enqueue(), read(view) partially, then read( )');
548
549 promise_test(() => {
550 let controller;
551
552 const stream = new ReadableStream({
553 start(c) {
554 controller = c;
555 },
556 pull() {
557 assert_unreached('pull must not be called');
558 },
559 type: 'bytes'
560 });
561
562 const reader = stream.getReader();
563
564 controller.enqueue(new Uint8Array(16));
565 controller.close();
566
567 return reader.read().then(result => {
568 assert_equals(result.done, false, 'done');
569
570 const view = result.value;
571 assert_equals(view.byteOffset, 0, 'byteOffset');
572 assert_equals(view.byteLength, 16, 'byteLength');
573
574 return reader.read();
575 }).then(result => {
576 assert_equals(result.done, true, 'done');
577 assert_equals(result.value, undefined, 'value');
578 });
579 }, 'ReadableStream with byte source: getReader(), enqueue(), close(), then read( )');
580
581 promise_test(() => {
582 const stream = new ReadableStream({
583 start(c) {
584 c.enqueue(new Uint8Array(16));
585 c.close();
586 },
587 pull() {
588 assert_unreached('pull must not be called');
589 },
590 type: 'bytes'
591 });
592
593 const reader = stream.getReader();
594
595 return reader.read().then(result => {
596 assert_equals(result.done, false, 'done');
597
598 const view = result.value;
599 assert_equals(view.byteOffset, 0, 'byteOffset');
600 assert_equals(view.byteLength, 16, 'byteLength');
601
602 return reader.read();
603 }).then(result => {
604 assert_equals(result.done, true, 'done');
605 assert_equals(result.value, undefined, 'value');
606 });
607 }, 'ReadableStream with byte source: enqueue(), close(), getReader(), then read( )');
608
609 promise_test(() => {
610 let controller;
611
612 const stream = new ReadableStream({
613 start(c) {
614 controller = c;
615 },
616 pull() {
617 controller.enqueue(new Uint8Array(16));
618 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
619 },
620 type: 'bytes'
621 });
622
623 const reader = stream.getReader();
624
625 return reader.read().then(result => {
626 assert_equals(result.done, false, 'done');
627 assert_equals(result.value.byteLength, 16, 'byteLength');
628 });
629 }, 'ReadableStream with byte source: Respond to pull() by enqueue()');
630
631 promise_test(() => {
632 let pullCount = 0;
633
634 let controller;
635
636 const stream = new ReadableStream({
637 start(c) {
638 controller = c;
639 },
640 pull() {
641 assert_equals(controller.byobRequest, undefined, 'byobRequest is undefined ');
642
643 if (pullCount === 0) {
644 assert_equals(controller.desiredSize, 256, 'desiredSize on pull');
645
646 controller.enqueue(new Uint8Array(1));
647 assert_equals(controller.desiredSize, 256, 'desiredSize after 1st enqueu e()');
648
649 controller.enqueue(new Uint8Array(1));
650 assert_equals(controller.desiredSize, 256, 'desiredSize after 2nd enqueu e()');
651 } else {
652 assert_unreached('Too many pull() calls');
653 }
654
655 ++pullCount;
656 },
657 type: 'bytes'
658 }, {
659 highWaterMark: 256
660 });
661
662 const reader = stream.getReader();
663
664 const p0 = reader.read();
665 const p1 = reader.read();
666 const p2 = reader.read();
667
668 // Respond to the first pull call.
669 controller.enqueue(new Uint8Array(1));
670
671 assert_equals(pullCount, 0, 'pullCount after the enqueue() outside pull');
672
673 return Promise.all([p0, p1, p2]).then(result => {
674 assert_equals(pullCount, 1, 'pullCount after completion of all read()s');
675
676 assert_equals(result[0].done, false, 'result[0].done');
677 assert_equals(result[0].value.byteLength, 1, 'result[0].value.byteLength');
678 assert_equals(result[1].done, false, 'result[1].done');
679 assert_equals(result[1].value.byteLength, 1, 'result[1].value.byteLength');
680 assert_equals(result[2].done, false, 'result[2].done');
681 assert_equals(result[2].value.byteLength, 1, 'result[2].value.byteLength');
682 });
683 }, 'ReadableStream with byte source: Respond to pull() by enqueue() asynchronous ly');
684
685 promise_test(() => {
686 let controller;
687
688 let pullCount = 0;
689
690 const stream = new ReadableStream({
691 start(c) {
692 controller = c;
693 },
694 pull() {
695 if (pullCount === 0) {
696 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must n ot be undefined before respond()');
697
698 const view = controller.byobRequest.view;
699 view[0] = 0x01;
700 controller.byobRequest.respond(1);
701
702 assert_equals(controller.byobRequest, undefined, 'byobRequest must be un defined after respond()');
703 } else {
704 assert_unreached('Too many pull() calls');
705 }
706
707 ++pullCount;
708 },
709 type: 'bytes'
710 });
711
712 const reader = stream.getReader({ mode: 'byob' });
713
714 return reader.read(new Uint8Array(1)).then(result => {
715 assert_equals(result.done, false, 'result.done');
716 assert_equals(result.value.byteLength, 1, 'result.value.byteLength');
717 assert_equals(result.value[0], 0x01, 'result.value[0]');
718 });
719 }, 'ReadableStream with byte source: read(view), then respond()');
720
721 promise_test(() => {
722 let controller;
723
724 let pullCount = 0;
725
726 const stream = new ReadableStream({
727 start(c) {
728 controller = c;
729 },
730 pull() {
731 if (pullCount === 0) {
732 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must n ot be undefined before respond()');
733
734 // Emulate ArrayBuffer transfer by just creating a new ArrayBuffer and p ass it. By checking the result of
735 // read(view), we test that the respond()'s buffer argument is working c orrectly.
736 //
737 // A real implementation of the underlying byte source would transfer co ntroller.byobRequest.view.buffer into
738 // a new ArrayBuffer, then construct a view around it and write to it.
739 const transferredView = new Uint8Array(1);
740 transferredView[0] = 0x01;
741 controller.byobRequest.respondWithNewView(transferredView);
742
743 assert_equals(controller.byobRequest, undefined, 'byobRequest must be un defined after respond()');
744 } else {
745 assert_unreached('Too many pull() calls');
746 }
747
748 ++pullCount;
749 },
750 type: 'bytes'
751 });
752
753 const reader = stream.getReader({ mode: 'byob' });
754
755 return reader.read(new Uint8Array(1)).then(result => {
756 assert_equals(result.done, false, 'result.done');
757 assert_equals(result.value.byteLength, 1, 'result.value.byteLength');
758 assert_equals(result.value[0], 0x01, 'result.value[0]');
759 });
760 }, 'ReadableStream with byte source: read(view), then respond() with a transferr ed ArrayBuffer');
761
762 promise_test(t => {
763 let controller;
764
765 const stream = new ReadableStream({
766 start(c) {
767 controller = c;
768 },
769 pull() {
770 assert_not_equals(controller.byobRequest, undefined, 'byobRequest is not u ndefined');
771
772 assert_throws(new RangeError(), () => controller.byobRequest.respond(2), ' respond() must throw');
773 controller.byobRequest.respond(1);
774 },
775 type: 'bytes'
776 });
777
778 const reader = stream.getReader({ mode: 'byob' });
779
780 return reader.read(new Uint8Array(1)).catch(e => {
781 assert_unreached(e);
782 t.done();
783 });
784 }, 'ReadableStream with byte source: read(view), then respond() with too big val ue');
785
786 promise_test(() => {
787 let pullCount = 0;
788
789 let controller;
790
791 const stream = new ReadableStream({
792 start(c) {
793 controller = c;
794 },
795 pull() {
796 if (pullCount > 1) {
797 assert_unreached('Too many pull calls');
798 }
799
800 ++pullCount;
801
802 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
803 const view = controller.byobRequest.view;
804
805 assert_equals(view.constructor, Uint8Array);
806 assert_equals(view.buffer.byteLength, 4);
807
808 assert_equals(view.byteOffset, 0);
809 assert_equals(view.byteLength, 4);
810
811 view[0] = 0x01;
812 view[1] = 0x02;
813 view[2] = 0x03;
814
815 controller.byobRequest.respond(3);
816 },
817 type: 'bytes'
818 });
819
820 const reader = stream.getReader({ mode: 'byob' });
821
822 return reader.read(new Uint16Array(2)).then(result => {
823 assert_equals(pullCount, 1);
824
825 assert_equals(result.done, false, 'done');
826
827 const view = result.value;
828 assert_equals(view.byteOffset, 0, 'byteOffset');
829 assert_equals(view.byteLength, 2, 'byteLength');
830
831 assert_equals(view[0], 0x0201);
832
833 return reader.read(new Uint8Array(1));
834 }).then(result => {
835 assert_equals(pullCount, 1);
836
837 assert_equals(result.done, false, 'done');
838
839 const view = result.value;
840 assert_equals(view.byteOffset, 0, 'byteOffset');
841 assert_equals(view.byteLength, 1, 'byteLength');
842
843 assert_equals(view[0], 0x03);
844 });
845 }, 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uin t16Array enqueues the 1 byte ' +
846 'remainder');
847
848 promise_test(() => {
849 let controller;
850
851 const stream = new ReadableStream({
852 start(c) {
853 const view = new Uint8Array(16);
854 view[15] = 0x01;
855 c.enqueue(view);
856
857 controller = c;
858 },
859 pull() {
860 assert_equals(controller.byobRequest, undefined, 'byobRequest is undefined ');
861 },
862 type: 'bytes'
863 });
864
865 const reader = stream.getReader({ mode: 'byob' });
866
867 return reader.read(new Uint8Array(16)).then(result => {
868 assert_equals(result.done, false);
869
870 const view = result.value;
871 assert_equals(view.byteOffset, 0);
872 assert_equals(view.byteLength, 16);
873 assert_equals(view[15], 0x01);
874 });
875 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view)');
876
877 promise_test(() => {
878 let cancelCount = 0;
879
880 const passedReason = new TypeError('foo');
881
882 const stream = new ReadableStream({
883 start(c) {
884 c.enqueue(new Uint8Array(16));
885 },
886 pull() {
887 assert_unreached('pull must not be called');
888 },
889 cancel(reason) {
890 if (cancelCount === 0) {
891 assert_equals(reason, passedReason);
892 } else {
893 assert_unreached('Too many cancel calls');
894 }
895
896 ++cancelCount;
897 },
898 type: 'bytes'
899 });
900
901 const reader = stream.getReader();
902
903 return reader.cancel(passedReason).then(result => {
904 assert_equals(result, undefined);
905 assert_equals(cancelCount, 1);
906 });
907 }, 'ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode = not BYOB)');
908
909 promise_test(() => {
910 let cancelCount = 0;
911
912 const passedReason = new TypeError('foo');
913
914 const stream = new ReadableStream({
915 start(c) {
916 c.enqueue(new Uint8Array(16));
917 },
918 pull() {
919 assert_unreached('pull must not be called');
920 },
921 cancel(reason) {
922 if (cancelCount === 0) {
923 assert_equals(reason, passedReason);
924 } else {
925 assert_unreached('Too many cancel calls');
926 }
927
928 ++cancelCount;
929 },
930 type: 'bytes'
931 });
932
933 const reader = stream.getReader({ mode: 'byob' });
934
935 return reader.cancel(passedReason).then(result => {
936 assert_equals(result, undefined);
937 assert_equals(cancelCount, 1);
938 });
939 }, 'ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode = BYOB)');
940
941 promise_test(() => {
942 let cancelCount = 0;
943
944 const passedReason = new TypeError('foo');
945
946 let controller;
947
948 const stream = new ReadableStream({
949 start(c) {
950 controller = c;
951 },
952 pull() {
953 assert_unreached('pull must not be called');
954 },
955 cancel(reason) {
956 if (cancelCount === 0) {
957 assert_equals(reason, passedReason);
958
959 controller.byobRequest.respond(0);
960 } else {
961 assert_unreached('Too many cancel calls');
962 }
963
964 ++cancelCount;
965
966 return 'bar';
967 },
968 type: 'bytes'
969 });
970
971 const reader = stream.getReader({ mode: 'byob' });
972
973 const readPromise0 = reader.read(new Uint8Array(1)).then(result => {
974 assert_equals(result.done, true);
975 });
976
977 const readPromise1 = reader.cancel(passedReason).then(result => {
978 assert_equals(result, undefined);
979 assert_equals(cancelCount, 1);
980 });
981
982 return Promise.all([readPromise0, readPromise1]);
983 }, 'ReadableStream with byte source: getReader(), read(view), then cancel()');
984
985 promise_test(() => {
986 let pullCount = 0;
987
988 let controller;
989
990 const stream = new ReadableStream({
991 start(c) {
992 controller = c;
993 },
994 pull() {
995 assert_not_equals(controller.byobRequest, undefined, 'byobRequest is undef ined');
996
997 if (pullCount === 0) {
998 assert_equals(controller.byobRequest.view.byteLength, 2, 'byteLength bef ore enqueue()');
999 controller.enqueue(new Uint8Array(1));
1000 assert_equals(controller.byobRequest.view.byteLength, 1, 'byteLength aft er enqueue()');
1001 } else {
1002 assert_unreached('Too many pull calls');
1003 }
1004
1005 ++pullCount;
1006 },
1007 type: 'bytes'
1008 });
1009
1010 return Promise.resolve().then(() => {
1011 assert_equals(pullCount, 0, 'No pull() as no read(view) yet');
1012
1013 const reader = stream.getReader({ mode: 'byob' });
1014
1015 const promise = reader.read(new Uint16Array(1)).then(result => {
1016 assert_equals(result.done, true, 'result.done');
1017 assert_equals(result.value.constructor, Uint16Array, 'result.value');
1018 });
1019
1020 assert_equals(pullCount, 1, '1 pull() should have been made in response to p artial fill by enqueue()');
1021
1022 reader.cancel();
1023
1024 // Tell that the buffer given via pull() is returned.
1025 controller.byobRequest.respond(0);
1026
1027 return promise;
1028 });
1029 }, 'ReadableStream with byte source: cancel() with partially filled pending pull () request');
1030
1031 promise_test(() => {
1032 let controller;
1033
1034 const stream = new ReadableStream({
1035 start(c) {
1036 const view = new Uint8Array(8);
1037 view[7] = 0x01;
1038 c.enqueue(view);
1039
1040 controller = c;
1041 },
1042 pull() {
1043 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1044 },
1045 type: 'bytes'
1046 });
1047
1048 const reader = stream.getReader({ mode: 'byob' });
1049
1050 const buffer = new ArrayBuffer(16);
1051
1052 return reader.read(new Uint8Array(buffer, 8, 8)).then(result => {
1053 assert_equals(result.done, false);
1054
1055 const view = result.value;
1056 assert_equals(view.constructor, Uint8Array);
1057 assert_equals(view.buffer.byteLength, 16);
1058 assert_equals(view.byteOffset, 8);
1059 assert_equals(view.byteLength, 8);
1060 assert_equals(view[7], 0x01);
1061 });
1062 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) whe re view.buffer is not fully ' +
1063 'covered by view');
1064
1065 promise_test(() => {
1066 let controller;
1067
1068 const stream = new ReadableStream({
1069 start(c) {
1070 let view;
1071
1072 view = new Uint8Array(16);
1073 view[15] = 123;
1074 c.enqueue(view);
1075
1076 view = new Uint8Array(8);
1077 view[7] = 111;
1078 c.enqueue(view);
1079
1080 controller = c;
1081 },
1082 pull() {
1083 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1084 },
1085 type: 'bytes'
1086 });
1087
1088 const reader = stream.getReader({ mode: 'byob' });
1089
1090 return reader.read(new Uint8Array(24)).then(result => {
1091 assert_equals(result.done, false, 'done');
1092
1093 const view = result.value;
1094 assert_equals(view.byteOffset, 0, 'byteOffset');
1095 assert_equals(view.byteLength, 24, 'byteLength');
1096 assert_equals(view[15], 123, 'Contents are set from the first chunk');
1097 assert_equals(view[23], 111, 'Contents are set from the second chunk');
1098 });
1099 }, 'ReadableStream with byte source: Multiple enqueue(), getReader(), then read( view)');
1100
1101 promise_test(() => {
1102 const stream = new ReadableStream({
1103 start(c) {
1104 const view = new Uint8Array(16);
1105 view[15] = 0x01;
1106 c.enqueue(view);
1107 },
1108 pull(controller) {
1109 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1110 },
1111 type: 'bytes'
1112 });
1113
1114 const reader = stream.getReader({ mode: 'byob' });
1115
1116 return reader.read(new Uint8Array(24)).then(result => {
1117 assert_equals(result.done, false);
1118
1119 const view = result.value;
1120 assert_equals(view.byteOffset, 0);
1121 assert_equals(view.byteLength, 16);
1122 assert_equals(view[15], 0x01);
1123 });
1124 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) wit h a bigger view');
1125
1126 promise_test(() => {
1127 const stream = new ReadableStream({
1128 start(c) {
1129 const view = new Uint8Array(16);
1130 view[7] = 0x01;
1131 view[15] = 0x02;
1132 c.enqueue(view);
1133 },
1134 pull(controller) {
1135 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1136 },
1137 type: 'bytes'
1138 });
1139
1140 const reader = stream.getReader({ mode: 'byob' });
1141
1142 return reader.read(new Uint8Array(8)).then(result => {
1143 assert_equals(result.done, false, 'done');
1144
1145 const view = result.value;
1146 assert_equals(view.byteOffset, 0);
1147 assert_equals(view.byteLength, 8);
1148 assert_equals(view[7], 0x01);
1149
1150 return reader.read(new Uint8Array(8));
1151 }).then(result => {
1152 assert_equals(result.done, false, 'done');
1153
1154 const view = result.value;
1155 assert_equals(view.byteOffset, 0);
1156 assert_equals(view.byteLength, 8);
1157 assert_equals(view[7], 0x02);
1158 });
1159 }, 'ReadableStream with byte source: enqueue(), getReader(), then read(view) wit h a smaller views');
1160
1161 promise_test(() => {
1162 let controller;
1163
1164 const stream = new ReadableStream({
1165 start(c) {
1166 const view = new Uint8Array(1);
1167 view[0] = 0xff;
1168 c.enqueue(view);
1169
1170 controller = c;
1171 },
1172 pull() {
1173 if (controller.byobRequest === undefined) {
1174 return;
1175 }
1176
1177 const view = controller.byobRequest.view;
1178
1179 assert_equals(view.constructor, Uint8Array);
1180 assert_equals(view.buffer.byteLength, 2);
1181
1182 assert_equals(view.byteOffset, 1);
1183 assert_equals(view.byteLength, 1);
1184
1185 view[0] = 0xaa;
1186 controller.byobRequest.respond(1);
1187 },
1188 type: 'bytes'
1189 });
1190
1191 const reader = stream.getReader({ mode: 'byob' });
1192
1193 return reader.read(new Uint16Array(1)).then(result => {
1194 assert_equals(result.done, false);
1195
1196 const view = result.value;
1197 assert_equals(view.byteOffset, 0);
1198 assert_equals(view.byteLength, 2);
1199 assert_equals(view[0], 0xaaff);
1200 });
1201 }, 'ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(vi ew) with Uint16Array');
1202
1203 promise_test(() => {
1204 let pullCount = 0;
1205
1206 let controller;
1207
1208 const stream = new ReadableStream({
1209 start(c) {
1210 const view = new Uint8Array(3);
1211 view[0] = 0x01;
1212 view[2] = 0x02;
1213 c.enqueue(view);
1214
1215 controller = c;
1216 },
1217 pull() {
1218 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
1219
1220 if (pullCount === 0) {
1221 const view = controller.byobRequest.view;
1222
1223 assert_equals(view.constructor, Uint8Array);
1224 assert_equals(view.buffer.byteLength, 2);
1225 assert_equals(view.byteOffset, 1);
1226 assert_equals(view.byteLength, 1);
1227
1228 view[0] = 0x03;
1229 controller.byobRequest.respond(1);
1230
1231 assert_equals(controller.desiredSize, 0, 'desiredSize');
1232 } else {
1233 assert_unreached('Too many pull calls');
1234 }
1235
1236 ++pullCount;
1237 },
1238 type: 'bytes'
1239 });
1240
1241 // Wait for completion of the start method to be reflected.
1242 return Promise.resolve().then(() => {
1243 const reader = stream.getReader({ mode: 'byob' });
1244
1245 const promise = reader.read(new Uint16Array(2)).then(result => {
1246 assert_equals(result.done, false, 'done');
1247
1248 const view = result.value;
1249 assert_equals(view.constructor, Uint16Array, 'constructor');
1250 assert_equals(view.buffer.byteLength, 4, 'buffer.byteLength');
1251 assert_equals(view.byteOffset, 0, 'byteOffset');
1252 assert_equals(view.byteLength, 2, 'byteLength');
1253 assert_equals(view[0], 0x0001, 'Contents are set');
1254
1255 const p = reader.read(new Uint16Array(1));
1256
1257 assert_equals(pullCount, 1);
1258
1259 return p;
1260 }).then(result => {
1261 assert_equals(result.done, false, 'done');
1262
1263 const view = result.value;
1264 assert_equals(view.buffer.byteLength, 2, 'buffer.byteLength');
1265 assert_equals(view.byteOffset, 0, 'byteOffset');
1266 assert_equals(view.byteLength, 2, 'byteLength');
1267 assert_equals(view[0], 0x0302, 'Contents are set');
1268 });
1269
1270 assert_equals(pullCount, 0);
1271
1272 return promise;
1273 });
1274 }, 'ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(vi ew) with 2-element Uint16Array');
1275
1276 promise_test(t => {
1277 const stream = new ReadableStream({
1278 start(c) {
1279 const view = new Uint8Array(1);
1280 view[0] = 0xff;
1281 c.enqueue(view);
1282 c.close();
1283 },
1284 pull() {
1285 assert_unreached('pull must not be called');
1286 },
1287 type: 'bytes'
1288 });
1289
1290 const reader = stream.getReader({ mode: 'byob' });
1291
1292
1293 const promise = promise_rejects(t, new TypeError(), reader.read(new Uint16Arra y(1)), 'read(view) must fail');
1294 return promise_rejects(t, new TypeError(), promise.then(() => reader.closed));
1295 }, 'ReadableStream with byte source: read(view) with Uint16Array on close()-d st ream with 1 byte enqueue()-d must ' +
1296 'fail');
1297
1298 promise_test(t => {
1299 let pullCount = 0;
1300
1301 let controller;
1302
1303 const stream = new ReadableStream({
1304 start(c) {
1305 const view = new Uint8Array(1);
1306 view[0] = 0xff;
1307 c.enqueue(view);
1308
1309 controller = c;
1310 },
1311 pull() {
1312 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
1313
1314 if (pullCount === 0) {
1315 const view = controller.byobRequest.view;
1316
1317 assert_equals(view.constructor, Uint8Array);
1318 assert_equals(view.buffer.byteLength, 2);
1319
1320 assert_equals(view.byteOffset, 1);
1321 assert_equals(view.byteLength, 1);
1322 } else {
1323 assert_unreached('Too many pull calls');
1324 }
1325
1326 ++pullCount;
1327 },
1328 type: 'bytes'
1329 });
1330
1331 const reader = stream.getReader({ mode: 'byob' });
1332
1333 let promise = promise_rejects(t, new TypeError(), reader.read(new Uint16Array( 1)), 'read(view) must fail');
1334 promise = promise_rejects(t, new TypeError(), promise.then(() => reader.closed ));
1335 promise = promise.then(() => {
1336 assert_equals(pullCount, 0);
1337 });
1338
1339 assert_throws(new TypeError(), () => controller.close(), 'controller.close() m ust throw');
1340
1341 return promise;
1342 }, 'ReadableStream with byte source: A stream must be errored if close()-d befor e fulfilling read(view) with ' +
1343 'Uint16Array');
1344
1345 test(() => {
1346 let controller;
1347
1348 new ReadableStream({
1349 start(c) {
1350 controller = c;
1351 },
1352 type: 'bytes'
1353 });
1354
1355 // Enqueue a chunk so that the stream doesn't get closed. This is to check dup licate close() calls are rejected
1356 // even if the stream has not yet entered the closed state.
1357 const view = new Uint8Array(1);
1358 controller.enqueue(view);
1359 controller.close();
1360
1361 assert_throws(new TypeError(), () => controller.close(), 'controller.close() m ust throw');
1362 }, 'ReadableStream with byte source: Throw if close()-ed more than once');
1363
1364 test(() => {
1365 let controller;
1366
1367 new ReadableStream({
1368 start(c) {
1369 controller = c;
1370 },
1371 type: 'bytes'
1372 });
1373
1374 // Enqueue a chunk so that the stream doesn't get closed. This is to check enq ueue() after close() is rejected
1375 // even if the stream has not yet entered the closed state.
1376 const view = new Uint8Array(1);
1377 controller.enqueue(view);
1378 controller.close();
1379
1380 assert_throws(new TypeError(), () => controller.enqueue(view), 'controller.clo se() must throw');
1381 }, 'ReadableStream with byte source: Throw on enqueue() after close()');
1382
1383 promise_test(() => {
1384 let controller;
1385
1386 const stream = new ReadableStream({
1387 start(c) {
1388 controller = c;
1389 },
1390 pull() {
1391 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
1392 const view = controller.byobRequest.view;
1393
1394 assert_equals(view.constructor, Uint8Array);
1395 assert_equals(view.buffer.byteLength, 16);
1396
1397 assert_equals(view.byteOffset, 0);
1398 assert_equals(view.byteLength, 16);
1399
1400 view[15] = 0x01;
1401 controller.byobRequest.respond(16);
1402 controller.close();
1403 },
1404 type: 'bytes'
1405 });
1406
1407 const reader = stream.getReader({ mode: 'byob' });
1408
1409 return reader.read(new Uint8Array(16)).then(result => {
1410 assert_equals(result.done, false);
1411
1412 const view = result.value;
1413 assert_equals(view.byteOffset, 0);
1414 assert_equals(view.byteLength, 16);
1415 assert_equals(view[15], 0x01);
1416
1417 return reader.read(new Uint8Array(16));
1418 }).then(result => {
1419 assert_equals(result.done, true);
1420
1421 const view = result.value;
1422 assert_equals(view.byteOffset, 0);
1423 assert_equals(view.byteLength, 0);
1424 });
1425 }, 'ReadableStream with byte source: read(view), then respond() and close() in p ull()');
1426
1427 promise_test(() => {
1428 let pullCount = 0;
1429
1430 let controller;
1431
1432 const stream = new ReadableStream({
1433 start(c) {
1434 controller = c;
1435 },
1436 pull() {
1437 if (controller.byobRequest === undefined) {
1438 return;
1439 }
1440
1441 if (pullCount < 1) {
1442 for (let i = 0; i < 4; ++i) {
1443 const view = controller.byobRequest.view;
1444
1445 assert_equals(view.constructor, Uint8Array);
1446 assert_equals(view.buffer.byteLength, 4);
1447
1448 assert_equals(view.byteOffset, i);
1449 assert_equals(view.byteLength, 4 - i);
1450
1451 view[0] = 0x01;
1452 controller.byobRequest.respond(1);
1453 }
1454 } else {
1455 assert_unreached('Too many pull() calls');
1456 }
1457
1458 ++pullCount;
1459 },
1460 type: 'bytes'
1461 });
1462
1463 const reader = stream.getReader({ mode: 'byob' });
1464
1465 return reader.read(new Uint32Array(1)).then(result => {
1466 assert_equals(result.done, false);
1467
1468 const view = result.value;
1469 assert_equals(view.byteOffset, 0);
1470 assert_equals(view.byteLength, 4);
1471 assert_equals(view[0], 0x01010101);
1472 });
1473 }, 'ReadableStream with byte source: read(view) with Uint32Array, then fill it b y multiple respond() calls');
1474
1475 promise_test(() => {
1476 let pullCount = 0;
1477
1478 let controller;
1479
1480 const stream = new ReadableStream({
1481 start(c) {
1482 controller = c;
1483 },
1484 pull() {
1485 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1486
1487 if (pullCount > 1) {
1488 assert_unreached('Too many pull calls');
1489 }
1490
1491 ++pullCount;
1492 },
1493 type: 'bytes'
1494 });
1495
1496 const reader = stream.getReader();
1497
1498 const p0 = reader.read().then(result => {
1499 assert_equals(pullCount, 1);
1500
1501 controller.enqueue(new Uint8Array(2));
1502
1503 // Since the queue has data no less than HWM, no more pull.
1504 assert_equals(pullCount, 1);
1505
1506 assert_equals(result.done, false);
1507
1508 const view = result.value;
1509 assert_equals(view.constructor, Uint8Array);
1510 assert_equals(view.buffer.byteLength, 1);
1511 assert_equals(view.byteOffset, 0);
1512 assert_equals(view.byteLength, 1);
1513 });
1514
1515 assert_equals(pullCount, 0, 'No pull should have been made since the startProm ise has not yet been handled');
1516
1517 const p1 = reader.read().then(result => {
1518 assert_equals(pullCount, 1);
1519
1520 assert_equals(result.done, false);
1521
1522 const view = result.value;
1523 assert_equals(view.constructor, Uint8Array);
1524 assert_equals(view.buffer.byteLength, 2);
1525 assert_equals(view.byteOffset, 0);
1526 assert_equals(view.byteLength, 2);
1527 });
1528
1529 assert_equals(pullCount, 0, 'No pull should have been made since the startProm ise has not yet been handled');
1530
1531 controller.enqueue(new Uint8Array(1));
1532
1533 assert_equals(pullCount, 0, 'No pull should have been made since the startProm ise has not yet been handled');
1534
1535 return Promise.all([p0, p1]);
1536 }, 'ReadableStream with byte source: read() twice, then enqueue() twice');
1537
1538 promise_test(() => {
1539 let pullCount = 0;
1540
1541 let controller;
1542
1543 const stream = new ReadableStream({
1544 start(c) {
1545 controller = c;
1546 },
1547 pull() {
1548 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
1549
1550 if (pullCount === 0) {
1551 const view = controller.byobRequest.view;
1552
1553 assert_equals(view.constructor, Uint8Array);
1554 assert_equals(view.buffer.byteLength, 16);
1555
1556 assert_equals(view.byteOffset, 0);
1557 assert_equals(view.byteLength, 16);
1558 } else {
1559 assert_unreached('Too many pull calls');
1560 }
1561
1562 ++pullCount;
1563 },
1564 type: 'bytes'
1565 });
1566
1567 const reader = stream.getReader({ mode: 'byob' });
1568
1569 const p0 = reader.read(new Uint8Array(16)).then(result => {
1570 assert_equals(result.done, true, '1st read: done');
1571
1572 const view = result.value;
1573 assert_equals(view.buffer.byteLength, 16, '1st read: buffer.byteLength');
1574 assert_equals(view.byteOffset, 0, '1st read: byteOffset');
1575 assert_equals(view.byteLength, 0, '1st read: byteLength');
1576 });
1577
1578 const p1 = reader.read(new Uint8Array(32)).then(result => {
1579 assert_equals(result.done, true, '2nd read: done');
1580
1581 const view = result.value;
1582 assert_equals(view.buffer.byteLength, 32, '2nd read: buffer.byteLength');
1583 assert_equals(view.byteOffset, 0, '2nd read: byteOffset');
1584 assert_equals(view.byteLength, 0, '2nd read: byteLength');
1585 });
1586
1587 controller.close();
1588 controller.byobRequest.respond(0);
1589
1590 return Promise.all([p0, p1]);
1591 }, 'ReadableStream with byte source: Multiple read(view), close() and respond()' );
1592
1593 promise_test(() => {
1594 let pullCount = 0;
1595
1596 let controller;
1597
1598 const stream = new ReadableStream({
1599 start(c) {
1600 controller = c;
1601 },
1602 pull() {
1603 if (pullCount === 0) {
1604 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must n ot be undefined');
1605 const view = controller.byobRequest.view;
1606
1607 assert_equals(view.constructor, Uint8Array);
1608 assert_equals(view.buffer.byteLength, 16);
1609
1610 assert_equals(view.byteOffset, 0);
1611 assert_equals(view.byteLength, 16);
1612 } else {
1613 assert_unreached();
1614 }
1615
1616 ++pullCount;
1617 },
1618 type: 'bytes'
1619 });
1620
1621 const reader = stream.getReader({ mode: 'byob' });
1622
1623 const p0 = reader.read(new Uint8Array(16)).then(result => {
1624 assert_equals(result.done, false, '1st read: done');
1625
1626 const view = result.value;
1627 assert_equals(view.buffer.byteLength, 16, '1st read: buffer.byteLength');
1628 assert_equals(view.byteOffset, 0, '1st read: byteOffset');
1629 assert_equals(view.byteLength, 16, '1st read: byteLength');
1630 });
1631
1632 const p1 = reader.read(new Uint8Array(16)).then(result => {
1633 assert_equals(result.done, false, '2nd read: done');
1634
1635 const view = result.value;
1636 assert_equals(view.buffer.byteLength, 16, '2nd read: buffer.byteLength');
1637 assert_equals(view.byteOffset, 0, '2nd read: byteOffset');
1638 assert_equals(view.byteLength, 8, '2nd read: byteLength');
1639 });
1640
1641 controller.enqueue(new Uint8Array(24));
1642
1643 return Promise.all([p0, p1]);
1644 }, 'ReadableStream with byte source: Multiple read(view), big enqueue()');
1645
1646 promise_test(() => {
1647 let controller;
1648
1649 const stream = new ReadableStream({
1650 start(c) {
1651 controller = c;
1652 },
1653 pull() {
1654 assert_unreached('pull must not be called');
1655 },
1656 type: 'bytes'
1657 });
1658
1659 const reader = stream.getReader({ mode: 'byob' });
1660
1661 let bytesRead = 0;
1662
1663 function pump() {
1664 return reader.read(new Uint8Array(7)).then(result => {
1665 if (result.done) {
1666 assert_equals(bytesRead, 1024);
1667
1668 return null;
1669 }
1670
1671 bytesRead += result.value.byteLength;
1672
1673 return pump();
1674 }).catch(e => {
1675 assert_unreached(e);
1676 });
1677 }
1678 const promise = pump();
1679
1680 controller.enqueue(new Uint8Array(512));
1681 controller.enqueue(new Uint8Array(512));
1682 controller.close();
1683
1684 return promise;
1685 }, 'ReadableStream with byte source: Multiple read(view) and multiple enqueue()' );
1686
1687 promise_test(t => {
1688 const stream = new ReadableStream({
1689 pull(controller) {
1690 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1691 },
1692 type: 'bytes'
1693 });
1694
1695 const reader = stream.getReader({ mode: 'byob' });
1696
1697 return promise_rejects(t, new TypeError(), reader.read(), 'read() must fail');
1698 }, 'ReadableStream with byte source: read(view) with passing undefined as view m ust fail');
1699
1700 promise_test(t => {
1701 const stream = new ReadableStream({
1702 pull(controller) {
1703 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1704 },
1705 type: 'bytes'
1706 });
1707
1708 const reader = stream.getReader({ mode: 'byob' });
1709
1710 return promise_rejects(t, new TypeError(), reader.read(new Uint8Array(0)), 're ad(view) must fail');
1711 }, 'ReadableStream with byte source: read(view) with zero-length view must fail' );
1712
1713 promise_test(t => {
1714 const stream = new ReadableStream({
1715 type: 'bytes'
1716 });
1717
1718 const reader = stream.getReader({ mode: 'byob' });
1719
1720 return promise_rejects(t, new TypeError(), reader.read({}), 'read(view) must f ail');
1721 }, 'ReadableStream with byte source: read(view) with passing an empty object as view must fail');
1722
1723 promise_test(t => {
1724 const stream = new ReadableStream({
1725 type: 'bytes'
1726 });
1727
1728 const reader = stream.getReader({ mode: 'byob' });
1729
1730 return promise_rejects(t, new TypeError(),
1731 reader.read({ buffer: new ArrayBuffer(10), byteOffset: 0, byteLength: 10 }),
1732 'read(view) must fail');
1733 }, 'ReadableStream with byte source: Even read(view) with passing ArrayBufferVie w like object as view must fail');
1734
1735 promise_test(t => {
1736 const stream = new ReadableStream({
1737 start(c) {
1738 c.error(error1);
1739 },
1740 pull() {
1741 assert_unreached('pull must not be called');
1742 },
1743 type: 'bytes'
1744 });
1745
1746 const reader = stream.getReader();
1747
1748 return promise_rejects(t, error1, reader.read(), 'read() must fail');
1749 }, 'ReadableStream with byte source: read() on an errored stream');
1750
1751 promise_test(t => {
1752 let controller;
1753
1754 const stream = new ReadableStream({
1755 start(c) {
1756 controller = c;
1757 },
1758 type: 'bytes'
1759 });
1760
1761 const reader = stream.getReader();
1762
1763 const promise = promise_rejects(t, error1, reader.read(), 'read() must fail');
1764
1765 controller.error(error1);
1766
1767 return promise;
1768 }, 'ReadableStream with byte source: read(), then error()');
1769
1770 promise_test(t => {
1771 const stream = new ReadableStream({
1772 start(c) {
1773 c.error(error1);
1774 },
1775 pull() {
1776 assert_unreached('pull must not be called');
1777 },
1778 type: 'bytes'
1779 });
1780
1781 const reader = stream.getReader({ mode: 'byob' });
1782
1783 return promise_rejects(t, error1, reader.read(new Uint8Array(1)), 'read() must fail');
1784 }, 'ReadableStream with byte source: read(view) on an errored stream');
1785
1786 promise_test(t => {
1787 let controller;
1788
1789 const stream = new ReadableStream({
1790 start(c) {
1791 controller = c;
1792 },
1793 type: 'bytes'
1794 });
1795
1796 const reader = stream.getReader({ mode: 'byob' });
1797
1798 const promise = promise_rejects(t, error1, reader.read(new Uint8Array(1)), 're ad() must fail');
1799
1800 controller.error(error1);
1801
1802 return promise;
1803 }, 'ReadableStream with byte source: read(view), then error()');
1804
1805 promise_test(t => {
1806 let controller;
1807
1808 const testError = new TypeError('foo');
1809
1810 const stream = new ReadableStream({
1811 start(c) {
1812 controller = c;
1813 },
1814 pull() {
1815 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1816 throw testError;
1817 },
1818 type: 'bytes'
1819 });
1820
1821 const reader = stream.getReader();
1822
1823 const promise = promise_rejects(t, testError, reader.read(), 'read() must fail ');
1824 return promise_rejects(t, testError, promise.then(() => reader.closed));
1825 }, 'ReadableStream with byte source: Throwing in pull function must error the st ream');
1826
1827 promise_test(t => {
1828 let controller;
1829
1830 const stream = new ReadableStream({
1831 start(c) {
1832 controller = c;
1833 },
1834 pull() {
1835 assert_equals(controller.byobRequest, undefined, 'byobRequest must be unde fined');
1836 controller.error(error1);
1837 throw new TypeError('foo');
1838 },
1839 type: 'bytes'
1840 });
1841
1842 const reader = stream.getReader();
1843
1844 return promise_rejects(t, error1, reader.read(), 'read() must fail').then(() = > {
1845 return promise_rejects(t, error1, reader.closed, 'closed must fail');
1846 });
1847 }, 'ReadableStream with byte source: Throwing in pull in response to read() must be ignored if the stream is ' +
1848 'errored in it');
1849
1850 promise_test(t => {
1851 let controller;
1852
1853 const testError = new TypeError('foo');
1854
1855 const stream = new ReadableStream({
1856 start(c) {
1857 controller = c;
1858 },
1859 pull() {
1860 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
1861 throw testError;
1862 },
1863 type: 'bytes'
1864 });
1865
1866 const reader = stream.getReader({ mode: 'byob' });
1867
1868 const promise = promise_rejects(t, testError, reader.read(new Uint8Array(1)), 'read(view) must fail');
1869 return promise_rejects(t, testError, promise.then(() => reader.closed));
1870 }, 'ReadableStream with byte source: Throwing in pull in response to read(view) function must error the stream');
1871
1872 promise_test(t => {
1873 let controller;
1874
1875 const stream = new ReadableStream({
1876 start(c) {
1877 controller = c;
1878 },
1879 pull() {
1880 assert_not_equals(controller.byobRequest, undefined, 'byobRequest must not be undefined');
1881 controller.error(error1);
1882 throw new TypeError('foo');
1883 },
1884 type: 'bytes'
1885 });
1886
1887 const reader = stream.getReader({ mode: 'byob' });
1888
1889 return promise_rejects(t, error1, reader.read(new Uint8Array(1)), 'read(view) must fail').then(() => {
1890 return promise_rejects(t, error1, reader.closed, 'closed must fail');
1891 });
1892 }, 'ReadableStream with byte source: Throwing in pull in response to read(view) must be ignored if the stream is ' +
1893 'errored in it');
1894
1895
1896 test(() => {
1897 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead er({ mode: 'byob' }).constructor;
1898 const stream = new ReadableStream({ type: 'bytes' });
1899 new ReadableStreamBYOBReader(stream);
1900 }, 'ReadableStreamBYOBReader can be constructed directly');
1901
1902 test(() => {
1903 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead er({ mode: 'byob' }).constructor;
1904 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader({}), 'constr uctor must throw');
1905 }, 'ReadableStreamBYOBReader constructor requires a ReadableStream argument');
1906
1907 test(() => {
1908 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead er({ mode: 'byob' }).constructor;
1909 const stream = new ReadableStream({ type: 'bytes' });
1910 stream.getReader();
1911 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(stream), 'co nstructor must throw');
1912 }, 'ReadableStreamBYOBReader constructor requires an unlocked ReadableStream');
1913
1914 test(() => {
1915 const ReadableStreamBYOBReader = new ReadableStream({ type: 'bytes' }).getRead er({ mode: 'byob' }).constructor;
1916 const stream = new ReadableStream();
1917 assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(stream), 'co nstructor must throw');
1918 }, 'ReadableStreamBYOBReader constructor requires a ReadableStream with type "by tes"');
1919
1920 done();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698