Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dev: improve runner to run dir with go.mod #3124

Merged
merged 1 commit into from Aug 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 29 additions & 6 deletions test/linters_test.go
@@ -1,13 +1,17 @@
package test

import (
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/golangci/golangci-lint/pkg/logutils"
"github.com/golangci/golangci-lint/test/testshared"
)

Expand All @@ -28,18 +32,32 @@ func testSourcesFromDir(t *testing.T, dir string) {

sources := findSources(t, dir, "*.go")

testshared.InstallGolangciLint(t)
binPath := testshared.InstallGolangciLint(t)

for _, s := range sources {
s := s
t.Run(filepath.Base(s), func(subTest *testing.T) {
cwd, err := os.Getwd()
require.NoError(t, err)
t.Cleanup(func() { _ = os.Chdir(cwd) })

err = os.Chdir(dir)
require.NoError(t, err)

log := logutils.NewStderrLog("test")
log.SetLevel(logutils.LogLevelInfo)

for _, source := range sources {
source := source
t.Run(filepath.Base(source), func(subTest *testing.T) {
subTest.Parallel()
testOneSource(subTest, s)

rel, err := filepath.Rel(dir, sources[0])
require.NoError(t, err)

testOneSource(subTest, log, binPath, rel)
})
}
}

func testOneSource(t *testing.T, sourcePath string) {
func testOneSource(t *testing.T, log *logutils.StderrLog, binPath, sourcePath string) {
t.Helper()

rc := testshared.ParseTestDirectives(t, sourcePath)
Expand All @@ -62,15 +80,20 @@ func testOneSource(t *testing.T, sourcePath string) {
}

cmd := testshared.NewRunnerBuilder(t).
WithBinPath(binPath).
WithNoParallelRunners().
WithArgs(caseArgs...).
WithRunContext(rc).
WithTargetPath(sourcePath).
Runner().
Command()

startedAt := time.Now()

output, err := cmd.CombinedOutput()

log.Infof("ran [%s] in %s", strings.Join(cmd.Args, " "), time.Since(startedAt))

// The returned error will be nil if the test file does not have any issues
// and thus the linter exits with exit code 0.
// So perform the additional assertions only if the error is non-nil.
Expand Down
6 changes: 0 additions & 6 deletions test/testshared/analysis.go
Expand Up @@ -6,7 +6,6 @@ import (
"go/parser"
"go/token"
"os"
"path/filepath"
"regexp"
"sort"
"strconv"
Expand All @@ -21,8 +20,6 @@ import (

const keyword = "want"

const testdataDir = "testdata"

type jsonResult struct {
Issues []*result.Issue
}
Expand Down Expand Up @@ -52,9 +49,6 @@ func Analyze(t *testing.T, sourcePath string, rawData []byte) {
require.NoError(t, err)

for _, issue := range reportData.Issues {
if !strings.HasPrefix(issue.Pos.Filename, testdataDir) {
issue.Pos.Filename = filepath.Join(testdataDir, issue.Pos.Filename)
}
checkMessage(t, want, issue.Pos, "diagnostic", issue.FromLinter, issue.Text)
}

Expand Down
45 changes: 27 additions & 18 deletions test/testshared/runner.go
Expand Up @@ -17,12 +17,13 @@ import (
"github.com/golangci/golangci-lint/pkg/logutils"
)

const binName = "../golangci-lint"
const defaultBinPath = "../golangci-lint"

type RunnerBuilder struct {
tb testing.TB
log logutils.Log

binPath string
command string
env []string

Expand All @@ -42,11 +43,18 @@ func NewRunnerBuilder(tb testing.TB) *RunnerBuilder {
return &RunnerBuilder{
tb: tb,
log: log,
binPath: defaultBinPath,
command: "run",
allowParallelRunners: true,
}
}

func (b *RunnerBuilder) WithBinPath(binPath string) *RunnerBuilder {
b.binPath = binPath

return b
}

func (b *RunnerBuilder) WithCommand(command string) *RunnerBuilder {
b.command = command

Expand Down Expand Up @@ -162,6 +170,7 @@ func (b *RunnerBuilder) Runner() *Runner {
}

return &Runner{
binPath: b.binPath,
log: b.log,
tb: b.tb,
env: b.env,
Expand All @@ -174,6 +183,7 @@ type Runner struct {
log logutils.Log
tb testing.TB

binPath string
env []string
command string
args []string
Expand All @@ -197,11 +207,10 @@ func (r *Runner) Run() *RunnerResult {
runArgs := append([]string{r.command}, r.args...)

defer func(startedAt time.Time) {
r.log.Infof("ran [%s %s] in %s", binName, strings.Join(runArgs, " "), time.Since(startedAt))
r.log.Infof("ran [%s %s] in %s", r.binPath, strings.Join(runArgs, " "), time.Since(startedAt))
}(time.Now())

cmd := exec.Command(binName, runArgs...)
cmd.Env = append(os.Environ(), r.env...)
cmd := r.Command()

out, err := cmd.CombinedOutput()
if err != nil {
Expand Down Expand Up @@ -239,11 +248,8 @@ func (r *Runner) Command() *exec.Cmd {

runArgs := append([]string{r.command}, r.args...)

defer func(startedAt time.Time) {
r.log.Infof("ran [../golangci-lint %s] in %s", strings.Join(runArgs, " "), time.Since(startedAt))
}(time.Now())

cmd := exec.Command("../golangci-lint", runArgs...)
//nolint:gosec
cmd := exec.Command(r.binPath, runArgs...)
cmd.Env = append(os.Environ(), r.env...)

return cmd
Expand Down Expand Up @@ -311,19 +317,22 @@ func (r *RunnerResult) ExpectHasIssue(issueText string) *RunnerResult {
return r.ExpectExitCode(exitcodes.IssuesFound).ExpectOutputContains(issueText)
}

func InstallGolangciLint(tb testing.TB) {
func InstallGolangciLint(tb testing.TB) string {
tb.Helper()

if os.Getenv("GOLANGCI_LINT_INSTALLED") == "true" {
return
}
if os.Getenv("GOLANGCI_LINT_INSTALLED") != "true" {
cmd := exec.Command("make", "-C", "..", "build")

cmd := exec.Command("make", "-C", "..", "build")
output, err := cmd.CombinedOutput()
if err != nil {
tb.Log(string(output))
}

output, err := cmd.CombinedOutput()
if err != nil {
tb.Log(string(output))
require.NoError(tb, err, "Can't go install golangci-lint")
}

require.NoError(tb, err, "Can't go install golangci-lint")
abs, err := filepath.Abs(defaultBinPath)
require.NoError(tb, err)

return abs
}