1// META: global=window,dedicatedworker,jsshell
2// META: script=/wasm/jsapi/wasm-module-builder.js
3
4let emptyModuleBinary;
5setup(() => {
6  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
7});
8
9test(() => {
10  assert_throws_js(TypeError, () => WebAssembly.validate());
11}, "Missing argument");
12
13test(() => {
14  const invalidArguments = [
15    undefined,
16    null,
17    true,
18    "",
19    Symbol(),
20    1,
21    {},
22    ArrayBuffer,
23    ArrayBuffer.prototype,
24    Array.from(emptyModuleBinary),
25  ];
26  for (const argument of invalidArguments) {
27    assert_throws_js(TypeError, () => WebAssembly.validate(argument),
28                     `validate(${format_value(argument)})`);
29  }
30}, "Invalid arguments");
31
32test(() => {
33  const fn = WebAssembly.validate;
34  const thisValues = [
35    undefined,
36    null,
37    true,
38    "",
39    Symbol(),
40    1,
41    {},
42    WebAssembly,
43  ];
44  for (const thisValue of thisValues) {
45    assert_true(fn.call(thisValue, emptyModuleBinary), `this=${format_value(thisValue)}`);
46  }
47}, "Branding");
48
49const modules = [
50  // Incomplete header.
51  [[], false],
52  [[0x00], false],
53  [[0x00, 0x61], false],
54  [[0x00, 0x61, 0x73], false],
55  [[0x00, 0x61, 0x73, 0x6d], false],
56  [[0x00, 0x61, 0x73, 0x6d, 0x01], false],
57  [[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00], false],
58  [[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00], false],
59
60  // Complete header.
61  [[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00], true],
62
63  // Invalid version.
64  [[0x00, 0x61, 0x73, 0x6d, 0x00, 0x00, 0x00, 0x00], false],
65  [[0x00, 0x61, 0x73, 0x6d, 0x02, 0x00, 0x00, 0x00], false],
66
67  // Nameless custom section.
68  [[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00], false],
69
70  // Custom section with empty name.
71  [[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00], true],
72
73  // Custom section with name "a".
74  [[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x61], true],
75];
76const bufferTypes = [
77  Uint8Array,
78  Int8Array,
79  Uint16Array,
80  Int16Array,
81  Uint32Array,
82  Int32Array,
83];
84for (const [module, expected] of modules) {
85  const name = module.map(n => n.toString(16)).join(" ");
86  for (const bufferType of bufferTypes) {
87    if (module.length % bufferType.BYTES_PER_ELEMENT === 0) {
88      test(() => {
89        const bytes = new Uint8Array(module);
90        const moduleBuffer = new bufferType(bytes.buffer);
91        assert_equals(WebAssembly.validate(moduleBuffer), expected);
92      }, `Validating module [${name}] in ${bufferType.name}`);
93    }
94  }
95}
96
97test(() => {
98  assert_true(WebAssembly.validate(emptyModuleBinary, {}));
99}, "Stray argument");
100