123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /* eslint-disable max-len */
- import QUnit from 'qunit';
- import RenditionMixin from '../src/rendition-mixin.js';
- import videojs from 'video.js';
- const makeMockPlaylist = function(options) {
- options = options || {};
- let playlist = {
- segments: [],
- attributes: {}
- };
- playlist.attributes.BANDWIDTH = options.bandwidth;
- if ('width' in options) {
- playlist.attributes.RESOLUTION = playlist.attributes.RESOLUTION || {};
- playlist.attributes.RESOLUTION.width = options.width;
- }
- if ('height' in options) {
- playlist.attributes.RESOLUTION = playlist.attributes.RESOLUTION || {};
- playlist.attributes.RESOLUTION.height = options.height;
- }
- if ('excludeUntil' in options) {
- playlist.excludeUntil = options.excludeUntil;
- }
- if ('uri' in options) {
- playlist.uri = options.uri;
- }
- if ('disabled' in options) {
- playlist.disabled = options.disabled;
- }
- return playlist;
- };
- const makeMockHlsHandler = function(playlistOptions) {
- let mcp = {
- fastQualityChange_: () => {
- mcp.fastQualityChange_.calls++;
- }
- };
- mcp.fastQualityChange_.calls = 0;
- let hlsHandler = {
- masterPlaylistController_: mcp
- };
- hlsHandler.playlists = new videojs.EventTarget();
- hlsHandler.playlists.master = { playlists: [] };
- playlistOptions.forEach((playlist, i) => {
- hlsHandler.playlists.master.playlists[i] = makeMockPlaylist(playlist);
- if (playlist.uri) {
- hlsHandler.playlists.master.playlists[playlist.uri] =
- hlsHandler.playlists.master.playlists[i];
- }
- });
- return hlsHandler;
- };
- QUnit.module('Rendition Selector API Mixin');
- QUnit.test('adds the representations API to HlsHandler', function(assert) {
- let hlsHandler = makeMockHlsHandler([
- {}
- ]);
- RenditionMixin(hlsHandler);
- assert.equal(typeof hlsHandler.representations, 'function',
- 'added the representations API');
- });
- QUnit.test('returns proper number of representations', function(assert) {
- let hlsHandler = makeMockHlsHandler([
- {}, {}, {}
- ]);
- RenditionMixin(hlsHandler);
- let renditions = hlsHandler.representations();
- assert.equal(renditions.length, 3, 'number of renditions is 3');
- });
- QUnit.test('returns representations in playlist order', function(assert) {
- let hlsHandler = makeMockHlsHandler([
- {
- bandwidth: 10
- },
- {
- bandwidth: 20
- },
- {
- bandwidth: 30
- }
- ]);
- RenditionMixin(hlsHandler);
- let renditions = hlsHandler.representations();
- assert.equal(renditions[0].bandwidth, 10, 'rendition has bandwidth 10');
- assert.equal(renditions[1].bandwidth, 20, 'rendition has bandwidth 20');
- assert.equal(renditions[2].bandwidth, 30, 'rendition has bandwidth 30');
- });
- QUnit.test('returns representations with width and height if present', function(assert) {
- let hlsHandler = makeMockHlsHandler([
- {
- bandwidth: 10,
- width: 100,
- height: 200
- },
- {
- bandwidth: 20,
- width: 500,
- height: 600
- },
- {
- bandwidth: 30
- }
- ]);
- RenditionMixin(hlsHandler);
- let renditions = hlsHandler.representations();
- assert.equal(renditions[0].width, 100, 'rendition has a width of 100');
- assert.equal(renditions[0].height, 200, 'rendition has a height of 200');
- assert.equal(renditions[1].width, 500, 'rendition has a width of 500');
- assert.equal(renditions[1].height, 600, 'rendition has a height of 600');
- assert.equal(renditions[2].width, undefined, 'rendition has a width of undefined');
- assert.equal(renditions[2].height, undefined, 'rendition has a height of undefined');
- });
- QUnit.test('incompatible playlists are not included in the representations list',
- function(assert) {
- let hlsHandler = makeMockHlsHandler([
- {
- bandwidth: 0,
- excludeUntil: Infinity,
- uri: 'media0.m3u8'
- },
- {
- bandwidth: 0,
- excludeUntil: 0,
- uri: 'media1.m3u8'
- },
- {
- bandwidth: 0,
- excludeUntil: Date.now() + 999999,
- uri: 'media2.m3u8'
- },
- {
- bandwidth: 0,
- excludeUntil: 1,
- uri: 'media3.m3u8'
- },
- {
- bandwidth: 0,
- uri: 'media4.m3u8'
- }
- ]);
- RenditionMixin(hlsHandler);
- let renditions = hlsHandler.representations();
- assert.equal(renditions.length, 4, 'incompatible rendition not added');
- assert.equal(renditions[0].id, 'media1.m3u8', 'rendition is enabled');
- assert.equal(renditions[1].id, 'media2.m3u8', 'rendition is enabled');
- assert.equal(renditions[2].id, 'media3.m3u8', 'rendition is enabled');
- assert.equal(renditions[3].id, 'media4.m3u8', 'rendition is enabled');
- });
- QUnit.test('setting a representation to disabled sets disabled to true',
- function(assert) {
- let renditiondisabled = 0;
- let hlsHandler = makeMockHlsHandler([
- {
- bandwidth: 0,
- excludeUntil: 0,
- uri: 'media0.m3u8'
- },
- {
- bandwidth: 0,
- excludeUntil: 0,
- uri: 'media1.m3u8'
- }
- ]);
- let playlists = hlsHandler.playlists.master.playlists;
- hlsHandler.playlists.on('renditiondisabled', function() {
- renditiondisabled++;
- });
- RenditionMixin(hlsHandler);
- let renditions = hlsHandler.representations();
- assert.equal(renditiondisabled, 0, 'renditiondisabled event has not been triggered');
- renditions[0].enabled(false);
- assert.equal(renditiondisabled, 1, 'renditiondisabled event has been triggered');
- assert.equal(playlists[0].disabled, true, 'rendition has been disabled');
- assert.equal(playlists[1].disabled, undefined, 'rendition has not been disabled');
- assert.equal(playlists[0].excludeUntil, 0,
- 'excludeUntil not touched when disabling a rendition');
- assert.equal(playlists[1].excludeUntil, 0,
- 'excludeUntil not touched when disabling a rendition');
- });
- QUnit.test('changing the enabled state of a representation calls fastQualityChange_',
- function(assert) {
- let renditionEnabledEvents = 0;
- let hlsHandler = makeMockHlsHandler([
- {
- bandwidth: 0,
- disabled: true,
- uri: 'media0.m3u8'
- },
- {
- bandwidth: 0,
- uri: 'media1.m3u8'
- }
- ]);
- let mpc = hlsHandler.masterPlaylistController_;
- hlsHandler.playlists.on('renditionenabled', function() {
- renditionEnabledEvents++;
- });
- RenditionMixin(hlsHandler);
- let renditions = hlsHandler.representations();
- assert.equal(mpc.fastQualityChange_.calls, 0, 'fastQualityChange_ was never called');
- assert.equal(renditionEnabledEvents, 0,
- 'renditionenabled event has not been triggered');
- renditions[0].enabled(true);
- assert.equal(mpc.fastQualityChange_.calls, 1, 'fastQualityChange_ was called once');
- assert.equal(renditionEnabledEvents, 1,
- 'renditionenabled event has been triggered once');
- renditions[1].enabled(false);
- assert.equal(mpc.fastQualityChange_.calls, 2, 'fastQualityChange_ was called twice');
- });
|