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/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/base64.h" | 10 #include "base/base64.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "net/socket/next_proto.h" | 28 #include "net/socket/next_proto.h" |
29 #include "net/socket/socket_test_util.h" | 29 #include "net/socket/socket_test_util.h" |
30 #include "net/spdy/spdy_http_utils.h" | 30 #include "net/spdy/spdy_http_utils.h" |
31 #include "net/spdy/spdy_session_pool.h" | 31 #include "net/spdy/spdy_session_pool.h" |
32 #include "net/spdy/spdy_session_test_util.h" | 32 #include "net/spdy/spdy_session_test_util.h" |
33 #include "net/spdy/spdy_stream.h" | 33 #include "net/spdy/spdy_stream.h" |
34 #include "net/spdy/spdy_stream_test_util.h" | 34 #include "net/spdy/spdy_stream_test_util.h" |
35 #include "net/spdy/spdy_test_util_common.h" | 35 #include "net/spdy/spdy_test_util_common.h" |
36 #include "net/spdy/spdy_test_utils.h" | 36 #include "net/spdy/spdy_test_utils.h" |
37 #include "net/test/cert_test_util.h" | 37 #include "net/test/cert_test_util.h" |
| 38 #include "net/test/gtest_util.h" |
38 #include "net/test/test_data_directory.h" | 39 #include "net/test/test_data_directory.h" |
39 #include "testing/gmock/include/gmock/gmock.h" | 40 #include "testing/gmock/include/gmock/gmock.h" |
40 #include "testing/platform_test.h" | 41 #include "testing/platform_test.h" |
41 | 42 |
| 43 using net::test::IsError; |
| 44 using net::test::IsOk; |
| 45 |
42 namespace net { | 46 namespace net { |
43 | 47 |
44 namespace { | 48 namespace { |
45 | 49 |
46 enum TestCase { | 50 enum TestCase { |
47 // Test using the SPDY/3.1 protocol. | 51 // Test using the SPDY/3.1 protocol. |
48 kTestCaseSPDY31, | 52 kTestCaseSPDY31, |
49 | 53 |
50 // Test using the HTTP/2 protocol, without specifying a stream | 54 // Test using the HTTP/2 protocol, without specifying a stream |
51 // dependency based on the RequestPriority. | 55 // dependency based on the RequestPriority. |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 // |callback2| is never called. | 316 // |callback2| is never called. |
313 TestCompletionCallback callback2; | 317 TestCompletionCallback callback2; |
314 ASSERT_EQ(ERR_IO_PENDING, request2->StartRequest( | 318 ASSERT_EQ(ERR_IO_PENDING, request2->StartRequest( |
315 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, | 319 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, |
316 MEDIUM, BoundNetLog(), callback2.callback())); | 320 MEDIUM, BoundNetLog(), callback2.callback())); |
317 | 321 |
318 callback1.SetRequestToDestroy(std::move(request2)); | 322 callback1.SetRequestToDestroy(std::move(request2)); |
319 | 323 |
320 session_->CloseSessionOnError(ERR_ABORTED, "Aborting session"); | 324 session_->CloseSessionOnError(ERR_ABORTED, "Aborting session"); |
321 | 325 |
322 EXPECT_EQ(ERR_ABORTED, callback1.WaitForResult()); | 326 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_ABORTED)); |
323 } | 327 } |
324 | 328 |
325 // A session receiving a GOAWAY frame with no active streams should close. | 329 // A session receiving a GOAWAY frame with no active streams should close. |
326 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { | 330 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { |
327 session_deps_.host_resolver->set_synchronous_mode(true); | 331 session_deps_.host_resolver->set_synchronous_mode(true); |
328 | 332 |
329 std::unique_ptr<SpdySerializedFrame> goaway( | 333 std::unique_ptr<SpdySerializedFrame> goaway( |
330 spdy_util_.ConstructSpdyGoAway(1)); | 334 spdy_util_.ConstructSpdyGoAway(1)); |
331 MockRead reads[] = { | 335 MockRead reads[] = { |
332 CreateMockRead(*goaway, 0), | 336 CreateMockRead(*goaway, 0), |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 | 717 |
714 std::unique_ptr<SpdyHeaderBlock> headers( | 718 std::unique_ptr<SpdyHeaderBlock> headers( |
715 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 719 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
716 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 720 spdy_stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
717 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 721 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
718 | 722 |
719 base::RunLoop().RunUntilIdle(); | 723 base::RunLoop().RunUntilIdle(); |
720 | 724 |
721 // Stream and session closed gracefully. | 725 // Stream and session closed gracefully. |
722 EXPECT_TRUE(delegate.StreamIsClosed()); | 726 EXPECT_TRUE(delegate.StreamIsClosed()); |
723 EXPECT_EQ(OK, delegate.WaitForClose()); | 727 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
724 EXPECT_EQ(kUploadData, delegate.TakeReceivedData()); | 728 EXPECT_EQ(kUploadData, delegate.TakeReceivedData()); |
725 EXPECT_FALSE(session_); | 729 EXPECT_FALSE(session_); |
726 } | 730 } |
727 | 731 |
728 // Try to create a stream after receiving a GOAWAY frame. It should | 732 // Try to create a stream after receiving a GOAWAY frame. It should |
729 // fail. | 733 // fail. |
730 TEST_P(SpdySessionTest, CreateStreamAfterGoAway) { | 734 TEST_P(SpdySessionTest, CreateStreamAfterGoAway) { |
731 session_deps_.host_resolver->set_synchronous_mode(true); | 735 session_deps_.host_resolver->set_synchronous_mode(true); |
732 | 736 |
733 std::unique_ptr<SpdySerializedFrame> goaway( | 737 std::unique_ptr<SpdySerializedFrame> goaway( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 data.Resume(); | 775 data.Resume(); |
772 base::RunLoop().RunUntilIdle(); | 776 base::RunLoop().RunUntilIdle(); |
773 | 777 |
774 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 778 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
775 EXPECT_TRUE(session_->IsStreamActive(1)); | 779 EXPECT_TRUE(session_->IsStreamActive(1)); |
776 | 780 |
777 SpdyStreamRequest stream_request; | 781 SpdyStreamRequest stream_request; |
778 int rv = stream_request.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, session_, | 782 int rv = stream_request.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, session_, |
779 test_url_, MEDIUM, BoundNetLog(), | 783 test_url_, MEDIUM, BoundNetLog(), |
780 CompletionCallback()); | 784 CompletionCallback()); |
781 EXPECT_EQ(ERR_FAILED, rv); | 785 EXPECT_THAT(rv, IsError(ERR_FAILED)); |
782 | 786 |
783 EXPECT_TRUE(session_); | 787 EXPECT_TRUE(session_); |
784 data.Resume(); | 788 data.Resume(); |
785 base::RunLoop().RunUntilIdle(); | 789 base::RunLoop().RunUntilIdle(); |
786 EXPECT_FALSE(session_); | 790 EXPECT_FALSE(session_); |
787 } | 791 } |
788 | 792 |
789 // Receiving a SYN_STREAM frame after a GOAWAY frame should result in | 793 // Receiving a SYN_STREAM frame after a GOAWAY frame should result in |
790 // the stream being refused. | 794 // the stream being refused. |
791 TEST_P(SpdySessionTest, SynStreamAfterGoAway) { | 795 TEST_P(SpdySessionTest, SynStreamAfterGoAway) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 session_->CheckPingStatus(before_ping_time); | 953 session_->CheckPingStatus(before_ping_time); |
950 | 954 |
951 EXPECT_EQ(0, session_->pings_in_flight()); | 955 EXPECT_EQ(0, session_->pings_in_flight()); |
952 EXPECT_GE(session_->next_ping_id(), 1U); | 956 EXPECT_GE(session_->next_ping_id(), 1U); |
953 EXPECT_FALSE(session_->check_ping_status_pending()); | 957 EXPECT_FALSE(session_->check_ping_status_pending()); |
954 EXPECT_GE(session_->last_activity_time(), before_ping_time); | 958 EXPECT_GE(session_->last_activity_time(), before_ping_time); |
955 | 959 |
956 data.Resume(); | 960 data.Resume(); |
957 base::RunLoop().RunUntilIdle(); | 961 base::RunLoop().RunUntilIdle(); |
958 | 962 |
959 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 963 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
960 | 964 |
961 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 965 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
962 EXPECT_FALSE(session_); | 966 EXPECT_FALSE(session_); |
963 } | 967 } |
964 | 968 |
965 TEST_P(SpdySessionTest, ServerPing) { | 969 TEST_P(SpdySessionTest, ServerPing) { |
966 session_deps_.host_resolver->set_synchronous_mode(true); | 970 session_deps_.host_resolver->set_synchronous_mode(true); |
967 | 971 |
968 std::unique_ptr<SpdySerializedFrame> read_ping( | 972 std::unique_ptr<SpdySerializedFrame> read_ping( |
969 spdy_util_.ConstructSpdyPing(2, false)); | 973 spdy_util_.ConstructSpdyPing(2, false)); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1143 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))), | 1147 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))), |
1144 NO_MORE_DATA_TO_SEND); | 1148 NO_MORE_DATA_TO_SEND); |
1145 base::RunLoop().RunUntilIdle(); | 1149 base::RunLoop().RunUntilIdle(); |
1146 | 1150 |
1147 // Active streams remain active. | 1151 // Active streams remain active. |
1148 EXPECT_EQ(kLastStreamId, stream2->stream_id()); | 1152 EXPECT_EQ(kLastStreamId, stream2->stream_id()); |
1149 EXPECT_EQ(2u, session_->num_active_streams()); | 1153 EXPECT_EQ(2u, session_->num_active_streams()); |
1150 | 1154 |
1151 // Session is going away. Created and stalled streams were aborted. | 1155 // Session is going away. Created and stalled streams were aborted. |
1152 EXPECT_EQ(SpdySession::STATE_GOING_AWAY, session_->availability_state_); | 1156 EXPECT_EQ(SpdySession::STATE_GOING_AWAY, session_->availability_state_); |
1153 EXPECT_EQ(ERR_ABORTED, delegate3.WaitForClose()); | 1157 EXPECT_THAT(delegate3.WaitForClose(), IsError(ERR_ABORTED)); |
1154 EXPECT_EQ(ERR_ABORTED, callback4.WaitForResult()); | 1158 EXPECT_THAT(callback4.WaitForResult(), IsError(ERR_ABORTED)); |
1155 EXPECT_EQ(0u, session_->num_created_streams()); | 1159 EXPECT_EQ(0u, session_->num_created_streams()); |
1156 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); | 1160 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); |
1157 | 1161 |
1158 // Read responses on remaining active streams. | 1162 // Read responses on remaining active streams. |
1159 data.Resume(); | 1163 data.Resume(); |
1160 base::RunLoop().RunUntilIdle(); | 1164 base::RunLoop().RunUntilIdle(); |
1161 EXPECT_EQ(OK, delegate1.WaitForClose()); | 1165 EXPECT_THAT(delegate1.WaitForClose(), IsOk()); |
1162 EXPECT_EQ(kUploadData, delegate1.TakeReceivedData()); | 1166 EXPECT_EQ(kUploadData, delegate1.TakeReceivedData()); |
1163 EXPECT_EQ(OK, delegate2.WaitForClose()); | 1167 EXPECT_THAT(delegate2.WaitForClose(), IsOk()); |
1164 EXPECT_EQ(kUploadData, delegate2.TakeReceivedData()); | 1168 EXPECT_EQ(kUploadData, delegate2.TakeReceivedData()); |
1165 | 1169 |
1166 // Session was destroyed. | 1170 // Session was destroyed. |
1167 EXPECT_FALSE(session_); | 1171 EXPECT_FALSE(session_); |
1168 } | 1172 } |
1169 | 1173 |
1170 // Regression test for https://crbug.com/481009. | 1174 // Regression test for https://crbug.com/481009. |
1171 TEST_P(SpdySessionTest, MaxConcurrentStreamsZero) { | 1175 TEST_P(SpdySessionTest, MaxConcurrentStreamsZero) { |
1172 session_deps_.host_resolver->set_synchronous_mode(true); | 1176 session_deps_.host_resolver->set_synchronous_mode(true); |
1173 | 1177 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1234 // Receive SETTINGS frame that sets max_concurrent_streams to zero. | 1238 // Receive SETTINGS frame that sets max_concurrent_streams to zero. |
1235 base::RunLoop().RunUntilIdle(); | 1239 base::RunLoop().RunUntilIdle(); |
1236 EXPECT_EQ(0u, session_->max_concurrent_streams_); | 1240 EXPECT_EQ(0u, session_->max_concurrent_streams_); |
1237 | 1241 |
1238 // Start request. | 1242 // Start request. |
1239 SpdyStreamRequest request; | 1243 SpdyStreamRequest request; |
1240 TestCompletionCallback callback; | 1244 TestCompletionCallback callback; |
1241 int rv = | 1245 int rv = |
1242 request.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, | 1246 request.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, |
1243 MEDIUM, BoundNetLog(), callback.callback()); | 1247 MEDIUM, BoundNetLog(), callback.callback()); |
1244 EXPECT_EQ(ERR_IO_PENDING, rv); | 1248 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
1245 | 1249 |
1246 // Stream is stalled. | 1250 // Stream is stalled. |
1247 EXPECT_EQ(1u, session_->pending_create_stream_queue_size(MEDIUM)); | 1251 EXPECT_EQ(1u, session_->pending_create_stream_queue_size(MEDIUM)); |
1248 EXPECT_EQ(0u, session_->num_created_streams()); | 1252 EXPECT_EQ(0u, session_->num_created_streams()); |
1249 | 1253 |
1250 // Receive SETTINGS frame that sets max_concurrent_streams to one. | 1254 // Receive SETTINGS frame that sets max_concurrent_streams to one. |
1251 data.Resume(); | 1255 data.Resume(); |
1252 base::RunLoop().RunUntilIdle(); | 1256 base::RunLoop().RunUntilIdle(); |
1253 EXPECT_EQ(1u, session_->max_concurrent_streams_); | 1257 EXPECT_EQ(1u, session_->max_concurrent_streams_); |
1254 | 1258 |
1255 // Stream is created. | 1259 // Stream is created. |
1256 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); | 1260 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); |
1257 EXPECT_EQ(1u, session_->num_created_streams()); | 1261 EXPECT_EQ(1u, session_->num_created_streams()); |
1258 | 1262 |
1259 EXPECT_EQ(OK, callback.WaitForResult()); | 1263 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
1260 | 1264 |
1261 // Send request. | 1265 // Send request. |
1262 base::WeakPtr<SpdyStream> stream = request.ReleaseStream(); | 1266 base::WeakPtr<SpdyStream> stream = request.ReleaseStream(); |
1263 test::StreamDelegateDoNothing delegate(stream); | 1267 test::StreamDelegateDoNothing delegate(stream); |
1264 stream->SetDelegate(&delegate); | 1268 stream->SetDelegate(&delegate); |
1265 std::unique_ptr<SpdyHeaderBlock> headers( | 1269 std::unique_ptr<SpdyHeaderBlock> headers( |
1266 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); | 1270 new SpdyHeaderBlock(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl))); |
1267 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); | 1271 stream->SendRequestHeaders(std::move(headers), NO_MORE_DATA_TO_SEND); |
1268 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 1272 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
1269 | 1273 |
1270 EXPECT_EQ(OK, delegate.WaitForClose()); | 1274 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
1271 EXPECT_EQ("hello!", delegate.TakeReceivedData()); | 1275 EXPECT_EQ("hello!", delegate.TakeReceivedData()); |
1272 | 1276 |
1273 // Session is destroyed. | 1277 // Session is destroyed. |
1274 EXPECT_FALSE(session_); | 1278 EXPECT_FALSE(session_); |
1275 } | 1279 } |
1276 | 1280 |
1277 // Verifies that an unstalled pending stream creation racing with a new stream | 1281 // Verifies that an unstalled pending stream creation racing with a new stream |
1278 // creation doesn't violate the maximum stream concurrency. Regression test for | 1282 // creation doesn't violate the maximum stream concurrency. Regression test for |
1279 // crbug.com/373858. | 1283 // crbug.com/373858. |
1280 TEST_P(SpdySessionTest, UnstallRacesWithStreamCreation) { | 1284 TEST_P(SpdySessionTest, UnstallRacesWithStreamCreation) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 EXPECT_EQ(1u, session_->num_created_streams()); | 1330 EXPECT_EQ(1u, session_->num_created_streams()); |
1327 EXPECT_EQ(1u, session_->pending_create_stream_queue_size(MEDIUM)); | 1331 EXPECT_EQ(1u, session_->pending_create_stream_queue_size(MEDIUM)); |
1328 | 1332 |
1329 // Cancel the third stream and run the message loop. Verify that the second | 1333 // Cancel the third stream and run the message loop. Verify that the second |
1330 // stream creation now completes. | 1334 // stream creation now completes. |
1331 stream3->Cancel(); | 1335 stream3->Cancel(); |
1332 base::RunLoop().RunUntilIdle(); | 1336 base::RunLoop().RunUntilIdle(); |
1333 | 1337 |
1334 EXPECT_EQ(1u, session_->num_created_streams()); | 1338 EXPECT_EQ(1u, session_->num_created_streams()); |
1335 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); | 1339 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); |
1336 EXPECT_EQ(OK, callback2.WaitForResult()); | 1340 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
1337 } | 1341 } |
1338 | 1342 |
1339 TEST_P(SpdySessionTest, DeleteExpiredPushStreams) { | 1343 TEST_P(SpdySessionTest, DeleteExpiredPushStreams) { |
1340 session_deps_.host_resolver->set_synchronous_mode(true); | 1344 session_deps_.host_resolver->set_synchronous_mode(true); |
1341 session_deps_.time_func = TheNearFuture; | 1345 session_deps_.time_func = TheNearFuture; |
1342 | 1346 |
1343 std::unique_ptr<SpdySerializedFrame> req( | 1347 std::unique_ptr<SpdySerializedFrame> req( |
1344 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1348 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
1345 std::unique_ptr<SpdySerializedFrame> rst( | 1349 std::unique_ptr<SpdySerializedFrame> rst( |
1346 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 1350 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1513 | 1517 |
1514 StreamReleaserCallback stream_releaser; | 1518 StreamReleaserCallback stream_releaser; |
1515 SpdyStreamRequest request; | 1519 SpdyStreamRequest request; |
1516 ASSERT_EQ(ERR_IO_PENDING, | 1520 ASSERT_EQ(ERR_IO_PENDING, |
1517 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, | 1521 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, |
1518 MEDIUM, BoundNetLog(), | 1522 MEDIUM, BoundNetLog(), |
1519 stream_releaser.MakeCallback(&request))); | 1523 stream_releaser.MakeCallback(&request))); |
1520 | 1524 |
1521 base::RunLoop().RunUntilIdle(); | 1525 base::RunLoop().RunUntilIdle(); |
1522 | 1526 |
1523 EXPECT_EQ(OK, stream_releaser.WaitForResult()); | 1527 EXPECT_THAT(stream_releaser.WaitForResult(), IsOk()); |
1524 | 1528 |
1525 data.Resume(); | 1529 data.Resume(); |
1526 base::RunLoop().RunUntilIdle(); | 1530 base::RunLoop().RunUntilIdle(); |
1527 EXPECT_FALSE(session_); | 1531 EXPECT_FALSE(session_); |
1528 | 1532 |
1529 EXPECT_TRUE(data.AllWriteDataConsumed()); | 1533 EXPECT_TRUE(data.AllWriteDataConsumed()); |
1530 EXPECT_TRUE(data.AllReadDataConsumed()); | 1534 EXPECT_TRUE(data.AllReadDataConsumed()); |
1531 } | 1535 } |
1532 | 1536 |
1533 // Start with a persisted value for max concurrent streams. Receive a | 1537 // Start with a persisted value for max concurrent streams. Receive a |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 StreamReleaserCallback stream_releaser; | 1599 StreamReleaserCallback stream_releaser; |
1596 | 1600 |
1597 SpdyStreamRequest request; | 1601 SpdyStreamRequest request; |
1598 ASSERT_EQ(ERR_IO_PENDING, | 1602 ASSERT_EQ(ERR_IO_PENDING, |
1599 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, | 1603 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, |
1600 MEDIUM, BoundNetLog(), | 1604 MEDIUM, BoundNetLog(), |
1601 stream_releaser.MakeCallback(&request))); | 1605 stream_releaser.MakeCallback(&request))); |
1602 | 1606 |
1603 base::RunLoop().RunUntilIdle(); | 1607 base::RunLoop().RunUntilIdle(); |
1604 | 1608 |
1605 EXPECT_EQ(OK, stream_releaser.WaitForResult()); | 1609 EXPECT_THAT(stream_releaser.WaitForResult(), IsOk()); |
1606 | 1610 |
1607 // Make sure that persisted data is cleared. | 1611 // Make sure that persisted data is cleared. |
1608 EXPECT_TRUE(spdy_session_pool_->http_server_properties() | 1612 EXPECT_TRUE(spdy_session_pool_->http_server_properties() |
1609 ->GetSpdySettings(test_server_) | 1613 ->GetSpdySettings(test_server_) |
1610 .empty()); | 1614 .empty()); |
1611 | 1615 |
1612 // Make sure session's max_concurrent_streams is correct. | 1616 // Make sure session's max_concurrent_streams is correct. |
1613 EXPECT_EQ(kInitialMaxConcurrentStreams + 1, | 1617 EXPECT_EQ(kInitialMaxConcurrentStreams + 1, |
1614 session_->max_concurrent_streams_); | 1618 session_->max_concurrent_streams_); |
1615 | 1619 |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1837 ASSERT_TRUE(entry.GetStringValue("debug_data", &debug_data)); | 1841 ASSERT_TRUE(entry.GetStringValue("debug_data", &debug_data)); |
1838 EXPECT_EQ("foo", debug_data); | 1842 EXPECT_EQ("foo", debug_data); |
1839 } | 1843 } |
1840 | 1844 |
1841 // Check that we logged SPDY_SESSION_CLOSE correctly. | 1845 // Check that we logged SPDY_SESSION_CLOSE correctly. |
1842 int pos = ExpectLogContainsSomewhere( | 1846 int pos = ExpectLogContainsSomewhere( |
1843 entries, 0, NetLog::TYPE_HTTP2_SESSION_CLOSE, NetLog::PHASE_NONE); | 1847 entries, 0, NetLog::TYPE_HTTP2_SESSION_CLOSE, NetLog::PHASE_NONE); |
1844 TestNetLogEntry entry = entries[pos]; | 1848 TestNetLogEntry entry = entries[pos]; |
1845 int error_code = 0; | 1849 int error_code = 0; |
1846 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); | 1850 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); |
1847 EXPECT_EQ(OK, error_code); | 1851 EXPECT_THAT(error_code, IsOk()); |
1848 } | 1852 } |
1849 | 1853 |
1850 TEST_P(SpdySessionTest, NetLogOnSessionEOF) { | 1854 TEST_P(SpdySessionTest, NetLogOnSessionEOF) { |
1851 session_deps_.host_resolver->set_synchronous_mode(true); | 1855 session_deps_.host_resolver->set_synchronous_mode(true); |
1852 | 1856 |
1853 MockRead reads[] = { | 1857 MockRead reads[] = { |
1854 MockRead(SYNCHRONOUS, 0, 0) // EOF | 1858 MockRead(SYNCHRONOUS, 0, 0) // EOF |
1855 }; | 1859 }; |
1856 | 1860 |
1857 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 1861 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
(...skipping 15 matching lines...) Expand all Loading... |
1873 EXPECT_LT(0u, entries.size()); | 1877 EXPECT_LT(0u, entries.size()); |
1874 | 1878 |
1875 // Check that we logged SPDY_SESSION_CLOSE correctly. | 1879 // Check that we logged SPDY_SESSION_CLOSE correctly. |
1876 int pos = ExpectLogContainsSomewhere( | 1880 int pos = ExpectLogContainsSomewhere( |
1877 entries, 0, NetLog::TYPE_HTTP2_SESSION_CLOSE, NetLog::PHASE_NONE); | 1881 entries, 0, NetLog::TYPE_HTTP2_SESSION_CLOSE, NetLog::PHASE_NONE); |
1878 | 1882 |
1879 if (pos < static_cast<int>(entries.size())) { | 1883 if (pos < static_cast<int>(entries.size())) { |
1880 TestNetLogEntry entry = entries[pos]; | 1884 TestNetLogEntry entry = entries[pos]; |
1881 int error_code = 0; | 1885 int error_code = 0; |
1882 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); | 1886 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); |
1883 EXPECT_EQ(ERR_CONNECTION_CLOSED, error_code); | 1887 EXPECT_THAT(error_code, IsError(ERR_CONNECTION_CLOSED)); |
1884 } else { | 1888 } else { |
1885 ADD_FAILURE(); | 1889 ADD_FAILURE(); |
1886 } | 1890 } |
1887 } | 1891 } |
1888 | 1892 |
1889 TEST_P(SpdySessionTest, SynCompressionHistograms) { | 1893 TEST_P(SpdySessionTest, SynCompressionHistograms) { |
1890 std::unique_ptr<SpdySerializedFrame> req( | 1894 std::unique_ptr<SpdySerializedFrame> req( |
1891 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1895 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
1892 MockWrite writes[] = { | 1896 MockWrite writes[] = { |
1893 CreateMockWrite(*req, 0), | 1897 CreateMockWrite(*req, 0), |
(...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2690 | 2694 |
2691 EXPECT_EQ(0u, session_->num_active_streams()); | 2695 EXPECT_EQ(0u, session_->num_active_streams()); |
2692 EXPECT_EQ(kInitialMaxConcurrentStreams, session_->num_created_streams()); | 2696 EXPECT_EQ(kInitialMaxConcurrentStreams, session_->num_created_streams()); |
2693 EXPECT_EQ(2u, session_->pending_create_stream_queue_size(LOWEST)); | 2697 EXPECT_EQ(2u, session_->pending_create_stream_queue_size(LOWEST)); |
2694 | 2698 |
2695 // Cancel the first stream; this will allow the second stream to be created. | 2699 // Cancel the first stream; this will allow the second stream to be created. |
2696 EXPECT_TRUE(spdy_stream1); | 2700 EXPECT_TRUE(spdy_stream1); |
2697 spdy_stream1->Cancel(); | 2701 spdy_stream1->Cancel(); |
2698 EXPECT_FALSE(spdy_stream1); | 2702 EXPECT_FALSE(spdy_stream1); |
2699 | 2703 |
2700 EXPECT_EQ(OK, callback2.WaitForResult()); | 2704 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
2701 EXPECT_EQ(0u, session_->num_active_streams()); | 2705 EXPECT_EQ(0u, session_->num_active_streams()); |
2702 EXPECT_EQ(kInitialMaxConcurrentStreams, session_->num_created_streams()); | 2706 EXPECT_EQ(kInitialMaxConcurrentStreams, session_->num_created_streams()); |
2703 EXPECT_EQ(1u, session_->pending_create_stream_queue_size(LOWEST)); | 2707 EXPECT_EQ(1u, session_->pending_create_stream_queue_size(LOWEST)); |
2704 | 2708 |
2705 // Cancel the second stream; this will allow the third stream to be created. | 2709 // Cancel the second stream; this will allow the third stream to be created. |
2706 base::WeakPtr<SpdyStream> spdy_stream2 = request2.ReleaseStream(); | 2710 base::WeakPtr<SpdyStream> spdy_stream2 = request2.ReleaseStream(); |
2707 spdy_stream2->Cancel(); | 2711 spdy_stream2->Cancel(); |
2708 EXPECT_FALSE(spdy_stream2); | 2712 EXPECT_FALSE(spdy_stream2); |
2709 | 2713 |
2710 EXPECT_EQ(OK, callback3.WaitForResult()); | 2714 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
2711 EXPECT_EQ(0u, session_->num_active_streams()); | 2715 EXPECT_EQ(0u, session_->num_active_streams()); |
2712 EXPECT_EQ(kInitialMaxConcurrentStreams, session_->num_created_streams()); | 2716 EXPECT_EQ(kInitialMaxConcurrentStreams, session_->num_created_streams()); |
2713 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(LOWEST)); | 2717 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(LOWEST)); |
2714 | 2718 |
2715 // Cancel the third stream. | 2719 // Cancel the third stream. |
2716 base::WeakPtr<SpdyStream> spdy_stream3 = request3.ReleaseStream(); | 2720 base::WeakPtr<SpdyStream> spdy_stream3 = request3.ReleaseStream(); |
2717 spdy_stream3->Cancel(); | 2721 spdy_stream3->Cancel(); |
2718 EXPECT_FALSE(spdy_stream3); | 2722 EXPECT_FALSE(spdy_stream3); |
2719 EXPECT_EQ(0u, session_->num_active_streams()); | 2723 EXPECT_EQ(0u, session_->num_active_streams()); |
2720 EXPECT_EQ(kInitialMaxConcurrentStreams - 1, session_->num_created_streams()); | 2724 EXPECT_EQ(kInitialMaxConcurrentStreams - 1, session_->num_created_streams()); |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3251 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); | 3255 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); |
3252 std::unique_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); | 3256 std::unique_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); |
3253 EXPECT_EQ(ERR_IO_PENDING, | 3257 EXPECT_EQ(ERR_IO_PENDING, |
3254 connection2->Init(host_port2.ToString(), params2, DEFAULT_PRIORITY, | 3258 connection2->Init(host_port2.ToString(), params2, DEFAULT_PRIORITY, |
3255 ClientSocketPool::RespectLimits::ENABLED, | 3259 ClientSocketPool::RespectLimits::ENABLED, |
3256 callback2.callback(), pool, BoundNetLog())); | 3260 callback2.callback(), pool, BoundNetLog())); |
3257 EXPECT_TRUE(pool->IsStalled()); | 3261 EXPECT_TRUE(pool->IsStalled()); |
3258 | 3262 |
3259 // The socket pool should close the connection asynchronously and establish a | 3263 // The socket pool should close the connection asynchronously and establish a |
3260 // new connection. | 3264 // new connection. |
3261 EXPECT_EQ(OK, callback2.WaitForResult()); | 3265 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
3262 EXPECT_FALSE(pool->IsStalled()); | 3266 EXPECT_FALSE(pool->IsStalled()); |
3263 EXPECT_FALSE(session_); | 3267 EXPECT_FALSE(session_); |
3264 } | 3268 } |
3265 | 3269 |
3266 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 3270 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
3267 // pointers to the idle session are currently held, in the case the SPDY session | 3271 // pointers to the idle session are currently held, in the case the SPDY session |
3268 // has an alias. | 3272 // has an alias. |
3269 TEST_P(SpdySessionTest, CloseOneIdleConnectionWithAlias) { | 3273 TEST_P(SpdySessionTest, CloseOneIdleConnectionWithAlias) { |
3270 ClientSocketPoolManager::set_max_sockets_per_group( | 3274 ClientSocketPoolManager::set_max_sockets_per_group( |
3271 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3275 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3326 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); | 3330 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); |
3327 std::unique_ptr<ClientSocketHandle> connection3(new ClientSocketHandle); | 3331 std::unique_ptr<ClientSocketHandle> connection3(new ClientSocketHandle); |
3328 EXPECT_EQ(ERR_IO_PENDING, | 3332 EXPECT_EQ(ERR_IO_PENDING, |
3329 connection3->Init(host_port3.ToString(), params3, DEFAULT_PRIORITY, | 3333 connection3->Init(host_port3.ToString(), params3, DEFAULT_PRIORITY, |
3330 ClientSocketPool::RespectLimits::ENABLED, | 3334 ClientSocketPool::RespectLimits::ENABLED, |
3331 callback3.callback(), pool, BoundNetLog())); | 3335 callback3.callback(), pool, BoundNetLog())); |
3332 EXPECT_TRUE(pool->IsStalled()); | 3336 EXPECT_TRUE(pool->IsStalled()); |
3333 | 3337 |
3334 // The socket pool should close the connection asynchronously and establish a | 3338 // The socket pool should close the connection asynchronously and establish a |
3335 // new connection. | 3339 // new connection. |
3336 EXPECT_EQ(OK, callback3.WaitForResult()); | 3340 EXPECT_THAT(callback3.WaitForResult(), IsOk()); |
3337 EXPECT_FALSE(pool->IsStalled()); | 3341 EXPECT_FALSE(pool->IsStalled()); |
3338 EXPECT_FALSE(session1); | 3342 EXPECT_FALSE(session1); |
3339 EXPECT_FALSE(session2); | 3343 EXPECT_FALSE(session2); |
3340 } | 3344 } |
3341 | 3345 |
3342 // Tests that when a SPDY session becomes idle, it closes itself if there is | 3346 // Tests that when a SPDY session becomes idle, it closes itself if there is |
3343 // a lower layer pool stalled on the per-pool socket limit. | 3347 // a lower layer pool stalled on the per-pool socket limit. |
3344 TEST_P(SpdySessionTest, CloseSessionOnIdleWhenPoolStalled) { | 3348 TEST_P(SpdySessionTest, CloseSessionOnIdleWhenPoolStalled) { |
3345 ClientSocketPoolManager::set_max_sockets_per_group( | 3349 ClientSocketPoolManager::set_max_sockets_per_group( |
3346 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3350 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3418 base::RunLoop().RunUntilIdle(); | 3422 base::RunLoop().RunUntilIdle(); |
3419 EXPECT_TRUE(pool->IsStalled()); | 3423 EXPECT_TRUE(pool->IsStalled()); |
3420 EXPECT_FALSE(callback2.have_result()); | 3424 EXPECT_FALSE(callback2.have_result()); |
3421 | 3425 |
3422 // Cancelling the request should result in the session's socket being | 3426 // Cancelling the request should result in the session's socket being |
3423 // closed, since the pool is stalled. | 3427 // closed, since the pool is stalled. |
3424 ASSERT_TRUE(spdy_stream1.get()); | 3428 ASSERT_TRUE(spdy_stream1.get()); |
3425 spdy_stream1->Cancel(); | 3429 spdy_stream1->Cancel(); |
3426 base::RunLoop().RunUntilIdle(); | 3430 base::RunLoop().RunUntilIdle(); |
3427 ASSERT_FALSE(pool->IsStalled()); | 3431 ASSERT_FALSE(pool->IsStalled()); |
3428 EXPECT_EQ(OK, callback2.WaitForResult()); | 3432 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
3429 } | 3433 } |
3430 | 3434 |
3431 // Verify that SpdySessionKey and therefore SpdySession is different when | 3435 // Verify that SpdySessionKey and therefore SpdySession is different when |
3432 // privacy mode is enabled or disabled. | 3436 // privacy mode is enabled or disabled. |
3433 TEST_P(SpdySessionTest, SpdySessionKeyPrivacyMode) { | 3437 TEST_P(SpdySessionTest, SpdySessionKeyPrivacyMode) { |
3434 CreateNetworkSession(); | 3438 CreateNetworkSession(); |
3435 | 3439 |
3436 HostPortPair host_port_pair("www.example.org", 443); | 3440 HostPortPair host_port_pair("www.example.org", 443); |
3437 SpdySessionKey key_privacy_enabled(host_port_pair, ProxyServer::Direct(), | 3441 SpdySessionKey key_privacy_enabled(host_port_pair, ProxyServer::Direct(), |
3438 PRIVACY_MODE_ENABLED); | 3442 PRIVACY_MODE_ENABLED); |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4050 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 4054 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
4051 | 4055 |
4052 base::RunLoop().RunUntilIdle(); | 4056 base::RunLoop().RunUntilIdle(); |
4053 | 4057 |
4054 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4058 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
4055 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); | 4059 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); |
4056 | 4060 |
4057 stream->Close(); | 4061 stream->Close(); |
4058 EXPECT_FALSE(stream); | 4062 EXPECT_FALSE(stream); |
4059 | 4063 |
4060 EXPECT_EQ(OK, delegate.WaitForClose()); | 4064 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
4061 | 4065 |
4062 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4066 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
4063 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); | 4067 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); |
4064 | 4068 |
4065 data.Resume(); | 4069 data.Resume(); |
4066 base::RunLoop().RunUntilIdle(); | 4070 base::RunLoop().RunUntilIdle(); |
4067 EXPECT_FALSE(session_); | 4071 EXPECT_FALSE(session_); |
4068 } | 4072 } |
4069 | 4073 |
4070 // Send data back and forth but close the stream before its data frame | 4074 // Send data back and forth but close the stream before its data frame |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4125 | 4129 |
4126 EXPECT_EQ(initial_window_size - kMsgDataSize, | 4130 EXPECT_EQ(initial_window_size - kMsgDataSize, |
4127 session_->session_send_window_size_); | 4131 session_->session_send_window_size_); |
4128 | 4132 |
4129 // Closing the stream should increase the session's send window. | 4133 // Closing the stream should increase the session's send window. |
4130 stream->Close(); | 4134 stream->Close(); |
4131 EXPECT_FALSE(stream); | 4135 EXPECT_FALSE(stream); |
4132 | 4136 |
4133 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 4137 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
4134 | 4138 |
4135 EXPECT_EQ(OK, delegate.WaitForClose()); | 4139 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
4136 | 4140 |
4137 base::RunLoop().RunUntilIdle(); | 4141 base::RunLoop().RunUntilIdle(); |
4138 EXPECT_FALSE(session_); | 4142 EXPECT_FALSE(session_); |
4139 | 4143 |
4140 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4144 EXPECT_TRUE(data.AllWriteDataConsumed()); |
4141 EXPECT_TRUE(data.AllReadDataConsumed()); | 4145 EXPECT_TRUE(data.AllReadDataConsumed()); |
4142 } | 4146 } |
4143 | 4147 |
4144 // Send data back and forth; the send and receive windows should | 4148 // Send data back and forth; the send and receive windows should |
4145 // change appropriately. | 4149 // change appropriately. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4232 | 4236 |
4233 // Draining the delegate's read queue should increase the session's | 4237 // Draining the delegate's read queue should increase the session's |
4234 // receive window. | 4238 // receive window. |
4235 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 4239 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
4236 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4240 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
4237 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); | 4241 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); |
4238 | 4242 |
4239 stream->Close(); | 4243 stream->Close(); |
4240 EXPECT_FALSE(stream); | 4244 EXPECT_FALSE(stream); |
4241 | 4245 |
4242 EXPECT_EQ(OK, delegate.WaitForClose()); | 4246 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
4243 | 4247 |
4244 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 4248 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
4245 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 4249 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
4246 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); | 4250 EXPECT_EQ(kMsgDataSize, session_->session_unacked_recv_window_bytes_); |
4247 | 4251 |
4248 data.Resume(); | 4252 data.Resume(); |
4249 base::RunLoop().RunUntilIdle(); | 4253 base::RunLoop().RunUntilIdle(); |
4250 EXPECT_FALSE(session_); | 4254 EXPECT_FALSE(session_); |
4251 } | 4255 } |
4252 | 4256 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4300 stall_function.Run(stream.get()); | 4304 stall_function.Run(stream.get()); |
4301 | 4305 |
4302 base::RunLoop().RunUntilIdle(); | 4306 base::RunLoop().RunUntilIdle(); |
4303 | 4307 |
4304 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 4308 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
4305 | 4309 |
4306 unstall_function.Run(stream.get(), kBodyDataSize); | 4310 unstall_function.Run(stream.get(), kBodyDataSize); |
4307 | 4311 |
4308 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 4312 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
4309 | 4313 |
4310 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 4314 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4311 | 4315 |
4312 EXPECT_TRUE(delegate.send_headers_completed()); | 4316 EXPECT_TRUE(delegate.send_headers_completed()); |
4313 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 4317 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
4314 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 4318 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
4315 EXPECT_FALSE(session_); | 4319 EXPECT_FALSE(session_); |
4316 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4320 EXPECT_TRUE(data.AllWriteDataConsumed()); |
4317 } | 4321 } |
4318 | 4322 |
4319 // Run the resume-after-unstall test with all possible stall and | 4323 // Run the resume-after-unstall test with all possible stall and |
4320 // unstall sequences. | 4324 // unstall sequences. |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4463 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); | 4467 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); |
4464 | 4468 |
4465 // This should then unstall stream1. | 4469 // This should then unstall stream1. |
4466 UnstallSessionSend(kBodyDataSize); | 4470 UnstallSessionSend(kBodyDataSize); |
4467 | 4471 |
4468 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); | 4472 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); |
4469 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); | 4473 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); |
4470 | 4474 |
4471 base::RunLoop().RunUntilIdle(); | 4475 base::RunLoop().RunUntilIdle(); |
4472 | 4476 |
4473 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate1.WaitForClose()); | 4477 EXPECT_THAT(delegate1.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4474 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate2.WaitForClose()); | 4478 EXPECT_THAT(delegate2.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4475 | 4479 |
4476 EXPECT_TRUE(delegate1.send_headers_completed()); | 4480 EXPECT_TRUE(delegate1.send_headers_completed()); |
4477 EXPECT_EQ("200", delegate1.GetResponseHeaderValue(":status")); | 4481 EXPECT_EQ("200", delegate1.GetResponseHeaderValue(":status")); |
4478 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); | 4482 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); |
4479 | 4483 |
4480 EXPECT_TRUE(delegate2.send_headers_completed()); | 4484 EXPECT_TRUE(delegate2.send_headers_completed()); |
4481 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); | 4485 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); |
4482 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); | 4486 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); |
4483 | 4487 |
4484 EXPECT_FALSE(session_); | 4488 EXPECT_FALSE(session_); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4633 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); | 4637 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); |
4634 EXPECT_FALSE(session_->IsStreamActive(stream_id1)); | 4638 EXPECT_FALSE(session_->IsStreamActive(stream_id1)); |
4635 EXPECT_TRUE(session_->IsStreamActive(stream_id2)); | 4639 EXPECT_TRUE(session_->IsStreamActive(stream_id2)); |
4636 EXPECT_FALSE(session_->IsStreamActive(stream_id3)); | 4640 EXPECT_FALSE(session_->IsStreamActive(stream_id3)); |
4637 | 4641 |
4638 data.Resume(); | 4642 data.Resume(); |
4639 base::RunLoop().RunUntilIdle(); | 4643 base::RunLoop().RunUntilIdle(); |
4640 EXPECT_FALSE(stream2); | 4644 EXPECT_FALSE(stream2); |
4641 EXPECT_FALSE(session_); | 4645 EXPECT_FALSE(session_); |
4642 | 4646 |
4643 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate1.WaitForClose()); | 4647 EXPECT_THAT(delegate1.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4644 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate2.WaitForClose()); | 4648 EXPECT_THAT(delegate2.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4645 EXPECT_EQ(OK, delegate3.WaitForClose()); | 4649 EXPECT_THAT(delegate3.WaitForClose(), IsOk()); |
4646 | 4650 |
4647 EXPECT_TRUE(delegate1.send_headers_completed()); | 4651 EXPECT_TRUE(delegate1.send_headers_completed()); |
4648 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); | 4652 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); |
4649 | 4653 |
4650 EXPECT_TRUE(delegate2.send_headers_completed()); | 4654 EXPECT_TRUE(delegate2.send_headers_completed()); |
4651 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); | 4655 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); |
4652 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); | 4656 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); |
4653 | 4657 |
4654 EXPECT_TRUE(delegate3.send_headers_completed()); | 4658 EXPECT_TRUE(delegate3.send_headers_completed()); |
4655 EXPECT_EQ(std::string(), delegate3.TakeReceivedData()); | 4659 EXPECT_EQ(std::string(), delegate3.TakeReceivedData()); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4736 | 4740 |
4737 // Close the session (since we can't do it from within the delegate | 4741 // Close the session (since we can't do it from within the delegate |
4738 // method, since it's in the stream's loop). | 4742 // method, since it's in the stream's loop). |
4739 session_->CloseSessionOnError(ERR_CONNECTION_CLOSED, "Closing session"); | 4743 session_->CloseSessionOnError(ERR_CONNECTION_CLOSED, "Closing session"); |
4740 data.Resume(); | 4744 data.Resume(); |
4741 base::RunLoop().RunUntilIdle(); | 4745 base::RunLoop().RunUntilIdle(); |
4742 EXPECT_FALSE(session_); | 4746 EXPECT_FALSE(session_); |
4743 | 4747 |
4744 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 4748 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
4745 | 4749 |
4746 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate1.WaitForClose()); | 4750 EXPECT_THAT(delegate1.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4747 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate2.WaitForClose()); | 4751 EXPECT_THAT(delegate2.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
4748 | 4752 |
4749 EXPECT_TRUE(delegate1.send_headers_completed()); | 4753 EXPECT_TRUE(delegate1.send_headers_completed()); |
4750 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); | 4754 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); |
4751 | 4755 |
4752 EXPECT_TRUE(delegate2.send_headers_completed()); | 4756 EXPECT_TRUE(delegate2.send_headers_completed()); |
4753 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); | 4757 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); |
4754 | 4758 |
4755 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4759 EXPECT_TRUE(data.AllWriteDataConsumed()); |
4756 } | 4760 } |
4757 | 4761 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4796 base::RunLoop().RunUntilIdle(); | 4800 base::RunLoop().RunUntilIdle(); |
4797 | 4801 |
4798 // Put session on the edge of overflowing it's recv window. | 4802 // Put session on the edge of overflowing it's recv window. |
4799 session_->session_recv_window_size_ = 1; | 4803 session_->session_recv_window_size_ = 1; |
4800 | 4804 |
4801 // Read response headers & body. Body overflows the session window, and a | 4805 // Read response headers & body. Body overflows the session window, and a |
4802 // goaway is written. | 4806 // goaway is written. |
4803 data.Resume(); | 4807 data.Resume(); |
4804 base::RunLoop().RunUntilIdle(); | 4808 base::RunLoop().RunUntilIdle(); |
4805 | 4809 |
4806 EXPECT_EQ(ERR_SPDY_FLOW_CONTROL_ERROR, delegate.WaitForClose()); | 4810 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR)); |
4807 EXPECT_FALSE(session_); | 4811 EXPECT_FALSE(session_); |
4808 } | 4812 } |
4809 | 4813 |
4810 TEST_P(SpdySessionTest, SplitHeaders) { | 4814 TEST_P(SpdySessionTest, SplitHeaders) { |
4811 GURL kStreamUrl("https://www.example.org/foo.dat"); | 4815 GURL kStreamUrl("https://www.example.org/foo.dat"); |
4812 SpdyHeaderBlock headers; | 4816 SpdyHeaderBlock headers; |
4813 spdy_util_.AddUrlToHeaderBlock(kStreamUrl.spec(), &headers); | 4817 spdy_util_.AddUrlToHeaderBlock(kStreamUrl.spec(), &headers); |
4814 headers["alpha"] = "beta"; | 4818 headers["alpha"] = "beta"; |
4815 | 4819 |
4816 SpdyHeaderBlock request_headers; | 4820 SpdyHeaderBlock request_headers; |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5337 data.Resume(); | 5341 data.Resume(); |
5338 base::RunLoop().RunUntilIdle(); | 5342 base::RunLoop().RunUntilIdle(); |
5339 EXPECT_EQ(2u, session_->num_active_streams()); | 5343 EXPECT_EQ(2u, session_->num_active_streams()); |
5340 EXPECT_EQ(0u, session_->num_created_streams()); | 5344 EXPECT_EQ(0u, session_->num_created_streams()); |
5341 EXPECT_EQ(1u, session_->num_pushed_streams()); | 5345 EXPECT_EQ(1u, session_->num_pushed_streams()); |
5342 EXPECT_EQ(0u, session_->num_active_pushed_streams()); | 5346 EXPECT_EQ(0u, session_->num_active_pushed_streams()); |
5343 | 5347 |
5344 base::WeakPtr<SpdyStream> pushed_stream; | 5348 base::WeakPtr<SpdyStream> pushed_stream; |
5345 int rv = | 5349 int rv = |
5346 session_->GetPushStream(GURL(kPushedUrl), &pushed_stream, BoundNetLog()); | 5350 session_->GetPushStream(GURL(kPushedUrl), &pushed_stream, BoundNetLog()); |
5347 ASSERT_EQ(OK, rv); | 5351 ASSERT_THAT(rv, IsOk()); |
5348 ASSERT_TRUE(pushed_stream); | 5352 ASSERT_TRUE(pushed_stream); |
5349 test::StreamDelegateCloseOnHeaders delegate2(pushed_stream); | 5353 test::StreamDelegateCloseOnHeaders delegate2(pushed_stream); |
5350 pushed_stream->SetDelegate(&delegate2); | 5354 pushed_stream->SetDelegate(&delegate2); |
5351 | 5355 |
5352 // Receive headers for pushed stream. Delegate will cancel the stream, ensure | 5356 // Receive headers for pushed stream. Delegate will cancel the stream, ensure |
5353 // that all our counters are in consistent state. | 5357 // that all our counters are in consistent state. |
5354 data.Resume(); | 5358 data.Resume(); |
5355 base::RunLoop().RunUntilIdle(); | 5359 base::RunLoop().RunUntilIdle(); |
5356 EXPECT_EQ(1u, session_->num_active_streams()); | 5360 EXPECT_EQ(1u, session_->num_active_streams()); |
5357 EXPECT_EQ(0u, session_->num_created_streams()); | 5361 EXPECT_EQ(0u, session_->num_created_streams()); |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5896 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), | 5900 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), |
5897 "spdy_pooling.pem"); | 5901 "spdy_pooling.pem"); |
5898 ssl_info.is_issued_by_known_root = true; | 5902 ssl_info.is_issued_by_known_root = true; |
5899 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); | 5903 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); |
5900 | 5904 |
5901 EXPECT_TRUE(SpdySession::CanPool( | 5905 EXPECT_TRUE(SpdySession::CanPool( |
5902 &tss, ssl_info, "www.example.org", "mail.example.org")); | 5906 &tss, ssl_info, "www.example.org", "mail.example.org")); |
5903 } | 5907 } |
5904 | 5908 |
5905 } // namespace net | 5909 } // namespace net |
OLD | NEW |