1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | import videojs from 'video.js';
|
11 | import QUnit from 'qunit';
|
12 | import document from 'global/document';
|
13 | import '../../examples/stitched-ad-plugin/plugin.js';
|
14 |
|
15 | const originalTestTimeout = QUnit.config.testTimeout;
|
16 |
|
17 | QUnit.module('Events and Stitched Ads', {
|
18 |
|
19 | before() {
|
20 | QUnit.config.testTimeout = 30000;
|
21 | },
|
22 |
|
23 | beforeEach() {
|
24 | this.video = document.createElement('video');
|
25 |
|
26 | this.fixture = document.querySelector('#qunit-fixture');
|
27 | this.fixture.appendChild(this.video);
|
28 |
|
29 | this.player = videojs(this.video);
|
30 | this.player.exampleStitchedAds();
|
31 |
|
32 | this.player.src({
|
33 | src: 'http://vjs.zencdn.net/v/oceans.webm',
|
34 | type: 'video/webm'
|
35 | });
|
36 |
|
37 |
|
38 | this.player.muted(true);
|
39 | },
|
40 |
|
41 | afterEach() {
|
42 | this.player.dispose();
|
43 | },
|
44 |
|
45 | after() {
|
46 | QUnit.config.testTimeout = originalTestTimeout;
|
47 | }
|
48 | });
|
49 |
|
50 | QUnit.test('Stitched Ads', function(assert) {
|
51 | const done = assert.async();
|
52 |
|
53 | const seenBeforePreroll = [];
|
54 | const seenDuringPreroll = [];
|
55 | const seenAfterPreroll = [];
|
56 | const seenDuringMidroll = [];
|
57 | const seenAfterMidroll = [];
|
58 | let currentEventLog = seenBeforePreroll;
|
59 | let finish;
|
60 |
|
61 | let events = [
|
62 | 'suspend',
|
63 | 'abort',
|
64 | 'error',
|
65 | 'emptied',
|
66 | 'stalled',
|
67 | 'canplay',
|
68 | 'canplaythrough',
|
69 | 'waiting',
|
70 | 'seeking',
|
71 | 'durationchange',
|
72 | 'progress',
|
73 | 'pause',
|
74 | 'ratechange',
|
75 | 'volumechange',
|
76 | 'firstplay',
|
77 | 'suspend',
|
78 | 'playing',
|
79 | 'ended'
|
80 | ];
|
81 |
|
82 | events = events
|
83 | .concat(events.map(e => 'ad' + e))
|
84 | .concat(events.map(e => 'content' + e));
|
85 |
|
86 | const {player} = this;
|
87 |
|
88 | player.on('adstart', () => {
|
89 | if (currentEventLog === seenBeforePreroll) {
|
90 | currentEventLog = seenDuringPreroll;
|
91 | } else {
|
92 | currentEventLog = seenDuringMidroll;
|
93 | }
|
94 | });
|
95 |
|
96 | player.on('adend', () => {
|
97 | if (currentEventLog === seenDuringPreroll) {
|
98 | currentEventLog = seenAfterPreroll;
|
99 | } else {
|
100 | currentEventLog = seenAfterMidroll;
|
101 | }
|
102 | });
|
103 |
|
104 | player.on(events, (e) => currentEventLog.push(e.type));
|
105 |
|
106 | const onError = () => {
|
107 | assert.ok(false, 'no errors');
|
108 | finish();
|
109 | };
|
110 |
|
111 | const onTimeupdate = () => {
|
112 | videojs.log(player.currentTime(), player.currentSrc());
|
113 |
|
114 | if (player.currentTime() > 21) {
|
115 | seenBeforePreroll.forEach(event => {
|
116 | assert.ok(!/^ad/.test(event), event + ' has no ad prefix before preroll');
|
117 | assert.ok(!/^content/.test(event), event + ' has no content prefix before preroll');
|
118 | });
|
119 |
|
120 | seenDuringPreroll.forEach(event => {
|
121 | assert.ok(/^ad/.test(event), event + ' has ad prefix during preroll');
|
122 | });
|
123 |
|
124 | seenAfterPreroll.forEach(event => {
|
125 | assert.ok(!/^ad/.test(event), event + ' has no ad prefix after preroll');
|
126 | assert.ok(!/^content/.test(event), event + ' has no content prefix after preroll');
|
127 | });
|
128 |
|
129 | seenDuringMidroll.forEach(event => {
|
130 | assert.ok(/^ad/.test(event), event + ' has ad prefix during midroll');
|
131 | });
|
132 |
|
133 | seenAfterMidroll.forEach(event => {
|
134 | assert.ok(!/^ad/.test(event), event + ' has no ad prefix after midroll');
|
135 | assert.ok(!/^content/.test(event), event + ' has no content prefix after midroll');
|
136 | });
|
137 |
|
138 | finish();
|
139 | }
|
140 | };
|
141 |
|
142 | finish = () => {
|
143 | player.off('timeupdate', onTimeupdate);
|
144 | player.off(['error', 'aderror'], onError);
|
145 | done();
|
146 | };
|
147 |
|
148 | player.on(['error', 'aderror'], onError);
|
149 | player.on('timeupdate', onTimeupdate);
|
150 | player.ready(player.play);
|
151 | });
|