summaryrefslogtreecommitdiff
path: root/internal/thumb/thumb_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/thumb/thumb_test.go')
-rw-r--r--internal/thumb/thumb_test.go65
1 files changed, 63 insertions, 2 deletions
diff --git a/internal/thumb/thumb_test.go b/internal/thumb/thumb_test.go
index 2cd6124..d6272a9 100644
--- a/internal/thumb/thumb_test.go
+++ b/internal/thumb/thumb_test.go
@@ -3,9 +3,12 @@ package thumb
import (
"context"
"errors"
+ "math/rand"
"os/exec"
+ "strconv"
"strings"
"testing"
+ "time"
)
func TestFFmpegGenerator_Generate(t *testing.T) {
@@ -35,7 +38,7 @@ func TestFFmpegGenerator_Generate(t *testing.T) {
return exec.Command("true")
}
- g := &FFmpegGenerator{execer: fakeExecer}
+ g := &FFmpegGenerator{execer: fakeExecer, rnd: rand.New(rand.NewSource(1))}
if err := g.Generate(ctx, "input.mp4", "output.jpg", 120.0); err != nil {
t.Fatalf("unexpected error: %v", err)
}
@@ -58,12 +61,58 @@ func TestFFmpegGenerator_Generate_Error(t *testing.T) {
fakeExecer := func(_ context.Context, name string, arg ...string) *exec.Cmd {
return exec.Command("false")
}
- g := &FFmpegGenerator{execer: fakeExecer}
+ g := &FFmpegGenerator{execer: fakeExecer, rnd: rand.New(rand.NewSource(1))}
if err := g.Generate(ctx, "input.mp4", "output.jpg", 10.0); err == nil {
t.Fatal("expected error from failing ffmpeg command")
}
}
+func TestFFmpegGenerator_Generate_RandomOffset(t *testing.T) {
+ ctx := context.Background()
+ var offsets []float64
+ fakeExecer := func(_ context.Context, name string, arg ...string) *exec.Cmd {
+ for i := 0; i < len(arg); i++ {
+ if arg[i] == "-ss" && i+1 < len(arg) {
+ off, err := strconv.ParseFloat(arg[i+1], 64)
+ if err != nil {
+ t.Fatalf("failed to parse offset: %v", err)
+ }
+ offsets = append(offsets, off)
+ }
+ }
+ return exec.Command("true")
+ }
+
+ // Use two generators with different seeds.
+ g1 := &FFmpegGenerator{execer: fakeExecer, rnd: rand.New(rand.NewSource(time.Now().UnixNano()))}
+ g2 := &FFmpegGenerator{execer: fakeExecer, rnd: rand.New(rand.NewSource(time.Now().UnixNano() + 12345))}
+
+ for i := 0; i < 5; i++ {
+ if err := g1.Generate(ctx, "input.mp4", "out.jpg", 100.0); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if err := g2.Generate(ctx, "input.mp4", "out.jpg", 100.0); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ }
+
+ if len(offsets) != 10 {
+ t.Fatalf("expected 10 offsets, got %d", len(offsets))
+ }
+
+ // Check that not all offsets are identical (should be extremely unlikely with different seeds).
+ allSame := true
+ for i := 1; i < len(offsets); i++ {
+ if offsets[i] != offsets[0] {
+ allSame = false
+ break
+ }
+ }
+ if allSame {
+ t.Fatal("expected different random offsets, but all were identical")
+ }
+}
+
func TestMockGenerator(t *testing.T) {
ctx := context.Background()
m := &MockGenerator{}
@@ -78,3 +127,15 @@ func TestMockGenerator(t *testing.T) {
t.Fatal("expected error from mock generator")
}
}
+
+func TestNewFFmpegGenerator_Seeded(t *testing.T) {
+ g := NewFFmpegGenerator()
+ if g.rnd == nil {
+ t.Fatal("expected rnd to be initialized")
+ }
+ // Generate a value to ensure the source is functional.
+ v := g.rnd.Float64()
+ if v < 0 || v >= 1 {
+ t.Fatalf("expected float in [0,1), got %v", v)
+ }
+}