Return absl::Status from test helper functions

This change refactors several test helper functions to return error instead of asserting in the method, following go/totw/206

PiperOrigin-RevId: 854242806
diff --git a/quiche/binary_http/binary_http_message_test.cc b/quiche/binary_http/binary_http_message_test.cc
index d0e0d97..7add275 100644
--- a/quiche/binary_http/binary_http_message_test.cc
+++ b/quiche/binary_http/binary_http_message_test.cc
@@ -31,10 +31,15 @@
 }
 
 template <class T>
-void TestPrintTo(const T& resp) {
+absl::Status TestPrintTo(const T& resp) {
   std::ostringstream os;
   PrintTo(resp, &os);
-  EXPECT_EQ(os.str(), resp.DebugString());
+  if (os.str() != resp.DebugString()) {
+    return absl::FailedPreconditionError(absl::StrCat(
+        "PrintTo output to stream does not match DebugString: stream=",
+        os.str(), ", DebugString=", resp.DebugString()));
+  }
+  return absl::OkStatus();
 }
 
 class RequestMessageSectionTestHandler
@@ -53,39 +58,60 @@
   RequestMessageSectionTestHandler() = default;
   absl::Status OnControlData(
       const BinaryHttpRequest::ControlData& control_data) override {
-    EXPECT_FALSE(message_data_.control_data_.has_value());
+    if (message_data_.control_data_.has_value()) {
+      return absl::FailedPreconditionError(
+          "OnControlData called multiple times");
+    }
     message_data_.control_data_ = control_data;
     return absl::OkStatus();
   }
   absl::Status OnHeader(absl::string_view name,
                         absl::string_view value) override {
-    EXPECT_FALSE(message_data_.headers_done_);
+    if (message_data_.headers_done_) {
+      return absl::FailedPreconditionError(
+          "OnHeader called after OnHeadersDone");
+    }
     message_data_.headers_.push_back({std::string(name), std::string(value)});
     return absl::OkStatus();
   }
   absl::Status OnHeadersDone() override {
-    EXPECT_FALSE(message_data_.headers_done_);
+    if (message_data_.headers_done_) {
+      return absl::FailedPreconditionError(
+          "OnHeadersDone called multiple times");
+    }
     message_data_.headers_done_ = true;
     return absl::OkStatus();
   }
   absl::Status OnBodyChunk(absl::string_view body_chunk) override {
-    EXPECT_FALSE(message_data_.body_chunks_done_);
+    if (message_data_.body_chunks_done_) {
+      return absl::FailedPreconditionError(
+          "OnBodyChunk called after OnBodyChunksDone");
+    }
     message_data_.body_chunks_.push_back(std::string(body_chunk));
     return absl::OkStatus();
   }
   absl::Status OnBodyChunksDone() override {
-    EXPECT_FALSE(message_data_.body_chunks_done_);
+    if (message_data_.body_chunks_done_) {
+      return absl::FailedPreconditionError(
+          "OnBodyChunksDone called multiple times");
+    }
     message_data_.body_chunks_done_ = true;
     return absl::OkStatus();
   }
   absl::Status OnTrailer(absl::string_view name,
                          absl::string_view value) override {
-    EXPECT_FALSE(message_data_.trailers_done_);
+    if (message_data_.trailers_done_) {
+      return absl::FailedPreconditionError(
+          "OnTrailer called after OnTrailersDone");
+    }
     message_data_.trailers_.push_back({std::string(name), std::string(value)});
     return absl::OkStatus();
   }
   absl::Status OnTrailersDone() override {
-    EXPECT_FALSE(message_data_.trailers_done_);
+    if (message_data_.trailers_done_) {
+      return absl::FailedPreconditionError(
+          "OnTrailersDone called multiple times");
+    }
     message_data_.trailers_done_ = true;
     return absl::OkStatus();
   }
@@ -179,7 +205,7 @@
             "libcurl/7.16.3 OpenSSL/0.9.7l "
             "zlib/1.2.3};Field{host=www.example.com};Field{accept-language=en, "
             "mi}}Body{}}}"));
