tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

backpressure.any.js (2092B)


      1 // META: global=window,worker,shadowrealm
      2 
      3 'use strict';
      4 
      5 const classes = [
      6  {
      7    name: 'TextDecoderStream',
      8    input: new Uint8Array([65])
      9  },
     10  {
     11    name: 'TextEncoderStream',
     12    input: 'A'
     13  }
     14 ];
     15 
     16 const microtasksRun = () => new Promise(resolve => step_timeout(resolve, 0));
     17 
     18 for (const streamClass of classes) {
     19  promise_test(async () => {
     20    const stream = new self[streamClass.name]();
     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.name}`);
     36 
     37  promise_test(async () => {
     38    const stream = new self[streamClass.name]();
     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.name}`);
     60 }