Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: net/tools/quic/quic_dispatcher_test.cc

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/tools/quic/quic_dispatcher.cc ('k') | net/tools/quic/quic_server.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 *session = new MockSession(connection); 90 *session = new MockSession(connection);
91 ON_CALL(*connection, SendConnectionClose(_)).WillByDefault( 91 ON_CALL(*connection, SendConnectionClose(_)).WillByDefault(
92 WithoutArgs(Invoke( 92 WithoutArgs(Invoke(
93 connection, &MockServerConnection::UnregisterOnConnectionClosed))); 93 connection, &MockServerConnection::UnregisterOnConnectionClosed)));
94 EXPECT_CALL(*reinterpret_cast<MockConnection*>((*session)->connection()), 94 EXPECT_CALL(*reinterpret_cast<MockConnection*>((*session)->connection()),
95 ProcessUdpPacket(_, client_address, _)); 95 ProcessUdpPacket(_, client_address, _));
96 96
97 return *session; 97 return *session;
98 } 98 }
99 99
100 class MockTimeWaitListManager : public QuicTimeWaitListManager {
101 public:
102 MockTimeWaitListManager(QuicPacketWriter* writer,
103 QuicServerSessionVisitor* visitor,
104 EpollServer* eps)
105 : QuicTimeWaitListManager(writer, visitor, eps, QuicSupportedVersions()) {
106 }
107
108 MOCK_METHOD5(ProcessPacket,
109 void(const IPEndPoint& server_address,
110 const IPEndPoint& client_address,
111 QuicConnectionId connection_id,
112 QuicPacketSequenceNumber sequence_number,
113 const QuicEncryptedPacket& packet));
114 };
115
100 class QuicDispatcherTest : public ::testing::Test { 116 class QuicDispatcherTest : public ::testing::Test {
101 public: 117 public:
102 QuicDispatcherTest() 118 QuicDispatcherTest()
103 : crypto_config_(QuicCryptoServerConfig::TESTING, 119 : crypto_config_(QuicCryptoServerConfig::TESTING,
104 QuicRandom::GetInstance()), 120 QuicRandom::GetInstance()),
105 dispatcher_(config_, crypto_config_, &eps_), 121 dispatcher_(config_, crypto_config_, &eps_),
122 time_wait_list_manager_(nullptr),
106 session1_(nullptr), 123 session1_(nullptr),
107 session2_(nullptr) { 124 session2_(nullptr) {
108 dispatcher_.Initialize(1); 125 dispatcher_.Initialize(1);
109 } 126 }
110 127
111 ~QuicDispatcherTest() override {} 128 ~QuicDispatcherTest() override {}
112 129
113 MockConnection* connection1() { 130 MockConnection* connection1() {
114 return reinterpret_cast<MockConnection*>(session1_->connection()); 131 return reinterpret_cast<MockConnection*>(session1_->connection());
115 } 132 }
(...skipping 10 matching lines...) Expand all
126 connection_id, has_version_flag, false, 1, data)); 143 connection_id, has_version_flag, false, 1, data));
127 data_ = string(packet->data(), packet->length()); 144 data_ = string(packet->data(), packet->length());
128 dispatcher_.ProcessPacket(server_address_, client_address, *packet); 145 dispatcher_.ProcessPacket(server_address_, client_address, *packet);
129 } 146 }
130 147
131 void ValidatePacket(const QuicEncryptedPacket& packet) { 148 void ValidatePacket(const QuicEncryptedPacket& packet) {
132 EXPECT_EQ(data_.length(), packet.AsStringPiece().length()); 149 EXPECT_EQ(data_.length(), packet.AsStringPiece().length());
133 EXPECT_EQ(data_, packet.AsStringPiece()); 150 EXPECT_EQ(data_, packet.AsStringPiece());
134 } 151 }
135 152
153 void CreateTimeWaitListManager() {
154 time_wait_list_manager_ = new MockTimeWaitListManager(
155 QuicDispatcherPeer::GetWriter(&dispatcher_), &dispatcher_, &eps_);
156 // dispatcher takes the ownership of time_wait_list_manager.
157 QuicDispatcherPeer::SetTimeWaitListManager(&dispatcher_,
158 time_wait_list_manager_);
159 }
160
136 EpollServer eps_; 161 EpollServer eps_;
137 QuicConfig config_; 162 QuicConfig config_;
138 QuicCryptoServerConfig crypto_config_; 163 QuicCryptoServerConfig crypto_config_;
139 IPEndPoint server_address_; 164 IPEndPoint server_address_;
140 TestDispatcher dispatcher_; 165 TestDispatcher dispatcher_;
166 MockTimeWaitListManager* time_wait_list_manager_;
141 MockSession* session1_; 167 MockSession* session1_;
142 MockSession* session2_; 168 MockSession* session2_;
143 string data_; 169 string data_;
144 }; 170 };
145 171
146 TEST_F(QuicDispatcherTest, ProcessPackets) { 172 TEST_F(QuicDispatcherTest, ProcessPackets) {
147 IPEndPoint client_address(net::test::Loopback4(), 1); 173 IPEndPoint client_address(net::test::Loopback4(), 1);
148 IPAddressNumber any4; 174 IPAddressNumber any4;
149 CHECK(net::ParseIPLiteralToNumber("0.0.0.0", &any4)); 175 CHECK(net::ParseIPLiteralToNumber("0.0.0.0", &any4));
150 server_address_ = IPEndPoint(any4, 5); 176 server_address_ = IPEndPoint(any4, 5);
(...skipping 26 matching lines...) Expand all
177 &dispatcher_, 1, client_address, &session1_))); 203 &dispatcher_, 1, client_address, &session1_)));
178 204
179 ProcessPacket(client_address, 1, true, "foo"); 205 ProcessPacket(client_address, 1, true, "foo");
180 206
181 EXPECT_CALL(*reinterpret_cast<MockConnection*>(session1_->connection()), 207 EXPECT_CALL(*reinterpret_cast<MockConnection*>(session1_->connection()),
182 SendConnectionClose(QUIC_PEER_GOING_AWAY)); 208 SendConnectionClose(QUIC_PEER_GOING_AWAY));
183 209
184 dispatcher_.Shutdown(); 210 dispatcher_.Shutdown();
185 } 211 }
186 212
187 class MockTimeWaitListManager : public QuicTimeWaitListManager { 213 TEST_F(QuicDispatcherTest, TimeWaitListManager) {
188 public: 214 CreateTimeWaitListManager();
189 MockTimeWaitListManager(QuicPacketWriter* writer,
190 QuicServerSessionVisitor* visitor,
191 EpollServer* eps)
192 : QuicTimeWaitListManager(writer, visitor, eps, QuicSupportedVersions()) {
193 }
194 215
195 MOCK_METHOD5(ProcessPacket, void(const IPEndPoint& server_address,
196 const IPEndPoint& client_address,
197 QuicConnectionId connection_id,
198 QuicPacketSequenceNumber sequence_number,
199 const QuicEncryptedPacket& packet));
200 };
201
202 TEST_F(QuicDispatcherTest, TimeWaitListManager) {
203 MockTimeWaitListManager* time_wait_list_manager =
204 new MockTimeWaitListManager(
205 QuicDispatcherPeer::GetWriter(&dispatcher_), &dispatcher_, &eps_);
206 // dispatcher takes the ownership of time_wait_list_manager.
207 QuicDispatcherPeer::SetTimeWaitListManager(&dispatcher_,
208 time_wait_list_manager);
209 // Create a new session. 216 // Create a new session.
210 IPEndPoint client_address(net::test::Loopback4(), 1); 217 IPEndPoint client_address(net::test::Loopback4(), 1);
211 QuicConnectionId connection_id = 1; 218 QuicConnectionId connection_id = 1;
212 EXPECT_CALL(dispatcher_, CreateQuicSession(connection_id, _, client_address)) 219 EXPECT_CALL(dispatcher_, CreateQuicSession(connection_id, _, client_address))
213 .WillOnce(testing::Return(CreateSession( 220 .WillOnce(testing::Return(CreateSession(
214 &dispatcher_, connection_id, client_address, &session1_))); 221 &dispatcher_, connection_id, client_address, &session1_)));
215 ProcessPacket(client_address, connection_id, true, "foo"); 222 ProcessPacket(client_address, connection_id, true, "foo");
216 223
217 // Close the connection by sending public reset packet. 224 // Close the connection by sending public reset packet.
218 QuicPublicResetPacket packet; 225 QuicPublicResetPacket packet;
219 packet.public_header.connection_id = connection_id; 226 packet.public_header.connection_id = connection_id;
220 packet.public_header.reset_flag = true; 227 packet.public_header.reset_flag = true;
221 packet.public_header.version_flag = false; 228 packet.public_header.version_flag = false;
222 packet.rejected_sequence_number = 19191; 229 packet.rejected_sequence_number = 19191;
223 packet.nonce_proof = 132232; 230 packet.nonce_proof = 132232;
224 scoped_ptr<QuicEncryptedPacket> encrypted( 231 scoped_ptr<QuicEncryptedPacket> encrypted(
225 QuicFramer::BuildPublicResetPacket(packet)); 232 QuicFramer::BuildPublicResetPacket(packet));
226 EXPECT_CALL(*session1_, OnConnectionClosed(QUIC_PUBLIC_RESET, true)).Times(1) 233 EXPECT_CALL(*session1_, OnConnectionClosed(QUIC_PUBLIC_RESET, true)).Times(1)
227 .WillOnce(WithoutArgs(Invoke( 234 .WillOnce(WithoutArgs(Invoke(
228 reinterpret_cast<MockServerConnection*>(session1_->connection()), 235 reinterpret_cast<MockServerConnection*>(session1_->connection()),
229 &MockServerConnection::UnregisterOnConnectionClosed))); 236 &MockServerConnection::UnregisterOnConnectionClosed)));
230 EXPECT_CALL(*reinterpret_cast<MockConnection*>(session1_->connection()), 237 EXPECT_CALL(*reinterpret_cast<MockConnection*>(session1_->connection()),
231 ProcessUdpPacket(_, _, _)) 238 ProcessUdpPacket(_, _, _))
232 .WillOnce(Invoke( 239 .WillOnce(Invoke(
233 reinterpret_cast<MockConnection*>(session1_->connection()), 240 reinterpret_cast<MockConnection*>(session1_->connection()),
234 &MockConnection::ReallyProcessUdpPacket)); 241 &MockConnection::ReallyProcessUdpPacket));
235 dispatcher_.ProcessPacket(IPEndPoint(), client_address, *encrypted); 242 dispatcher_.ProcessPacket(IPEndPoint(), client_address, *encrypted);
236 EXPECT_TRUE(time_wait_list_manager->IsConnectionIdInTimeWait(connection_id)); 243 EXPECT_TRUE(time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id));
237 244
238 // Dispatcher forwards subsequent packets for this connection_id to the time 245 // Dispatcher forwards subsequent packets for this connection_id to the time
239 // wait list manager. 246 // wait list manager.
240 EXPECT_CALL(*time_wait_list_manager, 247 EXPECT_CALL(*time_wait_list_manager_,
241 ProcessPacket(_, _, connection_id, _, _)).Times(1); 248 ProcessPacket(_, _, connection_id, _, _)).Times(1);
242 ProcessPacket(client_address, connection_id, true, "foo"); 249 ProcessPacket(client_address, connection_id, true, "foo");
243 } 250 }
244 251
245 TEST_F(QuicDispatcherTest, StrayPacketToTimeWaitListManager) { 252 TEST_F(QuicDispatcherTest, StrayPacketToTimeWaitListManager) {
246 MockTimeWaitListManager* time_wait_list_manager = 253 CreateTimeWaitListManager();
247 new MockTimeWaitListManager(
248 QuicDispatcherPeer::GetWriter(&dispatcher_), &dispatcher_, &eps_);
249 // dispatcher takes the ownership of time_wait_list_manager.
250 QuicDispatcherPeer::SetTimeWaitListManager(&dispatcher_,
251 time_wait_list_manager);
252 254
253 IPEndPoint client_address(net::test::Loopback4(), 1); 255 IPEndPoint client_address(net::test::Loopback4(), 1);
254 QuicConnectionId connection_id = 1; 256 QuicConnectionId connection_id = 1;
255 // Dispatcher forwards all packets for this connection_id to the time wait 257 // Dispatcher forwards all packets for this connection_id to the time wait
256 // list manager. 258 // list manager.
257 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, _)).Times(0); 259 EXPECT_CALL(dispatcher_, CreateQuicSession(_, _, _)).Times(0);
258 EXPECT_CALL(*time_wait_list_manager, 260 EXPECT_CALL(*time_wait_list_manager_,
259 ProcessPacket(_, _, connection_id, _, _)).Times(1); 261 ProcessPacket(_, _, connection_id, _, _)).Times(1);
260 string data = "foo"; 262 string data = "foo";
261 ProcessPacket(client_address, connection_id, false, "foo"); 263 ProcessPacket(client_address, connection_id, false, "foo");
262 } 264 }
263 265
266 TEST_F(QuicDispatcherTest, ProcessPacketWithBogusPort) {
267 CreateTimeWaitListManager();
268
269 IPEndPoint client_address(net::test::Loopback4(), 0);
270 IPAddressNumber any4;
271 CHECK(net::ParseIPLiteralToNumber("0.0.0.0", &any4));
272 server_address_ = IPEndPoint(any4, 5);
273
274 EXPECT_CALL(dispatcher_, CreateQuicSession(1, _, client_address)).Times(0);
275 EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0);
276 ProcessPacket(client_address, 1, true, "foo");
277 EXPECT_EQ(client_address, dispatcher_.current_client_address());
278 EXPECT_EQ(server_address_, dispatcher_.current_server_address());
279 }
280
264 class BlockingWriter : public QuicPacketWriterWrapper { 281 class BlockingWriter : public QuicPacketWriterWrapper {
265 public: 282 public:
266 BlockingWriter() : write_blocked_(false) {} 283 BlockingWriter() : write_blocked_(false) {}
267 284
268 bool IsWriteBlocked() const override { return write_blocked_; } 285 bool IsWriteBlocked() const override { return write_blocked_; }
269 void SetWritable() override { write_blocked_ = false; } 286 void SetWritable() override { write_blocked_ = false; }
270 287
271 WriteResult WritePacket(const char* buffer, 288 WriteResult WritePacket(const char* buffer,
272 size_t buf_len, 289 size_t buf_len,
273 const IPAddressNumber& self_client_address, 290 const IPAddressNumber& self_client_address,
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 // And we'll resume where we left off when we get another call. 469 // And we'll resume where we left off when we get another call.
453 EXPECT_CALL(*connection2(), OnCanWrite()); 470 EXPECT_CALL(*connection2(), OnCanWrite());
454 dispatcher_.OnCanWrite(); 471 dispatcher_.OnCanWrite();
455 EXPECT_FALSE(dispatcher_.HasPendingWrites()); 472 EXPECT_FALSE(dispatcher_.HasPendingWrites());
456 } 473 }
457 474
458 } // namespace 475 } // namespace
459 } // namespace test 476 } // namespace test
460 } // namespace tools 477 } // namespace tools
461 } // namespace net 478 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_dispatcher.cc ('k') | net/tools/quic/quic_server.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698