| 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 21 matching lines...) Expand all Loading... |
| 32 MockDelegate() {} | 32 MockDelegate() {} |
| 33 virtual ~MockDelegate() {} | 33 virtual ~MockDelegate() {} |
| 34 | 34 |
| 35 MOCK_METHOD2(CanWrite, bool(Retransmission retransmission, | 35 MOCK_METHOD2(CanWrite, bool(Retransmission retransmission, |
| 36 HasRetransmittableData retransmittable)); | 36 HasRetransmittableData retransmittable)); |
| 37 | 37 |
| 38 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 38 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
| 39 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | 39 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); |
| 40 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); | 40 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); |
| 41 | 41 |
| 42 void SetCanWrite(bool can_write) { | 42 void SetCanWriteAnything() { |
| 43 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, _)) | 43 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, _)) |
| 44 .WillRepeatedly(Return(can_write)); | 44 .WillRepeatedly(Return(true)); |
| 45 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA)) |
| 46 .WillRepeatedly(Return(true)); |
| 47 } |
| 48 |
| 49 void SetCanNotWrite() { |
| 50 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, _)) |
| 51 .WillRepeatedly(Return(false)); |
| 52 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA)) |
| 53 .WillRepeatedly(Return(false)); |
| 54 } |
| 55 |
| 56 // Use this when only ack and feedback frames should be allowed to be written. |
| 57 void SetCanWriteOnlyNonRetransmittable() { |
| 58 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, _)) |
| 59 .WillRepeatedly(Return(false)); |
| 60 EXPECT_CALL(*this, CanWrite(NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA)) |
| 61 .WillRepeatedly(Return(true)); |
| 45 } | 62 } |
| 46 | 63 |
| 47 private: | 64 private: |
| 48 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | 65 DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
| 49 }; | 66 }; |
| 50 | 67 |
| 51 // Simple struct for describing the contents of a packet. | 68 // Simple struct for describing the contents of a packet. |
| 52 // Useful in conjunction with a SimpleQuicFrame for validating | 69 // Useful in conjunction with a SimpleQuicFrame for validating |
| 53 // that a packet contains the expected frames. | 70 // that a packet contains the expected frames. |
| 54 struct PacketContents { | 71 struct PacketContents { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 70 size_t num_stream_frames; | 87 size_t num_stream_frames; |
| 71 | 88 |
| 72 QuicFecGroupNumber fec_group; | 89 QuicFecGroupNumber fec_group; |
| 73 }; | 90 }; |
| 74 | 91 |
| 75 } // namespace | 92 } // namespace |
| 76 | 93 |
| 77 class QuicPacketGeneratorTest : public ::testing::Test { | 94 class QuicPacketGeneratorTest : public ::testing::Test { |
| 78 protected: | 95 protected: |
| 79 QuicPacketGeneratorTest() | 96 QuicPacketGeneratorTest() |
| 80 : framer_(kQuicVersion1, QuicTime::Zero(), false), | 97 : framer_(QuicVersionMax(), QuicTime::Zero(), false), |
| 81 creator_(42, &framer_, &random_, false), | 98 creator_(42, &framer_, &random_, false), |
| 82 generator_(&delegate_, NULL, &creator_), | 99 generator_(&delegate_, NULL, &creator_), |
| 83 packet_(0, NULL, 0, NULL), | 100 packet_(0, NULL, 0, NULL), |
| 84 packet2_(0, NULL, 0, NULL), | 101 packet2_(0, NULL, 0, NULL), |
| 85 packet3_(0, NULL, 0, NULL), | 102 packet3_(0, NULL, 0, NULL), |
| 86 packet4_(0, NULL, 0, NULL), | 103 packet4_(0, NULL, 0, NULL), |
| 87 packet5_(0, NULL, 0, NULL) { | 104 packet5_(0, NULL, 0, NULL) { |
| 88 } | 105 } |
| 89 | 106 |
| 90 ~QuicPacketGeneratorTest() { | 107 ~QuicPacketGeneratorTest() { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 SerializedPacket packet2_; | 204 SerializedPacket packet2_; |
| 188 SerializedPacket packet3_; | 205 SerializedPacket packet3_; |
| 189 SerializedPacket packet4_; | 206 SerializedPacket packet4_; |
| 190 SerializedPacket packet5_; | 207 SerializedPacket packet5_; |
| 191 | 208 |
| 192 private: | 209 private: |
| 193 scoped_ptr<char[]> data_array_; | 210 scoped_ptr<char[]> data_array_; |
| 194 }; | 211 }; |
| 195 | 212 |
| 196 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 213 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
| 197 delegate_.SetCanWrite(false); | 214 delegate_.SetCanNotWrite(); |
| 198 | 215 |
| 199 generator_.SetShouldSendAck(false); | 216 generator_.SetShouldSendAck(false); |
| 200 EXPECT_TRUE(generator_.HasQueuedFrames()); | 217 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 201 } | 218 } |
| 202 | 219 |
| 203 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 220 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
| 204 delegate_.SetCanWrite(true); | 221 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 205 generator_.StartBatchOperations(); | 222 generator_.StartBatchOperations(); |
| 206 | 223 |
| 207 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 224 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 208 | 225 |
| 209 generator_.SetShouldSendAck(false); | 226 generator_.SetShouldSendAck(false); |
| 210 EXPECT_TRUE(generator_.HasQueuedFrames()); | 227 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 211 } | 228 } |
| 212 | 229 |
| 213 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 230 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
| 214 delegate_.SetCanWrite(true); | 231 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 215 | 232 |
| 216 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 233 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 217 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 234 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 218 DoAll(SaveArg<0>(&packet_), Return(true))); | 235 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 219 | 236 |
| 220 generator_.SetShouldSendAck(false); | 237 generator_.SetShouldSendAck(false); |
| 221 EXPECT_FALSE(generator_.HasQueuedFrames()); | 238 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 222 | 239 |
| 223 PacketContents contents; | 240 PacketContents contents; |
| 224 contents.num_ack_frames = 1; | 241 contents.num_ack_frames = 1; |
| 225 CheckPacketContains(contents, packet_); | 242 CheckPacketContains(contents, packet_); |
| 226 } | 243 } |
| 227 | 244 |
| 228 TEST_F(QuicPacketGeneratorTest, | 245 TEST_F(QuicPacketGeneratorTest, |
| 229 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) { | 246 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) { |
| 230 delegate_.SetCanWrite(true); | 247 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 231 generator_.StartBatchOperations(); | 248 generator_.StartBatchOperations(); |
| 232 | 249 |
| 233 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 250 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 234 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 251 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 235 Return(CreateFeedbackFrame())); | 252 Return(CreateFeedbackFrame())); |
| 236 | 253 |
| 237 generator_.SetShouldSendAck(true); | 254 generator_.SetShouldSendAck(true); |
| 238 EXPECT_TRUE(generator_.HasQueuedFrames()); | 255 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 239 } | 256 } |
| 240 | 257 |
| 241 TEST_F(QuicPacketGeneratorTest, | 258 TEST_F(QuicPacketGeneratorTest, |
| 242 ShouldSendAckWithFeedback_WritableAndShouldFlush) { | 259 ShouldSendAckWithFeedback_WritableAndShouldFlush) { |
| 243 delegate_.SetCanWrite(true); | 260 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 244 | 261 |
| 245 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 262 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 246 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 263 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 247 Return(CreateFeedbackFrame())); | 264 Return(CreateFeedbackFrame())); |
| 248 | 265 |
| 249 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 266 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 250 DoAll(SaveArg<0>(&packet_), Return(true))); | 267 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 251 | 268 |
| 252 generator_.SetShouldSendAck(true); | 269 generator_.SetShouldSendAck(true); |
| 253 EXPECT_FALSE(generator_.HasQueuedFrames()); | 270 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 254 | 271 |
| 255 PacketContents contents; | 272 PacketContents contents; |
| 256 contents.num_ack_frames = 1; | 273 contents.num_ack_frames = 1; |
| 257 contents.num_feedback_frames = 1; | 274 contents.num_feedback_frames = 1; |
| 258 CheckPacketContains(contents, packet_); | 275 CheckPacketContains(contents, packet_); |
| 259 } | 276 } |
| 260 | 277 |
| 261 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 278 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
| 262 delegate_.SetCanWrite(false); | 279 delegate_.SetCanNotWrite(); |
| 280 |
| 281 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 282 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 283 } |
| 284 |
| 285 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { |
| 286 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 263 | 287 |
| 264 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 288 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 265 EXPECT_TRUE(generator_.HasQueuedFrames()); | 289 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 266 } | 290 } |
| 267 | 291 |
| 268 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | 292 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { |
| 269 delegate_.SetCanWrite(true); | 293 delegate_.SetCanWriteAnything(); |
| 270 generator_.StartBatchOperations(); | 294 generator_.StartBatchOperations(); |
| 271 | 295 |
| 272 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 296 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 273 EXPECT_TRUE(generator_.HasQueuedFrames()); | 297 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 274 } | 298 } |
| 275 | 299 |
| 276 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 300 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
| 277 delegate_.SetCanWrite(true); | 301 delegate_.SetCanWriteAnything(); |
| 278 | 302 |
| 279 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 303 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 280 DoAll(SaveArg<0>(&packet_), Return(true))); | 304 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 281 | 305 |
| 282 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 306 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 283 EXPECT_FALSE(generator_.HasQueuedFrames()); | 307 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 284 | 308 |
| 285 PacketContents contents; | 309 PacketContents contents; |
| 286 contents.num_rst_stream_frames = 1; | 310 contents.num_rst_stream_frames = 1; |
| 287 CheckPacketContains(contents, packet_); | 311 CheckPacketContains(contents, packet_); |
| 288 } | 312 } |
| 289 | 313 |
| 290 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 314 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| 291 delegate_.SetCanWrite(false); | 315 delegate_.SetCanNotWrite(); |
| 292 | 316 |
| 293 QuicConsumedData consumed = generator_.ConsumeData(1, "foo", 2, true); | 317 QuicConsumedData consumed = generator_.ConsumeData(1, "foo", 2, true); |
| 294 EXPECT_EQ(0u, consumed.bytes_consumed); | 318 EXPECT_EQ(0u, consumed.bytes_consumed); |
| 295 EXPECT_FALSE(consumed.fin_consumed); | 319 EXPECT_FALSE(consumed.fin_consumed); |
| 296 EXPECT_FALSE(generator_.HasQueuedFrames()); | 320 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 297 } | 321 } |
| 298 | 322 |
| 299 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 323 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
| 300 delegate_.SetCanWrite(true); | 324 delegate_.SetCanWriteAnything(); |
| 301 generator_.StartBatchOperations(); | 325 generator_.StartBatchOperations(); |
| 302 | 326 |
| 303 QuicConsumedData consumed = generator_.ConsumeData(1, "foo", 2, true); | 327 QuicConsumedData consumed = generator_.ConsumeData(1, "foo", 2, true); |
| 304 EXPECT_EQ(3u, consumed.bytes_consumed); | 328 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 305 EXPECT_TRUE(consumed.fin_consumed); | 329 EXPECT_TRUE(consumed.fin_consumed); |
| 306 EXPECT_TRUE(generator_.HasQueuedFrames()); | 330 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 307 } | 331 } |
| 308 | 332 |
| 309 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 333 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 310 delegate_.SetCanWrite(true); | 334 delegate_.SetCanWriteAnything(); |
| 311 | 335 |
| 312 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 336 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 313 DoAll(SaveArg<0>(&packet_), Return(true))); | 337 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 314 QuicConsumedData consumed = generator_.ConsumeData(1, "foo", 2, true); | 338 QuicConsumedData consumed = generator_.ConsumeData(1, "foo", 2, true); |
| 315 EXPECT_EQ(3u, consumed.bytes_consumed); | 339 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 316 EXPECT_TRUE(consumed.fin_consumed); | 340 EXPECT_TRUE(consumed.fin_consumed); |
| 317 EXPECT_FALSE(generator_.HasQueuedFrames()); | 341 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 318 | 342 |
| 319 PacketContents contents; | 343 PacketContents contents; |
| 320 contents.num_stream_frames = 1; | 344 contents.num_stream_frames = 1; |
| 321 CheckPacketContains(contents, packet_); | 345 CheckPacketContains(contents, packet_); |
| 322 } | 346 } |
| 323 | 347 |
| 324 TEST_F(QuicPacketGeneratorTest, | 348 TEST_F(QuicPacketGeneratorTest, |
| 325 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 349 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
| 326 delegate_.SetCanWrite(true); | 350 delegate_.SetCanWriteAnything(); |
| 327 generator_.StartBatchOperations(); | 351 generator_.StartBatchOperations(); |
| 328 | 352 |
| 329 generator_.ConsumeData(1, "foo", 2, true); | 353 generator_.ConsumeData(1, "foo", 2, true); |
| 330 QuicConsumedData consumed = generator_.ConsumeData(3, "quux", 7, false); | 354 QuicConsumedData consumed = generator_.ConsumeData(3, "quux", 7, false); |
| 331 EXPECT_EQ(4u, consumed.bytes_consumed); | 355 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 332 EXPECT_FALSE(consumed.fin_consumed); | 356 EXPECT_FALSE(consumed.fin_consumed); |
| 333 EXPECT_TRUE(generator_.HasQueuedFrames()); | 357 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 334 } | 358 } |
| 335 | 359 |
| 336 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 360 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
| 337 delegate_.SetCanWrite(true); | 361 delegate_.SetCanWriteAnything(); |
| 338 generator_.StartBatchOperations(); | 362 generator_.StartBatchOperations(); |
| 339 | 363 |
| 340 generator_.ConsumeData(1, "foo", 2, true); | 364 generator_.ConsumeData(1, "foo", 2, true); |
| 341 QuicConsumedData consumed = generator_.ConsumeData(3, "quux", 7, false); | 365 QuicConsumedData consumed = generator_.ConsumeData(3, "quux", 7, false); |
| 342 EXPECT_EQ(4u, consumed.bytes_consumed); | 366 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 343 EXPECT_FALSE(consumed.fin_consumed); | 367 EXPECT_FALSE(consumed.fin_consumed); |
| 344 EXPECT_TRUE(generator_.HasQueuedFrames()); | 368 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 345 | 369 |
| 346 // Now both frames will be flushed out. | 370 // Now both frames will be flushed out. |
| 347 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 371 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 348 DoAll(SaveArg<0>(&packet_), Return(true))); | 372 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 349 generator_.FinishBatchOperations(); | 373 generator_.FinishBatchOperations(); |
| 350 EXPECT_FALSE(generator_.HasQueuedFrames()); | 374 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 351 | 375 |
| 352 PacketContents contents; | 376 PacketContents contents; |
| 353 contents.num_stream_frames = 2; | 377 contents.num_stream_frames = 2; |
| 354 CheckPacketContains(contents, packet_); | 378 CheckPacketContains(contents, packet_); |
| 355 } | 379 } |
| 356 | 380 |
| 357 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 381 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { |
| 358 delegate_.SetCanWrite(true); | 382 delegate_.SetCanWriteAnything(); |
| 359 | 383 |
| 360 // Send FEC every two packets. | 384 // Send FEC every two packets. |
| 361 creator_.options()->max_packets_per_fec_group = 2; | 385 creator_.options()->max_packets_per_fec_group = 2; |
| 362 | 386 |
| 363 { | 387 { |
| 364 InSequence dummy; | 388 InSequence dummy; |
| 365 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 389 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 366 DoAll(SaveArg<0>(&packet_), Return(true))); | 390 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 367 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 391 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 368 DoAll(SaveArg<0>(&packet2_), Return(true))); | 392 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 384 | 408 |
| 385 CheckPacketHasSingleStreamFrame(packet_); | 409 CheckPacketHasSingleStreamFrame(packet_); |
| 386 CheckPacketHasSingleStreamFrame(packet2_); | 410 CheckPacketHasSingleStreamFrame(packet2_); |
| 387 CheckPacketIsFec(packet3_, 1); | 411 CheckPacketIsFec(packet3_, 1); |
| 388 | 412 |
| 389 CheckPacketHasSingleStreamFrame(packet4_); | 413 CheckPacketHasSingleStreamFrame(packet4_); |
| 390 CheckPacketIsFec(packet5_, 4); | 414 CheckPacketIsFec(packet5_, 4); |
| 391 } | 415 } |
| 392 | 416 |
| 393 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 417 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { |
| 394 delegate_.SetCanWrite(true); | 418 delegate_.SetCanWriteAnything(); |
| 395 | 419 |
| 396 // Send FEC every six packets. | 420 // Send FEC every six packets. |
| 397 creator_.options()->max_packets_per_fec_group = 6; | 421 creator_.options()->max_packets_per_fec_group = 6; |
| 398 | 422 |
| 399 { | 423 { |
| 400 InSequence dummy; | 424 InSequence dummy; |
| 401 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 425 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 402 DoAll(SaveArg<0>(&packet_), Return(true))); | 426 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 403 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 427 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 404 DoAll(SaveArg<0>(&packet2_), Return(true))); | 428 DoAll(SaveArg<0>(&packet2_), Return(true))); |
| 405 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 429 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 406 DoAll(SaveArg<0>(&packet3_), Return(true))); | 430 DoAll(SaveArg<0>(&packet3_), Return(true))); |
| 407 } | 431 } |
| 408 | 432 |
| 409 // Send enough data to create 2 packets: one full and one partial. | 433 // Send enough data to create 2 packets: one full and one partial. |
| 410 size_t data_len = 1 * kMaxPacketSize + 100; | 434 size_t data_len = 1 * kMaxPacketSize + 100; |
| 411 QuicConsumedData consumed = | 435 QuicConsumedData consumed = |
| 412 generator_.ConsumeData(3, CreateData(data_len), 0, true); | 436 generator_.ConsumeData(3, CreateData(data_len), 0, true); |
| 413 EXPECT_EQ(data_len, consumed.bytes_consumed); | 437 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 414 EXPECT_TRUE(consumed.fin_consumed); | 438 EXPECT_TRUE(consumed.fin_consumed); |
| 415 EXPECT_FALSE(generator_.HasQueuedFrames()); | 439 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 416 | 440 |
| 417 CheckPacketHasSingleStreamFrame(packet_); | 441 CheckPacketHasSingleStreamFrame(packet_); |
| 418 CheckPacketHasSingleStreamFrame(packet2_); | 442 CheckPacketHasSingleStreamFrame(packet2_); |
| 419 CheckPacketIsFec(packet3_, 1); | 443 CheckPacketIsFec(packet3_, 1); |
| 420 } | 444 } |
| 421 | 445 |
| 422 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 446 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
| 423 delegate_.SetCanWrite(false); | 447 delegate_.SetCanNotWrite(); |
| 424 | 448 |
| 425 generator_.SetShouldSendAck(true); | 449 generator_.SetShouldSendAck(true); |
| 426 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 450 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 427 EXPECT_TRUE(generator_.HasQueuedFrames()); | 451 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 428 | 452 |
| 429 delegate_.SetCanWrite(true); | 453 delegate_.SetCanWriteAnything(); |
| 430 | 454 |
| 431 generator_.StartBatchOperations(); | 455 generator_.StartBatchOperations(); |
| 432 | 456 |
| 433 // When the first write operation is invoked, the ack and feedback | 457 // When the first write operation is invoked, the ack and feedback |
| 434 // frames will be returned. | 458 // frames will be returned. |
| 435 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 459 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 436 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 460 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 437 Return(CreateFeedbackFrame())); | 461 Return(CreateFeedbackFrame())); |
| 438 | 462 |
| 439 // Send some data and a control frame | 463 // Send some data and a control frame |
| 440 generator_.ConsumeData(3, "quux", 7, false); | 464 generator_.ConsumeData(3, "quux", 7, false); |
| 441 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 465 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 442 | 466 |
| 443 // All five frames will be flushed out in a single packet. | 467 // All five frames will be flushed out in a single packet. |
| 444 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 468 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 445 DoAll(SaveArg<0>(&packet_), Return(true))); | 469 DoAll(SaveArg<0>(&packet_), Return(true))); |
| 446 generator_.FinishBatchOperations(); | 470 generator_.FinishBatchOperations(); |
| 447 EXPECT_FALSE(generator_.HasQueuedFrames()); | 471 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 448 | 472 |
| 449 PacketContents contents; | 473 PacketContents contents; |
| 450 contents.num_ack_frames = 1; | 474 contents.num_ack_frames = 1; |
| 451 contents.num_goaway_frames = 1; | 475 contents.num_goaway_frames = 1; |
| 452 contents.num_feedback_frames = 1; | 476 contents.num_feedback_frames = 1; |
| 453 contents.num_rst_stream_frames = 1; | 477 contents.num_rst_stream_frames = 1; |
| 454 contents.num_stream_frames = 1; | 478 contents.num_stream_frames = 1; |
| 455 CheckPacketContains(contents, packet_); | 479 CheckPacketContains(contents, packet_); |
| 456 } | 480 } |
| 457 | 481 |
| 458 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 482 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
| 459 delegate_.SetCanWrite(false); | 483 delegate_.SetCanNotWrite(); |
| 460 | 484 |
| 461 generator_.SetShouldSendAck(true); | 485 generator_.SetShouldSendAck(true); |
| 462 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 486 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 463 EXPECT_TRUE(generator_.HasQueuedFrames()); | 487 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 464 | 488 |
| 465 delegate_.SetCanWrite(true); | 489 delegate_.SetCanWriteAnything(); |
| 466 | 490 |
| 467 generator_.StartBatchOperations(); | 491 generator_.StartBatchOperations(); |
| 468 | 492 |
| 469 // When the first write operation is invoked, the ack and feedback | 493 // When the first write operation is invoked, the ack and feedback |
| 470 // frames will be returned. | 494 // frames will be returned. |
| 471 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 495 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 472 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 496 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 473 Return(CreateFeedbackFrame())); | 497 Return(CreateFeedbackFrame())); |
| 474 | 498 |
| 475 { | 499 { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 502 | 526 |
| 503 // The second should have the remainder of the stream data. | 527 // The second should have the remainder of the stream data. |
| 504 PacketContents contents2; | 528 PacketContents contents2; |
| 505 contents2.num_goaway_frames = 1; | 529 contents2.num_goaway_frames = 1; |
| 506 contents2.num_stream_frames = 1; | 530 contents2.num_stream_frames = 1; |
| 507 CheckPacketContains(contents2, packet2_); | 531 CheckPacketContains(contents2, packet2_); |
| 508 } | 532 } |
| 509 | 533 |
| 510 } // namespace test | 534 } // namespace test |
| 511 } // namespace net | 535 } // namespace net |
| OLD | NEW |