diff --git a/quic/api/QuicTransportFunctions.cpp b/quic/api/QuicTransportFunctions.cpp index 85c424e46..08f09213b 100644 --- a/quic/api/QuicTransportFunctions.cpp +++ b/quic/api/QuicTransportFunctions.cpp @@ -1223,7 +1223,7 @@ uint64_t writeProbingDataToSocket( aead, headerCipher, version); - if (written < probesToSend) { + if (probesToSend && !written) { // Fall back to send a ping: sendSimpleFrame(connection, PingFrame()); auto pingScheduler = std::move(FrameScheduler::Builder( diff --git a/quic/api/test/QuicTransportFunctionsTest.cpp b/quic/api/test/QuicTransportFunctionsTest.cpp index 7486d6b37..cb63f8cc3 100644 --- a/quic/api/test/QuicTransportFunctionsTest.cpp +++ b/quic/api/test/QuicTransportFunctionsTest.cpp @@ -1572,6 +1572,30 @@ TEST_F(QuicTransportFunctionsTest, WriteProbingCryptoData) { EXPECT_FALSE(cryptoStream->retransmissionBuffer.empty()); } +TEST_F(QuicTransportFunctionsTest, ProbingNotFallbackToPingWhenNoQuota) { + auto conn = createConn(); + auto mockCongestionController = + std::make_unique>(); + auto rawCongestionController = mockCongestionController.get(); + conn->congestionController = std::move(mockCongestionController); + EventBase evb; + auto socket = + std::make_unique>(&evb); + auto rawSocket = socket.get(); + EXPECT_CALL(*rawCongestionController, onPacketSent(_)).Times(0); + EXPECT_CALL(*rawSocket, write(_, _)).Times(0); + uint8_t probesToSend = 0; + EXPECT_EQ( + 0, + writeProbingDataToSocketForTest( + *rawSocket, + *conn, + probesToSend, + *aead, + *headerCipher, + getVersion(*conn))); +} + TEST_F(QuicTransportFunctionsTest, ProbingFallbackToPing) { auto conn = createConn(); auto mockCongestionController =