func TestCommandLinesPipe(t *testing.T) { stretcher.Init() var buf bytes.Buffer for i := 0; i < 10; i++ { buf.WriteString(fmt.Sprintf("foo%d\n", i)) } toWrite := buf.Bytes() cmdlines := stretcher.CommandLines{ stretcher.CommandLine("cat > test/tmp/cmdoutput"), stretcher.CommandLine("cat"), stretcher.CommandLine("echo ok"), } defer os.Remove("test/tmp/cmdoutput") err := cmdlines.InvokePipe(&buf) if err != nil { t.Error(err) } wrote, err := ioutil.ReadFile("test/tmp/cmdoutput") if err != nil { t.Error(err) } if bytes.Compare(toWrite, wrote) != 0 { t.Error("unexpected wrote data", wrote) } }
func main() { var ( showVersion bool ) flag.BoolVar(&showVersion, "v", false, "show version") flag.BoolVar(&showVersion, "version", false, "show version") flag.Parse() if showVersion { fmt.Println("version:", version) fmt.Println("build:", buildDate) checkLatest(version) return } log.Println("stretcher version:", version) stretcher.Init() err := stretcher.Run() if err != nil { log.Println(err) if os.Getenv("CONSUL_INDEX") != "" { // ensure exit 0 when running under `consul watch` return } else { os.Exit(1) } } }
func TestInitSleep(t *testing.T) { sleep := time.Duration(1 * time.Second) start := time.Now() stretcher.Init(sleep) end := time.Now() diff := end.Sub(start) if diff < sleep { t.Errorf("sleeping time is not enough. expected at least %s, but returned in %s", sleep, diff) } }
func TestCommandLines(t *testing.T) { stretcher.Init() now := time.Now() ymd := now.Format("20060102") hm := now.Format("1504") cmdlines := stretcher.CommandLines{ stretcher.CommandLine("date +%Y%m%d"), stretcher.CommandLine("date +%H%M"), } cmdlines.Invoke() output := stretcher.LogBuffer.String() if strings.Index(output, ymd) == -1 { t.Error("invalid output", output) } if strings.Index(output, hm) == -1 { t.Error("invalid output", output) } }
func TestCommandLinesPipeIgnoreEPIPE(t *testing.T) { stretcher.Init(0) var buf bytes.Buffer for i := 0; i < 1025; i++ { buf.WriteString("0123456789012345678901234567890123456789012345678901234567890123") // 64 bytes } cmdlines := stretcher.CommandLines{ stretcher.CommandLine("echo ok"), } err := cmdlines.InvokePipe(&buf) if err != nil { t.Error(err) } if strings.Index(stretcher.LogBuffer.String(), "broken pipe") != -1 { t.Error("broken pipe was occuered") } }
func TestCommandLinesFail(t *testing.T) { stretcher.Init() cmdlines := stretcher.CommandLines{ stretcher.CommandLine("echo 'FOO'; echo 'BAR' 2>&1; false"), } err := cmdlines.Invoke() if err == nil { t.Error("false command must fail") } if fmt.Sprintf("%s", err) != "failed: echo 'FOO'; echo 'BAR' 2>&1; false exit status 1" { t.Error("invalid err message.", err) } output := string(stretcher.LogBuffer.Bytes()) if !strings.Contains(output, "FOO\n") { t.Error("output does not contain FOO\\n") } if !strings.Contains(output, "BAR\n") { t.Error("output does not contain BAR\\n") } }
func main() { var ( showVersion bool delay float64 sleep time.Duration ) flag.BoolVar(&showVersion, "v", false, "show version") flag.BoolVar(&showVersion, "version", false, "show version") flag.Float64Var(&delay, "random-delay", 0, "sleep [0,random-delay) sec on start") flag.Parse() if showVersion { fmt.Println("version:", version) fmt.Println("build:", buildDate) checkLatest(version) return } log.Println("stretcher version:", version) if delay > 0 { n, err := rand.Int(rand.Reader, big.NewInt(int64(delay*1000))) if err != nil { panic(err) } sleep, _ = time.ParseDuration(fmt.Sprintf("%dms", n.Int64())) } stretcher.Version = version stretcher.Init(sleep) err := stretcher.Run() if err != nil { log.Println(err) if os.Getenv("CONSUL_INDEX") != "" { // ensure exit 0 when running under `consul watch` return } else { os.Exit(1) } } }