| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
| 10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 using testing::InSequence; | 25 using testing::InSequence; |
| 26 using testing::Return; | 26 using testing::Return; |
| 27 using testing::SaveArg; | 27 using testing::SaveArg; |
| 28 using testing::StrictMock; | 28 using testing::StrictMock; |
| 29 using testing::_; | 29 using testing::_; |
| 30 | 30 |
| 31 namespace net { | 31 namespace net { |
| 32 namespace test { | 32 namespace test { |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 const int64 kMinFecTimeoutMs = 5u; |
| 36 |
| 35 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | 37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
| 36 public: | 38 public: |
| 37 MockDelegate() {} | 39 MockDelegate() {} |
| 38 ~MockDelegate() override {} | 40 ~MockDelegate() override {} |
| 39 | 41 |
| 40 MOCK_METHOD3(ShouldGeneratePacket, | 42 MOCK_METHOD3(ShouldGeneratePacket, |
| 41 bool(TransmissionType transmission_type, | 43 bool(TransmissionType transmission_type, |
| 42 HasRetransmittableData retransmittable, | 44 HasRetransmittableData retransmittable, |
| 43 IsHandshake handshake)); | 45 IsHandshake handshake)); |
| 44 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 46 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
| 45 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | |
| 46 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 47 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); |
| 47 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); | 48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); |
| 48 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
| 49 | 50 |
| 50 void SetCanWriteAnything() { | 51 void SetCanWriteAnything() { |
| 51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 52 .WillRepeatedly(Return(true)); | 53 .WillRepeatedly(Return(true)); |
| 53 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
| 54 NO_RETRANSMITTABLE_DATA, _)) | 55 NO_RETRANSMITTABLE_DATA, _)) |
| 55 .WillRepeatedly(Return(true)); | 56 .WillRepeatedly(Return(true)); |
| 56 } | 57 } |
| 57 | 58 |
| 58 void SetCanNotWrite() { | 59 void SetCanNotWrite() { |
| 59 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 60 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 60 .WillRepeatedly(Return(false)); | 61 .WillRepeatedly(Return(false)); |
| 61 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 62 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
| 62 NO_RETRANSMITTABLE_DATA, _)) | 63 NO_RETRANSMITTABLE_DATA, _)) |
| 63 .WillRepeatedly(Return(false)); | 64 .WillRepeatedly(Return(false)); |
| 64 } | 65 } |
| 65 | 66 |
| 66 // Use this when only ack and feedback frames should be allowed to be written. | 67 // Use this when only ack frames should be allowed to be written. |
| 67 void SetCanWriteOnlyNonRetransmittable() { | 68 void SetCanWriteOnlyNonRetransmittable() { |
| 68 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 69 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 69 .WillRepeatedly(Return(false)); | 70 .WillRepeatedly(Return(false)); |
| 70 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 71 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
| 71 NO_RETRANSMITTABLE_DATA, _)) | 72 NO_RETRANSMITTABLE_DATA, _)) |
| 72 .WillRepeatedly(Return(true)); | 73 .WillRepeatedly(Return(true)); |
| 73 } | 74 } |
| 74 | 75 |
| 75 private: | 76 private: |
| 76 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | 77 DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
| 77 }; | 78 }; |
| 78 | 79 |
| 79 // Simple struct for describing the contents of a packet. | 80 // Simple struct for describing the contents of a packet. |
| 80 // Useful in conjunction with a SimpleQuicFrame for validating | 81 // Useful in conjunction with a SimpleQuicFrame for validating that a packet |
| 81 // that a packet contains the expected frames. | 82 // contains the expected frames. |
| 82 struct PacketContents { | 83 struct PacketContents { |
| 83 PacketContents() | 84 PacketContents() |
| 84 : num_ack_frames(0), | 85 : num_ack_frames(0), |
| 85 num_connection_close_frames(0), | 86 num_connection_close_frames(0), |
| 86 num_feedback_frames(0), | |
| 87 num_goaway_frames(0), | 87 num_goaway_frames(0), |
| 88 num_rst_stream_frames(0), | 88 num_rst_stream_frames(0), |
| 89 num_stop_waiting_frames(0), | 89 num_stop_waiting_frames(0), |
| 90 num_stream_frames(0), | 90 num_stream_frames(0), |
| 91 fec_group(0) { | 91 fec_group(0) { |
| 92 } | 92 } |
| 93 | 93 |
| 94 size_t num_ack_frames; | 94 size_t num_ack_frames; |
| 95 size_t num_connection_close_frames; | 95 size_t num_connection_close_frames; |
| 96 size_t num_feedback_frames; | |
| 97 size_t num_goaway_frames; | 96 size_t num_goaway_frames; |
| 98 size_t num_rst_stream_frames; | 97 size_t num_rst_stream_frames; |
| 99 size_t num_stop_waiting_frames; | 98 size_t num_stop_waiting_frames; |
| 100 size_t num_stream_frames; | 99 size_t num_stream_frames; |
| 101 | 100 |
| 102 QuicFecGroupNumber fec_group; | 101 QuicFecGroupNumber fec_group; |
| 103 }; | 102 }; |
| 104 | 103 |
| 105 } // namespace | 104 } // namespace |
| 106 | 105 |
| 107 class QuicPacketGeneratorTest : public ::testing::Test { | 106 class QuicPacketGeneratorTest : public ::testing::Test { |
| 108 protected: | 107 protected: |
| 109 QuicPacketGeneratorTest() | 108 QuicPacketGeneratorTest() |
| 110 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 109 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
| 111 generator_(42, &framer_, &random_, &delegate_), | 110 generator_(42, &framer_, &random_, &delegate_), |
| 112 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), | 111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), |
| 113 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 112 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 114 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 113 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 115 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 114 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 116 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 115 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 117 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 116 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 118 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | 117 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 119 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} | 118 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
| 119 packet8_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} |
| 120 | 120 |
| 121 ~QuicPacketGeneratorTest() override { | 121 ~QuicPacketGeneratorTest() override { |
| 122 delete packet_.packet; | 122 delete packet_.packet; |
| 123 delete packet_.retransmittable_frames; | 123 delete packet_.retransmittable_frames; |
| 124 delete packet2_.packet; | 124 delete packet2_.packet; |
| 125 delete packet2_.retransmittable_frames; | 125 delete packet2_.retransmittable_frames; |
| 126 delete packet3_.packet; | 126 delete packet3_.packet; |
| 127 delete packet3_.retransmittable_frames; | 127 delete packet3_.retransmittable_frames; |
| 128 delete packet4_.packet; | 128 delete packet4_.packet; |
| 129 delete packet4_.retransmittable_frames; | 129 delete packet4_.retransmittable_frames; |
| 130 delete packet5_.packet; | 130 delete packet5_.packet; |
| 131 delete packet5_.retransmittable_frames; | 131 delete packet5_.retransmittable_frames; |
| 132 delete packet6_.packet; | 132 delete packet6_.packet; |
| 133 delete packet6_.retransmittable_frames; | 133 delete packet6_.retransmittable_frames; |
| 134 delete packet7_.packet; | 134 delete packet7_.packet; |
| 135 delete packet7_.retransmittable_frames; | 135 delete packet7_.retransmittable_frames; |
| 136 delete packet8_.packet; |
| 137 delete packet8_.retransmittable_frames; |
| 136 } | 138 } |
| 137 | 139 |
| 138 QuicAckFrame* CreateAckFrame() { | 140 QuicAckFrame* CreateAckFrame() { |
| 139 // TODO(rch): Initialize this so it can be verified later. | 141 // TODO(rch): Initialize this so it can be verified later. |
| 140 return new QuicAckFrame(MakeAckFrame(0)); | 142 return new QuicAckFrame(MakeAckFrame(0)); |
| 141 } | 143 } |
| 142 | 144 |
| 143 QuicCongestionFeedbackFrame* CreateFeedbackFrame() { | |
| 144 QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame; | |
| 145 frame->type = kTCP; | |
| 146 frame->tcp.receive_window = 0x4030; | |
| 147 return frame; | |
| 148 } | |
| 149 | |
| 150 QuicStopWaitingFrame* CreateStopWaitingFrame() { | 145 QuicStopWaitingFrame* CreateStopWaitingFrame() { |
| 151 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame(); | 146 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame(); |
| 152 frame->entropy_hash = 0; | 147 frame->entropy_hash = 0; |
| 153 frame->least_unacked = 0; | 148 frame->least_unacked = 0; |
| 154 return frame; | 149 return frame; |
| 155 } | 150 } |
| 156 | 151 |
| 157 QuicRstStreamFrame* CreateRstStreamFrame() { | 152 QuicRstStreamFrame* CreateRstStreamFrame() { |
| 158 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); | 153 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); |
| 159 } | 154 } |
| 160 | 155 |
| 161 QuicGoAwayFrame* CreateGoAwayFrame() { | 156 QuicGoAwayFrame* CreateGoAwayFrame() { |
| 162 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); | 157 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); |
| 163 } | 158 } |
| 164 | 159 |
| 165 void CheckPacketContains(const PacketContents& contents, | 160 void CheckPacketContains(const PacketContents& contents, |
| 166 const SerializedPacket& packet) { | 161 const SerializedPacket& packet) { |
| 167 size_t num_retransmittable_frames = contents.num_connection_close_frames + | 162 size_t num_retransmittable_frames = contents.num_connection_close_frames + |
| 168 contents.num_goaway_frames + contents.num_rst_stream_frames + | 163 contents.num_goaway_frames + contents.num_rst_stream_frames + |
| 169 contents.num_stream_frames; | 164 contents.num_stream_frames; |
| 170 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + | 165 size_t num_frames = contents.num_ack_frames + |
| 171 contents.num_stop_waiting_frames + num_retransmittable_frames; | 166 contents.num_stop_waiting_frames + |
| 167 num_retransmittable_frames; |
| 172 | 168 |
| 173 if (num_retransmittable_frames == 0) { | 169 if (num_retransmittable_frames == 0) { |
| 174 ASSERT_TRUE(packet.retransmittable_frames == nullptr); | 170 ASSERT_TRUE(packet.retransmittable_frames == nullptr); |
| 175 } else { | 171 } else { |
| 176 ASSERT_TRUE(packet.retransmittable_frames != nullptr); | 172 ASSERT_TRUE(packet.retransmittable_frames != nullptr); |
| 177 EXPECT_EQ(num_retransmittable_frames, | 173 EXPECT_EQ(num_retransmittable_frames, |
| 178 packet.retransmittable_frames->frames().size()); | 174 packet.retransmittable_frames->frames().size()); |
| 179 } | 175 } |
| 180 | 176 |
| 181 ASSERT_TRUE(packet.packet != nullptr); | 177 ASSERT_TRUE(packet.packet != nullptr); |
| 182 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | 178 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
| 183 EXPECT_EQ(num_frames, simple_framer_.num_frames()); | 179 EXPECT_EQ(num_frames, simple_framer_.num_frames()); |
| 184 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); | 180 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); |
| 185 EXPECT_EQ(contents.num_connection_close_frames, | 181 EXPECT_EQ(contents.num_connection_close_frames, |
| 186 simple_framer_.connection_close_frames().size()); | 182 simple_framer_.connection_close_frames().size()); |
| 187 EXPECT_EQ(contents.num_feedback_frames, | |
| 188 simple_framer_.feedback_frames().size()); | |
| 189 EXPECT_EQ(contents.num_goaway_frames, | 183 EXPECT_EQ(contents.num_goaway_frames, |
| 190 simple_framer_.goaway_frames().size()); | 184 simple_framer_.goaway_frames().size()); |
| 191 EXPECT_EQ(contents.num_rst_stream_frames, | 185 EXPECT_EQ(contents.num_rst_stream_frames, |
| 192 simple_framer_.rst_stream_frames().size()); | 186 simple_framer_.rst_stream_frames().size()); |
| 193 EXPECT_EQ(contents.num_stream_frames, | 187 EXPECT_EQ(contents.num_stream_frames, |
| 194 simple_framer_.stream_frames().size()); | 188 simple_framer_.stream_frames().size()); |
| 195 EXPECT_EQ(contents.num_stop_waiting_frames, | 189 EXPECT_EQ(contents.num_stop_waiting_frames, |
| 196 simple_framer_.stop_waiting_frames().size()); | 190 simple_framer_.stop_waiting_frames().size()); |
| 197 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); | 191 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); |
| 198 } | 192 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 229 QuicPacketGenerator generator_; | 223 QuicPacketGenerator generator_; |
| 230 QuicPacketCreator* creator_; | 224 QuicPacketCreator* creator_; |
| 231 SimpleQuicFramer simple_framer_; | 225 SimpleQuicFramer simple_framer_; |
| 232 SerializedPacket packet_; | 226 SerializedPacket packet_; |
| 233 SerializedPacket packet2_; | 227 SerializedPacket packet2_; |
| 234 SerializedPacket packet3_; | 228 SerializedPacket packet3_; |
| 235 SerializedPacket packet4_; | 229 SerializedPacket packet4_; |
| 236 SerializedPacket packet5_; | 230 SerializedPacket packet5_; |
| 237 SerializedPacket packet6_; | 231 SerializedPacket packet6_; |
| 238 SerializedPacket packet7_; | 232 SerializedPacket packet7_; |
| 233 SerializedPacket packet8_; |
| 239 | 234 |
| 240 private: | 235 private: |
| 241 scoped_ptr<char[]> data_array_; | 236 scoped_ptr<char[]> data_array_; |
| 242 }; | 237 }; |
| 243 | 238 |
| 244 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { | 239 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { |
| 245 public: | 240 public: |
| 246 MOCK_METHOD1(OnFrameAddedToPacket, | 241 MOCK_METHOD1(OnFrameAddedToPacket, |
| 247 void(const QuicFrame&)); | 242 void(const QuicFrame&)); |
| 248 }; | 243 }; |
| 249 | 244 |
| 250 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 245 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
| 251 delegate_.SetCanNotWrite(); | 246 delegate_.SetCanNotWrite(); |
| 252 | 247 |
| 253 generator_.SetShouldSendAck(false, false); | 248 generator_.SetShouldSendAck(false); |
| 254 EXPECT_TRUE(generator_.HasQueuedFrames()); | 249 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 255 } | 250 } |
| 256 | 251 |
| 257 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 252 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
| 258 StrictMock<MockDebugDelegate> debug_delegate; | 253 StrictMock<MockDebugDelegate> debug_delegate; |
| 259 | 254 |
| 260 generator_.set_debug_delegate(&debug_delegate); | 255 generator_.set_debug_delegate(&debug_delegate); |
| 261 delegate_.SetCanWriteOnlyNonRetransmittable(); | 256 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 262 generator_.StartBatchOperations(); | 257 generator_.StartBatchOperations(); |
| 263 | 258 |
| 264 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 259 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 265 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 260 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
| 266 | 261 |
| 267 generator_.SetShouldSendAck(false, false); | 262 generator_.SetShouldSendAck(false); |
| 268 EXPECT_TRUE(generator_.HasQueuedFrames()); | 263 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 269 } | 264 } |
| 270 | 265 |
| 271 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 266 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
| 272 delegate_.SetCanWriteOnlyNonRetransmittable(); | 267 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 273 | 268 |
| 274 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 269 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 275 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 270 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 276 | 271 |
| 277 generator_.SetShouldSendAck(false, false); | 272 generator_.SetShouldSendAck(false); |
| 278 EXPECT_FALSE(generator_.HasQueuedFrames()); | 273 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 279 | 274 |
| 280 PacketContents contents; | 275 PacketContents contents; |
| 281 contents.num_ack_frames = 1; | 276 contents.num_ack_frames = 1; |
| 282 CheckPacketContains(contents, packet_); | 277 CheckPacketContains(contents, packet_); |
| 283 } | 278 } |
| 284 | 279 |
| 285 TEST_F(QuicPacketGeneratorTest, | |
| 286 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) { | |
| 287 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
| 288 generator_.StartBatchOperations(); | |
| 289 | |
| 290 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | |
| 291 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
| 292 Return(CreateFeedbackFrame())); | |
| 293 | |
| 294 generator_.SetShouldSendAck(true, false); | |
| 295 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
| 296 } | |
| 297 | |
| 298 TEST_F(QuicPacketGeneratorTest, | |
| 299 ShouldSendAckWithFeedback_WritableAndShouldFlush) { | |
| 300 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
| 301 | |
| 302 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | |
| 303 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
| 304 Return(CreateFeedbackFrame())); | |
| 305 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | |
| 306 Return(CreateStopWaitingFrame())); | |
| 307 | |
| 308 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
| 309 | |
| 310 generator_.SetShouldSendAck(true, true); | |
| 311 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 312 | |
| 313 PacketContents contents; | |
| 314 contents.num_ack_frames = 1; | |
| 315 contents.num_feedback_frames = 1; | |
| 316 contents.num_stop_waiting_frames = 1; | |
| 317 CheckPacketContains(contents, packet_); | |
| 318 } | |
| 319 | |
| 320 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 280 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
| 321 ValueRestore<bool> old_flag(&FLAGS_quic_disallow_multiple_pending_ack_frames, | |
| 322 true); | |
| 323 | |
| 324 // Make sure that calling SetShouldSendAck multiple times does not result in a | 281 // Make sure that calling SetShouldSendAck multiple times does not result in a |
| 325 // crash. Previously this would result in multiple QuicFrames queued in the | 282 // crash. Previously this would result in multiple QuicFrames queued in the |
| 326 // packet generator, with all but the last with internal pointers to freed | 283 // packet generator, with all but the last with internal pointers to freed |
| 327 // memory. | 284 // memory. |
| 328 delegate_.SetCanWriteAnything(); | 285 delegate_.SetCanWriteAnything(); |
| 329 | 286 |
| 330 // Only one AckFrame should be created. | 287 // Only one AckFrame should be created. |
| 331 EXPECT_CALL(delegate_, CreateAckFrame()) | 288 EXPECT_CALL(delegate_, CreateAckFrame()) |
| 332 .Times(1) | 289 .Times(1) |
| 333 .WillOnce(Return(CreateAckFrame())); | 290 .WillOnce(Return(CreateAckFrame())); |
| 334 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 291 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 335 .Times(1) | 292 .Times(1) |
| 336 .WillOnce(SaveArg<0>(&packet_)); | 293 .WillOnce(SaveArg<0>(&packet_)); |
| 337 | 294 |
| 338 generator_.StartBatchOperations(); | 295 generator_.StartBatchOperations(); |
| 339 generator_.SetShouldSendAck(false, false); | 296 generator_.SetShouldSendAck(false); |
| 340 generator_.SetShouldSendAck(false, false); | 297 generator_.SetShouldSendAck(false); |
| 341 generator_.FinishBatchOperations(); | 298 generator_.FinishBatchOperations(); |
| 342 } | 299 } |
| 343 | 300 |
| 344 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 301 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
| 345 delegate_.SetCanNotWrite(); | 302 delegate_.SetCanNotWrite(); |
| 346 | 303 |
| 347 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 304 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 348 EXPECT_TRUE(generator_.HasQueuedFrames()); | 305 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 349 } | 306 } |
| 350 | 307 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 EXPECT_EQ(3u, consumed.bytes_consumed); | 381 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 425 EXPECT_TRUE(consumed.fin_consumed); | 382 EXPECT_TRUE(consumed.fin_consumed); |
| 426 EXPECT_FALSE(generator_.HasQueuedFrames()); | 383 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 427 | 384 |
| 428 PacketContents contents; | 385 PacketContents contents; |
| 429 contents.num_stream_frames = 1; | 386 contents.num_stream_frames = 1; |
| 430 CheckPacketContains(contents, packet_); | 387 CheckPacketContains(contents, packet_); |
| 431 } | 388 } |
| 432 | 389 |
| 433 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | 390 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { |
| 434 ValueRestore<bool> old_flag(&FLAGS_quic_empty_data_no_fin_early_return, true); | |
| 435 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, | 391 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, |
| 436 false, MAY_FEC_PROTECT, nullptr), | 392 false, MAY_FEC_PROTECT, nullptr), |
| 437 "Attempt to consume empty data without FIN."); | 393 "Attempt to consume empty data without FIN."); |
| 438 } | 394 } |
| 439 | 395 |
| 440 TEST_F(QuicPacketGeneratorTest, | 396 TEST_F(QuicPacketGeneratorTest, |
| 441 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 397 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
| 442 delegate_.SetCanWriteAnything(); | 398 delegate_.SetCanWriteAnything(); |
| 443 generator_.StartBatchOperations(); | 399 generator_.StartBatchOperations(); |
| 444 | 400 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 466 // Now both frames will be flushed out. | 422 // Now both frames will be flushed out. |
| 467 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 423 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 468 generator_.FinishBatchOperations(); | 424 generator_.FinishBatchOperations(); |
| 469 EXPECT_FALSE(generator_.HasQueuedFrames()); | 425 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 470 | 426 |
| 471 PacketContents contents; | 427 PacketContents contents; |
| 472 contents.num_stream_frames = 2; | 428 contents.num_stream_frames = 2; |
| 473 CheckPacketContains(contents, packet_); | 429 CheckPacketContains(contents, packet_); |
| 474 } | 430 } |
| 475 | 431 |
| 476 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 432 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnMaxGroupSize) { |
| 477 delegate_.SetCanWriteAnything(); | 433 delegate_.SetCanWriteAnything(); |
| 478 | 434 |
| 479 // Send FEC every two packets. | 435 // Send FEC every two packets. |
| 480 creator_->set_max_packets_per_fec_group(2); | 436 creator_->set_max_packets_per_fec_group(2); |
| 481 | 437 |
| 482 { | 438 { |
| 483 InSequence dummy; | 439 InSequence dummy; |
| 484 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 440 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 485 SaveArg<0>(&packet_)); | 441 SaveArg<0>(&packet_)); |
| 486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 442 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 487 SaveArg<0>(&packet2_)); | 443 SaveArg<0>(&packet2_)); |
| 488 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 444 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 489 SaveArg<0>(&packet3_)); | 445 SaveArg<0>(&packet3_)); |
| 490 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 446 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 491 SaveArg<0>(&packet4_)); | 447 SaveArg<0>(&packet4_)); |
| 492 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
| 493 SaveArg<0>(&packet5_)); | |
| 494 } | 448 } |
| 495 | 449 |
| 496 // Send enough data to create 3 packets: two full and one partial. Send | 450 // Send enough data to create 3 packets: two full and one partial. Send with |
| 497 // with MUST_FEC_PROTECT flag. | 451 // MUST_FEC_PROTECT flag. |
| 498 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 452 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 499 QuicConsumedData consumed = generator_.ConsumeData( | 453 QuicConsumedData consumed = generator_.ConsumeData( |
| 500 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | 454 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 501 EXPECT_EQ(data_len, consumed.bytes_consumed); | 455 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 502 EXPECT_TRUE(consumed.fin_consumed); | 456 EXPECT_TRUE(consumed.fin_consumed); |
| 503 EXPECT_FALSE(generator_.HasQueuedFrames()); | 457 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 504 | 458 |
| 505 CheckPacketHasSingleStreamFrame(packet_); | 459 CheckPacketHasSingleStreamFrame(packet_); |
| 506 CheckPacketHasSingleStreamFrame(packet2_); | 460 CheckPacketHasSingleStreamFrame(packet2_); |
| 507 CheckPacketIsFec(packet3_, 1); | 461 CheckPacketIsFec(packet3_, 1); |
| 462 CheckPacketHasSingleStreamFrame(packet4_); |
| 463 EXPECT_TRUE(creator_->IsFecProtected()); |
| 508 | 464 |
| 509 CheckPacketHasSingleStreamFrame(packet4_); | 465 // The FEC packet under construction will be sent when one more packet is sent |
| 510 CheckPacketIsFec(packet5_, 4); | 466 // (since FEC group size is 2), or when OnFecTimeout is called. Send more data |
| 467 // with MAY_FEC_PROTECT. This packet should also be protected, and FEC packet |
| 468 // is sent since FEC group size is reached. |
| 469 { |
| 470 InSequence dummy; |
| 471 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 472 .WillOnce(SaveArg<0>(&packet5_)); |
| 473 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 474 .WillOnce(SaveArg<0>(&packet6_)); |
| 475 } |
| 476 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 477 nullptr); |
| 478 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 479 CheckPacketHasSingleStreamFrame(packet5_); |
| 480 CheckPacketIsFec(packet6_, 4); |
| 481 EXPECT_FALSE(creator_->IsFecProtected()); |
| 511 } | 482 } |
| 512 | 483 |
| 513 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 484 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) { |
| 514 delegate_.SetCanWriteAnything(); | 485 delegate_.SetCanWriteAnything(); |
| 486 creator_->set_max_packets_per_fec_group(1000); |
| 515 | 487 |
| 516 // Enable FEC. | 488 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the |
| 489 // creator FEC protects all data. |
| 490 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 491 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true, |
| 492 MUST_FEC_PROTECT, nullptr); |
| 493 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 494 EXPECT_TRUE(consumed.fin_consumed); |
| 495 CheckPacketHasSingleStreamFrame(packet_); |
| 496 EXPECT_TRUE(creator_->IsFecProtected()); |
| 497 |
| 498 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, |
| 499 // and FEC packet is not yet sent. |
| 500 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); |
| 501 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 502 nullptr); |
| 503 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 504 CheckPacketHasSingleStreamFrame(packet2_); |
| 505 EXPECT_TRUE(creator_->IsFecProtected()); |
| 506 |
| 507 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 508 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); |
| 509 generator_.OnFecTimeout(); |
| 510 CheckPacketIsFec(packet3_, 1); |
| 511 EXPECT_FALSE(creator_->IsFecProtected()); |
| 512 |
| 513 // Subsequent data is protected under the next FEC group. Send enough data to |
| 514 // create 2 more packets: one full and one partial. |
| 515 { |
| 516 InSequence dummy; |
| 517 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 518 .WillOnce(SaveArg<0>(&packet4_)); |
| 519 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 520 .WillOnce(SaveArg<0>(&packet5_)); |
| 521 } |
| 522 size_t data_len = kDefaultMaxPacketSize + 1; |
| 523 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 524 MUST_FEC_PROTECT, nullptr); |
| 525 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 526 EXPECT_TRUE(consumed.fin_consumed); |
| 527 CheckPacketHasSingleStreamFrame(packet4_); |
| 528 CheckPacketHasSingleStreamFrame(packet5_); |
| 529 EXPECT_TRUE(creator_->IsFecProtected()); |
| 530 |
| 531 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 532 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); |
| 533 generator_.OnFecTimeout(); |
| 534 CheckPacketIsFec(packet6_, 4); |
| 535 EXPECT_FALSE(creator_->IsFecProtected()); |
| 536 } |
| 537 |
| 538 TEST_F(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) { |
| 539 delegate_.SetCanWriteAnything(); |
| 517 creator_->set_max_packets_per_fec_group(6); | 540 creator_->set_max_packets_per_fec_group(6); |
| 541 |
| 542 // Send enough data to create 2 packets: one full and one partial. Send with |
| 543 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC |
| 544 // protects all data. |
| 518 { | 545 { |
| 519 InSequence dummy; | 546 InSequence dummy; |
| 520 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 547 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 521 SaveArg<0>(&packet_)); | 548 SaveArg<0>(&packet_)); |
| 522 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 549 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 523 SaveArg<0>(&packet2_)); | 550 SaveArg<0>(&packet2_)); |
| 524 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
| 525 SaveArg<0>(&packet3_)); | |
| 526 } | 551 } |
| 527 | |
| 528 // Send enough data to create 2 packets: one full and one partial. Send | |
| 529 // with MUST_FEC_PROTECT flag. | |
| 530 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 552 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
| 531 QuicConsumedData consumed = generator_.ConsumeData( | 553 QuicConsumedData consumed = generator_.ConsumeData( |
| 532 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | 554 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 533 EXPECT_EQ(data_len, consumed.bytes_consumed); | 555 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 534 EXPECT_TRUE(consumed.fin_consumed); | 556 EXPECT_TRUE(consumed.fin_consumed); |
| 535 EXPECT_FALSE(generator_.HasQueuedFrames()); | 557 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 536 | |
| 537 CheckPacketHasSingleStreamFrame(packet_); | 558 CheckPacketHasSingleStreamFrame(packet_); |
| 538 CheckPacketHasSingleStreamFrame(packet2_); | 559 CheckPacketHasSingleStreamFrame(packet2_); |
| 539 CheckPacketIsFec(packet3_, 1); | 560 EXPECT_TRUE(creator_->IsFecProtected()); |
| 561 |
| 562 // GetFecTimeout returns finite timeout only for first packet in group. |
| 563 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), |
| 564 generator_.GetFecTimeout(/*sequence_number=*/1u)); |
| 565 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 566 generator_.GetFecTimeout(/*sequence_number=*/2u)); |
| 567 |
| 568 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, |
| 569 // and FEC packet is not yet sent. |
| 570 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); |
| 571 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 572 nullptr); |
| 573 CheckPacketHasSingleStreamFrame(packet3_); |
| 574 EXPECT_TRUE(creator_->IsFecProtected()); |
| 575 |
| 576 // GetFecTimeout returns finite timeout only for first packet in group. |
| 577 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 578 generator_.GetFecTimeout(/*sequence_number=*/3u)); |
| 579 |
| 580 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 581 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet4_)); |
| 582 generator_.OnFecTimeout(); |
| 583 CheckPacketIsFec(packet4_, /*fec_group=*/1u); |
| 584 EXPECT_FALSE(creator_->IsFecProtected()); |
| 585 |
| 586 // Subsequent data is protected under the next FEC group. Send enough data to |
| 587 // create 2 more packets: one full and one partial. |
| 588 { |
| 589 InSequence dummy; |
| 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 591 .WillOnce(SaveArg<0>(&packet5_)); |
| 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 593 .WillOnce(SaveArg<0>(&packet6_)); |
| 594 } |
| 595 data_len = kDefaultMaxPacketSize + 1u; |
| 596 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 597 MUST_FEC_PROTECT, nullptr); |
| 598 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 599 EXPECT_TRUE(consumed.fin_consumed); |
| 600 CheckPacketHasSingleStreamFrame(packet5_); |
| 601 CheckPacketHasSingleStreamFrame(packet6_); |
| 602 EXPECT_TRUE(creator_->IsFecProtected()); |
| 603 |
| 604 // GetFecTimeout returns finite timeout for first packet in the new group. |
| 605 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), |
| 606 generator_.GetFecTimeout(/*sequence_number=*/5u)); |
| 607 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 608 generator_.GetFecTimeout(/*sequence_number=*/6u)); |
| 609 |
| 610 // Calling OnFecTimeout should cause the FEC packet to be emitted. |
| 611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet7_)); |
| 612 generator_.OnFecTimeout(); |
| 613 CheckPacketIsFec(packet7_, /*fec_group=*/5u); |
| 614 EXPECT_FALSE(creator_->IsFecProtected()); |
| 615 |
| 616 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout |
| 617 // returns infinite. |
| 618 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet8_)); |
| 619 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 620 nullptr); |
| 621 CheckPacketHasSingleStreamFrame(packet8_); |
| 622 EXPECT_FALSE(creator_->IsFecProtected()); |
| 623 EXPECT_EQ(QuicTime::Delta::Infinite(), |
| 624 generator_.GetFecTimeout(/*sequence_number=*/8u)); |
| 540 } | 625 } |
| 541 | 626 |
| 542 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 627 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
| 543 // Set the packet size be enough for two stream frames with 0 stream offset, | 628 // Set the packet size be enough for two stream frames with 0 stream offset, |
| 544 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 629 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
| 545 size_t length = | 630 size_t length = |
| 546 NullEncrypter().GetCiphertextSize(0) + | 631 NullEncrypter().GetCiphertextSize(0) + |
| 547 GetPacketHeaderSize(creator_->connection_id_length(), | 632 GetPacketHeaderSize(creator_->connection_id_length(), true, |
| 548 true, | |
| 549 creator_->next_sequence_number_length(), | 633 creator_->next_sequence_number_length(), |
| 550 NOT_IN_FEC_GROUP) + | 634 NOT_IN_FEC_GROUP) + |
| 551 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 635 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
| 552 // than the GetMinStreamFrameSize. | 636 // than the GetMinStreamFrameSize. |
| 553 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | 637 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
| 554 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | 638 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
| 555 creator_->set_max_packet_length(length); | 639 creator_->set_max_packet_length(length); |
| 556 delegate_.SetCanWriteAnything(); | 640 delegate_.SetCanWriteAnything(); |
| 557 { | 641 { |
| 558 InSequence dummy; | 642 InSequence dummy; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 579 EXPECT_EQ(3u, consumed.bytes_consumed); | 663 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 580 EXPECT_TRUE(consumed.fin_consumed); | 664 EXPECT_TRUE(consumed.fin_consumed); |
| 581 EXPECT_FALSE(generator_.HasQueuedFrames()); | 665 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 582 | 666 |
| 583 PacketContents contents; | 667 PacketContents contents; |
| 584 contents.num_stream_frames = 1; | 668 contents.num_stream_frames = 1; |
| 585 CheckPacketContains(contents, packet_); | 669 CheckPacketContains(contents, packet_); |
| 586 CheckPacketContains(contents, packet2_); | 670 CheckPacketContains(contents, packet2_); |
| 587 } | 671 } |
| 588 | 672 |
| 673 TEST_F(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) { |
| 674 delegate_.SetCanWriteAnything(); |
| 675 creator_->set_max_packets_per_fec_group(6); |
| 676 |
| 677 generator_.StartBatchOperations(); |
| 678 |
| 679 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT, |
| 680 nullptr); |
| 681 QuicConsumedData consumed = generator_.ConsumeData( |
| 682 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr); |
| 683 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 684 EXPECT_FALSE(consumed.fin_consumed); |
| 685 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 686 |
| 687 // Now both frames will be flushed out, but FEC packet is not yet sent. |
| 688 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 689 generator_.FinishBatchOperations(); |
| 690 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 691 |
| 692 PacketContents contents; |
| 693 contents.num_stream_frames = 2u; |
| 694 contents.fec_group = 1u; |
| 695 CheckPacketContains(contents, packet_); |
| 696 |
| 697 // Forcing FEC timeout causes FEC packet to be emitted. |
| 698 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); |
| 699 generator_.OnFecTimeout(); |
| 700 CheckPacketIsFec(packet2_, /*fec_group=*/1u); |
| 701 } |
| 702 |
| 589 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { | 703 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { |
| 590 EXPECT_EQ(QuicTime::Delta::Zero(), generator_.fec_timeout()); | 704 EXPECT_EQ(QuicTime::Delta::Zero(), |
| 705 QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); |
| 591 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); | 706 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); |
| 592 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), generator_.fec_timeout()); | 707 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), |
| 708 QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); |
| 593 } | 709 } |
| 594 | 710 |
| 595 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { | 711 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { |
| 596 delegate_.SetCanWriteAnything(); | 712 delegate_.SetCanWriteAnything(); |
| 597 creator_->set_max_packets_per_fec_group(50); | 713 creator_->set_max_packets_per_fec_group(50); |
| 598 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 714 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
| 599 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 715 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
| 600 | 716 |
| 601 // On reduced cwnd. | 717 // On reduced cwnd. |
| 602 generator_.OnCongestionWindowChange(7); | 718 generator_.OnCongestionWindowChange(7); |
| 603 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); | 719 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); |
| 604 | 720 |
| 605 // On increased cwnd. | 721 // On increased cwnd. |
| 606 generator_.OnCongestionWindowChange(100); | 722 generator_.OnCongestionWindowChange(100); |
| 607 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 723 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
| 608 | 724 |
| 609 // On collapsed cwnd. | 725 // On collapsed cwnd. |
| 610 generator_.OnCongestionWindowChange(1); | 726 generator_.OnCongestionWindowChange(1); |
| 611 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 727 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
| 612 } | 728 } |
| 613 | 729 |
| 614 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { | 730 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { |
| 615 delegate_.SetCanWriteAnything(); | 731 delegate_.SetCanWriteAnything(); |
| 616 // TODO(jri): This starting of batch mode should not be required when | |
| 617 // FEC sending is separated from batching operations. | |
| 618 generator_.StartBatchOperations(); | 732 generator_.StartBatchOperations(); |
| 619 creator_->set_max_packets_per_fec_group(50); | 733 creator_->set_max_packets_per_fec_group(50); |
| 620 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 734 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
| 621 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 735 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
| 622 | 736 |
| 623 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. | 737 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets |
| 624 // 3 packets are sent, one is queued in the creator. | 738 // are sent, one is queued in the creator. |
| 625 { | 739 { |
| 626 InSequence dummy; | 740 InSequence dummy; |
| 627 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 741 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 628 SaveArg<0>(&packet_)); | 742 SaveArg<0>(&packet_)); |
| 629 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 743 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 630 SaveArg<0>(&packet2_)); | 744 SaveArg<0>(&packet2_)); |
| 631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 745 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 632 SaveArg<0>(&packet3_)); | 746 SaveArg<0>(&packet3_)); |
| 633 } | 747 } |
| 634 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 748 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
| 635 QuicConsumedData consumed = generator_.ConsumeData( | 749 QuicConsumedData consumed = generator_.ConsumeData( |
| 636 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | 750 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
| 637 EXPECT_EQ(data_len, consumed.bytes_consumed); | 751 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 638 EXPECT_TRUE(creator_->IsFecGroupOpen()); | 752 EXPECT_TRUE(creator_->IsFecGroupOpen()); |
| 639 | 753 |
| 640 // Change FEC groupsize. | 754 // Change FEC groupsize. |
| 641 generator_.OnCongestionWindowChange(2); | 755 generator_.OnCongestionWindowChange(2); |
| 642 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 756 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
| 643 | 757 |
| 644 // Send enough data to trigger one unprotected data packet, | 758 // Send enough data to trigger one unprotected data packet, causing the FEC |
| 645 // causing the FEC packet to also be sent. | 759 // packet to also be sent. |
| 646 { | 760 { |
| 647 InSequence dummy; | 761 InSequence dummy; |
| 648 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 762 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 649 SaveArg<0>(&packet4_)); | 763 SaveArg<0>(&packet4_)); |
| 650 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 764 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 651 SaveArg<0>(&packet5_)); | 765 SaveArg<0>(&packet5_)); |
| 652 } | 766 } |
| 653 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | 767 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
| 654 true, MAY_FEC_PROTECT, nullptr); | 768 true, MAY_FEC_PROTECT, nullptr); |
| 655 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | 769 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 680 { | 794 { |
| 681 InSequence dummy; | 795 InSequence dummy; |
| 682 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 796 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 683 SaveArg<0>(&packet2_)); | 797 SaveArg<0>(&packet2_)); |
| 684 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 798 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 685 SaveArg<0>(&packet3_)); | 799 SaveArg<0>(&packet3_)); |
| 686 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 800 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 687 SaveArg<0>(&packet4_)); | 801 SaveArg<0>(&packet4_)); |
| 688 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 802 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 689 SaveArg<0>(&packet5_)); | 803 SaveArg<0>(&packet5_)); |
| 690 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
| 691 SaveArg<0>(&packet6_)); | |
| 692 } | 804 } |
| 693 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | 805 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
| 694 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 806 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 695 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | 807 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 696 MUST_FEC_PROTECT, nullptr); | 808 MUST_FEC_PROTECT, nullptr); |
| 697 EXPECT_EQ(data_len, consumed.bytes_consumed); | 809 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 698 EXPECT_FALSE(generator_.HasQueuedFrames()); | 810 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 699 | 811 |
| 700 // Verify that two FEC packets were sent. | 812 // Verify that packets sent were 3 data and 1 FEC. |
| 701 CheckPacketHasSingleStreamFrame(packet2_); | 813 CheckPacketHasSingleStreamFrame(packet2_); |
| 702 CheckPacketHasSingleStreamFrame(packet3_); | 814 CheckPacketHasSingleStreamFrame(packet3_); |
| 703 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | 815 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
| 704 CheckPacketHasSingleStreamFrame(packet5_); | 816 CheckPacketHasSingleStreamFrame(packet5_); |
| 705 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. | 817 |
| 818 // Calling OnFecTimeout should emit the pending FEC packet. |
| 819 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); |
| 820 generator_.OnFecTimeout(); |
| 821 CheckPacketIsFec(packet6_, /*fec_group=*/5u); |
| 706 | 822 |
| 707 // Send one unprotected data packet. | 823 // Send one unprotected data packet. |
| 708 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 824 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 709 SaveArg<0>(&packet7_)); | 825 SaveArg<0>(&packet7_)); |
| 710 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, | 826 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 711 nullptr); | 827 nullptr); |
| 712 EXPECT_EQ(1u, consumed.bytes_consumed); | 828 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 713 EXPECT_FALSE(generator_.HasQueuedFrames()); | 829 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 714 EXPECT_FALSE(creator_->IsFecProtected()); | 830 EXPECT_FALSE(creator_->IsFecProtected()); |
| 715 // Verify that one unprotected data packet was sent. | 831 // Verify that one unprotected data packet was sent. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 743 EXPECT_TRUE(creator_->IsFecProtected()); | 859 EXPECT_TRUE(creator_->IsFecProtected()); |
| 744 EXPECT_TRUE(creator_->HasPendingFrames()); | 860 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 745 } | 861 } |
| 746 | 862 |
| 747 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | 863 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { |
| 748 // Enable FEC. | 864 // Enable FEC. |
| 749 creator_->set_max_packets_per_fec_group(2); | 865 creator_->set_max_packets_per_fec_group(2); |
| 750 | 866 |
| 751 // Queue control frames in generator. | 867 // Queue control frames in generator. |
| 752 delegate_.SetCanNotWrite(); | 868 delegate_.SetCanNotWrite(); |
| 753 generator_.SetShouldSendAck(true, true); | 869 generator_.SetShouldSendAck(true); |
| 754 delegate_.SetCanWriteAnything(); | 870 delegate_.SetCanWriteAnything(); |
| 755 generator_.StartBatchOperations(); | 871 generator_.StartBatchOperations(); |
| 756 | 872 |
| 757 // Set up frames to write into the creator when control frames are written. | 873 // Set up frames to write into the creator when control frames are written. |
| 758 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 874 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 759 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
| 760 Return(CreateFeedbackFrame())); | |
| 761 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 875 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
| 762 Return(CreateStopWaitingFrame())); | 876 Return(CreateStopWaitingFrame())); |
| 763 | 877 |
| 764 // Generator should have queued control frames, and creator should be empty. | 878 // Generator should have queued control frames, and creator should be empty. |
| 765 EXPECT_TRUE(generator_.HasQueuedFrames()); | 879 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 766 EXPECT_FALSE(creator_->HasPendingFrames()); | 880 EXPECT_FALSE(creator_->HasPendingFrames()); |
| 767 EXPECT_FALSE(creator_->IsFecProtected()); | 881 EXPECT_FALSE(creator_->IsFecProtected()); |
| 768 | 882 |
| 769 // Queue protected data for sending. Should cause queued frames to be flushed. | 883 // Queue protected data for sending. Should cause queued frames to be flushed. |
| 770 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 884 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 771 SaveArg<0>(&packet_)); | 885 SaveArg<0>(&packet_)); |
| 772 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 886 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 773 MUST_FEC_PROTECT, nullptr); | 887 MUST_FEC_PROTECT, nullptr); |
| 774 EXPECT_EQ(1u, consumed.bytes_consumed); | 888 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 775 PacketContents contents; | 889 PacketContents contents; |
| 776 contents.num_ack_frames = 1; | 890 contents.num_ack_frames = 1; |
| 777 contents.num_feedback_frames = 1; | |
| 778 contents.num_stop_waiting_frames = 1; | 891 contents.num_stop_waiting_frames = 1; |
| 779 CheckPacketContains(contents, packet_); | 892 CheckPacketContains(contents, packet_); |
| 780 | 893 |
| 781 // FEC protection should be on in creator. | 894 // FEC protection should be on in creator. |
| 782 EXPECT_TRUE(creator_->IsFecProtected()); | 895 EXPECT_TRUE(creator_->IsFecProtected()); |
| 783 } | 896 } |
| 784 | 897 |
| 785 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | 898 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { |
| 786 delegate_.SetCanWriteAnything(); | 899 delegate_.SetCanWriteAnything(); |
| 787 | 900 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 813 EXPECT_TRUE(creator_->IsFecProtected()); | 926 EXPECT_TRUE(creator_->IsFecProtected()); |
| 814 } | 927 } |
| 815 | 928 |
| 816 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | 929 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
| 817 delegate_.SetCanWriteAnything(); | 930 delegate_.SetCanWriteAnything(); |
| 818 | 931 |
| 819 // Enable FEC. | 932 // Enable FEC. |
| 820 creator_->set_max_packets_per_fec_group(2); | 933 creator_->set_max_packets_per_fec_group(2); |
| 821 EXPECT_FALSE(creator_->IsFecProtected()); | 934 EXPECT_FALSE(creator_->IsFecProtected()); |
| 822 | 935 |
| 823 generator_.StartBatchOperations(); | |
| 824 // Send first packet, FEC protected. | 936 // Send first packet, FEC protected. |
| 825 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 937 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 826 // Write enough data to cause a packet to be emitted. | 938 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 827 size_t data_len = kDefaultMaxPacketSize; | 939 MUST_FEC_PROTECT, nullptr); |
| 828 QuicConsumedData consumed = generator_.ConsumeData( | 940 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 829 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
| 830 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 831 PacketContents contents; | 941 PacketContents contents; |
| 832 contents.num_stream_frames = 1u; | 942 contents.num_stream_frames = 1u; |
| 833 contents.fec_group = 1u; | 943 contents.fec_group = 1u; |
| 834 CheckPacketContains(contents, packet_); | 944 CheckPacketContains(contents, packet_); |
| 835 | 945 |
| 836 // FEC should still be on in creator. | 946 // FEC should still be on in creator. |
| 837 EXPECT_TRUE(creator_->IsFecProtected()); | 947 EXPECT_TRUE(creator_->IsFecProtected()); |
| 838 | 948 |
| 839 // Send enough unprotected data to cause second packet to be sent, which gets | 949 // Send unprotected data to cause second packet to be sent, which gets |
| 840 // protected because it happens to fall within an open FEC group. Data packet | 950 // protected because it happens to fall within an open FEC group. Data packet |
| 841 // will be followed by FEC packet. | 951 // will be followed by FEC packet. |
| 842 { | 952 { |
| 843 InSequence dummy; | 953 InSequence dummy; |
| 844 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 954 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 845 SaveArg<0>(&packet2_)); | 955 SaveArg<0>(&packet2_)); |
| 846 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 956 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 847 SaveArg<0>(&packet3_)); | 957 SaveArg<0>(&packet3_)); |
| 848 } | 958 } |
| 849 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 959 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 850 MAY_FEC_PROTECT, nullptr); | 960 nullptr); |
| 851 EXPECT_EQ(data_len, consumed.bytes_consumed); | 961 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 852 contents.num_stream_frames = 2u; | 962 contents.num_stream_frames = 1u; |
| 853 CheckPacketContains(contents, packet2_); | 963 CheckPacketContains(contents, packet2_); |
| 854 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 964 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 855 | 965 |
| 856 // FEC protection should be off in creator. | 966 // FEC protection should be off in creator. |
| 857 EXPECT_FALSE(creator_->IsFecProtected()); | 967 EXPECT_FALSE(creator_->IsFecProtected()); |
| 858 } | 968 } |
| 859 | 969 |
| 860 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | 970 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
| 861 delegate_.SetCanWriteAnything(); | 971 delegate_.SetCanWriteAnything(); |
| 862 generator_.StartBatchOperations(); | 972 generator_.StartBatchOperations(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 900 CheckPacketContains(contents, packet2_); | 1010 CheckPacketContains(contents, packet2_); |
| 901 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 1011 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 902 | 1012 |
| 903 // FEC protection should remain on in creator. | 1013 // FEC protection should remain on in creator. |
| 904 EXPECT_TRUE(creator_->IsFecProtected()); | 1014 EXPECT_TRUE(creator_->IsFecProtected()); |
| 905 } | 1015 } |
| 906 | 1016 |
| 907 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 1017 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
| 908 delegate_.SetCanNotWrite(); | 1018 delegate_.SetCanNotWrite(); |
| 909 | 1019 |
| 910 generator_.SetShouldSendAck(true, false); | 1020 generator_.SetShouldSendAck(false); |
| 911 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 1021 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 912 EXPECT_TRUE(generator_.HasQueuedFrames()); | 1022 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 913 | 1023 |
| 914 delegate_.SetCanWriteAnything(); | 1024 delegate_.SetCanWriteAnything(); |
| 915 | 1025 |
| 916 generator_.StartBatchOperations(); | 1026 generator_.StartBatchOperations(); |
| 917 | 1027 |
| 918 // When the first write operation is invoked, the ack and feedback | 1028 // When the first write operation is invoked, the ack frame will be returned. |
| 919 // frames will be returned. | |
| 920 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 1029 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 921 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
| 922 Return(CreateFeedbackFrame())); | |
| 923 | 1030 |
| 924 // Send some data and a control frame | 1031 // Send some data and a control frame |
| 925 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, | 1032 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, |
| 926 nullptr); | 1033 nullptr); |
| 927 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 1034 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 928 | 1035 |
| 929 // All five frames will be flushed out in a single packet. | 1036 // All five frames will be flushed out in a single packet. |
| 930 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | 1037 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 931 generator_.FinishBatchOperations(); | 1038 generator_.FinishBatchOperations(); |
| 932 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1039 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 933 | 1040 |
| 934 PacketContents contents; | 1041 PacketContents contents; |
| 935 contents.num_ack_frames = 1; | 1042 contents.num_ack_frames = 1; |
| 936 contents.num_goaway_frames = 1; | 1043 contents.num_goaway_frames = 1; |
| 937 contents.num_feedback_frames = 1; | |
| 938 contents.num_rst_stream_frames = 1; | 1044 contents.num_rst_stream_frames = 1; |
| 939 contents.num_stream_frames = 1; | 1045 contents.num_stream_frames = 1; |
| 940 CheckPacketContains(contents, packet_); | 1046 CheckPacketContains(contents, packet_); |
| 941 } | 1047 } |
| 942 | 1048 |
| 943 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 1049 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
| 944 delegate_.SetCanNotWrite(); | 1050 delegate_.SetCanNotWrite(); |
| 945 | 1051 |
| 946 generator_.SetShouldSendAck(true, false); | 1052 generator_.SetShouldSendAck(false); |
| 947 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 1053 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 948 EXPECT_TRUE(generator_.HasQueuedFrames()); | 1054 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 949 | 1055 |
| 950 delegate_.SetCanWriteAnything(); | 1056 delegate_.SetCanWriteAnything(); |
| 951 | 1057 |
| 952 generator_.StartBatchOperations(); | 1058 generator_.StartBatchOperations(); |
| 953 | 1059 |
| 954 // When the first write operation is invoked, the ack and feedback | 1060 // When the first write operation is invoked, the ack frame will be returned. |
| 955 // frames will be returned. | |
| 956 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 1061 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 957 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | |
| 958 Return(CreateFeedbackFrame())); | |
| 959 | 1062 |
| 960 { | 1063 { |
| 961 InSequence dummy; | 1064 InSequence dummy; |
| 962 // All five frames will be flushed out in a single packet | 1065 // All five frames will be flushed out in a single packet |
| 963 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 1066 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 964 SaveArg<0>(&packet_)); | 1067 SaveArg<0>(&packet_)); |
| 965 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 1068 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 966 SaveArg<0>(&packet2_)); | 1069 SaveArg<0>(&packet2_)); |
| 967 } | 1070 } |
| 968 | 1071 |
| 969 // Send enough data to exceed one packet | 1072 // Send enough data to exceed one packet |
| 970 size_t data_len = kDefaultMaxPacketSize + 100; | 1073 size_t data_len = kDefaultMaxPacketSize + 100; |
| 971 QuicConsumedData consumed = generator_.ConsumeData( | 1074 QuicConsumedData consumed = generator_.ConsumeData( |
| 972 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); | 1075 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); |
| 973 EXPECT_EQ(data_len, consumed.bytes_consumed); | 1076 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 974 EXPECT_TRUE(consumed.fin_consumed); | 1077 EXPECT_TRUE(consumed.fin_consumed); |
| 975 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 1078 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 976 | 1079 |
| 977 generator_.FinishBatchOperations(); | 1080 generator_.FinishBatchOperations(); |
| 978 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1081 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 979 | 1082 |
| 980 // The first packet should have the queued data and part of the stream data. | 1083 // The first packet should have the queued data and part of the stream data. |
| 981 PacketContents contents; | 1084 PacketContents contents; |
| 982 contents.num_ack_frames = 1; | 1085 contents.num_ack_frames = 1; |
| 983 contents.num_feedback_frames = 1; | |
| 984 contents.num_rst_stream_frames = 1; | 1086 contents.num_rst_stream_frames = 1; |
| 985 contents.num_stream_frames = 1; | 1087 contents.num_stream_frames = 1; |
| 986 CheckPacketContains(contents, packet_); | 1088 CheckPacketContains(contents, packet_); |
| 987 | 1089 |
| 988 // The second should have the remainder of the stream data. | 1090 // The second should have the remainder of the stream data. |
| 989 PacketContents contents2; | 1091 PacketContents contents2; |
| 990 contents2.num_goaway_frames = 1; | 1092 contents2.num_goaway_frames = 1; |
| 991 contents2.num_stream_frames = 1; | 1093 contents2.num_stream_frames = 1; |
| 992 CheckPacketContains(contents2, packet2_); | 1094 CheckPacketContains(contents2, packet2_); |
| 993 } | 1095 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1010 generator_.SetConnectionIdLength(7); | 1112 generator_.SetConnectionIdLength(7); |
| 1011 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1113 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1012 generator_.SetConnectionIdLength(8); | 1114 generator_.SetConnectionIdLength(8); |
| 1013 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1115 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1014 generator_.SetConnectionIdLength(9); | 1116 generator_.SetConnectionIdLength(9); |
| 1015 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 1117 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1016 } | 1118 } |
| 1017 | 1119 |
| 1018 } // namespace test | 1120 } // namespace test |
| 1019 } // namespace net | 1121 } // namespace net |
| OLD | NEW |