When using --dump_output with file_test, dump stderr directly. (#3901)

Right now, debugging a crash means errs never flushes: it's buffered in
the string. As a consequence, -v doesn't print anything. By stopping the
output capture in --dump_output, it prints directly for debugging.
This commit is contained in:
Jon Ross-Perkins
2024-04-22 20:00:34 +00:00
committed by GitHub
parent 5694dd152e
commit 280a25b863
2 changed files with 14 additions and 6 deletions
+10 -6
View File
@@ -218,6 +218,7 @@ auto FileTestBase::Autoupdate() -> ErrorOr<bool> {
auto FileTestBase::DumpOutput() -> ErrorOr<Success> {
TestContext context;
context.capture_output = false;
std::string banner(79, '=');
banner.append("\n");
llvm::errs() << banner << "= " << test_name_ << "\n";
@@ -227,9 +228,7 @@ auto FileTestBase::DumpOutput() -> ErrorOr<Success> {
return ErrorBuilder() << "Error updating " << test_name_ << ": "
<< run_result.error();
}
llvm::errs() << banner << "= stderr\n"
<< banner << context.stderr << banner << "= stdout\n"
<< banner << context.stdout << banner << "= Exit with success: "
llvm::errs() << banner << context.stdout << banner << "= Exit with success: "
<< (context.run_result.success ? "true" : "false") << "\n"
<< banner;
return Success();
@@ -287,11 +286,16 @@ auto FileTestBase::ProcessTestFileAndRun(TestContext& context)
llvm::PrettyStackTraceProgram stack_trace_entry(
test_argv_for_stack_trace.size() - 1, test_argv_for_stack_trace.data());
// Capture trace streaming, but only when in debug mode.
// Prepare string streams to capture output. In order to address casting
// constraints, we split calls to Run as a ternary based on whether we want to
// capture output.
llvm::raw_svector_ostream stdout(context.stdout);
llvm::raw_svector_ostream stderr(context.stderr);
CARBON_ASSIGN_OR_RETURN(context.run_result,
Run(test_args_ref, fs, stdout, stderr));
CARBON_ASSIGN_OR_RETURN(
context.run_result,
context.capture_output
? Run(test_args_ref, fs, stdout, stderr)
: Run(test_args_ref, fs, llvm::outs(), llvm::errs()));
return Success();
}
+4
View File
@@ -145,6 +145,10 @@ class FileTestBase : public testing::Test {
// Whether checks are a subset, generated from SET-CHECK-SUBSET.
bool check_subset = false;
// Output is typically captured for tests and autoupdate, but not when
// dumping to console.
bool capture_output = true;
// stdout and stderr based on CHECK lines in the file.
llvm::SmallVector<testing::Matcher<std::string>> expected_stdout;
llvm::SmallVector<testing::Matcher<std::string>> expected_stderr;