diff --git a/cmd/tool/slowest/ast.go b/cmd/tool/slowest/ast.go index 5aaf6267..f556806b 100644 --- a/cmd/tool/slowest/ast.go +++ b/cmd/tool/slowest/ast.go @@ -25,7 +25,7 @@ func writeTestSkip(tcs []testjson.TestCase, skipStmt ast.Stmt) error { pkgNames, index := testNamesByPkgName(tcs) pkgs, err := packages.Load(&cfg, pkgNames...) if err != nil { - return fmt.Errorf("failed to load packages: %w", err) + return fmt.Errorf("failed to load packages: %v", err) } for _, pkg := range pkgs { @@ -46,7 +46,7 @@ func writeTestSkip(tcs []testjson.TestCase, skipStmt ast.Stmt) error { continue } if err := writeFile(path, file, fset); err != nil { - return fmt.Errorf("failed to write ast to file %v: %w", path, err) + return fmt.Errorf("failed to write ast to file %v: %v", path, err) } } } @@ -66,7 +66,11 @@ func writeFile(path string, file *ast.File, fset *token.FileSet) error { if err != nil { return err } - defer fh.Close() + defer func() { + if err := fh.Close(); err != nil { + log.Errorf("Failed to close file %v: %v", path, err) + } + }() return format.Node(fh, fset, file) } @@ -133,7 +137,7 @@ func testNamesByPkgName(tcs []testjson.TestCase) ([]string, map[string]set) { } func isSubTest(name string) bool { - return strings.Index(name, "/") > -1 + return strings.Contains(name, "/") } func errPkgLoad(pkg *packages.Package) error { diff --git a/cmd/tool/slowest/ast_test.go b/cmd/tool/slowest/ast_test.go index ed5fb826..2d58b9a1 100644 --- a/cmd/tool/slowest/ast_test.go +++ b/cmd/tool/slowest/ast_test.go @@ -16,6 +16,7 @@ func TestParseSkipStatement_Preset_testingShort(t *testing.T) { t.Skip("too slow for testing.Short") }` buf := new(bytes.Buffer) - format.Node(buf, token.NewFileSet(), stmt) + err = format.Node(buf, token.NewFileSet(), stmt) + assert.NilError(t, err) assert.DeepEqual(t, buf.String(), expected) } diff --git a/cmd/tool/slowest/slowest.go b/cmd/tool/slowest/slowest.go index 291c58d2..11afaf70 100644 --- a/cmd/tool/slowest/slowest.go +++ b/cmd/tool/slowest/slowest.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "io/ioutil" - "math" "os" "sort" "time" @@ -93,23 +92,27 @@ func run(opts *options) error { } in, err := jsonfileReader(opts.jsonfile) if err != nil { - return fmt.Errorf("failed to read jsonfile: %w", err) + return fmt.Errorf("failed to read jsonfile: %v", err) } - defer in.Close() + defer func() { + if err := in.Close(); err != nil { + log.Errorf("Failed to close file %v: %v", opts.jsonfile, err) + } + }() exec, err := testjson.ScanTestOutput(testjson.ScanConfig{ Stdout: in, Stderr: bytes.NewReader(nil), }) if err != nil { - return fmt.Errorf("failed to scan testjson: %w", err) + return fmt.Errorf("failed to scan testjson: %v", err) } tcs := slowTestCases(exec, opts.threshold) if opts.skipStatement != "" { skipStmt, err := parseSkipStatement(opts.skipStatement) if err != nil { - return fmt.Errorf("failed to parse skip expr: %w", err) + return fmt.Errorf("failed to parse skip expr: %v", err) } return writeTestSkip(tcs, skipStmt) } @@ -154,11 +157,12 @@ func aggregateTestCases(cases []testjson.TestCase) []testjson.TestCase { return cases } pkg := cases[0].Package + // nolint: prealloc // size is not predictable m := make(map[string][]time.Duration) for _, tc := range cases { m[tc.Test] = append(m[tc.Test], tc.Elapsed) } - var result []testjson.TestCase + result := make([]testjson.TestCase, 0, len(m)) for name, timing := range m { result = append(result, testjson.TestCase{ Package: pkg, @@ -179,7 +183,7 @@ func median(times []time.Duration) time.Duration { sort.Slice(times, func(i, j int) bool { return times[i] < times[j] }) - return times[int(math.Ceil(float64(len(times)/2)))] + return times[len(times)/2] } func jsonfileReader(v string) (io.ReadCloser, error) {