From 8cf2584ce572a60a105e53f73d93a88916728a60 Mon Sep 17 00:00:00 2001 From: Mikhail Kornilovich Date: Wed, 10 Jun 2026 11:37:59 +0300 Subject: [PATCH] make max output settings --- dsl/ast.go | 4 ++++ dsl/parser.go | 11 +++++++++++ dsl/parser_misc_test.go | 18 ++++++++++++++++++ runner/runner.go | 8 ++++++-- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/dsl/ast.go b/dsl/ast.go index bd78861..c871327 100644 --- a/dsl/ast.go +++ b/dsl/ast.go @@ -19,6 +19,10 @@ type File struct { Binary string Sources string + // MaxOutput caps captured stdout/stderr per test (bytes). Zero means use the + // runner default. Raise it for suites whose expected output is large. + MaxOutput int64 + NormalizeCRLF bool TrimTrailingWS bool diff --git a/dsl/parser.go b/dsl/parser.go index b473ff6..cdcb20b 100644 --- a/dsl/parser.go +++ b/dsl/parser.go @@ -307,6 +307,17 @@ func (p *Parser) parseFile() (*File, error) { } f.MemoryLimit = n + case "max_output": + p.advance() + if _, err := p.expect(TOKEN_ASSIGN); err != nil { + return nil, err + } + n, err := p.parseSize() + if err != nil { + return nil, err + } + f.MaxOutput = n + case "group": g, err := p.parseGroup(f.Timeout, f.MemoryLimit) if err != nil { diff --git a/dsl/parser_misc_test.go b/dsl/parser_misc_test.go index 28cb01c..20ba627 100644 --- a/dsl/parser_misc_test.go +++ b/dsl/parser_misc_test.go @@ -37,6 +37,24 @@ group("g") { } } +func TestParseMaxOutput(t *testing.T) { + src := ` +build "make" +max_output = 64M +group("g") { + weight = 1.0 + test("t") { stdout = "ok\n" } +} +` + f, _, err := Parse(src) + if err != nil { + t.Fatalf("parse: %v", err) + } + if f.MaxOutput != 64*1024*1024 { + t.Errorf("MaxOutput = %d, want %d", f.MaxOutput, 64*1024*1024) + } +} + func TestParsePatternStageAllMode(t *testing.T) { src := ` build "make" diff --git a/runner/runner.go b/runner/runner.go index b20f7b8..c55d4a3 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -488,8 +488,12 @@ func (r *Runner) runTest(t *dsl.Test) *TestResult { cmd.Stdin = strings.NewReader(*t.Stdin) } - stdout := &cappedBuffer{limit: MaxOutputBytes} - stderr := &cappedBuffer{limit: MaxOutputBytes} + outLimit := MaxOutputBytes + if r.file.MaxOutput > 0 { + outLimit = int(r.file.MaxOutput) + } + stdout := &cappedBuffer{limit: outLimit} + stderr := &cappedBuffer{limit: outLimit} cmd.Stdout = stdout cmd.Stderr = stderr