Adds an integer return value to Http2Adapter::Send(), to indicate success or failure.

PiperOrigin-RevId: 380203870
diff --git a/http2/adapter/http2_adapter.h b/http2/adapter/http2_adapter.h
index c1ee479..2c66081 100644
--- a/http2/adapter/http2_adapter.h
+++ b/http2/adapter/http2_adapter.h
@@ -67,7 +67,8 @@
   virtual void SubmitMetadata(Http2StreamId stream_id, bool fin) = 0;
 
   // Invokes the visitor's OnReadyToSend() method for serialized frame data.
-  virtual void Send() = 0;
+  // Returns 0 on success.
+  virtual int Send() = 0;
 
   // Returns the connection-level flow control window advertised by the peer.
   virtual int GetSendWindowSize() const = 0;
diff --git a/http2/adapter/nghttp2_adapter.cc b/http2/adapter/nghttp2_adapter.cc
index 316fc40..8eac860 100644
--- a/http2/adapter/nghttp2_adapter.cc
+++ b/http2/adapter/nghttp2_adapter.cc
@@ -95,11 +95,12 @@
   QUICHE_LOG(DFATAL) << "Not implemented";
 }
 
-void NgHttp2Adapter::Send() {
+int NgHttp2Adapter::Send() {
   const int result = nghttp2_session_send(session_->raw_ptr());
   if (result != 0) {
     visitor_.OnConnectionError();
   }
+  return result;
 }
 
 int NgHttp2Adapter::GetSendWindowSize() const {
diff --git a/http2/adapter/nghttp2_adapter.h b/http2/adapter/nghttp2_adapter.h
index 10573f2..c49d017 100644
--- a/http2/adapter/nghttp2_adapter.h
+++ b/http2/adapter/nghttp2_adapter.h
@@ -47,7 +47,7 @@
 
   void SubmitMetadata(Http2StreamId stream_id, bool end_metadata) override;
 
-  void Send() override;
+  int Send() override;
 
   int GetSendWindowSize() const override;
   int GetStreamSendWindowSize(Http2StreamId stream_id) const override;
diff --git a/http2/adapter/nghttp2_adapter_test.cc b/http2/adapter/nghttp2_adapter_test.cc
index 92ac949..21a1ded 100644
--- a/http2/adapter/nghttp2_adapter_test.cc
+++ b/http2/adapter/nghttp2_adapter_test.cc
@@ -57,7 +57,8 @@
 TEST(NgHttp2AdapterTest, ClientHandlesFrames) {
   DataSavingVisitor visitor;
   auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor);
-  adapter->Send();
+  int result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(),
               testing::StrEq(spdy::kHttp2ConnectionHeaderPrefix));
   visitor.Clear();
@@ -86,7 +87,8 @@
 
   EXPECT_EQ(adapter->GetSendWindowSize(), kInitialFlowControlWindowSize + 1000);
   // Some bytes should have been serialized.
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS,
                                             spdy::SpdyFrameType::PING}));
   visitor.Clear();
@@ -136,7 +138,8 @@
   adapter->SetStreamUserData(stream_id2, const_cast<char*>(kSentinel2));
   adapter->SetStreamUserData(stream_id3, nullptr);
 
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS,
                                             spdy::SpdyFrameType::HEADERS,
                                             spdy::SpdyFrameType::HEADERS}));
@@ -244,14 +247,16 @@
 
   // Client will not have anything else to write.
   EXPECT_FALSE(adapter->session().want_write());
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), testing::IsEmpty());
 }
 
 TEST(NgHttp2AdapterTest, ClientSubmitRequest) {
   DataSavingVisitor visitor;
   auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor);
-  adapter->Send();
+  int result = adapter->Send();
+  EXPECT_EQ(0, result);
   // Client preface does not appear to include the mandatory SETTINGS frame.
   EXPECT_THAT(visitor.data(),
               testing::StrEq(spdy::kHttp2ConnectionHeaderPrefix));
@@ -270,7 +275,8 @@
   EXPECT_EQ(initial_frames.size(), initial_result);
 
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS}));
   visitor.Clear();
 
@@ -287,7 +293,8 @@
                              &body1, const_cast<char*>(kSentinel));
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
 
   EXPECT_EQ(kInitialFlowControlWindowSize,
             adapter->GetStreamReceiveWindowSize(stream_id));
@@ -323,7 +330,8 @@
   EXPECT_EQ(nullptr, adapter->GetStreamUserData(stream_id));
   adapter->SetStreamUserData(stream_id, const_cast<char*>(kSentinel2));
 
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS}));
 
   EXPECT_EQ(kSentinel2, adapter->GetStreamUserData(stream_id));
