diff --git a/testing/file_test/file_test_base.cpp b/testing/file_test/file_test_base.cpp index c4a9b0e54aa36..76f99945797bb 100644 --- a/testing/file_test/file_test_base.cpp +++ b/testing/file_test/file_test_base.cpp @@ -218,6 +218,7 @@ auto FileTestBase::Autoupdate() -> ErrorOr { auto FileTestBase::DumpOutput() -> ErrorOr { 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 { 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(); } diff --git a/testing/file_test/file_test_base.h b/testing/file_test/file_test_base.h index eb4c4b6de2104..5cbd13ef6d204 100644 --- a/testing/file_test/file_test_base.h +++ b/testing/file_test/file_test_base.h @@ -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> expected_stdout; llvm::SmallVector> expected_stderr;