e2e/main_test.go
39 lines · 1333 bytes
1package e2e
2
3import (
4 "flag"
5 "fmt"
6 "os"
7 "testing"
8 "time"
9)
10
11// This suite drives real git, ssh, sshd and gpg, and takes six to fifteen
12// minutes depending on the machine — past `go test`'s ten-minute default.
13// Exceeding it panics with the name of whichever test happened to be
14// running, which is never the one at fault and reads like a hang (#143).
15//
16// make test passes -timeout 30m and .gitbay/ci.yml passes -timeout 20m.
17// A bare `go test ./...` gets the default, so say so up front rather than
18// eleven minutes later.
19const minTimeout = 15 * time.Minute
20
21func TestMain(m *testing.M) {
22 flag.Parse()
23 // Only for a whole-package run: `-run TestOneThing -timeout 2m` is a
24 // reasonable thing to type and none of this applies to it.
25 if run := flag.Lookup("test.run"); run == nil || run.Value.String() == "" {
26 if f := flag.Lookup("test.timeout"); f != nil {
27 d, err := time.ParseDuration(f.Value.String())
28 if err == nil && d > 0 && d < minTimeout {
29 fmt.Fprintf(os.Stderr,
30 "e2e: -timeout is %s; this suite needs about %s.\n"+
31 "Run `make test` (which passes -timeout 30m), or pass -timeout yourself.\n"+
32 "Without this check the run panics part way through and blames whichever\n"+
33 "test was executing at the deadline.\n", d, minTimeout)
34 os.Exit(1)
35 }
36 }
37 }
38 os.Exit(m.Run())
39}