Skip to content

Commit fdc9708

Browse files
committed
Add debug full output
1 parent 8e28a77 commit fdc9708

File tree

4 files changed

+63
-44
lines changed

4 files changed

+63
-44
lines changed

tools/flakeguard/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
tmp_test_flaky_state
2-
flaky_test_results_*.json
2+
test_results_*.json
3+
debug*.json

tools/flakeguard/runner/flaky_test_package/flaky_test.go renamed to tools/flakeguard/runner/flaky_test_package/example_tests_test.go

File renamed without changes.

tools/flakeguard/runner/runner.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ type Runner struct {
2929
SkipTests []string // Test names to exclude.
3030
SelectedTestPackages []string // Explicitly selected packages to run.
3131
CollectRawOutput bool // Collect test output for later inspection.
32-
rawOutput bytes.Buffer
32+
rawOutputs map[string]*bytes.Buffer
3333
}
3434

3535
// RunTests executes the tests for each provided package and aggregates all results.
@@ -53,8 +53,9 @@ func (r *Runner) RunTests() ([]reports.TestResult, error) {
5353
}
5454

5555
// RawOutput retrieves the raw output from the test runs, if CollectRawOutput enabled.
56-
func (r *Runner) RawOutput() bytes.Buffer {
57-
return r.rawOutput
56+
// packageName : raw output
57+
func (r *Runner) RawOutputs() map[string]*bytes.Buffer {
58+
return r.rawOutputs
5859
}
5960

6061
type exitCoder interface {
@@ -87,14 +88,16 @@ func (r *Runner) runTests(packageName string) (string, bool, error) {
8788
cmd := exec.Command("go", args...)
8889
cmd.Dir = r.ProjectPath
8990
if r.CollectRawOutput {
90-
cmd.Stdout = io.MultiWriter(tmpFile, &r.rawOutput)
91-
cmd.Stderr = io.MultiWriter(tmpFile, &r.rawOutput)
91+
if r.rawOutputs == nil {
92+
r.rawOutputs = make(map[string]*bytes.Buffer)
93+
}
94+
r.rawOutputs[packageName] = &bytes.Buffer{}
95+
cmd.Stdout = io.MultiWriter(tmpFile, r.rawOutputs[packageName])
96+
cmd.Stderr = io.MultiWriter(tmpFile, r.rawOutputs[packageName])
9297
} else {
9398
cmd.Stdout = tmpFile
9499
cmd.Stderr = tmpFile
95100
}
96-
cmd.Stdout = tmpFile
97-
cmd.Stderr = tmpFile
98101

99102
err = cmd.Run()
100103
if err != nil {
@@ -201,7 +204,7 @@ func parseTestResults(filePaths []string) ([]reports.TestResult, error) {
201204
result.Failures++
202205
}
203206
case "output":
204-
// Output already handled above
207+
// plain output already handled above
205208
if panicRe.MatchString(entry.Output) {
206209
if entry.Test != "" {
207210
// Test-level panic

tools/flakeguard/runner/runner_test.go

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,25 @@ import (
44
"encoding/json"
55
"fmt"
66
"os"
7+
"path/filepath"
78
"testing"
89

910
"github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard/reports"
1011
"github.com/stretchr/testify/assert"
1112
"github.com/stretchr/testify/require"
1213
)
1314

14-
type MockGoRunner struct {
15-
RunFunc func(dir string, args []string) (string, bool, error)
16-
}
17-
18-
func (m MockGoRunner) RunCommand(dir string, args []string) (string, bool, error) {
19-
return m.RunFunc(dir, args)
20-
}
21-
2215
type expectedTestResult struct {
2316
TestResult *reports.TestResult
2417
seen bool
2518
}
2619

2720
var (
28-
defaultRuns = 5
29-
defaultTestRunner = Runner{
21+
defaultRuns = 5
22+
)
23+
24+
func TestRunDefault(t *testing.T) {
25+
defaultTestRunner := Runner{
3026
ProjectPath: "./",
3127
Verbose: true,
3228
RunCount: defaultRuns,
@@ -36,9 +32,7 @@ var (
3632
SelectedTestPackages: []string{"./flaky_test_package"},
3733
CollectRawOutput: true,
3834
}
39-
)
4035

41-
func TestRunDefault(t *testing.T) {
4236
expectedResults := map[string]*expectedTestResult{
4337
"TestFlaky": {
4438
TestResult: &reports.TestResult{
@@ -77,16 +71,7 @@ func TestRunDefault(t *testing.T) {
7771

7872
testResults, err := defaultTestRunner.RunTests()
7973
require.NoError(t, err)
80-
t.Cleanup(func() {
81-
if t.Failed() {
82-
resultsFileName := fmt.Sprintf("flaky_test_results_%s.json", t.Name())
83-
t.Logf("Writing test results to %s", resultsFileName)
84-
jsonResults, err := json.Marshal(testResults)
85-
require.NoError(t, err)
86-
err = os.WriteFile(resultsFileName, jsonResults, 0644) //nolint:gosec
87-
require.NoError(t, err)
88-
}
89-
})
74+
cleanup(t, testResults, defaultTestRunner)
9075

9176
for _, result := range testResults {
9277
t.Run(fmt.Sprintf("checking results of %s", result.TestName), func(t *testing.T) {
@@ -124,8 +109,16 @@ func TestRunDefault(t *testing.T) {
124109
}
125110

126111
func TestRunWithPanics(t *testing.T) {
127-
panicRunner := defaultTestRunner
128-
panicRunner.SkipTests = []string{}
112+
panicTestRunner := Runner{
113+
ProjectPath: "./",
114+
Verbose: true,
115+
RunCount: defaultRuns,
116+
UseRace: false,
117+
SkipTests: []string{},
118+
FailFast: false,
119+
SelectedTestPackages: []string{"./flaky_test_package"},
120+
CollectRawOutput: true,
121+
}
129122

130123
expectedResults := map[string]*expectedTestResult{
131124
"TestFlaky": {
@@ -170,18 +163,9 @@ func TestRunWithPanics(t *testing.T) {
170163
},
171164
}
172165

173-
testResults, err := panicRunner.RunTests()
166+
testResults, err := panicTestRunner.RunTests()
174167
require.NoError(t, err)
175-
t.Cleanup(func() {
176-
if t.Failed() {
177-
resultsFileName := fmt.Sprintf("flaky_test_results_%s.json", t.Name())
178-
t.Logf("Writing test results to %s", resultsFileName)
179-
jsonResults, err := json.Marshal(testResults)
180-
require.NoError(t, err)
181-
err = os.WriteFile(resultsFileName, jsonResults, 0644) //nolint:gosec
182-
require.NoError(t, err)
183-
}
184-
})
168+
cleanup(t, testResults, panicTestRunner)
185169

186170
for _, result := range testResults {
187171
t.Run(fmt.Sprintf("checking results of %s", result.TestName), func(t *testing.T) {
@@ -218,3 +202,34 @@ func TestRunWithPanics(t *testing.T) {
218202
assert.True(t, expected.seen, "expected test '%s' not found in test runs", expected.TestResult.TestName)
219203
}
220204
}
205+
206+
func cleanup(t *testing.T, testResults []reports.TestResult, runner Runner) {
207+
t.Helper()
208+
209+
t.Cleanup(func() {
210+
if t.Failed() {
211+
resultsFileName := fmt.Sprintf("debug_test_results_%s.json", t.Name())
212+
t.Logf("Writing test results to %s", resultsFileName)
213+
jsonResults, err := json.Marshal(testResults)
214+
if err != nil {
215+
t.Logf("error marshalling test results: %v", err)
216+
}
217+
err = os.WriteFile(resultsFileName, jsonResults, 0644) //nolint:gosec
218+
if err != nil {
219+
t.Logf("error writing test results: %v", err)
220+
}
221+
if len(runner.RawOutputs()) == 0 {
222+
t.Logf("WARN: no raw output to write")
223+
}
224+
for packageName, rawOutput := range runner.RawOutputs() {
225+
saniPackageName := filepath.Base(packageName)
226+
rawOutputFileName := fmt.Sprintf("debug_raw_output_%s_%s.json", t.Name(), saniPackageName)
227+
t.Logf("Writing raw output to %s", rawOutputFileName)
228+
err = os.WriteFile(rawOutputFileName, rawOutput.Bytes(), 0644) //nolint:gosec
229+
if err != nil {
230+
t.Logf("error writing raw output: %v", err)
231+
}
232+
}
233+
}
234+
})
235+
}

0 commit comments

Comments
 (0)