From 4200d9df1bdd55952eac34386ec7b74fdd0852c9 Mon Sep 17 00:00:00 2001 From: Arthur Barr Date: Wed, 22 Nov 2017 17:20:57 +0000 Subject: [PATCH] Enable coverage for failure cases --- cmd/runmqserver/main.go | 4 +++- cmd/runmqserver/main_test.go | 12 ++++++++++++ test/docker/docker_api_test_util.go | 30 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/cmd/runmqserver/main.go b/cmd/runmqserver/main.go index 173fbbc..5df9608 100644 --- a/cmd/runmqserver/main.go +++ b/cmd/runmqserver/main.go @@ -179,9 +179,11 @@ func doMain() error { return nil } +var osExit = os.Exit + func main() { err := doMain() if err != nil { - os.Exit(1) + osExit(1) } } diff --git a/cmd/runmqserver/main_test.go b/cmd/runmqserver/main_test.go index a60a5e2..2a78204 100644 --- a/cmd/runmqserver/main_test.go +++ b/cmd/runmqserver/main_test.go @@ -17,6 +17,9 @@ package main import ( "flag" + "io/ioutil" + "log" + "strconv" "testing" ) @@ -29,6 +32,15 @@ func init() { // Test started when the test binary is started. Only calls main. func TestSystem(t *testing.T) { if *test { + var oldExit = osExit + defer func() { + osExit = oldExit + }() + osExit = func(rc int) { + // Write the exit code to a file instead + log.Printf("Writing exit code %v to file", strconv.Itoa(rc)) + ioutil.WriteFile("/var/coverage/exitCode", []byte(strconv.Itoa(rc)), 0644) + } main() } } diff --git a/test/docker/docker_api_test_util.go b/test/docker/docker_api_test_util.go index 5af6716..f9100ca 100644 --- a/test/docker/docker_api_test_util.go +++ b/test/docker/docker_api_test_util.go @@ -22,6 +22,7 @@ import ( "log" "os" "path/filepath" + "strconv" "testing" "time" @@ -136,11 +137,40 @@ func stopContainer(t *testing.T, cli *client.Client, ID string) { } } +func getCoverageExitCode(t *testing.T, orig int64) int64 { + f := filepath.Join(coverageDir(t), "exitCode") + _, err := os.Stat(f) + if err != nil { + t.Log(err) + return orig + } + // Remove the file, ready for the next test + //defer os.Remove(f) + buf, err := ioutil.ReadFile(f) + if err != nil { + t.Log(err) + return orig + } + rc, err := strconv.Atoi(string(buf)) + if err != nil { + t.Log(err) + return orig + } + t.Logf("Retrieved exit code %v from file", rc) + return int64(rc) +} + // waitForContainer waits until a container has exited func waitForContainer(t *testing.T, cli *client.Client, ID string, timeout int64) int64 { //ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second) //defer cancel() rc, err := cli.ContainerWait(context.Background(), ID) + + // COVERAGE: When running coverage, the exit code is written to a file, + // to allow the coverage to be generated (which doesn't happen for non-zero + // exit codes) + rc = getCoverageExitCode(t, rc) + // err := <-errC if err != nil { t.Fatal(err)