playlist timer pause/resume without affecting active feeds
This commit is contained in:
@@ -7,7 +7,11 @@ import (
|
||||
|
||||
func TestNewPlaylistTimingResetsState(t *testing.T) {
|
||||
got := NewPlaylistTiming(7, 10*time.Second)
|
||||
want := PlaylistTimingState{Revision: 7, Duration: 10 * time.Second}
|
||||
want := PlaylistTimingState{
|
||||
Revision: 7,
|
||||
Duration: 10 * time.Second,
|
||||
Remaining: 10 * time.Second,
|
||||
}
|
||||
if got != want {
|
||||
t.Fatalf("NewPlaylistTiming() = %#v, want %#v", got, want)
|
||||
}
|
||||
@@ -22,10 +26,12 @@ func TestStartPlaylistTiming(t *testing.T) {
|
||||
t.Fatal("StartPlaylistTiming() started = false, want true")
|
||||
}
|
||||
want := PlaylistTimingState{
|
||||
Revision: 4,
|
||||
Duration: 10 * time.Second,
|
||||
Started: true,
|
||||
Deadline: now.Add(10 * time.Second),
|
||||
Revision: 4,
|
||||
Duration: 10 * time.Second,
|
||||
Ready: true,
|
||||
Started: true,
|
||||
Remaining: 10 * time.Second,
|
||||
Deadline: now.Add(10 * time.Second),
|
||||
}
|
||||
if got != want {
|
||||
t.Fatalf("StartPlaylistTiming() = %#v, want %#v", got, want)
|
||||
@@ -47,6 +53,7 @@ func TestStartPlaylistTimingIgnoresInapplicableReadiness(t *testing.T) {
|
||||
{name: "stale revision", current: NewPlaylistTiming(4, time.Second), revision: 3},
|
||||
{name: "future revision", current: NewPlaylistTiming(4, time.Second), revision: 5},
|
||||
{name: "already started", current: started, revision: 4},
|
||||
{name: "paused", current: PlaylistTimingState{Revision: 4, Duration: time.Second, Paused: true, Remaining: time.Second}, revision: 4},
|
||||
{name: "expired", current: PlaylistTimingState{Revision: 4, Duration: time.Second, Expired: true}, revision: 4},
|
||||
}
|
||||
|
||||
@@ -71,7 +78,13 @@ func TestExpirePlaylistTiming(t *testing.T) {
|
||||
if !expired {
|
||||
t.Fatal("ExpirePlaylistTiming() expired = false, want true")
|
||||
}
|
||||
want := PlaylistTimingState{Revision: 9, Duration: 5 * time.Second, Expired: true}
|
||||
want := PlaylistTimingState{
|
||||
Revision: 9,
|
||||
Duration: 5 * time.Second,
|
||||
Ready: true,
|
||||
Expired: true,
|
||||
Remaining: 0,
|
||||
}
|
||||
if got != want {
|
||||
t.Fatalf("ExpirePlaylistTiming() = %#v, want %#v", got, want)
|
||||
}
|
||||
@@ -118,3 +131,74 @@ func TestNewPlaylistTimingInvalidatesPreviousDeadline(t *testing.T) {
|
||||
t.Fatalf("old expiry changed new timing: %#v, %v", got, expired)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPauseAndResumePlaylistTimingBeforeReadiness(t *testing.T) {
|
||||
now := time.Date(2026, time.September, 1, 12, 0, 0, 0, time.UTC)
|
||||
current := NewPlaylistTiming(3, 10*time.Second)
|
||||
|
||||
paused, changed := PausePlaylistTiming(current, 3, now)
|
||||
if !changed || !paused.Paused || paused.Ready || paused.Started {
|
||||
t.Fatalf("PausePlaylistTiming() = %#v, %v", paused, changed)
|
||||
}
|
||||
resumed, changed := ResumePlaylistTiming(paused, 3, now.Add(time.Second))
|
||||
if !changed || resumed.Paused || resumed.Ready || resumed.Started {
|
||||
t.Fatalf("ResumePlaylistTiming() = %#v, %v", resumed, changed)
|
||||
}
|
||||
if resumed.Remaining != 10*time.Second {
|
||||
t.Fatalf("remaining = %v, want 10s", resumed.Remaining)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPauseAndResumeActivePlaylistTimingUsesRemaining(t *testing.T) {
|
||||
now := time.Date(2026, time.September, 1, 12, 0, 0, 0, time.UTC)
|
||||
current, _ := StartPlaylistTiming(NewPlaylistTiming(5, 10*time.Second), 5, now)
|
||||
|
||||
paused, changed := PausePlaylistTiming(current, 5, now.Add(4*time.Second))
|
||||
if !changed || !paused.Paused || paused.Started || !paused.Ready {
|
||||
t.Fatalf("PausePlaylistTiming() = %#v, %v", paused, changed)
|
||||
}
|
||||
if paused.Remaining != 6*time.Second || !paused.Deadline.IsZero() {
|
||||
t.Fatalf("paused timing = %#v, want 6s remaining and no deadline", paused)
|
||||
}
|
||||
|
||||
resumeAt := now.Add(20 * time.Second)
|
||||
resumed, changed := ResumePlaylistTiming(paused, 5, resumeAt)
|
||||
if !changed || resumed.Paused || !resumed.Started || !resumed.Ready {
|
||||
t.Fatalf("ResumePlaylistTiming() = %#v, %v", resumed, changed)
|
||||
}
|
||||
if resumed.Deadline != resumeAt.Add(6*time.Second) {
|
||||
t.Fatalf("resumed deadline = %v, want %v", resumed.Deadline, resumeAt.Add(6*time.Second))
|
||||
}
|
||||
}
|
||||
|
||||
func TestPauseAndResumePlaylistTimingIgnoreInvalidTransitions(t *testing.T) {
|
||||
now := time.Now()
|
||||
base := NewPlaylistTiming(2, time.Second)
|
||||
paused, _ := PausePlaylistTiming(base, 2, now)
|
||||
tests := []struct {
|
||||
name string
|
||||
state PlaylistTimingState
|
||||
pause bool
|
||||
revision uint64
|
||||
}{
|
||||
{name: "pause wrong revision", state: base, pause: true, revision: 1},
|
||||
{name: "duplicate pause", state: paused, pause: true, revision: 2},
|
||||
{name: "resume wrong revision", state: paused, revision: 1},
|
||||
{name: "duplicate resume", state: base, revision: 2},
|
||||
{name: "pause expired", state: PlaylistTimingState{Revision: 2, Duration: time.Second, Expired: true}, pause: true, revision: 2},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
var got PlaylistTimingState
|
||||
var changed bool
|
||||
if test.pause {
|
||||
got, changed = PausePlaylistTiming(test.state, test.revision, now)
|
||||
} else {
|
||||
got, changed = ResumePlaylistTiming(test.state, test.revision, now)
|
||||
}
|
||||
if changed || got != test.state {
|
||||
t.Fatalf("transition = %#v, %v; want unchanged", got, changed)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user