Skip to content

Commit

Permalink
tests: add test cases for process errors
Browse files Browse the repository at this point in the history
  • Loading branch information
connerdouglass committed Jan 24, 2024
1 parent 52a44e0 commit ee7ea98
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 16 deletions.
7 changes: 7 additions & 0 deletions ffmpeg_arger.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,10 @@ package spireav
type FfmpegArger interface {
FfmpegArgs() ([]string, error)
}

// FfmpegArgs is a simple type that implements the FfmpegArger interface.
type FfmpegArgs []string

func (args FfmpegArgs) FfmpegArgs() ([]string, error) {
return args, nil
}
8 changes: 8 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
module github.com/spiretechnology/spireav

go 1.20

require github.com/stretchr/testify v1.8.4

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
10 changes: 10 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
35 changes: 19 additions & 16 deletions process.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type Process struct {
FfmpegArger FfmpegArger
EstimatedLengthFrames int
SysProcAttr *syscall.SysProcAttr
lastStderrLine string
errorOutput string
}

// GetCommandString is a utility function that gets the FFmpeg command string that is run by this process
Expand Down Expand Up @@ -78,9 +78,9 @@ func (p *Process) Run(
}
switch e := err.(type) {
case *exec.ExitError:
return fmt.Errorf("ffmpeg exit code %d: %s", e.ExitCode(), p.lastStderrLine)
return fmt.Errorf("ffmpeg exit code %d: %s", e.ExitCode(), p.errorOutput)
default:
return fmt.Errorf("ffmpeg error: %s", err)
return fmt.Errorf("ffmpeg error: %s: %s", err, p.errorOutput)
}
}
return nil
Expand Down Expand Up @@ -131,19 +131,22 @@ func (p *Process) reportFFmpegProgress(chanProgress chan<- Progress, processOutp
// Read a line from the input
line := scanner.Text()
line = strings.ReplaceAll(line, "\r", "\n")
if line != "" {
p.lastStderrLine = line
}

// Read a new progress value
newProgress := parseProgressLine(
line,
p.EstimatedLengthFrames,
startTime,
)
if newProgress != nil {
progress = newProgress
chanProgress <- *progress
lines := strings.Split(line, "\n")
for _, line := range lines {
if line != "" {
p.errorOutput = line
}

// Read a new progress value
newProgress := parseProgressLine(
line,
p.EstimatedLengthFrames,
startTime,
)
if newProgress != nil {
progress = newProgress
chanProgress <- *progress
}
}
}

Expand Down
37 changes: 37 additions & 0 deletions process_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package spireav_test

import (
"context"
"testing"

"github.com/spiretechnology/spireav"
"github.com/stretchr/testify/require"
)

func overrideFfmpegPath(path string) func() {
original := spireav.FfmpegPath
spireav.FfmpegPath = path
return func() {
spireav.FfmpegPath = original
}
}

func TestProcessErrors(t *testing.T) {
t.Run("invalid args", func(t *testing.T) {
proc := &spireav.Process{
FfmpegArger: spireav.FfmpegArgs{"several", "bad", "args"},
}
err := proc.RunWithProgress(context.Background(), func(p spireav.Progress) {})
require.Error(t, err, "expected error when running process with invalid args")
require.ErrorContains(t, err, "several: Invalid argument")
})
t.Run("ffmpeg not in path", func(t *testing.T) {
defer overrideFfmpegPath("something-that-does-not-exist")()
proc := &spireav.Process{
FfmpegArger: spireav.FfmpegArgs{"-i", "something"},
}
err := proc.RunWithProgress(context.Background(), func(p spireav.Progress) {})
require.Error(t, err, "expected error when path is missing ffmpeg binary")
require.ErrorContains(t, err, "starting ffmpeg process: exec: \"something-that-does-not-exist\": executable file not found")
})
}

0 comments on commit ee7ea98

Please sign in to comment.