| 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 |