Fix AckNotifierWithPacketLossAndBlockedSocket cl/311718153 removed the flakes in this test but without understanding them. This CL fixes the test now that we understand. Test-only PiperOrigin-RevId: 311766367 Change-Id: I5f9d63dfd874512f961ab7c2b9a29e3cd174f364
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc index df3f68d..399e19f 100644 --- a/quic/core/http/end_to_end_test.cc +++ b/quic/core/http/end_to_end_test.cc
@@ -2408,34 +2408,54 @@ client_->SendMessage(headers, "", /*fin=*/false); - // Size of headers on the request stream. Zero if headers are sent on the - // header stream. - size_t header_size = 0; - QuicByteCount encoder_stream_sent_byte_count = 0; + // Bounds on the size of headers on the request stream. These are both zero + // if headers are sent on the header stream. The connection might send the + // /foo request before or after receiving the peer's SETTINGS, which + // would impact whether QPACK uses the dynamic table or not, so we have two + // potential expected values. + size_t header_size_low = 0; + size_t header_size_high = 0; if (version_.UsesHttp3()) { - // Determine size of compressed headers. + // Determine size of headers after QPACK compression in both scenarios. NoopDecoderStreamErrorDelegate decoder_stream_error_delegate; NoopQpackStreamSenderDelegate encoder_stream_sender_delegate; - QpackEncoder qpack_encoder(&decoder_stream_error_delegate); - qpack_encoder.set_qpack_stream_sender_delegate( + QpackEncoder qpack_encoder_low(&decoder_stream_error_delegate); + qpack_encoder_low.set_qpack_stream_sender_delegate( &encoder_stream_sender_delegate); - qpack_encoder.SetMaximumDynamicTableCapacity( + qpack_encoder_low.SetMaximumDynamicTableCapacity( kDefaultQpackMaxDynamicTableCapacity); - qpack_encoder.SetDynamicTableCapacity(kDefaultQpackMaxDynamicTableCapacity); - qpack_encoder.SetMaximumBlockedStreams(kDefaultMaximumBlockedStreams); + qpack_encoder_low.SetDynamicTableCapacity( + kDefaultQpackMaxDynamicTableCapacity); + qpack_encoder_low.SetMaximumBlockedStreams(kDefaultMaximumBlockedStreams); - std::string encoded_headers = qpack_encoder.EncodeHeaderList( - /* stream_id = */ 0, headers, &encoder_stream_sent_byte_count); - header_size = encoded_headers.size(); + std::string encoded_headers_low = qpack_encoder_low.EncodeHeaderList( + /* stream_id = */ 0, headers, nullptr); + header_size_low = encoded_headers_low.size(); + + QpackEncoder qpack_encoder_high(&decoder_stream_error_delegate); + qpack_encoder_high.set_qpack_stream_sender_delegate( + &encoder_stream_sender_delegate); + + qpack_encoder_high.SetMaximumDynamicTableCapacity(0); + qpack_encoder_high.SetDynamicTableCapacity(0); + qpack_encoder_high.SetMaximumBlockedStreams(0); + + std::string encoded_headers_high = qpack_encoder_high.EncodeHeaderList( + /* stream_id = */ 0, headers, nullptr); + header_size_high = encoded_headers_high.size(); } + ASSERT_LE(header_size_low, header_size_high); // Test the AckNotifier's ability to track multiple packets by making the // request body exceed the size of a single packet. std::string request_string = "a request body bigger than one packet" + std::string(kMaxOutgoingPacketSize, '.'); - const int expected_bytes_acked = header_size + request_string.length(); + const int expected_bytes_acked_low = + header_size_low + request_string.length(); + const int expected_bytes_acked_high = + header_size_high + request_string.length(); // The TestAckListener will cause a failure if not notified. QuicReferenceCountedPointer<TestAckListener> ack_listener( @@ -2451,23 +2471,18 @@ client_->SendSynchronousRequest("/bar"); // Make sure the delegate does get the notification it expects. - while (ack_listener->total_bytes_acked() < expected_bytes_acked) { + while (ack_listener->total_bytes_acked() < expected_bytes_acked_low) { // Waits for up to 50 ms. client_->client()->WaitForEvents(); } - if (version_.UsesHttp3()) { - // TODO(b/156628545) Replace the check below with - // EXPECT_EQ(ack_listener->total_bytes_acked(), expected_bytes_acked) - // once we understand why sometimes 16 extra bytes are ACKed. - EXPECT_TRUE(ack_listener->total_bytes_acked() == expected_bytes_acked || - ack_listener->total_bytes_acked() == expected_bytes_acked + 16) - << " header_size " << header_size << " encoder_stream_sent_byte_count " - << encoder_stream_sent_byte_count << " request length " - << request_string.length(); + if (expected_bytes_acked_low != expected_bytes_acked_high) { + EXPECT_TRUE(ack_listener->total_bytes_acked() == expected_bytes_acked_low || + ack_listener->total_bytes_acked() == expected_bytes_acked_high) + << " header_size_low " << header_size_low << " header_size_high " + << header_size_low << " request length " << request_string.length(); } else { - EXPECT_EQ(ack_listener->total_bytes_acked(), expected_bytes_acked) - << " header_size " << header_size << " encoder_stream_sent_byte_count " - << encoder_stream_sent_byte_count << " request length " + EXPECT_EQ(ack_listener->total_bytes_acked(), expected_bytes_acked_low) + << " header_size " << header_size_low << " request length " << request_string.length(); } }