firestormy/scheduler/job_test.go

131 lines
2.6 KiB
Go
Executable File

package scheduler
import (
"bytes"
"io/ioutil"
"gogs.inhome.blapointe.com/local/firestormy/config"
"gogs.inhome.blapointe.com/local/logb"
"gogs.inhome.blapointe.com/local/storage"
"os"
"testing"
"time"
)
func TestNewBashJobBadCron(t *testing.T) {
_, err := newBashJob("1 1 1 ", "hostname")
if err == nil {
t.Fatal(err)
}
}
func TestNewBashJobAndRun(t *testing.T) {
config.Store = storage.NewMap()
cases := []struct {
sched string
cmd string
out string
}{
{
sched: "1 1 1 1 1",
cmd: "hostname",
out: os.Getenv("HOSTNAME"),
},
{
sched: "@hourly",
cmd: "hostname",
out: os.Getenv("HOSTNAME"),
},
{
sched: "@hourly",
cmd: "exit 1",
},
}
for _, c := range cases {
b, clean := captureLog()
defer clean()
j, err := newBashJob(c.sched, c.cmd)
if err != nil {
t.Error(err)
continue
}
j.Run()
if !bytes.Contains(b.Bytes(), []byte(c.out)) {
t.Errorf("(%s, %s) => %s", c.sched, c.cmd, b.Bytes())
}
}
}
func TestJobEncodeDecode(t *testing.T) {
config.Store = storage.NewMap()
buff, clean := captureLog()
defer clean()
j, err := newBashJob("1 1 1 1 1", "hostname")
if err != nil {
t.Fatal(err)
}
j.foo()
if !bytes.Contains(buff.Bytes(), []byte(os.Getenv("HOSTNAME"))) {
t.Errorf("%s", buff.Bytes())
}
buff.Reset()
b, err := j.Encode()
if err != nil {
t.Fatal(err)
}
k := &Job{}
if err := k.Decode(b); err != nil {
t.Logf("decoded %+v", k)
t.Fatal(err)
}
if k.Schedule != j.Schedule {
t.Error(k.Schedule, "vs", j.Schedule)
}
if k.Name != j.Name {
t.Error(k.Name, "vs", j.Name)
}
if k.Disabled != j.Disabled {
t.Error(k.Disabled, "vs", j.Disabled)
}
if k.Title != j.Title {
t.Error(k.Title, "vs", j.Title)
}
if diff := k.LastRun.Unix() - j.LastRun.Unix(); (diff > 0 && diff < int64(time.Hour)) || (diff < 0 && -1*diff < int64(time.Hour)) {
t.Error(j.LastRun, "vs", k.LastRun)
}
if k.LastStatus != j.LastStatus {
t.Error(j.LastStatus, "vs", k.LastStatus)
}
if k.LastRuntime != j.LastRuntime {
t.Error(j.LastRuntime, "vs", k.LastRuntime)
}
if string(k.LastOutput) != string(j.LastOutput) {
t.Error(j.LastOutput, "vs", k.LastOutput)
}
k.foo()
if !bytes.Contains(buff.Bytes(), []byte(os.Getenv("HOSTNAME"))) {
t.Errorf("%s", buff.Bytes())
}
}
func captureLog() (*bytes.Buffer, func()) {
logb.Set(logb.VERBOSE)
was := logb.Writer()
wase := os.Stderr
f, _ := ioutil.TempFile(os.TempDir(), "test.newBashJobAndRun")
os.Stderr = f
b := bytes.NewBuffer(nil)
logb.SetWriter(b)
return b, func() {
os.Remove(f.Name())
logb.SetWriter(was)
os.Stderr = wase
}
}