summaryrefslogtreecommitdiff
path: root/tests/unit/streams_test.ts
diff options
context:
space:
mode:
authorFlorian Schwalm <68847951+egfx-notifications@users.noreply.github.com>2024-02-13 22:45:23 +0100
committerGitHub <noreply@github.com>2024-02-13 21:45:23 +0000
commit082f8128b8d784c599fdf2c0d857dbbe6abbc7fe (patch)
tree340091c16273e3faca4e08465ef8685086a3907c /tests/unit/streams_test.ts
parent365d7886480281056c930174d756ae660619b044 (diff)
fix(ext/web): Prevent (De-)CompressionStream resource leak on stream cancellation (#21199)
Based on #21074 and #20741 I was looking for further potential use cases of `TransformStream` `cancel()` method, so here go `CompressionStream` and `DecompressionStream`. Fixes #14212
Diffstat (limited to 'tests/unit/streams_test.ts')
-rw-r--r--tests/unit/streams_test.ts59
1 files changed, 58 insertions, 1 deletions
diff --git a/tests/unit/streams_test.ts b/tests/unit/streams_test.ts
index 6db9f666c..80b45e602 100644
--- a/tests/unit/streams_test.ts
+++ b/tests/unit/streams_test.ts
@@ -1,5 +1,5 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { assertEquals, fail } from "./test_util.ts";
+import { assertEquals, assertRejects, fail } from "./test_util.ts";
const {
core,
@@ -476,3 +476,60 @@ for (const packetCount of [1, 1024]) {
assertEquals(await promise, "resource closed");
});
}
+
+Deno.test(async function compressionStreamWritableMayBeAborted() {
+ await Promise.all([
+ new CompressionStream("gzip").writable.getWriter().abort(),
+ new CompressionStream("deflate").writable.getWriter().abort(),
+ new CompressionStream("deflate-raw").writable.getWriter().abort(),
+ ]);
+});
+
+Deno.test(async function compressionStreamReadableMayBeCancelled() {
+ await Promise.all([
+ new CompressionStream("gzip").readable.getReader().cancel(),
+ new CompressionStream("deflate").readable.getReader().cancel(),
+ new CompressionStream("deflate-raw").readable.getReader().cancel(),
+ ]);
+});
+
+Deno.test(async function decompressionStreamWritableMayBeAborted() {
+ await Promise.all([
+ new DecompressionStream("gzip").writable.getWriter().abort(),
+ new DecompressionStream("deflate").writable.getWriter().abort(),
+ new DecompressionStream("deflate-raw").writable.getWriter().abort(),
+ ]);
+});
+
+Deno.test(async function decompressionStreamReadableMayBeCancelled() {
+ await Promise.all([
+ new DecompressionStream("gzip").readable.getReader().cancel(),
+ new DecompressionStream("deflate").readable.getReader().cancel(),
+ new DecompressionStream("deflate-raw").readable.getReader().cancel(),
+ ]);
+});
+
+Deno.test(async function decompressionStreamValidGzipDoesNotThrow() {
+ const cs = new CompressionStream("gzip");
+ const ds = new DecompressionStream("gzip");
+ cs.readable.pipeThrough(ds);
+ const writer = cs.writable.getWriter();
+ await writer.write(new Uint8Array([1]));
+ writer.releaseLock();
+ await cs.writable.close();
+ let result = new Uint8Array();
+ for await (const chunk of ds.readable.values()) {
+ result = new Uint8Array([...result, ...chunk]);
+ }
+ assertEquals(result, new Uint8Array([1]));
+});
+
+Deno.test(async function decompressionStreamInvalidGzipStillReported() {
+ await assertRejects(
+ async () => {
+ await new DecompressionStream("gzip").writable.close();
+ },
+ TypeError,
+ "corrupt gzip stream does not have a matching checksum",
+ );
+});