@@ -339,7 +347,8 @@
 TEST(NgHttp2AdapterTest, ClientSubmitRequestWithDataProvider) {
   DataSavingVisitor visitor;
   auto adapter = NgHttp2Adapter::CreateClientAdapter(visitor);
-  adapter->Send();
+  int result = adapter->Send();
+  EXPECT_EQ(0, result);
   // Client preface does not appear to include the mandatory SETTINGS frame.
   EXPECT_THAT(visitor.data(),
               testing::StrEq(spdy::kHttp2ConnectionHeaderPrefix));
@@ -358,7 +367,8 @@
   EXPECT_EQ(initial_frames.size(), initial_result);
 
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS}));
   visitor.Clear();
 
@@ -382,7 +392,8 @@
                              frame_source.get(), nullptr);
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS,
                                             spdy::SpdyFrameType::DATA}));
   EXPECT_THAT(visitor.data(), testing::HasSubstr(kBody));
@@ -416,7 +427,8 @@
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(adapter->session().want_write());
 
-  adapter->Send();
+  int result = adapter->Send();
+  EXPECT_EQ(0, result);
   // Client preface does not appear to include the mandatory SETTINGS frame.
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
@@ -431,7 +443,8 @@
   EXPECT_TRUE(adapter->ResumeStream(stream_id));
   EXPECT_TRUE(adapter->session().want_write());
 
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::DATA}));
   EXPECT_FALSE(adapter->session().want_write());
 
@@ -467,12 +480,14 @@
   EXPECT_TRUE(adapter->session().want_write());
 
   visitor.set_is_write_blocked(true);
-  adapter->Send();
+  int result = adapter->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), testing::IsEmpty());
   EXPECT_TRUE(adapter->session().want_write());
 
   visitor.set_is_write_blocked(false);
-  adapter->Send();
+  result = adapter->Send();
+  EXPECT_EQ(0, result);
 
   // Client preface does not appear to include the mandatory SETTINGS frame.
   absl::string_view serialized = visitor.data();
@@ -590,7 +605,8 @@
 
   EXPECT_TRUE(adapter->session().want_write());
   // Some bytes should have been serialized.
-  adapter->Send();
+  int send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
   // SETTINGS ack, two PING acks.
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS,
                                             spdy::SpdyFrameType::PING,
@@ -639,7 +655,8 @@
 
   // Server will want to send a SETTINGS ack.
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  int send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS}));
   visitor.Clear();
 
@@ -661,7 +678,8 @@
   adapter->SetStreamUserData(1, nullptr);
   EXPECT_EQ(nullptr, adapter->GetStreamUserData(1));
 
-  adapter->Send();
+  send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
 
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS,
                                             spdy::SpdyFrameType::DATA}));
@@ -714,7 +732,8 @@
   adapter->SubmitShutdownNotice();
 
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  int send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS,
                                             spdy::SpdyFrameType::GOAWAY}));
 }
@@ -754,7 +773,8 @@
 
   // Server will want to send a SETTINGS ack.
   EXPECT_TRUE(adapter->session().want_write());
-  adapter->Send();
+  int send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS}));
   visitor.Clear();
 
@@ -770,7 +790,8 @@
   EXPECT_EQ(submit_result, 0);
   EXPECT_TRUE(adapter->session().want_write());
   EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::NO_ERROR));
-  adapter->Send();
+  send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS,
                                             spdy::SpdyFrameType::DATA}));
   EXPECT_THAT(visitor.data(), testing::HasSubstr(kBody));
@@ -784,7 +805,8 @@
   ASSERT_EQ(trailer_result, 0);
   EXPECT_TRUE(adapter->session().want_write());
 
-  adapter->Send();
+  send_result = adapter->Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS}));
 }
 
diff --git a/http2/adapter/oghttp2_adapter.cc b/http2/adapter/oghttp2_adapter.cc
index e87afa9..6f56d40 100644
--- a/http2/adapter/oghttp2_adapter.cc
+++ b/http2/adapter/oghttp2_adapter.cc
@@ -79,9 +79,7 @@
   QUICHE_BUG(oghttp2_submit_metadata) << "Not implemented";
 }
 
