mirror of
https://github.com/oscar-davids/lpmsdemo.git
synced 2025-12-24 12:37:59 +08:00
174 lines
5.9 KiB
Go
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)
|
|
}
|
|
}
|