• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// META: global=worker
2
3'use strict';
4
5const classes = [
6  {
7    constructor: TextDecoderStream,
8    input: new Uint8Array([65])
9  },
10  {
11    constructor: TextEncoderStream,
12    input: 'A'
13  }
14];
15
16const microtasksRun = () => new Promise(resolve => step_timeout(resolve, 0));
17
18for (const streamClass of classes) {
19  promise_test(async () => {
20    const stream = new streamClass.constructor();
21    const writer = stream.writable.getWriter();
22    const reader = stream.readable.getReader();
23    const events = [];
24    await microtasksRun();
25    const writePromise = writer.write(streamClass.input);
26    writePromise.then(() => events.push('write'));
27    await microtasksRun();
28    events.push('paused');
29    await reader.read();
30    events.push('read');
31    await writePromise;
32    assert_array_equals(events, ['paused', 'read', 'write'],
33                        'write should happen after read');
34  }, 'write() should not complete until read relieves backpressure for ' +
35     `${streamClass.constructor.name}`);
36
37  promise_test(async () => {
38    const stream = new streamClass.constructor();
39    const writer = stream.writable.getWriter();
40    const reader = stream.readable.getReader();
41    const events = [];
42    await microtasksRun();
43    const readPromise1 = reader.read();
44    readPromise1.then(() => events.push('read1'));
45    const writePromise1 = writer.write(streamClass.input);
46    const writePromise2 = writer.write(streamClass.input);
47    writePromise1.then(() => events.push('write1'));
48    writePromise2.then(() => events.push('write2'));
49    await microtasksRun();
50    events.push('paused');
51    const readPromise2 = reader.read();
52    readPromise2.then(() => events.push('read2'));
53    await Promise.all([writePromise1, writePromise2,
54                       readPromise1, readPromise2]);
55    assert_array_equals(events, ['read1', 'write1', 'paused', 'read2',
56                                 'write2'],
57                        'writes should not happen before read2');
58  }, 'additional writes should wait for backpressure to be relieved for ' +
59     `class ${streamClass.constructor.name}`);
60}
61