-void OgHttp2Adapter::Send() {
-  session_->Send();
-}
+int OgHttp2Adapter::Send() { return session_->Send(); }
 
 int OgHttp2Adapter::GetSendWindowSize() const {
   return session_->GetRemoteWindowSize();
diff --git a/http2/adapter/oghttp2_adapter.h b/http2/adapter/oghttp2_adapter.h
index 03f7b69..b796e1e 100644
--- a/http2/adapter/oghttp2_adapter.h
+++ b/http2/adapter/oghttp2_adapter.h
@@ -34,7 +34,7 @@
   void SubmitWindowUpdate(Http2StreamId stream_id,
                           int window_increment) override;
   void SubmitMetadata(Http2StreamId stream_id, bool fin) override;
-  void Send() override;
+  int Send() override;
   int GetSendWindowSize() const override;
   int GetStreamSendWindowSize(Http2StreamId stream_id) const override;
   int GetStreamReceiveWindowLimit(Http2StreamId stream_id) const override;
diff --git a/http2/adapter/oghttp2_adapter_test.cc b/http2/adapter/oghttp2_adapter_test.cc
index 1675bda..9f4da15 100644
--- a/http2/adapter/oghttp2_adapter_test.cc
+++ b/http2/adapter/oghttp2_adapter_test.cc
@@ -68,7 +68,8 @@
   adapter_->SubmitWindowUpdate(3, 127);
   EXPECT_TRUE(adapter_->session().want_write());
 
-  adapter_->Send();
+  int result = adapter_->Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(
       http2_visitor_.data(),
       EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::PRIORITY,
@@ -87,11 +88,14 @@
   EXPECT_TRUE(adapter_->session().want_write());
 
   http2_visitor_.set_send_limit(20);
-  adapter_->Send();
+  int result = adapter_->Send();
+  EXPECT_EQ(0, result);
   EXPECT_TRUE(adapter_->session().want_write());
-  adapter_->Send();
+  result = adapter_->Send();
+  EXPECT_EQ(0, result);
   EXPECT_TRUE(adapter_->session().want_write());
-  adapter_->Send();
+  result = adapter_->Send();
+  EXPECT_EQ(0, result);
   EXPECT_FALSE(adapter_->session().want_write());
   EXPECT_THAT(http2_visitor_.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY,
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc
index 0ee64d7..949c67b 100644
--- a/http2/adapter/oghttp2_session.cc
+++ b/http2/adapter/oghttp2_session.cc
@@ -163,7 +163,7 @@
   frames_.push_back(std::move(frame));
 }
 
-void OgHttp2Session::Send() {
+int OgHttp2Session::Send() {
   MaybeSetupPreface();
   ssize_t result = std::numeric_limits<ssize_t>::max();
   // Flush any serialized prefix.
@@ -174,7 +174,7 @@
     }
   }
   if (!serialized_prefix_.empty()) {
-    return;
+    return result < 0 ? result : 0;
   }
   bool continue_writing = SendQueuedFrames();
   // Wake streams for writes.
@@ -188,6 +188,7 @@
   if (continue_writing) {
     SendQueuedFrames();
   }
+  return 0;
 }
 
 bool OgHttp2Session::SendQueuedFrames() {
diff --git a/http2/adapter/oghttp2_session.h b/http2/adapter/oghttp2_session.h
index 8e2a7ee..a22811f 100644
--- a/http2/adapter/oghttp2_session.h
+++ b/http2/adapter/oghttp2_session.h
@@ -35,7 +35,7 @@
   void StartGracefulShutdown();
 
   // Invokes the visitor's OnReadyToSend() method for serialized frame data.
-  void Send();
+  int Send();
 
   int32_t SubmitRequest(absl::Span<const Header> headers,
                         DataFrameSource* data_source,
@@ -180,7 +180,8 @@
 
   void SendWindowUpdate(Http2StreamId stream_id, size_t update_delta);
 
-  // Sends queued frames, returning true if all frames were flushed.
+  // Sends queued frames, returning true if all frames were flushed
+  // successfully.
   bool SendQueuedFrames();
 
   // Returns false if the connection is write-blocked (due to flow control or
diff --git a/http2/adapter/oghttp2_session_test.cc b/http2/adapter/oghttp2_session_test.cc
index be53e47..73e59b0 100644
--- a/http2/adapter/oghttp2_session_test.cc
+++ b/http2/adapter/oghttp2_session_test.cc
@@ -138,7 +138,8 @@
   OgHttp2Session session(
       visitor, OgHttp2Session::Options{.perspective = Perspective::kClient});
   EXPECT_FALSE(session.want_write());
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
               testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
@@ -155,7 +156,8 @@
   EXPECT_FALSE(session.want_write());
   session.EnqueueFrame(absl::make_unique<spdy::SpdyPingIR>(42));
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
               testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
@@ -173,7 +175,8 @@
   EXPECT_FALSE(session.want_write());
   session.EnqueueFrame(absl::make_unique<spdy::SpdySettingsIR>());
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
               testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
@@ -190,7 +193,8 @@
 
   // Even though the user has not queued any frames for the session, it should
   // still send the connection preface.
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
               testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
@@ -213,7 +217,8 @@
 
   // Session will want to write a SETTINGS ack.
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS}));
   visitor.Clear();
 