-  TestPrintTo(request);
+  QUICHE_EXPECT_OK(TestPrintTo(request));
 }
 
 TEST(BinaryHttpRequest, DecodeGetNoBody) {
@@ -214,7 +240,7 @@
       {"host", "www.example.com"},
       {"accept-language", "en, mi"}};
   for (const auto& field : expected_fields) {
-    TestPrintTo(field);
+    QUICHE_EXPECT_OK(TestPrintTo(field));
   }
   ASSERT_THAT(request.GetHeaderFields(), ContainerEq(expected_fields));
   ASSERT_EQ(request.body(), "");
@@ -225,7 +251,7 @@
             "libcurl/7.16.3 OpenSSL/0.9.7l "
             "zlib/1.2.3};Field{host=www.example.com};Field{accept-language=en, "
             "mi}}Body{}}}"));
-  TestPrintTo(request);
+  QUICHE_EXPECT_OK(TestPrintTo(request));
 }
 
 TEST(BinaryHttpRequest, EncodeGetNoBodyOrHeaders) {
@@ -257,7 +283,7 @@
   ASSERT_EQ(*result, expected);
   EXPECT_THAT(request.DebugString(),
               StrEq("BinaryHttpRequest{BinaryHttpMessage{Headers{}Body{}}}"));
-  TestPrintTo(request);
+  QUICHE_EXPECT_OK(TestPrintTo(request));
 }
 
 TEST(BinaryHttpRequest, DecodeGetNoBodyOrHeaders) {
@@ -280,13 +306,13 @@
                 FieldsAre("GET", "https", "example.com", "/"));
     std::vector<BinaryHttpMessage::Field> expected_fields = {};
     for (const auto& field : expected_fields) {
-      TestPrintTo(field);
+      QUICHE_EXPECT_OK(TestPrintTo(field));
     }
     ASSERT_THAT(request.GetHeaderFields(), ContainerEq(expected_fields));
     ASSERT_EQ(request.body(), "");
     EXPECT_THAT(request.DebugString(),
                 StrEq("BinaryHttpRequest{BinaryHttpMessage{Headers{}Body{}}}"));
-    TestPrintTo(request);
+    QUICHE_EXPECT_OK(TestPrintTo(request));
   }
 }
 
@@ -485,26 +511,43 @@
   EXPECT_NE(request, no_body);
 }
 
