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 |