Files
lpmsdemo/stream/basic_hls_video_test.go
2020-05-14 09:27:49 +08:00

174 lines
5.9 KiB
Go

package stream
import (
"testing"
"github.com/oscar-davids/lpmsdemo/m3u8"
)
func TestAddAndRemove(t *testing.T) {
manifest := NewBasicHLSVideoManifest("test_m")
strm := NewBasicHLSVideoStream("test_s", DefaultHLSStreamWin)
if err := manifest.AddVideoStream(strm, &m3u8.Variant{URI: "test_s", Chunklist: nil, VariantParams: m3u8.VariantParams{Bandwidth: 100}}); err != nil {
t.Errorf("Error: %v", err)
}
ml, err := manifest.GetManifest()
if len(ml.Variants) != 1 {
t.Errorf("Expecting 1 variant, but got: %v", ml.Variants)
}
segs := make([]*HLSSegment, 0)
eofRes := false
strm.SetSubscriber(func(seg *HLSSegment, eof bool) {
segs = append(segs, seg)
eofRes = eof
})
//Add to the stream
if err = strm.AddHLSSegment(&HLSSegment{Name: "test01.ts"}); err != nil {
t.Errorf("Error adding segment: %v", err)
}
if err = strm.AddHLSSegment(&HLSSegment{Name: "test02.ts"}); err != nil {
t.Errorf("Error adding segment: %v", err)
}
if err = strm.AddHLSSegment(&HLSSegment{Name: "test03.ts"}); err != nil {
t.Errorf("Error adding segment: %v", err)
}
seg, err := strm.GetHLSSegment("test01.ts")
if err != nil {
t.Errorf("Error getting segment: %v", err)
}
if seg.Name != "test01.ts" {
t.Errorf("Expecting test01.ts, got %v", seg.Name)
}
//Make sure the subscriber function is called
if len(segs) != 3 {
t.Errorf("Subscriber never called")
}
strm.End()
if eofRes != true {
t.Errorf("End didn't invoke callback")
}
//Should get playlist and the master playlist
pl, err := strm.GetStreamPlaylist()
if err != nil {
t.Errorf("Error getting playlist: %v", err)
}
if pl.Segments[0].URI != "test01.ts" {
t.Errorf("Expecting test01.ts, got %v", pl.Segments[0].URI)
}
mpl, err := manifest.GetManifest()
if len(mpl.Variants) != 1 {
t.Errorf("Expecting 1 variant, but got %v", ml.Variants)
}
//Add a stream
pl, _ = m3u8.NewMediaPlaylist(3, 10)
strm2 := NewBasicHLSVideoStream("test2", DefaultHLSStreamWin)
if err := manifest.AddVideoStream(strm2, &m3u8.Variant{URI: "test2.m3u8", Chunklist: pl, VariantParams: m3u8.VariantParams{Bandwidth: 10, Resolution: "10x10"}}); err != nil {
t.Errorf("Error adding media playlist: %v", err)
}
ml, err = manifest.GetManifest()
if err != nil {
t.Errorf("Error getting master playlist: %v", err)
}
if len(ml.Variants) != 2 {
t.Errorf("Expecting 2 variant, but got: %v", ml.Variants)
}
//Add stream with duplicate name, should fail
strm3 := NewBasicHLSVideoStream("test3", DefaultHLSStreamWin)
if err := manifest.AddVideoStream(strm3, &m3u8.Variant{URI: "test3.m3u8", Chunklist: pl, VariantParams: m3u8.VariantParams{Bandwidth: 10, Resolution: "10x10"}}); err == nil {
t.Errorf("Expecting error because of duplicate variant params")
}
_, err = manifest.GetVideoStream("wrongName")
if err == nil {
t.Errorf("Expecting NotFound error because the playlist name is wrong")
}
ml, err = manifest.GetManifest()
if err != nil {
t.Errorf("Error getting master playlist: %v", err)
}
if len(ml.Variants) != 2 {
t.Errorf("Expecting 2 variant, but got: %v", ml.Variants)
}
}
func TestWindowSize(t *testing.T) {
manifest := NewBasicHLSVideoManifest("test_m")
pl, _ := m3u8.NewMediaPlaylist(3, 10)
strm2 := NewBasicHLSVideoStream("test2", DefaultHLSStreamWin)
if err := manifest.AddVideoStream(strm2, &m3u8.Variant{URI: "test2.m3u8", Chunklist: pl, VariantParams: m3u8.VariantParams{Bandwidth: 10, Resolution: "10x10"}}); err != nil {
t.Errorf("Error adding media playlist: %v", err)
}
//Add segments to the new stream stream, make sure it respects the window size
vstrm, err := manifest.GetVideoStream("test2")
segs := []*HLSSegment{}
vstrm.SetSubscriber(func(seg *HLSSegment, eof bool) {
segs = append(segs, seg)
})
if err != nil {
t.Errorf("Error: %v", err)
}
if err := vstrm.AddHLSSegment(&HLSSegment{SeqNo: 1, Name: "seg1.ts", Data: []byte("hello"), Duration: 8}); err != nil {
t.Errorf("Error adding HLS Segment: %v", err)
}
if err = vstrm.AddHLSSegment(&HLSSegment{SeqNo: 2, Name: "seg2.ts", Data: []byte("hello"), Duration: 8}); err != nil {
t.Errorf("Error adding HLS Segment: %v", err)
}
if err = vstrm.AddHLSSegment(&HLSSegment{SeqNo: 3, Name: "seg3.ts", Data: []byte("hello"), Duration: 8}); err != nil {
t.Errorf("Error adding HLS Segment: %v", err)
}
if err = vstrm.AddHLSSegment(&HLSSegment{SeqNo: 4, Name: "seg4.ts", Data: []byte("hello"), Duration: 8}); err != nil {
t.Errorf("Error adding HLS Segment: %v", err)
}
pltmp, err := vstrm.GetStreamPlaylist()
if err != nil {
t.Errorf("Error getting variant playlist: %v", err)
}
if pltmp.Segments[pltmp.SeqNo].URI != "seg2.ts" {
t.Errorf("Expecting segment URI to be seg2.ts, but got %v", pltmp.Segments[pltmp.SeqNo].URI)
}
if pltmp.Segments[pltmp.SeqNo].Duration != 8 {
t.Errorf("Expecting duration to be 8, but got %v", pltmp.Segments[pltmp.SeqNo].Duration)
}
if pltmp.Segments[pltmp.SeqNo].SeqId != 2 {
t.Errorf("Expecting seqNo to be 1, but got %v", pltmp.Segments[pltmp.SeqNo].SeqId)
}
if pltmp.Segments[pltmp.SeqNo+1].URI != "seg3.ts" {
t.Errorf("Expecting segment URI to be seg3.ts, but got %v", pltmp.Segments[1].URI)
}
if pltmp.Segments[pltmp.SeqNo+2].URI != "seg4.ts" {
t.Errorf("Expecting segment URI to be seg4.ts, but got %v", pltmp.Segments[2].URI)
}
if pltmp.Count() != 3 {
t.Errorf("Expecting to only have 3 segments, but got %v", pltmp.Count())
}
seg1, err := vstrm.GetHLSSegment("seg1.ts")
if seg1 != nil {
t.Errorf("Expecting seg1.ts to be nil (window is 3), but got %v", seg1)
}
seg2, err := vstrm.GetHLSSegment("seg2.ts")
if seg2 == nil {
t.Errorf("Expecting to find seg2")
}
if len(segs) != 4 {
t.Errorf("Callback not invoked")
}
//Now master playlist should have 1 variant
ml, err := manifest.GetManifest()
if err != nil {
t.Errorf("Error getting master playlist: %v", err)
}
if len(ml.Variants) != 1 {
t.Errorf("Expecting 1 variant, but got: %v", ml.Variants)
}
if ml.Variants[0].URI != "test2.m3u8" {
t.Errorf("Expecting test2, but got %v", ml.Variants[0].URI)
}
}