segmento/pkg/playlist2/playlist_test.go

103 lines
2.4 KiB
Go

package playlist2_test
import (
"io"
"segmento/pkg/media"
"segmento/pkg/playlist2"
"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
}
func (c *consumer) PlaylistUpdated(p playlist2.Playlist) {
c.pCount++
}
func (c *consumer) PlaylistSegmentAdded(p playlist2.Playlist, s *playlist2.PlaylistSegment) {
c.sCount++
}
func TestMediaPlaylistImplements(t *testing.T) {
require.Implements(t, (*playlist2.Playlist)(nil), new(playlist2.MediaPlaylist))
}
func TestMediaPlaylist(t *testing.T) {
publisher := &FakeSegmentPublisher{}
playlist := playlist2.NewMediaPlaylist(&FakeReader{}, &FakeSegmenter{3}, publisher)
err := playlist.Run()
require.NoError(t, err)
require.Equal(t, 3, playlist.Len())
require.Equal(t, 3, publisher.count)
}
func TestMediaPlaylistRender(t *testing.T) {
playlist := playlist2.NewMediaPlaylist(&FakeReader{}, &FakeSegmenter{2}, &FakeSegmentPublisher{})
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{}
require.Implements(t, (*playlist2.Consumer)(nil), consumer)
playlist := playlist2.NewMediaPlaylist(&FakeReader{}, &FakeSegmenter{4}, &FakeSegmentPublisher{})
playlist.AddConsumer(consumer)
err := playlist.Run()
require.NoError(t, err)
require.Equal(t, 4, consumer.sCount)
require.Equal(t, 0, consumer.pCount) // TODO
}