11cb0ef41Sopenharmony_ci'use strict'; 21cb0ef41Sopenharmony_ci 31cb0ef41Sopenharmony_cirequire('../common'); 41cb0ef41Sopenharmony_ciconst assert = require('assert'); 51cb0ef41Sopenharmony_ci 61cb0ef41Sopenharmony_ciconst LENGTH = 16; 71cb0ef41Sopenharmony_ci 81cb0ef41Sopenharmony_ciconst ab = new ArrayBuffer(LENGTH); 91cb0ef41Sopenharmony_ciconst dv = new DataView(ab); 101cb0ef41Sopenharmony_ciconst ui = new Uint8Array(ab); 111cb0ef41Sopenharmony_ciconst buf = Buffer.from(ab); 121cb0ef41Sopenharmony_ci 131cb0ef41Sopenharmony_ci 141cb0ef41Sopenharmony_ciassert.ok(buf instanceof Buffer); 151cb0ef41Sopenharmony_ciassert.strictEqual(buf.parent, buf.buffer); 161cb0ef41Sopenharmony_ciassert.strictEqual(buf.buffer, ab); 171cb0ef41Sopenharmony_ciassert.strictEqual(buf.length, ab.byteLength); 181cb0ef41Sopenharmony_ci 191cb0ef41Sopenharmony_ci 201cb0ef41Sopenharmony_cibuf.fill(0xC); 211cb0ef41Sopenharmony_cifor (let i = 0; i < LENGTH; i++) { 221cb0ef41Sopenharmony_ci assert.strictEqual(ui[i], 0xC); 231cb0ef41Sopenharmony_ci ui[i] = 0xF; 241cb0ef41Sopenharmony_ci assert.strictEqual(buf[i], 0xF); 251cb0ef41Sopenharmony_ci} 261cb0ef41Sopenharmony_ci 271cb0ef41Sopenharmony_cibuf.writeUInt32LE(0xF00, 0); 281cb0ef41Sopenharmony_cibuf.writeUInt32BE(0xB47, 4); 291cb0ef41Sopenharmony_cibuf.writeDoubleLE(3.1415, 8); 301cb0ef41Sopenharmony_ci 311cb0ef41Sopenharmony_ciassert.strictEqual(dv.getUint32(0, true), 0xF00); 321cb0ef41Sopenharmony_ciassert.strictEqual(dv.getUint32(4), 0xB47); 331cb0ef41Sopenharmony_ciassert.strictEqual(dv.getFloat64(8, true), 3.1415); 341cb0ef41Sopenharmony_ci 351cb0ef41Sopenharmony_ci 361cb0ef41Sopenharmony_ci// Now test protecting users from doing stupid things 371cb0ef41Sopenharmony_ci 381cb0ef41Sopenharmony_ciassert.throws(function() { 391cb0ef41Sopenharmony_ci function AB() { } 401cb0ef41Sopenharmony_ci Object.setPrototypeOf(AB, ArrayBuffer); 411cb0ef41Sopenharmony_ci Object.setPrototypeOf(AB.prototype, ArrayBuffer.prototype); 421cb0ef41Sopenharmony_ci Buffer.from(new AB()); 431cb0ef41Sopenharmony_ci}, { 441cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 451cb0ef41Sopenharmony_ci name: 'TypeError', 461cb0ef41Sopenharmony_ci message: 'The first argument must be of type string or an instance of ' + 471cb0ef41Sopenharmony_ci 'Buffer, ArrayBuffer, or Array or an Array-like Object. Received ' + 481cb0ef41Sopenharmony_ci 'an instance of AB' 491cb0ef41Sopenharmony_ci}); 501cb0ef41Sopenharmony_ci 511cb0ef41Sopenharmony_ci// Test the byteOffset and length arguments 521cb0ef41Sopenharmony_ci{ 531cb0ef41Sopenharmony_ci const ab = new Uint8Array(5); 541cb0ef41Sopenharmony_ci ab[0] = 1; 551cb0ef41Sopenharmony_ci ab[1] = 2; 561cb0ef41Sopenharmony_ci ab[2] = 3; 571cb0ef41Sopenharmony_ci ab[3] = 4; 581cb0ef41Sopenharmony_ci ab[4] = 5; 591cb0ef41Sopenharmony_ci const buf = Buffer.from(ab.buffer, 1, 3); 601cb0ef41Sopenharmony_ci assert.strictEqual(buf.length, 3); 611cb0ef41Sopenharmony_ci assert.strictEqual(buf[0], 2); 621cb0ef41Sopenharmony_ci assert.strictEqual(buf[1], 3); 631cb0ef41Sopenharmony_ci assert.strictEqual(buf[2], 4); 641cb0ef41Sopenharmony_ci buf[0] = 9; 651cb0ef41Sopenharmony_ci assert.strictEqual(ab[1], 9); 661cb0ef41Sopenharmony_ci 671cb0ef41Sopenharmony_ci assert.throws(() => Buffer.from(ab.buffer, 6), { 681cb0ef41Sopenharmony_ci code: 'ERR_BUFFER_OUT_OF_BOUNDS', 691cb0ef41Sopenharmony_ci name: 'RangeError', 701cb0ef41Sopenharmony_ci message: '"offset" is outside of buffer bounds' 711cb0ef41Sopenharmony_ci }); 721cb0ef41Sopenharmony_ci assert.throws(() => Buffer.from(ab.buffer, 3, 6), { 731cb0ef41Sopenharmony_ci code: 'ERR_BUFFER_OUT_OF_BOUNDS', 741cb0ef41Sopenharmony_ci name: 'RangeError', 751cb0ef41Sopenharmony_ci message: '"length" is outside of buffer bounds' 761cb0ef41Sopenharmony_ci }); 771cb0ef41Sopenharmony_ci} 781cb0ef41Sopenharmony_ci 791cb0ef41Sopenharmony_ci// Test the deprecated Buffer() version also 801cb0ef41Sopenharmony_ci{ 811cb0ef41Sopenharmony_ci const ab = new Uint8Array(5); 821cb0ef41Sopenharmony_ci ab[0] = 1; 831cb0ef41Sopenharmony_ci ab[1] = 2; 841cb0ef41Sopenharmony_ci ab[2] = 3; 851cb0ef41Sopenharmony_ci ab[3] = 4; 861cb0ef41Sopenharmony_ci ab[4] = 5; 871cb0ef41Sopenharmony_ci const buf = Buffer(ab.buffer, 1, 3); 881cb0ef41Sopenharmony_ci assert.strictEqual(buf.length, 3); 891cb0ef41Sopenharmony_ci assert.strictEqual(buf[0], 2); 901cb0ef41Sopenharmony_ci assert.strictEqual(buf[1], 3); 911cb0ef41Sopenharmony_ci assert.strictEqual(buf[2], 4); 921cb0ef41Sopenharmony_ci buf[0] = 9; 931cb0ef41Sopenharmony_ci assert.strictEqual(ab[1], 9); 941cb0ef41Sopenharmony_ci 951cb0ef41Sopenharmony_ci assert.throws(() => Buffer(ab.buffer, 6), { 961cb0ef41Sopenharmony_ci code: 'ERR_BUFFER_OUT_OF_BOUNDS', 971cb0ef41Sopenharmony_ci name: 'RangeError', 981cb0ef41Sopenharmony_ci message: '"offset" is outside of buffer bounds' 991cb0ef41Sopenharmony_ci }); 1001cb0ef41Sopenharmony_ci assert.throws(() => Buffer(ab.buffer, 3, 6), { 1011cb0ef41Sopenharmony_ci code: 'ERR_BUFFER_OUT_OF_BOUNDS', 1021cb0ef41Sopenharmony_ci name: 'RangeError', 1031cb0ef41Sopenharmony_ci message: '"length" is outside of buffer bounds' 1041cb0ef41Sopenharmony_ci }); 1051cb0ef41Sopenharmony_ci} 1061cb0ef41Sopenharmony_ci 1071cb0ef41Sopenharmony_ci{ 1081cb0ef41Sopenharmony_ci // If byteOffset is not numeric, it defaults to 0. 1091cb0ef41Sopenharmony_ci const ab = new ArrayBuffer(10); 1101cb0ef41Sopenharmony_ci const expected = Buffer.from(ab, 0); 1111cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, 'fhqwhgads'), expected); 1121cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, NaN), expected); 1131cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, {}), expected); 1141cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, []), expected); 1151cb0ef41Sopenharmony_ci 1161cb0ef41Sopenharmony_ci // If byteOffset can be converted to a number, it will be. 1171cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, [1]), Buffer.from(ab, 1)); 1181cb0ef41Sopenharmony_ci 1191cb0ef41Sopenharmony_ci // If byteOffset is Infinity, throw. 1201cb0ef41Sopenharmony_ci assert.throws(() => { 1211cb0ef41Sopenharmony_ci Buffer.from(ab, Infinity); 1221cb0ef41Sopenharmony_ci }, { 1231cb0ef41Sopenharmony_ci code: 'ERR_BUFFER_OUT_OF_BOUNDS', 1241cb0ef41Sopenharmony_ci name: 'RangeError', 1251cb0ef41Sopenharmony_ci message: '"offset" is outside of buffer bounds' 1261cb0ef41Sopenharmony_ci }); 1271cb0ef41Sopenharmony_ci} 1281cb0ef41Sopenharmony_ci 1291cb0ef41Sopenharmony_ci{ 1301cb0ef41Sopenharmony_ci // If length is not numeric, it defaults to 0. 1311cb0ef41Sopenharmony_ci const ab = new ArrayBuffer(10); 1321cb0ef41Sopenharmony_ci const expected = Buffer.from(ab, 0, 0); 1331cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, 0, 'fhqwhgads'), expected); 1341cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, 0, NaN), expected); 1351cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, 0, {}), expected); 1361cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, 0, []), expected); 1371cb0ef41Sopenharmony_ci 1381cb0ef41Sopenharmony_ci // If length can be converted to a number, it will be. 1391cb0ef41Sopenharmony_ci assert.deepStrictEqual(Buffer.from(ab, 0, [1]), Buffer.from(ab, 0, 1)); 1401cb0ef41Sopenharmony_ci 1411cb0ef41Sopenharmony_ci // If length is Infinity, throw. 1421cb0ef41Sopenharmony_ci assert.throws(() => { 1431cb0ef41Sopenharmony_ci Buffer.from(ab, 0, Infinity); 1441cb0ef41Sopenharmony_ci }, { 1451cb0ef41Sopenharmony_ci code: 'ERR_BUFFER_OUT_OF_BOUNDS', 1461cb0ef41Sopenharmony_ci name: 'RangeError', 1471cb0ef41Sopenharmony_ci message: '"length" is outside of buffer bounds' 1481cb0ef41Sopenharmony_ci }); 1491cb0ef41Sopenharmony_ci} 1501cb0ef41Sopenharmony_ci 1511cb0ef41Sopenharmony_ci// Test an array like entry with the length set to NaN. 1521cb0ef41Sopenharmony_ciassert.deepStrictEqual(Buffer.from({ length: NaN }), Buffer.alloc(0)); 153