@@ -3,10 +3,12 @@ import sinonChai from 'sinon-chai';
3
3
import { hlsDefaultConfig } from '../../../src/config' ;
4
4
import BaseStreamController from '../../../src/controller/stream-controller' ;
5
5
import Hls from '../../../src/hls' ;
6
+ import { Fragment } from '../../../src/loader/fragment' ;
6
7
import KeyLoader from '../../../src/loader/key-loader' ;
8
+ import { LevelDetails } from '../../../src/loader/level-details' ;
9
+ import { PlaylistLevelType } from '../../../src/types/loader' ;
7
10
import { TimeRangesMock } from '../../mocks/time-ranges.mock' ;
8
- import type { Fragment , Part } from '../../../src/loader/fragment' ;
9
- import type { LevelDetails } from '../../../src/loader/level-details' ;
11
+ import type { MediaFragment , Part } from '../../../src/loader/fragment' ;
10
12
import type { BufferInfo } from '../../../src/utils/buffer-helper' ;
11
13
12
14
chai . use ( sinonChai ) ;
@@ -24,7 +26,6 @@ describe('BaseStreamController', function () {
24
26
let hls : Hls ;
25
27
let baseStreamController : BaseStreamControllerTestable ;
26
28
let bufferInfo : BufferInfo ;
27
- let levelDetails : LevelDetails ;
28
29
let fragmentTracker ;
29
30
let media ;
30
31
beforeEach ( function ( ) {
@@ -49,41 +50,55 @@ describe('BaseStreamController', function () {
49
50
start : 0 ,
50
51
end : 1 ,
51
52
} ;
52
- levelDetails = {
53
- endSN : 0 ,
54
- live : false ,
55
- get fragments ( ) {
56
- const frags : Fragment [ ] = [ ] ;
57
- for ( let i = 0 ; i < this . endSN ; i ++ ) {
58
- frags . push ( { sn : i , type : 'main' } as unknown as Fragment ) ;
59
- }
60
- return frags ;
61
- } ,
62
- } as unknown as LevelDetails ;
63
53
media = {
64
54
duration : 0 ,
65
55
buffered : new TimeRangesMock ( ) ,
66
56
} as unknown as HTMLMediaElement ;
67
57
baseStreamController . media = media ;
68
58
} ) ;
69
59
60
+ function levelDetailsWithEndSequenceVodOrLive (
61
+ endSN : number = 1 ,
62
+ live : boolean = false ,
63
+ ) {
64
+ const details = new LevelDetails ( '' ) ;
65
+ for ( let i = 0 ; i < endSN ; i ++ ) {
66
+ const frag = new Fragment ( PlaylistLevelType . MAIN , '' ) as MediaFragment ;
67
+ frag . duration = 5 ;
68
+ frag . sn = i ;
69
+ frag . start = i * 5 ;
70
+ details . fragments . push ( frag ) ;
71
+ }
72
+ details . live = live ;
73
+ return details ;
74
+ }
75
+
70
76
describe ( '_streamEnded' , function ( ) {
71
77
it ( 'returns false if the stream is live' , function ( ) {
72
- levelDetails . live = true ;
78
+ const levelDetails = levelDetailsWithEndSequenceVodOrLive ( 3 , true ) ;
73
79
expect ( baseStreamController . _streamEnded ( bufferInfo , levelDetails ) ) . to . be
74
80
. false ;
75
81
} ) ;
76
82
77
- it ( 'returns false if there is subsequently buffered range' , function ( ) {
78
- levelDetails . endSN = 10 ;
79
- bufferInfo . nextStart = 100 ;
83
+ it ( 'returns false if there is subsequently buffered range within program range' , function ( ) {
84
+ const levelDetails = levelDetailsWithEndSequenceVodOrLive ( 10 ) ;
85
+ expect ( levelDetails . edge ) . to . eq ( 50 ) ;
86
+ bufferInfo . nextStart = 45 ;
80
87
expect ( baseStreamController . _streamEnded ( bufferInfo , levelDetails ) ) . to . be
81
88
. false ;
82
89
} ) ;
83
90
91
+ it ( 'returns true if complete and subsequently buffered range is outside program range' , function ( ) {
92
+ const levelDetails = levelDetailsWithEndSequenceVodOrLive ( 10 ) ;
93
+ expect ( levelDetails . edge ) . to . eq ( 50 ) ;
94
+ bufferInfo . nextStart = 100 ;
95
+ expect ( baseStreamController . _streamEnded ( bufferInfo , levelDetails ) ) . to . be
96
+ . true ;
97
+ } ) ;
98
+
84
99
it ( 'returns true if parts are buffered for low latency content' , function ( ) {
85
100
media . buffered = new TimeRangesMock ( [ 0 , 1 ] ) ;
86
- levelDetails . endSN = 10 ;
101
+ const levelDetails = levelDetailsWithEndSequenceVodOrLive ( 10 ) ;
87
102
levelDetails . partList = [ { start : 0 , duration : 1 } as unknown as Part ] ;
88
103
89
104
expect ( baseStreamController . _streamEnded ( bufferInfo , levelDetails ) ) . to . be
@@ -92,7 +107,7 @@ describe('BaseStreamController', function () {
92
107
93
108
it ( 'depends on fragment-tracker to determine if last fragment is buffered' , function ( ) {
94
109
media . buffered = new TimeRangesMock ( [ 0 , 1 ] ) ;
95
- levelDetails . endSN = 10 ;
110
+ const levelDetails = levelDetailsWithEndSequenceVodOrLive ( 10 ) ;
96
111
97
112
expect ( baseStreamController . _streamEnded ( bufferInfo , levelDetails ) ) . to . be
98
113
. true ;
0 commit comments