summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/compression/decompression-bad-chunks.tentative.any.js
blob: 0a1312a5a111b8cc2690e9541ba4b7b778f86cf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// META: global=window,worker

'use strict';

const badChunks = [
  {
    name: 'undefined',
    value: undefined
  },
  {
    name: 'null',
    value: null
  },
  {
    name: 'numeric',
    value: 3.14
  },
  {
    name: 'object, not BufferSource',
    value: {}
  },
  {
    name: 'array',
    value: [65]
  },
  {
    name: 'SharedArrayBuffer',
    // Use a getter to postpone construction so that all tests don't fail where
    // SharedArrayBuffer is not yet implemented.
    get value() {
      // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
      return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer;
    }
  },
  {
    name: 'shared Uint8Array',
    get value() {
      // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()`
      return new Uint8Array(new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer)
    }
  },
  {
    name: 'invalid deflate bytes',
    value: new Uint8Array([0, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36])
  },
  {
    name: 'invalid gzip bytes',
    value: new Uint8Array([0, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0])
  },
];

// Test Case Design
// We need to wait until after we close the writable stream to check if the decoded stream is valid.
// We can end up in a state where all reads/writes are valid, but upon closing the writable stream an error is detected.
// (Example: A zlib encoded chunk w/o the checksum).

async function decompress(chunk, format, t)
{
    const ds = new DecompressionStream(format);
    const reader = ds.readable.getReader();
    const writer = ds.writable.getWriter();

    writer.write(chunk.value).then(() => {}, () => {});
    reader.read().then(() => {}, () => {});

    await promise_rejects_js(t, TypeError, writer.close(), 'writer.close() should reject');
    await promise_rejects_js(t, TypeError, writer.closed, 'write.closed should reject');

    await promise_rejects_js(t, TypeError, reader.read(), 'reader.read() should reject');
    await promise_rejects_js(t, TypeError, reader.closed, 'read.closed should reject');
}

for (const chunk of badChunks) {
  promise_test(async t => {
    await decompress(chunk, 'gzip', t);
  }, `chunk of type ${chunk.name} should error the stream for gzip`);

  promise_test(async t => {
    await decompress(chunk, 'deflate', t);
  }, `chunk of type ${chunk.name} should error the stream for deflate`);

  promise_test(async t => {
    await decompress(chunk, 'deflate-raw', t);
  }, `chunk of type ${chunk.name} should error the stream for deflate-raw`);
}