diff --git a/quic/api/QuicTransportFunctions.cpp b/quic/api/QuicTransportFunctions.cpp index bf2fd1519..4c30312ef 100644 --- a/quic/api/QuicTransportFunctions.cpp +++ b/quic/api/QuicTransportFunctions.cpp @@ -817,9 +817,8 @@ uint64_t writeCryptoAndAckDataToSocket( uint64_t written = 0; auto& cryptoStream = *getCryptoStream(*connection.cryptoState, encryptionLevel); - if ((connection.pendingEvents.numProbePackets && - cryptoStream.retransmissionBuffer.size()) || - scheduler.hasData()) { + if (connection.pendingEvents.numProbePackets && + (cryptoStream.retransmissionBuffer.size() || scheduler.hasData())) { written = writeProbingDataToSocket( sock, connection, diff --git a/quic/api/test/QuicTransportFunctionsTest.cpp b/quic/api/test/QuicTransportFunctionsTest.cpp index 970c90e68..db711d6db 100644 --- a/quic/api/test/QuicTransportFunctionsTest.cpp +++ b/quic/api/test/QuicTransportFunctionsTest.cpp @@ -1638,7 +1638,6 @@ TEST_F(QuicTransportFunctionsTest, ProbingFallbackToPing) { TEST_F(QuicTransportFunctionsTest, TestCryptoWritingIsHandshakeInOutstanding) { auto conn = createConn(); - // TODO: use handshake write cipher with draft-14. auto cryptoStream = &conn->cryptoState->initialStream; auto buf = buildRandomInputData(200); writeDataToQuicStream(*cryptoStream, buf->clone()); @@ -1663,6 +1662,48 @@ TEST_F(QuicTransportFunctionsTest, TestCryptoWritingIsHandshakeInOutstanding) { ->isHandshake); } +TEST_F(QuicTransportFunctionsTest, NoCryptoProbeWriteIfNoProbeCredit) { + auto conn = createConn(); + auto cryptoStream = &conn->cryptoState->initialStream; + auto buf = buildRandomInputData(200); + writeDataToQuicStream(*cryptoStream, buf->clone()); + EventBase evb; + auto socket = + std::make_unique>(&evb); + auto rawSocket = socket.get(); + EXPECT_EQ( + 1, + writeCryptoAndAckDataToSocket( + *rawSocket, + *conn, + *conn->clientConnectionId, + *conn->serverConnectionId, + LongHeader::Types::Initial, + *conn->initialWriteCipher, + *conn->initialHeaderCipher, + getVersion(*conn), + conn->transportSettings.writeConnectionDataPacketsLimit)); + ASSERT_EQ(1, conn->outstandings.packets.size()); + EXPECT_TRUE(getFirstOutstandingPacket(*conn, PacketNumberSpace::Initial) + ->isHandshake); + ASSERT_EQ(1, cryptoStream->retransmissionBuffer.size()); + ASSERT_TRUE(cryptoStream->writeBuffer.empty()); + + conn->pendingEvents.numProbePackets = 0; + EXPECT_EQ( + 0, + writeCryptoAndAckDataToSocket( + *rawSocket, + *conn, + *conn->clientConnectionId, + *conn->serverConnectionId, + LongHeader::Types::Initial, + *conn->initialWriteCipher, + *conn->initialHeaderCipher, + getVersion(*conn), + conn->transportSettings.writeConnectionDataPacketsLimit)); +} + TEST_F(QuicTransportFunctionsTest, WritePureAckWhenNoWritableBytes) { auto conn = createConn(); auto mockCongestionController =