-void ExpectRequestMessageSectionHandler(
+absl::Status ExpectRequestMessageSectionHandler(
     const RequestMessageSectionTestHandler::MessageData& message_data) {
-  EXPECT_TRUE(message_data.control_data_.has_value());
-  if (message_data.control_data_.has_value()) {
-    EXPECT_THAT(*message_data.control_data_,
-                FieldsAre("POST", "https", "google.com", "/hello"));
+  if (!message_data.control_data_.has_value()) {
+    return absl::FailedPreconditionError("control_data missing");
+  }
+  if (message_data.control_data_->method != "POST" ||
+      message_data.control_data_->scheme != "https" ||
+      message_data.control_data_->authority != "google.com" ||
+      message_data.control_data_->path != "/hello") {
+    return absl::FailedPreconditionError("control_data mismatch");
   }
   std::vector<std::pair<std::string, std::string>> expected_headers = {
       {"user-agent", "curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3"},
       {"accept-language", "en, mi"}};
-  EXPECT_TRUE(message_data.headers_done_);
-  EXPECT_THAT(message_data.headers_, ContainerEq(expected_headers));
+  if (!message_data.headers_done_) {
+    return absl::FailedPreconditionError("headers not done");
+  }
+  if (message_data.headers_ != expected_headers) {
+    return absl::FailedPreconditionError("headers mismatch");
+  }
   std::vector<std::string> expected_body_chunks = {"chunk1", "chunk2",
                                                    "chunk3"};
-  EXPECT_TRUE(message_data.body_chunks_done_);
-  EXPECT_THAT(message_data.body_chunks_, ContainerEq(expected_body_chunks));
+  if (!message_data.body_chunks_done_) {
+    return absl::FailedPreconditionError("body chunks not done");
+  }
+  if (message_data.body_chunks_ != expected_body_chunks) {
+    return absl::FailedPreconditionError("body chunks mismatch");
+  }
   std::vector<std::pair<std::string, std::string>> expected_trailers = {
       {"trailer1", "value1"}, {"trailer2", "value2"}};
-  EXPECT_TRUE(message_data.trailers_done_);
-  EXPECT_THAT(message_data.trailers_, ContainerEq(expected_trailers));
+  if (!message_data.trailers_done_) {
+    return absl::FailedPreconditionError("trailers not done");
+  }
+  if (message_data.trailers_ != expected_trailers) {
+    return absl::FailedPreconditionError("trailers mismatch");
+  }
+  return absl::OkStatus();
 }
 
 TEST(IndeterminateLengthDecoder, FullRequestDecodingSuccess) {
@@ -522,7 +565,8 @@
       BinaryHttpRequest::IndeterminateLengthDecoder::Create(&handler);
   QUICHE_ASSERT_OK(decoder);
   QUICHE_EXPECT_OK(decoder->Decode(request_bytes, /*end_stream=*/true));
-  ExpectRequestMessageSectionHandler(handler.GetMessageData());
+  QUICHE_EXPECT_OK(
+      ExpectRequestMessageSectionHandler(handler.GetMessageData()));
 }
 
 class MockFailingMessageSectionHandler
@@ -674,7 +718,8 @@
   // Decode the last byte, send end_stream.
   QUICHE_EXPECT_OK(decoder->Decode(
       absl::string_view(&request_bytes[request_bytes.size() - 1], 1), true));
-  ExpectRequestMessageSectionHandler(handler.GetMessageData());
+  QUICHE_EXPECT_OK(
+      ExpectRequestMessageSectionHandler(handler.GetMessageData()));
 }
 
 TEST(IndeterminateLengthDecoder,
@@ -722,15 +767,24 @@
   EXPECT_THAT(status, test::StatusIs(absl::StatusCode::kInvalidArgument));
 }
 
-void ExpectTruncatedTrailerSection(
+absl::Status ExpectTruncatedTrailerSection(
     const RequestMessageSectionTestHandler::MessageData& message_data) {
-  EXPECT_TRUE(message_data.headers_done_);
-  EXPECT_TRUE(message_data.trailers_done_);
+  if (!message_data.headers_done_) {
+    return absl::FailedPreconditionError("headers not done");
+  }
+  if (!message_data.trailers_done_) {
+    return absl::FailedPreconditionError("trailers not done");
+  }
   std::vector<std::pair<std::string, std::string>> expected_headers = {
       {"user-agent", "curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3"},
       {"accept-language", "en, mi"}};
-  EXPECT_THAT(message_data.headers_, ContainerEq(expected_headers));
-  EXPECT_THAT(message_data.trailers_, testing::IsEmpty());
+  if (message_data.headers_ != expected_headers) {
+    return absl::FailedPreconditionError("headers mismatch");
+  }
+  if (!message_data.trailers_.empty()) {
+    return absl::FailedPreconditionError("trailers not empty");
+  }
+  return absl::OkStatus();
 }
 
 TEST(IndeterminateLengthDecoder, TruncatedBodyAndTrailers) {
@@ -749,7 +803,7 @@
   auto message_data = handler.GetMessageData();
   EXPECT_TRUE(message_data.body_chunks_done_);
   EXPECT_THAT(message_data.body_chunks_, testing::IsEmpty());
-  ExpectTruncatedTrailerSection(message_data);
+  QUICHE_EXPECT_OK(ExpectTruncatedTrailerSection(message_data));
 }
 
 TEST(IndeterminateLengthDecoder, TruncatedBodyAndTrailersSplitEndStream) {
@@ -770,7 +824,7 @@
   auto message_data = handler.GetMessageData();
   EXPECT_TRUE(message_data.body_chunks_done_);
   EXPECT_THAT(message_data.body_chunks_, testing::IsEmpty());
-  ExpectTruncatedTrailerSection(message_data);
+  QUICHE_EXPECT_OK(ExpectTruncatedTrailerSection(message_data));
 }
 
 namespace {
@@ -941,7 +995,8 @@
       BinaryHttpRequest::IndeterminateLengthDecoder::Create(&handler);
   QUICHE_ASSERT_OK(decoder);
   QUICHE_EXPECT_OK(decoder->Decode(encoded_data, /*end_stream=*/true));
-  ExpectRequestMessageSectionHandler(handler.GetMessageData());
+  QUICHE_EXPECT_OK(
+      ExpectRequestMessageSectionHandler(handler.GetMessageData()));
 }
 
 TEST(RequestIndeterminateLengthEncoder, OutOfOrderHeaders) {
@@ -1288,7 +1343,7 @@
   std::vector<std::string> expected_body_chunks = {"chunk1", "chunk2",
                                                    "chunk3"};
   EXPECT_THAT(message_data.body_chunks_, ContainerEq(expected_body_chunks));
-  ExpectTruncatedTrailerSection(message_data);
+  QUICHE_EXPECT_OK(ExpectTruncatedTrailerSection(message_data));
 }
 
 TEST(IndeterminateLengthDecoder, TruncatedTrailersSplitEndStream) {
@@ -1313,7 +1368,7 @@
   std::vector<std::string> expected_body_chunks = {"chunk1", "chunk2",
                                                    "chunk3"};
   EXPECT_THAT(message_data.body_chunks_, ContainerEq(expected_body_chunks));
-  ExpectTruncatedTrailerSection(message_data);
+  QUICHE_EXPECT_OK(ExpectTruncatedTrailerSection(message_data));
 }
 
 TEST(IndeterminateLengthDecoder, InvalidDecodeAfterEndStream) {
@@ -1612,7 +1667,7 @@
           "CRLF.\r\n}}InformationalResponse{Field{running=\"sleep "
           "15\"}};InformationalResponse{Field{link=</style.css>; rel=preload; "
           "as=style};Field{link=</script.js>; rel=preload; as=script}}}"));
-  TestPrintTo(response);
+  QUICHE_EXPECT_OK(TestPrintTo(response));
 }
 
 TEST(BinaryHttpResponse, DecodeMultiInformationalWithBody) {
@@ -1696,7 +1751,7 @@
           "CRLF.\r\n}}InformationalResponse{Field{running=\"sleep "
           "15\"}};InformationalResponse{Field{link=</style.css>; rel=preload; "
           "as=style};Field{link=</script.js>; rel=preload; as=script}}}"));
