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 <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 1863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1874 spdy_stream1->Cancel(); | 1874 spdy_stream1->Cancel(); |
1875 EXPECT_FALSE(spdy_stream1); | 1875 EXPECT_FALSE(spdy_stream1); |
1876 | 1876 |
1877 request.CancelRequest(); | 1877 request.CancelRequest(); |
1878 callback.reset(); | 1878 callback.reset(); |
1879 | 1879 |
1880 // Should not crash when running the pending callback. | 1880 // Should not crash when running the pending callback. |
1881 base::RunLoop().RunUntilIdle(); | 1881 base::RunLoop().RunUntilIdle(); |
1882 } | 1882 } |
1883 | 1883 |
1884 TEST_F(SpdySessionTest, SendInitialDataOnNewSession) { | |
1885 session_deps_.host_resolver->set_synchronous_mode(true); | |
1886 | |
1887 MockRead reads[] = { | |
1888 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | |
1889 }; | |
1890 | |
1891 SettingsMap settings; | |
1892 settings[SETTINGS_HEADER_TABLE_SIZE] = kMaxHeaderTableSize; | |
1893 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = kMaxConcurrentPushedStreams; | |
1894 SpdySerializedFrame settings_frame( | |
1895 spdy_util_.ConstructSpdySettings(settings)); | |
1896 MockWrite writes[] = {MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, | |
1897 kHttp2ConnectionHeaderPrefixSize), | |
1898 CreateMockWrite(settings_frame)}; | |
1899 | |
1900 StaticSocketDataProvider data(reads, arraysize(reads), writes, | |
1901 arraysize(writes)); | |
1902 session_deps_.socket_factory->AddSocketDataProvider(&data); | |
1903 | |
1904 AddSSLSocketData(); | |
1905 | |
1906 CreateNetworkSession(); | |
1907 | |
1908 SpdySessionPoolPeer pool_peer(spdy_session_pool_); | |
1909 pool_peer.SetEnableSendingInitialData(true); | |
1910 | |
1911 CreateSecureSpdySession(); | |
1912 | |
1913 base::RunLoop().RunUntilIdle(); | |
1914 EXPECT_TRUE(data.AllWriteDataConsumed()); | |
1915 } | |
1916 | |
1917 TEST_F(SpdySessionTest, Initialize) { | 1884 TEST_F(SpdySessionTest, Initialize) { |
1918 session_deps_.host_resolver->set_synchronous_mode(true); | 1885 session_deps_.host_resolver->set_synchronous_mode(true); |
1919 | 1886 |
1920 MockRead reads[] = { | 1887 MockRead reads[] = { |
1921 MockRead(ASYNC, 0, 0) // EOF | 1888 MockRead(ASYNC, 0, 0) // EOF |
1922 }; | 1889 }; |
1923 | 1890 |
1924 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 1891 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
1925 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1892 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1926 | 1893 |
(...skipping 1953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3880 CreateMockRead(resp, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), | 3847 CreateMockRead(resp, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), |
3881 CreateMockRead(data_frame, 3), MockRead(ASYNC, ERR_IO_PENDING, 5), | 3848 CreateMockRead(data_frame, 3), MockRead(ASYNC, ERR_IO_PENDING, 5), |
3882 MockRead(ASYNC, 0, 6), | 3849 MockRead(ASYNC, 0, 6), |
3883 }; | 3850 }; |
3884 | 3851 |
3885 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3852 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
3886 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3853 session_deps_.socket_factory->AddSocketDataProvider(&data); |
3887 | 3854 |
3888 AddSSLSocketData(); | 3855 AddSSLSocketData(); |
3889 | 3856 |
3890 session_deps_.stream_max_recv_window_size = stream_max_recv_window_size; | 3857 session_deps_.http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = |
| 3858 stream_max_recv_window_size; |
3891 CreateNetworkSession(); | 3859 CreateNetworkSession(); |
3892 | 3860 |
3893 CreateSecureSpdySession(); | 3861 CreateSecureSpdySession(); |
3894 | 3862 |
3895 base::WeakPtr<SpdyStream> spdy_stream = | 3863 base::WeakPtr<SpdyStream> spdy_stream = |
3896 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session_, | 3864 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session_, |
3897 test_url_, LOWEST, NetLogWithSource()); | 3865 test_url_, LOWEST, NetLogWithSource()); |
3898 EXPECT_EQ(stream_max_recv_window_size, spdy_stream->recv_window_size()); | 3866 EXPECT_EQ(stream_max_recv_window_size, spdy_stream->recv_window_size()); |
3899 | 3867 |
3900 test::StreamDelegateDoNothing delegate(spdy_stream); | 3868 test::StreamDelegateDoNothing delegate(spdy_stream); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4017 CreateMockRead(first, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), | 3985 CreateMockRead(first, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), |
4018 CreateMockRead(second, 5), MockRead(ASYNC, ERR_IO_PENDING, 7), | 3986 CreateMockRead(second, 5), MockRead(ASYNC, ERR_IO_PENDING, 7), |
4019 MockRead(ASYNC, 0, 8), | 3987 MockRead(ASYNC, 0, 8), |
4020 }; | 3988 }; |
4021 | 3989 |
4022 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3990 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
4023 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3991 session_deps_.socket_factory->AddSocketDataProvider(&data); |
4024 | 3992 |
4025 AddSSLSocketData(); | 3993 AddSSLSocketData(); |
4026 | 3994 |
4027 session_deps_.stream_max_recv_window_size = stream_max_recv_window_size; | 3995 session_deps_.http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = |
| 3996 stream_max_recv_window_size; |
4028 CreateNetworkSession(); | 3997 CreateNetworkSession(); |
4029 | 3998 |
4030 CreateSecureSpdySession(); | 3999 CreateSecureSpdySession(); |
4031 | 4000 |
4032 base::WeakPtr<SpdyStream> spdy_stream = | 4001 base::WeakPtr<SpdyStream> spdy_stream = |
4033 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session_, | 4002 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session_, |
4034 test_url_, LOWEST, NetLogWithSource()); | 4003 test_url_, LOWEST, NetLogWithSource()); |
4035 test::StreamDelegateDoNothing delegate(spdy_stream); | 4004 test::StreamDelegateDoNothing delegate(spdy_stream); |
4036 spdy_stream->SetDelegate(&delegate); | 4005 spdy_stream->SetDelegate(&delegate); |
4037 | 4006 |
(...skipping 1346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5384 // Client id exceeding watermark. | 5353 // Client id exceeding watermark. |
5385 EXPECT_FALSE(session_->OnUnknownFrame(9, 0)); | 5354 EXPECT_FALSE(session_->OnUnknownFrame(9, 0)); |
5386 | 5355 |
5387 session_->last_accepted_push_stream_id_ = 6; | 5356 session_->last_accepted_push_stream_id_ = 6; |
5388 // Low server (even) ids are fine. | 5357 // Low server (even) ids are fine. |
5389 EXPECT_TRUE(session_->OnUnknownFrame(2, 0)); | 5358 EXPECT_TRUE(session_->OnUnknownFrame(2, 0)); |
5390 // Server id exceeding last accepted id. | 5359 // Server id exceeding last accepted id. |
5391 EXPECT_FALSE(session_->OnUnknownFrame(8, 0)); | 5360 EXPECT_FALSE(session_->OnUnknownFrame(8, 0)); |
5392 } | 5361 } |
5393 | 5362 |
| 5363 class SendInitialSettingsOnNewSpdySessionTest : public SpdySessionTest { |
| 5364 protected: |
| 5365 void RunInitialSettingsTest(const SettingsMap expected_settings) { |
| 5366 session_deps_.host_resolver->set_synchronous_mode(true); |
| 5367 |
| 5368 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING)}; |
| 5369 |
| 5370 SpdySerializedFrame settings_frame( |
| 5371 spdy_util_.ConstructSpdySettings(expected_settings)); |
| 5372 MockWrite writes[] = {MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, |
| 5373 kHttp2ConnectionHeaderPrefixSize), |
| 5374 CreateMockWrite(settings_frame)}; |
| 5375 |
| 5376 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 5377 arraysize(writes)); |
| 5378 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 5379 AddSSLSocketData(); |
| 5380 |
| 5381 CreateNetworkSession(); |
| 5382 |
| 5383 SpdySessionPoolPeer pool_peer(spdy_session_pool_); |
| 5384 pool_peer.SetEnableSendingInitialData(true); |
| 5385 |
| 5386 CreateSecureSpdySession(); |
| 5387 |
| 5388 base::RunLoop().RunUntilIdle(); |
| 5389 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 5390 } |
| 5391 }; |
| 5392 |
| 5393 // Setting values when Params::http2_settings is empty. Note that |
| 5394 // SETTINGS_INITIAL_WINDOW_SIZE is sent in production, because it is set to a |
| 5395 // non-default value, but it is not sent in tests, because the protocol default |
| 5396 // value is used in tests. |
| 5397 TEST_F(SendInitialSettingsOnNewSpdySessionTest, Empty) { |
| 5398 SettingsMap expected_settings; |
| 5399 expected_settings[SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize; |
| 5400 expected_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 5401 kSpdyMaxConcurrentPushedStreams; |
| 5402 RunInitialSettingsTest(expected_settings); |
| 5403 } |
| 5404 |
| 5405 // When a setting is set to the protocol default value, |
| 5406 // no corresponding value is sent on the wire. |
| 5407 TEST_F(SendInitialSettingsOnNewSpdySessionTest, ProtocolDefault) { |
| 5408 // Explicitly set protocol default values for the following settings. |
| 5409 session_deps_.http2_settings[SETTINGS_HEADER_TABLE_SIZE] = 4096; |
| 5410 session_deps_.http2_settings[SETTINGS_ENABLE_PUSH] = 1; |
| 5411 session_deps_.http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = 64 * 1024 - 1; |
| 5412 |
| 5413 SettingsMap expected_settings; |
| 5414 expected_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 5415 kSpdyMaxConcurrentPushedStreams; |
| 5416 RunInitialSettingsTest(expected_settings); |
| 5417 } |
| 5418 |
| 5419 // Values set in Params::http2_settings overwrite Chromium's default values. |
| 5420 TEST_F(SendInitialSettingsOnNewSpdySessionTest, OverwriteValues) { |
| 5421 session_deps_.http2_settings[SETTINGS_HEADER_TABLE_SIZE] = 16 * 1024; |
| 5422 session_deps_.http2_settings[SETTINGS_ENABLE_PUSH] = 0; |
| 5423 session_deps_.http2_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 42; |
| 5424 session_deps_.http2_settings[SETTINGS_INITIAL_WINDOW_SIZE] = 32 * 1024; |
| 5425 |
| 5426 SettingsMap expected_settings; |
| 5427 expected_settings[SETTINGS_HEADER_TABLE_SIZE] = 16 * 1024; |
| 5428 expected_settings[SETTINGS_ENABLE_PUSH] = 0; |
| 5429 expected_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 42; |
| 5430 expected_settings[SETTINGS_INITIAL_WINDOW_SIZE] = 32 * 1024; |
| 5431 RunInitialSettingsTest(expected_settings); |
| 5432 } |
| 5433 |
| 5434 // Unknown parameters should still be sent to the server. |
| 5435 TEST_F(SendInitialSettingsOnNewSpdySessionTest, UnknownSettings) { |
| 5436 // The following parameters are not defined in the HTTP/2 specification. |
| 5437 session_deps_.http2_settings[static_cast<SpdySettingsIds>(7)] = 1234; |
| 5438 session_deps_.http2_settings[static_cast<SpdySettingsIds>(25)] = 5678; |
| 5439 |
| 5440 SettingsMap expected_settings; |
| 5441 expected_settings[SETTINGS_HEADER_TABLE_SIZE] = kSpdyMaxHeaderTableSize; |
| 5442 expected_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 5443 kSpdyMaxConcurrentPushedStreams; |
| 5444 expected_settings[static_cast<SpdySettingsIds>(7)] = 1234; |
| 5445 expected_settings[static_cast<SpdySettingsIds>(25)] = 5678; |
| 5446 RunInitialSettingsTest(expected_settings); |
| 5447 } |
| 5448 |
5394 class AltSvcFrameTest : public SpdySessionTest { | 5449 class AltSvcFrameTest : public SpdySessionTest { |
5395 public: | 5450 public: |
5396 AltSvcFrameTest() | 5451 AltSvcFrameTest() |
5397 : alternative_service_("quic", | 5452 : alternative_service_("quic", |
5398 "alternative.example.org", | 5453 "alternative.example.org", |
5399 443, | 5454 443, |
5400 86400, | 5455 86400, |
5401 SpdyAltSvcWireFormat::VersionVector()) {} | 5456 SpdyAltSvcWireFormat::VersionVector()) {} |
5402 | 5457 |
5403 void AddSocketData(const SpdyAltSvcIR& altsvc_ir) { | 5458 void AddSocketData(const SpdyAltSvcIR& altsvc_ir) { |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5876 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), | 5931 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), |
5877 "spdy_pooling.pem"); | 5932 "spdy_pooling.pem"); |
5878 ssl_info.is_issued_by_known_root = true; | 5933 ssl_info.is_issued_by_known_root = true; |
5879 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); | 5934 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); |
5880 | 5935 |
5881 EXPECT_TRUE(SpdySession::CanPool( | 5936 EXPECT_TRUE(SpdySession::CanPool( |
5882 &tss, ssl_info, "www.example.org", "mail.example.org")); | 5937 &tss, ssl_info, "www.example.org", "mail.example.org")); |
5883 } | 5938 } |
5884 | 5939 |
5885 } // namespace net | 5940 } // namespace net |
OLD | NEW |