diff --git a/revid/revid_test.go b/revid/revid_test.go new file mode 100644 index 00000000..d88e4e9a --- /dev/null +++ b/revid/revid_test.go @@ -0,0 +1,68 @@ +package revid + +import ( + "fmt" + "os" + "runtime" + "testing" + + "bitbucket.org/ausocean/iot/pi/netsender" +) + +const raspividPath = "/usr/local/bin/raspivid" + +// Suppress all test logging, except for t.Errorf output. +var silent bool + +// TestRaspivid tests that raspivid starts correctly. +// It is intended to be run on a Raspberry Pi. +func TestRaspivid(t *testing.T) { + if _, err := os.Stat(raspividPath); os.IsNotExist(err) { + t.Skip("Skipping TestRaspivid since no raspivid found.") + } + + var logger testLogger + ns, err := netsender.New(&logger, nil, nil, nil) + if err != nil { + t.Errorf("netsender.New failed with error %v", err) + } + + var c Config + c.Logger = &logger + c.Input = Raspivid + c.Outputs = make([]uint8, 1) + + rv, err := New(c, ns) + if err != nil { + t.Errorf("revid.New failed with error %v", err) + } + + err = rv.Start() + if err != nil { + t.Errorf("revid.Start failed with error %v", err) + } +} + +// testLogger implements a netsender.Logger. +type testLogger struct{} + +// SetLevel normally sets the logging level, but it is a no-op in our case. +func (tl *testLogger) SetLevel(level int8) { +} + +// Log requests the Logger to write a message at the given level. +func (tl *testLogger) Log(level int8, msg string, params ...interface{}) { + logLevels := [...]string{"Debug", "Info", "Warn", "Error", "", "", "Fatal"} + if level < -1 || level > 5 { + panic("Invalid log level") + } + if !silent { + fmt.Printf("%s: %s\n", logLevels[level+1], msg) + } + if level == 5 { + buf := make([]byte, 1<<16) + size := runtime.Stack(buf, true) + fmt.Printf("%s\n", string(buf[:size])) + os.Exit(1) + } +}