-  TestPrintTo(response);
+  QUICHE_EXPECT_OK(TestPrintTo(response));
 }
 
 TEST(BinaryHttpMessage, SwapBody) {
@@ -1786,46 +1841,74 @@
 }
 
 template <typename T>
-void TestPadding(T& message) {
+absl::Status TestPadding(T& message) {
   const auto data_so = message.Serialize();
-  ASSERT_TRUE(data_so.ok());
+  if (!data_so.ok()) {
+    return data_so.status();
+  }
   auto data = *data_so;
-  ASSERT_EQ(data.size(), message.EncodedSize());
-
+  if (data.size() != message.EncodedSize()) {
+    return absl::FailedPreconditionError("Incorrect size");
+  }
   message.set_num_padding_bytes(10);
   const auto padded_data_so = message.Serialize();
-  ASSERT_TRUE(padded_data_so.ok());
+  if (!padded_data_so.ok()) {
+    return padded_data_so.status();
+  }
   const auto padded_data = *padded_data_so;
-  ASSERT_EQ(padded_data.size(), message.EncodedSize());
-
+  if (padded_data.size() != message.EncodedSize()) {
+    return absl::FailedPreconditionError("Incorrect padded size");
+  }
   // Check padding size output.
-  ASSERT_EQ(data.size() + 10, padded_data.size());
+  if (data.size() + 10 != padded_data.size()) {
+    return absl::FailedPreconditionError("Padding size mismatch");
+  }
   // Check for valid null byte padding output
   data.resize(data.size() + 10);
-  ASSERT_EQ(data, padded_data);
-
+  if (data != padded_data) {
+    return absl::FailedPreconditionError("Padded data mismatch");
+  }
   // Deserialize padded and not padded, and verify they are the same.
   const auto deserialized_padded_message_so = T::Create(data);
-  ASSERT_TRUE(deserialized_padded_message_so.ok());
+  if (!deserialized_padded_message_so.ok()) {
+    return deserialized_padded_message_so.status();
+  }
   const auto deserialized_padded_message = *deserialized_padded_message_so;
-  ASSERT_EQ(deserialized_padded_message, message);
-  ASSERT_EQ(deserialized_padded_message.num_padding_bytes(), size_t(10));
-
+  if (!(deserialized_padded_message == message)) {
+    return absl::FailedPreconditionError(
+        "Deserialized padded message != message");
+  }
+  if (deserialized_padded_message.num_padding_bytes() != size_t(10)) {
+    return absl::FailedPreconditionError(
+        "Padding bytes mismatch in deserialized");
+  }
   // Invalid padding
   data[data.size() - 1] = 'a';
   const auto bad_so = T::Create(data);
-  ASSERT_FALSE(bad_so.ok());
-
+  if (bad_so.ok()) {
+    return absl::FailedPreconditionError(
+        "Expected bad status for invalid padding");
+  }
   // Check that padding does not impact equality.
   data.resize(data.size() - 10);
   const auto deserialized_message_so = T::Create(data);
-  ASSERT_TRUE(deserialized_message_so.ok());
+  if (!deserialized_message_so.ok()) {
+    return deserialized_message_so.status();
+  }
   const auto deserialized_message = *deserialized_message_so;
-  ASSERT_EQ(deserialized_message.num_padding_bytes(), size_t(0));
+  if (deserialized_message.num_padding_bytes() != size_t(0)) {
+    return absl::FailedPreconditionError("Num padding bytes should be 0");
+  }
   // Confirm that the message payloads are equal, but not fully equivalent due
   // to padding.
-  ASSERT_THAT(deserialized_message, HasEqPayload(deserialized_padded_message));
-  ASSERT_NE(deserialized_message, deserialized_padded_message);
+  if (!deserialized_message.IsPayloadEqual(deserialized_padded_message)) {
+    return absl::FailedPreconditionError("IsPayloadEqual failed");
+  }
+  if (deserialized_message == deserialized_padded_message) {
+    return absl::FailedPreconditionError(
+        "deserialized_message == deserialized_padded_message");
+  }
+  return absl::OkStatus();
 }
 
 TEST(BinaryHttpRequest, Padding) {
@@ -1841,7 +1924,7 @@
                        "curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3"})
       ->AddHeaderField({"Host", "www.example.com"})
       ->AddHeaderField({"Accept-Language", "en, mi"});
-  TestPadding(request);
+  QUICHE_EXPECT_OK(TestPadding(request));
 }
 
 TEST(BinaryHttpResponse, Padding) {
@@ -1854,7 +1937,7 @@
   BinaryHttpResponse response(200);
   response.AddHeaderField({"Server", "Apache"});
   response.set_body("Hello, world!\r\n");
-  TestPadding(response);
+  QUICHE_EXPECT_OK(TestPadding(response));
 }
 
 }  // namespace quiche