Skip to content

Commit e983db1

Browse files
committed
Update tests for new (de)compress streams
1 parent 6f788e2 commit e983db1

File tree

1 file changed

+122
-69
lines changed

1 file changed

+122
-69
lines changed

test/brotli.spec.ts

Lines changed: 122 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,15 @@ describe("Brotli-wasm", () => {
121121
const input1 = input.slice(0, input.length / 2);
122122
const input2 = input.slice(input.length / 2);
123123
const stream = new brotli.CompressStream();
124-
const output1 = stream.compress(input1, 100);
125-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
126-
const output2 = stream.compress(input2, 100);
127-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
128-
const output3 = stream.compress(undefined, 100);
129-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
124+
const result1 = stream.compress(input1, 100);
125+
const output1 = result1.buf;
126+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
127+
const result2 = stream.compress(input2, 100);
128+
const output2 = result2.buf;
129+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
130+
const result3 = stream.compress(undefined, 100);
131+
const output3 = result3.buf;
132+
expect(result3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
130133
expect(dataToBase64([...output1, ...output2, ...output3])).to.equal('Gw4A+KWpyubolCCjVAjmxJ4D');
131134
});
132135

@@ -136,12 +139,15 @@ describe("Brotli-wasm", () => {
136139
const input2 = input.slice(input.length / 2);
137140
const quality = 1;
138141
const stream = new brotli.CompressStream(quality);
139-
const output1 = stream.compress(input1, 100);
140-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
141-
const output2 = stream.compress(input2, 100);
142-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
143-
const output3 = stream.compress(undefined, 100);
144-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
142+
const result1 = stream.compress(input1, 100);
143+
const output1 = result1.buf;
144+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
145+
const result2 = stream.compress(input2, 100);
146+
const output2 = result2.buf;
147+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
148+
const result3 = stream.compress(undefined, 100);
149+
const output3 = result3.buf;
150+
expect(result3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
145151
// It will be different from non-streaming result.
146152
// But it can still be decompressed back to the original string.
147153
let output = new Uint8Array([...output1, ...output2, ...output3]);
@@ -154,10 +160,12 @@ describe("Brotli-wasm", () => {
154160
const input1 = input.slice(0, input.length / 2);
155161
const input2 = input.slice(input.length / 2);
156162
const stream = new brotli.DecompressStream();
157-
const output1 = stream.decompress(input1, 100);
158-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
159-
const output2 = stream.decompress(input2, 100);
160-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
163+
const result1 = stream.decompress(input1, 100);
164+
const output1 = result1.buf;
165+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
166+
const result2 = stream.decompress(input2, 100);
167+
const output2 = result2.buf;
168+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
161169
expect(textDecoder.decode(new Uint8Array([...output1, ...output2]))).to.equal('Brotli brotli brotli brotli');
162170
});
163171

@@ -167,12 +175,15 @@ describe("Brotli-wasm", () => {
167175
const input2 = input.slice(input.length / 2);
168176
const quality = 12;
169177
const stream = new brotli.CompressStream(quality);
170-
const output1 = stream.compress(input1, 100);
171-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
172-
const output2 = stream.compress(input2, 100);
173-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
174-
const output3 = stream.compress(undefined, 100);
175-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
178+
const result1 = stream.compress(input1, 100);
179+
const output1 = result1.buf;
180+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
181+
const result2 = stream.compress(input2, 100);
182+
const output2 = result2.buf;
183+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
184+
const result3 = stream.compress(undefined, 100);
185+
const output3 = result3.buf;
186+
expect(result3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
176187
expect(dataToBase64([...output1, ...output2, ...output3])).to.equal('Gw4A+KWpyubolCCjVAjmxJ4D');
177188
});
178189

@@ -182,7 +193,6 @@ describe("Brotli-wasm", () => {
182193
expect(() =>
183194
stream.decompress(input, 100)
184195
).to.throw('Brotli streaming decompress failed');
185-
expect(stream.result()).to.lt(0);
186196
});
187197

188198
it("can streamingly compress & decompress back to the original result", () => {
@@ -191,21 +201,26 @@ describe("Brotli-wasm", () => {
191201
const encInput1 = encInput.slice(0, encInput.length / 2);
192202
const encInput2 = encInput.slice(encInput.length / 2);
193203
const encStream = new brotli.CompressStream();
194-
const encOutput1 = encStream.compress(encInput1, 100);
195-
expect(encStream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
196-
const encOutput2 = encStream.compress(encInput2, 100);
197-
expect(encStream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
198-
const encOutput3 = encStream.compress(undefined, 100);
199-
expect(encStream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
204+
const encResult1 = encStream.compress(encInput1, 100);
205+
const encOutput1 = encResult1.buf;
206+
expect(encResult1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
207+
const encResult2 = encStream.compress(encInput2, 100);
208+
const encOutput2 = encResult2.buf;
209+
expect(encResult2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
210+
const encResult3 = encStream.compress(undefined, 100);
211+
const encOutput3 = encResult3.buf;
212+
expect(encResult3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
200213
const encOutput = new Uint8Array([...encOutput1, ...encOutput2, ...encOutput3]);
201214

202215
const decInput1 = encOutput.slice(0, encOutput.length / 2);
203216
const decInput2 = encOutput.slice(encOutput.length / 2);
204217
const decStream = new brotli.DecompressStream();
205-
const decOutput1 = decStream.decompress(decInput1, 100);
206-
expect(decStream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
207-
const decOutput2 = decStream.decompress(decInput2, 100);
208-
expect(decStream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
218+
const decResult1 = decStream.decompress(decInput1, 100);
219+
const decOutput1 = decResult1.buf;
220+
expect(decResult1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
221+
const decResult2 = decStream.decompress(decInput2, 100);
222+
const decOutput2 = decResult2.buf;
223+
expect(decResult2.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
209224
const decOutput = new Uint8Array([...decOutput1, ...decOutput2]);
210225

211226
expect(textDecoder.decode(decOutput)).to.equal(s);
@@ -218,21 +233,26 @@ describe("Brotli-wasm", () => {
218233
const encInput2 = encInput.slice(encInput.length / 2);
219234
const quality = 3;
220235
const encStream = new brotli.CompressStream(quality);
221-
const encOutput1 = encStream.compress(encInput1, 100);
222-
expect(encStream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
223-
const encOutput2 = encStream.compress(encInput2, 100);
224-
expect(encStream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
225-
const encOutput3 = encStream.compress(undefined, 100);
226-
expect(encStream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
236+
const encResult1 = encStream.compress(encInput1, 100);
237+
const encOutput1 = encResult1.buf;
238+
expect(encResult1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
239+
const encResult2 = encStream.compress(encInput2, 100);
240+
const encOutput2 = encResult2.buf;
241+
expect(encResult2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
242+
const encResult3 = encStream.compress(undefined, 100);
243+
const encOutput3 = encResult3.buf;
244+
expect(encResult3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
227245
const encOutput = new Uint8Array([...encOutput1, ...encOutput2, ...encOutput3]);
228246

229247
const decInput1 = encOutput.slice(0, encOutput.length / 2);
230248
const decInput2 = encOutput.slice(encOutput.length / 2);
231249
const decStream = new brotli.DecompressStream();
232-
const decOutput1 = decStream.decompress(decInput1, 100);
233-
expect(decStream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
234-
const decOutput2 = decStream.decompress(decInput2, 100);
235-
expect(decStream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
250+
const decResult1 = decStream.decompress(decInput1, 100);
251+
const decOutput1 = decResult1.buf;
252+
expect(decResult1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
253+
const decResult2 = decStream.decompress(decInput2, 100);
254+
const decOutput2 = decResult2.buf;
255+
expect(decResult2.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
236256
const decOutput = new Uint8Array([...decOutput1, ...decOutput2]);
237257

238258
expect(textDecoder.decode(decOutput)).to.equal(s);
@@ -244,12 +264,15 @@ describe("Brotli-wasm", () => {
244264
// to make the compressor ask for more output space when the action is PROCESS
245265
const input = generateRandomBytes(1600000);
246266
const stream = new brotli.CompressStream();
247-
const output1 = stream.compress(input, 1);
248-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreOutput);
249-
const output2 = stream.compress(input.slice(stream.last_input_offset()), 1500000);
250-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
251-
const output3 = stream.compress(undefined, 1640000);
252-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
267+
const result1 = stream.compress(input, 1);
268+
const output1 = result1.buf;
269+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreOutput);
270+
const result2 = stream.compress(input.slice(result1.input_offset), 1500000);
271+
const output2 = result2.buf;
272+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
273+
const result3 = stream.compress(undefined, 1640000);
274+
const output3 = result3.buf;
275+
expect(result3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
253276
const output = new Uint8Array([...output1, ...output2, ...output3]);
254277

255278
expect([...brotli.decompress(output)]).to.deep.equal([...input]);
@@ -258,23 +281,28 @@ describe("Brotli-wasm", () => {
258281
it("streaming compressing can handle needing more output when action is finish", () => {
259282
const input = textEncoder.encode('Some thrilling text I urgently need to compress');
260283
const stream = new brotli.CompressStream();
261-
const output1 = stream.compress(input, 1);
262-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreInput);
263-
const output2 = stream.compress(undefined, 1);
264-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreOutput);
265-
const output3 = stream.compress(undefined, 100);
266-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
284+
const result1 = stream.compress(input, 1);
285+
const output1 = result1.buf;
286+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreInput);
287+
const result2 = stream.compress(undefined, 1);
288+
const output2 = result2.buf;
289+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreOutput);
290+
const result3 = stream.compress(undefined, 100);
291+
const output3 = result3.buf;
292+
expect(result3.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
267293
const output = new Uint8Array([...output1, ...output2, ...output3]);
268294
expect(dataToBase64(brotli.decompress(output))).to.equal(dataToBase64(input));
269295
});
270296

271297
it("streaming decompressing can handle needing more output", () => {
272298
const input = base64ToData('GxoAABypU587dC0k9ianQOgqjS32iUTcCA==');
273299
const stream = new brotli.DecompressStream();
274-
const output1 = stream.decompress(input, 1);
275-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.NeedsMoreOutput);
276-
const output2 = stream.decompress(input.slice(stream.last_input_offset()), 100);
277-
expect(stream.result()).to.equal(brotli.BrotliStreamResult.ResultSuccess);
300+
const result1 = stream.decompress(input, 1);
301+
const output1 = result1.buf;
302+
expect(result1.code).to.equal(brotli.BrotliStreamResultCode.NeedsMoreOutput);
303+
const result2 = stream.decompress(input.slice(result1.input_offset), 100);
304+
const output2 = result2.buf;
305+
expect(result2.code).to.equal(brotli.BrotliStreamResultCode.ResultSuccess);
278306
expect(textDecoder.decode(new Uint8Array([...output1, ...output2]))).to.equal('Brotli brotli brotli brotli');
279307
});
280308

@@ -304,14 +332,28 @@ describe("Brotli-wasm", () => {
304332
const compressionStream = new TransformStream({
305333
start() { },
306334
transform(chunk, controller) {
307-
controller.enqueue(compressStream.compress(chunk, 10));
335+
let resultCode;
336+
let inputOffset = 0;
337+
do {
338+
const input = chunk.slice(inputOffset);
339+
const result = compressStream.compress(input, 10);
340+
controller.enqueue(result.buf);
341+
resultCode = result.code;
342+
inputOffset += result.input_offset;
343+
} while (resultCode === brotli.BrotliStreamResultCode.NeedsMoreOutput);
344+
if (resultCode !== brotli.BrotliStreamResultCode.NeedsMoreInput) {
345+
controller.error(`Brotli compression failed when transforming with code ${resultCode}`);
346+
}
308347
},
309348
flush(controller) {
310-
while (
311-
compressStream.result() === brotli.BrotliStreamResult.NeedsMoreInput ||
312-
compressStream.result() === brotli.BrotliStreamResult.NeedsMoreOutput
313-
) {
314-
controller.enqueue(compressStream.compress(undefined, 10));
349+
let resultCode;
350+
do {
351+
const result = compressStream.compress(undefined, 10);
352+
controller.enqueue(result.buf);
353+
resultCode = result.code;
354+
} while (resultCode === brotli.BrotliStreamResultCode.NeedsMoreOutput)
355+
if (resultCode !== brotli.BrotliStreamResultCode.ResultSuccess) {
356+
controller.error(`Brotli compression failed when flushing with code ${resultCode}`);
315357
}
316358
controller.terminate();
317359
}
@@ -321,12 +363,23 @@ describe("Brotli-wasm", () => {
321363
const decompressionStream = new TransformStream({
322364
start() { },
323365
transform(chunk, controller) {
324-
controller.enqueue(decompressStream.decompress(chunk, 100));
366+
let resultCode;
367+
let inputOffset = 0;
368+
do {
369+
const input = chunk.slice(inputOffset);
370+
const result = decompressStream.decompress(input, 100);
371+
controller.enqueue(result.buf);
372+
resultCode = result.code;
373+
inputOffset += result.input_offset;
374+
} while (resultCode === brotli.BrotliStreamResultCode.NeedsMoreOutput);
375+
if (
376+
resultCode !== brotli.BrotliStreamResultCode.NeedsMoreInput &&
377+
resultCode !== brotli.BrotliStreamResultCode.ResultSuccess
378+
) {
379+
controller.error(`Brotli decompression failed with code ${resultCode}`)
380+
}
325381
},
326382
flush(controller) {
327-
while (decompressStream.result() === brotli.BrotliStreamResult.NeedsMoreOutput) {
328-
controller.enqueue(decompressStream.decompress(new Uint8Array(0), 100));
329-
}
330383
controller.terminate();
331384
}
332385
});

0 commit comments

Comments
 (0)