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

Side by Side Diff: net/spdy/spdy_session_spdy3_unittest.cc

Issue 10448083: Fix out of order SYN_STEAM frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 8 years, 5 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 | Annotate | Revision Log
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/spdy/spdy_session.h" 5 #include "net/spdy/spdy_session.h"
6 6
7 #include "net/base/host_cache.h" 7 #include "net/base/host_cache.h"
8 #include "net/base/ip_endpoint.h" 8 #include "net/base/ip_endpoint.h"
9 #include "net/base/net_log_unittest.h" 9 #include "net/base/net_log_unittest.h"
10 #include "net/spdy/spdy_io_buffer.h" 10 #include "net/spdy/spdy_io_buffer.h"
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 session->set_hung_interval(base::TimeDelta::FromSeconds(0)); 323 session->set_hung_interval(base::TimeDelta::FromSeconds(0));
324 324
325 // Send a PING frame. 325 // Send a PING frame.
326 session->WritePingFrame(1); 326 session->WritePingFrame(1);
327 EXPECT_LT(0, session->pings_in_flight()); 327 EXPECT_LT(0, session->pings_in_flight());
328 EXPECT_GE(session->next_ping_id(), static_cast<uint32>(1)); 328 EXPECT_GE(session->next_ping_id(), static_cast<uint32>(1));
329 EXPECT_TRUE(session->check_ping_status_pending()); 329 EXPECT_TRUE(session->check_ping_status_pending());
330 330
331 // Assert session is not closed. 331 // Assert session is not closed.
332 EXPECT_FALSE(session->IsClosed()); 332 EXPECT_FALSE(session->IsClosed());
333 EXPECT_LT(0u, session->num_active_streams()); 333 EXPECT_LT(0u, session->num_active_streams() + session->num_created_streams());
334 EXPECT_TRUE(spdy_session_pool->HasSession(pair)); 334 EXPECT_TRUE(spdy_session_pool->HasSession(pair));
335 335
336 // We set last time we have received any data in 1 sec less than now. 336 // We set last time we have received any data in 1 sec less than now.
337 // CheckPingStatus will trigger timeout because hung interval is zero. 337 // CheckPingStatus will trigger timeout because hung interval is zero.
338 base::TimeTicks now = base::TimeTicks::Now(); 338 base::TimeTicks now = base::TimeTicks::Now();
339 session->last_activity_time_ = now - base::TimeDelta::FromSeconds(1); 339 session->last_activity_time_ = now - base::TimeDelta::FromSeconds(1);
340 session->CheckPingStatus(now); 340 session->CheckPingStatus(now);
341 341
342 EXPECT_TRUE(session->IsClosed()); 342 EXPECT_TRUE(session->IsClosed());
343 EXPECT_EQ(0u, session->num_active_streams()); 343 EXPECT_EQ(0u, session->num_active_streams());
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 spdy_session_pool->CloseIdleSessions(); 443 spdy_session_pool->CloseIdleSessions();
444 EXPECT_TRUE(session1->is_active()); 444 EXPECT_TRUE(session1->is_active());
445 EXPECT_FALSE(session1->IsClosed()); 445 EXPECT_FALSE(session1->IsClosed());
446 EXPECT_TRUE(session2->is_active()); 446 EXPECT_TRUE(session2->is_active());
447 EXPECT_FALSE(session2->IsClosed()); 447 EXPECT_FALSE(session2->IsClosed());
448 EXPECT_TRUE(session3->is_active()); 448 EXPECT_TRUE(session3->is_active());
449 EXPECT_FALSE(session3->IsClosed()); 449 EXPECT_FALSE(session3->IsClosed());
450 450
451 // Make sessions 1 and 3 inactive, but keep them open. 451 // Make sessions 1 and 3 inactive, but keep them open.
452 // Session 2 still open and active 452 // Session 2 still open and active
453 session1->CloseStream(spdy_stream1->stream_id(), OK); 453 session1->CloseCreatedStream(spdy_stream1, OK);
454 session3->CloseStream(spdy_stream3->stream_id(), OK); 454 session3->CloseCreatedStream(spdy_stream3, OK);
455 EXPECT_FALSE(session1->is_active()); 455 EXPECT_FALSE(session1->is_active());
456 EXPECT_FALSE(session1->IsClosed()); 456 EXPECT_FALSE(session1->IsClosed());
457 EXPECT_TRUE(session2->is_active()); 457 EXPECT_TRUE(session2->is_active());
458 EXPECT_FALSE(session2->IsClosed()); 458 EXPECT_FALSE(session2->IsClosed());
459 EXPECT_FALSE(session3->is_active()); 459 EXPECT_FALSE(session3->is_active());
460 EXPECT_FALSE(session3->IsClosed()); 460 EXPECT_FALSE(session3->IsClosed());
461 461
462 // Should close session 1 and 3, 2 should be left open 462 // Should close session 1 and 3, 2 should be left open
463 spdy_session_pool->CloseIdleSessions(); 463 spdy_session_pool->CloseIdleSessions();
464 EXPECT_FALSE(session1->is_active()); 464 EXPECT_FALSE(session1->is_active());
465 EXPECT_TRUE(session1->IsClosed()); 465 EXPECT_TRUE(session1->IsClosed());
466 EXPECT_TRUE(session2->is_active()); 466 EXPECT_TRUE(session2->is_active());
467 EXPECT_FALSE(session2->IsClosed()); 467 EXPECT_FALSE(session2->IsClosed());
468 EXPECT_FALSE(session3->is_active()); 468 EXPECT_FALSE(session3->is_active());
469 EXPECT_TRUE(session3->IsClosed()); 469 EXPECT_TRUE(session3->IsClosed());
470 470
471 // Should not do anything 471 // Should not do anything
472 spdy_session_pool->CloseIdleSessions(); 472 spdy_session_pool->CloseIdleSessions();
473 EXPECT_TRUE(session2->is_active()); 473 EXPECT_TRUE(session2->is_active());
474 EXPECT_FALSE(session2->IsClosed()); 474 EXPECT_FALSE(session2->IsClosed());
475 475
476 // Make 2 not active 476 // Make 2 not active
477 session2->CloseStream(spdy_stream2->stream_id(), OK); 477 session2->CloseCreatedStream(spdy_stream2, OK);
478 EXPECT_FALSE(session2->is_active()); 478 EXPECT_FALSE(session2->is_active());
479 EXPECT_FALSE(session2->IsClosed()); 479 EXPECT_FALSE(session2->IsClosed());
480 480
481 // This should close session 2 481 // This should close session 2
482 spdy_session_pool->CloseIdleSessions(); 482 spdy_session_pool->CloseIdleSessions();
483 EXPECT_FALSE(session2->is_active()); 483 EXPECT_FALSE(session2->is_active());
484 EXPECT_TRUE(session2->IsClosed()); 484 EXPECT_TRUE(session2->IsClosed());
485 } 485 }
486 486
487 // Start with max concurrent streams set to 1. Request two streams. Receive a 487 // Start with max concurrent streams set to 1. Request two streams. Receive a
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 SettingsMap new_settings; 1186 SettingsMap new_settings;
1187 int32 window_size = 1; 1187 int32 window_size = 1;
1188 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = 1188 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] =
1189 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); 1189 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size);
1190 1190
1191 // Set up the socket so we read a SETTINGS frame that sets 1191 // Set up the socket so we read a SETTINGS frame that sets
1192 // INITIAL_WINDOW_SIZE. 1192 // INITIAL_WINDOW_SIZE.
1193 MockConnect connect_data(SYNCHRONOUS, OK); 1193 MockConnect connect_data(SYNCHRONOUS, OK);
1194 scoped_ptr<SpdyFrame> settings_frame(ConstructSpdySettings(new_settings)); 1194 scoped_ptr<SpdyFrame> settings_frame(ConstructSpdySettings(new_settings));
1195 MockRead reads[] = { 1195 MockRead reads[] = {
1196 CreateMockRead(*settings_frame), 1196 CreateMockRead(*settings_frame, 0),
1197 MockRead(SYNCHRONOUS, 0, 0) // EOF 1197 MockRead(ASYNC, 0, 2) // EOF
1198 }; 1198 };
1199 1199
1200 SpdySessionDependencies session_deps; 1200 SpdySessionDependencies session_deps;
1201
1201 session_deps.host_resolver->set_synchronous_mode(true); 1202 session_deps.host_resolver->set_synchronous_mode(true);
1202 1203
1203 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); 1204 scoped_refptr<DeterministicSocketData> data =
1204 data.set_connect_data(connect_data); 1205 new DeterministicSocketData(reads, arraysize(reads), NULL, 0);
1205 session_deps.socket_factory->AddSocketDataProvider(&data); 1206 data->set_connect_data(connect_data);
1207 session_deps.deterministic_socket_factory->AddSocketDataProvider(data);
1206 1208
1207 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); 1209 SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
1208 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl); 1210 session_deps.socket_factory->AddSSLSocketDataProvider(&ssl);
1209 1211
1210 scoped_refptr<HttpNetworkSession> http_session( 1212 scoped_refptr<HttpNetworkSession> http_session(
1211 SpdySessionDependencies::SpdyCreateSession(&session_deps)); 1213 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps));
1212 1214
1213 const std::string kTestHost("www.foo.com"); 1215 const std::string kTestHost("www.foo.com");
1214 const int kTestPort = 80; 1216 const int kTestPort = 80;
1215 HostPortPair test_host_port_pair(kTestHost, kTestPort); 1217 HostPortPair test_host_port_pair(kTestHost, kTestPort);
1216 HostPortProxyPair pair(test_host_port_pair, ProxyServer::Direct()); 1218 HostPortProxyPair pair(test_host_port_pair, ProxyServer::Direct());
1217 1219
1218 SpdySessionPool* spdy_session_pool(http_session->spdy_session_pool()); 1220 SpdySessionPool* spdy_session_pool(http_session->spdy_session_pool());
1219 1221
1220 // Create a session. 1222 // Create a session.
1221 EXPECT_FALSE(spdy_session_pool->HasSession(pair)); 1223 EXPECT_FALSE(spdy_session_pool->HasSession(pair));
(...skipping 19 matching lines...) Expand all
1241 TestCompletionCallback callback1; 1243 TestCompletionCallback callback1;
1242 GURL url("http://www.google.com"); 1244 GURL url("http://www.google.com");
1243 EXPECT_EQ(OK, 1245 EXPECT_EQ(OK,
1244 session->CreateStream(url, 1246 session->CreateStream(url,
1245 MEDIUM, /* priority, not important */ 1247 MEDIUM, /* priority, not important */
1246 &spdy_stream1, 1248 &spdy_stream1,
1247 BoundNetLog(), 1249 BoundNetLog(),
1248 callback1.callback())); 1250 callback1.callback()));
1249 EXPECT_NE(spdy_stream1->send_window_size(), window_size); 1251 EXPECT_NE(spdy_stream1->send_window_size(), window_size);
1250 1252
1253 data->RunFor(1); // Process the SETTINGS frame, but not the EOF
1251 MessageLoop::current()->RunAllPending(); 1254 MessageLoop::current()->RunAllPending();
1252 EXPECT_EQ(session->initial_send_window_size(), window_size); 1255 EXPECT_EQ(session->initial_send_window_size(), window_size);
1253 EXPECT_EQ(spdy_stream1->send_window_size(), window_size); 1256 EXPECT_EQ(spdy_stream1->send_window_size(), window_size);
1254 1257
1255 // Release the first one, this will allow the second to be created. 1258 // Release the first one, this will allow the second to be created.
1256 spdy_stream1->Cancel(); 1259 spdy_stream1->Cancel();
1257 spdy_stream1 = NULL; 1260 spdy_stream1 = NULL;
1258 1261
1259 scoped_refptr<SpdyStream> spdy_stream2; 1262 scoped_refptr<SpdyStream> spdy_stream2;
1260 EXPECT_EQ(OK, 1263 EXPECT_EQ(OK,
1261 session->CreateStream(url, 1264 session->CreateStream(url,
1262 MEDIUM, /* priority, not important */ 1265 MEDIUM, /* priority, not important */
1263 &spdy_stream2, 1266 &spdy_stream2,
1264 BoundNetLog(), 1267 BoundNetLog(),
1265 callback1.callback())); 1268 callback1.callback()));
1266 1269
1267 EXPECT_EQ(spdy_stream2->send_window_size(), window_size); 1270 EXPECT_EQ(spdy_stream2->send_window_size(), window_size);
1268 spdy_stream2->Cancel(); 1271 spdy_stream2->Cancel();
1269 spdy_stream2 = NULL; 1272 spdy_stream2 = NULL;
1270 } 1273 }
1271 1274
1272 TEST_F(SpdySessionSpdy3Test, OutOfOrderSynStreams) { 1275 TEST_F(SpdySessionSpdy3Test, OutOfOrderSynStreams) {
1273 // Construct the request. 1276 // Construct the request.
1274 MockConnect connect_data(SYNCHRONOUS, OK); 1277 MockConnect connect_data(SYNCHRONOUS, OK);
1275 scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 1278 scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, HIGHEST));
1276 scoped_ptr<SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, HIGHEST)); 1279 scoped_ptr<SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST));
1277 MockWrite writes[] = { 1280 MockWrite writes[] = {
1278 CreateMockWrite(*req1, 2), 1281 CreateMockWrite(*req1, 2),
1279 CreateMockWrite(*req2, 1), 1282 CreateMockWrite(*req2, 1),
1280 }; 1283 };
1281 1284
1282 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 3)); 1285 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 3));
1283 scoped_ptr<SpdyFrame> body1(ConstructSpdyBodyFrame(3, true)); 1286 scoped_ptr<SpdyFrame> body1(ConstructSpdyBodyFrame(3, true));
1284 scoped_ptr<SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 5)); 1287 scoped_ptr<SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 5));
1285 scoped_ptr<SpdyFrame> body2(ConstructSpdyBodyFrame(5, true)); 1288 scoped_ptr<SpdyFrame> body2(ConstructSpdyBodyFrame(5, true));
1286 MockRead reads[] = { 1289 MockRead reads[] = {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 http_session->GetTransportSocketPool( 1333 http_session->GetTransportSocketPool(
1331 HttpNetworkSession::NORMAL_SOCKET_POOL), 1334 HttpNetworkSession::NORMAL_SOCKET_POOL),
1332 BoundNetLog())); 1335 BoundNetLog()));
1333 EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK)); 1336 EXPECT_EQ(OK, session->InitializeWithSocket(connection.release(), false, OK));
1334 1337
1335 scoped_refptr<SpdyStream> spdy_stream1; 1338 scoped_refptr<SpdyStream> spdy_stream1;
1336 TestCompletionCallback callback1; 1339 TestCompletionCallback callback1;
1337 GURL url1("http://www.google.com"); 1340 GURL url1("http://www.google.com");
1338 EXPECT_EQ(OK, session->CreateStream(url1, LOWEST, &spdy_stream1, 1341 EXPECT_EQ(OK, session->CreateStream(url1, LOWEST, &spdy_stream1,
1339 BoundNetLog(), callback1.callback())); 1342 BoundNetLog(), callback1.callback()));
1340 EXPECT_EQ(1u, spdy_stream1->stream_id()); 1343 EXPECT_EQ(0u, spdy_stream1->stream_id());
1341 1344
1342 scoped_refptr<SpdyStream> spdy_stream2; 1345 scoped_refptr<SpdyStream> spdy_stream2;
1343 TestCompletionCallback callback2; 1346 TestCompletionCallback callback2;
1344 GURL url2("http://www.google.com"); 1347 GURL url2("http://www.google.com");
1345 EXPECT_EQ(OK, session->CreateStream(url2, HIGHEST, &spdy_stream2, 1348 EXPECT_EQ(OK, session->CreateStream(url2, HIGHEST, &spdy_stream2,
1346 BoundNetLog(), callback2.callback())); 1349 BoundNetLog(), callback2.callback()));
1347 EXPECT_EQ(3u, spdy_stream2->stream_id()); 1350 EXPECT_EQ(0u, spdy_stream2->stream_id());
1348 1351
1349 linked_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); 1352 linked_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock);
1350 (*headers)[":method"] = "GET"; 1353 (*headers)[":method"] = "GET";
1351 (*headers)[":scheme"] = url1.scheme(); 1354 (*headers)[":scheme"] = url1.scheme();
1352 (*headers)[":host"] = url1.host(); 1355 (*headers)[":host"] = url1.host();
1353 (*headers)[":path"] = url1.path(); 1356 (*headers)[":path"] = url1.path();
1354 (*headers)[":version"] = "HTTP/1.1"; 1357 (*headers)[":version"] = "HTTP/1.1";
1355 spdy_stream1->set_spdy_headers(headers); 1358 spdy_stream1->set_spdy_headers(headers);
1356 EXPECT_TRUE(spdy_stream1->HasUrl()); 1359 EXPECT_TRUE(spdy_stream1->HasUrl());
1357 1360
1358 spdy_stream2->set_spdy_headers(headers); 1361 spdy_stream2->set_spdy_headers(headers);
1359 EXPECT_TRUE(spdy_stream2->HasUrl()); 1362 EXPECT_TRUE(spdy_stream2->HasUrl());
1360 1363
1361 spdy_stream1->SendRequest(false); 1364 spdy_stream1->SendRequest(false);
1362 spdy_stream2->SendRequest(false); 1365 spdy_stream2->SendRequest(false);
1363 MessageLoop::current()->RunAllPending(); 1366 MessageLoop::current()->RunAllPending();
1364 1367
1365 EXPECT_EQ(1u, spdy_stream1->stream_id()); 1368 EXPECT_EQ(3u, spdy_stream1->stream_id());
1366 EXPECT_EQ(3u, spdy_stream2->stream_id()); 1369 EXPECT_EQ(1u, spdy_stream2->stream_id());
1367 1370
1368 spdy_stream1->Cancel(); 1371 spdy_stream1->Cancel();
1369 spdy_stream1 = NULL; 1372 spdy_stream1 = NULL;
1370 1373
1371 spdy_stream2->Cancel(); 1374 spdy_stream2->Cancel();
1372 spdy_stream2 = NULL; 1375 spdy_stream2 = NULL;
1373 } 1376 }
1374 1377
1375 } // namespace net 1378 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698