configuration.test.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  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. /* eslint-disable no-unused-vars */
  10. // we need this so that it can register hls with videojs
  11. import {HlsSourceHandler, HlsHandler, Hls} from '../src/videojs-contrib-hls';
  12. /* eslint-enable no-unused-vars */
  13. import Config from '../src/config';
  14. // list of posible options
  15. // name - the proprety name
  16. // default - the default value
  17. // test - alternative value to verify that default is not used
  18. // alt - another alternative value to very that test/default are not used
  19. const options = [{
  20. name: 'withCredentials',
  21. default: false,
  22. test: true,
  23. alt: false
  24. }, {
  25. name: 'bandwidth',
  26. default: 4194304,
  27. test: 5,
  28. alt: 555
  29. }];
  30. const CONFIG_KEYS = Object.keys(Config);
  31. QUnit.module('Configuration - Deprication', {
  32. beforeEach(assert) {
  33. this.env = useFakeEnvironment(assert);
  34. this.requests = this.env.requests;
  35. this.mse = useFakeMediaSource();
  36. this.clock = this.env.clock;
  37. this.old = {};
  38. CONFIG_KEYS.forEach((key) => this.old[key] = Config[key]);
  39. // force the HLS tech to run
  40. this.old.NativeHlsSupport = videojs.Hls.supportsNativeHls;
  41. videojs.Hls.supportsNativeHls = false;
  42. },
  43. afterEach() {
  44. CONFIG_KEYS.forEach((key) => Config[key] = this.old[key]);
  45. this.env.restore();
  46. this.mse.restore();
  47. videojs.Hls.supportsNativeHls = this.old.NativeHlsSupport;
  48. }
  49. });
  50. QUnit.test('GOAL_BUFFER_LENGTH get warning', function(assert) {
  51. assert.equal(Hls.GOAL_BUFFER_LENGTH,
  52. Config.GOAL_BUFFER_LENGTH,
  53. 'Hls.GOAL_BUFFER_LENGTH returns the default');
  54. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  55. });
  56. QUnit.test('GOAL_BUFFER_LENGTH set warning', function(assert) {
  57. Hls.GOAL_BUFFER_LENGTH = 10;
  58. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  59. assert.equal(Config.GOAL_BUFFER_LENGTH, 10, 'returns what we set it to');
  60. });
  61. QUnit.test('GOAL_BUFFER_LENGTH set warning and invalid', function(assert) {
  62. Hls.GOAL_BUFFER_LENGTH = 'nope';
  63. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  64. assert.equal(Config.GOAL_BUFFER_LENGTH, 30, 'default');
  65. Hls.GOAL_BUFFER_LENGTH = -1;
  66. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  67. assert.equal(Config.GOAL_BUFFER_LENGTH, 30, 'default');
  68. });
  69. QUnit.test('MAX_GOAL_BUFFER_LENGTH get warning', function(assert) {
  70. assert.equal(Hls.MAX_GOAL_BUFFER_LENGTH,
  71. Config.MAX_GOAL_BUFFER_LENGTH,
  72. 'Hls.MAX_GOAL_BUFFER_LENGTH returns the default');
  73. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  74. });
  75. QUnit.test('MAX_GOAL_BUFFER_LENGTH set warning', function(assert) {
  76. Hls.MAX_GOAL_BUFFER_LENGTH = 10;
  77. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  78. assert.equal(Config.MAX_GOAL_BUFFER_LENGTH, 10, 'returns what we set it to');
  79. });
  80. QUnit.test('MAX_GOAL_BUFFER_LENGTH set warning and invalid', function(assert) {
  81. Hls.MAX_GOAL_BUFFER_LENGTH = 'nope';
  82. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  83. assert.equal(Config.MAX_GOAL_BUFFER_LENGTH, 60, 'default');
  84. Hls.MAX_GOAL_BUFFER_LENGTH = -1;
  85. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  86. assert.equal(Config.MAX_GOAL_BUFFER_LENGTH, 60, 'default');
  87. });
  88. QUnit.test('GOAL_BUFFER_LENGTH_RATE get warning', function(assert) {
  89. assert.equal(Hls.GOAL_BUFFER_LENGTH_RATE,
  90. Config.GOAL_BUFFER_LENGTH_RATE,
  91. 'Hls.GOAL_BUFFER_LENGTH_RATE returns the default');
  92. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  93. });
  94. QUnit.test('GOAL_BUFFER_LENGTH_RATE set warning', function(assert) {
  95. Hls.GOAL_BUFFER_LENGTH_RATE = 10;
  96. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  97. assert.equal(Config.GOAL_BUFFER_LENGTH_RATE, 10, 'returns what we set it to');
  98. });
  99. QUnit.test('GOAL_BUFFER_LENGTH_RATE set warning and invalid', function(assert) {
  100. Hls.GOAL_BUFFER_LENGTH_RATE = 'nope';
  101. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  102. assert.equal(Config.GOAL_BUFFER_LENGTH_RATE, 1, 'default');
  103. Hls.GOAL_BUFFER_LENGTH_RATE = -1;
  104. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  105. assert.equal(Config.GOAL_BUFFER_LENGTH_RATE, 1, 'default');
  106. });
  107. QUnit.test('BUFFER_LOW_WATER_LINE get warning', function(assert) {
  108. assert.equal(Hls.BUFFER_LOW_WATER_LINE,
  109. Config.BUFFER_LOW_WATER_LINE,
  110. 'Hls.BUFFER_LOW_WATER_LINE returns the default');
  111. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  112. });
  113. QUnit.test('BUFFER_LOW_WATER_LINE set warning', function(assert) {
  114. Hls.BUFFER_LOW_WATER_LINE = 20;
  115. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  116. assert.equal(Config.BUFFER_LOW_WATER_LINE, 20, 'returns what we set it to');
  117. // Allow setting to 0
  118. Hls.BUFFER_LOW_WATER_LINE = 0;
  119. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  120. assert.equal(Config.BUFFER_LOW_WATER_LINE, 0, 'returns what we set it to');
  121. });
  122. QUnit.test('BUFFER_LOW_WATER_LINE set warning and invalid', function(assert) {
  123. Hls.BUFFER_LOW_WATER_LINE = 'nope';
  124. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  125. assert.equal(Config.BUFFER_LOW_WATER_LINE, 0, 'default');
  126. Hls.BUFFER_LOW_WATER_LINE = -1;
  127. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  128. assert.equal(Config.BUFFER_LOW_WATER_LINE, 0, 'default');
  129. });
  130. QUnit.test('MAX_BUFFER_LOW_WATER_LINE get warning', function(assert) {
  131. assert.equal(Hls.MAX_BUFFER_LOW_WATER_LINE,
  132. Config.MAX_BUFFER_LOW_WATER_LINE,
  133. 'Hls.MAX_BUFFER_LOW_WATER_LINE returns the default');
  134. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  135. });
  136. QUnit.test('MAX_BUFFER_LOW_WATER_LINE set warning', function(assert) {
  137. Hls.MAX_BUFFER_LOW_WATER_LINE = 20;
  138. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  139. assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 20, 'returns what we set it to');
  140. // Allow setting to 0
  141. Hls.MAX_BUFFER_LOW_WATER_LINE = 0;
  142. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  143. assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 0, 'returns what we set it to');
  144. });
  145. QUnit.test('MAX_BUFFER_LOW_WATER_LINE set warning and invalid', function(assert) {
  146. Hls.MAX_BUFFER_LOW_WATER_LINE = 'nope';
  147. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  148. assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 30, 'default');
  149. Hls.MAX_BUFFER_LOW_WATER_LINE = -1;
  150. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  151. assert.equal(Config.MAX_BUFFER_LOW_WATER_LINE, 30, 'default');
  152. });
  153. QUnit.test('BUFFER_LOW_WATER_LINE_RATE get warning', function(assert) {
  154. assert.equal(Hls.BUFFER_LOW_WATER_LINE_RATE,
  155. Config.BUFFER_LOW_WATER_LINE_RATE,
  156. 'Hls.BUFFER_LOW_WATER_LINE_RATE returns the default');
  157. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  158. });
  159. QUnit.test('BUFFER_LOW_WATER_LINE_RATE set warning', function(assert) {
  160. Hls.BUFFER_LOW_WATER_LINE_RATE = 10;
  161. assert.equal(this.env.log.warn.calls, 1, 'logged a warning');
  162. assert.equal(Config.BUFFER_LOW_WATER_LINE_RATE, 10, 'returns what we set it to');
  163. });
  164. QUnit.test('BUFFER_LOW_WATER_LINE_RATE set warning and invalid', function(assert) {
  165. Hls.BUFFER_LOW_WATER_LINE_RATE = 'nope';
  166. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  167. assert.equal(Config.BUFFER_LOW_WATER_LINE_RATE, 1, 'default');
  168. Hls.BUFFER_LOW_WATER_LINE_RATE = -1;
  169. assert.equal(this.env.log.warn.calls, 2, 'logged two warnings');
  170. assert.equal(Config.BUFFER_LOW_WATER_LINE_RATE, 1, 'default');
  171. });
  172. QUnit.module('Configuration - Options', {
  173. beforeEach(assert) {
  174. this.env = useFakeEnvironment(assert);
  175. this.requests = this.env.requests;
  176. this.mse = useFakeMediaSource();
  177. this.clock = this.env.clock;
  178. this.old = {};
  179. // force the HLS tech to run
  180. this.old.NativeHlsSupport = videojs.Hls.supportsNativeHls;
  181. videojs.Hls.supportsNativeHls = false;
  182. },
  183. afterEach() {
  184. this.env.restore();
  185. this.mse.restore();
  186. videojs.Hls.supportsNativeHls = this.old.NativeHlsSupport;
  187. this.player.dispose();
  188. videojs.options.hls = {};
  189. }
  190. });
  191. options.forEach((opt) => {
  192. QUnit.test(`default ${opt.name}`, function(assert) {
  193. this.player = createPlayer();
  194. this.player.src({
  195. src: 'http://example.com/media.m3u8',
  196. type: 'application/vnd.apple.mpegurl'
  197. });
  198. openMediaSource(this.player, this.clock);
  199. let hls = this.player.tech_.hls;
  200. assert.equal(hls.options_[opt.name],
  201. opt.default,
  202. `${opt.name} should be default`);
  203. });
  204. QUnit.test(`global ${opt.name}`, function(assert) {
  205. videojs.options.hls[opt.name] = opt.test;
  206. this.player = createPlayer();
  207. this.player.src({
  208. src: 'http://example.com/media.m3u8',
  209. type: 'application/vnd.apple.mpegurl'
  210. });
  211. openMediaSource(this.player, this.clock);
  212. let hls = this.player.tech_.hls;
  213. assert.equal(hls.options_[opt.name],
  214. opt.test,
  215. `${opt.name} should be equal to global`);
  216. });
  217. QUnit.test(`sourceHandler ${opt.name}`, function(assert) {
  218. let sourceHandlerOptions = {html5: {hls: {}}};
  219. sourceHandlerOptions.html5.hls[opt.name] = opt.test;
  220. this.player = createPlayer(sourceHandlerOptions);
  221. this.player.src({
  222. src: 'http://example.com/media.m3u8',
  223. type: 'application/vnd.apple.mpegurl'
  224. });
  225. openMediaSource(this.player, this.clock);
  226. let hls = this.player.tech_.hls;
  227. assert.equal(hls.options_[opt.name],
  228. opt.test,
  229. `${opt.name} should be equal to sourceHandler Option`);
  230. });
  231. QUnit.test(`src ${opt.name}`, function(assert) {
  232. let srcOptions = {
  233. src: 'http://example.com/media.m3u8',
  234. type: 'application/vnd.apple.mpegurl'
  235. };
  236. srcOptions[opt.name] = opt.test;
  237. this.player = createPlayer();
  238. this.player.src(srcOptions);
  239. openMediaSource(this.player, this.clock);
  240. let hls = this.player.tech_.hls;
  241. assert.equal(hls.options_[opt.name],
  242. opt.test,
  243. `${opt.name} should be equal to src option`);
  244. });
  245. QUnit.test(`srcHandler overrides global ${opt.name}`, function(assert) {
  246. let sourceHandlerOptions = {html5: {hls: {}}};
  247. sourceHandlerOptions.html5.hls[opt.name] = opt.test;
  248. videojs.options.hls[opt.name] = opt.alt;
  249. this.player = createPlayer(sourceHandlerOptions);
  250. this.player.src({
  251. src: 'http://example.com/media.m3u8',
  252. type: 'application/vnd.apple.mpegurl'
  253. });
  254. openMediaSource(this.player, this.clock);
  255. let hls = this.player.tech_.hls;
  256. assert.equal(hls.options_[opt.name],
  257. opt.test,
  258. `${opt.name} should be equal to sourchHandler option`);
  259. });
  260. QUnit.test(`src overrides sourceHandler ${opt.name}`, function(assert) {
  261. let sourceHandlerOptions = {html5: {hls: {}}};
  262. let srcOptions = {
  263. src: 'http://example.com/media.m3u8',
  264. type: 'application/vnd.apple.mpegurl'
  265. };
  266. sourceHandlerOptions.html5.hls[opt.name] = opt.alt;
  267. srcOptions[opt.name] = opt.test;
  268. this.player = createPlayer(sourceHandlerOptions);
  269. this.player.src(srcOptions);
  270. openMediaSource(this.player, this.clock);
  271. let hls = this.player.tech_.hls;
  272. assert.equal(hls.options_[opt.name],
  273. opt.test,
  274. `${opt.name} should be equal to sourchHandler option`);
  275. });
  276. });
  277. QUnit.module('Configuration - Global Only', {
  278. beforeEach() {
  279. videojs.options.hls = {};
  280. },
  281. afterEach() {
  282. videojs.options.hls = {};
  283. }
  284. });
  285. QUnit.test('global mode override - flash', function(assert) {
  286. videojs.options.hls.mode = 'flash';
  287. let htmlSourceHandler = new HlsSourceHandler('html5');
  288. let flashSourceHandler = new HlsSourceHandler('flash');
  289. assert.equal(
  290. htmlSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
  291. false,
  292. 'Cannot play html as we are overriden not to');
  293. assert.equal(
  294. flashSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
  295. true,
  296. 'Can play flash as it is supported and overides allow');
  297. });
  298. QUnit.test('global mode override - html', function(assert) {
  299. videojs.options.hls.mode = 'html5';
  300. let htmlSourceHandler = new HlsSourceHandler('html5');
  301. let flashSourceHandler = new HlsSourceHandler('flash');
  302. assert.equal(
  303. htmlSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
  304. true,
  305. 'Can play html as we support it and overides allow');
  306. assert.equal(
  307. flashSourceHandler.canHandleSource({type: 'application/x-mpegURL'}),
  308. false,
  309. 'Cannot play flash as we are overiden not to');
  310. });