Add DCHECKs to make sure data does not get sent after connection closed.

gfe-relnote: n/a (DCHECK only)
PiperOrigin-RevId: 296897669
Change-Id: Ib333d6c3df430719bc92700e0eba68bd51c81367
diff --git a/quic/core/quic_control_frame_manager.cc b/quic/core/quic_control_frame_manager.cc
index 5e33368..e1053f1 100644
--- a/quic/core/quic_control_frame_manager.cc
+++ b/quic/core/quic_control_frame_manager.cc
@@ -23,6 +23,9 @@
 
 }  // namespace
 
+#define ENDPOINT \
+  (session_->perspective() == Perspective::IS_SERVER ? "Server: " : "Client: ")
+
 QuicControlFrameManager::QuicControlFrameManager(QuicSession* session)
     : last_control_frame_id_(kInvalidControlFrameId),
       least_unacked_(1),
@@ -282,6 +285,8 @@
 }
 
 void QuicControlFrameManager::WriteBufferedFrames() {
+  DCHECK(session_->connection()->connected())
+      << ENDPOINT << "Try to write control frames when connection is closed.";
   while (HasBufferedFrames()) {
     session_->SetTransmissionType(NOT_RETRANSMISSION);
     QuicFrame frame_to_send =
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index a47c265..073758e 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -739,6 +739,8 @@
                                          QuicStreamOffset offset,
                                          StreamSendingState state,
                                          bool is_retransmission) {
+  DCHECK(connection_->connected())
+      << ENDPOINT << "Try to write stream data when connection is closed.";
   if (!IsEncryptionEstablished() &&
       !QuicUtils::IsCryptoStreamId(transport_version(), id)) {
     // Do not let streams write without encryption. The calling stream will end
@@ -2094,6 +2096,8 @@
 }
 
 MessageResult QuicSession::SendMessage(QuicMemSliceSpan message, bool flush) {
+  DCHECK(connection_->connected())
+      << ENDPOINT << "Try to write messages when connection is closed.";
   if (!IsEncryptionEstablished()) {
     return {MESSAGE_STATUS_ENCRYPTION_NOT_ESTABLISHED, 0};
   }