summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fetch/content-encoding
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fetch/content-encoding')
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/bad-gzip-body.any.js22
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/big-gzip-body.https.any.js55
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/gzip-body.any.js16
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/bad-gzip-body.py3
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gzbin0 -> 65509 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz.headers3
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gzbin0 -> 64 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz.headers2
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gzbin0 -> 57 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz.headers2
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/bad-zstd-body.https.any.js22
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/big-window-zstd-body.tentative.https.any.js9
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/big-zstd-body.https.any.js55
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/bad-zstd-body.py3
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zstbin0 -> 2509 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst.headers3
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zstbin0 -> 599 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst.headers2
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zstbin0 -> 25 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst.headers2
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zstbin0 -> 25 bytes
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst.headers2
-rw-r--r--testing/web-platform/tests/fetch/content-encoding/zstd/zstd-body.https.any.js15
23 files changed, 216 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/bad-gzip-body.any.js b/testing/web-platform/tests/fetch/content-encoding/gzip/bad-gzip-body.any.js
new file mode 100644
index 0000000000..17bc1261a3
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/bad-gzip-body.any.js
@@ -0,0 +1,22 @@
+// META: global=window,worker
+
+promise_test((test) => {
+ return fetch("resources/bad-gzip-body.py").then(res => {
+ assert_equals(res.status, 200);
+ });
+}, "Fetching a resource with bad gzip content should still resolve");
+
+[
+ "arrayBuffer",
+ "blob",
+ "formData",
+ "json",
+ "text"
+].forEach(method => {
+ promise_test(t => {
+ return fetch("resources/bad-gzip-body.py").then(res => {
+ assert_equals(res.status, 200);
+ return promise_rejects_js(t, TypeError, res[method]());
+ });
+ }, "Consuming the body of a resource with bad gzip content with " + method + "() should reject");
+});
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/big-gzip-body.https.any.js b/testing/web-platform/tests/fetch/content-encoding/gzip/big-gzip-body.https.any.js
new file mode 100644
index 0000000000..b5d62c9804
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/big-gzip-body.https.any.js
@@ -0,0 +1,55 @@
+// META: global=window,worker
+
+const EXPECTED_SIZE = 27000000;
+const EXPECTED_SHA256 = [
+ 74, 100, 37, 243, 147, 61, 116, 60, 241, 221, 126,
+ 18, 24, 71, 204, 28, 50, 62, 201, 130, 152, 225,
+ 217, 183, 10, 201, 143, 214, 102, 155, 212, 248,
+ ];
+
+promise_test(async () => {
+ const response = await fetch('resources/big.text.gz');
+ assert_true(response.ok);
+ const arrayBuffer = await response.arrayBuffer();
+ assert_equals(arrayBuffer.byteLength, EXPECTED_SIZE,
+ 'uncompressed size should match');
+ const sha256 = await crypto.subtle.digest('SHA-256', arrayBuffer);
+ assert_array_equals(new Uint8Array(sha256), EXPECTED_SHA256,
+ 'digest should match');
+}, 'large gzip data should be decompressed successfully');
+
+promise_test(async () => {
+ const response = await fetch('resources/big.text.gz');
+ assert_true(response.ok);
+ const reader = response.body.getReader({mode: 'byob'});
+ let offset = 0;
+ // Pre-allocate space for the output. The response body will be read
+ // chunk-by-chunk into this array.
+ let ab = new ArrayBuffer(EXPECTED_SIZE);
+ while (offset < EXPECTED_SIZE) {
+ // To stress the data pipe, we want to use a different size read each
+ // time. Unfortunately, JavaScript doesn't have a seeded random number
+ // generator, so this creates the possibility of making this test flaky if
+ // it doesn't work for some edge cases.
+ let size = Math.floor(Math.random() * 65535 + 1);
+ if (size + offset > EXPECTED_SIZE) {
+ size = EXPECTED_SIZE - offset;
+ }
+ const u8 = new Uint8Array(ab, offset, size);
+ const { value, done } = await reader.read(u8);
+ ab = value.buffer;
+ // Check that we got our original array back.
+ assert_equals(ab.byteLength, EXPECTED_SIZE,
+ 'backing array should be the same size');
+ assert_equals(offset, value.byteOffset, 'offset should match');
+ assert_less_than_equal(value.byteLength, size,
+ 'we should not have got more than we asked for');
+ offset = value.byteOffset + value.byteLength;
+ if (done) break;
+ }
+ assert_equals(offset, EXPECTED_SIZE,
+ 'we should have read the whole thing');
+ const sha256 = await crypto.subtle.digest('SHA-256', new Uint8Array(ab));
+ assert_array_equals(new Uint8Array(sha256), EXPECTED_SHA256,
+ 'digest should match');
+}, 'large gzip data should be decompressed successfully with byte stream');
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/gzip-body.any.js b/testing/web-platform/tests/fetch/content-encoding/gzip/gzip-body.any.js
new file mode 100644
index 0000000000..37758b7d91
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/gzip-body.any.js
@@ -0,0 +1,16 @@
+// META: global=window,worker
+
+const expectedDecompressedSize = 10500;
+[
+ "text",
+ "octetstream"
+].forEach(contentType => {
+ promise_test(async t => {
+ let response = await fetch(`resources/foo.${contentType}.gz`);
+ assert_true(response.ok);
+ let arrayBuffer = await response.arrayBuffer()
+ let u8 = new Uint8Array(arrayBuffer);
+ assert_equals(u8.length, expectedDecompressedSize);
+ }, `fetched gzip data with content type ${contentType} should be decompressed.`);
+});
+
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/bad-gzip-body.py b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/bad-gzip-body.py
new file mode 100644
index 0000000000..a79b94ed04
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/bad-gzip-body.py
@@ -0,0 +1,3 @@
+def main(request, response):
+ headers = [(b"Content-Encoding", b"gzip")]
+ return headers, b"not actually gzip"
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz
new file mode 100644
index 0000000000..13441bc399
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz.headers b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz.headers
new file mode 100644
index 0000000000..55d2345c23
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/big.text.gz.headers
@@ -0,0 +1,3 @@
+Content-type: text/plain
+Content-Encoding: gzip
+Cache-Control: no-store
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz
new file mode 100644
index 0000000000..f3df4cb89b
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz.headers b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz.headers
new file mode 100644
index 0000000000..27d4f401f1
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.octetstream.gz.headers
@@ -0,0 +1,2 @@
+Content-type: application/octet-stream
+Content-Encoding: gzip
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz
new file mode 100644
index 0000000000..05a5cce07b
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz.headers b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz.headers
new file mode 100644
index 0000000000..7def3ddc14
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/gzip/resources/foo.text.gz.headers
@@ -0,0 +1,2 @@
+Content-type: text/plain
+Content-Encoding: gzip
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/bad-zstd-body.https.any.js b/testing/web-platform/tests/fetch/content-encoding/zstd/bad-zstd-body.https.any.js
new file mode 100644
index 0000000000..3f32e4dfba
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/bad-zstd-body.https.any.js
@@ -0,0 +1,22 @@
+// META: global=window,worker
+
+promise_test((test) => {
+ return fetch("resources/bad-zstd-body.py").then(res => {
+ assert_equals(res.status, 200);
+ });
+}, "Fetching a resource with bad zstd content should still resolve");
+
+[
+ "arrayBuffer",
+ "blob",
+ "formData",
+ "json",
+ "text"
+].forEach(method => {
+ promise_test(t => {
+ return fetch("resources/bad-zstd-body.py").then(res => {
+ assert_equals(res.status, 200);
+ return promise_rejects_js(t, TypeError, res[method]());
+ });
+ }, "Consuming the body of a resource with bad zstd content with " + method + "() should reject");
+});
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/big-window-zstd-body.tentative.https.any.js b/testing/web-platform/tests/fetch/content-encoding/zstd/big-window-zstd-body.tentative.https.any.js
new file mode 100644
index 0000000000..c1dc944956
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/big-window-zstd-body.tentative.https.any.js
@@ -0,0 +1,9 @@
+// META: global=window,worker
+// See https://github.com/facebook/zstd/issues/2713 for discussion about
+// standardizing window size limits.
+
+promise_test(async t => {
+ const response = await fetch('resources/big.window.zst');
+ assert_true(response.ok);
+ await promise_rejects_js(t, TypeError, response.text());
+}, 'Consuming the body of a resource with too large of a zstd window size should reject');
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/big-zstd-body.https.any.js b/testing/web-platform/tests/fetch/content-encoding/zstd/big-zstd-body.https.any.js
new file mode 100644
index 0000000000..6835f6e425
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/big-zstd-body.https.any.js
@@ -0,0 +1,55 @@
+// META: global=window,worker
+
+const EXPECTED_SIZE = 27000000;
+const EXPECTED_SHA256 = [
+ 74, 100, 37, 243, 147, 61, 116, 60, 241, 221, 126,
+ 18, 24, 71, 204, 28, 50, 62, 201, 130, 152, 225,
+ 217, 183, 10, 201, 143, 214, 102, 155, 212, 248,
+ ];
+
+promise_test(async () => {
+ const response = await fetch('resources/big.text.zst');
+ assert_true(response.ok);
+ const arrayBuffer = await response.arrayBuffer();
+ assert_equals(arrayBuffer.byteLength, EXPECTED_SIZE,
+ 'uncompressed size should match');
+ const sha256 = await crypto.subtle.digest('SHA-256', arrayBuffer);
+ assert_array_equals(new Uint8Array(sha256), EXPECTED_SHA256,
+ 'digest should match');
+}, 'large zstd data should be decompressed successfully');
+
+promise_test(async () => {
+ const response = await fetch('resources/big.text.zst');
+ assert_true(response.ok);
+ const reader = response.body.getReader({mode: 'byob'});
+ let offset = 0;
+ // Pre-allocate space for the output. The response body will be read
+ // chunk-by-chunk into this array.
+ let ab = new ArrayBuffer(EXPECTED_SIZE);
+ while (offset < EXPECTED_SIZE) {
+ // To stress the data pipe, we want to use a different size read each
+ // time. Unfortunately, JavaScript doesn't have a seeded random number
+ // generator, so this creates the possibility of making this test flaky if
+ // it doesn't work for some edge cases.
+ let size = Math.floor(Math.random() * 65535 + 1);
+ if (size + offset > EXPECTED_SIZE) {
+ size = EXPECTED_SIZE - offset;
+ }
+ const u8 = new Uint8Array(ab, offset, size);
+ const { value, done } = await reader.read(u8);
+ ab = value.buffer;
+ // Check that we got our original array back.
+ assert_equals(ab.byteLength, EXPECTED_SIZE,
+ 'backing array should be the same size');
+ assert_equals(offset, value.byteOffset, 'offset should match');
+ assert_less_than_equal(value.byteLength, size,
+ 'we should not have got more than we asked for');
+ offset = value.byteOffset + value.byteLength;
+ if (done) break;
+ }
+ assert_equals(offset, EXPECTED_SIZE,
+ 'we should have read the whole thing');
+ const sha256 = await crypto.subtle.digest('SHA-256', new Uint8Array(ab));
+ assert_array_equals(new Uint8Array(sha256), EXPECTED_SHA256,
+ 'digest should match');
+}, 'large zstd data should be decompressed successfully with byte stream');
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/bad-zstd-body.py b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/bad-zstd-body.py
new file mode 100644
index 0000000000..496f26881d
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/bad-zstd-body.py
@@ -0,0 +1,3 @@
+def main(request, response):
+ headers = [(b"Content-Encoding", b"zstd")]
+ return headers, b"not actually zstd"
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst
new file mode 100644
index 0000000000..30eda2443f
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst.headers b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst.headers
new file mode 100644
index 0000000000..ea5b05cf2c
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.text.zst.headers
@@ -0,0 +1,3 @@
+Content-type: text/plain
+Content-Encoding: zstd
+Cache-Control: no-store
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst
new file mode 100644
index 0000000000..a1bca73228
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst.headers b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst.headers
new file mode 100644
index 0000000000..c5974e126a
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/big.window.zst.headers
@@ -0,0 +1,2 @@
+Content-type: text/plain
+Content-Encoding: zstd
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst
new file mode 100644
index 0000000000..a73bbdd224
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst.headers b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst.headers
new file mode 100644
index 0000000000..e397816f54
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.octetstream.zst.headers
@@ -0,0 +1,2 @@
+Content-type: application/octet-stream
+Content-Encoding: zstd
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst
new file mode 100644
index 0000000000..a73bbdd224
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst
Binary files differ
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst.headers b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst.headers
new file mode 100644
index 0000000000..c5974e126a
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/resources/foo.text.zst.headers
@@ -0,0 +1,2 @@
+Content-type: text/plain
+Content-Encoding: zstd
diff --git a/testing/web-platform/tests/fetch/content-encoding/zstd/zstd-body.https.any.js b/testing/web-platform/tests/fetch/content-encoding/zstd/zstd-body.https.any.js
new file mode 100644
index 0000000000..8692385743
--- /dev/null
+++ b/testing/web-platform/tests/fetch/content-encoding/zstd/zstd-body.https.any.js
@@ -0,0 +1,15 @@
+// META: global=window,worker
+
+const expectedDecompressedSize = 10500;
+[
+ "text",
+ "octetstream"
+].forEach(contentType => {
+ promise_test(async t => {
+ let response = await fetch(`resources/foo.${contentType}.zst`);
+ assert_true(response.ok);
+ let arrayBuffer = await response.arrayBuffer()
+ let u8 = new Uint8Array(arrayBuffer);
+ assert_equals(u8.length, expectedDecompressedSize);
+ }, `fetched zstd data with content type ${contentType} should be decompressed.`);
+});