From 95f3730569151b118860c47c16b9a972a2e8ace1 Mon Sep 17 00:00:00 2001 From: Yang Chi Date: Sat, 12 Sep 2020 16:48:23 -0700 Subject: [PATCH] Fix bad probe sending condition in crypto writes Summary: Wrong parenthesis Reviewed By: mjoras Differential Revision: D23655249 fbshipit-source-id: 03480601ed50053d7f19fe79d77f831d6349aa6e --- quic/api/QuicTransportFunctions.cpp | 5 +-- quic/api/test/QuicTransportFunctionsTest.cpp | 43 +++++++++++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) 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 =