diff --git a/quic/api/QuicPacketScheduler.cpp b/quic/api/QuicPacketScheduler.cpp index fec882def..0e05f056e 100644 --- a/quic/api/QuicPacketScheduler.cpp +++ b/quic/api/QuicPacketScheduler.cpp @@ -632,9 +632,6 @@ bool DatagramFrameScheduler::writeDatagramFrames( if (writeFrame(datagramFrame, builder) > 0) { conn_.datagramState.writeBuffer.pop_front(); sent = true; - } else { - payload = datagramFrame.data.move(); - break; } if (conn_.transportSettings.datagramConfig.framePerPacket) { break; diff --git a/quic/api/test/QuicPacketSchedulerTest.cpp b/quic/api/test/QuicPacketSchedulerTest.cpp index b6c057b44..eb5615735 100644 --- a/quic/api/test/QuicPacketSchedulerTest.cpp +++ b/quic/api/test/QuicPacketSchedulerTest.cpp @@ -1850,18 +1850,18 @@ TEST_F(QuicPacketSchedulerTest, DatagramFrameSchedulerMultipleFramesPerPacket) { conn.transportSettings.datagramConfig.framePerPacket = false; DatagramFrameScheduler scheduler(conn); // Add datagrams - conn.datagramState.writeBuffer.emplace_back( - folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); - conn.datagramState.writeBuffer.emplace_back( - folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); - NiceMock builder2; - EXPECT_CALL(builder2, remainingSpaceInPkt()).WillRepeatedly(Return(4096)); - EXPECT_CALL(builder2, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { - builder2.frames_.push_back(f); + std::string s1(conn.udpSendPacketLen / 3, '*'); + conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s1)); + std::string s2(conn.udpSendPacketLen / 3, '%'); + conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s2)); + NiceMock builder; + EXPECT_CALL(builder, remainingSpaceInPkt()).WillRepeatedly(Return(4096)); + EXPECT_CALL(builder, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { + builder.frames_.push_back(f); })); // Call scheduler - auto& frames = builder2.frames_; - scheduler.writeDatagramFrames(builder2); + auto& frames = builder.frames_; + scheduler.writeDatagramFrames(builder); ASSERT_EQ(frames.size(), 2); } @@ -1873,23 +1873,49 @@ TEST_F(QuicPacketSchedulerTest, DatagramFrameSchedulerOneFramePerPacket) { conn.transportSettings.datagramConfig.framePerPacket = true; DatagramFrameScheduler scheduler(conn); // Add datagrams - conn.datagramState.writeBuffer.emplace_back( - folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); - conn.datagramState.writeBuffer.emplace_back( - folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); - NiceMock builder2; - EXPECT_CALL(builder2, remainingSpaceInPkt()).WillRepeatedly(Return(4096)); - EXPECT_CALL(builder2, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { - builder2.frames_.push_back(f); + std::string s1(conn.udpSendPacketLen / 3, '*'); + conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s1)); + std::string s2(conn.udpSendPacketLen / 3, '%'); + conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s2)); + NiceMock builder; + EXPECT_CALL(builder, remainingSpaceInPkt()).WillRepeatedly(Return(4096)); + EXPECT_CALL(builder, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { + builder.frames_.push_back(f); })); // Call scheduler - auto& frames = builder2.frames_; - scheduler.writeDatagramFrames(builder2); + auto& frames = builder.frames_; + scheduler.writeDatagramFrames(builder); ASSERT_EQ(frames.size(), 1); - scheduler.writeDatagramFrames(builder2); + scheduler.writeDatagramFrames(builder); ASSERT_EQ(frames.size(), 2); } +TEST_F(QuicPacketSchedulerTest, DatagramFrameWriteWhenRoomAvailable) { + QuicClientConnectionState conn( + FizzClientQuicHandshakeContext::Builder().build()); + conn.datagramState.maxReadFrameSize = std::numeric_limits::max(); + conn.datagramState.maxReadBufferSize = 10; + conn.transportSettings.datagramConfig.framePerPacket = true; + DatagramFrameScheduler scheduler(conn); + // Add datagram + std::string s(conn.udpSendPacketLen / 3, '*'); + conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s)); + NiceMock builder; + EXPECT_CALL(builder, remainingSpaceInPkt()) + .WillRepeatedly(Return(conn.udpSendPacketLen / 4)); + EXPECT_CALL(builder, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { + builder.frames_.push_back(f); + })); + // Call scheduler + auto& frames = builder.frames_; + scheduler.writeDatagramFrames(builder); + ASSERT_EQ(frames.size(), 0); + EXPECT_CALL(builder, remainingSpaceInPkt()) + .WillRepeatedly(Return(conn.udpSendPacketLen / 2)); + scheduler.writeDatagramFrames(builder); + ASSERT_EQ(frames.size(), 1); +} + INSTANTIATE_TEST_CASE_P( QuicPacketSchedulerTests, QuicPacketSchedulerTest,