LibWeb: Change hardcoded compression test to round trip

As compression is not always deterministic, we cannot hardcode what
it'll be like, do a round trip instead.
This commit is contained in:
devgianlu 2025-03-01 23:23:09 +01:00 committed by Jelle Raaijmakers
commit 1612c1688e
Notes: github-actions[bot] 2025-03-19 12:49:15 +00:00
4 changed files with 80 additions and 34 deletions

View file

@ -1,31 +0,0 @@
<script src="../include.js"></script>
<script>
asyncTest(async done => {
const text = "Well hello friends!";
for (const format of ["deflate", "deflate-raw", "gzip"]) {
let stream = new Blob([text]).stream();
let compressor = stream.pipeThrough(new CompressionStream(format));
let reader = compressor.getReader();
let buffer = new ArrayBuffer(256);
let offset = 0;
while (true) {
let result = await reader.read();
if (result.done) {
break;
}
new Uint8Array(buffer).set(result.value, offset);
offset += result.value.byteLength;
}
let result = new Uint8Array(buffer, 0, offset).toBase64();
println(`format=${format}: ${result}`);
}
done();
});
</script>

View file

@ -0,0 +1,56 @@
<script src="../include.js"></script>
<script>
function readStream(reader) {
return new Promise((resolve, reject) => {
let chunks = [];
reader.read().then(function pump({value, done}) {
if (done) {
let blob = new Blob(chunks);
blob.arrayBuffer().then((b) => resolve(new Uint8Array(b, 0, blob.size))).catch(reject)
return;
}
chunks.push(value);
reader.read().then(pump);
});
});
}
function compress(data, format) {
let stream = new Blob([data]).stream();
let compressor = stream.pipeThrough(new CompressionStream(format));
let reader = compressor.getReader();
return readStream(reader);
}
function decompress(data, format) {
let stream = new Blob([data]).stream();
let decompressor = stream.pipeThrough(new DecompressionStream(format));
let reader = decompressor.getReader();
return readStream(reader);
}
async function roundTrip(data) {
let expectedPrefixLengths = {
'deflate': 2,
'deflate-raw': 0,
'gzip': 2
}
for (const format of ["deflate", "deflate-raw", "gzip"]) {
let compressed = await compress(data, format);
println(`prefix=${compressed.slice(0, expectedPrefixLengths[format])}`)
println(`equal=${data === compressed}`)
let decompressed = await decompress(compressed, format);
let result = new TextDecoder().decode(decompressed);
println(`format=${format}: ${result}`);
println('--------------')
}
}
asyncTest(async done => {
await roundTrip('Well hello friends!')
await roundTrip('Well hello friends!'.repeat(100))
done();
});
</script>