Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: net/spdy/spdy_http_stream_unittest.cc

Issue 2111953002: Minor test cleanup. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/bidirectional_stream_spdy_impl_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_http_stream.h" 5 #include "net/spdy/spdy_http_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 DISALLOW_COPY_AND_ASSIGN(ReadErrorUploadDataStream); 106 DISALLOW_COPY_AND_ASSIGN(ReadErrorUploadDataStream);
107 }; 107 };
108 108
109 } // namespace 109 } // namespace
110 110
111 class SpdyHttpStreamTest : public testing::Test, 111 class SpdyHttpStreamTest : public testing::Test,
112 public testing::WithParamInterface<TestCase> { 112 public testing::WithParamInterface<TestCase> {
113 public: 113 public:
114 SpdyHttpStreamTest() 114 SpdyHttpStreamTest()
115 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()), 115 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()),
116 session_deps_(GetProtocol()) { 116 session_deps_(GetProtocol()),
117 host_port_pair_(HostPortPair::FromURL(GURL(kDefaultUrl))),
118 key_(host_port_pair_, ProxyServer::Direct(), PRIVACY_MODE_DISABLED) {
117 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); 119 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority();
118 session_deps_.net_log = &net_log_; 120 session_deps_.net_log = &net_log_;
119 spdy_util_.set_default_url(GURL("http://www.example.org/")); 121 spdy_util_.set_default_url(GURL("http://www.example.org/"));
120 } 122 }
121 123
122 ~SpdyHttpStreamTest() {} 124 ~SpdyHttpStreamTest() {}
123 125
124 protected: 126 protected:
125 NextProto GetProtocol() const { 127 NextProto GetProtocol() const {
126 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2; 128 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2;
127 } 129 }
128 130
129 bool GetDependenciesFromPriority() const { 131 bool GetDependenciesFromPriority() const {
130 return GetParam() == kTestCaseHTTP2PriorityDependencies; 132 return GetParam() == kTestCaseHTTP2PriorityDependencies;
131 } 133 }
132 134
133 void TearDown() override { 135 void TearDown() override {
134 crypto::ECSignatureCreator::SetFactoryForTesting(nullptr); 136 crypto::ECSignatureCreator::SetFactoryForTesting(nullptr);
135 base::RunLoop().RunUntilIdle(); 137 base::RunLoop().RunUntilIdle();
136 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed()); 138 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed());
137 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed()); 139 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed());
138 } 140 }
139 141
140 // Initializes the session using SequencedSocketData. 142 // Initializes the session using SequencedSocketData.
141 void InitSession(MockRead* reads, 143 void InitSession(MockRead* reads,
142 size_t reads_count, 144 size_t reads_count,
143 MockWrite* writes, 145 MockWrite* writes,
144 size_t writes_count, 146 size_t writes_count) {
145 const SpdySessionKey& key) {
146 sequenced_data_.reset( 147 sequenced_data_.reset(
147 new SequencedSocketData(reads, reads_count, writes, writes_count)); 148 new SequencedSocketData(reads, reads_count, writes, writes_count));
148 session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get()); 149 session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get());
149 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); 150 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
150 session_ = 151 session_ =
151 CreateInsecureSpdySession(http_session_.get(), key, BoundNetLog()); 152 CreateInsecureSpdySession(http_session_.get(), key_, BoundNetLog());
152 } 153 }
153 154
154 void TestSendCredentials( 155 void TestSendCredentials(
155 ChannelIDService* channel_id_service, 156 ChannelIDService* channel_id_service,
156 const std::string& cert, 157 const std::string& cert,
157 const std::string& proof); 158 const std::string& proof);
158 159
159 SpdyTestUtil spdy_util_; 160 SpdyTestUtil spdy_util_;
160 TestNetLog net_log_; 161 TestNetLog net_log_;
161 SpdySessionDependencies session_deps_; 162 SpdySessionDependencies session_deps_;
163 const HostPortPair host_port_pair_;
164 const SpdySessionKey key_;
162 std::unique_ptr<SequencedSocketData> sequenced_data_; 165 std::unique_ptr<SequencedSocketData> sequenced_data_;
163 std::unique_ptr<HttpNetworkSession> http_session_; 166 std::unique_ptr<HttpNetworkSession> http_session_;
164 base::WeakPtr<SpdySession> session_; 167 base::WeakPtr<SpdySession> session_;
165 168
166 private: 169 private:
167 MockECSignatureCreatorFactory ec_signature_creator_factory_; 170 MockECSignatureCreatorFactory ec_signature_creator_factory_;
168 }; 171 };
169 172
170 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend, 173 INSTANTIATE_TEST_CASE_P(ProtoPlusDepend,
171 SpdyHttpStreamTest, 174 SpdyHttpStreamTest,
172 testing::Values(kTestCaseSPDY31, 175 testing::Values(kTestCaseSPDY31,
173 kTestCaseHTTP2NoPriorityDependencies, 176 kTestCaseHTTP2NoPriorityDependencies,
174 kTestCaseHTTP2PriorityDependencies)); 177 kTestCaseHTTP2PriorityDependencies));
175 178
176 // SpdyHttpStream::GetUploadProgress() should still work even before the 179 // SpdyHttpStream::GetUploadProgress() should still work even before the
177 // stream is initialized. 180 // stream is initialized.
178 TEST_P(SpdyHttpStreamTest, GetUploadProgressBeforeInitialization) { 181 TEST_P(SpdyHttpStreamTest, GetUploadProgressBeforeInitialization) {
179 MockRead reads[] = { 182 MockRead reads[] = {
180 MockRead(ASYNC, 0, 0) // EOF 183 MockRead(ASYNC, 0, 0) // EOF
181 }; 184 };
182 185
183 HostPortPair host_port_pair("www.example.org", 80); 186 InitSession(reads, arraysize(reads), nullptr, 0);
184 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
185 PRIVACY_MODE_DISABLED);
186 InitSession(reads, arraysize(reads), nullptr, 0, key);
187 187
188 SpdyHttpStream stream(session_, false); 188 SpdyHttpStream stream(session_, false);
189 UploadProgress progress = stream.GetUploadProgress(); 189 UploadProgress progress = stream.GetUploadProgress();
190 EXPECT_EQ(0u, progress.size()); 190 EXPECT_EQ(0u, progress.size());
191 EXPECT_EQ(0u, progress.position()); 191 EXPECT_EQ(0u, progress.position());
192 192
193 // Pump the event loop so |reads| is consumed before the function returns. 193 // Pump the event loop so |reads| is consumed before the function returns.
194 base::RunLoop().RunUntilIdle(); 194 base::RunLoop().RunUntilIdle();
195 } 195 }
196 196
197 TEST_P(SpdyHttpStreamTest, SendRequest) { 197 TEST_P(SpdyHttpStreamTest, SendRequest) {
198 std::unique_ptr<SpdySerializedFrame> req( 198 std::unique_ptr<SpdySerializedFrame> req(
199 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 199 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
200 MockWrite writes[] = { 200 MockWrite writes[] = {
201 CreateMockWrite(*req.get(), 0), 201 CreateMockWrite(*req.get(), 0),
202 }; 202 };
203 std::unique_ptr<SpdySerializedFrame> resp( 203 std::unique_ptr<SpdySerializedFrame> resp(
204 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 204 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
205 MockRead reads[] = { 205 MockRead reads[] = {
206 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 206 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
207 }; 207 };
208 208
209 HostPortPair host_port_pair("www.example.org", 80); 209 InitSession(reads, arraysize(reads), writes, arraysize(writes));
210 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
211 PRIVACY_MODE_DISABLED);
212 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
213 210
214 HttpRequestInfo request; 211 HttpRequestInfo request;
215 request.method = "GET"; 212 request.method = "GET";
216 request.url = GURL("http://www.example.org/"); 213 request.url = GURL("http://www.example.org/");
217 TestCompletionCallback callback; 214 TestCompletionCallback callback;
218 HttpResponseInfo response; 215 HttpResponseInfo response;
219 HttpRequestHeaders headers; 216 HttpRequestHeaders headers;
220 BoundNetLog net_log; 217 BoundNetLog net_log;
221 std::unique_ptr<SpdyHttpStream> http_stream( 218 std::unique_ptr<SpdyHttpStream> http_stream(
222 new SpdyHttpStream(session_, true)); 219 new SpdyHttpStream(session_, true));
223 // Make sure getting load timing information the stream early does not crash. 220 // Make sure getting load timing information the stream early does not crash.
224 LoadTimingInfo load_timing_info; 221 LoadTimingInfo load_timing_info;
225 EXPECT_FALSE(http_stream->GetLoadTimingInfo(&load_timing_info)); 222 EXPECT_FALSE(http_stream->GetLoadTimingInfo(&load_timing_info));
226 223
227 ASSERT_EQ( 224 ASSERT_EQ(
228 OK, 225 OK,
229 http_stream->InitializeStream(&request, DEFAULT_PRIORITY, 226 http_stream->InitializeStream(&request, DEFAULT_PRIORITY,
230 net_log, CompletionCallback())); 227 net_log, CompletionCallback()));
231 EXPECT_FALSE(http_stream->GetLoadTimingInfo(&load_timing_info)); 228 EXPECT_FALSE(http_stream->GetLoadTimingInfo(&load_timing_info));
232 229
233 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 230 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
234 callback.callback())); 231 callback.callback()));
235 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 232 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
236 EXPECT_FALSE(http_stream->GetLoadTimingInfo(&load_timing_info)); 233 EXPECT_FALSE(http_stream->GetLoadTimingInfo(&load_timing_info));
237 234
238 callback.WaitForResult(); 235 callback.WaitForResult();
239 236
240 // Can get timing information once the stream connects. 237 // Can get timing information once the stream connects.
241 TestLoadTimingNotReused(*http_stream); 238 TestLoadTimingNotReused(*http_stream);
242 239
243 // Because we abandoned the stream, we don't expect to find a session in the 240 // Because we abandoned the stream, we don't expect to find a session in the
244 // pool anymore. 241 // pool anymore.
245 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 242 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
246 243
247 TestLoadTimingNotReused(*http_stream); 244 TestLoadTimingNotReused(*http_stream);
248 http_stream->Close(true); 245 http_stream->Close(true);
249 // Test that there's no crash when trying to get the load timing after the 246 // Test that there's no crash when trying to get the load timing after the
250 // stream has been closed. 247 // stream has been closed.
251 TestLoadTimingNotReused(*http_stream); 248 TestLoadTimingNotReused(*http_stream);
252 249
253 EXPECT_EQ(static_cast<int64_t>(req->size()), 250 EXPECT_EQ(static_cast<int64_t>(req->size()),
254 http_stream->GetTotalSentBytes()); 251 http_stream->GetTotalSentBytes());
255 EXPECT_EQ(static_cast<int64_t>(resp->size()), 252 EXPECT_EQ(static_cast<int64_t>(resp->size()),
(...skipping 18 matching lines...) Expand all
274 std::unique_ptr<SpdySerializedFrame> body2( 271 std::unique_ptr<SpdySerializedFrame> body2(
275 spdy_util_.ConstructSpdyBodyFrame(3, "", 0, true)); 272 spdy_util_.ConstructSpdyBodyFrame(3, "", 0, true));
276 MockRead reads[] = { 273 MockRead reads[] = {
277 CreateMockRead(*resp1, 2), 274 CreateMockRead(*resp1, 2),
278 CreateMockRead(*body1, 3), 275 CreateMockRead(*body1, 3),
279 CreateMockRead(*resp2, 4), 276 CreateMockRead(*resp2, 4),
280 CreateMockRead(*body2, 5), 277 CreateMockRead(*body2, 5),
281 MockRead(ASYNC, 0, 6) // EOF 278 MockRead(ASYNC, 0, 6) // EOF
282 }; 279 };
283 280
284 HostPortPair host_port_pair("www.example.org", 80); 281 InitSession(reads, arraysize(reads), writes, arraysize(writes));
285 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
286 PRIVACY_MODE_DISABLED);
287 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
288 282
289 HttpRequestInfo request1; 283 HttpRequestInfo request1;
290 request1.method = "GET"; 284 request1.method = "GET";
291 request1.url = GURL("http://www.example.org/"); 285 request1.url = GURL("http://www.example.org/");
292 TestCompletionCallback callback1; 286 TestCompletionCallback callback1;
293 HttpResponseInfo response1; 287 HttpResponseInfo response1;
294 HttpRequestHeaders headers1; 288 HttpRequestHeaders headers1;
295 std::unique_ptr<SpdyHttpStream> http_stream1( 289 std::unique_ptr<SpdyHttpStream> http_stream1(
296 new SpdyHttpStream(session_, true)); 290 new SpdyHttpStream(session_, true));
297 291
298 HttpRequestInfo request2; 292 HttpRequestInfo request2;
299 request2.method = "GET"; 293 request2.method = "GET";
300 request2.url = GURL("http://www.example.org/"); 294 request2.url = GURL("http://www.example.org/");
301 TestCompletionCallback callback2; 295 TestCompletionCallback callback2;
302 HttpResponseInfo response2; 296 HttpResponseInfo response2;
303 HttpRequestHeaders headers2; 297 HttpRequestHeaders headers2;
304 std::unique_ptr<SpdyHttpStream> http_stream2( 298 std::unique_ptr<SpdyHttpStream> http_stream2(
305 new SpdyHttpStream(session_, true)); 299 new SpdyHttpStream(session_, true));
306 300
307 // First write. 301 // First write.
308 ASSERT_EQ(OK, 302 ASSERT_EQ(OK,
309 http_stream1->InitializeStream(&request1, DEFAULT_PRIORITY, 303 http_stream1->InitializeStream(&request1, DEFAULT_PRIORITY,
310 BoundNetLog(), 304 BoundNetLog(),
311 CompletionCallback())); 305 CompletionCallback()));
312 EXPECT_EQ(ERR_IO_PENDING, http_stream1->SendRequest(headers1, &response1, 306 EXPECT_EQ(ERR_IO_PENDING, http_stream1->SendRequest(headers1, &response1,
313 callback1.callback())); 307 callback1.callback()));
314 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 308 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
315 309
316 EXPECT_LE(0, callback1.WaitForResult()); 310 EXPECT_LE(0, callback1.WaitForResult());
317 311
318 TestLoadTimingNotReused(*http_stream1); 312 TestLoadTimingNotReused(*http_stream1);
319 LoadTimingInfo load_timing_info1; 313 LoadTimingInfo load_timing_info1;
320 LoadTimingInfo load_timing_info2; 314 LoadTimingInfo load_timing_info2;
321 EXPECT_TRUE(http_stream1->GetLoadTimingInfo(&load_timing_info1)); 315 EXPECT_TRUE(http_stream1->GetLoadTimingInfo(&load_timing_info1));
322 EXPECT_FALSE(http_stream2->GetLoadTimingInfo(&load_timing_info2)); 316 EXPECT_FALSE(http_stream2->GetLoadTimingInfo(&load_timing_info2));
323 317
324 // Second write. 318 // Second write.
325 ASSERT_EQ(OK, 319 ASSERT_EQ(OK,
326 http_stream2->InitializeStream(&request2, DEFAULT_PRIORITY, 320 http_stream2->InitializeStream(&request2, DEFAULT_PRIORITY,
327 BoundNetLog(), 321 BoundNetLog(),
328 CompletionCallback())); 322 CompletionCallback()));
329 EXPECT_EQ(ERR_IO_PENDING, http_stream2->SendRequest(headers2, &response2, 323 EXPECT_EQ(ERR_IO_PENDING, http_stream2->SendRequest(headers2, &response2,
330 callback2.callback())); 324 callback2.callback()));
331 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 325 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
332 326
333 EXPECT_LE(0, callback2.WaitForResult()); 327 EXPECT_LE(0, callback2.WaitForResult());
334 TestLoadTimingReused(*http_stream2); 328 TestLoadTimingReused(*http_stream2);
335 EXPECT_TRUE(http_stream2->GetLoadTimingInfo(&load_timing_info2)); 329 EXPECT_TRUE(http_stream2->GetLoadTimingInfo(&load_timing_info2));
336 EXPECT_EQ(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id); 330 EXPECT_EQ(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id);
337 331
338 // Read stream 1 to completion, before making sure we can still read load 332 // Read stream 1 to completion, before making sure we can still read load
339 // timing from both streams. 333 // timing from both streams.
340 scoped_refptr<IOBuffer> buf1(new IOBuffer(1)); 334 scoped_refptr<IOBuffer> buf1(new IOBuffer(1));
341 ASSERT_EQ( 335 ASSERT_EQ(
(...skipping 29 matching lines...) Expand all
371 }; 365 };
372 366
373 std::unique_ptr<SpdySerializedFrame> resp( 367 std::unique_ptr<SpdySerializedFrame> resp(
374 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 368 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
375 MockRead reads[] = { 369 MockRead reads[] = {
376 CreateMockRead(*resp, 2), 370 CreateMockRead(*resp, 2),
377 CreateMockRead(*body, 3), 371 CreateMockRead(*body, 3),
378 MockRead(SYNCHRONOUS, 0, 4) // EOF 372 MockRead(SYNCHRONOUS, 0, 4) // EOF
379 }; 373 };
380 374
381 HostPortPair host_port_pair("www.example.org", 80); 375 InitSession(reads, arraysize(reads), writes, arraysize(writes));
382 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
383 PRIVACY_MODE_DISABLED);
384 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
385 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); 376 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
386 377
387 ChunkedUploadDataStream upload_stream(0); 378 ChunkedUploadDataStream upload_stream(0);
388 const int kFirstChunkSize = kUploadDataSize/2; 379 const int kFirstChunkSize = kUploadDataSize/2;
389 upload_stream.AppendData(kUploadData, kFirstChunkSize, false); 380 upload_stream.AppendData(kUploadData, kFirstChunkSize, false);
390 upload_stream.AppendData(kUploadData + kFirstChunkSize, 381 upload_stream.AppendData(kUploadData + kFirstChunkSize,
391 kUploadDataSize - kFirstChunkSize, true); 382 kUploadDataSize - kFirstChunkSize, true);
392 383
393 HttpRequestInfo request; 384 HttpRequestInfo request;
394 request.method = "POST"; 385 request.method = "POST";
395 request.url = GURL("http://www.example.org/"); 386 request.url = GURL("http://www.example.org/");
396 request.upload_data_stream = &upload_stream; 387 request.upload_data_stream = &upload_stream;
397 388
398 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 389 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
399 390
400 TestCompletionCallback callback; 391 TestCompletionCallback callback;
401 HttpResponseInfo response; 392 HttpResponseInfo response;
402 HttpRequestHeaders headers; 393 HttpRequestHeaders headers;
403 BoundNetLog net_log; 394 BoundNetLog net_log;
404 SpdyHttpStream http_stream(session_, true); 395 SpdyHttpStream http_stream(session_, true);
405 ASSERT_EQ( 396 ASSERT_EQ(
406 OK, 397 OK,
407 http_stream.InitializeStream(&request, DEFAULT_PRIORITY, 398 http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
408 net_log, CompletionCallback())); 399 net_log, CompletionCallback()));
409 400
410 EXPECT_EQ(ERR_IO_PENDING, http_stream.SendRequest( 401 EXPECT_EQ(ERR_IO_PENDING, http_stream.SendRequest(
411 headers, &response, callback.callback())); 402 headers, &response, callback.callback()));
412 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 403 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
413 404
414 EXPECT_EQ(OK, callback.WaitForResult()); 405 EXPECT_EQ(OK, callback.WaitForResult());
415 406
416 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), 407 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()),
417 http_stream.GetTotalSentBytes()); 408 http_stream.GetTotalSentBytes());
418 EXPECT_EQ(static_cast<int64_t>(resp->size() + body->size()), 409 EXPECT_EQ(static_cast<int64_t>(resp->size() + body->size()),
419 http_stream.GetTotalReceivedBytes()); 410 http_stream.GetTotalReceivedBytes());
420 411
421 // Because the server closed the connection, we there shouldn't be a session 412 // Because the server closed the connection, we there shouldn't be a session
422 // in the pool anymore. 413 // in the pool anymore.
423 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 414 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
424 } 415 }
425 416
426 // This unittest tests the request callback is properly called and handled. 417 // This unittest tests the request callback is properly called and handled.
427 TEST_P(SpdyHttpStreamTest, SendChunkedPostLastEmpty) { 418 TEST_P(SpdyHttpStreamTest, SendChunkedPostLastEmpty) {
428 std::unique_ptr<SpdySerializedFrame> req( 419 std::unique_ptr<SpdySerializedFrame> req(
429 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0)); 420 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
430 std::unique_ptr<SpdySerializedFrame> chunk( 421 std::unique_ptr<SpdySerializedFrame> chunk(
431 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); 422 spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true));
432 MockWrite writes[] = { 423 MockWrite writes[] = {
433 CreateMockWrite(*req, 0), // request 424 CreateMockWrite(*req, 0), // request
434 CreateMockWrite(*chunk, 1), 425 CreateMockWrite(*chunk, 1),
435 }; 426 };
436 427
437 std::unique_ptr<SpdySerializedFrame> resp( 428 std::unique_ptr<SpdySerializedFrame> resp(
438 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 429 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
439 MockRead reads[] = { 430 MockRead reads[] = {
440 CreateMockRead(*resp, 2), 431 CreateMockRead(*resp, 2),
441 CreateMockRead(*chunk, 3), 432 CreateMockRead(*chunk, 3),
442 MockRead(SYNCHRONOUS, 0, 4) // EOF 433 MockRead(SYNCHRONOUS, 0, 4) // EOF
443 }; 434 };
444 435
445 HostPortPair host_port_pair("www.example.org", 80); 436 InitSession(reads, arraysize(reads), writes, arraysize(writes));
446 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
447 PRIVACY_MODE_DISABLED);
448 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
449 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); 437 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
450 438
451 ChunkedUploadDataStream upload_stream(0); 439 ChunkedUploadDataStream upload_stream(0);
452 upload_stream.AppendData(nullptr, 0, true); 440 upload_stream.AppendData(nullptr, 0, true);
453 441
454 HttpRequestInfo request; 442 HttpRequestInfo request;
455 request.method = "POST"; 443 request.method = "POST";
456 request.url = GURL("http://www.example.org/"); 444 request.url = GURL("http://www.example.org/");
457 request.upload_data_stream = &upload_stream; 445 request.upload_data_stream = &upload_stream;
458 446
459 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 447 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
460 448
461 TestCompletionCallback callback; 449 TestCompletionCallback callback;
462 HttpResponseInfo response; 450 HttpResponseInfo response;
463 HttpRequestHeaders headers; 451 HttpRequestHeaders headers;
464 BoundNetLog net_log; 452 BoundNetLog net_log;
465 SpdyHttpStream http_stream(session_, true); 453 SpdyHttpStream http_stream(session_, true);
466 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, 454 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
467 net_log, CompletionCallback())); 455 net_log, CompletionCallback()));
468 EXPECT_EQ(ERR_IO_PENDING, 456 EXPECT_EQ(ERR_IO_PENDING,
469 http_stream.SendRequest(headers, &response, callback.callback())); 457 http_stream.SendRequest(headers, &response, callback.callback()));
470 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 458 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
471 459
472 EXPECT_EQ(OK, callback.WaitForResult()); 460 EXPECT_EQ(OK, callback.WaitForResult());
473 461
474 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()), 462 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()),
475 http_stream.GetTotalSentBytes()); 463 http_stream.GetTotalSentBytes());
476 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()), 464 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()),
477 http_stream.GetTotalReceivedBytes()); 465 http_stream.GetTotalReceivedBytes());
478 466
479 // Because the server closed the connection, there shouldn't be a session 467 // Because the server closed the connection, there shouldn't be a session
480 // in the pool anymore. 468 // in the pool anymore.
481 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 469 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
482 } 470 }
483 471
484 TEST_P(SpdyHttpStreamTest, ConnectionClosedDuringChunkedPost) { 472 TEST_P(SpdyHttpStreamTest, ConnectionClosedDuringChunkedPost) {
485 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 473 BufferedSpdyFramer framer(spdy_util_.spdy_version());
486 474
487 std::unique_ptr<SpdySerializedFrame> req( 475 std::unique_ptr<SpdySerializedFrame> req(
488 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0)); 476 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
489 std::unique_ptr<SpdySerializedFrame> body( 477 std::unique_ptr<SpdySerializedFrame> body(
490 framer.CreateDataFrame(1, kUploadData, kUploadDataSize, DATA_FLAG_NONE)); 478 framer.CreateDataFrame(1, kUploadData, kUploadDataSize, DATA_FLAG_NONE));
491 MockWrite writes[] = { 479 MockWrite writes[] = {
492 CreateMockWrite(*req, 0), // Request 480 CreateMockWrite(*req, 0), // Request
493 CreateMockWrite(*body, 1) // First POST upload frame 481 CreateMockWrite(*body, 1) // First POST upload frame
494 }; 482 };
495 483
496 std::unique_ptr<SpdySerializedFrame> resp( 484 std::unique_ptr<SpdySerializedFrame> resp(
497 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 485 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
498 MockRead reads[] = { 486 MockRead reads[] = {
499 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2) // Server hangs up early. 487 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2) // Server hangs up early.
500 }; 488 };
501 489
502 HostPortPair host_port_pair("www.example.org", 80); 490 InitSession(reads, arraysize(reads), writes, arraysize(writes));
503 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
504 PRIVACY_MODE_DISABLED);
505 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
506 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); 491 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
507 492
508 ChunkedUploadDataStream upload_stream(0); 493 ChunkedUploadDataStream upload_stream(0);
509 // Append first chunk. 494 // Append first chunk.
510 upload_stream.AppendData(kUploadData, kUploadDataSize, false); 495 upload_stream.AppendData(kUploadData, kUploadDataSize, false);
511 496
512 HttpRequestInfo request; 497 HttpRequestInfo request;
513 request.method = "POST"; 498 request.method = "POST";
514 request.url = GURL("http://www.example.org/"); 499 request.url = GURL("http://www.example.org/");
515 request.upload_data_stream = &upload_stream; 500 request.upload_data_stream = &upload_stream;
516 501
517 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 502 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
518 503
519 TestCompletionCallback callback; 504 TestCompletionCallback callback;
520 HttpResponseInfo response; 505 HttpResponseInfo response;
521 HttpRequestHeaders headers; 506 HttpRequestHeaders headers;
522 BoundNetLog net_log; 507 BoundNetLog net_log;
523 SpdyHttpStream http_stream(session_, true); 508 SpdyHttpStream http_stream(session_, true);
524 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, 509 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
525 net_log, CompletionCallback())); 510 net_log, CompletionCallback()));
526 511
527 EXPECT_EQ(ERR_IO_PENDING, 512 EXPECT_EQ(ERR_IO_PENDING,
528 http_stream.SendRequest(headers, &response, callback.callback())); 513 http_stream.SendRequest(headers, &response, callback.callback()));
529 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 514 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
530 515
531 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); 516 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult());
532 517
533 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), 518 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()),
534 http_stream.GetTotalSentBytes()); 519 http_stream.GetTotalSentBytes());
535 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes()); 520 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes());
536 521
537 // Because the server closed the connection, we there shouldn't be a session 522 // Because the server closed the connection, we there shouldn't be a session
538 // in the pool anymore. 523 // in the pool anymore.
539 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 524 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
540 525
541 // Appending a second chunk now should not result in a crash. 526 // Appending a second chunk now should not result in a crash.
542 upload_stream.AppendData(kUploadData, kUploadDataSize, true); 527 upload_stream.AppendData(kUploadData, kUploadDataSize, true);
543 // Appending data is currently done synchronously, but seems best to be 528 // Appending data is currently done synchronously, but seems best to be
544 // paranoid. 529 // paranoid.
545 base::RunLoop().RunUntilIdle(); 530 base::RunLoop().RunUntilIdle();
546 531
547 // The total sent and received bytes should be unchanged. 532 // The total sent and received bytes should be unchanged.
548 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), 533 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()),
549 http_stream.GetTotalSentBytes()); 534 http_stream.GetTotalSentBytes());
(...skipping 22 matching lines...) Expand all
572 std::unique_ptr<SpdySerializedFrame> resp( 557 std::unique_ptr<SpdySerializedFrame> resp(
573 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 558 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
574 MockRead reads[] = { 559 MockRead reads[] = {
575 CreateMockRead(*resp, 4), 560 CreateMockRead(*resp, 4),
576 CreateMockRead(*chunk1, 5), 561 CreateMockRead(*chunk1, 5),
577 CreateMockRead(*chunk2, 6), 562 CreateMockRead(*chunk2, 6),
578 CreateMockRead(*chunk3, 7), 563 CreateMockRead(*chunk3, 7),
579 MockRead(ASYNC, 0, 8) // EOF 564 MockRead(ASYNC, 0, 8) // EOF
580 }; 565 };
581 566
582 HostPortPair host_port_pair("www.example.org", 80); 567 InitSession(reads, arraysize(reads), writes, arraysize(writes));
583 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
584 PRIVACY_MODE_DISABLED);
585 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
586 568
587 ChunkedUploadDataStream upload_stream(0); 569 ChunkedUploadDataStream upload_stream(0);
588 570
589 HttpRequestInfo request; 571 HttpRequestInfo request;
590 request.method = "POST"; 572 request.method = "POST";
591 request.url = GURL("http://www.example.org/"); 573 request.url = GURL("http://www.example.org/");
592 request.upload_data_stream = &upload_stream; 574 request.upload_data_stream = &upload_stream;
593 575
594 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 576 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
595 upload_stream.AppendData(kUploadData, kUploadDataSize, false); 577 upload_stream.AppendData(kUploadData, kUploadDataSize, false);
596 578
597 BoundNetLog net_log; 579 BoundNetLog net_log;
598 std::unique_ptr<SpdyHttpStream> http_stream( 580 std::unique_ptr<SpdyHttpStream> http_stream(
599 new SpdyHttpStream(session_, true)); 581 new SpdyHttpStream(session_, true));
600 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, 582 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY,
601 net_log, CompletionCallback())); 583 net_log, CompletionCallback()));
602 584
603 TestCompletionCallback callback; 585 TestCompletionCallback callback;
604 HttpRequestHeaders headers; 586 HttpRequestHeaders headers;
605 HttpResponseInfo response; 587 HttpResponseInfo response;
606 // This will attempt to Write() the initial request and headers, which will 588 // This will attempt to Write() the initial request and headers, which will
607 // complete asynchronously. 589 // complete asynchronously.
608 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 590 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
609 callback.callback())); 591 callback.callback()));
610 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 592 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
611 593
612 // Complete the initial request write and the first chunk. 594 // Complete the initial request write and the first chunk.
613 base::RunLoop().RunUntilIdle(); 595 base::RunLoop().RunUntilIdle();
614 ASSERT_FALSE(callback.have_result()); 596 ASSERT_FALSE(callback.have_result());
615 597
616 // Now append the final two chunks which will enqueue two more writes. 598 // Now append the final two chunks which will enqueue two more writes.
617 upload_stream.AppendData(kUploadData1, kUploadData1Size, false); 599 upload_stream.AppendData(kUploadData1, kUploadData1Size, false);
618 upload_stream.AppendData(kUploadData, kUploadDataSize, true); 600 upload_stream.AppendData(kUploadData, kUploadDataSize, true);
619 601
620 // Finish writing all the chunks and do all reads. 602 // Finish writing all the chunks and do all reads.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 }; 655 };
674 std::unique_ptr<SpdySerializedFrame> resp( 656 std::unique_ptr<SpdySerializedFrame> resp(
675 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 657 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
676 MockRead reads[] = { 658 MockRead reads[] = {
677 CreateMockRead(*resp, 3), 659 CreateMockRead(*resp, 3),
678 CreateMockRead(*chunk1, 4), 660 CreateMockRead(*chunk1, 4),
679 CreateMockRead(*chunk2, 5), 661 CreateMockRead(*chunk2, 5),
680 MockRead(ASYNC, 0, 6) // EOF 662 MockRead(ASYNC, 0, 6) // EOF
681 }; 663 };
682 664
683 HostPortPair host_port_pair("www.example.org", 80); 665 InitSession(reads, arraysize(reads), writes, arraysize(writes));
684 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
685 PRIVACY_MODE_DISABLED);
686 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
687 666
688 ChunkedUploadDataStream upload_stream(0); 667 ChunkedUploadDataStream upload_stream(0);
689 668
690 HttpRequestInfo request; 669 HttpRequestInfo request;
691 request.method = "POST"; 670 request.method = "POST";
692 request.url = GURL("http://www.example.org/"); 671 request.url = GURL("http://www.example.org/");
693 request.upload_data_stream = &upload_stream; 672 request.upload_data_stream = &upload_stream;
694 673
695 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 674 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
696 upload_stream.AppendData(kUploadData, kUploadDataSize, false); 675 upload_stream.AppendData(kUploadData, kUploadDataSize, false);
697 676
698 BoundNetLog net_log; 677 BoundNetLog net_log;
699 std::unique_ptr<SpdyHttpStream> http_stream( 678 std::unique_ptr<SpdyHttpStream> http_stream(
700 new SpdyHttpStream(session_, true)); 679 new SpdyHttpStream(session_, true));
701 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, 680 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY,
702 net_log, CompletionCallback())); 681 net_log, CompletionCallback()));
703 682
704 TestCompletionCallback callback; 683 TestCompletionCallback callback;
705 HttpRequestHeaders headers; 684 HttpRequestHeaders headers;
706 HttpResponseInfo response; 685 HttpResponseInfo response;
707 // This will attempt to Write() the initial request and headers, which will 686 // This will attempt to Write() the initial request and headers, which will
708 // complete asynchronously. 687 // complete asynchronously.
709 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 688 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
710 callback.callback())); 689 callback.callback()));
711 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 690 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
712 691
713 // Complete the initial request write and the first chunk. 692 // Complete the initial request write and the first chunk.
714 base::RunLoop().RunUntilIdle(); 693 base::RunLoop().RunUntilIdle();
715 ASSERT_FALSE(callback.have_result()); 694 ASSERT_FALSE(callback.have_result());
716 695
717 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), 696 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()),
718 http_stream->GetTotalSentBytes()); 697 http_stream->GetTotalSentBytes());
719 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); 698 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes());
720 699
721 // Now end the stream with an empty data frame and the FIN set. 700 // Now end the stream with an empty data frame and the FIN set.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 CreateMockWrite(*chunk, 1), 742 CreateMockWrite(*chunk, 1),
764 }; 743 };
765 std::unique_ptr<SpdySerializedFrame> resp( 744 std::unique_ptr<SpdySerializedFrame> resp(
766 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 745 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
767 MockRead reads[] = { 746 MockRead reads[] = {
768 CreateMockRead(*resp, 2), 747 CreateMockRead(*resp, 2),
769 CreateMockRead(*chunk, 3), 748 CreateMockRead(*chunk, 3),
770 MockRead(ASYNC, 0, 4) // EOF 749 MockRead(ASYNC, 0, 4) // EOF
771 }; 750 };
772 751
773 HostPortPair host_port_pair("www.example.org", 80); 752 InitSession(reads, arraysize(reads), writes, arraysize(writes));
774 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
775 PRIVACY_MODE_DISABLED);
776 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
777 753
778 ChunkedUploadDataStream upload_stream(0); 754 ChunkedUploadDataStream upload_stream(0);
779 755
780 HttpRequestInfo request; 756 HttpRequestInfo request;
781 request.method = "POST"; 757 request.method = "POST";
782 request.url = GURL("http://www.example.org/"); 758 request.url = GURL("http://www.example.org/");
783 request.upload_data_stream = &upload_stream; 759 request.upload_data_stream = &upload_stream;
784 760
785 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 761 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
786 upload_stream.AppendData("", 0, true); 762 upload_stream.AppendData("", 0, true);
787 763
788 BoundNetLog net_log; 764 BoundNetLog net_log;
789 std::unique_ptr<SpdyHttpStream> http_stream( 765 std::unique_ptr<SpdyHttpStream> http_stream(
790 new SpdyHttpStream(session_, true)); 766 new SpdyHttpStream(session_, true));
791 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, 767 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY,
792 net_log, CompletionCallback())); 768 net_log, CompletionCallback()));
793 769
794 TestCompletionCallback callback; 770 TestCompletionCallback callback;
795 HttpRequestHeaders headers; 771 HttpRequestHeaders headers;
796 HttpResponseInfo response; 772 HttpResponseInfo response;
797 // This will attempt to Write() the initial request and headers, which will 773 // This will attempt to Write() the initial request and headers, which will
798 // complete asynchronously. 774 // complete asynchronously.
799 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 775 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
800 callback.callback())); 776 callback.callback()));
801 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 777 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
802 778
803 // Complete writing request, followed by a FIN. 779 // Complete writing request, followed by a FIN.
804 base::RunLoop().RunUntilIdle(); 780 base::RunLoop().RunUntilIdle();
805 ASSERT_TRUE(callback.have_result()); 781 ASSERT_TRUE(callback.have_result());
806 EXPECT_EQ(OK, callback.WaitForResult()); 782 EXPECT_EQ(OK, callback.WaitForResult());
807 783
808 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()), 784 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk->size()),
809 http_stream->GetTotalSentBytes()); 785 http_stream->GetTotalSentBytes());
810 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()), 786 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk->size()),
811 http_stream->GetTotalReceivedBytes()); 787 http_stream->GetTotalReceivedBytes());
(...skipping 19 matching lines...) Expand all
831 spdy_util_.ConstructSpdyGet(base_url, 1, LOWEST)); 807 spdy_util_.ConstructSpdyGet(base_url, 1, LOWEST));
832 MockWrite writes[] = { 808 MockWrite writes[] = {
833 CreateMockWrite(*req.get(), 0), 809 CreateMockWrite(*req.get(), 0),
834 }; 810 };
835 std::unique_ptr<SpdySerializedFrame> resp( 811 std::unique_ptr<SpdySerializedFrame> resp(
836 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 812 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
837 MockRead reads[] = { 813 MockRead reads[] = {
838 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 814 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
839 }; 815 };
840 816
841 HostPortPair host_port_pair("www.example.org", 80); 817 InitSession(reads, arraysize(reads), writes, arraysize(writes));
842 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
843 PRIVACY_MODE_DISABLED);
844 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
845 818
846 HttpRequestInfo request; 819 HttpRequestInfo request;
847 request.method = "GET"; 820 request.method = "GET";
848 request.url = GURL(full_url); 821 request.url = GURL(full_url);
849 TestCompletionCallback callback; 822 TestCompletionCallback callback;
850 HttpResponseInfo response; 823 HttpResponseInfo response;
851 HttpRequestHeaders headers; 824 HttpRequestHeaders headers;
852 BoundNetLog net_log; 825 BoundNetLog net_log;
853 std::unique_ptr<SpdyHttpStream> http_stream( 826 std::unique_ptr<SpdyHttpStream> http_stream(
854 new SpdyHttpStream(session_, true)); 827 new SpdyHttpStream(session_, true));
855 ASSERT_EQ(OK, 828 ASSERT_EQ(OK,
856 http_stream->InitializeStream( 829 http_stream->InitializeStream(
857 &request, DEFAULT_PRIORITY, net_log, CompletionCallback())); 830 &request, DEFAULT_PRIORITY, net_log, CompletionCallback()));
858 831
859 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 832 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
860 callback.callback())); 833 callback.callback()));
861 834
862 EXPECT_EQ(base_url, http_stream->stream()->GetUrlFromHeaders().spec()); 835 EXPECT_EQ(base_url, http_stream->stream()->GetUrlFromHeaders().spec());
863 836
864 callback.WaitForResult(); 837 callback.WaitForResult();
865 838
866 EXPECT_EQ(static_cast<int64_t>(req->size()), 839 EXPECT_EQ(static_cast<int64_t>(req->size()),
867 http_stream->GetTotalSentBytes()); 840 http_stream->GetTotalSentBytes());
868 EXPECT_EQ(static_cast<int64_t>(resp->size()), 841 EXPECT_EQ(static_cast<int64_t>(resp->size()),
869 http_stream->GetTotalReceivedBytes()); 842 http_stream->GetTotalReceivedBytes());
870 843
871 // Because we abandoned the stream, we don't expect to find a session in the 844 // Because we abandoned the stream, we don't expect to find a session in the
872 // pool anymore. 845 // pool anymore.
873 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 846 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
874 } 847 }
875 848
876 // Test the receipt of a WINDOW_UPDATE frame while waiting for a chunk to be 849 // Test the receipt of a WINDOW_UPDATE frame while waiting for a chunk to be
877 // made available is handled correctly. 850 // made available is handled correctly.
878 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPostWithWindowUpdate) { 851 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPostWithWindowUpdate) {
879 std::unique_ptr<SpdySerializedFrame> req( 852 std::unique_ptr<SpdySerializedFrame> req(
880 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0)); 853 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
881 std::unique_ptr<SpdySerializedFrame> chunk1( 854 std::unique_ptr<SpdySerializedFrame> chunk1(
882 spdy_util_.ConstructSpdyBodyFrame(1, true)); 855 spdy_util_.ConstructSpdyBodyFrame(1, true));
883 MockWrite writes[] = { 856 MockWrite writes[] = {
884 CreateMockWrite(*req.get(), 0), 857 CreateMockWrite(*req.get(), 0),
885 CreateMockWrite(*chunk1, 1), 858 CreateMockWrite(*chunk1, 1),
886 }; 859 };
887 std::unique_ptr<SpdySerializedFrame> resp( 860 std::unique_ptr<SpdySerializedFrame> resp(
888 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 861 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
889 std::unique_ptr<SpdySerializedFrame> window_update( 862 std::unique_ptr<SpdySerializedFrame> window_update(
890 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize)); 863 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize));
891 MockRead reads[] = { 864 MockRead reads[] = {
892 CreateMockRead(*window_update, 2), 865 CreateMockRead(*window_update, 2),
893 MockRead(ASYNC, ERR_IO_PENDING, 3), 866 MockRead(ASYNC, ERR_IO_PENDING, 3),
894 CreateMockRead(*resp, 4), 867 CreateMockRead(*resp, 4),
895 CreateMockRead(*chunk1, 5), 868 CreateMockRead(*chunk1, 5),
896 MockRead(ASYNC, 0, 6) // EOF 869 MockRead(ASYNC, 0, 6) // EOF
897 }; 870 };
898 871
899 HostPortPair host_port_pair("www.example.org", 80); 872 InitSession(reads, arraysize(reads), writes, arraysize(writes));
900 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
901 PRIVACY_MODE_DISABLED);
902
903 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
904 873
905 ChunkedUploadDataStream upload_stream(0); 874 ChunkedUploadDataStream upload_stream(0);
906 875
907 HttpRequestInfo request; 876 HttpRequestInfo request;
908 request.method = "POST"; 877 request.method = "POST";
909 request.url = GURL("http://www.example.org/"); 878 request.url = GURL("http://www.example.org/");
910 request.upload_data_stream = &upload_stream; 879 request.upload_data_stream = &upload_stream;
911 880
912 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback())); 881 ASSERT_EQ(OK, upload_stream.Init(TestCompletionCallback().callback()));
913 882
914 BoundNetLog net_log; 883 BoundNetLog net_log;
915 std::unique_ptr<SpdyHttpStream> http_stream( 884 std::unique_ptr<SpdyHttpStream> http_stream(
916 new SpdyHttpStream(session_, true)); 885 new SpdyHttpStream(session_, true));
917 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY, 886 ASSERT_EQ(OK, http_stream->InitializeStream(&request, DEFAULT_PRIORITY,
918 net_log, CompletionCallback())); 887 net_log, CompletionCallback()));
919 888
920 HttpRequestHeaders headers; 889 HttpRequestHeaders headers;
921 HttpResponseInfo response; 890 HttpResponseInfo response;
922 // This will attempt to Write() the initial request and headers, which will 891 // This will attempt to Write() the initial request and headers, which will
923 // complete asynchronously. 892 // complete asynchronously.
924 TestCompletionCallback callback; 893 TestCompletionCallback callback;
925 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 894 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
926 callback.callback())); 895 callback.callback()));
927 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 896 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key_));
928 897
929 // Complete the initial request write and first chunk. 898 // Complete the initial request write and first chunk.
930 base::RunLoop().RunUntilIdle(); 899 base::RunLoop().RunUntilIdle();
931 ASSERT_FALSE(callback.have_result()); 900 ASSERT_FALSE(callback.have_result());
932 901
933 EXPECT_EQ(static_cast<int64_t>(req->size()), 902 EXPECT_EQ(static_cast<int64_t>(req->size()),
934 http_stream->GetTotalSentBytes()); 903 http_stream->GetTotalSentBytes());
935 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); 904 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes());
936 905
937 upload_stream.AppendData(kUploadData, kUploadDataSize, true); 906 upload_stream.AppendData(kUploadData, kUploadDataSize, true);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 CreateMockWrite(*rst_frame, 1, SYNCHRONOUS) // Reset frame 966 CreateMockWrite(*rst_frame, 1, SYNCHRONOUS) // Reset frame
998 }; 967 };
999 968
1000 std::unique_ptr<SpdySerializedFrame> resp( 969 std::unique_ptr<SpdySerializedFrame> resp(
1001 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 970 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
1002 971
1003 MockRead reads[] = { 972 MockRead reads[] = {
1004 CreateMockRead(*resp, 2), MockRead(SYNCHRONOUS, 0, 3), 973 CreateMockRead(*resp, 2), MockRead(SYNCHRONOUS, 0, 3),
1005 }; 974 };
1006 975
1007 HostPortPair host_port_pair("www.example.org", 80); 976 InitSession(reads, arraysize(reads), writes, arraysize(writes));
1008 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
1009 PRIVACY_MODE_DISABLED);
1010 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
1011 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); 977 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
1012 978
1013 ReadErrorUploadDataStream upload_data_stream( 979 ReadErrorUploadDataStream upload_data_stream(
1014 ReadErrorUploadDataStream::FailureMode::SYNC); 980 ReadErrorUploadDataStream::FailureMode::SYNC);
1015 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); 981 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback()));
1016 982
1017 HttpRequestInfo request; 983 HttpRequestInfo request;
1018 request.method = "POST"; 984 request.method = "POST";
1019 request.url = GURL("http://www.example.org/"); 985 request.url = GURL("http://www.example.org/");
1020 request.upload_data_stream = &upload_data_stream; 986 request.upload_data_stream = &upload_data_stream;
1021 987
1022 TestCompletionCallback callback; 988 TestCompletionCallback callback;
1023 HttpResponseInfo response; 989 HttpResponseInfo response;
1024 HttpRequestHeaders headers; 990 HttpRequestHeaders headers;
1025 BoundNetLog net_log; 991 BoundNetLog net_log;
1026 SpdyHttpStream http_stream(session_, true); 992 SpdyHttpStream http_stream(session_, true);
1027 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, 993 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
1028 net_log, CompletionCallback())); 994 net_log, CompletionCallback()));
1029 995
1030 int result = http_stream.SendRequest(headers, &response, callback.callback()); 996 int result = http_stream.SendRequest(headers, &response, callback.callback());
1031 EXPECT_EQ(ERR_FAILED, callback.GetResult(result)); 997 EXPECT_EQ(ERR_FAILED, callback.GetResult(result));
1032 998
1033 // Because the server has not closed the connection yet, there shouldn't be 999 // Because the server has not closed the connection yet, there shouldn't be
1034 // a stream but a session in the pool 1000 // a stream but a session in the pool
1035 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 1001 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
1036 } 1002 }
1037 1003
1038 TEST_P(SpdyHttpStreamTest, DataReadErrorAsynchronous) { 1004 TEST_P(SpdyHttpStreamTest, DataReadErrorAsynchronous) {
1039 std::unique_ptr<SpdySerializedFrame> req( 1005 std::unique_ptr<SpdySerializedFrame> req(
1040 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0)); 1006 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
1041 1007
1042 // Server receives RST_STREAM_INTERNAL_ERROR on client's internal failure. 1008 // Server receives RST_STREAM_INTERNAL_ERROR on client's internal failure.
1043 // The failure is a reading error in this case caused by 1009 // The failure is a reading error in this case caused by
1044 // UploadDataStream::Read(). 1010 // UploadDataStream::Read().
1045 std::unique_ptr<SpdySerializedFrame> rst_frame( 1011 std::unique_ptr<SpdySerializedFrame> rst_frame(
1046 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_INTERNAL_ERROR)); 1012 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_INTERNAL_ERROR));
1047 1013
1048 MockWrite writes[] = { 1014 MockWrite writes[] = {
1049 CreateMockWrite(*req, 0), // Request 1015 CreateMockWrite(*req, 0), // Request
1050 CreateMockWrite(*rst_frame, 1) // Reset frame 1016 CreateMockWrite(*rst_frame, 1) // Reset frame
1051 }; 1017 };
1052 1018
1053 std::unique_ptr<SpdySerializedFrame> resp( 1019 std::unique_ptr<SpdySerializedFrame> resp(
1054 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0)); 1020 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
1055 1021
1056 MockRead reads[] = { 1022 MockRead reads[] = {
1057 MockRead(ASYNC, 0, 2), 1023 MockRead(ASYNC, 0, 2),
1058 }; 1024 };
1059 1025
1060 HostPortPair host_port_pair("www.example.org", 80); 1026 InitSession(reads, arraysize(reads), writes, arraysize(writes));
1061 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
1062 PRIVACY_MODE_DISABLED);
1063 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
1064 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); 1027 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
1065 1028
1066 ReadErrorUploadDataStream upload_data_stream( 1029 ReadErrorUploadDataStream upload_data_stream(
1067 ReadErrorUploadDataStream::FailureMode::ASYNC); 1030 ReadErrorUploadDataStream::FailureMode::ASYNC);
1068 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback())); 1031 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback()));
1069 1032
1070 HttpRequestInfo request; 1033 HttpRequestInfo request;
1071 request.method = "POST"; 1034 request.method = "POST";
1072 request.url = GURL("http://www.example.org/"); 1035 request.url = GURL("http://www.example.org/");
1073 request.upload_data_stream = &upload_data_stream; 1036 request.upload_data_stream = &upload_data_stream;
1074 1037
1075 TestCompletionCallback callback; 1038 TestCompletionCallback callback;
1076 HttpResponseInfo response; 1039 HttpResponseInfo response;
1077 HttpRequestHeaders headers; 1040 HttpRequestHeaders headers;
1078 BoundNetLog net_log; 1041 BoundNetLog net_log;
1079 SpdyHttpStream http_stream(session_, true); 1042 SpdyHttpStream http_stream(session_, true);
1080 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, 1043 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
1081 net_log, CompletionCallback())); 1044 net_log, CompletionCallback()));
1082 1045
1083 int result = http_stream.SendRequest(headers, &response, callback.callback()); 1046 int result = http_stream.SendRequest(headers, &response, callback.callback());
1084 EXPECT_EQ(ERR_IO_PENDING, result); 1047 EXPECT_EQ(ERR_IO_PENDING, result);
1085 EXPECT_EQ(ERR_FAILED, callback.GetResult(result)); 1048 EXPECT_EQ(ERR_FAILED, callback.GetResult(result));
1086 1049
1087 // Because the server has closed the connection, there shouldn't be a session 1050 // Because the server has closed the connection, there shouldn't be a session
1088 // in the pool anymore. 1051 // in the pool anymore.
1089 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 1052 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key_));
1090 } 1053 }
1091 1054
1092 // TODO(willchan): Write a longer test for SpdyStream that exercises all 1055 // TODO(willchan): Write a longer test for SpdyStream that exercises all
1093 // methods. 1056 // methods.
1094 1057
1095 } // namespace net 1058 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/bidirectional_stream_spdy_impl_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698