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

Side by Side Diff: net/quic/quic_session_test.cc

Issue 100173005: Break out the basic reliable QUIC stream functionality from the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_session.cc ('k') | net/quic/quic_stream_sequencer_test.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/quic/quic_session.h" 5 #include "net/quic/quic_session.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
11 #include "net/quic/crypto/crypto_handshake.h" 11 #include "net/quic/crypto/crypto_handshake.h"
12 #include "net/quic/quic_connection.h" 12 #include "net/quic/quic_connection.h"
13 #include "net/quic/quic_protocol.h" 13 #include "net/quic/quic_protocol.h"
14 #include "net/quic/test_tools/quic_connection_peer.h" 14 #include "net/quic/test_tools/quic_connection_peer.h"
15 #include "net/quic/test_tools/quic_data_stream_peer.h"
15 #include "net/quic/test_tools/quic_test_utils.h" 16 #include "net/quic/test_tools/quic_test_utils.h"
16 #include "net/quic/test_tools/reliable_quic_stream_peer.h" 17 #include "net/quic/test_tools/reliable_quic_stream_peer.h"
17 #include "net/spdy/spdy_framer.h" 18 #include "net/spdy/spdy_framer.h"
18 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
20 21
21 using base::hash_map; 22 using base::hash_map;
22 using std::set; 23 using std::set;
23 using std::vector; 24 using std::vector;
24 using testing::_; 25 using testing::_;
(...skipping 23 matching lines...) Expand all
48 const QuicErrorCode error = session()->config()->ProcessClientHello( 49 const QuicErrorCode error = session()->config()->ProcessClientHello(
49 msg, &error_details); 50 msg, &error_details);
50 EXPECT_EQ(QUIC_NO_ERROR, error); 51 EXPECT_EQ(QUIC_NO_ERROR, error);
51 session()->OnConfigNegotiated(); 52 session()->OnConfigNegotiated();
52 session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED); 53 session()->OnCryptoHandshakeEvent(QuicSession::HANDSHAKE_CONFIRMED);
53 } 54 }
54 55
55 MOCK_METHOD0(OnCanWrite, void()); 56 MOCK_METHOD0(OnCanWrite, void());
56 }; 57 };
57 58
58 class TestStream : public ReliableQuicStream { 59 class TestStream : public QuicDataStream {
59 public: 60 public:
60 TestStream(QuicStreamId id, QuicSession* session) 61 TestStream(QuicStreamId id, QuicSession* session)
61 : ReliableQuicStream(id, session) { 62 : QuicDataStream(id, session) {
62 } 63 }
63 64
64 using ReliableQuicStream::CloseWriteSide; 65 using ReliableQuicStream::CloseWriteSide;
65 66
66 virtual uint32 ProcessData(const char* data, uint32 data_len) { 67 virtual uint32 ProcessData(const char* data, uint32 data_len) {
67 return data_len; 68 return data_len;
68 } 69 }
69 70
70 MOCK_METHOD0(OnCanWrite, void()); 71 MOCK_METHOD0(OnCanWrite, void());
71 }; 72 };
(...skipping 19 matching lines...) Expand all
91 public: 92 public:
92 TestSession(QuicConnection* connection, bool is_server) 93 TestSession(QuicConnection* connection, bool is_server)
93 : QuicSession(connection, DefaultQuicConfig(), is_server), 94 : QuicSession(connection, DefaultQuicConfig(), is_server),
94 crypto_stream_(this) { 95 crypto_stream_(this) {
95 } 96 }
96 97
97 virtual TestCryptoStream* GetCryptoStream() OVERRIDE { 98 virtual TestCryptoStream* GetCryptoStream() OVERRIDE {
98 return &crypto_stream_; 99 return &crypto_stream_;
99 } 100 }
100 101
101 virtual TestStream* CreateOutgoingReliableStream() OVERRIDE { 102 virtual TestStream* CreateOutgoingDataStream() OVERRIDE {
102 TestStream* stream = new TestStream(GetNextStreamId(), this); 103 TestStream* stream = new TestStream(GetNextStreamId(), this);
103 ActivateStream(stream); 104 ActivateStream(stream);
104 return stream; 105 return stream;
105 } 106 }
106 107
107 virtual TestStream* CreateIncomingReliableStream(QuicStreamId id) OVERRIDE { 108 virtual TestStream* CreateIncomingDataStream(QuicStreamId id) OVERRIDE {
108 return new TestStream(id, this); 109 return new TestStream(id, this);
109 } 110 }
110 111
111 bool IsClosedStream(QuicStreamId id) { 112 bool IsClosedStream(QuicStreamId id) {
112 return QuicSession::IsClosedStream(id); 113 return QuicSession::IsClosedStream(id);
113 } 114 }
114 115
115 ReliableQuicStream* GetIncomingReliableStream(QuicStreamId stream_id) { 116 QuicDataStream* GetIncomingReliableStream(QuicStreamId stream_id) {
116 return QuicSession::GetIncomingReliableStream(stream_id); 117 return QuicSession::GetIncomingReliableStream(stream_id);
117 } 118 }
118 119
119 TestCryptoStream crypto_stream_; 120 TestCryptoStream crypto_stream_;
120 }; 121 };
121 122
122 class QuicSessionTest : public ::testing::Test { 123 class QuicSessionTest : public ::testing::Test {
123 protected: 124 protected:
124 QuicSessionTest() 125 QuicSessionTest()
125 : guid_(1), 126 : guid_(1),
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 TEST_F(QuicSessionTest, ImplicitlyCreatedStreams) { 198 TEST_F(QuicSessionTest, ImplicitlyCreatedStreams) {
198 ASSERT_TRUE(session_.GetIncomingReliableStream(7) != NULL); 199 ASSERT_TRUE(session_.GetIncomingReliableStream(7) != NULL);
199 // Both 3 and 5 should be implicitly created. 200 // Both 3 and 5 should be implicitly created.
200 EXPECT_FALSE(session_.IsClosedStream(3)); 201 EXPECT_FALSE(session_.IsClosedStream(3));
201 EXPECT_FALSE(session_.IsClosedStream(5)); 202 EXPECT_FALSE(session_.IsClosedStream(5));
202 ASSERT_TRUE(session_.GetIncomingReliableStream(5) != NULL); 203 ASSERT_TRUE(session_.GetIncomingReliableStream(5) != NULL);
203 ASSERT_TRUE(session_.GetIncomingReliableStream(3) != NULL); 204 ASSERT_TRUE(session_.GetIncomingReliableStream(3) != NULL);
204 } 205 }
205 206
206 TEST_F(QuicSessionTest, IsClosedStreamLocallyCreated) { 207 TEST_F(QuicSessionTest, IsClosedStreamLocallyCreated) {
207 TestStream* stream2 = session_.CreateOutgoingReliableStream(); 208 TestStream* stream2 = session_.CreateOutgoingDataStream();
208 EXPECT_EQ(2u, stream2->id()); 209 EXPECT_EQ(2u, stream2->id());
209 ReliableQuicStreamPeer::SetHeadersDecompressed(stream2, true); 210 QuicDataStreamPeer::SetHeadersDecompressed(stream2, true);
210 TestStream* stream4 = session_.CreateOutgoingReliableStream(); 211 TestStream* stream4 = session_.CreateOutgoingDataStream();
211 EXPECT_EQ(4u, stream4->id()); 212 EXPECT_EQ(4u, stream4->id());
212 ReliableQuicStreamPeer::SetHeadersDecompressed(stream4, true); 213 QuicDataStreamPeer::SetHeadersDecompressed(stream4, true);
213 214
214 CheckClosedStreams(); 215 CheckClosedStreams();
215 CloseStream(4); 216 CloseStream(4);
216 CheckClosedStreams(); 217 CheckClosedStreams();
217 CloseStream(2); 218 CloseStream(2);
218 CheckClosedStreams(); 219 CheckClosedStreams();
219 } 220 }
220 221
221 TEST_F(QuicSessionTest, IsClosedStreamPeerCreated) { 222 TEST_F(QuicSessionTest, IsClosedStreamPeerCreated) {
222 ReliableQuicStream* stream3 = session_.GetIncomingReliableStream(3); 223 QuicDataStream* stream3 = session_.GetIncomingReliableStream(3);
223 ReliableQuicStreamPeer::SetHeadersDecompressed(stream3, true); 224 QuicDataStreamPeer::SetHeadersDecompressed(stream3, true);
224 ReliableQuicStream* stream5 = session_.GetIncomingReliableStream(5); 225 QuicDataStream* stream5 = session_.GetIncomingReliableStream(5);
225 ReliableQuicStreamPeer::SetHeadersDecompressed(stream5, true); 226 QuicDataStreamPeer::SetHeadersDecompressed(stream5, true);
226 227
227 CheckClosedStreams(); 228 CheckClosedStreams();
228 CloseStream(3); 229 CloseStream(3);
229 CheckClosedStreams(); 230 CheckClosedStreams();
230 CloseStream(5); 231 CloseStream(5);
231 // Create stream id 9, and implicitly 7 232 // Create stream id 9, and implicitly 7
232 ReliableQuicStream* stream9 = session_.GetIncomingReliableStream(9); 233 QuicDataStream* stream9 = session_.GetIncomingReliableStream(9);
233 ReliableQuicStreamPeer::SetHeadersDecompressed(stream9, true); 234 QuicDataStreamPeer::SetHeadersDecompressed(stream9, true);
234 CheckClosedStreams(); 235 CheckClosedStreams();
235 // Close 9, but make sure 7 is still not closed 236 // Close 9, but make sure 7 is still not closed
236 CloseStream(9); 237 CloseStream(9);
237 CheckClosedStreams(); 238 CheckClosedStreams();
238 } 239 }
239 240
240 TEST_F(QuicSessionTest, StreamIdTooLarge) { 241 TEST_F(QuicSessionTest, StreamIdTooLarge) {
241 session_.GetIncomingReliableStream(3); 242 session_.GetIncomingReliableStream(3);
242 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); 243 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID));
243 session_.GetIncomingReliableStream(105); 244 session_.GetIncomingReliableStream(105);
244 } 245 }
245 246
246 TEST_F(QuicSessionTest, DecompressionError) { 247 TEST_F(QuicSessionTest, DecompressionError) {
247 ReliableQuicStream* stream = session_.GetIncomingReliableStream(3); 248 ReliableQuicStream* stream = session_.GetIncomingReliableStream(3);
248 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE)); 249 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE));
249 const char data[] = 250 const char data[] =
250 "\1\0\0\0" // headers id 251 "\1\0\0\0" // headers id
251 "\0\0\0\4" // length 252 "\0\0\0\4" // length
252 "abcd"; // invalid compressed data 253 "abcd"; // invalid compressed data
253 stream->ProcessRawData(data, arraysize(data)); 254 stream->ProcessRawData(data, arraysize(data));
254 } 255 }
255 256
256 TEST_F(QuicSessionTest, OnCanWrite) { 257 TEST_F(QuicSessionTest, OnCanWrite) {
257 TestStream* stream2 = session_.CreateOutgoingReliableStream(); 258 TestStream* stream2 = session_.CreateOutgoingDataStream();
258 TestStream* stream4 = session_.CreateOutgoingReliableStream(); 259 TestStream* stream4 = session_.CreateOutgoingDataStream();
259 TestStream* stream6 = session_.CreateOutgoingReliableStream(); 260 TestStream* stream6 = session_.CreateOutgoingDataStream();
260 261
261 session_.MarkWriteBlocked(stream2->id(), kSomeMiddlePriority); 262 session_.MarkWriteBlocked(stream2->id(), kSomeMiddlePriority);
262 session_.MarkWriteBlocked(stream6->id(), kSomeMiddlePriority); 263 session_.MarkWriteBlocked(stream6->id(), kSomeMiddlePriority);
263 session_.MarkWriteBlocked(stream4->id(), kSomeMiddlePriority); 264 session_.MarkWriteBlocked(stream4->id(), kSomeMiddlePriority);
264 265
265 InSequence s; 266 InSequence s;
266 StreamBlocker stream2_blocker(&session_, stream2->id()); 267 StreamBlocker stream2_blocker(&session_, stream2->id());
267 EXPECT_CALL(*stream2, OnCanWrite()).WillOnce( 268 EXPECT_CALL(*stream2, OnCanWrite()).WillOnce(
268 // Reregister, to test the loop limit. 269 // Reregister, to test the loop limit.
269 InvokeWithoutArgs(&stream2_blocker, &StreamBlocker::MarkWriteBlocked)); 270 InvokeWithoutArgs(&stream2_blocker, &StreamBlocker::MarkWriteBlocked));
270 EXPECT_CALL(*stream6, OnCanWrite()); 271 EXPECT_CALL(*stream6, OnCanWrite());
271 EXPECT_CALL(*stream4, OnCanWrite()); 272 EXPECT_CALL(*stream4, OnCanWrite());
272 273
273 EXPECT_FALSE(session_.OnCanWrite()); 274 EXPECT_FALSE(session_.OnCanWrite());
274 } 275 }
275 276
276 TEST_F(QuicSessionTest, BufferedHandshake) { 277 TEST_F(QuicSessionTest, BufferedHandshake) {
277 EXPECT_FALSE(session_.HasPendingHandshake()); // Default value. 278 EXPECT_FALSE(session_.HasPendingHandshake()); // Default value.
278 279
279 // Test that blocking other streams does not change our status. 280 // Test that blocking other streams does not change our status.
280 TestStream* stream2 = session_.CreateOutgoingReliableStream(); 281 TestStream* stream2 = session_.CreateOutgoingDataStream();
281 StreamBlocker stream2_blocker(&session_, stream2->id()); 282 StreamBlocker stream2_blocker(&session_, stream2->id());
282 stream2_blocker.MarkWriteBlocked(); 283 stream2_blocker.MarkWriteBlocked();
283 EXPECT_FALSE(session_.HasPendingHandshake()); 284 EXPECT_FALSE(session_.HasPendingHandshake());
284 285
285 TestStream* stream3 = session_.CreateOutgoingReliableStream(); 286 TestStream* stream3 = session_.CreateOutgoingDataStream();
286 StreamBlocker stream3_blocker(&session_, stream3->id()); 287 StreamBlocker stream3_blocker(&session_, stream3->id());
287 stream3_blocker.MarkWriteBlocked(); 288 stream3_blocker.MarkWriteBlocked();
288 EXPECT_FALSE(session_.HasPendingHandshake()); 289 EXPECT_FALSE(session_.HasPendingHandshake());
289 290
290 // Blocking (due to buffering of) the Crypto stream is detected. 291 // Blocking (due to buffering of) the Crypto stream is detected.
291 session_.MarkWriteBlocked(kCryptoStreamId, kSomeMiddlePriority); 292 session_.MarkWriteBlocked(kCryptoStreamId, kSomeMiddlePriority);
292 EXPECT_TRUE(session_.HasPendingHandshake()); 293 EXPECT_TRUE(session_.HasPendingHandshake());
293 294
294 TestStream* stream4 = session_.CreateOutgoingReliableStream(); 295 TestStream* stream4 = session_.CreateOutgoingDataStream();
295 StreamBlocker stream4_blocker(&session_, stream4->id()); 296 StreamBlocker stream4_blocker(&session_, stream4->id());
296 stream4_blocker.MarkWriteBlocked(); 297 stream4_blocker.MarkWriteBlocked();
297 EXPECT_TRUE(session_.HasPendingHandshake()); 298 EXPECT_TRUE(session_.HasPendingHandshake());
298 299
299 InSequence s; 300 InSequence s;
300 // Force most streams to re-register, which is common scenario when we block 301 // Force most streams to re-register, which is common scenario when we block
301 // the Crypto stream, and only the crypto stream can "really" write. 302 // the Crypto stream, and only the crypto stream can "really" write.
302 303
303 // Due to prioritization, we *should* be asked to write the crypto stream 304 // Due to prioritization, we *should* be asked to write the crypto stream
304 // first. 305 // first.
305 // Don't re-register the crypto stream (which signals complete writing). 306 // Don't re-register the crypto stream (which signals complete writing).
306 TestCryptoStream* crypto_stream = session_.GetCryptoStream(); 307 TestCryptoStream* crypto_stream = session_.GetCryptoStream();
307 EXPECT_CALL(*crypto_stream, OnCanWrite()); 308 EXPECT_CALL(*crypto_stream, OnCanWrite());
308 309
309 // Re-register all other streams, to show they weren't able to proceed. 310 // Re-register all other streams, to show they weren't able to proceed.
310 EXPECT_CALL(*stream2, OnCanWrite()).WillOnce( 311 EXPECT_CALL(*stream2, OnCanWrite()).WillOnce(
311 InvokeWithoutArgs(&stream2_blocker, &StreamBlocker::MarkWriteBlocked)); 312 InvokeWithoutArgs(&stream2_blocker, &StreamBlocker::MarkWriteBlocked));
312 313
313 EXPECT_CALL(*stream3, OnCanWrite()).WillOnce( 314 EXPECT_CALL(*stream3, OnCanWrite()).WillOnce(
314 InvokeWithoutArgs(&stream3_blocker, &StreamBlocker::MarkWriteBlocked)); 315 InvokeWithoutArgs(&stream3_blocker, &StreamBlocker::MarkWriteBlocked));
315 316
316 EXPECT_CALL(*stream4, OnCanWrite()).WillOnce( 317 EXPECT_CALL(*stream4, OnCanWrite()).WillOnce(
317 InvokeWithoutArgs(&stream4_blocker, &StreamBlocker::MarkWriteBlocked)); 318 InvokeWithoutArgs(&stream4_blocker, &StreamBlocker::MarkWriteBlocked));
318 319
319 EXPECT_FALSE(session_.OnCanWrite()); 320 EXPECT_FALSE(session_.OnCanWrite());
320 EXPECT_FALSE(session_.HasPendingHandshake()); // Crypto stream wrote. 321 EXPECT_FALSE(session_.HasPendingHandshake()); // Crypto stream wrote.
321 } 322 }
322 323
323 TEST_F(QuicSessionTest, OnCanWriteWithClosedStream) { 324 TEST_F(QuicSessionTest, OnCanWriteWithClosedStream) {
324 TestStream* stream2 = session_.CreateOutgoingReliableStream(); 325 TestStream* stream2 = session_.CreateOutgoingDataStream();
325 TestStream* stream4 = session_.CreateOutgoingReliableStream(); 326 TestStream* stream4 = session_.CreateOutgoingDataStream();
326 TestStream* stream6 = session_.CreateOutgoingReliableStream(); 327 TestStream* stream6 = session_.CreateOutgoingDataStream();
327 328
328 session_.MarkWriteBlocked(stream2->id(), kSomeMiddlePriority); 329 session_.MarkWriteBlocked(stream2->id(), kSomeMiddlePriority);
329 session_.MarkWriteBlocked(stream6->id(), kSomeMiddlePriority); 330 session_.MarkWriteBlocked(stream6->id(), kSomeMiddlePriority);
330 session_.MarkWriteBlocked(stream4->id(), kSomeMiddlePriority); 331 session_.MarkWriteBlocked(stream4->id(), kSomeMiddlePriority);
331 CloseStream(stream6->id()); 332 CloseStream(stream6->id());
332 333
333 InSequence s; 334 InSequence s;
334 EXPECT_CALL(*stream2, OnCanWrite()); 335 EXPECT_CALL(*stream2, OnCanWrite());
335 EXPECT_CALL(*stream4, OnCanWrite()); 336 EXPECT_CALL(*stream4, OnCanWrite());
336 EXPECT_TRUE(session_.OnCanWrite()); 337 EXPECT_TRUE(session_.OnCanWrite());
337 } 338 }
338 339
339 // Regression test for http://crbug.com/248737 340 // Regression test for http://crbug.com/248737
340 TEST_F(QuicSessionTest, OutOfOrderHeaders) { 341 TEST_F(QuicSessionTest, OutOfOrderHeaders) {
341 QuicSpdyCompressor compressor; 342 QuicSpdyCompressor compressor;
342 vector<QuicStreamFrame> frames; 343 vector<QuicStreamFrame> frames;
343 QuicPacketHeader header; 344 QuicPacketHeader header;
344 header.public_header.guid = session_.guid(); 345 header.public_header.guid = session_.guid();
345 346
346 TestStream* stream2 = session_.CreateOutgoingReliableStream(); 347 TestStream* stream2 = session_.CreateOutgoingDataStream();
347 TestStream* stream4 = session_.CreateOutgoingReliableStream(); 348 TestStream* stream4 = session_.CreateOutgoingDataStream();
348 stream2->CloseWriteSide(); 349 stream2->CloseWriteSide();
349 stream4->CloseWriteSide(); 350 stream4->CloseWriteSide();
350 351
351 // Create frame with headers for stream2. 352 // Create frame with headers for stream2.
352 string compressed_headers1 = compressor.CompressHeaders(headers_); 353 string compressed_headers1 = compressor.CompressHeaders(headers_);
353 QuicStreamFrame frame1( 354 QuicStreamFrame frame1(
354 stream2->id(), false, 0, MakeIOVector(compressed_headers1)); 355 stream2->id(), false, 0, MakeIOVector(compressed_headers1));
355 356
356 // Create frame with headers for stream4. 357 // Create frame with headers for stream4.
357 string compressed_headers2 = compressor.CompressHeaders(headers_); 358 string compressed_headers2 = compressor.CompressHeaders(headers_);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 session_.crypto_stream_.OnHandshakeMessage(msg); 391 session_.crypto_stream_.OnHandshakeMessage(msg);
391 EXPECT_EQ(kDefaultTimeoutSecs, 392 EXPECT_EQ(kDefaultTimeoutSecs,
392 QuicConnectionPeer::GetNetworkTimeout(connection_).ToSeconds()); 393 QuicConnectionPeer::GetNetworkTimeout(connection_).ToSeconds());
393 } 394 }
394 395
395 TEST_F(QuicSessionTest, ZombieStream) { 396 TEST_F(QuicSessionTest, ZombieStream) {
396 StrictMock<MockConnection>* connection = 397 StrictMock<MockConnection>* connection =
397 new StrictMock<MockConnection>(guid_, IPEndPoint(), false); 398 new StrictMock<MockConnection>(guid_, IPEndPoint(), false);
398 TestSession session(connection, /*is_server=*/ false); 399 TestSession session(connection, /*is_server=*/ false);
399 400
400 TestStream* stream3 = session.CreateOutgoingReliableStream(); 401 TestStream* stream3 = session.CreateOutgoingDataStream();
401 EXPECT_EQ(3u, stream3->id()); 402 EXPECT_EQ(3u, stream3->id());
402 TestStream* stream5 = session.CreateOutgoingReliableStream(); 403 TestStream* stream5 = session.CreateOutgoingDataStream();
403 EXPECT_EQ(5u, stream5->id()); 404 EXPECT_EQ(5u, stream5->id());
404 EXPECT_EQ(2u, session.GetNumOpenStreams()); 405 EXPECT_EQ(2u, session.GetNumOpenStreams());
405 406
406 // Reset the stream, but since the headers have not been decompressed 407 // Reset the stream, but since the headers have not been decompressed
407 // it will become a zombie and will continue to process data 408 // it will become a zombie and will continue to process data
408 // until the headers are decompressed. 409 // until the headers are decompressed.
409 EXPECT_CALL(*connection, SendRstStream(3, QUIC_STREAM_CANCELLED)); 410 EXPECT_CALL(*connection, SendRstStream(3, QUIC_STREAM_CANCELLED));
410 session.SendRstStream(3, QUIC_STREAM_CANCELLED); 411 session.SendRstStream(3, QUIC_STREAM_CANCELLED);
411 412
412 EXPECT_EQ(1u, session.GetNumOpenStreams()); 413 EXPECT_EQ(1u, session.GetNumOpenStreams());
(...skipping 17 matching lines...) Expand all
430 EXPECT_EQ(1u, session.GetNumOpenStreams()); 431 EXPECT_EQ(1u, session.GetNumOpenStreams());
431 432
432 EXPECT_TRUE(connection->connected()); 433 EXPECT_TRUE(connection->connected());
433 } 434 }
434 435
435 TEST_F(QuicSessionTest, ZombieStreamConnectionClose) { 436 TEST_F(QuicSessionTest, ZombieStreamConnectionClose) {
436 StrictMock<MockConnection>* connection = 437 StrictMock<MockConnection>* connection =
437 new StrictMock<MockConnection>(guid_, IPEndPoint(), false); 438 new StrictMock<MockConnection>(guid_, IPEndPoint(), false);
438 TestSession session(connection, /*is_server=*/ false); 439 TestSession session(connection, /*is_server=*/ false);
439 440
440 TestStream* stream3 = session.CreateOutgoingReliableStream(); 441 TestStream* stream3 = session.CreateOutgoingDataStream();
441 EXPECT_EQ(3u, stream3->id()); 442 EXPECT_EQ(3u, stream3->id());
442 TestStream* stream5 = session.CreateOutgoingReliableStream(); 443 TestStream* stream5 = session.CreateOutgoingDataStream();
443 EXPECT_EQ(5u, stream5->id()); 444 EXPECT_EQ(5u, stream5->id());
444 EXPECT_EQ(2u, session.GetNumOpenStreams()); 445 EXPECT_EQ(2u, session.GetNumOpenStreams());
445 446
446 stream3->CloseWriteSide(); 447 stream3->CloseWriteSide();
447 // Reset the stream, but since the headers have not been decompressed 448 // Reset the stream, but since the headers have not been decompressed
448 // it will become a zombie and will continue to process data 449 // it will become a zombie and will continue to process data
449 // until the headers are decompressed. 450 // until the headers are decompressed.
450 EXPECT_CALL(*connection, SendRstStream(3, QUIC_STREAM_CANCELLED)); 451 EXPECT_CALL(*connection, SendRstStream(3, QUIC_STREAM_CANCELLED));
451 session.SendRstStream(3, QUIC_STREAM_CANCELLED); 452 session.SendRstStream(3, QUIC_STREAM_CANCELLED);
452 453
(...skipping 18 matching lines...) Expand all
471 QUIC_STREAM_RST_BEFORE_HEADERS_DECOMPRESSED)); 472 QUIC_STREAM_RST_BEFORE_HEADERS_DECOMPRESSED));
472 473
473 QuicRstStreamFrame rst1(3, QUIC_STREAM_NO_ERROR); 474 QuicRstStreamFrame rst1(3, QUIC_STREAM_NO_ERROR);
474 session_.OnRstStream(rst1); 475 session_.OnRstStream(rst1);
475 EXPECT_EQ(0u, session_.GetNumOpenStreams()); 476 EXPECT_EQ(0u, session_.GetNumOpenStreams());
476 } 477 }
477 478
478 } // namespace 479 } // namespace
479 } // namespace test 480 } // namespace test
480 } // namespace net 481 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_session.cc ('k') | net/quic/quic_stream_sequencer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698