tor-browser

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

compression-multiple-chunks.any.js (1982B)


      1 // META: global=window,worker,shadowrealm
      2 // META: script=third_party/pako/pako_inflate.min.js
      3 // META: script=resources/decompress.js
      4 // META: script=resources/formats.js
      5 // META: timeout=long
      6 
      7 'use strict';
      8 
      9 // This test asserts that compressing multiple chunks should work.
     10 
     11 // Example: ('Hello', 3) => TextEncoder().encode('HelloHelloHello')
     12 function makeExpectedChunk(input, numberOfChunks) {
     13  const expectedChunk = input.repeat(numberOfChunks);
     14  return new TextEncoder().encode(expectedChunk);
     15 }
     16 
     17 // Example: ('Hello', 3, 'deflate') => compress ['Hello', 'Hello', Hello']
     18 async function compressMultipleChunks(input, numberOfChunks, format) {
     19  const cs = new CompressionStream(format);
     20  const writer = cs.writable.getWriter();
     21  const chunk = new TextEncoder().encode(input);
     22  for (let i = 0; i < numberOfChunks; ++i) {
     23    writer.write(chunk);
     24  }
     25  const closePromise = writer.close();
     26  const out = [];
     27  const reader = cs.readable.getReader();
     28  let totalSize = 0;
     29  while (true) {
     30    const { value, done } = await reader.read();
     31    if (done)
     32      break;
     33    out.push(value);
     34    totalSize += value.byteLength;
     35  }
     36  await closePromise;
     37  const concatenated = new Uint8Array(totalSize);
     38  let offset = 0;
     39  for (const array of out) {
     40    concatenated.set(array, offset);
     41    offset += array.byteLength;
     42  }
     43  return concatenated;
     44 }
     45 
     46 const hello = 'Hello';
     47 
     48 for (const format of formats) {
     49  for (let numberOfChunks = 2; numberOfChunks <= 16; ++numberOfChunks) {
     50    promise_test(async t => {
     51      const compressedData = await compressMultipleChunks(hello, numberOfChunks, format);
     52      const decompressedData = await decompressDataOrPako(compressedData, format);
     53      const expectedValue = makeExpectedChunk(hello, numberOfChunks);
     54      // check that we got the same result as our original string
     55      assert_array_equals(decompressedData, expectedValue, 'value should match');
     56    }, `compressing ${numberOfChunks} chunks with ${format} should work`);
     57  }
     58 }