| 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 "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "net/quic/crypto/crypto_protocol.h" | 10 #include "net/quic/crypto/crypto_protocol.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 using std::vector; | 27 using std::vector; |
| 28 using testing::InSequence; | 28 using testing::InSequence; |
| 29 using testing::Return; | 29 using testing::Return; |
| 30 using testing::StrictMock; | 30 using testing::StrictMock; |
| 31 using testing::_; | 31 using testing::_; |
| 32 | 32 |
| 33 namespace net { | 33 namespace net { |
| 34 namespace test { | 34 namespace test { |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 const int64_t kMinFecTimeoutMs = 5u; | |
| 38 | |
| 39 static const FecSendPolicy kFecSendPolicyList[] = { | |
| 40 FEC_ANY_TRIGGER, FEC_ALARM_TRIGGER, | |
| 41 }; | |
| 42 | |
| 43 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | 37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
| 44 public: | 38 public: |
| 45 MockDelegate() {} | 39 MockDelegate() {} |
| 46 ~MockDelegate() override {} | 40 ~MockDelegate() override {} |
| 47 | 41 |
| 48 MOCK_METHOD2(ShouldGeneratePacket, | 42 MOCK_METHOD2(ShouldGeneratePacket, |
| 49 bool(HasRetransmittableData retransmittable, | 43 bool(HasRetransmittableData retransmittable, |
| 50 IsHandshake handshake)); | 44 IsHandshake handshake)); |
| 51 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); | 45 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); |
| 52 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); | 46 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); |
| 53 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); | 47 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); |
| 54 MOCK_METHOD2(OnUnrecoverableError, | 48 MOCK_METHOD2(OnUnrecoverableError, |
| 55 void(QuicErrorCode, ConnectionCloseSource)); | 49 void(QuicErrorCode, ConnectionCloseSource)); |
| 56 MOCK_METHOD0(OnResetFecGroup, void()); | |
| 57 | 50 |
| 58 void SetCanWriteAnything() { | 51 void SetCanWriteAnything() { |
| 59 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); | 52 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); |
| 60 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) | 53 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) |
| 61 .WillRepeatedly(Return(true)); | 54 .WillRepeatedly(Return(true)); |
| 62 } | 55 } |
| 63 | 56 |
| 64 void SetCanNotWrite() { | 57 void SetCanNotWrite() { |
| 65 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)) | 58 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)) |
| 66 .WillRepeatedly(Return(false)); | 59 .WillRepeatedly(Return(false)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 85 // contains the expected frames. | 78 // contains the expected frames. |
| 86 struct PacketContents { | 79 struct PacketContents { |
| 87 PacketContents() | 80 PacketContents() |
| 88 : num_ack_frames(0), | 81 : num_ack_frames(0), |
| 89 num_connection_close_frames(0), | 82 num_connection_close_frames(0), |
| 90 num_goaway_frames(0), | 83 num_goaway_frames(0), |
| 91 num_rst_stream_frames(0), | 84 num_rst_stream_frames(0), |
| 92 num_stop_waiting_frames(0), | 85 num_stop_waiting_frames(0), |
| 93 num_stream_frames(0), | 86 num_stream_frames(0), |
| 94 num_ping_frames(0), | 87 num_ping_frames(0), |
| 95 num_mtu_discovery_frames(0), | 88 num_mtu_discovery_frames(0) {} |
| 96 fec_group(0) {} | |
| 97 | 89 |
| 98 size_t num_ack_frames; | 90 size_t num_ack_frames; |
| 99 size_t num_connection_close_frames; | 91 size_t num_connection_close_frames; |
| 100 size_t num_goaway_frames; | 92 size_t num_goaway_frames; |
| 101 size_t num_rst_stream_frames; | 93 size_t num_rst_stream_frames; |
| 102 size_t num_stop_waiting_frames; | 94 size_t num_stop_waiting_frames; |
| 103 size_t num_stream_frames; | 95 size_t num_stream_frames; |
| 104 size_t num_ping_frames; | 96 size_t num_ping_frames; |
| 105 size_t num_mtu_discovery_frames; | 97 size_t num_mtu_discovery_frames; |
| 106 | |
| 107 QuicFecGroupNumber fec_group; | |
| 108 }; | 98 }; |
| 109 | 99 |
| 110 } // namespace | 100 } // namespace |
| 111 | 101 |
| 112 class QuicPacketGeneratorTest : public ::testing::TestWithParam<FecSendPolicy> { | 102 class QuicPacketGeneratorTest : public ::testing::Test { |
| 113 public: | 103 public: |
| 114 QuicPacketGeneratorTest() | 104 QuicPacketGeneratorTest() |
| 115 : framer_(QuicSupportedVersions(), | 105 : framer_(QuicSupportedVersions(), |
| 116 QuicTime::Zero(), | 106 QuicTime::Zero(), |
| 117 Perspective::IS_CLIENT), | 107 Perspective::IS_CLIENT), |
| 118 generator_(42, &framer_, &random_, &buffer_allocator_, &delegate_), | 108 generator_(42, &framer_, &random_, &buffer_allocator_, &delegate_), |
| 119 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { | 109 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { |
| 120 generator_.set_fec_send_policy(GetParam()); | |
| 121 // TODO(ianswett): Fix this test so it uses a non-null encrypter. | 110 // TODO(ianswett): Fix this test so it uses a non-null encrypter. |
| 122 FLAGS_quic_never_write_unencrypted_data = false; | 111 FLAGS_quic_never_write_unencrypted_data = false; |
| 123 FLAGS_quic_no_unencrypted_fec = false; | 112 FLAGS_quic_no_unencrypted_fec = false; |
| 124 } | 113 } |
| 125 | 114 |
| 126 ~QuicPacketGeneratorTest() override { | 115 ~QuicPacketGeneratorTest() override { |
| 127 for (SerializedPacket& packet : packets_) { | 116 for (SerializedPacket& packet : packets_) { |
| 128 delete[] packet.encrypted_buffer; | 117 delete[] packet.encrypted_buffer; |
| 129 QuicUtils::ClearSerializedPacket(&packet); | 118 QuicUtils::ClearSerializedPacket(&packet); |
| 130 } | 119 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 EXPECT_EQ(contents.num_connection_close_frames, | 163 EXPECT_EQ(contents.num_connection_close_frames, |
| 175 simple_framer_.connection_close_frames().size()); | 164 simple_framer_.connection_close_frames().size()); |
| 176 EXPECT_EQ(contents.num_goaway_frames, | 165 EXPECT_EQ(contents.num_goaway_frames, |
| 177 simple_framer_.goaway_frames().size()); | 166 simple_framer_.goaway_frames().size()); |
| 178 EXPECT_EQ(contents.num_rst_stream_frames, | 167 EXPECT_EQ(contents.num_rst_stream_frames, |
| 179 simple_framer_.rst_stream_frames().size()); | 168 simple_framer_.rst_stream_frames().size()); |
| 180 EXPECT_EQ(contents.num_stream_frames, | 169 EXPECT_EQ(contents.num_stream_frames, |
| 181 simple_framer_.stream_frames().size()); | 170 simple_framer_.stream_frames().size()); |
| 182 EXPECT_EQ(contents.num_stop_waiting_frames, | 171 EXPECT_EQ(contents.num_stop_waiting_frames, |
| 183 simple_framer_.stop_waiting_frames().size()); | 172 simple_framer_.stop_waiting_frames().size()); |
| 184 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); | |
| 185 | 173 |
| 186 // From the receiver's perspective, MTU discovery frames are ping frames. | 174 // From the receiver's perspective, MTU discovery frames are ping frames. |
| 187 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, | 175 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, |
| 188 simple_framer_.ping_frames().size()); | 176 simple_framer_.ping_frames().size()); |
| 189 } | 177 } |
| 190 | 178 |
| 191 void CheckPacketHasSingleStreamFrame(size_t packet_index) { | 179 void CheckPacketHasSingleStreamFrame(size_t packet_index) { |
| 192 ASSERT_GT(packets_.size(), packet_index); | 180 ASSERT_GT(packets_.size(), packet_index); |
| 193 const SerializedPacket& packet = packets_[packet_index]; | 181 const SerializedPacket& packet = packets_[packet_index]; |
| 194 ASSERT_FALSE(packet.retransmittable_frames.empty()); | 182 ASSERT_FALSE(packet.retransmittable_frames.empty()); |
| 195 EXPECT_EQ(1u, packet.retransmittable_frames.size()); | 183 EXPECT_EQ(1u, packet.retransmittable_frames.size()); |
| 196 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | 184 ASSERT_TRUE(packet.encrypted_buffer != nullptr); |
| 197 ASSERT_TRUE(simple_framer_.ProcessPacket( | 185 ASSERT_TRUE(simple_framer_.ProcessPacket( |
| 198 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | 186 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); |
| 199 EXPECT_EQ(1u, simple_framer_.num_frames()); | 187 EXPECT_EQ(1u, simple_framer_.num_frames()); |
| 200 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); | 188 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); |
| 201 } | 189 } |
| 202 | 190 |
| 203 void CheckAllPacketsHaveSingleStreamFrame() { | 191 void CheckAllPacketsHaveSingleStreamFrame() { |
| 204 for (size_t i = 0; i < packets_.size(); i++) { | 192 for (size_t i = 0; i < packets_.size(); i++) { |
| 205 CheckPacketHasSingleStreamFrame(i); | 193 CheckPacketHasSingleStreamFrame(i); |
| 206 } | 194 } |
| 207 } | 195 } |
| 208 | 196 |
| 209 void CheckPacketIsFec(size_t packet_index, QuicPacketNumber fec_group) { | |
| 210 ASSERT_GT(packets_.size(), packet_index); | |
| 211 const SerializedPacket& packet = packets_[packet_index]; | |
| 212 ASSERT_TRUE(packet.retransmittable_frames.empty()); | |
| 213 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | |
| 214 ASSERT_TRUE(simple_framer_.ProcessPacket( | |
| 215 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | |
| 216 EXPECT_TRUE(simple_framer_.header().fec_flag); | |
| 217 } | |
| 218 | |
| 219 QuicIOVector CreateData(size_t len) { | 197 QuicIOVector CreateData(size_t len) { |
| 220 data_array_.reset(new char[len]); | 198 data_array_.reset(new char[len]); |
| 221 memset(data_array_.get(), '?', len); | 199 memset(data_array_.get(), '?', len); |
| 222 iov_.iov_base = data_array_.get(); | 200 iov_.iov_base = data_array_.get(); |
| 223 iov_.iov_len = len; | 201 iov_.iov_len = len; |
| 224 return QuicIOVector(&iov_, 1, len); | 202 return QuicIOVector(&iov_, 1, len); |
| 225 } | 203 } |
| 226 | 204 |
| 227 QuicIOVector MakeIOVector(StringPiece s) { | 205 QuicIOVector MakeIOVector(StringPiece s) { |
| 228 return ::net::MakeIOVector(s, &iov_); | 206 return ::net::MakeIOVector(s, &iov_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 240 private: | 218 private: |
| 241 scoped_ptr<char[]> data_array_; | 219 scoped_ptr<char[]> data_array_; |
| 242 struct iovec iov_; | 220 struct iovec iov_; |
| 243 }; | 221 }; |
| 244 | 222 |
| 245 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { | 223 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { |
| 246 public: | 224 public: |
| 247 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | 225 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); |
| 248 }; | 226 }; |
| 249 | 227 |
| 250 // Run all end to end tests with all supported FEC send polocies. | 228 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
| 251 INSTANTIATE_TEST_CASE_P(FecSendPolicy, | |
| 252 QuicPacketGeneratorTest, | |
| 253 ::testing::ValuesIn(kFecSendPolicyList)); | |
| 254 | |
| 255 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | |
| 256 delegate_.SetCanNotWrite(); | 229 delegate_.SetCanNotWrite(); |
| 257 | 230 |
| 258 generator_.SetShouldSendAck(false); | 231 generator_.SetShouldSendAck(false); |
| 259 EXPECT_TRUE(generator_.HasQueuedFrames()); | 232 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 260 } | 233 } |
| 261 | 234 |
| 262 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 235 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
| 263 StrictMock<MockDebugDelegate> debug_delegate; | 236 StrictMock<MockDebugDelegate> debug_delegate; |
| 264 | 237 |
| 265 generator_.set_debug_delegate(&debug_delegate); | 238 generator_.set_debug_delegate(&debug_delegate); |
| 266 delegate_.SetCanWriteOnlyNonRetransmittable(); | 239 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 267 generator_.StartBatchOperations(); | 240 generator_.StartBatchOperations(); |
| 268 | 241 |
| 269 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 242 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 270 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 243 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
| 271 | 244 |
| 272 generator_.SetShouldSendAck(false); | 245 generator_.SetShouldSendAck(false); |
| 273 EXPECT_TRUE(generator_.HasQueuedFrames()); | 246 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 274 } | 247 } |
| 275 | 248 |
| 276 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 249 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
| 277 delegate_.SetCanWriteOnlyNonRetransmittable(); | 250 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 278 | 251 |
| 279 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 252 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 280 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 253 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 281 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 254 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 282 | 255 |
| 283 generator_.SetShouldSendAck(false); | 256 generator_.SetShouldSendAck(false); |
| 284 EXPECT_FALSE(generator_.HasQueuedFrames()); | 257 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 285 | 258 |
| 286 PacketContents contents; | 259 PacketContents contents; |
| 287 contents.num_ack_frames = 1; | 260 contents.num_ack_frames = 1; |
| 288 CheckPacketContains(contents, 0); | 261 CheckPacketContains(contents, 0); |
| 289 } | 262 } |
| 290 | 263 |
| 291 TEST_P(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 264 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
| 292 // Make sure that calling SetShouldSendAck multiple times does not result in a | 265 // Make sure that calling SetShouldSendAck multiple times does not result in a |
| 293 // crash. Previously this would result in multiple QuicFrames queued in the | 266 // crash. Previously this would result in multiple QuicFrames queued in the |
| 294 // packet generator, with all but the last with internal pointers to freed | 267 // packet generator, with all but the last with internal pointers to freed |
| 295 // memory. | 268 // memory. |
| 296 delegate_.SetCanWriteAnything(); | 269 delegate_.SetCanWriteAnything(); |
| 297 | 270 |
| 298 // Only one AckFrame should be created. | 271 // Only one AckFrame should be created. |
| 299 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); | 272 EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); |
| 300 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 273 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 301 .Times(1) | 274 .Times(1) |
| 302 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 275 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 303 | 276 |
| 304 generator_.StartBatchOperations(); | 277 generator_.StartBatchOperations(); |
| 305 generator_.SetShouldSendAck(false); | 278 generator_.SetShouldSendAck(false); |
| 306 generator_.SetShouldSendAck(false); | 279 generator_.SetShouldSendAck(false); |
| 307 generator_.FinishBatchOperations(); | 280 generator_.FinishBatchOperations(); |
| 308 } | 281 } |
| 309 | 282 |
| 310 TEST_P(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 283 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
| 311 delegate_.SetCanNotWrite(); | 284 delegate_.SetCanNotWrite(); |
| 312 | 285 |
| 313 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 286 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 314 EXPECT_TRUE(generator_.HasQueuedFrames()); | 287 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 315 } | 288 } |
| 316 | 289 |
| 317 TEST_P(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { | 290 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { |
| 318 delegate_.SetCanWriteOnlyNonRetransmittable(); | 291 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 319 | 292 |
| 320 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 293 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 321 EXPECT_TRUE(generator_.HasQueuedFrames()); | 294 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 322 } | 295 } |
| 323 | 296 |
| 324 TEST_P(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | 297 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { |
| 325 delegate_.SetCanWriteAnything(); | 298 delegate_.SetCanWriteAnything(); |
| 326 generator_.StartBatchOperations(); | 299 generator_.StartBatchOperations(); |
| 327 | 300 |
| 328 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 301 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 329 EXPECT_TRUE(generator_.HasQueuedFrames()); | 302 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 330 } | 303 } |
| 331 | 304 |
| 332 TEST_P(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 305 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
| 333 delegate_.SetCanNotWrite(); | 306 delegate_.SetCanNotWrite(); |
| 334 generator_.StartBatchOperations(); | 307 generator_.StartBatchOperations(); |
| 335 | 308 |
| 336 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 309 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 337 EXPECT_TRUE(generator_.HasQueuedFrames()); | 310 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 338 generator_.FinishBatchOperations(); | 311 generator_.FinishBatchOperations(); |
| 339 EXPECT_TRUE(generator_.HasQueuedFrames()); | 312 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 340 | 313 |
| 341 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 314 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 342 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 315 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 343 generator_.FlushAllQueuedFrames(); | 316 generator_.FlushAllQueuedFrames(); |
| 344 EXPECT_FALSE(generator_.HasQueuedFrames()); | 317 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 345 | 318 |
| 346 PacketContents contents; | 319 PacketContents contents; |
| 347 contents.num_rst_stream_frames = 1; | 320 contents.num_rst_stream_frames = 1; |
| 348 CheckPacketContains(contents, 0); | 321 CheckPacketContains(contents, 0); |
| 349 } | 322 } |
| 350 | 323 |
| 351 TEST_P(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 324 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
| 352 delegate_.SetCanWriteAnything(); | 325 delegate_.SetCanWriteAnything(); |
| 353 | 326 |
| 354 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 327 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 355 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 328 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 356 | 329 |
| 357 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 330 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 358 EXPECT_FALSE(generator_.HasQueuedFrames()); | 331 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 359 | 332 |
| 360 PacketContents contents; | 333 PacketContents contents; |
| 361 contents.num_rst_stream_frames = 1; | 334 contents.num_rst_stream_frames = 1; |
| 362 CheckPacketContains(contents, 0); | 335 CheckPacketContains(contents, 0); |
| 363 } | 336 } |
| 364 | 337 |
| 365 TEST_P(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 338 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| 366 delegate_.SetCanNotWrite(); | 339 delegate_.SetCanNotWrite(); |
| 367 | 340 |
| 368 QuicConsumedData consumed = generator_.ConsumeData( | 341 QuicConsumedData consumed = generator_.ConsumeData( |
| 369 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 342 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
| 370 EXPECT_EQ(0u, consumed.bytes_consumed); | 343 EXPECT_EQ(0u, consumed.bytes_consumed); |
| 371 EXPECT_FALSE(consumed.fin_consumed); | 344 EXPECT_FALSE(consumed.fin_consumed); |
| 372 EXPECT_FALSE(generator_.HasQueuedFrames()); | 345 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 373 } | 346 } |
| 374 | 347 |
| 375 TEST_P(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 348 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
| 376 delegate_.SetCanWriteAnything(); | 349 delegate_.SetCanWriteAnything(); |
| 377 generator_.StartBatchOperations(); | 350 generator_.StartBatchOperations(); |
| 378 | 351 |
| 379 QuicConsumedData consumed = generator_.ConsumeData( | 352 QuicConsumedData consumed = generator_.ConsumeData( |
| 380 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 353 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
| 381 EXPECT_EQ(3u, consumed.bytes_consumed); | 354 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 382 EXPECT_TRUE(consumed.fin_consumed); | 355 EXPECT_TRUE(consumed.fin_consumed); |
| 383 EXPECT_TRUE(generator_.HasQueuedFrames()); | 356 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 384 } | 357 } |
| 385 | 358 |
| 386 TEST_P(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 359 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 387 delegate_.SetCanWriteAnything(); | 360 delegate_.SetCanWriteAnything(); |
| 388 | 361 |
| 389 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 362 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 390 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 363 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 391 QuicConsumedData consumed = generator_.ConsumeData( | 364 QuicConsumedData consumed = generator_.ConsumeData( |
| 392 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 365 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
| 393 EXPECT_EQ(3u, consumed.bytes_consumed); | 366 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 394 EXPECT_TRUE(consumed.fin_consumed); | 367 EXPECT_TRUE(consumed.fin_consumed); |
| 395 EXPECT_FALSE(generator_.HasQueuedFrames()); | 368 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 396 | 369 |
| 397 PacketContents contents; | 370 PacketContents contents; |
| 398 contents.num_stream_frames = 1; | 371 contents.num_stream_frames = 1; |
| 399 CheckPacketContains(contents, 0); | 372 CheckPacketContains(contents, 0); |
| 400 } | 373 } |
| 401 | 374 |
| 402 // Test the behavior of ConsumeData when the data consumed is for the crypto | 375 // Test the behavior of ConsumeData when the data consumed is for the crypto |
| 403 // handshake stream. Ensure that the packet is always sent and padded even if | 376 // handshake stream. Ensure that the packet is always sent and padded even if |
| 404 // the generator operates in batch mode. | 377 // the generator operates in batch mode. |
| 405 TEST_P(QuicPacketGeneratorTest, ConsumeData_Handshake) { | 378 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { |
| 406 delegate_.SetCanWriteAnything(); | 379 delegate_.SetCanWriteAnything(); |
| 407 generator_.StartBatchOperations(); | 380 generator_.StartBatchOperations(); |
| 408 | 381 |
| 409 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 382 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 410 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 383 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 411 QuicConsumedData consumed = generator_.ConsumeData( | 384 QuicConsumedData consumed = generator_.ConsumeData( |
| 412 kCryptoStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, nullptr); | 385 kCryptoStreamId, MakeIOVector("foo"), 0, false, nullptr); |
| 413 EXPECT_EQ(3u, consumed.bytes_consumed); | 386 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 414 EXPECT_FALSE(generator_.HasQueuedFrames()); | 387 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 415 | 388 |
| 416 PacketContents contents; | 389 PacketContents contents; |
| 417 contents.num_stream_frames = 1; | 390 contents.num_stream_frames = 1; |
| 418 CheckPacketContains(contents, 0); | 391 CheckPacketContains(contents, 0); |
| 419 | 392 |
| 420 ASSERT_EQ(1u, packets_.size()); | 393 ASSERT_EQ(1u, packets_.size()); |
| 421 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetMaxPacketLength()); | 394 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetMaxPacketLength()); |
| 422 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 395 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 423 } | 396 } |
| 424 | 397 |
| 425 TEST_P(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | 398 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { |
| 426 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, | 399 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, |
| 427 false, MAY_FEC_PROTECT, nullptr), | 400 false, nullptr), |
| 428 "Attempt to consume empty data without FIN."); | 401 "Attempt to consume empty data without FIN."); |
| 429 } | 402 } |
| 430 | 403 |
| 431 TEST_P(QuicPacketGeneratorTest, | 404 TEST_F(QuicPacketGeneratorTest, |
| 432 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 405 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
| 433 delegate_.SetCanWriteAnything(); | 406 delegate_.SetCanWriteAnything(); |
| 434 generator_.StartBatchOperations(); | 407 generator_.StartBatchOperations(); |
| 435 | 408 |
| 436 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 409 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
| 437 MAY_FEC_PROTECT, nullptr); | 410 nullptr); |
| 438 QuicConsumedData consumed = generator_.ConsumeData( | 411 QuicConsumedData consumed = |
| 439 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); | 412 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
| 440 EXPECT_EQ(4u, consumed.bytes_consumed); | 413 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 441 EXPECT_FALSE(consumed.fin_consumed); | 414 EXPECT_FALSE(consumed.fin_consumed); |
| 442 EXPECT_TRUE(generator_.HasQueuedFrames()); | 415 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 443 } | 416 } |
| 444 | 417 |
| 445 TEST_P(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 418 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
| 446 delegate_.SetCanWriteAnything(); | 419 delegate_.SetCanWriteAnything(); |
| 447 generator_.StartBatchOperations(); | 420 generator_.StartBatchOperations(); |
| 448 | 421 |
| 449 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 422 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
| 450 MAY_FEC_PROTECT, nullptr); | 423 nullptr); |
| 451 QuicConsumedData consumed = generator_.ConsumeData( | 424 QuicConsumedData consumed = |
| 452 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); | 425 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
| 453 EXPECT_EQ(4u, consumed.bytes_consumed); | 426 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 454 EXPECT_FALSE(consumed.fin_consumed); | 427 EXPECT_FALSE(consumed.fin_consumed); |
| 455 EXPECT_TRUE(generator_.HasQueuedFrames()); | 428 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 456 | 429 |
| 457 // Now both frames will be flushed out. | 430 // Now both frames will be flushed out. |
| 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 431 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 459 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 432 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 460 generator_.FinishBatchOperations(); | 433 generator_.FinishBatchOperations(); |
| 461 EXPECT_FALSE(generator_.HasQueuedFrames()); | 434 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 462 | 435 |
| 463 PacketContents contents; | 436 PacketContents contents; |
| 464 contents.num_stream_frames = 2; | 437 contents.num_stream_frames = 2; |
| 465 CheckPacketContains(contents, 0); | 438 CheckPacketContains(contents, 0); |
| 466 } | 439 } |
| 467 | 440 |
| 468 TEST_P(QuicPacketGeneratorTest, ConsumeDataFecOnMaxGroupSize) { | 441 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
| 469 delegate_.SetCanWriteAnything(); | |
| 470 | |
| 471 // Send FEC every two packets. | |
| 472 creator_->set_max_packets_per_fec_group(2); | |
| 473 | |
| 474 { | |
| 475 InSequence dummy; | |
| 476 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 477 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 478 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 479 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 480 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 481 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER, but FEC | |
| 482 // group is closed. | |
| 483 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 484 } else { | |
| 485 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 486 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 487 } | |
| 488 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 489 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 490 } | |
| 491 | |
| 492 // Send enough data to create 3 packets: two full and one partial. Send with | |
| 493 // MUST_FEC_PROTECT flag. | |
| 494 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | |
| 495 QuicConsumedData consumed = generator_.ConsumeData( | |
| 496 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
| 497 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 498 EXPECT_TRUE(consumed.fin_consumed); | |
| 499 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 500 | |
| 501 CheckPacketHasSingleStreamFrame(0); | |
| 502 CheckPacketHasSingleStreamFrame(1); | |
| 503 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 504 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER. | |
| 505 CheckPacketHasSingleStreamFrame(2); | |
| 506 } else { | |
| 507 CheckPacketIsFec(2, 1); | |
| 508 CheckPacketHasSingleStreamFrame(3); | |
| 509 } | |
| 510 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 511 | |
| 512 // If FEC send policy is FEC_ANY_TRIGGER, then the FEC packet under | |
| 513 // construction will be sent when one more packet is sent (since FEC group | |
| 514 // size is 2), or when OnFecTimeout is called. Send more data with | |
| 515 // MAY_FEC_PROTECT. This packet should also be protected, and FEC packet is | |
| 516 // sent since FEC group size is reached. | |
| 517 // | |
| 518 // If FEC send policy is FEC_ALARM_TRIGGER, FEC group is closed when the group | |
| 519 // size is reached. FEC packet is not sent. | |
| 520 { | |
| 521 InSequence dummy; | |
| 522 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 523 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 524 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 525 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 526 } else { | |
| 527 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 528 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 529 } | |
| 530 } | |
| 531 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
| 532 nullptr); | |
| 533 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 534 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 535 CheckPacketHasSingleStreamFrame(3); | |
| 536 } else { | |
| 537 CheckPacketHasSingleStreamFrame(4); | |
| 538 CheckPacketIsFec(5, 4); | |
| 539 } | |
| 540 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 541 } | |
| 542 | |
| 543 TEST_P(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) { | |
| 544 delegate_.SetCanWriteAnything(); | |
| 545 creator_->set_max_packets_per_fec_group(1000); | |
| 546 | |
| 547 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the | |
| 548 // creator FEC protects all data. | |
| 549 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 550 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 551 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true, | |
| 552 MUST_FEC_PROTECT, nullptr); | |
| 553 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 554 EXPECT_TRUE(consumed.fin_consumed); | |
| 555 CheckPacketHasSingleStreamFrame(0); | |
| 556 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 557 | |
| 558 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, | |
| 559 // and FEC packet is not yet sent. | |
| 560 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 561 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 562 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
| 563 nullptr); | |
| 564 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 565 CheckPacketHasSingleStreamFrame(1); | |
| 566 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 567 | |
| 568 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
| 569 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 570 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 571 generator_.OnFecTimeout(); | |
| 572 CheckPacketIsFec(2, 1); | |
| 573 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 574 | |
| 575 // Subsequent data is protected under the next FEC group. Send enough data to | |
| 576 // create 2 more packets: one full and one partial. | |
| 577 { | |
| 578 InSequence dummy; | |
| 579 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 580 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 581 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 582 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 583 } | |
| 584 size_t data_len = kDefaultMaxPacketSize + 1; | |
| 585 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
| 586 MUST_FEC_PROTECT, nullptr); | |
| 587 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 588 EXPECT_TRUE(consumed.fin_consumed); | |
| 589 CheckPacketHasSingleStreamFrame(3); | |
| 590 CheckPacketHasSingleStreamFrame(4); | |
| 591 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 592 | |
| 593 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
| 594 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 595 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 596 generator_.OnFecTimeout(); | |
| 597 CheckPacketIsFec(5, 4); | |
| 598 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 599 } | |
| 600 | |
| 601 TEST_P(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) { | |
| 602 delegate_.SetCanWriteAnything(); | |
| 603 creator_->set_max_packets_per_fec_group(6); | |
| 604 | |
| 605 // Send enough data to create 2 packets: one full and one partial. Send with | |
| 606 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC | |
| 607 // protects all data. | |
| 608 { | |
| 609 InSequence dummy; | |
| 610 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 611 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 612 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 613 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 614 } | |
| 615 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | |
| 616 QuicConsumedData consumed = generator_.ConsumeData( | |
| 617 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
| 618 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 619 EXPECT_TRUE(consumed.fin_consumed); | |
| 620 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 621 CheckPacketHasSingleStreamFrame(0); | |
| 622 CheckPacketHasSingleStreamFrame(1); | |
| 623 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 624 | |
| 625 // GetFecTimeout returns finite timeout only for first packet in group. | |
| 626 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), | |
| 627 generator_.GetFecTimeout(/*packet_number=*/1u)); | |
| 628 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 629 generator_.GetFecTimeout(/*packet_number=*/2u)); | |
| 630 | |
| 631 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, | |
| 632 // and FEC packet is not yet sent. | |
| 633 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 634 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 635 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
| 636 nullptr); | |
| 637 CheckPacketHasSingleStreamFrame(2); | |
| 638 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 639 | |
| 640 // GetFecTimeout returns finite timeout only for first packet in group. | |
| 641 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 642 generator_.GetFecTimeout(/*packet_number=*/3u)); | |
| 643 | |
| 644 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
| 645 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 646 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 647 generator_.OnFecTimeout(); | |
| 648 CheckPacketIsFec(3, /*fec_group=*/1u); | |
| 649 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 650 | |
| 651 // Subsequent data is protected under the next FEC group. Send enough data to | |
| 652 // create 2 more packets: one full and one partial. | |
| 653 { | |
| 654 InSequence dummy; | |
| 655 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 656 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 657 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 658 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 659 } | |
| 660 data_len = kDefaultMaxPacketSize + 1u; | |
| 661 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
| 662 MUST_FEC_PROTECT, nullptr); | |
| 663 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 664 EXPECT_TRUE(consumed.fin_consumed); | |
| 665 CheckPacketHasSingleStreamFrame(4); | |
| 666 CheckPacketHasSingleStreamFrame(5); | |
| 667 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 668 | |
| 669 // GetFecTimeout returns finite timeout for first packet in the new group. | |
| 670 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), | |
| 671 generator_.GetFecTimeout(/*packet_number=*/5u)); | |
| 672 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 673 generator_.GetFecTimeout(/*packet_number=*/6u)); | |
| 674 | |
| 675 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
| 676 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 677 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 678 generator_.OnFecTimeout(); | |
| 679 CheckPacketIsFec(6, /*fec_group=*/5u); | |
| 680 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 681 | |
| 682 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout | |
| 683 // returns infinite. | |
| 684 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 685 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 686 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
| 687 nullptr); | |
| 688 CheckPacketHasSingleStreamFrame(7); | |
| 689 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 690 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
| 691 generator_.GetFecTimeout(/*packet_number=*/8u)); | |
| 692 } | |
| 693 | |
| 694 TEST_P(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | |
| 695 // Set the packet size be enough for two stream frames with 0 stream offset, | 442 // Set the packet size be enough for two stream frames with 0 stream offset, |
| 696 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 443 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
| 697 size_t length = | 444 size_t length = |
| 698 NullEncrypter().GetCiphertextSize(0) + | 445 NullEncrypter().GetCiphertextSize(0) + |
| 699 GetPacketHeaderSize( | 446 GetPacketHeaderSize( |
| 700 creator_->connection_id_length(), kIncludeVersion, !kIncludePathId, | 447 creator_->connection_id_length(), kIncludeVersion, !kIncludePathId, |
| 701 QuicPacketCreatorPeer::NextPacketNumberLength(creator_), | 448 QuicPacketCreatorPeer::NextPacketNumberLength(creator_), |
| 702 NOT_IN_FEC_GROUP) + | 449 NOT_IN_FEC_GROUP) + |
| 703 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 450 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
| 704 // than the GetMinStreamFrameSize. | 451 // than the GetMinStreamFrameSize. |
| 705 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | 452 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
| 706 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | 453 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
| 707 generator_.SetMaxPacketLength(length, /*force=*/false); | 454 generator_.SetMaxPacketLength(length, /*force=*/false); |
| 708 delegate_.SetCanWriteAnything(); | 455 delegate_.SetCanWriteAnything(); |
| 709 { | 456 { |
| 710 InSequence dummy; | 457 InSequence dummy; |
| 711 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 712 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 459 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 713 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 714 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 461 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 715 } | 462 } |
| 716 generator_.StartBatchOperations(); | 463 generator_.StartBatchOperations(); |
| 717 // Queue enough data to prevent a stream frame with a non-zero offset from | 464 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 718 // fitting. | 465 // fitting. |
| 719 QuicConsumedData consumed = | 466 QuicConsumedData consumed = generator_.ConsumeData( |
| 720 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 0, false, | 467 kHeadersStreamId, MakeIOVector("foo"), 0, false, nullptr); |
| 721 MAY_FEC_PROTECT, nullptr); | |
| 722 EXPECT_EQ(3u, consumed.bytes_consumed); | 468 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 723 EXPECT_FALSE(consumed.fin_consumed); | 469 EXPECT_FALSE(consumed.fin_consumed); |
| 724 EXPECT_TRUE(generator_.HasQueuedFrames()); | 470 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 725 | 471 |
| 726 // This frame will not fit with the existing frame, causing the queued frame | 472 // This frame will not fit with the existing frame, causing the queued frame |
| 727 // to be serialized, and it will be added to a new open packet. | 473 // to be serialized, and it will be added to a new open packet. |
| 728 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, | 474 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, |
| 729 true, MAY_FEC_PROTECT, nullptr); | 475 true, nullptr); |
| 730 EXPECT_EQ(3u, consumed.bytes_consumed); | 476 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 731 EXPECT_TRUE(consumed.fin_consumed); | 477 EXPECT_TRUE(consumed.fin_consumed); |
| 732 EXPECT_TRUE(generator_.HasQueuedFrames()); | 478 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 733 | 479 |
| 734 creator_->Flush(); | 480 creator_->Flush(); |
| 735 EXPECT_FALSE(generator_.HasQueuedFrames()); | 481 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 736 | 482 |
| 737 PacketContents contents; | 483 PacketContents contents; |
| 738 contents.num_stream_frames = 1; | 484 contents.num_stream_frames = 1; |
| 739 CheckPacketContains(contents, 0); | 485 CheckPacketContains(contents, 0); |
| 740 CheckPacketContains(contents, 1); | 486 CheckPacketContains(contents, 1); |
| 741 } | 487 } |
| 742 | 488 |
| 743 TEST_P(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) { | 489 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
| 744 delegate_.SetCanWriteAnything(); | |
| 745 creator_->set_max_packets_per_fec_group(6); | |
| 746 | |
| 747 generator_.StartBatchOperations(); | |
| 748 | |
| 749 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT, | |
| 750 nullptr); | |
| 751 QuicConsumedData consumed = generator_.ConsumeData( | |
| 752 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr); | |
| 753 EXPECT_EQ(4u, consumed.bytes_consumed); | |
| 754 EXPECT_FALSE(consumed.fin_consumed); | |
| 755 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
| 756 | |
| 757 // Now both frames will be flushed out, but FEC packet is not yet sent. | |
| 758 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 759 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 760 generator_.FinishBatchOperations(); | |
| 761 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 762 | |
| 763 PacketContents contents; | |
| 764 contents.num_stream_frames = 2u; | |
| 765 contents.fec_group = 1u; | |
| 766 CheckPacketContains(contents, 0); | |
| 767 | |
| 768 // Forcing FEC timeout causes FEC packet to be emitted. | |
| 769 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 770 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 771 generator_.OnFecTimeout(); | |
| 772 CheckPacketIsFec(1, /*fec_group=*/1u); | |
| 773 } | |
| 774 | |
| 775 TEST_P(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { | |
| 776 EXPECT_EQ(QuicTime::Delta::Zero(), | |
| 777 QuicPacketCreatorPeer::GetFecTimeout(creator_)); | |
| 778 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); | |
| 779 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), | |
| 780 QuicPacketCreatorPeer::GetFecTimeout(creator_)); | |
| 781 } | |
| 782 | |
| 783 TEST_P(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { | |
| 784 delegate_.SetCanWriteAnything(); | |
| 785 creator_->set_max_packets_per_fec_group(50); | |
| 786 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
| 787 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
| 788 | |
| 789 // On reduced cwnd. | |
| 790 generator_.OnCongestionWindowChange(7); | |
| 791 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); | |
| 792 | |
| 793 // On increased cwnd. | |
| 794 generator_.OnCongestionWindowChange(100); | |
| 795 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
| 796 | |
| 797 // On collapsed cwnd. | |
| 798 generator_.OnCongestionWindowChange(1); | |
| 799 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | |
| 800 } | |
| 801 | |
| 802 TEST_P(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { | |
| 803 delegate_.SetCanWriteAnything(); | |
| 804 generator_.StartBatchOperations(); | |
| 805 creator_->set_max_packets_per_fec_group(50); | |
| 806 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
| 807 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
| 808 | |
| 809 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets | |
| 810 // are sent, one is queued in the creator. | |
| 811 { | |
| 812 InSequence dummy; | |
| 813 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 814 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 815 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 816 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 817 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 818 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 819 } | |
| 820 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | |
| 821 QuicConsumedData consumed = generator_.ConsumeData( | |
| 822 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
| 823 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 824 EXPECT_TRUE(creator_->IsFecGroupOpen()); | |
| 825 | |
| 826 // Change FEC groupsize. | |
| 827 generator_.OnCongestionWindowChange(2); | |
| 828 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | |
| 829 | |
| 830 // If FEC send policy is FEC_ANY_TRIGGER, then send enough data to trigger one | |
| 831 // unprotected data packet, causing the FEC packet to also be sent. | |
| 832 // | |
| 833 // If FEC send policy is FEC_ALARM_TRIGGER, FEC group is closed and FEC packet | |
| 834 // is not sent. | |
| 835 { | |
| 836 InSequence dummy; | |
| 837 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 838 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 839 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 840 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 841 } else { | |
| 842 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 843 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 844 } | |
| 845 } | |
| 846 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | |
| 847 true, MAY_FEC_PROTECT, nullptr); | |
| 848 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | |
| 849 if (generator_.fec_send_policy() == FEC_ANY_TRIGGER) { | |
| 850 // Verify that one FEC packet was sent. | |
| 851 CheckPacketIsFec(4, /*fec_group=*/1u); | |
| 852 } | |
| 853 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
| 854 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 855 } | |
| 856 | |
| 857 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOff) { | |
| 858 delegate_.SetCanWriteAnything(); | |
| 859 creator_->set_max_packets_per_fec_group(2); | |
| 860 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 861 | |
| 862 // Send one unprotected data packet. | |
| 863 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 864 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 865 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
| 866 MAY_FEC_PROTECT, nullptr); | |
| 867 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 868 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 869 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 870 // Verify that one data packet was sent. | |
| 871 PacketContents contents; | |
| 872 contents.num_stream_frames = 1; | |
| 873 CheckPacketContains(contents, 0); | |
| 874 | |
| 875 { | |
| 876 InSequence dummy; | |
| 877 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 878 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 879 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 880 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 881 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 882 // If FEC send policy is FEC_ALARM_TRIGGER, FEC group is closed. | |
| 883 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 884 } else { | |
| 885 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 886 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 887 } | |
| 888 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 889 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 890 } | |
| 891 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | |
| 892 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | |
| 893 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
| 894 MUST_FEC_PROTECT, nullptr); | |
| 895 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 896 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 897 | |
| 898 // If FEC send policy is FEC_ANY_TRIGGER, verify that packets sent were 3 data | |
| 899 // and 1 FEC. | |
| 900 // | |
| 901 // If FEC send policy is FEC_ALARM_TRIGGER, verify that packets sent were 3 | |
| 902 // data and FEC group is closed. | |
| 903 CheckPacketHasSingleStreamFrame(1); | |
| 904 CheckPacketHasSingleStreamFrame(2); | |
| 905 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 906 CheckPacketHasSingleStreamFrame(3); | |
| 907 } else { | |
| 908 CheckPacketIsFec(3, /*fec_group=*/2u); | |
| 909 CheckPacketHasSingleStreamFrame(4); | |
| 910 } | |
| 911 | |
| 912 // Calling OnFecTimeout should emit the pending FEC packet. | |
| 913 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 914 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 915 generator_.OnFecTimeout(); | |
| 916 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 917 CheckPacketIsFec(4, /*fec_group=*/4u); | |
| 918 } else { | |
| 919 CheckPacketIsFec(5, /*fec_group=*/5u); | |
| 920 } | |
| 921 | |
| 922 // Send one unprotected data packet. | |
| 923 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 924 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 925 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
| 926 nullptr); | |
| 927 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 928 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 929 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 930 // Verify that one unprotected data packet was sent. | |
| 931 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 932 CheckPacketContains(contents, 5); | |
| 933 } else { | |
| 934 CheckPacketContains(contents, 6); | |
| 935 } | |
| 936 } | |
| 937 | |
| 938 TEST_P(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | |
| 939 delegate_.SetCanWriteAnything(); | |
| 940 // Enable FEC. | |
| 941 creator_->set_max_packets_per_fec_group(2); | |
| 942 | |
| 943 generator_.StartBatchOperations(); | |
| 944 // Queue enough data to prevent a stream frame with a non-zero offset from | |
| 945 // fitting. | |
| 946 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
| 947 MAY_FEC_PROTECT, nullptr); | |
| 948 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 949 EXPECT_TRUE(creator_->HasPendingFrames()); | |
| 950 | |
| 951 // Queue protected data for sending. Should cause queued frames to be flushed. | |
| 952 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 953 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 954 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 955 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
| 956 MUST_FEC_PROTECT, nullptr); | |
| 957 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 958 PacketContents contents; | |
| 959 contents.num_stream_frames = 1; | |
| 960 // Transmitted packet was not FEC protected. | |
| 961 CheckPacketContains(contents, 0); | |
| 962 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 963 EXPECT_TRUE(creator_->HasPendingFrames()); | |
| 964 } | |
| 965 | |
| 966 TEST_P(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | |
| 967 // Enable FEC. | |
| 968 creator_->set_max_packets_per_fec_group(2); | |
| 969 | |
| 970 // Queue control frames in generator. | |
| 971 delegate_.SetCanNotWrite(); | |
| 972 generator_.SetShouldSendAck(true); | |
| 973 delegate_.SetCanWriteAnything(); | |
| 974 generator_.StartBatchOperations(); | |
| 975 | |
| 976 // Set up frames to write into the creator when control frames are written. | |
| 977 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
| 978 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | |
| 979 | |
| 980 // Generator should have queued control frames, and creator should be empty. | |
| 981 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
| 982 EXPECT_FALSE(creator_->HasPendingFrames()); | |
| 983 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 984 | |
| 985 // Queue protected data for sending. Should cause queued frames to be flushed. | |
| 986 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 987 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 988 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
| 989 MUST_FEC_PROTECT, nullptr); | |
| 990 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 991 PacketContents contents; | |
| 992 contents.num_ack_frames = 1; | |
| 993 contents.num_stop_waiting_frames = 1; | |
| 994 CheckPacketContains(contents, 0); | |
| 995 | |
| 996 // FEC protection should be on in creator. | |
| 997 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 998 } | |
| 999 | |
| 1000 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | |
| 1001 delegate_.SetCanWriteAnything(); | |
| 1002 | |
| 1003 // Enable FEC. | |
| 1004 creator_->set_max_packets_per_fec_group(2); | |
| 1005 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1006 | |
| 1007 // Queue stream frame to be protected in creator. | |
| 1008 generator_.StartBatchOperations(); | |
| 1009 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
| 1010 MUST_FEC_PROTECT, nullptr); | |
| 1011 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 1012 // Creator has a pending protected frame. | |
| 1013 EXPECT_TRUE(creator_->HasPendingFrames()); | |
| 1014 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1015 | |
| 1016 // Add enough unprotected data to exceed size of current packet, so that | |
| 1017 // current packet is sent. Both frames will be sent out in a single packet. | |
| 1018 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1019 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1020 size_t data_len = kDefaultMaxPacketSize; | |
| 1021 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
| 1022 MAY_FEC_PROTECT, nullptr); | |
| 1023 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 1024 PacketContents contents; | |
| 1025 contents.num_stream_frames = 2u; | |
| 1026 contents.fec_group = 1u; | |
| 1027 CheckPacketContains(contents, 0); | |
| 1028 // FEC protection should still be on in creator. | |
| 1029 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1030 } | |
| 1031 | |
| 1032 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | |
| 1033 delegate_.SetCanWriteAnything(); | |
| 1034 | |
| 1035 // Enable FEC. | |
| 1036 creator_->set_max_packets_per_fec_group(2); | |
| 1037 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1038 | |
| 1039 // Send first packet, FEC protected. | |
| 1040 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1041 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1042 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
| 1043 MUST_FEC_PROTECT, nullptr); | |
| 1044 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 1045 PacketContents contents; | |
| 1046 contents.num_stream_frames = 1u; | |
| 1047 contents.fec_group = 1u; | |
| 1048 CheckPacketContains(contents, 0); | |
| 1049 | |
| 1050 // FEC should still be on in creator. | |
| 1051 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1052 | |
| 1053 // Send unprotected data to cause second packet to be sent, which gets | |
| 1054 // protected because it happens to fall within an open FEC group. Data packet | |
| 1055 // will be followed by FEC packet. | |
| 1056 { | |
| 1057 InSequence dummy; | |
| 1058 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1059 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1060 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1061 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 1062 } else { | |
| 1063 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1064 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1065 } | |
| 1066 } | |
| 1067 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
| 1068 nullptr); | |
| 1069 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 1070 contents.num_stream_frames = 1u; | |
| 1071 CheckPacketContains(contents, 1); | |
| 1072 if (generator_.fec_send_policy() == FEC_ANY_TRIGGER) { | |
| 1073 // FEC packet is sent when send policy is FEC_ANY_TRIGGER. | |
| 1074 CheckPacketIsFec(2, /*fec_group=*/1u); | |
| 1075 } | |
| 1076 | |
| 1077 // FEC protection should be off in creator. | |
| 1078 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1079 } | |
| 1080 | |
| 1081 TEST_P(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | |
| 1082 delegate_.SetCanWriteAnything(); | |
| 1083 generator_.StartBatchOperations(); | |
| 1084 | |
| 1085 // Enable FEC. | |
| 1086 creator_->set_max_packets_per_fec_group(2); | |
| 1087 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1088 | |
| 1089 // Queue one byte of FEC protected data. | |
| 1090 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
| 1091 MUST_FEC_PROTECT, nullptr); | |
| 1092 EXPECT_TRUE(creator_->HasPendingFrames()); | |
| 1093 | |
| 1094 // Add more unprotected data causing first packet to be sent, FEC protected. | |
| 1095 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1096 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1097 size_t data_len = kDefaultMaxPacketSize; | |
| 1098 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
| 1099 MAY_FEC_PROTECT, nullptr); | |
| 1100 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 1101 PacketContents contents; | |
| 1102 contents.num_stream_frames = 2u; | |
| 1103 contents.fec_group = 1u; | |
| 1104 CheckPacketContains(contents, 0); | |
| 1105 | |
| 1106 // FEC group is still open in creator. | |
| 1107 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1108 | |
| 1109 // Add data that should be protected, large enough to cause second packet to | |
| 1110 // be sent. Data packet should be followed by FEC packet. | |
| 1111 { | |
| 1112 InSequence dummy; | |
| 1113 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1114 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1115 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1116 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 1117 } else { | |
| 1118 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1119 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1120 } | |
| 1121 } | |
| 1122 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
| 1123 MUST_FEC_PROTECT, nullptr); | |
| 1124 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 1125 CheckPacketContains(contents, 1); | |
| 1126 if (generator_.fec_send_policy() == FEC_ANY_TRIGGER) { | |
| 1127 // FEC packet is sent when send policy is FEC_ANY_TRIGGER. | |
| 1128 CheckPacketIsFec(2, /*fec_group=*/1u); | |
| 1129 } | |
| 1130 | |
| 1131 // FEC protection should remain on in creator. | |
| 1132 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1133 } | |
| 1134 | |
| 1135 TEST_P(QuicPacketGeneratorTest, ResetFecGroupNoTimeout) { | |
| 1136 delegate_.SetCanWriteAnything(); | |
| 1137 // Send FEC packet after 2 packets. | |
| 1138 creator_->set_max_packets_per_fec_group(2); | |
| 1139 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1140 | |
| 1141 // Send two packets so that when this data is consumed, two packets are sent | |
| 1142 // out. In FEC_TRIGGER_ANY, this will cause an FEC packet to be sent out and | |
| 1143 // with FEC_TRIGGER_ALARM, this will cause a Reset to be called. In both | |
| 1144 // cases, the creator's fec protection will be turned off afterwards. | |
| 1145 { | |
| 1146 InSequence dummy; | |
| 1147 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1148 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1149 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1150 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1151 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1152 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER, but FEC | |
| 1153 // group is closed. | |
| 1154 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 1155 } else { | |
| 1156 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1157 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1158 } | |
| 1159 // Fin Packet. | |
| 1160 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1161 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1162 } | |
| 1163 size_t data_len = 2 * kDefaultMaxPacketSize; | |
| 1164 QuicConsumedData consumed = generator_.ConsumeData( | |
| 1165 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
| 1166 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 1167 EXPECT_TRUE(consumed.fin_consumed); | |
| 1168 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 1169 CheckPacketHasSingleStreamFrame(0); | |
| 1170 CheckPacketHasSingleStreamFrame(1); | |
| 1171 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1172 // FEC packet is not sent when send policy is FEC_ALARM_TRIGGER. | |
| 1173 CheckPacketHasSingleStreamFrame(2); | |
| 1174 } else { | |
| 1175 // FEC packet is sent after 2 packets and when send policy is | |
| 1176 // FEC_ANY_TRIGGER. | |
| 1177 CheckPacketIsFec(2, 1); | |
| 1178 CheckPacketHasSingleStreamFrame(3); | |
| 1179 } | |
| 1180 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1181 | |
| 1182 // Do the same send (with MUST_FEC_PROTECT) on a different stream id. | |
| 1183 { | |
| 1184 InSequence dummy; | |
| 1185 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1186 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1187 // FEC packet is sent after 2 packets and when send policy is | |
| 1188 // FEC_ANY_TRIGGER. When policy is FEC_ALARM_TRIGGER, FEC group is closed | |
| 1189 // and FEC packet is not sent. | |
| 1190 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1191 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 1192 } else { | |
| 1193 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1194 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1195 } | |
| 1196 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1197 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1198 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1199 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1200 // FEC packet is sent after 2 packets and when send policy is | |
| 1201 // FEC_ANY_TRIGGER. When policy is FEC_ALARM_TRIGGER, FEC group is closed | |
| 1202 // and FEC packet is not sent. | |
| 1203 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1204 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
| 1205 } else { | |
| 1206 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1207 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1208 } | |
| 1209 } | |
| 1210 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
| 1211 MUST_FEC_PROTECT, nullptr); | |
| 1212 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 1213 EXPECT_TRUE(consumed.fin_consumed); | |
| 1214 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 1215 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1216 CheckPacketHasSingleStreamFrame(3); | |
| 1217 CheckPacketHasSingleStreamFrame(4); | |
| 1218 CheckPacketHasSingleStreamFrame(5); | |
| 1219 } else { | |
| 1220 CheckPacketHasSingleStreamFrame(4); | |
| 1221 // FEC packet is sent after 2 packets and when send policy is | |
| 1222 // FEC_ANY_TRIGGER. | |
| 1223 CheckPacketIsFec(5, 4); | |
| 1224 CheckPacketHasSingleStreamFrame(6); | |
| 1225 CheckPacketHasSingleStreamFrame(7); | |
| 1226 // FEC packet is sent after 2 packets and when send policy is | |
| 1227 // FEC_ANY_TRIGGER. | |
| 1228 CheckPacketIsFec(8, 7); | |
| 1229 } | |
| 1230 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1231 | |
| 1232 // Do the another send (with MAY_FEC_PROTECT) on a different stream id, which | |
| 1233 // should not produce an FEC packet because the last FEC group has been | |
| 1234 // closed. | |
| 1235 { | |
| 1236 InSequence dummy; | |
| 1237 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1238 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1239 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1240 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1241 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1242 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1243 } | |
| 1244 consumed = generator_.ConsumeData(9, CreateData(data_len), 0, true, | |
| 1245 MAY_FEC_PROTECT, nullptr); | |
| 1246 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
| 1247 EXPECT_TRUE(consumed.fin_consumed); | |
| 1248 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
| 1249 if (generator_.fec_send_policy() == FEC_ALARM_TRIGGER) { | |
| 1250 CheckPacketHasSingleStreamFrame(6); | |
| 1251 CheckPacketHasSingleStreamFrame(7); | |
| 1252 CheckPacketHasSingleStreamFrame(8); | |
| 1253 } else { | |
| 1254 CheckPacketHasSingleStreamFrame(9); | |
| 1255 CheckPacketHasSingleStreamFrame(10); | |
| 1256 CheckPacketHasSingleStreamFrame(11); | |
| 1257 } | |
| 1258 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1259 } | |
| 1260 | |
| 1261 // 1. Create and send one packet with MUST_FEC_PROTECT. | |
| 1262 // 2. Call FecTimeout, expect FEC packet is sent. | |
| 1263 // 3. Do the same thing over again, with a different stream id. | |
| 1264 TEST_P(QuicPacketGeneratorTest, FecPacketSentOnFecTimeout) { | |
| 1265 delegate_.SetCanWriteAnything(); | |
| 1266 creator_->set_max_packets_per_fec_group(1000); | |
| 1267 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1268 | |
| 1269 for (int i = 1; i < 4; i = i + 2) { | |
| 1270 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the | |
| 1271 // creator FEC protects all data. | |
| 1272 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1273 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1274 QuicConsumedData consumed = generator_.ConsumeData( | |
| 1275 i + 2, CreateData(1u), 0, true, MUST_FEC_PROTECT, nullptr); | |
| 1276 EXPECT_EQ(1u, consumed.bytes_consumed); | |
| 1277 EXPECT_TRUE(consumed.fin_consumed); | |
| 1278 CheckPacketHasSingleStreamFrame(0); | |
| 1279 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1280 | |
| 1281 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
| 1282 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
| 1283 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
| 1284 generator_.OnFecTimeout(); | |
| 1285 CheckPacketIsFec(i, i); | |
| 1286 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(creator_)); | |
| 1287 } | |
| 1288 } | |
| 1289 | |
| 1290 TEST_P(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | |
| 1291 delegate_.SetCanNotWrite(); | 490 delegate_.SetCanNotWrite(); |
| 1292 | 491 |
| 1293 generator_.SetShouldSendAck(false); | 492 generator_.SetShouldSendAck(false); |
| 1294 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 493 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 1295 EXPECT_TRUE(generator_.HasQueuedFrames()); | 494 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1296 | 495 |
| 1297 delegate_.SetCanWriteAnything(); | 496 delegate_.SetCanWriteAnything(); |
| 1298 | 497 |
| 1299 generator_.StartBatchOperations(); | 498 generator_.StartBatchOperations(); |
| 1300 | 499 |
| 1301 // When the first write operation is invoked, the ack frame will be returned. | 500 // When the first write operation is invoked, the ack frame will be returned. |
| 1302 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 501 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 1303 | 502 |
| 1304 // Send some data and a control frame | 503 // Send some data and a control frame |
| 1305 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, | 504 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); |
| 1306 nullptr); | |
| 1307 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 505 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 1308 | 506 |
| 1309 // All five frames will be flushed out in a single packet. | 507 // All five frames will be flushed out in a single packet. |
| 1310 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 508 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1311 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 509 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1312 generator_.FinishBatchOperations(); | 510 generator_.FinishBatchOperations(); |
| 1313 EXPECT_FALSE(generator_.HasQueuedFrames()); | 511 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1314 | 512 |
| 1315 PacketContents contents; | 513 PacketContents contents; |
| 1316 contents.num_ack_frames = 1; | 514 contents.num_ack_frames = 1; |
| 1317 contents.num_goaway_frames = 1; | 515 contents.num_goaway_frames = 1; |
| 1318 contents.num_rst_stream_frames = 1; | 516 contents.num_rst_stream_frames = 1; |
| 1319 contents.num_stream_frames = 1; | 517 contents.num_stream_frames = 1; |
| 1320 CheckPacketContains(contents, 0); | 518 CheckPacketContains(contents, 0); |
| 1321 } | 519 } |
| 1322 | 520 |
| 1323 TEST_P(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 521 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
| 1324 delegate_.SetCanNotWrite(); | 522 delegate_.SetCanNotWrite(); |
| 1325 | 523 |
| 1326 generator_.SetShouldSendAck(false); | 524 generator_.SetShouldSendAck(false); |
| 1327 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 525 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 1328 EXPECT_TRUE(generator_.HasQueuedFrames()); | 526 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1329 | 527 |
| 1330 delegate_.SetCanWriteAnything(); | 528 delegate_.SetCanWriteAnything(); |
| 1331 | 529 |
| 1332 generator_.StartBatchOperations(); | 530 generator_.StartBatchOperations(); |
| 1333 | 531 |
| 1334 // When the first write operation is invoked, the ack frame will be returned. | 532 // When the first write operation is invoked, the ack frame will be returned. |
| 1335 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 533 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 1336 | 534 |
| 1337 { | 535 { |
| 1338 InSequence dummy; | 536 InSequence dummy; |
| 1339 // All five frames will be flushed out in a single packet | 537 // All five frames will be flushed out in a single packet |
| 1340 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 538 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1341 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 539 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1342 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 540 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1343 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 541 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1344 } | 542 } |
| 1345 | 543 |
| 1346 // Send enough data to exceed one packet | 544 // Send enough data to exceed one packet |
| 1347 size_t data_len = kDefaultMaxPacketSize + 100; | 545 size_t data_len = kDefaultMaxPacketSize + 100; |
| 1348 QuicConsumedData consumed = generator_.ConsumeData( | 546 QuicConsumedData consumed = |
| 1349 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); | 547 generator_.ConsumeData(3, CreateData(data_len), 0, true, nullptr); |
| 1350 EXPECT_EQ(data_len, consumed.bytes_consumed); | 548 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 1351 EXPECT_TRUE(consumed.fin_consumed); | 549 EXPECT_TRUE(consumed.fin_consumed); |
| 1352 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 550 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 1353 | 551 |
| 1354 generator_.FinishBatchOperations(); | 552 generator_.FinishBatchOperations(); |
| 1355 EXPECT_FALSE(generator_.HasQueuedFrames()); | 553 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1356 | 554 |
| 1357 // The first packet should have the queued data and part of the stream data. | 555 // The first packet should have the queued data and part of the stream data. |
| 1358 PacketContents contents; | 556 PacketContents contents; |
| 1359 contents.num_ack_frames = 1; | 557 contents.num_ack_frames = 1; |
| 1360 contents.num_rst_stream_frames = 1; | 558 contents.num_rst_stream_frames = 1; |
| 1361 contents.num_stream_frames = 1; | 559 contents.num_stream_frames = 1; |
| 1362 CheckPacketContains(contents, 0); | 560 CheckPacketContains(contents, 0); |
| 1363 | 561 |
| 1364 // The second should have the remainder of the stream data. | 562 // The second should have the remainder of the stream data. |
| 1365 PacketContents contents2; | 563 PacketContents contents2; |
| 1366 contents2.num_goaway_frames = 1; | 564 contents2.num_goaway_frames = 1; |
| 1367 contents2.num_stream_frames = 1; | 565 contents2.num_stream_frames = 1; |
| 1368 CheckPacketContains(contents2, 1); | 566 CheckPacketContains(contents2, 1); |
| 1369 } | 567 } |
| 1370 | 568 |
| 1371 TEST_P(QuicPacketGeneratorTest, TestConnectionIdLength) { | 569 TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) { |
| 1372 generator_.SetConnectionIdLength(0); | 570 generator_.SetConnectionIdLength(0); |
| 1373 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); | 571 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1374 generator_.SetConnectionIdLength(1); | 572 generator_.SetConnectionIdLength(1); |
| 1375 EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length()); | 573 EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1376 generator_.SetConnectionIdLength(2); | 574 generator_.SetConnectionIdLength(2); |
| 1377 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | 575 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1378 generator_.SetConnectionIdLength(3); | 576 generator_.SetConnectionIdLength(3); |
| 1379 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | 577 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1380 generator_.SetConnectionIdLength(4); | 578 generator_.SetConnectionIdLength(4); |
| 1381 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | 579 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1382 generator_.SetConnectionIdLength(5); | 580 generator_.SetConnectionIdLength(5); |
| 1383 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 581 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1384 generator_.SetConnectionIdLength(6); | 582 generator_.SetConnectionIdLength(6); |
| 1385 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 583 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1386 generator_.SetConnectionIdLength(7); | 584 generator_.SetConnectionIdLength(7); |
| 1387 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 585 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1388 generator_.SetConnectionIdLength(8); | 586 generator_.SetConnectionIdLength(8); |
| 1389 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 587 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1390 generator_.SetConnectionIdLength(9); | 588 generator_.SetConnectionIdLength(9); |
| 1391 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | 589 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
| 1392 } | 590 } |
| 1393 | 591 |
| 1394 // Test whether SetMaxPacketLength() works in the situation when the queue is | 592 // Test whether SetMaxPacketLength() works in the situation when the queue is |
| 1395 // empty, and we send three packets worth of data. | 593 // empty, and we send three packets worth of data. |
| 1396 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) { | 594 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) { |
| 1397 delegate_.SetCanWriteAnything(); | 595 delegate_.SetCanWriteAnything(); |
| 1398 | 596 |
| 1399 // Send enough data for three packets. | 597 // Send enough data for three packets. |
| 1400 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 598 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
| 1401 size_t packet_len = kDefaultMaxPacketSize + 100; | 599 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 1402 ASSERT_LE(packet_len, kMaxPacketSize); | 600 ASSERT_LE(packet_len, kMaxPacketSize); |
| 1403 generator_.SetMaxPacketLength(packet_len, /*force=*/false); | 601 generator_.SetMaxPacketLength(packet_len, /*force=*/false); |
| 1404 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 602 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 1405 | 603 |
| 1406 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 604 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1407 .Times(3) | 605 .Times(3) |
| 1408 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 606 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1409 QuicConsumedData consumed = | 607 QuicConsumedData consumed = |
| 1410 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 608 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 1411 /*offset=*/2, | 609 /*offset=*/2, |
| 1412 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 610 /*fin=*/true, nullptr); |
| 1413 EXPECT_EQ(data_len, consumed.bytes_consumed); | 611 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 1414 EXPECT_TRUE(consumed.fin_consumed); | 612 EXPECT_TRUE(consumed.fin_consumed); |
| 1415 EXPECT_FALSE(generator_.HasQueuedFrames()); | 613 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1416 | 614 |
| 1417 // We expect three packets, and first two of them have to be of packet_len | 615 // We expect three packets, and first two of them have to be of packet_len |
| 1418 // size. We check multiple packets (instead of just one) because we want to | 616 // size. We check multiple packets (instead of just one) because we want to |
| 1419 // ensure that |max_packet_length_| does not get changed incorrectly by the | 617 // ensure that |max_packet_length_| does not get changed incorrectly by the |
| 1420 // generator after first packet is serialized. | 618 // generator after first packet is serialized. |
| 1421 ASSERT_EQ(3u, packets_.size()); | 619 ASSERT_EQ(3u, packets_.size()); |
| 1422 EXPECT_EQ(packet_len, packets_[0].encrypted_length); | 620 EXPECT_EQ(packet_len, packets_[0].encrypted_length); |
| 1423 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 621 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
| 1424 CheckAllPacketsHaveSingleStreamFrame(); | 622 CheckAllPacketsHaveSingleStreamFrame(); |
| 1425 } | 623 } |
| 1426 | 624 |
| 1427 // Test whether SetMaxPacketLength() works in the situation when we first write | 625 // Test whether SetMaxPacketLength() works in the situation when we first write |
| 1428 // data, then change packet size, then write data again. | 626 // data, then change packet size, then write data again. |
| 1429 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) { | 627 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) { |
| 1430 delegate_.SetCanWriteAnything(); | 628 delegate_.SetCanWriteAnything(); |
| 1431 | 629 |
| 1432 // We send enough data to overflow default packet length, but not the altered | 630 // We send enough data to overflow default packet length, but not the altered |
| 1433 // one. | 631 // one. |
| 1434 size_t data_len = kDefaultMaxPacketSize; | 632 size_t data_len = kDefaultMaxPacketSize; |
| 1435 size_t packet_len = kDefaultMaxPacketSize + 100; | 633 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 1436 ASSERT_LE(packet_len, kMaxPacketSize); | 634 ASSERT_LE(packet_len, kMaxPacketSize); |
| 1437 | 635 |
| 1438 // We expect to see three packets in total. | 636 // We expect to see three packets in total. |
| 1439 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 637 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1440 .Times(3) | 638 .Times(3) |
| 1441 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 639 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1442 | 640 |
| 1443 // Send two packets before packet size change. | 641 // Send two packets before packet size change. |
| 1444 QuicConsumedData consumed = | 642 QuicConsumedData consumed = |
| 1445 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 643 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 1446 /*offset=*/2, | 644 /*offset=*/2, |
| 1447 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 645 /*fin=*/false, nullptr); |
| 1448 EXPECT_EQ(data_len, consumed.bytes_consumed); | 646 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 1449 EXPECT_FALSE(consumed.fin_consumed); | 647 EXPECT_FALSE(consumed.fin_consumed); |
| 1450 EXPECT_FALSE(generator_.HasQueuedFrames()); | 648 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1451 | 649 |
| 1452 // Make sure we already have two packets. | 650 // Make sure we already have two packets. |
| 1453 ASSERT_EQ(2u, packets_.size()); | 651 ASSERT_EQ(2u, packets_.size()); |
| 1454 | 652 |
| 1455 // Increase packet size. | 653 // Increase packet size. |
| 1456 generator_.SetMaxPacketLength(packet_len, /*force=*/false); | 654 generator_.SetMaxPacketLength(packet_len, /*force=*/false); |
| 1457 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 655 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 1458 | 656 |
| 1459 // Send a packet after packet size change. | 657 // Send a packet after packet size change. |
| 1460 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 658 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 1461 2 + data_len, | 659 2 + data_len, |
| 1462 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 660 /*fin=*/true, nullptr); |
| 1463 EXPECT_EQ(data_len, consumed.bytes_consumed); | 661 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 1464 EXPECT_TRUE(consumed.fin_consumed); | 662 EXPECT_TRUE(consumed.fin_consumed); |
| 1465 EXPECT_FALSE(generator_.HasQueuedFrames()); | 663 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1466 | 664 |
| 1467 // We expect first data chunk to get fragmented, but the second one to fit | 665 // We expect first data chunk to get fragmented, but the second one to fit |
| 1468 // into a single packet. | 666 // into a single packet. |
| 1469 ASSERT_EQ(3u, packets_.size()); | 667 ASSERT_EQ(3u, packets_.size()); |
| 1470 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 668 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 1471 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); | 669 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); |
| 1472 CheckAllPacketsHaveSingleStreamFrame(); | 670 CheckAllPacketsHaveSingleStreamFrame(); |
| 1473 } | 671 } |
| 1474 | 672 |
| 1475 // Test whether SetMaxPacketLength() works correctly when we change the packet | 673 // Test whether SetMaxPacketLength() works correctly when we change the packet |
| 1476 // size in the middle of the batched packet. | 674 // size in the middle of the batched packet. |
| 1477 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_Midpacket) { | 675 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Midpacket) { |
| 1478 delegate_.SetCanWriteAnything(); | 676 delegate_.SetCanWriteAnything(); |
| 1479 generator_.StartBatchOperations(); | 677 generator_.StartBatchOperations(); |
| 1480 | 678 |
| 1481 size_t first_write_len = kDefaultMaxPacketSize / 2; | 679 size_t first_write_len = kDefaultMaxPacketSize / 2; |
| 1482 size_t second_write_len = kDefaultMaxPacketSize; | 680 size_t second_write_len = kDefaultMaxPacketSize; |
| 1483 size_t packet_len = kDefaultMaxPacketSize + 100; | 681 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 1484 ASSERT_LE(packet_len, kMaxPacketSize); | 682 ASSERT_LE(packet_len, kMaxPacketSize); |
| 1485 | 683 |
| 1486 // First send half of the packet worth of data. We are in the batch mode, so | 684 // First send half of the packet worth of data. We are in the batch mode, so |
| 1487 // should not cause packet serialization. | 685 // should not cause packet serialization. |
| 1488 QuicConsumedData consumed = | 686 QuicConsumedData consumed = |
| 1489 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 687 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
| 1490 /*offset=*/2, | 688 /*offset=*/2, |
| 1491 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 689 /*fin=*/false, nullptr); |
| 1492 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 690 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
| 1493 EXPECT_FALSE(consumed.fin_consumed); | 691 EXPECT_FALSE(consumed.fin_consumed); |
| 1494 EXPECT_TRUE(generator_.HasQueuedFrames()); | 692 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1495 | 693 |
| 1496 // Make sure we have no packets so far. | 694 // Make sure we have no packets so far. |
| 1497 ASSERT_EQ(0u, packets_.size()); | 695 ASSERT_EQ(0u, packets_.size()); |
| 1498 | 696 |
| 1499 // Increase packet size. Ensure it's not immediately enacted. | 697 // Increase packet size. Ensure it's not immediately enacted. |
| 1500 generator_.SetMaxPacketLength(packet_len, /*force=*/false); | 698 generator_.SetMaxPacketLength(packet_len, /*force=*/false); |
| 1501 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); | 699 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); |
| 1502 EXPECT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); | 700 EXPECT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); |
| 1503 | 701 |
| 1504 // We expect to see exactly one packet serialized after that, since we are in | 702 // We expect to see exactly one packet serialized after that, since we are in |
| 1505 // batch mode and we have sent approximately 3/2 of our MTU. | 703 // batch mode and we have sent approximately 3/2 of our MTU. |
| 1506 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 704 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1507 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 705 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1508 | 706 |
| 1509 // Send a packet worth of data to the same stream. This should trigger | 707 // Send a packet worth of data to the same stream. This should trigger |
| 1510 // serialization of other packet. | 708 // serialization of other packet. |
| 1511 consumed = | 709 consumed = |
| 1512 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 710 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
| 1513 /*offset=*/2 + first_write_len, | 711 /*offset=*/2 + first_write_len, |
| 1514 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 712 /*fin=*/true, nullptr); |
| 1515 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 713 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
| 1516 EXPECT_TRUE(consumed.fin_consumed); | 714 EXPECT_TRUE(consumed.fin_consumed); |
| 1517 EXPECT_TRUE(generator_.HasQueuedFrames()); | 715 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1518 | 716 |
| 1519 // We expect the first packet to contain two frames, and to not reflect the | 717 // We expect the first packet to contain two frames, and to not reflect the |
| 1520 // packet size change. | 718 // packet size change. |
| 1521 ASSERT_EQ(1u, packets_.size()); | 719 ASSERT_EQ(1u, packets_.size()); |
| 1522 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 720 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 1523 | 721 |
| 1524 PacketContents contents; | 722 PacketContents contents; |
| 1525 contents.num_stream_frames = 2; | 723 contents.num_stream_frames = 2; |
| 1526 CheckPacketContains(contents, 0); | 724 CheckPacketContains(contents, 0); |
| 1527 } | 725 } |
| 1528 | 726 |
| 1529 // Test whether SetMaxPacketLength() works correctly when we force the change of | 727 // Test whether SetMaxPacketLength() works correctly when we force the change of |
| 1530 // the packet size in the middle of the batched packet. | 728 // the packet size in the middle of the batched packet. |
| 1531 TEST_P(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { | 729 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { |
| 1532 delegate_.SetCanWriteAnything(); | 730 delegate_.SetCanWriteAnything(); |
| 1533 generator_.StartBatchOperations(); | 731 generator_.StartBatchOperations(); |
| 1534 | 732 |
| 1535 size_t first_write_len = kDefaultMaxPacketSize / 2; | 733 size_t first_write_len = kDefaultMaxPacketSize / 2; |
| 1536 size_t packet_len = kDefaultMaxPacketSize + 100; | 734 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 1537 size_t second_write_len = packet_len + 1; | 735 size_t second_write_len = packet_len + 1; |
| 1538 ASSERT_LE(packet_len, kMaxPacketSize); | 736 ASSERT_LE(packet_len, kMaxPacketSize); |
| 1539 | 737 |
| 1540 // First send half of the packet worth of data. We are in the batch mode, so | 738 // First send half of the packet worth of data. We are in the batch mode, so |
| 1541 // should not cause packet serialization. | 739 // should not cause packet serialization. |
| 1542 QuicConsumedData consumed = | 740 QuicConsumedData consumed = |
| 1543 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 741 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
| 1544 /*offset=*/2, | 742 /*offset=*/2, |
| 1545 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 743 /*fin=*/false, nullptr); |
| 1546 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 744 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
| 1547 EXPECT_FALSE(consumed.fin_consumed); | 745 EXPECT_FALSE(consumed.fin_consumed); |
| 1548 EXPECT_TRUE(generator_.HasQueuedFrames()); | 746 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1549 | 747 |
| 1550 // Make sure we have no packets so far. | 748 // Make sure we have no packets so far. |
| 1551 ASSERT_EQ(0u, packets_.size()); | 749 ASSERT_EQ(0u, packets_.size()); |
| 1552 | 750 |
| 1553 // Expect a packet to be flushed. | 751 // Expect a packet to be flushed. |
| 1554 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 752 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1555 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 753 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1556 | 754 |
| 1557 // Increase packet size. Ensure it's immediately enacted. | 755 // Increase packet size. Ensure it's immediately enacted. |
| 1558 generator_.SetMaxPacketLength(packet_len, /*force=*/true); | 756 generator_.SetMaxPacketLength(packet_len, /*force=*/true); |
| 1559 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); | 757 EXPECT_EQ(packet_len, generator_.GetMaxPacketLength()); |
| 1560 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 758 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 1561 EXPECT_FALSE(generator_.HasQueuedFrames()); | 759 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1562 | 760 |
| 1563 // We expect to see exactly one packet serialized after that, because we send | 761 // We expect to see exactly one packet serialized after that, because we send |
| 1564 // a value somewhat exceeding new max packet size, and the tail data does not | 762 // a value somewhat exceeding new max packet size, and the tail data does not |
| 1565 // get serialized because we are still in the batch mode. | 763 // get serialized because we are still in the batch mode. |
| 1566 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 764 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1567 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 765 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1568 | 766 |
| 1569 // Send a more than a packet worth of data to the same stream. This should | 767 // Send a more than a packet worth of data to the same stream. This should |
| 1570 // trigger serialization of one packet, and queue another one. | 768 // trigger serialization of one packet, and queue another one. |
| 1571 consumed = | 769 consumed = |
| 1572 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 770 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
| 1573 /*offset=*/2 + first_write_len, | 771 /*offset=*/2 + first_write_len, |
| 1574 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 772 /*fin=*/true, nullptr); |
| 1575 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 773 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
| 1576 EXPECT_TRUE(consumed.fin_consumed); | 774 EXPECT_TRUE(consumed.fin_consumed); |
| 1577 EXPECT_TRUE(generator_.HasQueuedFrames()); | 775 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1578 | 776 |
| 1579 // We expect the first packet to be underfilled, and the second packet be up | 777 // We expect the first packet to be underfilled, and the second packet be up |
| 1580 // to the new max packet size. | 778 // to the new max packet size. |
| 1581 ASSERT_EQ(2u, packets_.size()); | 779 ASSERT_EQ(2u, packets_.size()); |
| 1582 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 780 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 1583 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 781 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
| 1584 | 782 |
| 1585 CheckAllPacketsHaveSingleStreamFrame(); | 783 CheckAllPacketsHaveSingleStreamFrame(); |
| 1586 } | 784 } |
| 1587 | 785 |
| 1588 // Test sending an MTU probe, without any surrounding data. | 786 // Test sending an MTU probe, without any surrounding data. |
| 1589 TEST_P(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { | 787 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { |
| 1590 delegate_.SetCanWriteAnything(); | 788 delegate_.SetCanWriteAnything(); |
| 1591 | 789 |
| 1592 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 790 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
| 1593 static_assert(target_mtu < kMaxPacketSize, | 791 static_assert(target_mtu < kMaxPacketSize, |
| 1594 "The MTU probe used by the test exceeds maximum packet size"); | 792 "The MTU probe used by the test exceeds maximum packet size"); |
| 1595 | 793 |
| 1596 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 794 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1597 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 795 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1598 | 796 |
| 1599 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 797 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
| 1600 | 798 |
| 1601 EXPECT_FALSE(generator_.HasQueuedFrames()); | 799 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1602 ASSERT_EQ(1u, packets_.size()); | 800 ASSERT_EQ(1u, packets_.size()); |
| 1603 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); | 801 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); |
| 1604 | 802 |
| 1605 PacketContents contents; | 803 PacketContents contents; |
| 1606 contents.num_mtu_discovery_frames = 1; | 804 contents.num_mtu_discovery_frames = 1; |
| 1607 CheckPacketContains(contents, 0); | 805 CheckPacketContains(contents, 0); |
| 1608 } | 806 } |
| 1609 | 807 |
| 1610 // Test sending an MTU probe. Surround it with data, to ensure that it resets | 808 // Test sending an MTU probe. Surround it with data, to ensure that it resets |
| 1611 // the MTU to the value before the probe was sent. | 809 // the MTU to the value before the probe was sent. |
| 1612 TEST_P(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { | 810 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { |
| 1613 delegate_.SetCanWriteAnything(); | 811 delegate_.SetCanWriteAnything(); |
| 1614 | 812 |
| 1615 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 813 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
| 1616 static_assert(target_mtu < kMaxPacketSize, | 814 static_assert(target_mtu < kMaxPacketSize, |
| 1617 "The MTU probe used by the test exceeds maximum packet size"); | 815 "The MTU probe used by the test exceeds maximum packet size"); |
| 1618 | 816 |
| 1619 // Send enough data so it would always cause two packets to be sent. | 817 // Send enough data so it would always cause two packets to be sent. |
| 1620 const size_t data_len = target_mtu + 1; | 818 const size_t data_len = target_mtu + 1; |
| 1621 | 819 |
| 1622 // Send a total of five packets: two packets before the probe, the probe | 820 // Send a total of five packets: two packets before the probe, the probe |
| 1623 // itself, and two packets after the probe. | 821 // itself, and two packets after the probe. |
| 1624 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 822 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1625 .Times(5) | 823 .Times(5) |
| 1626 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 824 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1627 | 825 |
| 1628 // Send data before the MTU probe. | 826 // Send data before the MTU probe. |
| 1629 QuicConsumedData consumed = | 827 QuicConsumedData consumed = |
| 1630 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 828 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 1631 /*offset=*/2, | 829 /*offset=*/2, |
| 1632 /*fin=*/false, MAY_FEC_PROTECT, nullptr); | 830 /*fin=*/false, nullptr); |
| 1633 EXPECT_EQ(data_len, consumed.bytes_consumed); | 831 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 1634 EXPECT_FALSE(consumed.fin_consumed); | 832 EXPECT_FALSE(consumed.fin_consumed); |
| 1635 EXPECT_FALSE(generator_.HasQueuedFrames()); | 833 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1636 | 834 |
| 1637 // Send the MTU probe. | 835 // Send the MTU probe. |
| 1638 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 836 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
| 1639 EXPECT_FALSE(generator_.HasQueuedFrames()); | 837 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1640 | 838 |
| 1641 // Send data after the MTU probe. | 839 // Send data after the MTU probe. |
| 1642 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 840 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 1643 /*offset=*/2 + data_len, | 841 /*offset=*/2 + data_len, |
| 1644 /*fin=*/true, MAY_FEC_PROTECT, nullptr); | 842 /*fin=*/true, nullptr); |
| 1645 EXPECT_EQ(data_len, consumed.bytes_consumed); | 843 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 1646 EXPECT_TRUE(consumed.fin_consumed); | 844 EXPECT_TRUE(consumed.fin_consumed); |
| 1647 EXPECT_FALSE(generator_.HasQueuedFrames()); | 845 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1648 | 846 |
| 1649 ASSERT_EQ(5u, packets_.size()); | 847 ASSERT_EQ(5u, packets_.size()); |
| 1650 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 848 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 1651 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); | 849 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); |
| 1652 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); | 850 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); |
| 1653 | 851 |
| 1654 PacketContents probe_contents; | 852 PacketContents probe_contents; |
| 1655 probe_contents.num_mtu_discovery_frames = 1; | 853 probe_contents.num_mtu_discovery_frames = 1; |
| 1656 | 854 |
| 1657 CheckPacketHasSingleStreamFrame(0); | 855 CheckPacketHasSingleStreamFrame(0); |
| 1658 CheckPacketHasSingleStreamFrame(1); | 856 CheckPacketHasSingleStreamFrame(1); |
| 1659 CheckPacketContains(probe_contents, 2); | 857 CheckPacketContains(probe_contents, 2); |
| 1660 CheckPacketHasSingleStreamFrame(3); | 858 CheckPacketHasSingleStreamFrame(3); |
| 1661 CheckPacketHasSingleStreamFrame(4); | 859 CheckPacketHasSingleStreamFrame(4); |
| 1662 } | 860 } |
| 1663 | 861 |
| 1664 TEST_P(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { | 862 TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { |
| 1665 // Test added to ensure the generator does not crash when an invalid frame is | 863 // Test added to ensure the generator does not crash when an invalid frame is |
| 1666 // added. Because this is an indication of internal programming errors, | 864 // added. Because this is an indication of internal programming errors, |
| 1667 // DFATALs are expected. | 865 // DFATALs are expected. |
| 1668 // A 1 byte packet number length can't encode a gap of 1000. | 866 // A 1 byte packet number length can't encode a gap of 1000. |
| 1669 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); | 867 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); |
| 1670 | 868 |
| 1671 delegate_.SetCanNotWrite(); | 869 delegate_.SetCanNotWrite(); |
| 1672 generator_.SetShouldSendAck(true); | 870 generator_.SetShouldSendAck(true); |
| 1673 delegate_.SetCanWriteAnything(); | 871 delegate_.SetCanWriteAnything(); |
| 1674 generator_.StartBatchOperations(); | 872 generator_.StartBatchOperations(); |
| 1675 | 873 |
| 1676 // Set up frames to write into the creator when control frames are written. | 874 // Set up frames to write into the creator when control frames are written. |
| 1677 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | 875 EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
| 1678 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | 876 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
| 1679 // Generator should have queued control frames, and creator should be empty. | 877 // Generator should have queued control frames, and creator should be empty. |
| 1680 EXPECT_TRUE(generator_.HasQueuedFrames()); | 878 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1681 EXPECT_FALSE(creator_->HasPendingFrames()); | 879 EXPECT_FALSE(creator_->HasPendingFrames()); |
| 1682 | 880 |
| 1683 // This will not serialize any packets, because of the invalid frame. | 881 // This will not serialize any packets, because of the invalid frame. |
| 1684 EXPECT_CALL(delegate_, | 882 EXPECT_CALL(delegate_, |
| 1685 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, | 883 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, |
| 1686 ConnectionCloseSource::FROM_SELF)); | 884 ConnectionCloseSource::FROM_SELF)); |
| 1687 EXPECT_DFATAL(generator_.FinishBatchOperations(), | 885 EXPECT_DFATAL(generator_.FinishBatchOperations(), |
| 1688 "packet_number_length 1 is too small " | 886 "packet_number_length 1 is too small " |
| 1689 "for least_unacked_delta: 1001"); | 887 "for least_unacked_delta: 1001"); |
| 1690 } | 888 } |
| 1691 | 889 |
| 1692 TEST_P(QuicPacketGeneratorTest, SetCurrentPath) { | 890 TEST_F(QuicPacketGeneratorTest, SetCurrentPath) { |
| 1693 delegate_.SetCanWriteAnything(); | 891 delegate_.SetCanWriteAnything(); |
| 1694 generator_.StartBatchOperations(); | 892 generator_.StartBatchOperations(); |
| 1695 | 893 |
| 1696 QuicConsumedData consumed = generator_.ConsumeData( | 894 QuicConsumedData consumed = generator_.ConsumeData( |
| 1697 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | 895 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); |
| 1698 EXPECT_EQ(3u, consumed.bytes_consumed); | 896 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 1699 EXPECT_TRUE(consumed.fin_consumed); | 897 EXPECT_TRUE(consumed.fin_consumed); |
| 1700 EXPECT_TRUE(generator_.HasQueuedFrames()); | 898 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 1701 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 899 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
| 1702 // Does not change current path. | 900 // Does not change current path. |
| 1703 generator_.SetCurrentPath(kDefaultPathId, 1, 0); | 901 generator_.SetCurrentPath(kDefaultPathId, 1, 0); |
| 1704 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 902 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
| 1705 | 903 |
| 1706 // Try to switch path when a packet is under construction. | 904 // Try to switch path when a packet is under construction. |
| 1707 QuicPathId kTestPathId1 = 1; | 905 QuicPathId kTestPathId1 = 1; |
| 1708 EXPECT_DFATAL(generator_.SetCurrentPath(kTestPathId1, 1, 0), | 906 EXPECT_DFATAL(generator_.SetCurrentPath(kTestPathId1, 1, 0), |
| 1709 "Unable to change paths when a packet is under construction"); | 907 "Unable to change paths when a packet is under construction"); |
| 1710 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 908 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
| 1711 | 909 |
| 1712 // Try to switch path after current open packet gets serialized. | 910 // Try to switch path after current open packet gets serialized. |
| 1713 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 911 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 1714 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 912 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 1715 generator_.FlushAllQueuedFrames(); | 913 generator_.FlushAllQueuedFrames(); |
| 1716 EXPECT_FALSE(generator_.HasQueuedFrames()); | 914 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1717 generator_.SetCurrentPath(kTestPathId1, 1, 0); | 915 generator_.SetCurrentPath(kTestPathId1, 1, 0); |
| 1718 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | 916 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); |
| 1719 } | 917 } |
| 1720 | 918 |
| 1721 } // namespace test | 919 } // namespace test |
| 1722 } // namespace net | 920 } // namespace net |
| OLD | NEW |