| 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/tools/quic/quic_dispatcher.h" | 5 #include "net/tools/quic/quic_dispatcher.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/strings/string_piece.h" | 9 #include "base/strings/string_piece.h" |
| 10 #include "net/quic/crypto/crypto_handshake.h" | 10 #include "net/quic/crypto/crypto_handshake.h" |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); | 290 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); |
| 291 } else { | 291 } else { |
| 292 return QuicPacketWriterWrapper::WritePacket( | 292 return QuicPacketWriterWrapper::WritePacket( |
| 293 buffer, buf_len, self_address, peer_address, blocked_writer); | 293 buffer, buf_len, self_address, peer_address, blocked_writer); |
| 294 } | 294 } |
| 295 } | 295 } |
| 296 | 296 |
| 297 bool write_blocked_; | 297 bool write_blocked_; |
| 298 }; | 298 }; |
| 299 | 299 |
| 300 class QuicWriteBlockedListTest : public QuicDispatcherTest { | 300 class QuicDispatcherWriteBlockedListTest : public QuicDispatcherTest { |
| 301 public: | 301 public: |
| 302 virtual void SetUp() { | 302 virtual void SetUp() { |
| 303 writer_ = new BlockingWriter; | 303 writer_ = new BlockingWriter; |
| 304 QuicDispatcherPeer::UseWriter(&dispatcher_, writer_); | 304 QuicDispatcherPeer::UseWriter(&dispatcher_, writer_); |
| 305 | 305 |
| 306 IPEndPoint addr(net::test::Loopback4(), 1); | 306 IPEndPoint addr(net::test::Loopback4(), 1); |
| 307 | 307 |
| 308 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, addr)) | 308 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, addr)) |
| 309 .WillOnce(testing::Return(CreateSession( | 309 .WillOnce(testing::Return(CreateSession( |
| 310 &dispatcher_, 1, addr, &session1_))); | 310 &dispatcher_, 1, addr, &session1_))); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 327 bool SetBlocked() { | 327 bool SetBlocked() { |
| 328 writer_->write_blocked_ = true; | 328 writer_->write_blocked_ = true; |
| 329 return true; | 329 return true; |
| 330 } | 330 } |
| 331 | 331 |
| 332 protected: | 332 protected: |
| 333 BlockingWriter* writer_; | 333 BlockingWriter* writer_; |
| 334 QuicDispatcher::WriteBlockedList* blocked_list_; | 334 QuicDispatcher::WriteBlockedList* blocked_list_; |
| 335 }; | 335 }; |
| 336 | 336 |
| 337 TEST_F(QuicWriteBlockedListTest, BasicOnCanWrite) { | 337 TEST_F(QuicDispatcherWriteBlockedListTest, BasicOnCanWrite) { |
| 338 // No OnCanWrite calls because no connections are blocked. | 338 // No OnCanWrite calls because no connections are blocked. |
| 339 dispatcher_.OnCanWrite(); | 339 dispatcher_.OnCanWrite(); |
| 340 | 340 |
| 341 // Register connection 1 for events, and make sure it's notified. | 341 // Register connection 1 for events, and make sure it's notified. |
| 342 SetBlocked(); | 342 SetBlocked(); |
| 343 dispatcher_.OnWriteBlocked(connection1()); | 343 dispatcher_.OnWriteBlocked(connection1()); |
| 344 EXPECT_CALL(*connection1(), OnCanWrite()); | 344 EXPECT_CALL(*connection1(), OnCanWrite()); |
| 345 dispatcher_.OnCanWrite(); | 345 dispatcher_.OnCanWrite(); |
| 346 | 346 |
| 347 // It should get only one notification. | 347 // It should get only one notification. |
| 348 EXPECT_CALL(*connection1(), OnCanWrite()).Times(0); | 348 EXPECT_CALL(*connection1(), OnCanWrite()).Times(0); |
| 349 EXPECT_FALSE(dispatcher_.OnCanWrite()); | 349 EXPECT_FALSE(dispatcher_.OnCanWrite()); |
| 350 } | 350 } |
| 351 | 351 |
| 352 TEST_F(QuicWriteBlockedListTest, OnCanWriteOrder) { | 352 TEST_F(QuicDispatcherWriteBlockedListTest, OnCanWriteOrder) { |
| 353 // Make sure we handle events in order. | 353 // Make sure we handle events in order. |
| 354 InSequence s; | 354 InSequence s; |
| 355 SetBlocked(); | 355 SetBlocked(); |
| 356 dispatcher_.OnWriteBlocked(connection1()); | 356 dispatcher_.OnWriteBlocked(connection1()); |
| 357 dispatcher_.OnWriteBlocked(connection2()); | 357 dispatcher_.OnWriteBlocked(connection2()); |
| 358 EXPECT_CALL(*connection1(), OnCanWrite()); | 358 EXPECT_CALL(*connection1(), OnCanWrite()); |
| 359 EXPECT_CALL(*connection2(), OnCanWrite()); | 359 EXPECT_CALL(*connection2(), OnCanWrite()); |
| 360 dispatcher_.OnCanWrite(); | 360 dispatcher_.OnCanWrite(); |
| 361 | 361 |
| 362 // Check the other ordering. | 362 // Check the other ordering. |
| 363 SetBlocked(); | 363 SetBlocked(); |
| 364 dispatcher_.OnWriteBlocked(connection2()); | 364 dispatcher_.OnWriteBlocked(connection2()); |
| 365 dispatcher_.OnWriteBlocked(connection1()); | 365 dispatcher_.OnWriteBlocked(connection1()); |
| 366 EXPECT_CALL(*connection2(), OnCanWrite()); | 366 EXPECT_CALL(*connection2(), OnCanWrite()); |
| 367 EXPECT_CALL(*connection1(), OnCanWrite()); | 367 EXPECT_CALL(*connection1(), OnCanWrite()); |
| 368 dispatcher_.OnCanWrite(); | 368 dispatcher_.OnCanWrite(); |
| 369 } | 369 } |
| 370 | 370 |
| 371 TEST_F(QuicWriteBlockedListTest, OnCanWriteRemove) { | 371 TEST_F(QuicDispatcherWriteBlockedListTest, OnCanWriteRemove) { |
| 372 // Add and remove one connction. | 372 // Add and remove one connction. |
| 373 SetBlocked(); | 373 SetBlocked(); |
| 374 dispatcher_.OnWriteBlocked(connection1()); | 374 dispatcher_.OnWriteBlocked(connection1()); |
| 375 blocked_list_->erase(connection1()); | 375 blocked_list_->erase(connection1()); |
| 376 EXPECT_CALL(*connection1(), OnCanWrite()).Times(0); | 376 EXPECT_CALL(*connection1(), OnCanWrite()).Times(0); |
| 377 dispatcher_.OnCanWrite(); | 377 dispatcher_.OnCanWrite(); |
| 378 | 378 |
| 379 // Add and remove one connction and make sure it doesn't affect others. | 379 // Add and remove one connction and make sure it doesn't affect others. |
| 380 SetBlocked(); | 380 SetBlocked(); |
| 381 dispatcher_.OnWriteBlocked(connection1()); | 381 dispatcher_.OnWriteBlocked(connection1()); |
| 382 dispatcher_.OnWriteBlocked(connection2()); | 382 dispatcher_.OnWriteBlocked(connection2()); |
| 383 blocked_list_->erase(connection1()); | 383 blocked_list_->erase(connection1()); |
| 384 EXPECT_CALL(*connection2(), OnCanWrite()); | 384 EXPECT_CALL(*connection2(), OnCanWrite()); |
| 385 dispatcher_.OnCanWrite(); | 385 dispatcher_.OnCanWrite(); |
| 386 | 386 |
| 387 // Add it, remove it, and add it back and make sure things are OK. | 387 // Add it, remove it, and add it back and make sure things are OK. |
| 388 SetBlocked(); | 388 SetBlocked(); |
| 389 dispatcher_.OnWriteBlocked(connection1()); | 389 dispatcher_.OnWriteBlocked(connection1()); |
| 390 blocked_list_->erase(connection1()); | 390 blocked_list_->erase(connection1()); |
| 391 dispatcher_.OnWriteBlocked(connection1()); | 391 dispatcher_.OnWriteBlocked(connection1()); |
| 392 EXPECT_CALL(*connection1(), OnCanWrite()).Times(1); | 392 EXPECT_CALL(*connection1(), OnCanWrite()).Times(1); |
| 393 dispatcher_.OnCanWrite(); | 393 dispatcher_.OnCanWrite(); |
| 394 } | 394 } |
| 395 | 395 |
| 396 TEST_F(QuicWriteBlockedListTest, DoubleAdd) { | 396 TEST_F(QuicDispatcherWriteBlockedListTest, DoubleAdd) { |
| 397 // Make sure a double add does not necessitate a double remove. | 397 // Make sure a double add does not necessitate a double remove. |
| 398 SetBlocked(); | 398 SetBlocked(); |
| 399 dispatcher_.OnWriteBlocked(connection1()); | 399 dispatcher_.OnWriteBlocked(connection1()); |
| 400 dispatcher_.OnWriteBlocked(connection1()); | 400 dispatcher_.OnWriteBlocked(connection1()); |
| 401 blocked_list_->erase(connection1()); | 401 blocked_list_->erase(connection1()); |
| 402 EXPECT_CALL(*connection1(), OnCanWrite()).Times(0); | 402 EXPECT_CALL(*connection1(), OnCanWrite()).Times(0); |
| 403 dispatcher_.OnCanWrite(); | 403 dispatcher_.OnCanWrite(); |
| 404 | 404 |
| 405 // Make sure a double add does not result in two OnCanWrite calls. | 405 // Make sure a double add does not result in two OnCanWrite calls. |
| 406 SetBlocked(); | 406 SetBlocked(); |
| 407 dispatcher_.OnWriteBlocked(connection1()); | 407 dispatcher_.OnWriteBlocked(connection1()); |
| 408 dispatcher_.OnWriteBlocked(connection1()); | 408 dispatcher_.OnWriteBlocked(connection1()); |
| 409 EXPECT_CALL(*connection1(), OnCanWrite()).Times(1); | 409 EXPECT_CALL(*connection1(), OnCanWrite()).Times(1); |
| 410 dispatcher_.OnCanWrite(); | 410 dispatcher_.OnCanWrite(); |
| 411 } | 411 } |
| 412 | 412 |
| 413 TEST_F(QuicWriteBlockedListTest, OnCanWriteHandleBlock) { | 413 TEST_F(QuicDispatcherWriteBlockedListTest, OnCanWriteHandleBlock) { |
| 414 // Finally make sure if we write block on a write call, we stop calling. | 414 // Finally make sure if we write block on a write call, we stop calling. |
| 415 InSequence s; | 415 InSequence s; |
| 416 SetBlocked(); | 416 SetBlocked(); |
| 417 dispatcher_.OnWriteBlocked(connection1()); | 417 dispatcher_.OnWriteBlocked(connection1()); |
| 418 dispatcher_.OnWriteBlocked(connection2()); | 418 dispatcher_.OnWriteBlocked(connection2()); |
| 419 EXPECT_CALL(*connection1(), OnCanWrite()).WillOnce( | 419 EXPECT_CALL(*connection1(), OnCanWrite()).WillOnce( |
| 420 Invoke(this, &QuicWriteBlockedListTest::SetBlocked)); | 420 Invoke(this, &QuicDispatcherWriteBlockedListTest::SetBlocked)); |
| 421 EXPECT_CALL(*connection2(), OnCanWrite()).Times(0); | 421 EXPECT_CALL(*connection2(), OnCanWrite()).Times(0); |
| 422 dispatcher_.OnCanWrite(); | 422 dispatcher_.OnCanWrite(); |
| 423 | 423 |
| 424 // And we'll resume where we left off when we get another call. | 424 // And we'll resume where we left off when we get another call. |
| 425 EXPECT_CALL(*connection2(), OnCanWrite()); | 425 EXPECT_CALL(*connection2(), OnCanWrite()); |
| 426 dispatcher_.OnCanWrite(); | 426 dispatcher_.OnCanWrite(); |
| 427 } | 427 } |
| 428 | 428 |
| 429 TEST_F(QuicWriteBlockedListTest, LimitedWrites) { | 429 TEST_F(QuicDispatcherWriteBlockedListTest, LimitedWrites) { |
| 430 // Make sure we call both writers. The first will register for more writing | 430 // Make sure we call both writers. The first will register for more writing |
| 431 // but should not be immediately called due to limits. | 431 // but should not be immediately called due to limits. |
| 432 InSequence s; | 432 InSequence s; |
| 433 SetBlocked(); | 433 SetBlocked(); |
| 434 dispatcher_.OnWriteBlocked(connection1()); | 434 dispatcher_.OnWriteBlocked(connection1()); |
| 435 dispatcher_.OnWriteBlocked(connection2()); | 435 dispatcher_.OnWriteBlocked(connection2()); |
| 436 EXPECT_CALL(*connection1(), OnCanWrite()).WillOnce(Return(true)); | 436 EXPECT_CALL(*connection1(), OnCanWrite()).WillOnce(Return(true)); |
| 437 EXPECT_CALL(*connection2(), OnCanWrite()).WillOnce(Return(false)); | 437 EXPECT_CALL(*connection2(), OnCanWrite()).WillOnce(Return(false)); |
| 438 dispatcher_.OnCanWrite(); | 438 dispatcher_.OnCanWrite(); |
| 439 | 439 |
| 440 // Now call OnCanWrite again, and connection1 should get its second chance | 440 // Now call OnCanWrite again, and connection1 should get its second chance |
| 441 EXPECT_CALL(*connection1(), OnCanWrite()); | 441 EXPECT_CALL(*connection1(), OnCanWrite()); |
| 442 dispatcher_.OnCanWrite(); | 442 dispatcher_.OnCanWrite(); |
| 443 } | 443 } |
| 444 | 444 |
| 445 TEST_F(QuicWriteBlockedListTest, TestWriteLimits) { | 445 TEST_F(QuicDispatcherWriteBlockedListTest, TestWriteLimits) { |
| 446 // Finally make sure if we write block on a write call, we stop calling. | 446 // Finally make sure if we write block on a write call, we stop calling. |
| 447 InSequence s; | 447 InSequence s; |
| 448 SetBlocked(); | 448 SetBlocked(); |
| 449 dispatcher_.OnWriteBlocked(connection1()); | 449 dispatcher_.OnWriteBlocked(connection1()); |
| 450 dispatcher_.OnWriteBlocked(connection2()); | 450 dispatcher_.OnWriteBlocked(connection2()); |
| 451 EXPECT_CALL(*connection1(), OnCanWrite()).WillOnce( | 451 EXPECT_CALL(*connection1(), OnCanWrite()).WillOnce( |
| 452 Invoke(this, &QuicWriteBlockedListTest::SetBlocked)); | 452 Invoke(this, &QuicDispatcherWriteBlockedListTest::SetBlocked)); |
| 453 EXPECT_CALL(*connection2(), OnCanWrite()).Times(0); | 453 EXPECT_CALL(*connection2(), OnCanWrite()).Times(0); |
| 454 dispatcher_.OnCanWrite(); | 454 dispatcher_.OnCanWrite(); |
| 455 | 455 |
| 456 // And we'll resume where we left off when we get another call. | 456 // And we'll resume where we left off when we get another call. |
| 457 EXPECT_CALL(*connection2(), OnCanWrite()); | 457 EXPECT_CALL(*connection2(), OnCanWrite()); |
| 458 dispatcher_.OnCanWrite(); | 458 dispatcher_.OnCanWrite(); |
| 459 } | 459 } |
| 460 | 460 |
| 461 } // namespace | 461 } // namespace |
| 462 } // namespace test | 462 } // namespace test |
| 463 } // namespace tools | 463 } // namespace tools |
| 464 } // namespace net | 464 } // namespace net |
| OLD | NEW |