@@ -230,7 +235,8 @@
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
-  session.Send();
+  result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS,
                                             spdy::SpdyFrameType::DATA}));
   visitor.Clear();
@@ -259,7 +265,8 @@
   session.SetStreamUserData(stream_id, const_cast<char*>(kSentinel2));
   EXPECT_EQ(kSentinel2, session.GetStreamUserData(stream_id));
 
-  session.Send();
+  result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::HEADERS}));
 
   // No data was sent (just HEADERS), so the remaining send window size should
@@ -288,7 +295,8 @@
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
               testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
@@ -302,7 +310,8 @@
   body1.set_is_data_available(true);
   EXPECT_TRUE(session.ResumeStream(stream_id));
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::DATA}));
   EXPECT_FALSE(session.want_write());
 
@@ -331,12 +340,14 @@
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
   visitor.set_is_write_blocked(true);
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
 
   EXPECT_THAT(visitor.data(), testing::IsEmpty());
   EXPECT_TRUE(session.want_write());
   visitor.set_is_write_blocked(false);
-  session.Send();
+  result = session.Send();
+  EXPECT_EQ(0, result);
 
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
@@ -359,7 +370,9 @@
   session.StartGracefulShutdown();
   EXPECT_FALSE(session.want_write());
 
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
+
   absl::string_view serialized = visitor.data();
   EXPECT_THAT(serialized,
               testing::StartsWith(spdy::kHttp2ConnectionHeaderPrefix));
@@ -477,7 +490,8 @@
 
   EXPECT_TRUE(session.want_write());
   // Some bytes should have been serialized.
-  session.Send();
+  int send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   // Initial SETTINGS, SETTINGS ack.
   // TODO(birenroy): automatically queue PING acks.
   EXPECT_THAT(visitor.data(), EqualsFrames({spdy::SpdyFrameType::SETTINGS,
@@ -493,7 +507,8 @@
   EXPECT_FALSE(session.want_write());
   session.EnqueueFrame(absl::make_unique<spdy::SpdyPingIR>(42));
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::PING}));
 }
@@ -507,7 +522,8 @@
   EXPECT_FALSE(session.want_write());
   session.EnqueueFrame(absl::make_unique<spdy::SpdySettingsIR>());
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::SETTINGS}));
 }
 
@@ -557,7 +573,8 @@
 
   // Server will want to send initial SETTINGS, and a SETTINGS ack.
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS}));
   visitor.Clear();
@@ -578,7 +595,8 @@
   session.SetStreamUserData(1, nullptr);
   EXPECT_EQ(nullptr, session.GetStreamUserData(1));
 
-  session.Send();
+  send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA}));
   EXPECT_FALSE(session.want_write());
@@ -602,7 +620,8 @@
   session.StartGracefulShutdown();
   EXPECT_TRUE(session.want_write());
 
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY}));
 }
@@ -619,7 +638,8 @@
   session.EnqueueFrame(std::move(goaway));
   EXPECT_TRUE(session.want_write());
 
-  session.Send();
+  int result = session.Send();
+  EXPECT_EQ(0, result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::GOAWAY}));
 
@@ -667,7 +687,8 @@
 
   // Server will want to send initial SETTINGS, and a SETTINGS ack.
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS}));
   visitor.Clear();
@@ -683,7 +704,8 @@
       &body1);
   EXPECT_EQ(submit_result, 0);
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA}));
   visitor.Clear();
@@ -697,7 +719,8 @@
   ASSERT_EQ(trailer_result, 0);
   EXPECT_TRUE(session.want_write());
 
-  session.Send();
+  send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(), EqualsFrames({SpdyFrameType::HEADERS}));
 }
 
@@ -740,7 +763,8 @@
 
   // Server will want to send initial SETTINGS, and a SETTINGS ack.
   EXPECT_TRUE(session.want_write());
-  session.Send();
+  int send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::SETTINGS, SpdyFrameType::SETTINGS}));
   visitor.Clear();
@@ -765,7 +789,8 @@
   EXPECT_TRUE(session.want_write());
 
   EXPECT_CALL(visitor, OnCloseStream(1, Http2ErrorCode::NO_ERROR));
-  session.Send();
+  send_result = session.Send();
+  EXPECT_EQ(0, send_result);
   EXPECT_THAT(visitor.data(),
               EqualsFrames({SpdyFrameType::HEADERS, SpdyFrameType::DATA,
                             SpdyFrameType::HEADERS}));