| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| // Files: tools/clusterfuzz/v8_mock.js |
| // Files: tools/clusterfuzz/v8_mock_archs.js |
| |
| // Test foozzie architecture-specific mocks for differential fuzzing. |
| |
| // Max typed array length is mocked and restricted to 1MiB buffer. |
| const maxBytes = 1048576; |
| |
| // The maximum also holds for array buffer and shared array buffer. |
| assertEquals(maxBytes, new ArrayBuffer(maxBytes + 1).byteLength); |
| assertEquals(maxBytes, new SharedArrayBuffer(maxBytes + 1).byteLength); |
| |
| function testArrayType(type) { |
| const name = type.name; |
| const bytesPerElem = type.BYTES_PER_ELEMENT; |
| const maxElem = maxBytes / bytesPerElem; |
| |
| function testLength(expectedLength, arr) { |
| const expectedBytes = expectedLength * bytesPerElem; |
| assertEquals(expectedBytes, arr.byteLength, name); |
| assertEquals(expectedLength, arr.length, name); |
| } |
| |
| // Test length argument in constructor. |
| testLength(maxElem - 1, new type(maxElem - 1)); |
| testLength(maxElem, new type(maxElem)); |
| testLength(maxElem, new type(maxElem + 1)); |
| |
| // Test buffer argument in constructor. |
| // Unaligned offsets don't throw. |
| const buffer = new ArrayBuffer(maxBytes); |
| new type(buffer, 1); |
| new type(buffer, 3); |
| |
| // Offsets work or are capped. |
| function bytes(elements) { |
| return elements * bytesPerElem; |
| } |
| testLength(maxElem, new type(buffer, 0)); |
| testLength(maxElem - 1, new type(buffer, bytes(1))); |
| testLength(1, new type(buffer, bytes(maxElem - 1))); |
| testLength(0, new type(buffer, bytes(maxElem))); |
| testLength(0, new type(buffer, bytes(maxElem + 1))); |
| |
| // Offset and length work or are capped. |
| testLength(1, new type(buffer, 0, 1)); |
| testLength(1, new type(buffer, bytesPerElem, 1)); |
| testLength(maxElem - 2, new type(buffer, bytes(1), maxElem - 2)); |
| testLength(maxElem - 1, new type(buffer, bytes(1), maxElem - 1)); |
| testLength(maxElem - 1, new type(buffer, bytes(1), maxElem)); |
| testLength(0, new type(buffer, bytes(maxElem - 1), 0)); |
| testLength(1, new type(buffer, bytes(maxElem - 1), 1)); |
| testLength(1, new type(buffer, bytes(maxElem - 1), 2)); |
| |
| // Insertion with "set" works or is capped. |
| let set0 = 0; |
| let set1 = 1; |
| if (name.startsWith("Big")) { |
| set0 = 0n; |
| set1 = 1n; |
| } |
| arr = new type(4); |
| arr.set([set1], 1); |
| assertEquals(new type([set0, set1, set0, set0]), arr, name); |
| arr.set([set1, set1], 3); // Capped to 2. |
| assertEquals(new type([set0, set1, set1, set1]), arr, name); |
| } |
| |
| testArrayType(Int8Array); |
| testArrayType(Uint8Array); |
| testArrayType(Uint8ClampedArray); |
| testArrayType(Int16Array); |
| testArrayType(Uint16Array); |
| testArrayType(Int32Array); |
| testArrayType(Uint32Array); |
| testArrayType(BigInt64Array); |
| testArrayType(BigUint64Array); |
| testArrayType(Float32Array); |
| testArrayType(Float64Array); |