Эх сурвалжийг харах

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.
Jon Ross-Perkins 2 жил өмнө
parent
commit
280a25b863

+ 10 - 6
testing/file_test/file_test_base.cpp

@@ -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 - 0
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<testing::Matcher<std::string>> expected_stdout;
     llvm::SmallVector<testing::Matcher<std::string>> expected_stderr;