// META: global=worker

'use strict';

// This test asserts that compressed data length is shorter than the original
// data length. If the input is extremely small, the compressed data may be
// larger than the original data.

const LARGE_FILE = '/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm';

async function compressArrayBuffer(input, format) {
  const cs = new CompressionStream(format);
  const writer = cs.writable.getWriter();
  writer.write(input);
  const closePromise = writer.close();
  const out = [];
  const reader = cs.readable.getReader();
  let totalSize = 0;
  while (true) {
    const { value, done } = await reader.read();
    if (done)
      break;
    out.push(value);
    totalSize += value.byteLength;
  }
  await closePromise;
  const concatenated = new Uint8Array(totalSize);
  let offset = 0;
  for (const array of out) {
    concatenated.set(array, offset);
    offset += array.byteLength;
  }
  return concatenated;
}

promise_test(async () => {
  const response = await fetch(LARGE_FILE);
  const buffer = await response.arrayBuffer();
  const bufferView = new Uint8Array(buffer);
  const originalLength = bufferView.length;
  const compressedData = await compressArrayBuffer(bufferView, 'deflate');
  const compressedLength = compressedData.length;
  assert_less_than(compressedLength, originalLength, 'output should be smaller');
}, 'the length of deflated data should be shorter than that of the original data');

promise_test(async () => {
  const response = await fetch(LARGE_FILE);
  const buffer = await response.arrayBuffer();
  const bufferView = new Uint8Array(buffer);
  const originalLength = bufferView.length;
  const compressedData = await compressArrayBuffer(bufferView, 'gzip');
  const compressedLength = compressedData.length;
  assert_less_than(compressedLength, originalLength, 'output should be smaller');
}, 'the length of gzipped data should be shorter than that of the original data');
