Make QuicSession::OnStreamClosed() more robust.

Since we don't have the stream close loop anymore, closing stream twice is not expected.

No behavior change. not protected.

PiperOrigin-RevId: 320273993
Change-Id: I90c9162b41ef972eea5731eb74fe524d8f25fd5e
diff --git a/quic/core/http/quic_spdy_client_stream_test.cc b/quic/core/http/quic_spdy_client_stream_test.cc
index 1aba000..ffd4590 100644
--- a/quic/core/http/quic_spdy_client_stream_test.cc
+++ b/quic/core/http/quic_spdy_client_stream_test.cc
@@ -48,6 +48,8 @@
 
   MOCK_METHOD(void, CloseStream, (QuicStreamId stream_id), (override));
 
+  using QuicSession::ActivateStream;
+
  private:
   QuicCryptoClientConfig crypto_config_;
 };
@@ -67,14 +69,18 @@
                  &push_promise_index_),
         body_("hello world") {
     session_.Initialize();
+    connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
 
     headers_[":status"] = "200";
     headers_["content-length"] = "11";
 
-    stream_ = std::make_unique<QuicSpdyClientStream>(
+    auto stream = std::make_unique<QuicSpdyClientStream>(
         GetNthClientInitiatedBidirectionalStreamId(
             connection_->transport_version(), 0),
         &session_, BIDIRECTIONAL);
+    stream_ = stream.get();
+    session_.ActivateStream(std::move(stream));
+
     stream_visitor_ = std::make_unique<StreamVisitor>();
     stream_->set_visitor(stream_visitor_.get());
   }
@@ -91,7 +97,7 @@
   QuicClientPushPromiseIndex push_promise_index_;
 
   MockQuicSpdyClientSession session_;
-  std::unique_ptr<QuicSpdyClientStream> stream_;
+  QuicSpdyClientStream* stream_;
   std::unique_ptr<StreamVisitor> stream_visitor_;
   SpdyHeaderBlock headers_;
   std::string body_;
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index fea8541..df83890 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -161,6 +161,9 @@
 
   MOCK_METHOD(bool, HasPendingRetransmission, (), (const, override));
 
+  void OnConnectionClosed(QuicErrorCode /*error*/,
+                          ConnectionCloseSource /*source*/) override {}
+
  private:
   using QuicCryptoStream::session;
 
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index d83823b..e09decf 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -867,17 +867,17 @@
   QUIC_DVLOG(1) << ENDPOINT << "Closing stream: " << stream_id;
   StreamMap::iterator it = stream_map_.find(stream_id);
   if (it == stream_map_.end()) {
-    QUIC_DVLOG(1) << ENDPOINT << "Stream is already closed: " << stream_id;
+    QUIC_BUG << ENDPOINT << "Stream is already closed: " << stream_id;
     return;
   }
   QuicStream* stream = it->second.get();
   StreamType type = stream->type();
 
   if (stream->IsWaitingForAcks()) {
-    zombie_streams_[stream->id()] = std::move(it->second);
+    zombie_streams_[stream_id] = std::move(it->second);
   } else {
     // Clean up the stream since it is no longer waiting for acks.
-    streams_waiting_for_acks_.erase(stream->id());
+    streams_waiting_for_acks_.erase(stream_id);
     closed_streams_.push_back(std::move(it->second));
     // Do not retransmit data of a closed stream.
     streams_with_pending_retransmission_.erase(stream_id);
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 8459269..54c7bfb 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -144,6 +144,9 @@
 
   MOCK_METHOD(bool, HasPendingRetransmission, (), (const, override));
 
+  void OnConnectionClosed(QuicErrorCode /*error*/,
+                          ConnectionCloseSource /*source*/) override {}
+
  private:
   using QuicCryptoStream::session;