diff --git a/internal/runner/analyze.go b/internal/runner/analyze.go index f5c6b10..16393f4 100644 --- a/internal/runner/analyze.go +++ b/internal/runner/analyze.go @@ -260,16 +260,13 @@ func Analyze(iterations []io.Reader, slowThreshold time.Duration) (*Report, LogM interner := newStringInterner() for i, r := range iterations { if err := scanIterationJSONL(r, i, aggs, nil, slowThreshold, interner, tmpDir); err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } if err := reattributeTimeoutsIter(aggs, i, tmpDir); err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } if err := flushOutputsToDisk(i, aggs, tmpDir); err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } } rep, logs := buildReportFromAggs(aggs, len(iterations), slowThreshold) @@ -806,8 +803,7 @@ func AnalyzeResults(resultsDir string, slowThreshold time.Duration) (*Report, Lo matches, err := filepath.Glob(filepath.Join(resultsDir, "iteration-*.log.jsonl")) if err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } sort.Slice(matches, func(i, j int) bool { return iterNumber(matches[i]) < iterNumber(matches[j]) @@ -823,16 +819,13 @@ func AnalyzeResults(resultsDir string, slowThreshold time.Duration) (*Report, Lo defer func() { _ = f.Close() }() return scanIterationJSONL(f, i, aggs, nil, slowThreshold, interner, tmpDir) }(); err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } if err := reattributeTimeoutsIter(aggs, i, tmpDir); err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } if err := flushOutputsToDisk(i, aggs, tmpDir); err != nil { - cleanup() - return nil, nil, nil, err + return nil, nil, cleanup, err } } rep, logs := buildReportFromAggs(aggs, len(matches), slowThreshold) diff --git a/internal/runner/analyze_bench_test.go b/internal/runner/analyze_bench_test.go index ce47441..c224ae3 100644 --- a/internal/runner/analyze_bench_test.go +++ b/internal/runner/analyze_bench_test.go @@ -41,10 +41,13 @@ func BenchmarkAnalyze_RealThreeIterations(b *testing.B) { for i, p := range payloads { rs[i] = bytes.NewReader(p) } - _, _, _, err := Analyze(rs, benchSlowThreshold) + _, _, cleanup, err := Analyze(rs, benchSlowThreshold) if err != nil { b.Fatal(err) } + if cleanup != nil { + cleanup() + } } } @@ -76,15 +79,20 @@ func BenchmarkAnalyzeResults_RealDir(b *testing.B) { for _, p := range payloads { total += int64(len(p)) } - if _, _, _, err := AnalyzeResults(dir, benchSlowThreshold); err != nil { + if _, _, cleanup, err := AnalyzeResults(dir, benchSlowThreshold); err != nil { b.Fatalf("warm-up AnalyzeResults: %v", err) + } else if cleanup != nil { + cleanup() } b.ReportAllocs() b.SetBytes(total) for b.Loop() { - _, _, _, err := AnalyzeResults(dir, benchSlowThreshold) + _, _, cleanup, err := AnalyzeResults(dir, benchSlowThreshold) if err != nil { b.Fatal(err) } + if cleanup != nil { + cleanup() + } } } diff --git a/internal/runner/analyze_files_test.go b/internal/runner/analyze_files_test.go index 4bb257c..411b72d 100644 --- a/internal/runner/analyze_files_test.go +++ b/internal/runner/analyze_files_test.go @@ -19,8 +19,7 @@ func TestWriteLogFiles(t *testing.T) { {"Action":"fail","Package":"github.com/foo/bar","Test":"TestFail","Elapsed":0.1} ` dir := t.TempDir() - rep, logs, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iter), 30*time.Second) require.Len(t, rep.Failures, 1) require.NoError(t, WriteLogFiles(dir, rep, logs)) @@ -48,8 +47,7 @@ func TestWriteLogFilesWritesOnlyProblemIterations(t *testing.T) { `, } dir := t.TempDir() - rep, logs, _, err := Analyze(readers(iters...), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iters...), 30*time.Second) require.Len(t, rep.Flakes, 1) require.NoError(t, WriteLogFiles(dir, rep, logs)) @@ -84,8 +82,7 @@ func TestWriteLogFilesCompressesSlowIterations(t *testing.T) { `, } dir := t.TempDir() - rep, logs, _, err := Analyze(readers(iters...), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iters...), 30*time.Second) require.Len(t, rep.Slow, 1) require.NoError(t, WriteLogFiles(dir, rep, logs)) @@ -103,8 +100,7 @@ func TestWriteLogFilesTruncatesLongFilenames(t *testing.T) { {"Action":"fail","Package":"github.com/foo/bar","Test":"` + longTest + `","Elapsed":0.1} ` dir := t.TempDir() - rep, logs, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iter), 30*time.Second) require.Len(t, rep.Failures, 1) require.NoError(t, WriteLogFiles(dir, rep, logs)) @@ -155,8 +151,7 @@ func TestWriteLogFilesNoLogsForNonFlaggedTests(t *testing.T) { {"Action":"pass","Package":"p","Test":"T","Elapsed":0.01} ` dir := t.TempDir() - rep, logs, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iter), 30*time.Second) assert.Empty(t, rep.Flakes) assert.Empty(t, rep.Failures) assert.Empty(t, rep.Timeouts) @@ -174,8 +169,7 @@ func TestWriteLogFilesSkipsMissingTempPath(t *testing.T) { {"Action":"fail","Package":"p","Test":"T","Elapsed":0.01} ` dir := t.TempDir() - rep, logs, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iter), 30*time.Second) require.Len(t, rep.Failures, 1) key := testKey{Package: "p", Test: "T"} @@ -208,8 +202,7 @@ func TestWriteCSV(t *testing.T) { `, } dir := t.TempDir() - rep, _, _, err := Analyze(readers(iters...), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iters...), 30*time.Second) require.NoError(t, WriteCSV(dir, rep)) f, err := os.Open(filepath.Join(dir, "report.csv")) //nolint:gosec // G304: path from filepath.Join @@ -249,8 +242,7 @@ func TestWriteCSVRenamesSlowWhenAlsoTimeout(t *testing.T) { {"Action":"fail","Package":"p","Test":"T","Elapsed":600.0} ` dir := t.TempDir() - rep, _, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iter), 30*time.Second) require.NoError(t, WriteCSV(dir, rep)) b, err := os.ReadFile(filepath.Join(dir, "report.csv")) //nolint:gosec // G304: path from filepath.Join diff --git a/internal/runner/analyze_mem_test.go b/internal/runner/analyze_mem_test.go index bb66ae3..56706ab 100644 --- a/internal/runner/analyze_mem_test.go +++ b/internal/runner/analyze_mem_test.go @@ -40,8 +40,7 @@ func TestAnalyzeMemory_Limit(t *testing.T) { var before, after runtime.MemStats runtime.ReadMemStats(&before) - rep, _, _, err := Analyze(readers, 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers, 30*time.Second) runtime.ReadMemStats(&after) diff --git a/internal/runner/analyze_test.go b/internal/runner/analyze_test.go index c39bdaf..e338cb6 100644 --- a/internal/runner/analyze_test.go +++ b/internal/runner/analyze_test.go @@ -28,6 +28,26 @@ func readLogMapContent(t *testing.T, path string) string { return string(b) } +func analyze(t *testing.T, iterations []io.Reader, slowThreshold time.Duration) (*Report, LogMap) { + t.Helper() + rep, logs, cleanup, err := Analyze(iterations, slowThreshold) + if cleanup != nil { + t.Cleanup(cleanup) + } + require.NoError(t, err) + return rep, logs +} + +func analyzeResults(t *testing.T, resultsDir string, slowThreshold time.Duration) (*Report, LogMap) { + t.Helper() + rep, logs, cleanup, err := AnalyzeResults(resultsDir, slowThreshold) + if cleanup != nil { + t.Cleanup(cleanup) + } + require.NoError(t, err) + return rep, logs +} + func readers(iters ...string) []io.Reader { rs := make([]io.Reader, len(iters)) for i, s := range iters { @@ -43,8 +63,7 @@ func TestAnalyzePackageLevelTimeoutIterationSummary(t *testing.T) { {"Action":"fail","Package":"pkg/hang","Elapsed":120.0} `, } - rep, _, _, err := Analyze(readers(iterations...), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iterations...), 30*time.Second) require.Len(t, rep.IterationSummaries, 1) assert.Equal(t, "timeout", rep.IterationSummaries[0].Result) } @@ -55,8 +74,7 @@ func TestAnalyzeHandlesLongLines(t *testing.T) { over := strings.Repeat("x", bufio.MaxScanTokenSize+1) + "\n" iter := `{"Action":"pass","Package":"p","Test":"T","Elapsed":0.01}` + "\n" + over + `{"Action":"pass","Package":"p","Test":"T2","Elapsed":0.01}` + "\n" - rep, _, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iter), 30*time.Second) require.NotNil(t, rep) require.Len(t, rep.IterationSummaries, 1) assert.Equal(t, "pass", rep.IterationSummaries[0].Result) @@ -72,8 +90,7 @@ badpkg.go:1:2: undefined: MissingType ` + `{"Action":"output","Package":"example.com/badpkg","Output":"# example.com/badpkg\n"} {"Action":"fail","Package":"example.com/badpkg","Elapsed":0.0} ` - rep, _, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iter), 30*time.Second) require.Len(t, rep.Failures, 1) assert.Equal(t, "example.com/badpkg", rep.Failures[0].Package) assert.Empty(t, rep.Failures[0].Test) @@ -126,8 +143,7 @@ func TestAnalyzeTestdataFiles(t *testing.T) { require.NoError(t, err) defer func() { _ = f.Close() }() - rep, _, _, err := Analyze([]io.Reader{f}, 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, []io.Reader{f}, 30*time.Second) require.Len(t, rep.IterationSummaries, 1) assert.Equal(t, tc.wantResult, rep.IterationSummaries[0].Result) @@ -167,8 +183,7 @@ func TestAnalyzePackageLevelFailureIterationSummary(t *testing.T) { iterations := []string{ `{"Action":"fail","Package":"pkg/build","Elapsed":0.0}` + "\n", } - rep, _, _, err := Analyze(readers(iterations...), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iterations...), 30*time.Second) require.Len(t, rep.IterationSummaries, 1) assert.Equal(t, "fail", rep.IterationSummaries[0].Result) assert.Equal(t, []string{"pkg/build"}, rep.IterationSummaries[0].FailingTests) @@ -454,8 +469,7 @@ func TestAnalyze(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers(tc.iterations...), tc.slowThreshold) - require.NoError(t, err) + rep, _ := analyze(t, readers(tc.iterations...), tc.slowThreshold) assert.Equal(t, len(tc.iterations), rep.Iterations) assert.Equal(t, tc.wantFlakes, publicTestEntries(rep.Flakes), "flakes") assert.Equal(t, tc.wantFailures, publicTestEntries(rep.Failures), "failures") @@ -629,8 +643,7 @@ func TestReportSummary(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers(tc.iterations...), tc.slowThreshold) - require.NoError(t, err) + rep, _ := analyze(t, readers(tc.iterations...), tc.slowThreshold) tc.check(t, rep.Summary) }) } @@ -646,11 +659,10 @@ func TestPrintSummaryOverallContains(t *testing.T) { { name: "flake_rates_and_slow_line", prep: func(t *testing.T) *Report { - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) return rep }, needle: []string{ @@ -666,11 +678,10 @@ func TestPrintSummaryOverallContains(t *testing.T) { { name: "iteration_wall_clock_runtimes", prep: func(t *testing.T) *Report { - rep, _, _, err := Analyze( + rep, _ := analyze(t, readers(`{"Action":"pass","Package":"p","Test":"T","Elapsed":0.01}`), 30*time.Second, ) - require.NoError(t, err) require.NotNil(t, rep.Summary) rep.IterationSummaries[0].Duration = 5 * time.Second fillIterationRuntimeSummary(rep) @@ -699,11 +710,10 @@ func TestPrintSummaryOverallContains(t *testing.T) { func TestPrintSummaryOverall_usesSeverityColors(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) require.NotNil(t, rep.Summary) s := rep.Summary @@ -798,8 +808,7 @@ func TestAnalyzeCapturesLogsForFailures(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() - rep, logs, _, err := Analyze(readers(tc.iterations...), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(tc.iterations...), 30*time.Second) var entries []TestEntry switch tc.category { case "flakes": @@ -828,8 +837,7 @@ func TestAnalyzeReattributesTimeoutToRunningTests(t *testing.T) { {"Action":"output","Package":"p","Test":"TestFast","Output":"goroutine 1 [chan receive]:\n"} {"Action":"fail","Package":"p","Elapsed":5.01} ` - rep, logs, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, logs := analyze(t, readers(iter), 30*time.Second) names := make([]string, 0, len(rep.Timeouts)) for _, e := range rep.Timeouts { @@ -853,8 +861,7 @@ func TestAnalyzeKeepsTimeoutOnCulpritWhenItWasTheReportedTest(t *testing.T) { {"Action":"output","Package":"p","Test":"TestSlow","Output":"\t\tTestSlow (5s)\n"} {"Action":"fail","Package":"p","Elapsed":5.01} ` - rep, _, _, err := Analyze(readers(iter), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(iter), 30*time.Second) require.Len(t, rep.Timeouts, 1) assert.Equal(t, "TestSlow", rep.Timeouts[0].Test) } @@ -996,8 +1003,7 @@ func TestAnalyzeResultsRoundtrip(t *testing.T) { must(t, os.WriteFile(filepath.Join(dir, "iteration-1.log.jsonl"), []byte(`{"Action":"pass","Package":"pkg/z","Test":"TestFlaky","Elapsed":0.1}`+"\n"), 0600)) - rep, _, _, err := AnalyzeResults(dir, 30*time.Second) - require.NoError(t, err) + rep, _ := analyzeResults(t, dir, 30*time.Second) require.Len(t, rep.Flakes, 1) assert.Equal(t, "TestFlaky", rep.Flakes[0].Test) @@ -1076,8 +1082,7 @@ func TestAnalyzeIterationSummaries(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers(tc.iterations...), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(tc.iterations...), 30*time.Second) require.Len(t, rep.IterationSummaries, len(tc.want)) // Strip Duration/ShuffleSeed — set by runner, not Analyze. got := make([]IterationSummary, len(rep.IterationSummaries)) @@ -1094,8 +1099,7 @@ func TestAnalyzeSkipsMalformedLines(t *testing.T) { input := `not json at all {"Action":"pass","Package":"p","Test":"T","Elapsed":0.01} ` - rep, _, _, err := Analyze(readers(input), 30*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, readers(input), 30*time.Second) assert.Empty(t, rep.Flakes) assert.Empty(t, rep.Failures) } @@ -1214,11 +1218,10 @@ func TestFillIterationRuntimeSummaryTable(t *testing.T) { func TestMarshalAIDiagnoseComplete_fromAnalyze(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"p","Test":"T","Elapsed":0.1}`, `{"Action":"pass","Package":"p","Test":"T","Elapsed":0.1}`, ), 30*time.Second) - require.NoError(t, err) raw, err := marshalAIDiagnoseComplete("/tmp/results", "/tmp/results/report.json", "/tmp/results/trace.json", rep) require.NoError(t, err) @@ -1237,8 +1240,7 @@ func TestAnalyzeSlowTestsNoDuplication(t *testing.T) { iter := `{"Action":"pass","Package":"pkg/slow","Test":"TestSlow","Elapsed":10.0} {"Action":"pass","Package":"pkg/slow","Elapsed":10.0} ` - rep, _, _, err := Analyze([]io.Reader{strings.NewReader(iter)}, 1*time.Second) - require.NoError(t, err) + rep, _ := analyze(t, []io.Reader{strings.NewReader(iter)}, 1*time.Second) require.Len(t, rep.Slow, 1) assert.Equal(t, "pkg/slow", rep.Slow[0].Package) diff --git a/internal/runner/diagnose_output_test.go b/internal/runner/diagnose_output_test.go index d0e4454..f8a9d63 100644 --- a/internal/runner/diagnose_output_test.go +++ b/internal/runner/diagnose_output_test.go @@ -17,11 +17,10 @@ import ( func TestMarshalAIDiagnoseComplete(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) resultsDir := t.TempDir() reportPath := filepath.Join(resultsDir, "report.json") @@ -93,11 +92,10 @@ func TestFormatSummaryFlatLine(t *testing.T) { func TestPrintSummaryVerdict_noIssues(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze( + rep, _ := analyze(t, readers(`{"Action":"pass","Package":"p","Test":"T","Elapsed":0.01}`), 30*time.Second, ) - require.NoError(t, err) var buf strings.Builder PrintSummary(&buf, rep) plain := stripANSI(buf.String()) diff --git a/internal/runner/diagnose_overall_table_test.go b/internal/runner/diagnose_overall_table_test.go index 94e5504..e5f373a 100644 --- a/internal/runner/diagnose_overall_table_test.go +++ b/internal/runner/diagnose_overall_table_test.go @@ -14,11 +14,10 @@ import ( func TestRenderOverallRatesTable_allClear(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze( + rep, _ := analyze(t, readers(`{"Action":"pass","Package":"p","Test":"T","Elapsed":0.01}`), 30*time.Second, ) - require.NoError(t, err) plain := stripANSI(renderOverallRatesTable(rep)) assert.Contains(t, plain, "Count") assert.Contains(t, plain, "Rate") @@ -28,11 +27,10 @@ func TestRenderOverallRatesTable_allClear(t *testing.T) { func TestRenderOverallRatesTable_flakyRow(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) plain := stripANSI(renderOverallRatesTable(rep)) assert.Contains(t, plain, "Broken Tests") @@ -44,11 +42,10 @@ func TestRenderOverallRatesTable_flakyRow(t *testing.T) { func TestOverallScopeAndWallLine(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze( + rep, _ := analyze(t, readers(`{"Action":"pass","Package":"p","Test":"T","Elapsed":0.01}`), 30*time.Second, ) - require.NoError(t, err) require.NotNil(t, rep.Summary) rep.IterationSummaries[0].Duration = 5 * time.Second fillIterationRuntimeSummary(rep) @@ -104,11 +101,10 @@ func TestBuildOverallRateRows_flakyIterationsLast(t *testing.T) { func TestFormatOverallFlakyIterRate_CIColoredByGap(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) require.NotNil(t, rep.Summary) gap := *rep.Summary.FlakeIterationFailRateUpper - *rep.Summary.FlakeIterationFailRateLower diff --git a/internal/runner/stats_test.go b/internal/runner/stats_test.go index 37d2566..858db1f 100644 --- a/internal/runner/stats_test.go +++ b/internal/runner/stats_test.go @@ -117,11 +117,10 @@ func TestFormatFlakyTestLine_packageLevel_includesCI(t *testing.T) { func TestReportSummary_hasCI(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) require.NotNil(t, rep.Summary) s := rep.Summary @@ -140,11 +139,10 @@ func TestReportSummary_hasCI(t *testing.T) { func TestPrintOverallStats_includesCI(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"fail","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) var buf strings.Builder PrintSummary(&buf, rep) @@ -155,11 +153,10 @@ func TestPrintOverallStats_includesCI(t *testing.T) { func TestReportSummary_hasCI_noFlakes(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) require.NotNil(t, rep.Summary) s := rep.Summary @@ -171,11 +168,10 @@ func TestReportSummary_hasCI_noFlakes(t *testing.T) { func TestPrintOverallStats_includesCI_noFlakes(t *testing.T) { t.Parallel() - rep, _, _, err := Analyze(readers( + rep, _ := analyze(t, readers( `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.5}`, `{"Action":"pass","Package":"pkg/foo","Test":"TestX","Elapsed":0.4}`, ), 30*time.Second) - require.NoError(t, err) var buf strings.Builder PrintSummary(&buf, rep)