Files
shaka-player/test/util/data_view_reader_unit.js
T
Joey Parrish fbbd63d96b test: Late load tests, fix Chromecast test flake (#4115)
This change fixes tests on Chromecast by loading tests later in the process.  Test scripts are now dynamically inserted by boot.js, rather than loaded by Karma.  The bootstrapping code then awaits the completion of that before starting the Karma frameworks (Jasmine) to run the tests.

This also removes the use of goog.provide/goog.require in tests and test utils.  We don't need to load test utils or library sources dynamically in each test, and this gives us more explicit control over script loading and ordering.

Closes #4094
2022-04-11 15:47:48 -07:00

255 lines
7.2 KiB
JavaScript

/*! @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
describe('DataViewReader', () => {
const Util = shaka.test.Util;
// |data| as interpreted as a 64 bit integer must not be larger than 2^53-1.
// decimal digits.
const data = new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]);
// |data2| is small enough in little-endian to be read as a 64-bit number,
// and has the sign bit set on the first 6 bytes to prove that we don't
// return negative values.
const data2 =
new Uint8Array([0xde, 0xad, 0xbe, 0xef, 0xff, 0xff, 0x01, 0x00]);
/** @type {!shaka.util.DataViewReader} */
let bigEndianReader;
/** @type {!shaka.util.DataViewReader} */
let littleEndianReader;
/** @type {!shaka.util.DataViewReader} */
let bigEndianReader2;
/** @type {!shaka.util.DataViewReader} */
let littleEndianReader2;
beforeEach(() => {
bigEndianReader = new shaka.util.DataViewReader(
data, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);
bigEndianReader2 = new shaka.util.DataViewReader(
data2, shaka.util.DataViewReader.Endianness.BIG_ENDIAN);
littleEndianReader = new shaka.util.DataViewReader(
data, shaka.util.DataViewReader.Endianness.LITTLE_ENDIAN);
littleEndianReader2 = new shaka.util.DataViewReader(
data2, shaka.util.DataViewReader.Endianness.LITTLE_ENDIAN);
});
it('reads a uint8 in big endian', () => {
const value1 = bigEndianReader.readUint8();
expect(value1).toBe(0x00);
const value2 = bigEndianReader.readUint8();
expect(value2).toBe(0x01);
const value3 = bigEndianReader2.readUint8();
expect(value3).toBe(0xde);
const value4 = bigEndianReader2.readUint8();
expect(value4).toBe(0xad);
});
it('reads a uint16 in big endian', () => {
const value1 = bigEndianReader.readUint16();
expect(value1).toBe(0x0001);
const value2 = bigEndianReader.readUint16();
expect(value2).toBe(0x0203);
const value3 = bigEndianReader2.readUint16();
expect(value3).toBe(0xdead);
const value4 = bigEndianReader2.readUint16();
expect(value4).toBe(0xbeef);
});
it('reads a uint32 in big endian', () => {
const value1 = bigEndianReader.readUint32();
expect(value1).toBe(0x00010203);
const value2 = bigEndianReader.readUint32();
expect(value2).toBe(0x04050607);
const value3 = bigEndianReader2.readUint32();
expect(value3).toBe(0xdeadbeef);
const value4 = bigEndianReader2.readUint32();
expect(value4).toBe(0xffff0100);
});
it('reads an int32 in big endian', () => {
const value1 = bigEndianReader.readInt32();
expect(value1).toBe(66051);
const value2 = bigEndianReader.readInt32();
expect(value2).toBe(67438087);
const value3 = bigEndianReader2.readInt32();
expect(value3).toBe(-559038737);
const value4 = bigEndianReader2.readInt32();
expect(value4).toBe(-65280);
});
it('reads a uint64 in big endian', () => {
const value = bigEndianReader.readUint64();
expect(value).toBe(0x0001020304050607);
});
it('reads a uint8 in little endian', () => {
const value1 = littleEndianReader.readUint8();
expect(value1).toBe(0x00);
const value2 = littleEndianReader.readUint8();
expect(value2).toBe(0x01);
const value3 = littleEndianReader2.readUint8();
expect(value3).toBe(0xde);
const value4 = littleEndianReader2.readUint8();
expect(value4).toBe(0xad);
});
it('reads a uint16 in little endian', () => {
const value1 = littleEndianReader.readUint16();
expect(value1).toBe(0x0100);
const value2 = littleEndianReader.readUint16();
expect(value2).toBe(0x0302);
const value3 = littleEndianReader2.readUint16();
expect(value3).toBe(0xadde);
const value4 = littleEndianReader2.readUint16();
expect(value4).toBe(0xefbe);
});
it('reads a uint32 in little endian', () => {
const value1 = littleEndianReader.readUint32();
expect(value1).toBe(0x03020100);
const value2 = littleEndianReader.readUint32();
expect(value2).toBe(0x07060504);
const value3 = littleEndianReader2.readUint32();
expect(value3).toBe(0xefbeadde);
const value4 = littleEndianReader2.readUint32();
expect(value4).toBe(0x0001ffff);
});
it('reads an int32 in little endian', () => {
const value1 = littleEndianReader.readInt32();
expect(value1).toBe(50462976);
const value2 = littleEndianReader.readInt32();
expect(value2).toBe(117835012);
const value3 = littleEndianReader2.readInt32();
expect(value3).toBe(-272716322);
const value4 = littleEndianReader2.readInt32();
expect(value4).toBe(131071);
});
it('reads a uint64 in little endian', () => {
const value = littleEndianReader2.readUint64();
expect(value).toBe(0x0001ffffefbeadde);
});
it('skips bytes', () => {
bigEndianReader.skip(1);
const value = bigEndianReader.readUint8();
expect(value).toBe(0x01);
});
it('determines the end of the data view', () => {
bigEndianReader.skip(7);
expect(bigEndianReader.hasMoreData()).toBe(true);
bigEndianReader.skip(1);
expect(bigEndianReader.hasMoreData()).toBe(false);
});
it('gets the byte position', () => {
expect(bigEndianReader.getPosition()).toBe(0);
bigEndianReader.skip(1);
expect(bigEndianReader.getPosition()).toBe(1);
bigEndianReader.skip(7);
expect(bigEndianReader.getPosition()).toBe(8);
});
describe('end-of-stream', () => {
it('detects when reading a uint8', () => {
bigEndianReader.skip(7);
bigEndianReader.readUint8();
runTest(() => {
bigEndianReader.readUint8();
});
});
it('detects when reading a uint16', () => {
bigEndianReader.skip(7);
runTest(() => {
bigEndianReader.readUint16();
});
});
it('detects when reading a uint32', () => {
bigEndianReader.skip(5);
runTest(() => {
bigEndianReader.readUint32();
});
});
it('detects when reading a int32', () => {
bigEndianReader.skip(5);
runTest(() => {
bigEndianReader.readInt32();
});
});
it('detects when reading a uint64', () => {
bigEndianReader.skip(3);
runTest(() => {
bigEndianReader.readUint64();
});
});
it('detects when skipping bytes', () => {
bigEndianReader.skip(8);
runTest(() => {
bigEndianReader.skip(1);
});
});
it('detects when reading bytes', () => {
bigEndianReader.skip(8);
runTest(() => {
bigEndianReader.readBytes(1);
});
});
function runTest(test) {
const expected = Util.jasmineError(new shaka.util.Error(
shaka.util.Error.Severity.CRITICAL,
shaka.util.Error.Category.MEDIA,
shaka.util.Error.Code.BUFFER_READ_OUT_OF_BOUNDS));
expect(test).toThrow(expected);
}
});
it('detects uint64s too large for JavaScript', () => {
const expected = Util.jasmineError(new shaka.util.Error(
shaka.util.Error.Severity.CRITICAL,
shaka.util.Error.Category.MEDIA,
shaka.util.Error.Code.JS_INTEGER_OVERFLOW));
expect(() => littleEndianReader.readUint64()).toThrow(expected);
expect(() => bigEndianReader2.readUint64()).toThrow(expected);
});
});