| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
| 10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 IsHandshake handshake)); | 39 IsHandshake handshake)); |
| 40 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 40 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
| 41 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | 41 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); |
| 42 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 42 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); |
| 43 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); | 43 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); |
| 44 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 44 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
| 45 | 45 |
| 46 void SetCanWriteAnything() { | 46 void SetCanWriteAnything() { |
| 47 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 47 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 48 .WillRepeatedly(Return(true)); | 48 .WillRepeatedly(Return(true)); |
| 49 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 49 EXPECT_CALL( |
| 50 NO_RETRANSMITTABLE_DATA, _)) | 50 *this, |
| 51 ShouldGeneratePacket(NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA, _)) |
| 51 .WillRepeatedly(Return(true)); | 52 .WillRepeatedly(Return(true)); |
| 52 } | 53 } |
| 53 | 54 |
| 54 void SetCanNotWrite() { | 55 void SetCanNotWrite() { |
| 55 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 56 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 56 .WillRepeatedly(Return(false)); | 57 .WillRepeatedly(Return(false)); |
| 57 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 58 EXPECT_CALL( |
| 58 NO_RETRANSMITTABLE_DATA, _)) | 59 *this, |
| 60 ShouldGeneratePacket(NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA, _)) |
| 59 .WillRepeatedly(Return(false)); | 61 .WillRepeatedly(Return(false)); |
| 60 } | 62 } |
| 61 | 63 |
| 62 // Use this when only ack and feedback frames should be allowed to be written. | 64 // Use this when only ack and feedback frames should be allowed to be written. |
| 63 void SetCanWriteOnlyNonRetransmittable() { | 65 void SetCanWriteOnlyNonRetransmittable() { |
| 64 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 66 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 65 .WillRepeatedly(Return(false)); | 67 .WillRepeatedly(Return(false)); |
| 66 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 68 EXPECT_CALL( |
| 67 NO_RETRANSMITTABLE_DATA, _)) | 69 *this, |
| 70 ShouldGeneratePacket(NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA, _)) |
| 68 .WillRepeatedly(Return(true)); | 71 .WillRepeatedly(Return(true)); |
| 69 } | 72 } |
| 70 | 73 |
| 71 private: | 74 private: |
| 72 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | 75 DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
| 73 }; | 76 }; |
| 74 | 77 |
| 75 // Simple struct for describing the contents of a packet. | 78 // Simple struct for describing the contents of a packet. |
| 76 // Useful in conjunction with a SimpleQuicFrame for validating | 79 // Useful in conjunction with a SimpleQuicFrame for validating |
| 77 // that a packet contains the expected frames. | 80 // that a packet contains the expected frames. |
| 78 struct PacketContents { | 81 struct PacketContents { |
| 79 PacketContents() | 82 PacketContents() |
| 80 : num_ack_frames(0), | 83 : num_ack_frames(0), |
| 81 num_connection_close_frames(0), | 84 num_connection_close_frames(0), |
| 82 num_feedback_frames(0), | 85 num_feedback_frames(0), |
| 83 num_goaway_frames(0), | 86 num_goaway_frames(0), |
| 84 num_rst_stream_frames(0), | 87 num_rst_stream_frames(0), |
| 85 num_stop_waiting_frames(0), | 88 num_stop_waiting_frames(0), |
| 86 num_stream_frames(0), | 89 num_stream_frames(0), |
| 87 fec_group(0) { | 90 fec_group(0) {} |
| 88 } | |
| 89 | 91 |
| 90 size_t num_ack_frames; | 92 size_t num_ack_frames; |
| 91 size_t num_connection_close_frames; | 93 size_t num_connection_close_frames; |
| 92 size_t num_feedback_frames; | 94 size_t num_feedback_frames; |
| 93 size_t num_goaway_frames; | 95 size_t num_goaway_frames; |
| 94 size_t num_rst_stream_frames; | 96 size_t num_rst_stream_frames; |
| 95 size_t num_stop_waiting_frames; | 97 size_t num_stop_waiting_frames; |
| 96 size_t num_stream_frames; | 98 size_t num_stream_frames; |
| 97 | 99 |
| 98 QuicFecGroupNumber fec_group; | 100 QuicFecGroupNumber fec_group; |
| 99 }; | 101 }; |
| 100 | 102 |
| 101 } // namespace | 103 } // namespace |
| 102 | 104 |
| 103 class QuicPacketGeneratorTest : public ::testing::Test { | 105 class QuicPacketGeneratorTest : public ::testing::Test { |
| 104 protected: | 106 protected: |
| 105 QuicPacketGeneratorTest() | 107 QuicPacketGeneratorTest() |
| 106 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 108 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
| 107 creator_(42, &framer_, &random_, false), | 109 creator_(42, &framer_, &random_, false), |
| 108 generator_(&delegate_, NULL, &creator_), | 110 generator_(&delegate_, NULL, &creator_), |
| 109 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 111 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 110 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 112 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 111 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 113 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 112 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 114 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
| 113 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) { | 115 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) {} |
| 114 } | |
| 115 | 116 |
| 116 ~QuicPacketGeneratorTest() { | 117 ~QuicPacketGeneratorTest() { |
| 117 delete packet_.packet; | 118 delete packet_.packet; |
| 118 delete packet_.retransmittable_frames; | 119 delete packet_.retransmittable_frames; |
| 119 delete packet2_.packet; | 120 delete packet2_.packet; |
| 120 delete packet2_.retransmittable_frames; | 121 delete packet2_.retransmittable_frames; |
| 121 delete packet3_.packet; | 122 delete packet3_.packet; |
| 122 delete packet3_.retransmittable_frames; | 123 delete packet3_.retransmittable_frames; |
| 123 delete packet4_.packet; | 124 delete packet4_.packet; |
| 124 delete packet4_.retransmittable_frames; | 125 delete packet4_.retransmittable_frames; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 148 QuicRstStreamFrame* CreateRstStreamFrame() { | 149 QuicRstStreamFrame* CreateRstStreamFrame() { |
| 149 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); | 150 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); |
| 150 } | 151 } |
| 151 | 152 |
| 152 QuicGoAwayFrame* CreateGoAwayFrame() { | 153 QuicGoAwayFrame* CreateGoAwayFrame() { |
| 153 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); | 154 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); |
| 154 } | 155 } |
| 155 | 156 |
| 156 void CheckPacketContains(const PacketContents& contents, | 157 void CheckPacketContains(const PacketContents& contents, |
| 157 const SerializedPacket& packet) { | 158 const SerializedPacket& packet) { |
| 158 size_t num_retransmittable_frames = contents.num_connection_close_frames + | 159 size_t num_retransmittable_frames = |
| 159 contents.num_goaway_frames + contents.num_rst_stream_frames + | 160 contents.num_connection_close_frames + contents.num_goaway_frames + |
| 160 contents.num_stream_frames; | 161 contents.num_rst_stream_frames + contents.num_stream_frames; |
| 161 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + | 162 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + |
| 162 contents.num_stop_waiting_frames + num_retransmittable_frames; | 163 contents.num_stop_waiting_frames + |
| 164 num_retransmittable_frames; |
| 163 | 165 |
| 164 if (num_retransmittable_frames == 0) { | 166 if (num_retransmittable_frames == 0) { |
| 165 ASSERT_TRUE(packet.retransmittable_frames == NULL); | 167 ASSERT_TRUE(packet.retransmittable_frames == NULL); |
| 166 } else { | 168 } else { |
| 167 ASSERT_TRUE(packet.retransmittable_frames != NULL); | 169 ASSERT_TRUE(packet.retransmittable_frames != NULL); |
| 168 EXPECT_EQ(num_retransmittable_frames, | 170 EXPECT_EQ(num_retransmittable_frames, |
| 169 packet.retransmittable_frames->frames().size()); | 171 packet.retransmittable_frames->frames().size()); |
| 170 } | 172 } |
| 171 | 173 |
| 172 ASSERT_TRUE(packet.packet != NULL); | 174 ASSERT_TRUE(packet.packet != NULL); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 SerializedPacket packet3_; | 227 SerializedPacket packet3_; |
| 226 SerializedPacket packet4_; | 228 SerializedPacket packet4_; |
| 227 SerializedPacket packet5_; | 229 SerializedPacket packet5_; |
| 228 | 230 |
| 229 private: | 231 private: |
| 230 scoped_ptr<char[]> data_array_; | 232 scoped_ptr<char[]> data_array_; |
| 231 }; | 233 }; |
| 232 | 234 |
| 233 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegateInterface { | 235 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegateInterface { |
| 234 public: | 236 public: |
| 235 MOCK_METHOD1(OnFrameAddedToPacket, | 237 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); |
| 236 void(const QuicFrame&)); | |
| 237 }; | 238 }; |
| 238 | 239 |
| 239 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 240 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
| 240 delegate_.SetCanNotWrite(); | 241 delegate_.SetCanNotWrite(); |
| 241 | 242 |
| 242 generator_.SetShouldSendAck(false, false); | 243 generator_.SetShouldSendAck(false, false); |
| 243 EXPECT_TRUE(generator_.HasQueuedFrames()); | 244 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 244 } | 245 } |
| 245 | 246 |
| 246 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 247 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
| 247 StrictMock<MockDebugDelegate> debug_delegate; | 248 StrictMock<MockDebugDelegate> debug_delegate; |
| 248 | 249 |
| 249 generator_.set_debug_delegate(&debug_delegate); | 250 generator_.set_debug_delegate(&debug_delegate); |
| 250 delegate_.SetCanWriteOnlyNonRetransmittable(); | 251 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 251 generator_.StartBatchOperations(); | 252 generator_.StartBatchOperations(); |
| 252 | 253 |
| 253 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 254 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 254 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 255 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
| 255 | 256 |
| 256 generator_.SetShouldSendAck(false, false); | 257 generator_.SetShouldSendAck(false, false); |
| 257 EXPECT_TRUE(generator_.HasQueuedFrames()); | 258 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 258 } | 259 } |
| 259 | 260 |
| 260 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 261 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
| 261 delegate_.SetCanWriteOnlyNonRetransmittable(); | 262 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 262 | 263 |
| 263 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 264 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 264 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 265 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 265 DoAll(SaveArg<0>(&packet_), Return(true))); | 266 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 266 | 267 |
| 267 generator_.SetShouldSendAck(false, false); | 268 generator_.SetShouldSendAck(false, false); |
| 268 EXPECT_FALSE(generator_.HasQueuedFrames()); | 269 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 269 | 270 |
| 270 PacketContents contents; | 271 PacketContents contents; |
| 271 contents.num_ack_frames = 1; | 272 contents.num_ack_frames = 1; |
| 272 CheckPacketContains(contents, packet_); | 273 CheckPacketContains(contents, packet_); |
| 273 } | 274 } |
| 274 | 275 |
| 275 TEST_F(QuicPacketGeneratorTest, | 276 TEST_F(QuicPacketGeneratorTest, |
| 276 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) { | 277 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) { |
| 277 delegate_.SetCanWriteOnlyNonRetransmittable(); | 278 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 278 generator_.StartBatchOperations(); | 279 generator_.StartBatchOperations(); |
| 279 | 280 |
| 280 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 281 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 281 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 282 EXPECT_CALL(delegate_, CreateFeedbackFrame()) |
| 282 Return(CreateFeedbackFrame())); | 283 .WillOnce(Return(CreateFeedbackFrame())); |
| 283 | 284 |
| 284 generator_.SetShouldSendAck(true, false); | 285 generator_.SetShouldSendAck(true, false); |
| 285 EXPECT_TRUE(generator_.HasQueuedFrames()); | 286 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 286 } | 287 } |
| 287 | 288 |
| 288 TEST_F(QuicPacketGeneratorTest, | 289 TEST_F(QuicPacketGeneratorTest, |
| 289 ShouldSendAckWithFeedback_WritableAndShouldFlush) { | 290 ShouldSendAckWithFeedback_WritableAndShouldFlush) { |
| 290 delegate_.SetCanWriteOnlyNonRetransmittable(); | 291 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 291 | 292 |
| 292 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 293 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 293 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 294 EXPECT_CALL(delegate_, CreateFeedbackFrame()) |
| 294 Return(CreateFeedbackFrame())); | 295 .WillOnce(Return(CreateFeedbackFrame())); |
| 295 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 296 EXPECT_CALL(delegate_, CreateStopWaitingFrame()) |
| 296 Return(CreateStopWaitingFrame())); | 297 .WillOnce(Return(CreateStopWaitingFrame())); |
| 297 | 298 |
| 298 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 299 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 299 DoAll(SaveArg<0>(&packet_), Return(true))); | 300 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 300 | 301 |
| 301 generator_.SetShouldSendAck(true, true); | 302 generator_.SetShouldSendAck(true, true); |
| 302 EXPECT_FALSE(generator_.HasQueuedFrames()); | 303 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 303 | 304 |
| 304 PacketContents contents; | 305 PacketContents contents; |
| 305 contents.num_ack_frames = 1; | 306 contents.num_ack_frames = 1; |
| 306 contents.num_feedback_frames = 1; | 307 contents.num_feedback_frames = 1; |
| 307 contents.num_stop_waiting_frames = 1; | 308 contents.num_stop_waiting_frames = 1; |
| 308 CheckPacketContains(contents, packet_); | 309 CheckPacketContains(contents, packet_); |
| 309 } | 310 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 332 | 333 |
| 333 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 334 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
| 334 delegate_.SetCanNotWrite(); | 335 delegate_.SetCanNotWrite(); |
| 335 generator_.StartBatchOperations(); | 336 generator_.StartBatchOperations(); |
| 336 | 337 |
| 337 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 338 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 338 EXPECT_TRUE(generator_.HasQueuedFrames()); | 339 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 339 generator_.FinishBatchOperations(); | 340 generator_.FinishBatchOperations(); |
| 340 EXPECT_TRUE(generator_.HasQueuedFrames()); | 341 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 341 | 342 |
| 342 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 343 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 343 DoAll(SaveArg<0>(&packet_), Return(true))); | 344 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 344 generator_.FlushAllQueuedFrames(); | 345 generator_.FlushAllQueuedFrames(); |
| 345 EXPECT_FALSE(generator_.HasQueuedFrames()); | 346 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 346 | 347 |
| 347 PacketContents contents; | 348 PacketContents contents; |
| 348 contents.num_rst_stream_frames = 1; | 349 contents.num_rst_stream_frames = 1; |
| 349 CheckPacketContains(contents, packet_); | 350 CheckPacketContains(contents, packet_); |
| 350 } | 351 } |
| 351 | 352 |
| 352 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 353 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
| 353 delegate_.SetCanWriteAnything(); | 354 delegate_.SetCanWriteAnything(); |
| 354 | 355 |
| 355 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 356 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 356 DoAll(SaveArg<0>(&packet_), Return(true))); | 357 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 357 | 358 |
| 358 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 359 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 359 EXPECT_FALSE(generator_.HasQueuedFrames()); | 360 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 360 | 361 |
| 361 PacketContents contents; | 362 PacketContents contents; |
| 362 contents.num_rst_stream_frames = 1; | 363 contents.num_rst_stream_frames = 1; |
| 363 CheckPacketContains(contents, packet_); | 364 CheckPacketContains(contents, packet_); |
| 364 } | 365 } |
| 365 | 366 |
| 366 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 367 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| 367 delegate_.SetCanNotWrite(); | 368 delegate_.SetCanNotWrite(); |
| 368 | 369 |
| 369 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2, | 370 QuicConsumedData consumed = |
| 370 true, NULL); | 371 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); |
| 371 EXPECT_EQ(0u, consumed.bytes_consumed); | 372 EXPECT_EQ(0u, consumed.bytes_consumed); |
| 372 EXPECT_FALSE(consumed.fin_consumed); | 373 EXPECT_FALSE(consumed.fin_consumed); |
| 373 EXPECT_FALSE(generator_.HasQueuedFrames()); | 374 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 374 } | 375 } |
| 375 | 376 |
| 376 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 377 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
| 377 delegate_.SetCanWriteAnything(); | 378 delegate_.SetCanWriteAnything(); |
| 378 generator_.StartBatchOperations(); | 379 generator_.StartBatchOperations(); |
| 379 | 380 |
| 380 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2, | 381 QuicConsumedData consumed = |
| 381 true, NULL); | 382 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); |
| 382 EXPECT_EQ(3u, consumed.bytes_consumed); | 383 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 383 EXPECT_TRUE(consumed.fin_consumed); | 384 EXPECT_TRUE(consumed.fin_consumed); |
| 384 EXPECT_TRUE(generator_.HasQueuedFrames()); | 385 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 385 } | 386 } |
| 386 | 387 |
| 387 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 388 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 388 delegate_.SetCanWriteAnything(); | 389 delegate_.SetCanWriteAnything(); |
| 389 | 390 |
| 390 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 391 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 391 DoAll(SaveArg<0>(&packet_), Return(true))); | 392 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 392 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2, | 393 QuicConsumedData consumed = |
| 393 true, NULL); | 394 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); |
| 394 EXPECT_EQ(3u, consumed.bytes_consumed); | 395 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 395 EXPECT_TRUE(consumed.fin_consumed); | 396 EXPECT_TRUE(consumed.fin_consumed); |
| 396 EXPECT_FALSE(generator_.HasQueuedFrames()); | 397 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 397 | 398 |
| 398 PacketContents contents; | 399 PacketContents contents; |
| 399 contents.num_stream_frames = 1; | 400 contents.num_stream_frames = 1; |
| 400 CheckPacketContains(contents, packet_); | 401 CheckPacketContains(contents, packet_); |
| 401 } | 402 } |
| 402 | 403 |
| 403 TEST_F(QuicPacketGeneratorTest, | 404 TEST_F(QuicPacketGeneratorTest, |
| 404 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 405 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
| 405 delegate_.SetCanWriteAnything(); | 406 delegate_.SetCanWriteAnything(); |
| 406 generator_.StartBatchOperations(); | 407 generator_.StartBatchOperations(); |
| 407 | 408 |
| 408 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); | 409 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); |
| 409 QuicConsumedData consumed = generator_.ConsumeData(3, MakeIOVector("quux"), 7, | 410 QuicConsumedData consumed = |
| 410 false, NULL); | 411 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL); |
| 411 EXPECT_EQ(4u, consumed.bytes_consumed); | 412 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 412 EXPECT_FALSE(consumed.fin_consumed); | 413 EXPECT_FALSE(consumed.fin_consumed); |
| 413 EXPECT_TRUE(generator_.HasQueuedFrames()); | 414 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 414 } | 415 } |
| 415 | 416 |
| 416 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 417 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
| 417 delegate_.SetCanWriteAnything(); | 418 delegate_.SetCanWriteAnything(); |
| 418 generator_.StartBatchOperations(); | 419 generator_.StartBatchOperations(); |
| 419 | 420 |
| 420 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); | 421 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); |
| 421 QuicConsumedData consumed = generator_.ConsumeData(3, MakeIOVector("quux"), 7, | 422 QuicConsumedData consumed = |
| 422 false, NULL); | 423 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL); |
| 423 EXPECT_EQ(4u, consumed.bytes_consumed); | 424 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 424 EXPECT_FALSE(consumed.fin_consumed); | 425 EXPECT_FALSE(consumed.fin_consumed); |
| 425 EXPECT_TRUE(generator_.HasQueuedFrames()); | 426 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 426 | 427 |
| 427 // Now both frames will be flushed out. | 428 // Now both frames will be flushed out. |
| 428 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 429 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 429 DoAll(SaveArg<0>(&packet_), Return(true))); | 430 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 430 generator_.FinishBatchOperations(); | 431 generator_.FinishBatchOperations(); |
| 431 EXPECT_FALSE(generator_.HasQueuedFrames()); | 432 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 432 | 433 |
| 433 PacketContents contents; | 434 PacketContents contents; |
| 434 contents.num_stream_frames = 2; | 435 contents.num_stream_frames = 2; |
| 435 CheckPacketContains(contents, packet_); | 436 CheckPacketContains(contents, packet_); |
| 436 } | 437 } |
| 437 | 438 |
| 438 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 439 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { |
| 439 delegate_.SetCanWriteAnything(); | 440 delegate_.SetCanWriteAnything(); |
| 440 | 441 |
| 441 // Send FEC every two packets. | 442 // Send FEC every two packets. |
| 442 creator_.options()->max_packets_per_fec_group = 2; | 443 creator_.options()->max_packets_per_fec_group = 2; |
| 443 | 444 |
| 444 { | 445 { |
| 445 InSequence dummy; | 446 InSequence dummy; |
| 446 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 447 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 447 DoAll(SaveArg<0>(&packet_), Return(true))); | 448 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 448 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 449 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 449 DoAll(SaveArg<0>(&packet2_), Return(true))); | 450 .WillOnce(DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 450 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 451 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 451 DoAll(SaveArg<0>(&packet3_), Return(true))); | 452 .WillOnce(DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 452 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 453 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 453 DoAll(SaveArg<0>(&packet4_), Return(true))); | 454 .WillOnce(DoAll(SaveArg<0>(&packet4_), Return(true))); |
| 454 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 455 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 455 DoAll(SaveArg<0>(&packet5_), Return(true))); | 456 .WillOnce(DoAll(SaveArg<0>(&packet5_), Return(true))); |
| 456 } | 457 } |
| 457 | 458 |
| 458 // Send enough data to create 3 packets: two full and one partial. | 459 // Send enough data to create 3 packets: two full and one partial. |
| 459 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 460 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 460 QuicConsumedData consumed = | 461 QuicConsumedData consumed = |
| 461 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); | 462 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); |
| 462 EXPECT_EQ(data_len, consumed.bytes_consumed); | 463 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 463 EXPECT_TRUE(consumed.fin_consumed); | 464 EXPECT_TRUE(consumed.fin_consumed); |
| 464 EXPECT_FALSE(generator_.HasQueuedFrames()); | 465 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 465 | 466 |
| 466 CheckPacketHasSingleStreamFrame(packet_); | 467 CheckPacketHasSingleStreamFrame(packet_); |
| 467 CheckPacketHasSingleStreamFrame(packet2_); | 468 CheckPacketHasSingleStreamFrame(packet2_); |
| 468 CheckPacketIsFec(packet3_, 1); | 469 CheckPacketIsFec(packet3_, 1); |
| 469 | 470 |
| 470 CheckPacketHasSingleStreamFrame(packet4_); | 471 CheckPacketHasSingleStreamFrame(packet4_); |
| 471 CheckPacketIsFec(packet5_, 4); | 472 CheckPacketIsFec(packet5_, 4); |
| 472 } | 473 } |
| 473 | 474 |
| 474 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 475 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { |
| 475 delegate_.SetCanWriteAnything(); | 476 delegate_.SetCanWriteAnything(); |
| 476 | 477 |
| 477 // Send FEC every six packets. | 478 // Send FEC every six packets. |
| 478 creator_.options()->max_packets_per_fec_group = 6; | 479 creator_.options()->max_packets_per_fec_group = 6; |
| 479 | 480 |
| 480 { | 481 { |
| 481 InSequence dummy; | 482 InSequence dummy; |
| 482 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 483 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 483 DoAll(SaveArg<0>(&packet_), Return(true))); | 484 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 484 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 485 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 485 DoAll(SaveArg<0>(&packet2_), Return(true))); | 486 .WillOnce(DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 487 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 487 DoAll(SaveArg<0>(&packet3_), Return(true))); | 488 .WillOnce(DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 488 } | 489 } |
| 489 | 490 |
| 490 // Send enough data to create 2 packets: one full and one partial. | 491 // Send enough data to create 2 packets: one full and one partial. |
| 491 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 492 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
| 492 QuicConsumedData consumed = | 493 QuicConsumedData consumed = |
| 493 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); | 494 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); |
| 494 EXPECT_EQ(data_len, consumed.bytes_consumed); | 495 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 495 EXPECT_TRUE(consumed.fin_consumed); | 496 EXPECT_TRUE(consumed.fin_consumed); |
| 496 EXPECT_FALSE(generator_.HasQueuedFrames()); | 497 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 497 | 498 |
| 498 CheckPacketHasSingleStreamFrame(packet_); | 499 CheckPacketHasSingleStreamFrame(packet_); |
| 499 CheckPacketHasSingleStreamFrame(packet2_); | 500 CheckPacketHasSingleStreamFrame(packet2_); |
| 500 CheckPacketIsFec(packet3_, 1); | 501 CheckPacketIsFec(packet3_, 1); |
| 501 } | 502 } |
| 502 | 503 |
| 503 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 504 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
| 504 // Set the packet size be enough for two stream frames with 0 stream offset, | 505 // Set the packet size be enough for two stream frames with 0 stream offset, |
| 505 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 506 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
| 506 creator_.options()->max_packet_length = | 507 creator_.options()->max_packet_length = |
| 507 NullEncrypter().GetCiphertextSize(0) + | 508 NullEncrypter().GetCiphertextSize(0) + |
| 508 GetPacketHeaderSize(creator_.options()->send_connection_id_length, | 509 GetPacketHeaderSize(creator_.options()->send_connection_id_length, |
| 509 true, | 510 true, |
| 510 creator_.options()->send_sequence_number_length, | 511 creator_.options()->send_sequence_number_length, |
| 511 NOT_IN_FEC_GROUP) + | 512 NOT_IN_FEC_GROUP) + |
| 512 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 513 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
| 513 // than the GetMinStreamFrameSize. | 514 // than the GetMinStreamFrameSize. |
| 514 QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, false, | 515 QuicFramer::GetMinStreamFrameSize( |
| 515 NOT_IN_FEC_GROUP) + 3 + | 516 framer_.version(), 1, 0, false, NOT_IN_FEC_GROUP) + |
| 516 QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, true, | 517 3 + QuicFramer::GetMinStreamFrameSize( |
| 517 NOT_IN_FEC_GROUP) + 1; | 518 framer_.version(), 1, 0, true, NOT_IN_FEC_GROUP) + |
| 519 1; |
| 518 delegate_.SetCanWriteAnything(); | 520 delegate_.SetCanWriteAnything(); |
| 519 { | 521 { |
| 520 InSequence dummy; | 522 InSequence dummy; |
| 521 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 523 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 522 DoAll(SaveArg<0>(&packet_), Return(true))); | 524 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 523 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 525 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 524 DoAll(SaveArg<0>(&packet2_), Return(true))); | 526 .WillOnce(DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 525 } | 527 } |
| 526 generator_.StartBatchOperations(); | 528 generator_.StartBatchOperations(); |
| 527 // Queue enough data to prevent a stream frame with a non-zero offset from | 529 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 528 // fitting. | 530 // fitting. |
| 529 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 0, | 531 QuicConsumedData consumed = |
| 530 false, NULL); | 532 generator_.ConsumeData(1, MakeIOVector("foo"), 0, false, NULL); |
| 531 EXPECT_EQ(3u, consumed.bytes_consumed); | 533 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 532 EXPECT_FALSE(consumed.fin_consumed); | 534 EXPECT_FALSE(consumed.fin_consumed); |
| 533 EXPECT_TRUE(generator_.HasQueuedFrames()); | 535 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 534 | 536 |
| 535 // This frame will not fit with the existing frame, causing the queued frame | 537 // This frame will not fit with the existing frame, causing the queued frame |
| 536 // to be serialized, and it will not fit with another frame like it, so it is | 538 // to be serialized, and it will not fit with another frame like it, so it is |
| 537 // serialized by itself. | 539 // serialized by itself. |
| 538 consumed = generator_.ConsumeData(1, MakeIOVector("bar"), 3, true, NULL); | 540 consumed = generator_.ConsumeData(1, MakeIOVector("bar"), 3, true, NULL); |
| 539 EXPECT_EQ(3u, consumed.bytes_consumed); | 541 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 540 EXPECT_TRUE(consumed.fin_consumed); | 542 EXPECT_TRUE(consumed.fin_consumed); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 553 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 555 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 554 EXPECT_TRUE(generator_.HasQueuedFrames()); | 556 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 555 | 557 |
| 556 delegate_.SetCanWriteAnything(); | 558 delegate_.SetCanWriteAnything(); |
| 557 | 559 |
| 558 generator_.StartBatchOperations(); | 560 generator_.StartBatchOperations(); |
| 559 | 561 |
| 560 // When the first write operation is invoked, the ack and feedback | 562 // When the first write operation is invoked, the ack and feedback |
| 561 // frames will be returned. | 563 // frames will be returned. |
| 562 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 564 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 563 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 565 EXPECT_CALL(delegate_, CreateFeedbackFrame()) |
| 564 Return(CreateFeedbackFrame())); | 566 .WillOnce(Return(CreateFeedbackFrame())); |
| 565 | 567 |
| 566 // Send some data and a control frame | 568 // Send some data and a control frame |
| 567 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL); | 569 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL); |
| 568 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 570 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 569 | 571 |
| 570 // All five frames will be flushed out in a single packet. | 572 // All five frames will be flushed out in a single packet. |
| 571 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 573 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 572 DoAll(SaveArg<0>(&packet_), Return(true))); | 574 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 573 generator_.FinishBatchOperations(); | 575 generator_.FinishBatchOperations(); |
| 574 EXPECT_FALSE(generator_.HasQueuedFrames()); | 576 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 575 | 577 |
| 576 PacketContents contents; | 578 PacketContents contents; |
| 577 contents.num_ack_frames = 1; | 579 contents.num_ack_frames = 1; |
| 578 contents.num_goaway_frames = 1; | 580 contents.num_goaway_frames = 1; |
| 579 contents.num_feedback_frames = 1; | 581 contents.num_feedback_frames = 1; |
| 580 contents.num_rst_stream_frames = 1; | 582 contents.num_rst_stream_frames = 1; |
| 581 contents.num_stream_frames = 1; | 583 contents.num_stream_frames = 1; |
| 582 CheckPacketContains(contents, packet_); | 584 CheckPacketContains(contents, packet_); |
| 583 } | 585 } |
| 584 | 586 |
| 585 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 587 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
| 586 delegate_.SetCanNotWrite(); | 588 delegate_.SetCanNotWrite(); |
| 587 | 589 |
| 588 generator_.SetShouldSendAck(true, false); | 590 generator_.SetShouldSendAck(true, false); |
| 589 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 591 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 590 EXPECT_TRUE(generator_.HasQueuedFrames()); | 592 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 591 | 593 |
| 592 delegate_.SetCanWriteAnything(); | 594 delegate_.SetCanWriteAnything(); |
| 593 | 595 |
| 594 generator_.StartBatchOperations(); | 596 generator_.StartBatchOperations(); |
| 595 | 597 |
| 596 // When the first write operation is invoked, the ack and feedback | 598 // When the first write operation is invoked, the ack and feedback |
| 597 // frames will be returned. | 599 // frames will be returned. |
| 598 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 600 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 599 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 601 EXPECT_CALL(delegate_, CreateFeedbackFrame()) |
| 600 Return(CreateFeedbackFrame())); | 602 .WillOnce(Return(CreateFeedbackFrame())); |
| 601 | 603 |
| 602 { | 604 { |
| 603 InSequence dummy; | 605 InSequence dummy; |
| 604 // All five frames will be flushed out in a single packet | 606 // All five frames will be flushed out in a single packet |
| 605 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 607 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 606 DoAll(SaveArg<0>(&packet_), Return(true))); | 608 .WillOnce(DoAll(SaveArg<0>(&packet_), Return(true))); |
| 607 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 609 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 608 DoAll(SaveArg<0>(&packet2_), Return(true))); | 610 .WillOnce(DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 609 } | 611 } |
| 610 | 612 |
| 611 // Send enough data to exceed one packet | 613 // Send enough data to exceed one packet |
| 612 size_t data_len = kDefaultMaxPacketSize + 100; | 614 size_t data_len = kDefaultMaxPacketSize + 100; |
| 613 QuicConsumedData consumed = | 615 QuicConsumedData consumed = |
| 614 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); | 616 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); |
| 615 EXPECT_EQ(data_len, consumed.bytes_consumed); | 617 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 616 EXPECT_TRUE(consumed.fin_consumed); | 618 EXPECT_TRUE(consumed.fin_consumed); |
| 617 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 619 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 618 | 620 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 629 | 631 |
| 630 // The second should have the remainder of the stream data. | 632 // The second should have the remainder of the stream data. |
| 631 PacketContents contents2; | 633 PacketContents contents2; |
| 632 contents2.num_goaway_frames = 1; | 634 contents2.num_goaway_frames = 1; |
| 633 contents2.num_stream_frames = 1; | 635 contents2.num_stream_frames = 1; |
| 634 CheckPacketContains(contents2, packet2_); | 636 CheckPacketContains(contents2, packet2_); |
| 635 } | 637 } |
| 636 | 638 |
| 637 } // namespace test | 639 } // namespace test |
| 638 } // namespace net | 640 } // namespace net |
| OLD | NEW |