| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/bidirectional_stream_spdy_impl.h" | 5 #include "net/spdy/bidirectional_stream_spdy_impl.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); | 197 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); |
| 198 }; | 198 }; |
| 199 | 199 |
| 200 } // namespace | 200 } // namespace |
| 201 | 201 |
| 202 class BidirectionalStreamSpdyImplTest : public testing::Test { | 202 class BidirectionalStreamSpdyImplTest : public testing::Test { |
| 203 public: | 203 public: |
| 204 BidirectionalStreamSpdyImplTest() | 204 BidirectionalStreamSpdyImplTest() |
| 205 : spdy_util_(kProtoHTTP2, true), | 205 : spdy_util_(kProtoHTTP2, true), |
| 206 session_deps_(kProtoHTTP2), | 206 session_deps_(kProtoHTTP2), |
| 207 default_url_(kDefaultUrl), |
| 208 host_port_pair_(HostPortPair::FromURL(default_url_)), |
| 209 key_(host_port_pair_, ProxyServer::Direct(), PRIVACY_MODE_DISABLED), |
| 207 ssl_data_(SSLSocketDataProvider(ASYNC, OK)) { | 210 ssl_data_(SSLSocketDataProvider(ASYNC, OK)) { |
| 208 ssl_data_.SetNextProto(kProtoHTTP2); | 211 ssl_data_.SetNextProto(kProtoHTTP2); |
| 209 ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); | 212 ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); |
| 210 } | 213 } |
| 211 | 214 |
| 212 protected: | 215 protected: |
| 213 void TearDown() override { | 216 void TearDown() override { |
| 214 if (sequenced_data_) { | 217 if (sequenced_data_) { |
| 215 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed()); | 218 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed()); |
| 216 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed()); | 219 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed()); |
| 217 } | 220 } |
| 218 } | 221 } |
| 219 | 222 |
| 220 // Initializes the session using SequencedSocketData. | 223 // Initializes the session using SequencedSocketData. |
| 221 void InitSession(MockRead* reads, | 224 void InitSession(MockRead* reads, |
| 222 size_t reads_count, | 225 size_t reads_count, |
| 223 MockWrite* writes, | 226 MockWrite* writes, |
| 224 size_t writes_count, | 227 size_t writes_count) { |
| 225 const SpdySessionKey& key) { | |
| 226 ASSERT_TRUE(ssl_data_.cert.get()); | 228 ASSERT_TRUE(ssl_data_.cert.get()); |
| 227 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data_); | 229 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data_); |
| 228 sequenced_data_.reset( | 230 sequenced_data_.reset( |
| 229 new SequencedSocketData(reads, reads_count, writes, writes_count)); | 231 new SequencedSocketData(reads, reads_count, writes, writes_count)); |
| 230 session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get()); | 232 session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get()); |
| 231 session_deps_.net_log = net_log_.bound().net_log(); | 233 session_deps_.net_log = net_log_.bound().net_log(); |
| 232 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 234 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 233 session_ = | 235 session_ = |
| 234 CreateSecureSpdySession(http_session_.get(), key, net_log_.bound()); | 236 CreateSecureSpdySession(http_session_.get(), key_, net_log_.bound()); |
| 235 } | 237 } |
| 236 | 238 |
| 237 BoundTestNetLog net_log_; | 239 BoundTestNetLog net_log_; |
| 238 SpdyTestUtil spdy_util_; | 240 SpdyTestUtil spdy_util_; |
| 239 SpdySessionDependencies session_deps_; | 241 SpdySessionDependencies session_deps_; |
| 242 const GURL default_url_; |
| 243 const HostPortPair host_port_pair_; |
| 244 const SpdySessionKey key_; |
| 240 std::unique_ptr<SequencedSocketData> sequenced_data_; | 245 std::unique_ptr<SequencedSocketData> sequenced_data_; |
| 241 std::unique_ptr<HttpNetworkSession> http_session_; | 246 std::unique_ptr<HttpNetworkSession> http_session_; |
| 242 base::WeakPtr<SpdySession> session_; | 247 base::WeakPtr<SpdySession> session_; |
| 243 | 248 |
| 244 private: | 249 private: |
| 245 SSLSocketDataProvider ssl_data_; | 250 SSLSocketDataProvider ssl_data_; |
| 246 }; | 251 }; |
| 247 | 252 |
| 248 TEST_F(BidirectionalStreamSpdyImplTest, SendDataAfterStreamFailed) { | 253 TEST_F(BidirectionalStreamSpdyImplTest, SendDataAfterStreamFailed) { |
| 249 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 254 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 250 "https://www.example.org", 1, kBodyDataSize * 3, LOW, nullptr, 0)); | 255 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); |
| 251 std::unique_ptr<SpdySerializedFrame> rst( | 256 std::unique_ptr<SpdySerializedFrame> rst( |
| 252 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 257 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 253 | 258 |
| 254 MockWrite writes[] = { | 259 MockWrite writes[] = { |
| 255 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), | 260 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), |
| 256 }; | 261 }; |
| 257 | 262 |
| 258 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 263 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 259 std::unique_ptr<SpdySerializedFrame> resp( | 264 std::unique_ptr<SpdySerializedFrame> resp( |
| 260 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 265 spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
| 261 | 266 |
| 262 MockRead reads[] = { | 267 MockRead reads[] = { |
| 263 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), | 268 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3), |
| 264 }; | 269 }; |
| 265 | 270 |
| 266 HostPortPair host_port_pair("www.example.org", 443); | 271 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 267 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
| 268 PRIVACY_MODE_DISABLED); | |
| 269 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
| 270 | 272 |
| 271 BidirectionalStreamRequestInfo request_info; | 273 BidirectionalStreamRequestInfo request_info; |
| 272 request_info.method = "POST"; | 274 request_info.method = "POST"; |
| 273 request_info.url = GURL("https://www.example.org/"); | 275 request_info.url = default_url_; |
| 274 request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 276 request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
| 275 base::SizeTToString(kBodyDataSize * 3)); | 277 base::SizeTToString(kBodyDataSize * 3)); |
| 276 | 278 |
| 277 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 279 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 278 std::unique_ptr<TestDelegateBase> delegate( | 280 std::unique_ptr<TestDelegateBase> delegate( |
| 279 new TestDelegateBase(session_, read_buffer.get(), kReadBufferSize)); | 281 new TestDelegateBase(session_, read_buffer.get(), kReadBufferSize)); |
| 280 delegate->SetRunUntilCompletion(true); | 282 delegate->SetRunUntilCompletion(true); |
| 281 delegate->Start(&request_info, net_log_.bound()); | 283 delegate->Start(&request_info, net_log_.bound()); |
| 282 base::RunLoop().RunUntilIdle(); | 284 base::RunLoop().RunUntilIdle(); |
| 283 | 285 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 296 // because it is sent after SpdyStream::Delegate::OnClose is called. | 298 // because it is sent after SpdyStream::Delegate::OnClose is called. |
| 297 EXPECT_EQ(CountWriteBytes(writes, 1), delegate->GetTotalSentBytes()); | 299 EXPECT_EQ(CountWriteBytes(writes, 1), delegate->GetTotalSentBytes()); |
| 298 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 300 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 299 delegate->GetTotalReceivedBytes()); | 301 delegate->GetTotalReceivedBytes()); |
| 300 } | 302 } |
| 301 | 303 |
| 302 TEST_F(BidirectionalStreamSpdyImplTest, SendDataAfterCancelStream) { | 304 TEST_F(BidirectionalStreamSpdyImplTest, SendDataAfterCancelStream) { |
| 303 BufferedSpdyFramer framer(spdy_util_.spdy_version()); | 305 BufferedSpdyFramer framer(spdy_util_.spdy_version()); |
| 304 | 306 |
| 305 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 307 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( |
| 306 "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 308 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 307 std::unique_ptr<SpdySerializedFrame> data_frame( | 309 std::unique_ptr<SpdySerializedFrame> data_frame( |
| 308 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | 310 framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); |
| 309 std::unique_ptr<SpdySerializedFrame> rst( | 311 std::unique_ptr<SpdySerializedFrame> rst( |
| 310 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 312 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 311 | 313 |
| 312 MockWrite writes[] = { | 314 MockWrite writes[] = { |
| 313 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), | 315 CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), |
| 314 CreateMockWrite(*rst, 5), | 316 CreateMockWrite(*rst, 5), |
| 315 }; | 317 }; |
| 316 | 318 |
| 317 std::unique_ptr<SpdySerializedFrame> resp( | 319 std::unique_ptr<SpdySerializedFrame> resp( |
| 318 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 320 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 319 std::unique_ptr<SpdySerializedFrame> response_body_frame( | 321 std::unique_ptr<SpdySerializedFrame> response_body_frame( |
| 320 spdy_util_.ConstructSpdyBodyFrame(1, false)); | 322 spdy_util_.ConstructSpdyBodyFrame(1, false)); |
| 321 | 323 |
| 322 MockRead reads[] = { | 324 MockRead reads[] = { |
| 323 CreateMockRead(*resp, 1), | 325 CreateMockRead(*resp, 1), |
| 324 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. | 326 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. |
| 325 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. | 327 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause. |
| 326 MockRead(ASYNC, 0, 6), | 328 MockRead(ASYNC, 0, 6), |
| 327 }; | 329 }; |
| 328 | 330 |
| 329 HostPortPair host_port_pair("www.example.org", 443); | 331 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 330 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), | |
| 331 PRIVACY_MODE_DISABLED); | |
| 332 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); | |
| 333 | 332 |
| 334 BidirectionalStreamRequestInfo request_info; | 333 BidirectionalStreamRequestInfo request_info; |
| 335 request_info.method = "POST"; | 334 request_info.method = "POST"; |
| 336 request_info.url = GURL("https://www.example.org/"); | 335 request_info.url = default_url_; |
| 337 request_info.priority = LOWEST; | 336 request_info.priority = LOWEST; |
| 338 request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, | 337 request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, |
| 339 base::SizeTToString(kBodyDataSize * 3)); | 338 base::SizeTToString(kBodyDataSize * 3)); |
| 340 | 339 |
| 341 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 340 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 342 std::unique_ptr<TestDelegateBase> delegate( | 341 std::unique_ptr<TestDelegateBase> delegate( |
| 343 new TestDelegateBase(session_, read_buffer.get(), kReadBufferSize)); | 342 new TestDelegateBase(session_, read_buffer.get(), kReadBufferSize)); |
| 344 delegate->set_do_not_start_read(true); | 343 delegate->set_do_not_start_read(true); |
| 345 delegate->Start(&request_info, net_log_.bound()); | 344 delegate->Start(&request_info, net_log_.bound()); |
| 346 // Send the request and receive response headers. | 345 // Send the request and receive response headers. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 364 EXPECT_FALSE(delegate->on_failed_called()); | 363 EXPECT_FALSE(delegate->on_failed_called()); |
| 365 | 364 |
| 366 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); | 365 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); |
| 367 EXPECT_EQ(0, delegate->on_data_read_count()); | 366 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 368 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 367 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 369 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 368 EXPECT_EQ(0, delegate->GetTotalSentBytes()); |
| 370 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 369 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); |
| 371 } | 370 } |
| 372 | 371 |
| 373 } // namespace net | 372 } // namespace net |
| OLD | NEW |