1 | import QUnit from 'qunit';
|
2 | import {
|
3 | createPlayer,
|
4 | useFakeEnvironment,
|
5 | openMediaSource,
|
6 | useFakeMediaSource
|
7 | } from './test-helpers.js';
|
8 | import videojs from 'video.js';
|
9 |
|
10 |
|
11 |
|
12 | import {HlsSourceHandler, HlsHandler, Hls} from '../src/videojs-contrib-hls';
|
13 |
|
14 | import Config from '../src/config';
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | const options = [{
|
22 | name: 'withCredentials',
|
23 | default: false,
|
24 | test: true,
|
25 | alt: false
|
26 | }, {
|
27 | name: 'bandwidth',
|
28 | default: 4194304,
|
29 | test: 5,
|
30 | alt: 555
|
31 | }];
|
32 |
|
33 | const CONFIG_KEYS = Object.keys(Config);
|
34 |
|
35 | QUnit.module('Configuration - Deprication', {
|
36 | beforeEach(assert) {
|
37 | this.env = useFakeEnvironment(assert);
|
38 | this.requests = this.env.requests;
|
39 | this.mse = useFakeMediaSource();
|
40 | this.clock = this.env.clock;
|
41 | this.old = {};
|
42 |
|
43 | CONFIG_KEYS.forEach((key) => this.old[key] = Config[key]);
|
44 |
|
45 |
|
46 | this.old.NativeHlsSupport = videojs.Hls.supportsNativeHls;
|
47 | videojs.Hls.supportsNativeHls = false;
|
48 | },
|
49 |
|
50 | afterEach() {
|
51 | CONFIG_KEYS.forEach((key) => Config[key] = this.old[key]);
|
52 |
|
53 | this.env.restore();
|
54 | this.mse.restore();
|
55 | videojs.Hls.supportsNativeHls = this.old.NativeHlsSupport;
|
56 | }
|
57 | });
|
58 |
|
59 | QUnit.test('GOAL_BUFFER_LENGTH get warning', function(assert) {
|
60 | assert.equal(Hls.GOAL_BUFFER_LENGTH,
|
61 | Config.GOAL_BUFFER_LENGTH,
|
62 | 'Hls.GOAL_BUFFER_LENGTH returns the default');
|
63 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
64 | });
|
65 |
|
66 | QUnit.test('GOAL_BUFFER_LENGTH set warning', function(assert) {
|
67 | Hls.GOAL_BUFFER_LENGTH = 10;
|
68 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
69 |
|
70 | assert.equal(Config.GOAL_BUFFER_LENGTH, 10, 'returns what we set it to');
|
71 | });
|
72 |
|
73 | QUnit.test('GOAL_BUFFER_LENGTH set warning and invalid', function(assert) {
|
74 | Hls.GOAL_BUFFER_LENGTH = 'nope';
|
75 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
76 |
|
77 | assert.equal(Config.GOAL_BUFFER_LENGTH, 30, 'default');
|
78 |
|
79 | Hls.GOAL_BUFFER_LENGTH = -1;
|
80 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
81 |
|
82 | assert.equal(Config.GOAL_BUFFER_LENGTH, 30, 'default');
|
83 | });
|
84 |
|
85 | QUnit.test('MAX_GOAL_BUFFER_LENGTH get warning', function(assert) {
|
86 | assert.equal(Hls.MAX_GOAL_BUFFER_LENGTH,
|
87 | Config.MAX_GOAL_BUFFER_LENGTH,
|
88 | 'Hls.MAX_GOAL_BUFFER_LENGTH returns the default');
|
89 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
90 | });
|
91 |
|
92 | QUnit.test('MAX_GOAL_BUFFER_LENGTH set warning', function(assert) {
|
93 | Hls.MAX_GOAL_BUFFER_LENGTH = 10;
|
94 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
95 |
|
96 | assert.equal(Config.MAX_GOAL_BUFFER_LENGTH, 10, 'returns what we set it to');
|
97 | });
|
98 |
|
99 | QUnit.test('MAX_GOAL_BUFFER_LENGTH set warning and invalid', function(assert) {
|
100 | Hls.MAX_GOAL_BUFFER_LENGTH = 'nope';
|
101 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
102 |
|
103 | assert.equal(Config.MAX_GOAL_BUFFER_LENGTH, 60, 'default');
|
104 |
|
105 | Hls.MAX_GOAL_BUFFER_LENGTH = -1;
|
106 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
107 |
|
108 | assert.equal(Config.MAX_GOAL_BUFFER_LENGTH, 60, 'default');
|
109 | });
|
110 |
|
111 | QUnit.test('GOAL_BUFFER_LENGTH_RATE get warning', function(assert) {
|
112 | assert.equal(Hls.GOAL_BUFFER_LENGTH_RATE,
|
113 | Config.GOAL_BUFFER_LENGTH_RATE,
|
114 | 'Hls.GOAL_BUFFER_LENGTH_RATE returns the default');
|
115 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
116 | });
|
117 |
|
118 | QUnit.test('GOAL_BUFFER_LENGTH_RATE set warning', function(assert) {
|
119 | Hls.GOAL_BUFFER_LENGTH_RATE = 10;
|
120 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
121 |
|
122 | assert.equal(Config.GOAL_BUFFER_LENGTH_RATE, 10, 'returns what we set it to');
|
123 | });
|
124 |
|
125 | QUnit.test('GOAL_BUFFER_LENGTH_RATE set warning and invalid', function(assert) {
|
126 | Hls.GOAL_BUFFER_LENGTH_RATE = 'nope';
|
127 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
128 |
|
129 | assert.equal(Config.GOAL_BUFFER_LENGTH_RATE, 1, 'default');
|
130 |
|
131 | Hls.GOAL_BUFFER_LENGTH_RATE = -1;
|
132 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
133 |
|
134 | assert.equal(Config.GOAL_BUFFER_LENGTH_RATE, 1, 'default');
|
135 | });
|
136 |
|
137 | QUnit.test('BUFFER_LOW_WATER_LINE get warning', function(assert) {
|
138 | assert.equal(Hls.BUFFER_LOW_WATER_LINE,
|
139 | Config.BUFFER_LOW_WATER_LINE,
|
140 | 'Hls.BUFFER_LOW_WATER_LINE returns the default');
|
141 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
142 | });
|
143 |
|
144 | QUnit.test('BUFFER_LOW_WATER_LINE set warning', function(assert) {
|
145 | Hls.BUFFER_LOW_WATER_LINE = 20;
|
146 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
147 |
|
148 | assert.equal(Config.BUFFER_LOW_WATER_LINE, 20, 'returns what we set it to');
|
149 |
|
150 |
|
151 | Hls.BUFFER_LOW_WATER_LINE = 0;
|
152 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
153 |
|
154 | assert.equal(Config.BUFFER_LOW_WATER_LINE, 0, 'returns what we set it to');
|
155 | });
|
156 |
|
157 | QUnit.test('BUFFER_LOW_WATER_LINE set warning and invalid', function(assert) {
|
158 | Hls.BUFFER_LOW_WATER_LINE = 'nope';
|
159 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
160 |
|
161 | assert.equal(Config.BUFFER_LOW_WATER_LINE, 0, 'default');
|
162 |
|
163 | Hls.BUFFER_LOW_WATER_LINE = -1;
|
164 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
165 |
|
166 | assert.equal(Config.BUFFER_LOW_WATER_LINE, 0, 'default');
|
167 | });
|
168 |
|
169 | QUnit.test('MAX_BUFFER_LOW_WATER_LINE get warning', function(assert) {
|
170 | assert.equal(Hls.MAX_BUFFER_LOW_WATER_LINE,
|
171 | Config.MAX_BUFFER_LOW_WATER_LINE,
|
172 | 'Hls.MAX_BUFFER_LOW_WATER_LINE returns the default');
|
173 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
174 | });
|
175 |
|
176 | QUnit.test('MAX_BUFFER_LOW_WATER_LINE set warning', function(assert) {
|
177 | Hls.MAX_BUFFER_LOW_WATER_LINE = 20;
|
178 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
179 |
|
180 | assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 20, 'returns what we set it to');
|
181 |
|
182 |
|
183 | Hls.MAX_BUFFER_LOW_WATER_LINE = 0;
|
184 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
185 |
|
186 | assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 0, 'returns what we set it to');
|
187 | });
|
188 |
|
189 | QUnit.test('MAX_BUFFER_LOW_WATER_LINE set warning and invalid', function(assert) {
|
190 | Hls.MAX_BUFFER_LOW_WATER_LINE = 'nope';
|
191 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
192 |
|
193 | assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 30, 'default');
|
194 |
|
195 | Hls.MAX_BUFFER_LOW_WATER_LINE = -1;
|
196 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
197 |
|
198 | assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 30, 'default');
|
199 | });
|
200 |
|
201 | QUnit.test('BUFFER_LOW_WATER_LINE_RATE get warning', function(assert) {
|
202 | assert.equal(Hls.BUFFER_LOW_WATER_LINE_RATE,
|
203 | Config.BUFFER_LOW_WATER_LINE_RATE,
|
204 | 'Hls.BUFFER_LOW_WATER_LINE_RATE returns the default');
|
205 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
206 | });
|
207 |
|
208 | QUnit.test('BUFFER_LOW_WATER_LINE_RATE set warning', function(assert) {
|
209 | Hls.BUFFER_LOW_WATER_LINE_RATE = 10;
|
210 | assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
|
211 |
|
212 | assert.equal(Config.BUFFER_LOW_WATER_LINE_RATE, 10, 'returns what we set it to');
|
213 | });
|
214 |
|
215 | QUnit.test('BUFFER_LOW_WATER_LINE_RATE set warning and invalid', function(assert) {
|
216 | Hls.BUFFER_LOW_WATER_LINE_RATE = 'nope';
|
217 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
218 |
|
219 | assert.equal(Config.BUFFER_LOW_WATER_LINE_RATE, 1, 'default');
|
220 |
|
221 | Hls.BUFFER_LOW_WATER_LINE_RATE = -1;
|
222 | assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
|
223 |
|
224 | assert.equal(Config.BUFFER_LOW_WATER_LINE_RATE, 1, 'default');
|
225 | });
|
226 |
|
227 | QUnit.module('Configuration - Options', {
|
228 | beforeEach(assert) {
|
229 | this.env = useFakeEnvironment(assert);
|
230 | this.requests = this.env.requests;
|
231 | this.mse = useFakeMediaSource();
|
232 | this.clock = this.env.clock;
|
233 | this.old = {};
|
234 |
|
235 |
|
236 | this.old.NativeHlsSupport = videojs.Hls.supportsNativeHls;
|
237 | videojs.Hls.supportsNativeHls = false;
|
238 | },
|
239 |
|
240 | afterEach() {
|
241 | this.env.restore();
|
242 | this.mse.restore();
|
243 | videojs.Hls.supportsNativeHls = this.old.NativeHlsSupport;
|
244 |
|
245 | this.player.dispose();
|
246 | videojs.options.hls = {};
|
247 |
|
248 | }
|
249 | });
|
250 |
|
251 | options.forEach((opt) => {
|
252 | QUnit.test(`default ${opt.name}`, function(assert) {
|
253 | this.player = createPlayer();
|
254 | this.player.src({
|
255 | src: 'http://example.com/media.m3u8',
|
256 | type: 'application/vnd.apple.mpegurl'
|
257 | });
|
258 |
|
259 | openMediaSource(this.player, this.clock);
|
260 |
|
261 | let hls = this.player.tech_.hls;
|
262 |
|
263 | assert.equal(hls.options_[opt.name],
|
264 | opt.default,
|
265 | `${opt.name} should be default`);
|
266 | });
|
267 |
|
268 | QUnit.test(`global ${opt.name}`, function(assert) {
|
269 | videojs.options.hls[opt.name] = opt.test;
|
270 | this.player = createPlayer();
|
271 | this.player.src({
|
272 | src: 'http://example.com/media.m3u8',
|
273 | type: 'application/vnd.apple.mpegurl'
|
274 | });
|
275 |
|
276 | openMediaSource(this.player, this.clock);
|
277 |
|
278 | let hls = this.player.tech_.hls;
|
279 |
|
280 | assert.equal(hls.options_[opt.name],
|
281 | opt.test,
|
282 | `${opt.name} should be equal to global`);
|
283 | });
|
284 |
|
285 | QUnit.test(`sourceHandler ${opt.name}`, function(assert) {
|
286 | let sourceHandlerOptions = {html5: {hls: {}}};
|
287 |
|
288 | sourceHandlerOptions.html5.hls[opt.name] = opt.test;
|
289 | this.player = createPlayer(sourceHandlerOptions);
|
290 | this.player.src({
|
291 | src: 'http://example.com/media.m3u8',
|
292 | type: 'application/vnd.apple.mpegurl'
|
293 | });
|
294 |
|
295 | openMediaSource(this.player, this.clock);
|
296 |
|
297 | let hls = this.player.tech_.hls;
|
298 |
|
299 | assert.equal(hls.options_[opt.name],
|
300 | opt.test,
|
301 | `${opt.name} should be equal to sourceHandler Option`);
|
302 | });
|
303 |
|
304 | QUnit.test(`src ${opt.name}`, function(assert) {
|
305 | let srcOptions = {
|
306 | src: 'http://example.com/media.m3u8',
|
307 | type: 'application/vnd.apple.mpegurl'
|
308 | };
|
309 |
|
310 | srcOptions[opt.name] = opt.test;
|
311 | this.player = createPlayer();
|
312 | this.player.src(srcOptions);
|
313 |
|
314 | openMediaSource(this.player, this.clock);
|
315 |
|
316 | let hls = this.player.tech_.hls;
|
317 |
|
318 | assert.equal(hls.options_[opt.name],
|
319 | opt.test,
|
320 | `${opt.name} should be equal to src option`);
|
321 | });
|
322 |
|
323 | QUnit.test(`srcHandler overrides global ${opt.name}`, function(assert) {
|
324 | let sourceHandlerOptions = {html5: {hls: {}}};
|
325 |
|
326 | sourceHandlerOptions.html5.hls[opt.name] = opt.test;
|
327 | videojs.options.hls[opt.name] = opt.alt;
|
328 | this.player = createPlayer(sourceHandlerOptions);
|
329 | this.player.src({
|
330 | src: 'http://example.com/media.m3u8',
|
331 | type: 'application/vnd.apple.mpegurl'
|
332 | });
|
333 |
|
334 | openMediaSource(this.player, this.clock);
|
335 |
|
336 | let hls = this.player.tech_.hls;
|
337 |
|
338 | assert.equal(hls.options_[opt.name],
|
339 | opt.test,
|
340 | `${opt.name} should be equal to sourchHandler option`);
|
341 | });
|
342 |
|
343 | QUnit.test(`src overrides sourceHandler ${opt.name}`, function(assert) {
|
344 | let sourceHandlerOptions = {html5: {hls: {}}};
|
345 | let srcOptions = {
|
346 | src: 'http://example.com/media.m3u8',
|
347 | type: 'application/vnd.apple.mpegurl'
|
348 | };
|
349 |
|
350 | sourceHandlerOptions.html5.hls[opt.name] = opt.alt;
|
351 | srcOptions[opt.name] = opt.test;
|
352 | this.player = createPlayer(sourceHandlerOptions);
|
353 | this.player.src(srcOptions);
|
354 |
|
355 | openMediaSource(this.player, this.clock);
|
356 |
|
357 | let hls = this.player.tech_.hls;
|
358 |
|
359 | assert.equal(hls.options_[opt.name],
|
360 | opt.test,
|
361 | `${opt.name} should be equal to sourchHandler option`);
|
362 | });
|
363 | });
|
364 |
|
365 | QUnit.module('Configuration - Global Only', {
|
366 | beforeEach() {
|
367 | videojs.options.hls = {};
|
368 | },
|
369 |
|
370 | afterEach() {
|
371 | videojs.options.hls = {};
|
372 | }
|
373 | });
|
374 |
|
375 | QUnit.test('global mode override - flash', function(assert) {
|
376 | videojs.options.hls.mode = 'flash';
|
377 | let htmlSourceHandler = new HlsSourceHandler('html5');
|
378 | let flashSourceHandler = new HlsSourceHandler('flash');
|
379 |
|
380 | assert.equal(
|
381 | htmlSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
|
382 | false,
|
383 | 'Cannot play html as we are overriden not to');
|
384 |
|
385 | assert.equal(
|
386 | flashSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
|
387 | true,
|
388 | 'Can play flash as it is supported and overides allow');
|
389 | });
|
390 |
|
391 | QUnit.test('global mode override - html', function(assert) {
|
392 | videojs.options.hls.mode = 'html5';
|
393 | let htmlSourceHandler = new HlsSourceHandler('html5');
|
394 | let flashSourceHandler = new HlsSourceHandler('flash');
|
395 |
|
396 | assert.equal(
|
397 | htmlSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
|
398 | true,
|
399 | 'Can play html as we support it and overides allow');
|
400 |
|
401 | assert.equal(
|
402 | flashSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
|
403 | false,
|
404 | 'Cannot play flash as we are overiden not to');
|
405 | });
|
406 |
|