av/cmd/vidforward/watcher_test.go

125 lines
3.5 KiB
Go

package main
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
"bitbucket.org/ausocean/utils/logging"
)
// Delay between changing a file and the file watcher picking up the change.
const watchTimeAllowance = 1 * time.Second
// TestWatchFile tests the watchFile function. It creates a temporary file,
// watches it, writes to it, and checks if the onWrite function was called.
func TestWatchFile(t *testing.T) {
tmpFile, err := ioutil.TempFile("", "example")
if err != nil {
t.Fatalf("could not create temporary file: %v", err)
}
defer os.Remove(tmpFile.Name())
// We'll check this to see if the onWrite function was called.
called := false
err = watchFile(tmpFile.Name(), func() {
called = true
}, (*logging.TestLogger)(t))
if err != nil {
t.Fatalf("watchFile failed: %v", err)
}
if _, err := tmpFile.Write([]byte("hello world")); err != nil {
t.Fatalf("could not write to temporary file: %v", err)
}
if err := tmpFile.Close(); err != nil {
t.Fatalf("could not close temporary file: %v", err)
}
// Allow some time for the file watcher to pick up the change.
time.Sleep(watchTimeAllowance)
if !called {
t.Errorf("onWrite was not called after modifying the file")
}
}
// TestWatchFileFileNotExistYet tests the watchFile function in the case
// that the file to be watched does not exist on the first call to watchFile.
// It creates a temporary directory, watches a file in that directory, creates
// and writes to the file, and checks if the onWrite function was called.
func TestWatchFileFileNotExistYet(t *testing.T) {
// Create a temporary directory.
tmpDir, err := ioutil.TempDir("", "example")
if err != nil {
t.Fatalf("could not create temporary directory: %v", err)
}
defer os.Remove(tmpDir) // clean up
// File that does not exist yet but will be created in the temporary directory.
fileName := filepath.Join(tmpDir, "testfile")
called := false
err = watchFile(fileName, func() {
called = true
}, (*logging.TestLogger)(t))
if err != nil {
t.Fatalf("watchFile failed: %v", err)
}
// Create and write to the file.
err = ioutil.WriteFile(fileName, []byte("hello world"), 0666)
if err != nil {
t.Fatalf("could not write to file: %v", err)
}
// Allow some time for the file watcher to pick up the change.
time.Sleep(watchTimeAllowance)
if !called {
t.Errorf("onWrite was not called after creating and modifying the file")
}
}
// TestWatchFileMultipleChanges tests the watchFile function in the case
// that the file to be watched is modified multiple times. It creates a
// temporary file, watches it, writes to it twice, and checks if the onWrite
// function was called twice.
func TestWatchFileMultipleChanges(t *testing.T) {
tmpfile, err := ioutil.TempFile("", "example")
if err != nil {
t.Fatalf("could not create temporary file: %v", err)
}
defer os.Remove(tmpfile.Name())
// We'll count how many times onWrite was called.
calledCount := 0
err = watchFile(tmpfile.Name(), func() {
calledCount++
}, (*logging.TestLogger)(t))
if err != nil {
t.Fatalf("watchFile failed: %v", err)
}
// Write to the file twice.
for i := 0; i < 2; i++ {
if _, err := tmpfile.Write([]byte("hello world")); err != nil {
t.Fatalf("could not write to temporary file: %v", err)
}
if err := tmpfile.Sync(); err != nil {
t.Fatalf("could not sync temporary file: %v", err)
}
// Allow some time for the file watcher to pick up the change.
time.Sleep(watchTimeAllowance)
}
if calledCount != 2 {
t.Errorf("onWrite was not called the expected number of times after modifying the file")
}
}