caddy/startupshutdown/startupshutdown_test.go
2016-09-05 10:20:34 -06:00

67 lines
1.8 KiB
Go

package startupshutdown
import (
"os"
"path/filepath"
"strconv"
"testing"
"time"
"github.com/mholt/caddy"
)
// The Startup function's tests are symmetrical to Shutdown tests,
// because the Startup and Shutdown functions share virtually the
// same functionality
func TestStartup(t *testing.T) {
tempDirPath := os.TempDir()
testDir := filepath.Join(tempDirPath, "temp_dir_for_testing_startupshutdown")
defer func() {
// clean up after non-blocking startup function quits
time.Sleep(500 * time.Millisecond)
os.RemoveAll(testDir)
}()
osSenitiveTestDir := filepath.FromSlash(testDir)
os.RemoveAll(osSenitiveTestDir) // start with a clean slate
var registeredFunction func() error
fakeRegister := func(fn func() error) {
registeredFunction = fn
}
tests := []struct {
input string
shouldExecutionErr bool
shouldRemoveErr bool
}{
// test case #0 tests proper functionality blocking commands
{"startup mkdir " + osSenitiveTestDir, false, false},
// test case #1 tests proper functionality of non-blocking commands
{"startup mkdir " + osSenitiveTestDir + " &", false, true},
// test case #2 tests handling of non-existent commands
{"startup " + strconv.Itoa(int(time.Now().UnixNano())), true, true},
}
for i, test := range tests {
c := caddy.NewTestController("", test.input)
err := registerCallback(c, fakeRegister)
if err != nil {
t.Errorf("Expected no errors, got: %v", err)
}
if registeredFunction == nil {
t.Fatalf("Expected function to be registered, but it wasn't")
}
err = registeredFunction()
if err != nil && !test.shouldExecutionErr {
t.Errorf("Test %d received an error of:\n%v", i, err)
}
err = os.Remove(osSenitiveTestDir)
if err != nil && !test.shouldRemoveErr {
t.Errorf("Test %d received an error of:\n%v", i, err)
}
}
}