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" |
11 #include "net/quic/crypto/quic_crypto_server_config.h" | 11 #include "net/quic/crypto/quic_crypto_server_config.h" |
12 #include "net/quic/crypto/quic_random.h" | 12 #include "net/quic/crypto/quic_random.h" |
13 #include "net/quic/quic_crypto_stream.h" | 13 #include "net/quic/quic_crypto_stream.h" |
14 #include "net/quic/test_tools/quic_test_utils.h" | 14 #include "net/quic/test_tools/quic_test_utils.h" |
| 15 #include "net/quic/test_tools/quic_test_writer.h" |
15 #include "net/tools/epoll_server/epoll_server.h" | 16 #include "net/tools/epoll_server/epoll_server.h" |
16 #include "net/tools/quic/quic_time_wait_list_manager.h" | 17 #include "net/tools/quic/quic_time_wait_list_manager.h" |
17 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h" | 18 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h" |
18 #include "net/tools/quic/test_tools/quic_test_utils.h" | 19 #include "net/tools/quic/test_tools/quic_test_utils.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
21 | 22 |
22 using base::StringPiece; | 23 using base::StringPiece; |
23 using net::EpollServer; | 24 using net::EpollServer; |
24 using net::test::MockSession; | 25 using net::test::MockSession; |
| 26 using net::test::QuicTestWriter; |
25 using net::tools::test::MockConnection; | 27 using net::tools::test::MockConnection; |
26 using std::make_pair; | 28 using std::make_pair; |
27 using testing::_; | 29 using testing::_; |
28 using testing::DoAll; | 30 using testing::DoAll; |
29 using testing::Invoke; | 31 using testing::Invoke; |
30 using testing::InSequence; | 32 using testing::InSequence; |
31 using testing::Return; | 33 using testing::Return; |
32 using testing::WithoutArgs; | 34 using testing::WithoutArgs; |
33 | 35 |
34 namespace net { | 36 namespace net { |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 IPEndPoint addr(net::test::Loopback4(), 1); | 265 IPEndPoint addr(net::test::Loopback4(), 1); |
264 QuicGuid guid = 1; | 266 QuicGuid guid = 1; |
265 // Dispatcher forwards all packets for this guid to the time wait list | 267 // Dispatcher forwards all packets for this guid to the time wait list |
266 // manager. | 268 // manager. |
267 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, _)).Times(0); | 269 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, _)).Times(0); |
268 EXPECT_CALL(*time_wait_list_manager, ProcessPacket(_, _, guid, _)).Times(1); | 270 EXPECT_CALL(*time_wait_list_manager, ProcessPacket(_, _, guid, _)).Times(1); |
269 string data = "foo"; | 271 string data = "foo"; |
270 ProcessPacket(addr, guid, false, "foo"); | 272 ProcessPacket(addr, guid, false, "foo"); |
271 } | 273 } |
272 | 274 |
| 275 class BlockingWriter : public QuicTestWriter { |
| 276 public: |
| 277 BlockingWriter() : write_blocked_(false) {} |
| 278 |
| 279 virtual bool IsWriteBlocked() const OVERRIDE { return write_blocked_; } |
| 280 virtual void SetWritable() OVERRIDE { write_blocked_ = false; } |
| 281 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { return false; } |
| 282 |
| 283 virtual WriteResult WritePacket( |
| 284 const char* buffer, size_t buf_len, const IPAddressNumber& self_address, |
| 285 const IPEndPoint& peer_address, |
| 286 QuicBlockedWriterInterface* blocked_writer) OVERRIDE { |
| 287 if (write_blocked_) { |
| 288 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); |
| 289 } else { |
| 290 return writer()->WritePacket(buffer, buf_len, self_address, peer_address, |
| 291 blocked_writer); |
| 292 } |
| 293 } |
| 294 |
| 295 bool write_blocked_; |
| 296 }; |
| 297 |
273 class QuicWriteBlockedListTest : public QuicDispatcherTest { | 298 class QuicWriteBlockedListTest : public QuicDispatcherTest { |
274 public: | 299 public: |
275 virtual void SetUp() { | 300 virtual void SetUp() { |
| 301 writer_ = new BlockingWriter; |
| 302 QuicDispatcherPeer::UseWriter(&dispatcher_, writer_); |
| 303 |
276 IPEndPoint addr(net::test::Loopback4(), 1); | 304 IPEndPoint addr(net::test::Loopback4(), 1); |
277 | 305 |
278 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, addr)) | 306 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, addr)) |
279 .WillOnce(testing::Return(CreateSession( | 307 .WillOnce(testing::Return(CreateSession( |
280 &dispatcher_, 1, addr, &session1_))); | 308 &dispatcher_, 1, addr, &session1_))); |
281 ProcessPacket(addr, 1, true, "foo"); | 309 ProcessPacket(addr, 1, true, "foo"); |
282 | 310 |
283 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, addr)) | 311 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, addr)) |
284 .WillOnce(testing::Return(CreateSession( | 312 .WillOnce(testing::Return(CreateSession( |
285 &dispatcher_, 2, addr, &session2_))); | 313 &dispatcher_, 2, addr, &session2_))); |
286 ProcessPacket(addr, 2, true, "bar"); | 314 ProcessPacket(addr, 2, true, "bar"); |
287 | 315 |
288 blocked_list_ = dispatcher_.write_blocked_list(); | 316 blocked_list_ = dispatcher_.write_blocked_list(); |
289 } | 317 } |
290 | 318 |
291 virtual void TearDown() { | 319 virtual void TearDown() { |
292 EXPECT_CALL(*connection1(), SendConnectionClose(QUIC_PEER_GOING_AWAY)); | 320 EXPECT_CALL(*connection1(), SendConnectionClose(QUIC_PEER_GOING_AWAY)); |
293 EXPECT_CALL(*connection2(), SendConnectionClose(QUIC_PEER_GOING_AWAY)); | 321 EXPECT_CALL(*connection2(), SendConnectionClose(QUIC_PEER_GOING_AWAY)); |
294 dispatcher_.Shutdown(); | 322 dispatcher_.Shutdown(); |
295 } | 323 } |
296 | 324 |
297 bool SetBlocked() { | 325 bool SetBlocked() { |
298 QuicDispatcherPeer::SetWriteBlocked(&dispatcher_); | 326 writer_->write_blocked_ = true;; |
299 return true; | 327 return true; |
300 } | 328 } |
301 | 329 |
302 protected: | 330 protected: |
| 331 BlockingWriter* writer_; |
303 QuicDispatcher::WriteBlockedList* blocked_list_; | 332 QuicDispatcher::WriteBlockedList* blocked_list_; |
304 }; | 333 }; |
305 | 334 |
306 TEST_F(QuicWriteBlockedListTest, BasicOnCanWrite) { | 335 TEST_F(QuicWriteBlockedListTest, BasicOnCanWrite) { |
307 // No OnCanWrite calls because no connections are blocked. | 336 // No OnCanWrite calls because no connections are blocked. |
308 dispatcher_.OnCanWrite(); | 337 dispatcher_.OnCanWrite(); |
309 | 338 |
310 // Register connection 1 for events, and make sure it's nofitied. | 339 // Register connection 1 for events, and make sure it's nofitied. |
311 blocked_list_->insert(make_pair(connection1(), true)); | 340 blocked_list_->insert(make_pair(connection1(), true)); |
312 EXPECT_CALL(*connection1(), OnCanWrite()); | 341 EXPECT_CALL(*connection1(), OnCanWrite()); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 | 442 |
414 // And we'll resume where we left off when we get another call. | 443 // And we'll resume where we left off when we get another call. |
415 EXPECT_CALL(*connection2(), OnCanWrite()); | 444 EXPECT_CALL(*connection2(), OnCanWrite()); |
416 dispatcher_.OnCanWrite(); | 445 dispatcher_.OnCanWrite(); |
417 } | 446 } |
418 | 447 |
419 } // namespace | 448 } // namespace |
420 } // namespace test | 449 } // namespace test |
421 } // namespace tools | 450 } // namespace tools |
422 } // namespace net | 451 } // namespace net |
OLD | NEW |