Refactor interop result D in quic_client_interop_test

gfe-relnote: n/a, test-only
PiperOrigin-RevId: 274663867
Change-Id: I37652d884bfbb5b8df386a271077cf37de412705
diff --git a/quic/tools/quic_client_interop_test_bin.cc b/quic/tools/quic_client_interop_test_bin.cc
index 3bbb5c5..20a4699 100644
--- a/quic/tools/quic_client_interop_test_bin.cc
+++ b/quic/tools/quic_client_interop_test_bin.cc
@@ -7,9 +7,11 @@
 #include <string>
 #include <utility>
 
+#include "net/third_party/quiche/src/quic/core/quic_types.h"
 #include "net/third_party/quiche/src/quic/core/quic_versions.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_epoll.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_system_event_loop.h"
+#include "net/third_party/quiche/src/quic/test_tools/quic_connection_peer.h"
 #include "net/third_party/quiche/src/quic/tools/fake_proof_verifier.h"
 #include "net/third_party/quiche/src/quic/tools/quic_client.h"
 #include "net/third_party/quiche/src/quic/tools/quic_url.h"
@@ -98,10 +100,21 @@
   while (client->WaitForEvents()) {
   }
 
-  QuicConnectionStats client_stats =
-      client->session()->connection()->GetStats();
-  if (client_stats.retry_packet_processed) {
-    features.insert(Feature::kRetry);
+  QuicConnection* connection = client->session()->connection();
+  if (connection != nullptr) {
+    QuicConnectionStats client_stats = connection->GetStats();
+    if (client_stats.retry_packet_processed) {
+      features.insert(Feature::kRetry);
+    }
+    QuicSentPacketManager* sent_packet_manager =
+        test::QuicConnectionPeer::GetSentPacketManager(connection);
+    const bool received_forward_secure_ack =
+        sent_packet_manager != nullptr &&
+        sent_packet_manager->GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE)
+            .IsInitialized();
+    if (client_stats.stream_bytes_received > 0 && received_forward_secure_ack) {
+      features.insert(Feature::kStreamData);
+    }
   }
 
   if (!client->connected()) {
@@ -112,9 +125,6 @@
     features.insert(Feature::kHttp3);
   }
 
-  // TODO(nharper): Properly check that we actually sent stream data and
-  // received ACKs for it.
-  features.insert(Feature::kStreamData);
   // TODO(nharper): Check that we sent/received (which one?) a CONNECTION_CLOSE
   // with error code 0.
   features.insert(Feature::kConnectionClose);
@@ -180,7 +190,7 @@
   }
 
   auto supported_features = quic::ServerSupport(host, port);
-  std::cout << "Supported features: ";
+  std::cout << host << ":" << port << " = ";
   for (auto feature : supported_features) {
     std::cout << MatrixLetter(feature);
   }