Files
shaka-player/test/ads/interstitial_preload_task_unit.js
T

191 lines
5.0 KiB
JavaScript

describe('shaka.ads.InterstitialPreloadTask', () => {
const fakeUri = 'https://example.com/ad.mp4';
const fakeMimeType = 'video/mp4';
/** @type {!shaka.extern.AdInterstitial} */
const fakeInterstitial = {
id: null,
groupId: null,
startTime: 10,
endTime: null,
uri: fakeUri,
mimeType: fakeMimeType,
isSkippable: true,
skipOffset: 10,
skipFor: null,
canJump: false,
resumeOffset: null,
playoutLimit: null,
once: true,
pre: false,
post: false,
timelineRange: false,
loop: false,
overlay: null,
displayOnBackground: false,
currentVideo: null,
background: null,
clickThroughUrl: null,
tracking: null,
};
/** @type {!shaka.extern.AdInterstitial} */
const fakeInterstitial2 = {
id: null,
groupId: null,
startTime: 10,
endTime: null,
uri: fakeUri,
mimeType: null,
isSkippable: true,
skipOffset: 10,
skipFor: null,
canJump: false,
resumeOffset: null,
playoutLimit: null,
once: true,
pre: false,
post: false,
timelineRange: false,
loop: false,
overlay: null,
displayOnBackground: false,
currentVideo: null,
background: null,
clickThroughUrl: null,
tracking: null,
};
/** @type {!shaka.ads.InterstitialPreloadTask} */
let task;
/**
* @return {!shaka.media.PreloadManager}
*/
function createFakePreloadManager() {
return /** @type {!shaka.media.PreloadManager} */ (/** @type {?} */ ({
destroy: jasmine.createSpy('destroy'),
}));
}
/**
* @param {!Promise<?>} preloadPromise
* @return {!shaka.Player}
*/
function createFakePlayer(preloadPromise) {
const player = /** @type {!shaka.Player} */ (/** @type {?} */ ({
preload: jasmine.createSpy('preload').and.returnValue(preloadPromise),
}));
return player;
}
afterEach(() => {
if (task) {
task.release();
}
});
it('stores preloadManager on successful preload', async () => {
const preloadManager = createFakePreloadManager();
const player = createFakePlayer(Promise.resolve(preloadManager));
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial);
await shaka.test.Util.shortDelay();
expect(player.preload).toHaveBeenCalledWith(fakeUri, null, fakeMimeType);
expect(task.getInitialError()).toBeNull();
expect(task.getPreloadManager()).toBe(preloadManager);
});
it('stores initial error when preload fails', async () => {
const error = new shaka.util.Error(
shaka.util.Error.Severity.CRITICAL,
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.BAD_HTTP_STATUS);
const player = createFakePlayer(Promise.reject(error));
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial);
await shaka.test.Util.shortDelay();
expect(task.getInitialError()).toBe(error);
expect(task.getPreloadManager()).toBeNull();
});
it('ignores non-shaka errors', async () => {
const player = createFakePlayer(Promise.reject(new Error('boom')));
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial);
await shaka.test.Util.shortDelay();
expect(task.getInitialError()).toBeNull();
expect(task.getPreloadManager()).toBeNull();
});
it('destroys preloadManager on release()', async () => {
const preloadManager = createFakePreloadManager();
const player = createFakePlayer(Promise.resolve(preloadManager));
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial);
await shaka.test.Util.shortDelay();
task.release();
expect(preloadManager.destroy).toHaveBeenCalled();
expect(task.getPreloadManager()).toBeNull();
});
it('destroys preloadManager if preload finishes after release', async () => {
let resolvePreload;
const preloadPromise = new Promise((resolve) => {
resolvePreload = resolve;
});
const preloadManager = createFakePreloadManager();
const player = createFakePlayer(preloadPromise);
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial);
task.release();
resolvePreload(preloadManager);
await shaka.test.Util.shortDelay();
expect(preloadManager.destroy).toHaveBeenCalled();
expect(task.getPreloadManager()).toBeNull();
});
it('release() is idempotent', async () => {
const preloadManager = createFakePreloadManager();
const player = createFakePlayer(Promise.resolve(preloadManager));
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial);
await shaka.test.Util.shortDelay();
task.release();
task.release();
expect(preloadManager.destroy).toHaveBeenCalledTimes(1);
});
it('passes undefined mimeType when not provided', async () => {
const preloadManager = createFakePreloadManager();
const player = createFakePlayer(Promise.resolve(preloadManager));
task = new shaka.ads.InterstitialPreloadTask(player, fakeInterstitial2);
await shaka.test.Util.shortDelay();
expect(player.preload).toHaveBeenCalledWith(
fakeUri, null, undefined);
});
});