2020-07-08 17:46:14 +00:00
|
|
|
package playlist_test
|
2020-07-08 17:31:57 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"segmento/pkg/media"
|
2020-07-08 17:46:14 +00:00
|
|
|
"segmento/pkg/playlist"
|
2020-07-08 17:31:57 +00:00
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
type FakeReader struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *FakeReader) Read([]byte) (int, error) {
|
|
|
|
return 0, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type FakeSegmenter struct {
|
|
|
|
count int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *FakeSegmenter) Segment(r io.Reader) (chan *media.Segment, error) {
|
|
|
|
c := make(chan *media.Segment)
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
dur := 2500 * time.Millisecond
|
|
|
|
for i := 0; i < s.count; i++ {
|
|
|
|
segment := media.NewSegment(dur, 0)
|
|
|
|
segment.IncrementDuration(dur)
|
|
|
|
c <- segment
|
|
|
|
}
|
|
|
|
close(c)
|
|
|
|
}()
|
|
|
|
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type FakeSegmentPublisher struct {
|
|
|
|
count int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *FakeSegmentPublisher) Publish(s *media.Segment) (string, error) {
|
|
|
|
p.count++
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type consumer struct {
|
|
|
|
pCount, sCount int
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:46:14 +00:00
|
|
|
func (c *consumer) PlaylistUpdated(p playlist.Playlist) {
|
2020-07-08 17:31:57 +00:00
|
|
|
c.pCount++
|
|
|
|
}
|
|
|
|
|
2020-07-08 17:46:14 +00:00
|
|
|
func (c *consumer) PlaylistSegmentAdded(p playlist.Playlist, s *playlist.PlaylistSegment) {
|
2020-07-08 17:31:57 +00:00
|
|
|
c.sCount++
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMediaPlaylistImplements(t *testing.T) {
|
2020-07-08 17:46:14 +00:00
|
|
|
require.Implements(t, (*playlist.Playlist)(nil), new(playlist.MediaPlaylist))
|
2020-07-08 17:31:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestMediaPlaylist(t *testing.T) {
|
|
|
|
publisher := &FakeSegmentPublisher{}
|
2020-07-08 17:46:14 +00:00
|
|
|
playlist := playlist.NewMediaPlaylist(&FakeReader{}, &FakeSegmenter{3}, publisher)
|
2020-07-08 17:31:57 +00:00
|
|
|
|
|
|
|
err := playlist.Run()
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 3, playlist.Len())
|
|
|
|
require.Equal(t, 3, publisher.count)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMediaPlaylistRender(t *testing.T) {
|
2020-07-08 17:46:14 +00:00
|
|
|
playlist := playlist.NewMediaPlaylist(&FakeReader{}, &FakeSegmenter{2}, &FakeSegmentPublisher{})
|
2020-07-08 17:31:57 +00:00
|
|
|
err := playlist.Run()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
lines := strings.Split(playlist.Render(), "\n")
|
|
|
|
|
|
|
|
require.Equal(t, "#EXTM3U", lines[0])
|
|
|
|
require.Equal(t, "#EXT-X-VERSION:3", lines[1])
|
|
|
|
require.Equal(t, "#EXT-X-TARGETDURATION:3", lines[2])
|
|
|
|
require.Equal(t, "#EXTINF:2.50000", lines[3])
|
|
|
|
require.Equal(t, "http://www.example.com/x.mp3", lines[4])
|
|
|
|
require.Equal(t, "#EXTINF:2.50000", lines[5])
|
|
|
|
require.Equal(t, "http://www.example.com/x.mp3", lines[6])
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMediaPlaylistConsumer(t *testing.T) {
|
|
|
|
consumer := &consumer{}
|
2020-07-08 17:46:14 +00:00
|
|
|
require.Implements(t, (*playlist.Consumer)(nil), consumer)
|
2020-07-08 17:31:57 +00:00
|
|
|
|
2020-07-08 17:46:14 +00:00
|
|
|
playlist := playlist.NewMediaPlaylist(&FakeReader{}, &FakeSegmenter{4}, &FakeSegmentPublisher{})
|
2020-07-08 17:31:57 +00:00
|
|
|
playlist.AddConsumer(consumer)
|
|
|
|
err := playlist.Run()
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, 4, consumer.sCount)
|
|
|
|
require.Equal(t, 0, consumer.pCount) // TODO
|
|
|
|
}
|