From b28bf5fbeeedc356718f8167a44a7bb764b63e14 Mon Sep 17 00:00:00 2001 From: golangci Date: Wed, 30 May 2018 09:45:08 +0300 Subject: [PATCH] #41: exit with code 4 if timeouted --- pkg/commands/run.go | 9 ++++++++- pkg/enabled_linters_test.go | 38 ++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/pkg/commands/run.go b/pkg/commands/run.go index 9cec4f2fc9a4..acf75ace0ca5 100644 --- a/pkg/commands/run.go +++ b/pkg/commands/run.go @@ -31,7 +31,10 @@ import ( "golang.org/x/tools/go/loader" ) -const exitCodeIfFailure = 3 +const ( + exitCodeIfFailure = 3 + exitCodeIfTimeout = 4 +) func (e *Executor) initRun() { var runCmd = &cobra.Command{ @@ -388,6 +391,10 @@ func (e *Executor) executeRun(cmd *cobra.Command, args []string) { e.exitCode = exitCodeIfFailure } } + + if e.exitCode == 0 && ctx.Err() != nil { + e.exitCode = exitCodeIfTimeout + } } func (e *Executor) parseConfig(cmd *cobra.Command) { diff --git a/pkg/enabled_linters_test.go b/pkg/enabled_linters_test.go index fca42d6d4afc..2ebf38ec415e 100644 --- a/pkg/enabled_linters_test.go +++ b/pkg/enabled_linters_test.go @@ -10,6 +10,8 @@ import ( "runtime" "strconv" "strings" + "sync" + "syscall" "testing" "time" @@ -20,6 +22,15 @@ import ( "github.com/stretchr/testify/assert" ) +var installOnce sync.Once + +func installBinary(t assert.TestingT) { + installOnce.Do(func() { + cmd := exec.Command("go", "install", filepath.Join("..", "cmd", binName)) + assert.NoError(t, cmd.Run(), "Can't go install %s", binName) + }) +} + func runGoErrchk(c *exec.Cmd, t *testing.T) { output, err := c.CombinedOutput() assert.NoError(t, err, "Output:\n%s", output) @@ -51,9 +62,30 @@ func TestSourcesFromTestdataWithIssuesDir(t *testing.T) { } } -func installBinary(t assert.TestingT) { - cmd := exec.Command("go", "install", filepath.Join("..", "cmd", binName)) - assert.NoError(t, cmd.Run(), "Can't go install %s", binName) +func TestDeadlineExitCode(t *testing.T) { + installBinary(t) + + exitCode := runGolangciLintGetExitCode(t, "--no-config", "--deadline=1ms") + assert.Equal(t, 4, exitCode) +} + +func runGolangciLintGetExitCode(t *testing.T, args ...string) int { + runArgs := append([]string{"run"}, args...) + cmd := exec.Command("golangci-lint", runArgs...) + err := cmd.Run() + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + ws := exitError.Sys().(syscall.WaitStatus) + return ws.ExitStatus() + } + + t.Fatalf("can't get error code from %s", err) + return -1 + } + + // success, exitCode should be 0 if go is ok + ws := cmd.ProcessState.Sys().(syscall.WaitStatus) + return ws.ExitStatus() } func testOneSource(t *testing.T, sourcePath string) {