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

Side by Side Diff: net/http/http_pipelined_connection_impl_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
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/http/http_pipelined_connection_impl.h" 5 #include "net/http/http_pipelined_connection_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 53 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
54 54
55 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 55 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
56 CONNECT_TIMING_HAS_DNS_TIMES); 56 CONNECT_TIMING_HAS_DNS_TIMES);
57 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 57 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
58 } 58 }
59 59
60 class MockPipelineDelegate : public HttpPipelinedConnection::Delegate { 60 class MockPipelineDelegate : public HttpPipelinedConnection::Delegate {
61 public: 61 public:
62 MOCK_METHOD1(OnPipelineHasCapacity, void(HttpPipelinedConnection* pipeline)); 62 MOCK_METHOD1(OnPipelineHasCapacity, void(HttpPipelinedConnection* pipeline));
63 MOCK_METHOD2(OnPipelineFeedback, void( 63 MOCK_METHOD2(OnPipelineFeedback,
64 HttpPipelinedConnection* pipeline, 64 void(HttpPipelinedConnection* pipeline,
65 HttpPipelinedConnection::Feedback feedback)); 65 HttpPipelinedConnection::Feedback feedback));
66 }; 66 };
67 67
68 class SuddenCloseObserver : public base::MessageLoop::TaskObserver { 68 class SuddenCloseObserver : public base::MessageLoop::TaskObserver {
69 public: 69 public:
70 SuddenCloseObserver(HttpStream* stream, int close_before_task) 70 SuddenCloseObserver(HttpStream* stream, int close_before_task)
71 : stream_(stream), 71 : stream_(stream),
72 close_before_task_(close_before_task), 72 close_before_task_(close_before_task),
73 current_task_(0) { } 73 current_task_(0) {}
74 74
75 virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE { 75 virtual void WillProcessTask(const base::PendingTask& pending_task) OVERRIDE {
76 ++current_task_; 76 ++current_task_;
77 if (current_task_ == close_before_task_) { 77 if (current_task_ == close_before_task_) {
78 stream_->Close(false); 78 stream_->Close(false);
79 base::MessageLoop::current()->RemoveTaskObserver(this); 79 base::MessageLoop::current()->RemoveTaskObserver(this);
80 } 80 }
81 } 81 }
82 82
83 virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE {} 83 virtual void DidProcessTask(const base::PendingTask& pending_task) OVERRIDE {}
84 84
85 private: 85 private:
86 HttpStream* stream_; 86 HttpStream* stream_;
87 int close_before_task_; 87 int close_before_task_;
88 int current_task_; 88 int current_task_;
89 }; 89 };
90 90
91 class HttpPipelinedConnectionImplTest : public testing::Test { 91 class HttpPipelinedConnectionImplTest : public testing::Test {
92 public: 92 public:
93 HttpPipelinedConnectionImplTest() 93 HttpPipelinedConnectionImplTest()
94 : histograms_("a"), 94 : histograms_("a"),
95 pool_(1, 1, &histograms_, &factory_), 95 pool_(1, 1, &histograms_, &factory_),
96 origin_("host", 123) { 96 origin_("host", 123) {}
97 }
98 97
99 void TearDown() { 98 void TearDown() { base::MessageLoop::current()->RunUntilIdle(); }
100 base::MessageLoop::current()->RunUntilIdle();
101 }
102 99
103 void Initialize(MockRead* reads, size_t reads_count, 100 void Initialize(MockRead* reads,
104 MockWrite* writes, size_t writes_count) { 101 size_t reads_count,
105 data_.reset(new DeterministicSocketData(reads, reads_count, 102 MockWrite* writes,
106 writes, writes_count)); 103 size_t writes_count) {
104 data_.reset(
105 new DeterministicSocketData(reads, reads_count, writes, writes_count));
107 data_->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 106 data_->set_connect_data(MockConnect(SYNCHRONOUS, OK));
108 if (reads_count || writes_count) { 107 if (reads_count || writes_count) {
109 data_->StopAfter(reads_count + writes_count); 108 data_->StopAfter(reads_count + writes_count);
110 } 109 }
111 factory_.AddSocketDataProvider(data_.get()); 110 factory_.AddSocketDataProvider(data_.get());
112 scoped_refptr<MockTransportSocketParams> params; 111 scoped_refptr<MockTransportSocketParams> params;
113 ClientSocketHandle* connection = new ClientSocketHandle; 112 ClientSocketHandle* connection = new ClientSocketHandle;
114 // Only give the connection a real NetLog to make sure that LoadTiming uses 113 // Only give the connection a real NetLog to make sure that LoadTiming uses
115 // the connection's ID, rather than the pipeline's. Since pipelines are 114 // the connection's ID, rather than the pipeline's. Since pipelines are
116 // destroyed when they've responded to all requests, but the connection 115 // destroyed when they've responded to all requests, but the connection
117 // lives on, this is an important behavior. 116 // lives on, this is an important behavior.
118 connection->Init("a", params, MEDIUM, CompletionCallback(), &pool_, 117 connection->Init(
119 net_log_.bound()); 118 "a", params, MEDIUM, CompletionCallback(), &pool_, net_log_.bound());
120 pipeline_.reset(new HttpPipelinedConnectionImpl( 119 pipeline_.reset(new HttpPipelinedConnectionImpl(connection,
121 connection, &delegate_, origin_, ssl_config_, proxy_info_, 120 &delegate_,
122 BoundNetLog(), false, kProtoUnknown)); 121 origin_,
122 ssl_config_,
123 proxy_info_,
124 BoundNetLog(),
125 false,
126 kProtoUnknown));
123 } 127 }
124 128
125 HttpRequestInfo* GetRequestInfo(const std::string& filename) { 129 HttpRequestInfo* GetRequestInfo(const std::string& filename) {
126 HttpRequestInfo* request_info = new HttpRequestInfo; 130 HttpRequestInfo* request_info = new HttpRequestInfo;
127 request_info->url = GURL("http://localhost/" + filename); 131 request_info->url = GURL("http://localhost/" + filename);
128 request_info->method = "GET"; 132 request_info->method = "GET";
129 request_info_vector_.push_back(request_info); 133 request_info_vector_.push_back(request_info);
130 return request_info; 134 return request_info;
131 } 135 }
132 136
133 HttpStream* NewTestStream(const std::string& filename) { 137 HttpStream* NewTestStream(const std::string& filename) {
134 HttpStream* stream = pipeline_->CreateNewStream(); 138 HttpStream* stream = pipeline_->CreateNewStream();
135 HttpRequestInfo* request_info = GetRequestInfo(filename); 139 HttpRequestInfo* request_info = GetRequestInfo(filename);
136 int rv = stream->InitializeStream( 140 int rv = stream->InitializeStream(
137 request_info, DEFAULT_PRIORITY, BoundNetLog(), CompletionCallback()); 141 request_info, DEFAULT_PRIORITY, BoundNetLog(), CompletionCallback());
138 DCHECK_EQ(OK, rv); 142 DCHECK_EQ(OK, rv);
139 return stream; 143 return stream;
140 } 144 }
141 145
142 void ExpectResponse(const std::string& expected, 146 void ExpectResponse(const std::string& expected,
143 scoped_ptr<HttpStream>& stream, bool async) { 147 scoped_ptr<HttpStream>& stream,
148 bool async) {
144 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size())); 149 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size()));
145 150
146 if (async) { 151 if (async) {
147 EXPECT_EQ(ERR_IO_PENDING, 152 EXPECT_EQ(ERR_IO_PENDING,
148 stream->ReadResponseBody(buffer.get(), expected.size(), 153 stream->ReadResponseBody(
149 callback_.callback())); 154 buffer.get(), expected.size(), callback_.callback()));
150 data_->RunFor(1); 155 data_->RunFor(1);
151 EXPECT_EQ(static_cast<int>(expected.size()), callback_.WaitForResult()); 156 EXPECT_EQ(static_cast<int>(expected.size()), callback_.WaitForResult());
152 } else { 157 } else {
153 EXPECT_EQ(static_cast<int>(expected.size()), 158 EXPECT_EQ(static_cast<int>(expected.size()),
154 stream->ReadResponseBody(buffer.get(), expected.size(), 159 stream->ReadResponseBody(
155 callback_.callback())); 160 buffer.get(), expected.size(), callback_.callback()));
156 } 161 }
157 std::string actual(buffer->data(), expected.size()); 162 std::string actual(buffer->data(), expected.size());
158 EXPECT_THAT(actual, StrEq(expected)); 163 EXPECT_THAT(actual, StrEq(expected));
159 } 164 }
160 165
161 void TestSyncRequest(scoped_ptr<HttpStream>& stream, 166 void TestSyncRequest(scoped_ptr<HttpStream>& stream,
162 const std::string& filename) { 167 const std::string& filename) {
163 HttpRequestHeaders headers; 168 HttpRequestHeaders headers;
164 HttpResponseInfo response; 169 HttpResponseInfo response;
165 EXPECT_EQ(OK, stream->SendRequest(headers, &response, 170 EXPECT_EQ(OK,
166 callback_.callback())); 171 stream->SendRequest(headers, &response, callback_.callback()));
167 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback())); 172 EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
168 ExpectResponse(filename, stream, false); 173 ExpectResponse(filename, stream, false);
169 174
170 stream->Close(false); 175 stream->Close(false);
171 } 176 }
172 177
173 CapturingBoundNetLog net_log_; 178 CapturingBoundNetLog net_log_;
174 DeterministicMockClientSocketFactory factory_; 179 DeterministicMockClientSocketFactory factory_;
175 ClientSocketPoolHistograms histograms_; 180 ClientSocketPoolHistograms histograms_;
176 MockTransportClientSocketPool pool_; 181 MockTransportClientSocketPool pool_;
(...skipping 25 matching lines...) Expand all
202 207
203 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 208 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
204 209
205 TestLoadTimingNotReused(*stream); 210 TestLoadTimingNotReused(*stream);
206 stream->Close(false); 211 stream->Close(false);
207 TestLoadTimingNotReused(*stream); 212 TestLoadTimingNotReused(*stream);
208 } 213 }
209 214
210 TEST_F(HttpPipelinedConnectionImplTest, SyncSingleRequest) { 215 TEST_F(HttpPipelinedConnectionImplTest, SyncSingleRequest) {
211 MockWrite writes[] = { 216 MockWrite writes[] = {
212 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 217 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
213 }; 218 };
214 MockRead reads[] = { 219 MockRead reads[] = {
215 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 220 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
216 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"), 221 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"),
217 MockRead(SYNCHRONOUS, 3, "ok.html"), 222 MockRead(SYNCHRONOUS, 3, "ok.html"),
218 }; 223 };
219 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 224 Initialize(reads, arraysize(reads), writes, arraysize(writes));
220 225
221 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 226 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
222 TestLoadTimingNotReused(*stream); 227 TestLoadTimingNotReused(*stream);
223 TestSyncRequest(stream, "ok.html"); 228 TestSyncRequest(stream, "ok.html");
224 TestLoadTimingNotReused(*stream); 229 TestLoadTimingNotReused(*stream);
225 } 230 }
226 231
227 TEST_F(HttpPipelinedConnectionImplTest, AsyncSingleRequest) { 232 TEST_F(HttpPipelinedConnectionImplTest, AsyncSingleRequest) {
228 MockWrite writes[] = { 233 MockWrite writes[] = {
229 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 234 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
230 }; 235 };
231 MockRead reads[] = { 236 MockRead reads[] = {
232 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"), 237 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"),
233 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"), 238 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"),
234 MockRead(ASYNC, 3, "ok.html"), 239 MockRead(ASYNC, 3, "ok.html"),
235 }; 240 };
236 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 241 Initialize(reads, arraysize(reads), writes, arraysize(writes));
237 242
238 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 243 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
239 244
240 HttpRequestHeaders headers; 245 HttpRequestHeaders headers;
241 HttpResponseInfo response; 246 HttpResponseInfo response;
242 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(headers, &response, 247 EXPECT_EQ(ERR_IO_PENDING,
243 callback_.callback())); 248 stream->SendRequest(headers, &response, callback_.callback()));
244 data_->RunFor(1); 249 data_->RunFor(1);
245 EXPECT_LE(OK, callback_.WaitForResult()); 250 EXPECT_LE(OK, callback_.WaitForResult());
246 TestLoadTimingNotReused(*stream); 251 TestLoadTimingNotReused(*stream);
247 252
248 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); 253 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
249 data_->RunFor(2); 254 data_->RunFor(2);
250 EXPECT_LE(OK, callback_.WaitForResult()); 255 EXPECT_LE(OK, callback_.WaitForResult());
251 TestLoadTimingNotReused(*stream); 256 TestLoadTimingNotReused(*stream);
252 257
253 ExpectResponse("ok.html", stream, true); 258 ExpectResponse("ok.html", stream, true);
254 TestLoadTimingNotReused(*stream); 259 TestLoadTimingNotReused(*stream);
255 260
256 stream->Close(false); 261 stream->Close(false);
257 } 262 }
258 263
259 TEST_F(HttpPipelinedConnectionImplTest, LockStepAsyncRequests) { 264 TEST_F(HttpPipelinedConnectionImplTest, LockStepAsyncRequests) {
260 MockWrite writes[] = { 265 MockWrite writes[] = {
261 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 266 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
262 MockWrite(ASYNC, 1, "GET /ko.html HTTP/1.1\r\n\r\n"), 267 MockWrite(ASYNC, 1, "GET /ko.html HTTP/1.1\r\n\r\n"),
263 }; 268 };
264 MockRead reads[] = { 269 MockRead reads[] = {
265 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n"), 270 MockRead(ASYNC, 2, "HTTP/1.1 200 OK\r\n"),
266 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"), 271 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"),
267 MockRead(ASYNC, 4, "ok.html"), 272 MockRead(ASYNC, 4, "ok.html"),
268 MockRead(ASYNC, 5, "HTTP/1.1 200 OK\r\n"), 273 MockRead(ASYNC, 5, "HTTP/1.1 200 OK\r\n"),
269 MockRead(ASYNC, 6, "Content-Length: 7\r\n\r\n"), 274 MockRead(ASYNC, 6, "Content-Length: 7\r\n\r\n"),
270 MockRead(ASYNC, 7, "ko.html"), 275 MockRead(ASYNC, 7, "ko.html"),
271 }; 276 };
272 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 277 Initialize(reads, arraysize(reads), writes, arraysize(writes));
273 278
274 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 279 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
275 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 280 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
276 281
277 HttpRequestHeaders headers1; 282 HttpRequestHeaders headers1;
278 HttpResponseInfo response1; 283 HttpResponseInfo response1;
279 EXPECT_EQ(ERR_IO_PENDING, stream1->SendRequest(headers1, &response1, 284 EXPECT_EQ(ERR_IO_PENDING,
280 callback_.callback())); 285 stream1->SendRequest(headers1, &response1, callback_.callback()));
281 TestLoadTimingNotReused(*stream1); 286 TestLoadTimingNotReused(*stream1);
282 287
283 HttpRequestHeaders headers2; 288 HttpRequestHeaders headers2;
284 HttpResponseInfo response2; 289 HttpResponseInfo response2;
285 EXPECT_EQ(ERR_IO_PENDING, stream2->SendRequest(headers2, &response2, 290 EXPECT_EQ(ERR_IO_PENDING,
286 callback_.callback())); 291 stream2->SendRequest(headers2, &response2, callback_.callback()));
287 TestLoadTimingReused(*stream2); 292 TestLoadTimingReused(*stream2);
288 293
289 data_->RunFor(1); 294 data_->RunFor(1);
290 EXPECT_LE(OK, callback_.WaitForResult()); 295 EXPECT_LE(OK, callback_.WaitForResult());
291 data_->RunFor(1); 296 data_->RunFor(1);
292 EXPECT_LE(OK, callback_.WaitForResult()); 297 EXPECT_LE(OK, callback_.WaitForResult());
293 298
294 EXPECT_EQ(ERR_IO_PENDING, stream1->ReadResponseHeaders(callback_.callback())); 299 EXPECT_EQ(ERR_IO_PENDING, stream1->ReadResponseHeaders(callback_.callback()));
295 EXPECT_EQ(ERR_IO_PENDING, stream2->ReadResponseHeaders(callback_.callback())); 300 EXPECT_EQ(ERR_IO_PENDING, stream2->ReadResponseHeaders(callback_.callback()));
296 301
297 data_->RunFor(2); 302 data_->RunFor(2);
298 EXPECT_LE(OK, callback_.WaitForResult()); 303 EXPECT_LE(OK, callback_.WaitForResult());
299 304
300 ExpectResponse("ok.html", stream1, true); 305 ExpectResponse("ok.html", stream1, true);
301 306
302 TestLoadTimingNotReused(*stream1); 307 TestLoadTimingNotReused(*stream1);
303 LoadTimingInfo load_timing_info1; 308 LoadTimingInfo load_timing_info1;
304 EXPECT_TRUE(stream1->GetLoadTimingInfo(&load_timing_info1)); 309 EXPECT_TRUE(stream1->GetLoadTimingInfo(&load_timing_info1));
305 stream1->Close(false); 310 stream1->Close(false);
306 311
307 data_->RunFor(2); 312 data_->RunFor(2);
308 EXPECT_LE(OK, callback_.WaitForResult()); 313 EXPECT_LE(OK, callback_.WaitForResult());
309 314
310 ExpectResponse("ko.html", stream2, true); 315 ExpectResponse("ko.html", stream2, true);
311 316
312 TestLoadTimingReused(*stream2); 317 TestLoadTimingReused(*stream2);
313 LoadTimingInfo load_timing_info2; 318 LoadTimingInfo load_timing_info2;
314 EXPECT_TRUE(stream2->GetLoadTimingInfo(&load_timing_info2)); 319 EXPECT_TRUE(stream2->GetLoadTimingInfo(&load_timing_info2));
315 EXPECT_EQ(load_timing_info1.socket_log_id, 320 EXPECT_EQ(load_timing_info1.socket_log_id, load_timing_info2.socket_log_id);
316 load_timing_info2.socket_log_id);
317 stream2->Close(false); 321 stream2->Close(false);
318 } 322 }
319 323
320 TEST_F(HttpPipelinedConnectionImplTest, TwoResponsesInOnePacket) { 324 TEST_F(HttpPipelinedConnectionImplTest, TwoResponsesInOnePacket) {
321 MockWrite writes[] = { 325 MockWrite writes[] = {
322 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 326 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
323 MockWrite(SYNCHRONOUS, 1, "GET /ko.html HTTP/1.1\r\n\r\n"), 327 MockWrite(SYNCHRONOUS, 1, "GET /ko.html HTTP/1.1\r\n\r\n"),
324 }; 328 };
325 MockRead reads[] = { 329 MockRead reads[] = {
326 MockRead(SYNCHRONOUS, 2, 330 MockRead(SYNCHRONOUS,
327 "HTTP/1.1 200 OK\r\n" 331 2,
328 "Content-Length: 7\r\n\r\n" 332 "HTTP/1.1 200 OK\r\n"
329 "ok.html" 333 "Content-Length: 7\r\n\r\n"
330 "HTTP/1.1 200 OK\r\n" 334 "ok.html"
331 "Content-Length: 7\r\n\r\n" 335 "HTTP/1.1 200 OK\r\n"
332 "ko.html"), 336 "Content-Length: 7\r\n\r\n"
337 "ko.html"),
333 }; 338 };
334 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 339 Initialize(reads, arraysize(reads), writes, arraysize(writes));
335 340
336 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 341 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
337 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 342 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
338 343
339 HttpRequestHeaders headers1; 344 HttpRequestHeaders headers1;
340 HttpResponseInfo response1; 345 HttpResponseInfo response1;
341 EXPECT_EQ(OK, stream1->SendRequest(headers1, 346 EXPECT_EQ(OK,
342 &response1, callback_.callback())); 347 stream1->SendRequest(headers1, &response1, callback_.callback()));
343 HttpRequestHeaders headers2; 348 HttpRequestHeaders headers2;
344 HttpResponseInfo response2; 349 HttpResponseInfo response2;
345 EXPECT_EQ(OK, stream2->SendRequest(headers2, 350 EXPECT_EQ(OK,
346 &response2, callback_.callback())); 351 stream2->SendRequest(headers2, &response2, callback_.callback()));
347 352
348 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 353 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
349 ExpectResponse("ok.html", stream1, false); 354 ExpectResponse("ok.html", stream1, false);
350 stream1->Close(false); 355 stream1->Close(false);
351 356
352 EXPECT_EQ(OK, stream2->ReadResponseHeaders(callback_.callback())); 357 EXPECT_EQ(OK, stream2->ReadResponseHeaders(callback_.callback()));
353 ExpectResponse("ko.html", stream2, false); 358 ExpectResponse("ko.html", stream2, false);
354 stream2->Close(false); 359 stream2->Close(false);
355 } 360 }
356 361
357 TEST_F(HttpPipelinedConnectionImplTest, SendOrderSwapped) { 362 TEST_F(HttpPipelinedConnectionImplTest, SendOrderSwapped) {
358 MockWrite writes[] = { 363 MockWrite writes[] = {
359 MockWrite(SYNCHRONOUS, 0, "GET /ko.html HTTP/1.1\r\n\r\n"), 364 MockWrite(SYNCHRONOUS, 0, "GET /ko.html HTTP/1.1\r\n\r\n"),
360 MockWrite(SYNCHRONOUS, 4, "GET /ok.html HTTP/1.1\r\n\r\n"), 365 MockWrite(SYNCHRONOUS, 4, "GET /ok.html HTTP/1.1\r\n\r\n"),
361 }; 366 };
362 MockRead reads[] = { 367 MockRead reads[] = {
363 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 368 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
364 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"), 369 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"),
365 MockRead(SYNCHRONOUS, 3, "ko.html"), 370 MockRead(SYNCHRONOUS, 3, "ko.html"),
366 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 371 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
367 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"), 372 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"),
368 MockRead(SYNCHRONOUS, 7, "ok.html"), 373 MockRead(SYNCHRONOUS, 7, "ok.html"),
369 }; 374 };
370 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 375 Initialize(reads, arraysize(reads), writes, arraysize(writes));
371 376
372 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 377 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
373 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 378 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
374 379
375 TestSyncRequest(stream2, "ko.html"); 380 TestSyncRequest(stream2, "ko.html");
376 TestSyncRequest(stream1, "ok.html"); 381 TestSyncRequest(stream1, "ok.html");
377 TestLoadTimingNotReused(*stream1); 382 TestLoadTimingNotReused(*stream1);
378 TestLoadTimingReused(*stream2); 383 TestLoadTimingReused(*stream2);
379 } 384 }
380 385
381 TEST_F(HttpPipelinedConnectionImplTest, ReadOrderSwapped) { 386 TEST_F(HttpPipelinedConnectionImplTest, ReadOrderSwapped) {
382 MockWrite writes[] = { 387 MockWrite writes[] = {
383 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 388 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
384 MockWrite(SYNCHRONOUS, 1, "GET /ko.html HTTP/1.1\r\n\r\n"), 389 MockWrite(SYNCHRONOUS, 1, "GET /ko.html HTTP/1.1\r\n\r\n"),
385 }; 390 };
386 MockRead reads[] = { 391 MockRead reads[] = {
387 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 392 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
388 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"), 393 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"),
389 MockRead(SYNCHRONOUS, 4, "ok.html"), 394 MockRead(SYNCHRONOUS, 4, "ok.html"),
390 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 395 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
391 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"), 396 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"),
392 MockRead(SYNCHRONOUS, 7, "ko.html"), 397 MockRead(SYNCHRONOUS, 7, "ko.html"),
393 }; 398 };
394 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 399 Initialize(reads, arraysize(reads), writes, arraysize(writes));
395 400
396 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 401 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
397 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 402 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
398 403
399 HttpRequestHeaders headers1; 404 HttpRequestHeaders headers1;
400 HttpResponseInfo response1; 405 HttpResponseInfo response1;
401 EXPECT_EQ(OK, stream1->SendRequest(headers1, 406 EXPECT_EQ(OK,
402 &response1, callback_.callback())); 407 stream1->SendRequest(headers1, &response1, callback_.callback()));
403 408
404 HttpRequestHeaders headers2; 409 HttpRequestHeaders headers2;
405 HttpResponseInfo response2; 410 HttpResponseInfo response2;
406 EXPECT_EQ(OK, stream2->SendRequest(headers2, 411 EXPECT_EQ(OK,
407 &response2, callback_.callback())); 412 stream2->SendRequest(headers2, &response2, callback_.callback()));
408 413
409 EXPECT_EQ(ERR_IO_PENDING, stream2->ReadResponseHeaders(callback_.callback())); 414 EXPECT_EQ(ERR_IO_PENDING, stream2->ReadResponseHeaders(callback_.callback()));
410 415
411 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 416 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
412 ExpectResponse("ok.html", stream1, false); 417 ExpectResponse("ok.html", stream1, false);
413 418
414 stream1->Close(false); 419 stream1->Close(false);
415 420
416 EXPECT_LE(OK, callback_.WaitForResult()); 421 EXPECT_LE(OK, callback_.WaitForResult());
417 ExpectResponse("ko.html", stream2, false); 422 ExpectResponse("ko.html", stream2, false);
418 423
419 stream2->Close(false); 424 stream2->Close(false);
420 } 425 }
421 426
422 TEST_F(HttpPipelinedConnectionImplTest, SendWhileReading) { 427 TEST_F(HttpPipelinedConnectionImplTest, SendWhileReading) {
423 MockWrite writes[] = { 428 MockWrite writes[] = {
424 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 429 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
425 MockWrite(SYNCHRONOUS, 3, "GET /ko.html HTTP/1.1\r\n\r\n"), 430 MockWrite(SYNCHRONOUS, 3, "GET /ko.html HTTP/1.1\r\n\r\n"),
426 }; 431 };
427 MockRead reads[] = { 432 MockRead reads[] = {
428 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 433 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
429 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"), 434 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"),
430 MockRead(SYNCHRONOUS, 4, "ok.html"), 435 MockRead(SYNCHRONOUS, 4, "ok.html"),
431 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 436 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
432 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"), 437 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"),
433 MockRead(SYNCHRONOUS, 7, "ko.html"), 438 MockRead(SYNCHRONOUS, 7, "ko.html"),
434 }; 439 };
435 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 440 Initialize(reads, arraysize(reads), writes, arraysize(writes));
436 441
437 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 442 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
438 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 443 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
439 444
440 HttpRequestHeaders headers1; 445 HttpRequestHeaders headers1;
441 HttpResponseInfo response1; 446 HttpResponseInfo response1;
442 EXPECT_EQ(OK, stream1->SendRequest(headers1, 447 EXPECT_EQ(OK,
443 &response1, callback_.callback())); 448 stream1->SendRequest(headers1, &response1, callback_.callback()));
444 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 449 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
445 450
446 HttpRequestHeaders headers2; 451 HttpRequestHeaders headers2;
447 HttpResponseInfo response2; 452 HttpResponseInfo response2;
448 EXPECT_EQ(OK, stream2->SendRequest(headers2, 453 EXPECT_EQ(OK,
449 &response2, callback_.callback())); 454 stream2->SendRequest(headers2, &response2, callback_.callback()));
450 455
451 ExpectResponse("ok.html", stream1, false); 456 ExpectResponse("ok.html", stream1, false);
452 stream1->Close(false); 457 stream1->Close(false);
453 458
454 EXPECT_EQ(OK, stream2->ReadResponseHeaders(callback_.callback())); 459 EXPECT_EQ(OK, stream2->ReadResponseHeaders(callback_.callback()));
455 ExpectResponse("ko.html", stream2, false); 460 ExpectResponse("ko.html", stream2, false);
456 stream2->Close(false); 461 stream2->Close(false);
457 } 462 }
458 463
459 TEST_F(HttpPipelinedConnectionImplTest, AsyncSendWhileAsyncReadBlocked) { 464 TEST_F(HttpPipelinedConnectionImplTest, AsyncSendWhileAsyncReadBlocked) {
460 MockWrite writes[] = { 465 MockWrite writes[] = {
461 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 466 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
462 MockWrite(ASYNC, 3, "GET /ko.html HTTP/1.1\r\n\r\n"), 467 MockWrite(ASYNC, 3, "GET /ko.html HTTP/1.1\r\n\r\n"),
463 }; 468 };
464 MockRead reads[] = { 469 MockRead reads[] = {
465 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 470 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
466 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"), 471 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"),
467 MockRead(ASYNC, 4, "ok.html"), 472 MockRead(ASYNC, 4, "ok.html"),
468 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 473 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
469 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"), 474 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"),
470 MockRead(SYNCHRONOUS, 7, "ko.html"), 475 MockRead(SYNCHRONOUS, 7, "ko.html"),
471 }; 476 };
472 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 477 Initialize(reads, arraysize(reads), writes, arraysize(writes));
473 478
474 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 479 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
475 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 480 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
476 481
477 HttpRequestHeaders headers1; 482 HttpRequestHeaders headers1;
478 HttpResponseInfo response1; 483 HttpResponseInfo response1;
479 EXPECT_EQ(OK, stream1->SendRequest(headers1, 484 EXPECT_EQ(OK,
480 &response1, callback_.callback())); 485 stream1->SendRequest(headers1, &response1, callback_.callback()));
481 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 486 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
482 TestCompletionCallback callback1; 487 TestCompletionCallback callback1;
483 std::string expected = "ok.html"; 488 std::string expected = "ok.html";
484 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size())); 489 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected.size()));
485 EXPECT_EQ(ERR_IO_PENDING, 490 EXPECT_EQ(ERR_IO_PENDING,
486 stream1->ReadResponseBody(buffer.get(), expected.size(), 491 stream1->ReadResponseBody(
487 callback1.callback())); 492 buffer.get(), expected.size(), callback1.callback()));
488 493
489 HttpRequestHeaders headers2; 494 HttpRequestHeaders headers2;
490 HttpResponseInfo response2; 495 HttpResponseInfo response2;
491 TestCompletionCallback callback2; 496 TestCompletionCallback callback2;
492 EXPECT_EQ(ERR_IO_PENDING, stream2->SendRequest(headers2, &response2, 497 EXPECT_EQ(ERR_IO_PENDING,
493 callback2.callback())); 498 stream2->SendRequest(headers2, &response2, callback2.callback()));
494 499
495 data_->RunFor(1); 500 data_->RunFor(1);
496 EXPECT_LE(OK, callback2.WaitForResult()); 501 EXPECT_LE(OK, callback2.WaitForResult());
497 EXPECT_EQ(ERR_IO_PENDING, stream2->ReadResponseHeaders(callback2.callback())); 502 EXPECT_EQ(ERR_IO_PENDING, stream2->ReadResponseHeaders(callback2.callback()));
498 503
499 data_->RunFor(1); 504 data_->RunFor(1);
500 EXPECT_EQ(static_cast<int>(expected.size()), callback1.WaitForResult()); 505 EXPECT_EQ(static_cast<int>(expected.size()), callback1.WaitForResult());
501 std::string actual(buffer->data(), expected.size()); 506 std::string actual(buffer->data(), expected.size());
502 EXPECT_THAT(actual, StrEq(expected)); 507 EXPECT_THAT(actual, StrEq(expected));
503 stream1->Close(false); 508 stream1->Close(false);
504 509
505 data_->StopAfter(8); 510 data_->StopAfter(8);
506 EXPECT_LE(OK, callback2.WaitForResult()); 511 EXPECT_LE(OK, callback2.WaitForResult());
507 ExpectResponse("ko.html", stream2, false); 512 ExpectResponse("ko.html", stream2, false);
508 stream2->Close(false); 513 stream2->Close(false);
509 } 514 }
510 515
511 TEST_F(HttpPipelinedConnectionImplTest, UnusedStreamAllowsLaterUse) { 516 TEST_F(HttpPipelinedConnectionImplTest, UnusedStreamAllowsLaterUse) {
512 MockWrite writes[] = { 517 MockWrite writes[] = {
513 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 518 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
514 }; 519 };
515 MockRead reads[] = { 520 MockRead reads[] = {
516 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 521 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
517 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"), 522 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n\r\n"),
518 MockRead(SYNCHRONOUS, 3, "ok.html"), 523 MockRead(SYNCHRONOUS, 3, "ok.html"),
519 }; 524 };
520 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 525 Initialize(reads, arraysize(reads), writes, arraysize(writes));
521 526
522 scoped_ptr<HttpStream> unused_stream(NewTestStream("unused.html")); 527 scoped_ptr<HttpStream> unused_stream(NewTestStream("unused.html"));
523 unused_stream->Close(false); 528 unused_stream->Close(false);
524 529
525 scoped_ptr<HttpStream> later_stream(NewTestStream("ok.html")); 530 scoped_ptr<HttpStream> later_stream(NewTestStream("ok.html"));
526 TestSyncRequest(later_stream, "ok.html"); 531 TestSyncRequest(later_stream, "ok.html");
527 } 532 }
528 533
529 TEST_F(HttpPipelinedConnectionImplTest, UnsentStreamAllowsLaterUse) { 534 TEST_F(HttpPipelinedConnectionImplTest, UnsentStreamAllowsLaterUse) {
530 MockWrite writes[] = { 535 MockWrite writes[] = {
531 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 536 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
532 MockWrite(SYNCHRONOUS, 4, "GET /ko.html HTTP/1.1\r\n\r\n"), 537 MockWrite(SYNCHRONOUS, 4, "GET /ko.html HTTP/1.1\r\n\r\n"),
533 }; 538 };
534 MockRead reads[] = { 539 MockRead reads[] = {
535 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"), 540 MockRead(ASYNC, 1, "HTTP/1.1 200 OK\r\n"),
536 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"), 541 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"),
537 MockRead(ASYNC, 3, "ok.html"), 542 MockRead(ASYNC, 3, "ok.html"),
538 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"), 543 MockRead(SYNCHRONOUS, 5, "HTTP/1.1 200 OK\r\n"),
539 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"), 544 MockRead(SYNCHRONOUS, 6, "Content-Length: 7\r\n\r\n"),
540 MockRead(SYNCHRONOUS, 7, "ko.html"), 545 MockRead(SYNCHRONOUS, 7, "ko.html"),
541 }; 546 };
542 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 547 Initialize(reads, arraysize(reads), writes, arraysize(writes));
543 548
544 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 549 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
545 550
546 HttpRequestHeaders headers; 551 HttpRequestHeaders headers;
547 HttpResponseInfo response; 552 HttpResponseInfo response;
548 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(headers, &response, 553 EXPECT_EQ(ERR_IO_PENDING,
549 callback_.callback())); 554 stream->SendRequest(headers, &response, callback_.callback()));
550 555
551 scoped_ptr<HttpStream> unsent_stream(NewTestStream("unsent.html")); 556 scoped_ptr<HttpStream> unsent_stream(NewTestStream("unsent.html"));
552 HttpRequestHeaders unsent_headers; 557 HttpRequestHeaders unsent_headers;
553 HttpResponseInfo unsent_response; 558 HttpResponseInfo unsent_response;
554 EXPECT_EQ(ERR_IO_PENDING, unsent_stream->SendRequest(unsent_headers, 559 EXPECT_EQ(ERR_IO_PENDING,
555 &unsent_response, 560 unsent_stream->SendRequest(
556 callback_.callback())); 561 unsent_headers, &unsent_response, callback_.callback()));
557 unsent_stream->Close(false); 562 unsent_stream->Close(false);
558 563
559 data_->RunFor(1); 564 data_->RunFor(1);
560 EXPECT_LE(OK, callback_.WaitForResult()); 565 EXPECT_LE(OK, callback_.WaitForResult());
561 566
562 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback())); 567 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
563 data_->RunFor(2); 568 data_->RunFor(2);
564 EXPECT_LE(OK, callback_.WaitForResult()); 569 EXPECT_LE(OK, callback_.WaitForResult());
565 570
566 ExpectResponse("ok.html", stream, true); 571 ExpectResponse("ok.html", stream, true);
567 572
568 stream->Close(false); 573 stream->Close(false);
569 574
570 data_->StopAfter(8); 575 data_->StopAfter(8);
571 scoped_ptr<HttpStream> later_stream(NewTestStream("ko.html")); 576 scoped_ptr<HttpStream> later_stream(NewTestStream("ko.html"));
572 TestSyncRequest(later_stream, "ko.html"); 577 TestSyncRequest(later_stream, "ko.html");
573 } 578 }
574 579
575 TEST_F(HttpPipelinedConnectionImplTest, FailedSend) { 580 TEST_F(HttpPipelinedConnectionImplTest, FailedSend) {
576 MockWrite writes[] = { 581 MockWrite writes[] = {
577 MockWrite(ASYNC, ERR_FAILED), 582 MockWrite(ASYNC, ERR_FAILED),
578 }; 583 };
579 Initialize(NULL, 0, writes, arraysize(writes)); 584 Initialize(NULL, 0, writes, arraysize(writes));
580 585
581 scoped_ptr<HttpStream> failed_stream(NewTestStream("ok.html")); 586 scoped_ptr<HttpStream> failed_stream(NewTestStream("ok.html"));
582 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 587 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
583 scoped_ptr<HttpStream> closed_stream(NewTestStream("closed.html")); 588 scoped_ptr<HttpStream> closed_stream(NewTestStream("closed.html"));
584 scoped_ptr<HttpStream> rejected_stream(NewTestStream("rejected.html")); 589 scoped_ptr<HttpStream> rejected_stream(NewTestStream("rejected.html"));
585 590
586 HttpRequestHeaders headers; 591 HttpRequestHeaders headers;
587 HttpResponseInfo response; 592 HttpResponseInfo response;
588 TestCompletionCallback failed_callback; 593 TestCompletionCallback failed_callback;
589 EXPECT_EQ(ERR_IO_PENDING, 594 EXPECT_EQ(ERR_IO_PENDING,
590 failed_stream->SendRequest(headers, &response, 595 failed_stream->SendRequest(
591 failed_callback.callback())); 596 headers, &response, failed_callback.callback()));
592 TestCompletionCallback evicted_callback; 597 TestCompletionCallback evicted_callback;
593 EXPECT_EQ(ERR_IO_PENDING, 598 EXPECT_EQ(ERR_IO_PENDING,
594 evicted_stream->SendRequest(headers, &response, 599 evicted_stream->SendRequest(
595 evicted_callback.callback())); 600 headers, &response, evicted_callback.callback()));
596 EXPECT_EQ(ERR_IO_PENDING, closed_stream->SendRequest(headers, &response, 601 EXPECT_EQ(
597 callback_.callback())); 602 ERR_IO_PENDING,
603 closed_stream->SendRequest(headers, &response, callback_.callback()));
598 closed_stream->Close(false); 604 closed_stream->Close(false);
599 605
600 data_->RunFor(1); 606 data_->RunFor(1);
601 EXPECT_EQ(ERR_FAILED, failed_callback.WaitForResult()); 607 EXPECT_EQ(ERR_FAILED, failed_callback.WaitForResult());
602 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 608 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
603 EXPECT_EQ(ERR_PIPELINE_EVICTION, 609 EXPECT_EQ(
604 rejected_stream->SendRequest(headers, &response, 610 ERR_PIPELINE_EVICTION,
605 callback_.callback())); 611 rejected_stream->SendRequest(headers, &response, callback_.callback()));
606 612
607 failed_stream->Close(true); 613 failed_stream->Close(true);
608 evicted_stream->Close(true); 614 evicted_stream->Close(true);
609 rejected_stream->Close(true); 615 rejected_stream->Close(true);
610 } 616 }
611 617
612 TEST_F(HttpPipelinedConnectionImplTest, ConnectionSuddenlyClosedAfterResponse) { 618 TEST_F(HttpPipelinedConnectionImplTest, ConnectionSuddenlyClosedAfterResponse) {
613 MockWrite writes[] = { 619 MockWrite writes[] = {
614 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 620 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
615 MockWrite(SYNCHRONOUS, 1, "GET /read_evicted.html HTTP/1.1\r\n\r\n"), 621 MockWrite(SYNCHRONOUS, 1, "GET /read_evicted.html HTTP/1.1\r\n\r\n"),
616 MockWrite(SYNCHRONOUS, 2, "GET /read_rejected.html HTTP/1.1\r\n\r\n"), 622 MockWrite(SYNCHRONOUS, 2, "GET /read_rejected.html HTTP/1.1\r\n\r\n"),
617 MockWrite(ASYNC, ERR_SOCKET_NOT_CONNECTED, 5), 623 MockWrite(ASYNC, ERR_SOCKET_NOT_CONNECTED, 5),
618 }; 624 };
619 MockRead reads[] = { 625 MockRead reads[] = {
620 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n\r\n"), 626 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n\r\n"),
621 MockRead(SYNCHRONOUS, 4, "ok.html"), 627 MockRead(SYNCHRONOUS, 4, "ok.html"),
622 MockRead(ASYNC, OK, 6), // Connection closed message. Not read before the 628 MockRead(
623 // ERR_SOCKET_NOT_CONNECTED. 629 ASYNC, OK, 6), // Connection closed message. Not read before the
630 // ERR_SOCKET_NOT_CONNECTED.
624 }; 631 };
625 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 632 Initialize(reads, arraysize(reads), writes, arraysize(writes));
626 633
627 scoped_ptr<HttpStream> closed_stream(NewTestStream("ok.html")); 634 scoped_ptr<HttpStream> closed_stream(NewTestStream("ok.html"));
628 scoped_ptr<HttpStream> read_evicted_stream( 635 scoped_ptr<HttpStream> read_evicted_stream(
629 NewTestStream("read_evicted.html")); 636 NewTestStream("read_evicted.html"));
630 scoped_ptr<HttpStream> read_rejected_stream( 637 scoped_ptr<HttpStream> read_rejected_stream(
631 NewTestStream("read_rejected.html")); 638 NewTestStream("read_rejected.html"));
632 scoped_ptr<HttpStream> send_closed_stream( 639 scoped_ptr<HttpStream> send_closed_stream(NewTestStream("send_closed.html"));
633 NewTestStream("send_closed.html"));
634 scoped_ptr<HttpStream> send_evicted_stream( 640 scoped_ptr<HttpStream> send_evicted_stream(
635 NewTestStream("send_evicted.html")); 641 NewTestStream("send_evicted.html"));
636 scoped_ptr<HttpStream> send_rejected_stream( 642 scoped_ptr<HttpStream> send_rejected_stream(
637 NewTestStream("send_rejected.html")); 643 NewTestStream("send_rejected.html"));
638 644
639 HttpRequestHeaders headers; 645 HttpRequestHeaders headers;
640 HttpResponseInfo response; 646 HttpResponseInfo response;
641 EXPECT_EQ(OK, closed_stream->SendRequest(headers, 647 EXPECT_EQ(
642 &response, callback_.callback())); 648 OK, closed_stream->SendRequest(headers, &response, callback_.callback()));
643 EXPECT_EQ(OK, read_evicted_stream->SendRequest(headers, &response, 649 EXPECT_EQ(OK,
644 callback_.callback())); 650 read_evicted_stream->SendRequest(
645 EXPECT_EQ(OK, read_rejected_stream->SendRequest(headers, &response, 651 headers, &response, callback_.callback()));
646 callback_.callback())); 652 EXPECT_EQ(OK,
653 read_rejected_stream->SendRequest(
654 headers, &response, callback_.callback()));
647 TestCompletionCallback send_closed_callback; 655 TestCompletionCallback send_closed_callback;
648 EXPECT_EQ(ERR_IO_PENDING, 656 EXPECT_EQ(ERR_IO_PENDING,
649 send_closed_stream->SendRequest(headers, &response, 657 send_closed_stream->SendRequest(
650 send_closed_callback.callback())); 658 headers, &response, send_closed_callback.callback()));
651 TestCompletionCallback send_evicted_callback; 659 TestCompletionCallback send_evicted_callback;
652 EXPECT_EQ(ERR_IO_PENDING, 660 EXPECT_EQ(ERR_IO_PENDING,
653 send_evicted_stream->SendRequest(headers, &response, 661 send_evicted_stream->SendRequest(
654 send_evicted_callback.callback())); 662 headers, &response, send_evicted_callback.callback()));
655 663
656 TestCompletionCallback read_evicted_callback; 664 TestCompletionCallback read_evicted_callback;
657 EXPECT_EQ(ERR_IO_PENDING, 665 EXPECT_EQ(ERR_IO_PENDING,
658 read_evicted_stream->ReadResponseHeaders( 666 read_evicted_stream->ReadResponseHeaders(
659 read_evicted_callback.callback())); 667 read_evicted_callback.callback()));
660 668
661 EXPECT_EQ(OK, closed_stream->ReadResponseHeaders(callback_.callback())); 669 EXPECT_EQ(OK, closed_stream->ReadResponseHeaders(callback_.callback()));
662 ExpectResponse("ok.html", closed_stream, false); 670 ExpectResponse("ok.html", closed_stream, false);
663 closed_stream->Close(true); 671 closed_stream->Close(true);
664 672
665 EXPECT_EQ(ERR_PIPELINE_EVICTION, read_evicted_callback.WaitForResult()); 673 EXPECT_EQ(ERR_PIPELINE_EVICTION, read_evicted_callback.WaitForResult());
666 read_evicted_stream->Close(true); 674 read_evicted_stream->Close(true);
667 675
668 EXPECT_EQ(ERR_PIPELINE_EVICTION, 676 EXPECT_EQ(ERR_PIPELINE_EVICTION,
669 read_rejected_stream->ReadResponseHeaders(callback_.callback())); 677 read_rejected_stream->ReadResponseHeaders(callback_.callback()));
670 read_rejected_stream->Close(true); 678 read_rejected_stream->Close(true);
671 679
672 data_->RunFor(1); 680 data_->RunFor(1);
673 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, send_closed_callback.WaitForResult()); 681 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, send_closed_callback.WaitForResult());
674 send_closed_stream->Close(true); 682 send_closed_stream->Close(true);
675 683
676 EXPECT_EQ(ERR_PIPELINE_EVICTION, send_evicted_callback.WaitForResult()); 684 EXPECT_EQ(ERR_PIPELINE_EVICTION, send_evicted_callback.WaitForResult());
677 send_evicted_stream->Close(true); 685 send_evicted_stream->Close(true);
678 686
679 EXPECT_EQ(ERR_PIPELINE_EVICTION, 687 EXPECT_EQ(ERR_PIPELINE_EVICTION,
680 send_rejected_stream->SendRequest(headers, &response, 688 send_rejected_stream->SendRequest(
681 callback_.callback())); 689 headers, &response, callback_.callback()));
682 send_rejected_stream->Close(true); 690 send_rejected_stream->Close(true);
683 } 691 }
684 692
685 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileSending) { 693 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileSending) {
686 MockWrite writes[] = { 694 MockWrite writes[] = {
687 MockWrite(ASYNC, 0, "GET /aborts.html HTTP/1.1\r\n\r\n"), 695 MockWrite(ASYNC, 0, "GET /aborts.html HTTP/1.1\r\n\r\n"),
688 }; 696 };
689 Initialize(NULL, 0, writes, arraysize(writes)); 697 Initialize(NULL, 0, writes, arraysize(writes));
690 698
691 scoped_ptr<HttpStream> aborted_stream(NewTestStream("aborts.html")); 699 scoped_ptr<HttpStream> aborted_stream(NewTestStream("aborts.html"));
692 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 700 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
693 701
694 HttpRequestHeaders headers; 702 HttpRequestHeaders headers;
695 HttpResponseInfo response; 703 HttpResponseInfo response;
696 TestCompletionCallback aborted_callback; 704 TestCompletionCallback aborted_callback;
697 EXPECT_EQ(ERR_IO_PENDING, 705 EXPECT_EQ(ERR_IO_PENDING,
698 aborted_stream->SendRequest(headers, &response, 706 aborted_stream->SendRequest(
699 aborted_callback.callback())); 707 headers, &response, aborted_callback.callback()));
700 TestCompletionCallback evicted_callback; 708 TestCompletionCallback evicted_callback;
701 EXPECT_EQ(ERR_IO_PENDING, 709 EXPECT_EQ(ERR_IO_PENDING,
702 evicted_stream->SendRequest(headers, &response, 710 evicted_stream->SendRequest(
703 evicted_callback.callback())); 711 headers, &response, evicted_callback.callback()));
704 712
705 aborted_stream->Close(true); 713 aborted_stream->Close(true);
706 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 714 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
707 evicted_stream->Close(true); 715 evicted_stream->Close(true);
708 EXPECT_FALSE(aborted_callback.have_result()); 716 EXPECT_FALSE(aborted_callback.have_result());
709 } 717 }
710 718
711 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileSendingSecondRequest) { 719 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileSendingSecondRequest) {
712 MockWrite writes[] = { 720 MockWrite writes[] = {
713 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 721 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
714 MockWrite(ASYNC, 1, "GET /aborts.html HTTP/1.1\r\n\r\n"), 722 MockWrite(ASYNC, 1, "GET /aborts.html HTTP/1.1\r\n\r\n"),
715 }; 723 };
716 Initialize(NULL, 0, writes, arraysize(writes)); 724 Initialize(NULL, 0, writes, arraysize(writes));
717 725
718 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 726 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
719 scoped_ptr<HttpStream> aborted_stream(NewTestStream("aborts.html")); 727 scoped_ptr<HttpStream> aborted_stream(NewTestStream("aborts.html"));
720 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 728 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
721 729
722 HttpRequestHeaders headers; 730 HttpRequestHeaders headers;
723 HttpResponseInfo response; 731 HttpResponseInfo response;
724 TestCompletionCallback ok_callback; 732 TestCompletionCallback ok_callback;
725 EXPECT_EQ(ERR_IO_PENDING, ok_stream->SendRequest(headers, &response, 733 EXPECT_EQ(ERR_IO_PENDING,
726 ok_callback.callback())); 734 ok_stream->SendRequest(headers, &response, ok_callback.callback()));
727 TestCompletionCallback aborted_callback; 735 TestCompletionCallback aborted_callback;
728 EXPECT_EQ(ERR_IO_PENDING, 736 EXPECT_EQ(ERR_IO_PENDING,
729 aborted_stream->SendRequest(headers, &response, 737 aborted_stream->SendRequest(
730 aborted_callback.callback())); 738 headers, &response, aborted_callback.callback()));
731 TestCompletionCallback evicted_callback; 739 TestCompletionCallback evicted_callback;
732 EXPECT_EQ(ERR_IO_PENDING, 740 EXPECT_EQ(ERR_IO_PENDING,
733 evicted_stream->SendRequest(headers, &response, 741 evicted_stream->SendRequest(
734 evicted_callback.callback())); 742 headers, &response, evicted_callback.callback()));
735 743
736 data_->RunFor(1); 744 data_->RunFor(1);
737 EXPECT_LE(OK, ok_callback.WaitForResult()); 745 EXPECT_LE(OK, ok_callback.WaitForResult());
738 base::MessageLoop::current()->RunUntilIdle(); 746 base::MessageLoop::current()->RunUntilIdle();
739 aborted_stream->Close(true); 747 aborted_stream->Close(true);
740 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 748 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
741 evicted_stream->Close(true); 749 evicted_stream->Close(true);
742 EXPECT_FALSE(aborted_callback.have_result()); 750 EXPECT_FALSE(aborted_callback.have_result());
743 ok_stream->Close(true); 751 ok_stream->Close(true);
744 } 752 }
745 753
746 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileReadingHeaders) { 754 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileReadingHeaders) {
747 MockWrite writes[] = { 755 MockWrite writes[] = {
748 MockWrite(SYNCHRONOUS, 0, "GET /aborts.html HTTP/1.1\r\n\r\n"), 756 MockWrite(SYNCHRONOUS, 0, "GET /aborts.html HTTP/1.1\r\n\r\n"),
749 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"), 757 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"),
750 }; 758 };
751 MockRead reads[] = { 759 MockRead reads[] = {
752 MockRead(ASYNC, ERR_FAILED, 2), 760 MockRead(ASYNC, ERR_FAILED, 2),
753 }; 761 };
754 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 762 Initialize(reads, arraysize(reads), writes, arraysize(writes));
755 763
756 scoped_ptr<HttpStream> aborted_stream(NewTestStream("aborts.html")); 764 scoped_ptr<HttpStream> aborted_stream(NewTestStream("aborts.html"));
757 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 765 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
758 scoped_ptr<HttpStream> rejected_stream(NewTestStream("rejected.html")); 766 scoped_ptr<HttpStream> rejected_stream(NewTestStream("rejected.html"));
759 767
760 HttpRequestHeaders headers; 768 HttpRequestHeaders headers;
761 HttpResponseInfo response; 769 HttpResponseInfo response;
762 EXPECT_EQ(OK, 770 EXPECT_EQ(
763 aborted_stream->SendRequest(headers, &response, 771 OK,
764 callback_.callback())); 772 aborted_stream->SendRequest(headers, &response, callback_.callback()));
765 EXPECT_EQ(OK, 773 EXPECT_EQ(
766 evicted_stream->SendRequest(headers, &response, 774 OK,
767 callback_.callback())); 775 evicted_stream->SendRequest(headers, &response, callback_.callback()));
768 776
769 EXPECT_EQ(ERR_IO_PENDING, 777 EXPECT_EQ(ERR_IO_PENDING,
770 aborted_stream->ReadResponseHeaders(callback_.callback())); 778 aborted_stream->ReadResponseHeaders(callback_.callback()));
771 TestCompletionCallback evicted_callback; 779 TestCompletionCallback evicted_callback;
772 EXPECT_EQ(ERR_IO_PENDING, 780 EXPECT_EQ(ERR_IO_PENDING,
773 evicted_stream->ReadResponseHeaders(evicted_callback.callback())); 781 evicted_stream->ReadResponseHeaders(evicted_callback.callback()));
774 782
775 aborted_stream->Close(true); 783 aborted_stream->Close(true);
776 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 784 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
777 evicted_stream->Close(true); 785 evicted_stream->Close(true);
778 786
779 EXPECT_EQ(ERR_PIPELINE_EVICTION, 787 EXPECT_EQ(
780 rejected_stream->SendRequest(headers, &response, 788 ERR_PIPELINE_EVICTION,
781 callback_.callback())); 789 rejected_stream->SendRequest(headers, &response, callback_.callback()));
782 rejected_stream->Close(true); 790 rejected_stream->Close(true);
783 } 791 }
784 792
785 TEST_F(HttpPipelinedConnectionImplTest, PendingResponseAbandoned) { 793 TEST_F(HttpPipelinedConnectionImplTest, PendingResponseAbandoned) {
786 MockWrite writes[] = { 794 MockWrite writes[] = {
787 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 795 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
788 MockWrite(SYNCHRONOUS, 1, "GET /abandoned.html HTTP/1.1\r\n\r\n"), 796 MockWrite(SYNCHRONOUS, 1, "GET /abandoned.html HTTP/1.1\r\n\r\n"),
789 MockWrite(SYNCHRONOUS, 2, "GET /evicted.html HTTP/1.1\r\n\r\n"), 797 MockWrite(SYNCHRONOUS, 2, "GET /evicted.html HTTP/1.1\r\n\r\n"),
790 }; 798 };
791 MockRead reads[] = { 799 MockRead reads[] = {
792 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"), 800 MockRead(SYNCHRONOUS, 3, "HTTP/1.1 200 OK\r\n"),
793 MockRead(SYNCHRONOUS, 4, "Content-Length: 7\r\n\r\n"), 801 MockRead(SYNCHRONOUS, 4, "Content-Length: 7\r\n\r\n"),
794 MockRead(SYNCHRONOUS, 5, "ok.html"), 802 MockRead(SYNCHRONOUS, 5, "ok.html"),
795 }; 803 };
796 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 804 Initialize(reads, arraysize(reads), writes, arraysize(writes));
797 805
798 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 806 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
799 scoped_ptr<HttpStream> abandoned_stream(NewTestStream("abandoned.html")); 807 scoped_ptr<HttpStream> abandoned_stream(NewTestStream("abandoned.html"));
800 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 808 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
801 809
802 HttpRequestHeaders headers; 810 HttpRequestHeaders headers;
803 HttpResponseInfo response; 811 HttpResponseInfo response;
804 EXPECT_EQ(OK, ok_stream->SendRequest(headers, &response, 812 EXPECT_EQ(OK,
805 callback_.callback())); 813 ok_stream->SendRequest(headers, &response, callback_.callback()));
806 EXPECT_EQ(OK, abandoned_stream->SendRequest(headers, &response, 814 EXPECT_EQ(
807 callback_.callback())); 815 OK,
808 EXPECT_EQ(OK, evicted_stream->SendRequest(headers, &response, 816 abandoned_stream->SendRequest(headers, &response, callback_.callback()));
809 callback_.callback())); 817 EXPECT_EQ(
818 OK,
819 evicted_stream->SendRequest(headers, &response, callback_.callback()));
810 820
811 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback())); 821 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback()));
812 TestCompletionCallback abandoned_callback; 822 TestCompletionCallback abandoned_callback;
813 EXPECT_EQ(ERR_IO_PENDING, abandoned_stream->ReadResponseHeaders( 823 EXPECT_EQ(
814 abandoned_callback.callback())); 824 ERR_IO_PENDING,
825 abandoned_stream->ReadResponseHeaders(abandoned_callback.callback()));
815 TestCompletionCallback evicted_callback; 826 TestCompletionCallback evicted_callback;
816 EXPECT_EQ(ERR_IO_PENDING, 827 EXPECT_EQ(ERR_IO_PENDING,
817 evicted_stream->ReadResponseHeaders(evicted_callback.callback())); 828 evicted_stream->ReadResponseHeaders(evicted_callback.callback()));
818 829
819 abandoned_stream->Close(false); 830 abandoned_stream->Close(false);
820 831
821 ExpectResponse("ok.html", ok_stream, false); 832 ExpectResponse("ok.html", ok_stream, false);
822 ok_stream->Close(false); 833 ok_stream->Close(false);
823 834
824 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 835 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
825 evicted_stream->Close(true); 836 evicted_stream->Close(true);
826 EXPECT_FALSE(evicted_stream->IsConnectionReusable()); 837 EXPECT_FALSE(evicted_stream->IsConnectionReusable());
827 } 838 }
828 839
829 TEST_F(HttpPipelinedConnectionImplTest, DisconnectedAfterOneRequestRecovery) { 840 TEST_F(HttpPipelinedConnectionImplTest, DisconnectedAfterOneRequestRecovery) {
830 MockWrite writes[] = { 841 MockWrite writes[] = {
831 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 842 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
832 MockWrite(SYNCHRONOUS, 1, "GET /rejected.html HTTP/1.1\r\n\r\n"), 843 MockWrite(SYNCHRONOUS, 1, "GET /rejected.html HTTP/1.1\r\n\r\n"),
833 MockWrite(ASYNC, ERR_SOCKET_NOT_CONNECTED, 5), 844 MockWrite(ASYNC, ERR_SOCKET_NOT_CONNECTED, 5),
834 MockWrite(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 7), 845 MockWrite(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 7),
835 }; 846 };
836 MockRead reads[] = { 847 MockRead reads[] = {
837 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 848 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
838 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"), 849 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"),
839 MockRead(SYNCHRONOUS, 4, "ok.html"), 850 MockRead(SYNCHRONOUS, 4, "ok.html"),
840 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 6), 851 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 6),
841 }; 852 };
842 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 853 Initialize(reads, arraysize(reads), writes, arraysize(writes));
843 854
844 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 855 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
845 scoped_ptr<HttpStream> rejected_read_stream(NewTestStream("rejected.html")); 856 scoped_ptr<HttpStream> rejected_read_stream(NewTestStream("rejected.html"));
846 scoped_ptr<HttpStream> evicted_send_stream(NewTestStream("evicted.html")); 857 scoped_ptr<HttpStream> evicted_send_stream(NewTestStream("evicted.html"));
847 scoped_ptr<HttpStream> rejected_send_stream(NewTestStream("rejected.html")); 858 scoped_ptr<HttpStream> rejected_send_stream(NewTestStream("rejected.html"));
848 859
849 HttpRequestHeaders headers; 860 HttpRequestHeaders headers;
850 HttpResponseInfo response; 861 HttpResponseInfo response;
851 EXPECT_EQ(OK, ok_stream->SendRequest(headers, 862 EXPECT_EQ(OK,
852 &response, callback_.callback())); 863 ok_stream->SendRequest(headers, &response, callback_.callback()));
853 EXPECT_EQ(OK, rejected_read_stream->SendRequest(headers, &response, 864 EXPECT_EQ(OK,
854 callback_.callback())); 865 rejected_read_stream->SendRequest(
866 headers, &response, callback_.callback()));
855 867
856 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback())); 868 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback()));
857 ExpectResponse("ok.html", ok_stream, false); 869 ExpectResponse("ok.html", ok_stream, false);
858 ok_stream->Close(false); 870 ok_stream->Close(false);
859 871
860 TestCompletionCallback read_callback; 872 TestCompletionCallback read_callback;
861 EXPECT_EQ(ERR_IO_PENDING, 873 EXPECT_EQ(ERR_IO_PENDING,
862 evicted_send_stream->SendRequest(headers, &response, 874 evicted_send_stream->SendRequest(
863 read_callback.callback())); 875 headers, &response, read_callback.callback()));
864 data_->RunFor(1); 876 data_->RunFor(1);
865 EXPECT_EQ(ERR_PIPELINE_EVICTION, read_callback.WaitForResult()); 877 EXPECT_EQ(ERR_PIPELINE_EVICTION, read_callback.WaitForResult());
866 878
867 EXPECT_EQ(ERR_PIPELINE_EVICTION, 879 EXPECT_EQ(ERR_PIPELINE_EVICTION,
868 rejected_read_stream->ReadResponseHeaders(callback_.callback())); 880 rejected_read_stream->ReadResponseHeaders(callback_.callback()));
869 EXPECT_EQ(ERR_PIPELINE_EVICTION, 881 EXPECT_EQ(ERR_PIPELINE_EVICTION,
870 rejected_send_stream->SendRequest(headers, &response, 882 rejected_send_stream->SendRequest(
871 callback_.callback())); 883 headers, &response, callback_.callback()));
872 884
873 rejected_read_stream->Close(true); 885 rejected_read_stream->Close(true);
874 rejected_send_stream->Close(true); 886 rejected_send_stream->Close(true);
875 } 887 }
876 888
877 TEST_F(HttpPipelinedConnectionImplTest, DisconnectedPendingReadRecovery) { 889 TEST_F(HttpPipelinedConnectionImplTest, DisconnectedPendingReadRecovery) {
878 MockWrite writes[] = { 890 MockWrite writes[] = {
879 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 891 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
880 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"), 892 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"),
881 }; 893 };
882 MockRead reads[] = { 894 MockRead reads[] = {
883 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 895 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
884 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"), 896 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"),
885 MockRead(SYNCHRONOUS, 4, "ok.html"), 897 MockRead(SYNCHRONOUS, 4, "ok.html"),
886 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5), 898 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5),
887 }; 899 };
888 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 900 Initialize(reads, arraysize(reads), writes, arraysize(writes));
889 901
890 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 902 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
891 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 903 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
892 904
893 HttpRequestHeaders headers; 905 HttpRequestHeaders headers;
894 HttpResponseInfo response; 906 HttpResponseInfo response;
895 EXPECT_EQ(OK, ok_stream->SendRequest(headers, 907 EXPECT_EQ(OK,
896 &response, callback_.callback())); 908 ok_stream->SendRequest(headers, &response, callback_.callback()));
897 EXPECT_EQ(OK, evicted_stream->SendRequest(headers, &response, 909 EXPECT_EQ(
898 callback_.callback())); 910 OK,
911 evicted_stream->SendRequest(headers, &response, callback_.callback()));
899 912
900 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback())); 913 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback()));
901 ExpectResponse("ok.html", ok_stream, false); 914 ExpectResponse("ok.html", ok_stream, false);
902 915
903 TestCompletionCallback evicted_callback; 916 TestCompletionCallback evicted_callback;
904 EXPECT_EQ(ERR_IO_PENDING, 917 EXPECT_EQ(ERR_IO_PENDING,
905 evicted_stream->ReadResponseHeaders(evicted_callback.callback())); 918 evicted_stream->ReadResponseHeaders(evicted_callback.callback()));
906 919
907 ok_stream->Close(false); 920 ok_stream->Close(false);
908 921
909 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 922 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
910 evicted_stream->Close(false); 923 evicted_stream->Close(false);
911 } 924 }
912 925
913 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledBeforeNextReadLoop) { 926 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledBeforeNextReadLoop) {
914 MockWrite writes[] = { 927 MockWrite writes[] = {
915 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 928 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
916 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"), 929 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"),
917 }; 930 };
918 MockRead reads[] = { 931 MockRead reads[] = {
919 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 932 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
920 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"), 933 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"),
921 MockRead(SYNCHRONOUS, 4, "ok.html"), 934 MockRead(SYNCHRONOUS, 4, "ok.html"),
922 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5), 935 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5),
923 }; 936 };
924 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 937 Initialize(reads, arraysize(reads), writes, arraysize(writes));
925 938
926 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 939 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
927 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 940 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
928 941
929 HttpRequestHeaders headers; 942 HttpRequestHeaders headers;
930 HttpResponseInfo response; 943 HttpResponseInfo response;
931 EXPECT_EQ(OK, ok_stream->SendRequest(headers, 944 EXPECT_EQ(OK,
932 &response, callback_.callback())); 945 ok_stream->SendRequest(headers, &response, callback_.callback()));
933 EXPECT_EQ(OK, evicted_stream->SendRequest(headers, &response, 946 EXPECT_EQ(
934 callback_.callback())); 947 OK,
948 evicted_stream->SendRequest(headers, &response, callback_.callback()));
935 949
936 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback())); 950 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback()));
937 ExpectResponse("ok.html", ok_stream, false); 951 ExpectResponse("ok.html", ok_stream, false);
938 952
939 TestCompletionCallback evicted_callback; 953 TestCompletionCallback evicted_callback;
940 EXPECT_EQ(ERR_IO_PENDING, 954 EXPECT_EQ(ERR_IO_PENDING,
941 evicted_stream->ReadResponseHeaders(evicted_callback.callback())); 955 evicted_stream->ReadResponseHeaders(evicted_callback.callback()));
942 956
943 ok_stream->Close(false); 957 ok_stream->Close(false);
944 evicted_stream->Close(false); 958 evicted_stream->Close(false);
945 } 959 }
946 960
947 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledBeforeReadCallback) { 961 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledBeforeReadCallback) {
948 MockWrite writes[] = { 962 MockWrite writes[] = {
949 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 963 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
950 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"), 964 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"),
951 }; 965 };
952 MockRead reads[] = { 966 MockRead reads[] = {
953 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 967 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
954 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"), 968 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"),
955 MockRead(SYNCHRONOUS, 4, "ok.html"), 969 MockRead(SYNCHRONOUS, 4, "ok.html"),
956 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5), 970 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 5),
957 }; 971 };
958 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 972 Initialize(reads, arraysize(reads), writes, arraysize(writes));
959 973
960 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 974 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
961 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 975 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
962 976
963 HttpRequestHeaders headers; 977 HttpRequestHeaders headers;
964 HttpResponseInfo response; 978 HttpResponseInfo response;
965 EXPECT_EQ(OK, ok_stream->SendRequest(headers, 979 EXPECT_EQ(OK,
966 &response, callback_.callback())); 980 ok_stream->SendRequest(headers, &response, callback_.callback()));
967 EXPECT_EQ(OK, evicted_stream->SendRequest(headers, &response, 981 EXPECT_EQ(
968 callback_.callback())); 982 OK,
983 evicted_stream->SendRequest(headers, &response, callback_.callback()));
969 984
970 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback())); 985 EXPECT_EQ(OK, ok_stream->ReadResponseHeaders(callback_.callback()));
971 ExpectResponse("ok.html", ok_stream, false); 986 ExpectResponse("ok.html", ok_stream, false);
972 987
973 TestCompletionCallback evicted_callback; 988 TestCompletionCallback evicted_callback;
974 EXPECT_EQ(ERR_IO_PENDING, 989 EXPECT_EQ(ERR_IO_PENDING,
975 evicted_stream->ReadResponseHeaders(evicted_callback.callback())); 990 evicted_stream->ReadResponseHeaders(evicted_callback.callback()));
976 991
977 ok_stream->Close(false); 992 ok_stream->Close(false);
978 993
979 // The posted tasks should be: 994 // The posted tasks should be:
980 // 1. DoReadHeadersLoop, which will post: 995 // 1. DoReadHeadersLoop, which will post:
981 // 2. InvokeUserCallback 996 // 2. InvokeUserCallback
982 SuddenCloseObserver observer(evicted_stream.get(), 2); 997 SuddenCloseObserver observer(evicted_stream.get(), 2);
983 base::MessageLoop::current()->AddTaskObserver(&observer); 998 base::MessageLoop::current()->AddTaskObserver(&observer);
984 base::MessageLoop::current()->RunUntilIdle(); 999 base::MessageLoop::current()->RunUntilIdle();
985 EXPECT_FALSE(evicted_callback.have_result()); 1000 EXPECT_FALSE(evicted_callback.have_result());
986 } 1001 }
987 1002
988 class StreamDeleter { 1003 class StreamDeleter {
989 public: 1004 public:
990 StreamDeleter(HttpStream* stream) 1005 StreamDeleter(HttpStream* stream)
991 : stream_(stream), 1006 : stream_(stream),
992 callback_(base::Bind(&StreamDeleter::OnIOComplete, 1007 callback_(
993 base::Unretained(this))) { 1008 base::Bind(&StreamDeleter::OnIOComplete, base::Unretained(this))) {}
994 }
995 1009
996 ~StreamDeleter() { 1010 ~StreamDeleter() { EXPECT_FALSE(stream_); }
997 EXPECT_FALSE(stream_);
998 }
999 1011
1000 const CompletionCallback& callback() { return callback_; } 1012 const CompletionCallback& callback() { return callback_; }
1001 1013
1002 private: 1014 private:
1003 void OnIOComplete(int result) { 1015 void OnIOComplete(int result) {
1004 stream_->Close(true); 1016 stream_->Close(true);
1005 stream_.reset(); 1017 stream_.reset();
1006 } 1018 }
1007 1019
1008 scoped_ptr<HttpStream> stream_; 1020 scoped_ptr<HttpStream> stream_;
1009 CompletionCallback callback_; 1021 CompletionCallback callback_;
1010 }; 1022 };
1011 1023
1012 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledDuringSendCallback) { 1024 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledDuringSendCallback) {
1013 MockWrite writes[] = { 1025 MockWrite writes[] = {
1014 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1026 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1015 }; 1027 };
1016 Initialize(NULL, 0, writes, arraysize(writes)); 1028 Initialize(NULL, 0, writes, arraysize(writes));
1017 1029
1018 HttpStream* stream(NewTestStream("ok.html")); 1030 HttpStream* stream(NewTestStream("ok.html"));
1019 1031
1020 StreamDeleter deleter(stream); 1032 StreamDeleter deleter(stream);
1021 HttpRequestHeaders headers; 1033 HttpRequestHeaders headers;
1022 HttpResponseInfo response; 1034 HttpResponseInfo response;
1023 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(headers, &response, 1035 EXPECT_EQ(ERR_IO_PENDING,
1024 deleter.callback())); 1036 stream->SendRequest(headers, &response, deleter.callback()));
1025 data_->RunFor(1); 1037 data_->RunFor(1);
1026 } 1038 }
1027 1039
1028 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledDuringReadCallback) { 1040 TEST_F(HttpPipelinedConnectionImplTest, CloseCalledDuringReadCallback) {
1029 MockWrite writes[] = { 1041 MockWrite writes[] = {
1030 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1042 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1031 }; 1043 };
1032 MockRead reads[] = { 1044 MockRead reads[] = {
1033 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 1045 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
1034 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"), 1046 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"),
1035 }; 1047 };
1036 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1048 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1037 1049
1038 HttpStream* stream(NewTestStream("ok.html")); 1050 HttpStream* stream(NewTestStream("ok.html"));
1039 1051
1040 HttpRequestHeaders headers; 1052 HttpRequestHeaders headers;
1041 HttpResponseInfo response; 1053 HttpResponseInfo response;
1042 EXPECT_EQ(OK, stream->SendRequest(headers, 1054 EXPECT_EQ(OK, stream->SendRequest(headers, &response, callback_.callback()));
1043 &response, callback_.callback()));
1044 1055
1045 StreamDeleter deleter(stream); 1056 StreamDeleter deleter(stream);
1046 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(deleter.callback())); 1057 EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(deleter.callback()));
1047 data_->RunFor(1); 1058 data_->RunFor(1);
1048 } 1059 }
1049 1060
1050 TEST_F(HttpPipelinedConnectionImplTest, 1061 TEST_F(HttpPipelinedConnectionImplTest,
1051 CloseCalledDuringReadCallbackWithPendingRead) { 1062 CloseCalledDuringReadCallbackWithPendingRead) {
1052 MockWrite writes[] = { 1063 MockWrite writes[] = {
1053 MockWrite(SYNCHRONOUS, 0, "GET /failed.html HTTP/1.1\r\n\r\n"), 1064 MockWrite(SYNCHRONOUS, 0, "GET /failed.html HTTP/1.1\r\n\r\n"),
1054 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"), 1065 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"),
1055 }; 1066 };
1056 MockRead reads[] = { 1067 MockRead reads[] = {
1057 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 1068 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
1058 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"), 1069 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"),
1059 }; 1070 };
1060 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1071 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1061 1072
1062 HttpStream* failed_stream(NewTestStream("failed.html")); 1073 HttpStream* failed_stream(NewTestStream("failed.html"));
1063 HttpStream* evicted_stream(NewTestStream("evicted.html")); 1074 HttpStream* evicted_stream(NewTestStream("evicted.html"));
1064 1075
1065 HttpRequestHeaders headers; 1076 HttpRequestHeaders headers;
1066 HttpResponseInfo response; 1077 HttpResponseInfo response;
1067 EXPECT_EQ(OK, failed_stream->SendRequest(headers, &response, 1078 EXPECT_EQ(
1068 callback_.callback())); 1079 OK, failed_stream->SendRequest(headers, &response, callback_.callback()));
1069 EXPECT_EQ(OK, evicted_stream->SendRequest(headers, &response, 1080 EXPECT_EQ(
1070 callback_.callback())); 1081 OK,
1082 evicted_stream->SendRequest(headers, &response, callback_.callback()));
1071 1083
1072 StreamDeleter failed_deleter(failed_stream); 1084 StreamDeleter failed_deleter(failed_stream);
1073 EXPECT_EQ(ERR_IO_PENDING, 1085 EXPECT_EQ(ERR_IO_PENDING,
1074 failed_stream->ReadResponseHeaders(failed_deleter.callback())); 1086 failed_stream->ReadResponseHeaders(failed_deleter.callback()));
1075 StreamDeleter evicted_deleter(evicted_stream); 1087 StreamDeleter evicted_deleter(evicted_stream);
1076 EXPECT_EQ(ERR_IO_PENDING, 1088 EXPECT_EQ(ERR_IO_PENDING,
1077 evicted_stream->ReadResponseHeaders(evicted_deleter.callback())); 1089 evicted_stream->ReadResponseHeaders(evicted_deleter.callback()));
1078 data_->RunFor(1); 1090 data_->RunFor(1);
1079 } 1091 }
1080 1092
1081 TEST_F(HttpPipelinedConnectionImplTest, CloseOtherDuringReadCallback) { 1093 TEST_F(HttpPipelinedConnectionImplTest, CloseOtherDuringReadCallback) {
1082 MockWrite writes[] = { 1094 MockWrite writes[] = {
1083 MockWrite(SYNCHRONOUS, 0, "GET /deleter.html HTTP/1.1\r\n\r\n"), 1095 MockWrite(SYNCHRONOUS, 0, "GET /deleter.html HTTP/1.1\r\n\r\n"),
1084 MockWrite(SYNCHRONOUS, 1, "GET /deleted.html HTTP/1.1\r\n\r\n"), 1096 MockWrite(SYNCHRONOUS, 1, "GET /deleted.html HTTP/1.1\r\n\r\n"),
1085 }; 1097 };
1086 MockRead reads[] = { 1098 MockRead reads[] = {
1087 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"), 1099 MockRead(SYNCHRONOUS, 2, "HTTP/1.1 200 OK\r\n"),
1088 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"), 1100 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"),
1089 }; 1101 };
1090 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1102 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1091 1103
1092 scoped_ptr<HttpStream> deleter_stream(NewTestStream("deleter.html")); 1104 scoped_ptr<HttpStream> deleter_stream(NewTestStream("deleter.html"));
1093 HttpStream* deleted_stream(NewTestStream("deleted.html")); 1105 HttpStream* deleted_stream(NewTestStream("deleted.html"));
1094 1106
1095 HttpRequestHeaders headers; 1107 HttpRequestHeaders headers;
1096 HttpResponseInfo response; 1108 HttpResponseInfo response;
1097 EXPECT_EQ(OK, deleter_stream->SendRequest(headers, 1109 EXPECT_EQ(
1098 &response, callback_.callback())); 1110 OK,
1099 EXPECT_EQ(OK, deleted_stream->SendRequest(headers, 1111 deleter_stream->SendRequest(headers, &response, callback_.callback()));
1100 &response, callback_.callback())); 1112 EXPECT_EQ(
1113 OK,
1114 deleted_stream->SendRequest(headers, &response, callback_.callback()));
1101 1115
1102 StreamDeleter deleter(deleted_stream); 1116 StreamDeleter deleter(deleted_stream);
1103 EXPECT_EQ(ERR_IO_PENDING, 1117 EXPECT_EQ(ERR_IO_PENDING,
1104 deleter_stream->ReadResponseHeaders(deleter.callback())); 1118 deleter_stream->ReadResponseHeaders(deleter.callback()));
1105 EXPECT_EQ(ERR_IO_PENDING, 1119 EXPECT_EQ(ERR_IO_PENDING,
1106 deleted_stream->ReadResponseHeaders(callback_.callback())); 1120 deleted_stream->ReadResponseHeaders(callback_.callback()));
1107 data_->RunFor(1); 1121 data_->RunFor(1);
1108 } 1122 }
1109 1123
1110 TEST_F(HttpPipelinedConnectionImplTest, CloseBeforeSendCallbackRuns) { 1124 TEST_F(HttpPipelinedConnectionImplTest, CloseBeforeSendCallbackRuns) {
1111 MockWrite writes[] = { 1125 MockWrite writes[] = {
1112 MockWrite(ASYNC, 0, "GET /close.html HTTP/1.1\r\n\r\n"), 1126 MockWrite(ASYNC, 0, "GET /close.html HTTP/1.1\r\n\r\n"),
1113 MockWrite(ASYNC, 1, "GET /dummy.html HTTP/1.1\r\n\r\n"), 1127 MockWrite(ASYNC, 1, "GET /dummy.html HTTP/1.1\r\n\r\n"),
1114 }; 1128 };
1115 Initialize(NULL, 0, writes, arraysize(writes)); 1129 Initialize(NULL, 0, writes, arraysize(writes));
1116 1130
1117 scoped_ptr<HttpStream> close_stream(NewTestStream("close.html")); 1131 scoped_ptr<HttpStream> close_stream(NewTestStream("close.html"));
1118 scoped_ptr<HttpStream> dummy_stream(NewTestStream("dummy.html")); 1132 scoped_ptr<HttpStream> dummy_stream(NewTestStream("dummy.html"));
1119 1133
1120 scoped_ptr<TestCompletionCallback> close_callback( 1134 scoped_ptr<TestCompletionCallback> close_callback(new TestCompletionCallback);
1121 new TestCompletionCallback);
1122 HttpRequestHeaders headers; 1135 HttpRequestHeaders headers;
1123 HttpResponseInfo response; 1136 HttpResponseInfo response;
1124 EXPECT_EQ(ERR_IO_PENDING, 1137 EXPECT_EQ(ERR_IO_PENDING,
1125 close_stream->SendRequest(headers, 1138 close_stream->SendRequest(
1126 &response, close_callback->callback())); 1139 headers, &response, close_callback->callback()));
1127 1140
1128 data_->RunFor(1); 1141 data_->RunFor(1);
1129 EXPECT_FALSE(close_callback->have_result()); 1142 EXPECT_FALSE(close_callback->have_result());
1130 1143
1131 close_stream->Close(false); 1144 close_stream->Close(false);
1132 close_stream.reset(); 1145 close_stream.reset();
1133 close_callback.reset(); 1146 close_callback.reset();
1134 1147
1135 base::MessageLoop::current()->RunUntilIdle(); 1148 base::MessageLoop::current()->RunUntilIdle();
1136 } 1149 }
1137 1150
1138 TEST_F(HttpPipelinedConnectionImplTest, CloseBeforeReadCallbackRuns) { 1151 TEST_F(HttpPipelinedConnectionImplTest, CloseBeforeReadCallbackRuns) {
1139 MockWrite writes[] = { 1152 MockWrite writes[] = {
1140 MockWrite(SYNCHRONOUS, 0, "GET /close.html HTTP/1.1\r\n\r\n"), 1153 MockWrite(SYNCHRONOUS, 0, "GET /close.html HTTP/1.1\r\n\r\n"),
1141 MockWrite(SYNCHRONOUS, 3, "GET /dummy.html HTTP/1.1\r\n\r\n"), 1154 MockWrite(SYNCHRONOUS, 3, "GET /dummy.html HTTP/1.1\r\n\r\n"),
1142 }; 1155 };
1143 MockRead reads[] = { 1156 MockRead reads[] = {
1144 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 1157 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
1145 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"), 1158 MockRead(ASYNC, 2, "Content-Length: 7\r\n\r\n"),
1146 }; 1159 };
1147 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1160 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1148 1161
1149 scoped_ptr<HttpStream> close_stream(NewTestStream("close.html")); 1162 scoped_ptr<HttpStream> close_stream(NewTestStream("close.html"));
1150 scoped_ptr<HttpStream> dummy_stream(NewTestStream("dummy.html")); 1163 scoped_ptr<HttpStream> dummy_stream(NewTestStream("dummy.html"));
1151 1164
1152 HttpRequestHeaders headers; 1165 HttpRequestHeaders headers;
1153 HttpResponseInfo response; 1166 HttpResponseInfo response;
1154 EXPECT_EQ(OK, close_stream->SendRequest(headers, 1167 EXPECT_EQ(
1155 &response, callback_.callback())); 1168 OK, close_stream->SendRequest(headers, &response, callback_.callback()));
1156 1169
1157 scoped_ptr<TestCompletionCallback> close_callback( 1170 scoped_ptr<TestCompletionCallback> close_callback(new TestCompletionCallback);
1158 new TestCompletionCallback);
1159 EXPECT_EQ(ERR_IO_PENDING, 1171 EXPECT_EQ(ERR_IO_PENDING,
1160 close_stream->ReadResponseHeaders(close_callback->callback())); 1172 close_stream->ReadResponseHeaders(close_callback->callback()));
1161 1173
1162 data_->RunFor(1); 1174 data_->RunFor(1);
1163 EXPECT_FALSE(close_callback->have_result()); 1175 EXPECT_FALSE(close_callback->have_result());
1164 1176
1165 close_stream->Close(false); 1177 close_stream->Close(false);
1166 close_stream.reset(); 1178 close_stream.reset();
1167 close_callback.reset(); 1179 close_callback.reset();
1168 1180
1169 base::MessageLoop::current()->RunUntilIdle(); 1181 base::MessageLoop::current()->RunUntilIdle();
1170 } 1182 }
1171 1183
1172 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileSendQueued) { 1184 TEST_F(HttpPipelinedConnectionImplTest, AbortWhileSendQueued) {
1173 MockWrite writes[] = { 1185 MockWrite writes[] = {
1174 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1186 MockWrite(ASYNC, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1175 MockWrite(ASYNC, 1, "GET /ko.html HTTP/1.1\r\n\r\n"), 1187 MockWrite(ASYNC, 1, "GET /ko.html HTTP/1.1\r\n\r\n"),
1176 }; 1188 };
1177 Initialize(NULL, 0, writes, arraysize(writes)); 1189 Initialize(NULL, 0, writes, arraysize(writes));
1178 1190
1179 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html")); 1191 scoped_ptr<HttpStream> stream1(NewTestStream("ok.html"));
1180 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html")); 1192 scoped_ptr<HttpStream> stream2(NewTestStream("ko.html"));
1181 1193
1182 HttpRequestHeaders headers1; 1194 HttpRequestHeaders headers1;
1183 HttpResponseInfo response1; 1195 HttpResponseInfo response1;
1184 TestCompletionCallback callback1; 1196 TestCompletionCallback callback1;
1185 EXPECT_EQ(ERR_IO_PENDING, stream1->SendRequest(headers1, &response1, 1197 EXPECT_EQ(ERR_IO_PENDING,
1186 callback1.callback())); 1198 stream1->SendRequest(headers1, &response1, callback1.callback()));
1187 1199
1188 HttpRequestHeaders headers2; 1200 HttpRequestHeaders headers2;
1189 HttpResponseInfo response2; 1201 HttpResponseInfo response2;
1190 TestCompletionCallback callback2; 1202 TestCompletionCallback callback2;
1191 EXPECT_EQ(ERR_IO_PENDING, stream2->SendRequest(headers2, &response2, 1203 EXPECT_EQ(ERR_IO_PENDING,
1192 callback2.callback())); 1204 stream2->SendRequest(headers2, &response2, callback2.callback()));
1193 1205
1194 stream2.reset(); 1206 stream2.reset();
1195 stream1->Close(true); 1207 stream1->Close(true);
1196 1208
1197 EXPECT_FALSE(callback2.have_result()); 1209 EXPECT_FALSE(callback2.have_result());
1198 } 1210 }
1199 1211
1200 TEST_F(HttpPipelinedConnectionImplTest, NoGapBetweenCloseAndEviction) { 1212 TEST_F(HttpPipelinedConnectionImplTest, NoGapBetweenCloseAndEviction) {
1201 MockWrite writes[] = { 1213 MockWrite writes[] = {
1202 MockWrite(SYNCHRONOUS, 0, "GET /close.html HTTP/1.1\r\n\r\n"), 1214 MockWrite(SYNCHRONOUS, 0, "GET /close.html HTTP/1.1\r\n\r\n"),
1203 MockWrite(SYNCHRONOUS, 2, "GET /dummy.html HTTP/1.1\r\n\r\n"), 1215 MockWrite(SYNCHRONOUS, 2, "GET /dummy.html HTTP/1.1\r\n\r\n"),
1204 }; 1216 };
1205 MockRead reads[] = { 1217 MockRead reads[] = {
1206 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 1218 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
1207 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"), 1219 MockRead(ASYNC, 3, "Content-Length: 7\r\n\r\n"),
1208 }; 1220 };
1209 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1221 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1210 1222
1211 scoped_ptr<HttpStream> close_stream(NewTestStream("close.html")); 1223 scoped_ptr<HttpStream> close_stream(NewTestStream("close.html"));
1212 scoped_ptr<HttpStream> dummy_stream(NewTestStream("dummy.html")); 1224 scoped_ptr<HttpStream> dummy_stream(NewTestStream("dummy.html"));
1213 1225
1214 HttpRequestHeaders headers; 1226 HttpRequestHeaders headers;
1215 HttpResponseInfo response; 1227 HttpResponseInfo response;
1216 EXPECT_EQ(OK, close_stream->SendRequest(headers, &response, 1228 EXPECT_EQ(
1217 callback_.callback())); 1229 OK, close_stream->SendRequest(headers, &response, callback_.callback()));
1218 1230
1219 TestCompletionCallback close_callback; 1231 TestCompletionCallback close_callback;
1220 EXPECT_EQ(ERR_IO_PENDING, 1232 EXPECT_EQ(ERR_IO_PENDING,
1221 close_stream->ReadResponseHeaders(close_callback.callback())); 1233 close_stream->ReadResponseHeaders(close_callback.callback()));
1222 1234
1223 EXPECT_EQ(OK, dummy_stream->SendRequest(headers, &response, 1235 EXPECT_EQ(
1224 callback_.callback())); 1236 OK, dummy_stream->SendRequest(headers, &response, callback_.callback()));
1225 1237
1226 TestCompletionCallback dummy_callback; 1238 TestCompletionCallback dummy_callback;
1227 EXPECT_EQ(ERR_IO_PENDING, 1239 EXPECT_EQ(ERR_IO_PENDING,
1228 dummy_stream->ReadResponseHeaders(dummy_callback.callback())); 1240 dummy_stream->ReadResponseHeaders(dummy_callback.callback()));
1229 1241
1230 close_stream->Close(true); 1242 close_stream->Close(true);
1231 close_stream.reset(); 1243 close_stream.reset();
1232 1244
1233 EXPECT_TRUE(dummy_callback.have_result()); 1245 EXPECT_TRUE(dummy_callback.have_result());
1234 EXPECT_EQ(ERR_PIPELINE_EVICTION, dummy_callback.WaitForResult()); 1246 EXPECT_EQ(ERR_PIPELINE_EVICTION, dummy_callback.WaitForResult());
1235 dummy_stream->Close(true); 1247 dummy_stream->Close(true);
1236 dummy_stream.reset(); 1248 dummy_stream.reset();
1237 pipeline_.reset(); 1249 pipeline_.reset();
1238 } 1250 }
1239 1251
1240 TEST_F(HttpPipelinedConnectionImplTest, RecoverFromDrainOnRedirect) { 1252 TEST_F(HttpPipelinedConnectionImplTest, RecoverFromDrainOnRedirect) {
1241 MockWrite writes[] = { 1253 MockWrite writes[] = {
1242 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"), 1254 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"),
1243 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"), 1255 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"),
1244 }; 1256 };
1245 MockRead reads[] = { 1257 MockRead reads[] = {
1246 MockRead(SYNCHRONOUS, 2, 1258 MockRead(SYNCHRONOUS,
1247 "HTTP/1.1 302 OK\r\n" 1259 2,
1248 "Content-Length: 8\r\n\r\n" 1260 "HTTP/1.1 302 OK\r\n"
1249 "redirect"), 1261 "Content-Length: 8\r\n\r\n"
1250 MockRead(SYNCHRONOUS, 3, 1262 "redirect"),
1251 "HTTP/1.1 200 OK\r\n" 1263 MockRead(SYNCHRONOUS,
1252 "Content-Length: 7\r\n\r\n" 1264 3,
1253 "ok.html"), 1265 "HTTP/1.1 200 OK\r\n"
1266 "Content-Length: 7\r\n\r\n"
1267 "ok.html"),
1254 }; 1268 };
1255 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1269 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1256 1270
1257 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html")); 1271 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html"));
1258 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html")); 1272 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html"));
1259 1273
1260 HttpRequestHeaders headers1; 1274 HttpRequestHeaders headers1;
1261 HttpResponseInfo response1; 1275 HttpResponseInfo response1;
1262 EXPECT_EQ(OK, stream1->SendRequest(headers1, 1276 EXPECT_EQ(OK,
1263 &response1, callback_.callback())); 1277 stream1->SendRequest(headers1, &response1, callback_.callback()));
1264 HttpRequestHeaders headers2; 1278 HttpRequestHeaders headers2;
1265 HttpResponseInfo response2; 1279 HttpResponseInfo response2;
1266 EXPECT_EQ(OK, stream2->SendRequest(headers2, 1280 EXPECT_EQ(OK,
1267 &response2, callback_.callback())); 1281 stream2->SendRequest(headers2, &response2, callback_.callback()));
1268 1282
1269 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 1283 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
1270 stream1.release()->Drain(NULL); 1284 stream1.release()->Drain(NULL);
1271 1285
1272 EXPECT_EQ(OK, stream2->ReadResponseHeaders(callback_.callback())); 1286 EXPECT_EQ(OK, stream2->ReadResponseHeaders(callback_.callback()));
1273 ExpectResponse("ok.html", stream2, false); 1287 ExpectResponse("ok.html", stream2, false);
1274 stream2->Close(false); 1288 stream2->Close(false);
1275 } 1289 }
1276 1290
1277 TEST_F(HttpPipelinedConnectionImplTest, EvictAfterDrainOfUnknownSize) { 1291 TEST_F(HttpPipelinedConnectionImplTest, EvictAfterDrainOfUnknownSize) {
1278 MockWrite writes[] = { 1292 MockWrite writes[] = {
1279 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"), 1293 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"),
1280 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"), 1294 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"),
1281 }; 1295 };
1282 MockRead reads[] = { 1296 MockRead reads[] = {
1283 MockRead(SYNCHRONOUS, 2, 1297 MockRead(SYNCHRONOUS,
1284 "HTTP/1.1 302 OK\r\n\r\n" 1298 2,
1285 "redirect"), 1299 "HTTP/1.1 302 OK\r\n\r\n"
1300 "redirect"),
1286 }; 1301 };
1287 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1302 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1288 1303
1289 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html")); 1304 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html"));
1290 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html")); 1305 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html"));
1291 1306
1292 HttpRequestHeaders headers1; 1307 HttpRequestHeaders headers1;
1293 HttpResponseInfo response1; 1308 HttpResponseInfo response1;
1294 EXPECT_EQ(OK, stream1->SendRequest(headers1, 1309 EXPECT_EQ(OK,
1295 &response1, callback_.callback())); 1310 stream1->SendRequest(headers1, &response1, callback_.callback()));
1296 HttpRequestHeaders headers2; 1311 HttpRequestHeaders headers2;
1297 HttpResponseInfo response2; 1312 HttpResponseInfo response2;
1298 EXPECT_EQ(OK, stream2->SendRequest(headers2, 1313 EXPECT_EQ(OK,
1299 &response2, callback_.callback())); 1314 stream2->SendRequest(headers2, &response2, callback_.callback()));
1300 1315
1301 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 1316 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
1302 stream1.release()->Drain(NULL); 1317 stream1.release()->Drain(NULL);
1303 1318
1304 EXPECT_EQ(ERR_PIPELINE_EVICTION, 1319 EXPECT_EQ(ERR_PIPELINE_EVICTION,
1305 stream2->ReadResponseHeaders(callback_.callback())); 1320 stream2->ReadResponseHeaders(callback_.callback()));
1306 stream2->Close(false); 1321 stream2->Close(false);
1307 } 1322 }
1308 1323
1309 TEST_F(HttpPipelinedConnectionImplTest, EvictAfterFailedDrain) { 1324 TEST_F(HttpPipelinedConnectionImplTest, EvictAfterFailedDrain) {
1310 MockWrite writes[] = { 1325 MockWrite writes[] = {
1311 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"), 1326 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"),
1312 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"), 1327 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"),
1313 }; 1328 };
1314 MockRead reads[] = { 1329 MockRead reads[] = {
1315 MockRead(SYNCHRONOUS, 2, 1330 MockRead(SYNCHRONOUS,
1316 "HTTP/1.1 302 OK\r\n" 1331 2,
1317 "Content-Length: 8\r\n\r\n"), 1332 "HTTP/1.1 302 OK\r\n"
1318 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 3), 1333 "Content-Length: 8\r\n\r\n"),
1334 MockRead(SYNCHRONOUS, ERR_SOCKET_NOT_CONNECTED, 3),
1319 }; 1335 };
1320 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1336 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1321 1337
1322 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html")); 1338 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html"));
1323 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html")); 1339 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html"));
1324 1340
1325 HttpRequestHeaders headers1; 1341 HttpRequestHeaders headers1;
1326 HttpResponseInfo response1; 1342 HttpResponseInfo response1;
1327 EXPECT_EQ(OK, stream1->SendRequest(headers1, 1343 EXPECT_EQ(OK,
1328 &response1, callback_.callback())); 1344 stream1->SendRequest(headers1, &response1, callback_.callback()));
1329 HttpRequestHeaders headers2; 1345 HttpRequestHeaders headers2;
1330 HttpResponseInfo response2; 1346 HttpResponseInfo response2;
1331 EXPECT_EQ(OK, stream2->SendRequest(headers2, 1347 EXPECT_EQ(OK,
1332 &response2, callback_.callback())); 1348 stream2->SendRequest(headers2, &response2, callback_.callback()));
1333
1334 1349
1335 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 1350 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
1336 stream1.release()->Drain(NULL); 1351 stream1.release()->Drain(NULL);
1337 1352
1338 EXPECT_EQ(ERR_PIPELINE_EVICTION, 1353 EXPECT_EQ(ERR_PIPELINE_EVICTION,
1339 stream2->ReadResponseHeaders(callback_.callback())); 1354 stream2->ReadResponseHeaders(callback_.callback()));
1340 stream2->Close(false); 1355 stream2->Close(false);
1341 } 1356 }
1342 1357
1343 TEST_F(HttpPipelinedConnectionImplTest, EvictIfDrainingChunkedEncoding) { 1358 TEST_F(HttpPipelinedConnectionImplTest, EvictIfDrainingChunkedEncoding) {
1344 MockWrite writes[] = { 1359 MockWrite writes[] = {
1345 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"), 1360 MockWrite(SYNCHRONOUS, 0, "GET /redirect.html HTTP/1.1\r\n\r\n"),
1346 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"), 1361 MockWrite(SYNCHRONOUS, 1, "GET /ok.html HTTP/1.1\r\n\r\n"),
1347 }; 1362 };
1348 MockRead reads[] = { 1363 MockRead reads[] = {
1349 MockRead(SYNCHRONOUS, 2, 1364 MockRead(SYNCHRONOUS,
1350 "HTTP/1.1 302 OK\r\n" 1365 2,
1351 "Transfer-Encoding: chunked\r\n\r\n"), 1366 "HTTP/1.1 302 OK\r\n"
1352 MockRead(SYNCHRONOUS, 3, 1367 "Transfer-Encoding: chunked\r\n\r\n"),
1353 "jibberish"), 1368 MockRead(SYNCHRONOUS, 3, "jibberish"),
1354 }; 1369 };
1355 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1370 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1356 1371
1357 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html")); 1372 scoped_ptr<HttpStream> stream1(NewTestStream("redirect.html"));
1358 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html")); 1373 scoped_ptr<HttpStream> stream2(NewTestStream("ok.html"));
1359 1374
1360 HttpRequestHeaders headers1; 1375 HttpRequestHeaders headers1;
1361 HttpResponseInfo response1; 1376 HttpResponseInfo response1;
1362 EXPECT_EQ(OK, stream1->SendRequest(headers1, 1377 EXPECT_EQ(OK,
1363 &response1, callback_.callback())); 1378 stream1->SendRequest(headers1, &response1, callback_.callback()));
1364 HttpRequestHeaders headers2; 1379 HttpRequestHeaders headers2;
1365 HttpResponseInfo response2; 1380 HttpResponseInfo response2;
1366 EXPECT_EQ(OK, stream2->SendRequest(headers2, 1381 EXPECT_EQ(OK,
1367 &response2, callback_.callback())); 1382 stream2->SendRequest(headers2, &response2, callback_.callback()));
1368
1369 1383
1370 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback())); 1384 EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
1371 stream1.release()->Drain(NULL); 1385 stream1.release()->Drain(NULL);
1372 1386
1373 EXPECT_EQ(ERR_PIPELINE_EVICTION, 1387 EXPECT_EQ(ERR_PIPELINE_EVICTION,
1374 stream2->ReadResponseHeaders(callback_.callback())); 1388 stream2->ReadResponseHeaders(callback_.callback()));
1375 stream2->Close(false); 1389 stream2->Close(false);
1376 } 1390 }
1377 1391
1378 TEST_F(HttpPipelinedConnectionImplTest, EvictionDueToMissingContentLength) { 1392 TEST_F(HttpPipelinedConnectionImplTest, EvictionDueToMissingContentLength) {
1379 MockWrite writes[] = { 1393 MockWrite writes[] = {
1380 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1394 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1381 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"), 1395 MockWrite(SYNCHRONOUS, 1, "GET /evicted.html HTTP/1.1\r\n\r\n"),
1382 MockWrite(SYNCHRONOUS, 2, "GET /rejected.html HTTP/1.1\r\n\r\n"), 1396 MockWrite(SYNCHRONOUS, 2, "GET /rejected.html HTTP/1.1\r\n\r\n"),
1383 }; 1397 };
1384 MockRead reads[] = { 1398 MockRead reads[] = {
1385 MockRead(ASYNC, 3, "HTTP/1.1 200 OK\r\n\r\n"), 1399 MockRead(ASYNC, 3, "HTTP/1.1 200 OK\r\n\r\n"),
1386 MockRead(SYNCHRONOUS, 4, "ok.html"), 1400 MockRead(SYNCHRONOUS, 4, "ok.html"), MockRead(SYNCHRONOUS, OK, 5),
1387 MockRead(SYNCHRONOUS, OK, 5),
1388 }; 1401 };
1389 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1402 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1390 1403
1391 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html")); 1404 scoped_ptr<HttpStream> ok_stream(NewTestStream("ok.html"));
1392 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html")); 1405 scoped_ptr<HttpStream> evicted_stream(NewTestStream("evicted.html"));
1393 scoped_ptr<HttpStream> rejected_stream(NewTestStream("rejected.html")); 1406 scoped_ptr<HttpStream> rejected_stream(NewTestStream("rejected.html"));
1394 1407
1395 HttpRequestHeaders headers; 1408 HttpRequestHeaders headers;
1396 HttpResponseInfo response; 1409 HttpResponseInfo response;
1397 EXPECT_EQ(OK, ok_stream->SendRequest(headers, 1410 EXPECT_EQ(OK,
1398 &response, callback_.callback())); 1411 ok_stream->SendRequest(headers, &response, callback_.callback()));
1399 EXPECT_EQ(OK, evicted_stream->SendRequest(headers, 1412 EXPECT_EQ(
1400 &response, callback_.callback())); 1413 OK,
1401 EXPECT_EQ(OK, rejected_stream->SendRequest(headers, 1414 evicted_stream->SendRequest(headers, &response, callback_.callback()));
1402 &response, callback_.callback())); 1415 EXPECT_EQ(
1416 OK,
1417 rejected_stream->SendRequest(headers, &response, callback_.callback()));
1403 1418
1404 TestCompletionCallback ok_callback; 1419 TestCompletionCallback ok_callback;
1405 EXPECT_EQ(ERR_IO_PENDING, 1420 EXPECT_EQ(ERR_IO_PENDING,
1406 ok_stream->ReadResponseHeaders(ok_callback.callback())); 1421 ok_stream->ReadResponseHeaders(ok_callback.callback()));
1407 1422
1408 TestCompletionCallback evicted_callback; 1423 TestCompletionCallback evicted_callback;
1409 EXPECT_EQ(ERR_IO_PENDING, 1424 EXPECT_EQ(ERR_IO_PENDING,
1410 evicted_stream->ReadResponseHeaders(evicted_callback.callback())); 1425 evicted_stream->ReadResponseHeaders(evicted_callback.callback()));
1411 1426
1412 data_->RunFor(1); 1427 data_->RunFor(1);
1413 EXPECT_LE(OK, ok_callback.WaitForResult()); 1428 EXPECT_LE(OK, ok_callback.WaitForResult());
1414 data_->StopAfter(10); 1429 data_->StopAfter(10);
1415 1430
1416 ExpectResponse("ok.html", ok_stream, false); 1431 ExpectResponse("ok.html", ok_stream, false);
1417 ok_stream->Close(false); 1432 ok_stream->Close(false);
1418 1433
1419 EXPECT_EQ(ERR_PIPELINE_EVICTION, 1434 EXPECT_EQ(ERR_PIPELINE_EVICTION,
1420 rejected_stream->ReadResponseHeaders(callback_.callback())); 1435 rejected_stream->ReadResponseHeaders(callback_.callback()));
1421 rejected_stream->Close(true); 1436 rejected_stream->Close(true);
1422 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult()); 1437 EXPECT_EQ(ERR_PIPELINE_EVICTION, evicted_callback.WaitForResult());
1423 evicted_stream->Close(true); 1438 evicted_stream->Close(true);
1424 } 1439 }
1425 1440
1426 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnSocketError) { 1441 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnSocketError) {
1427 MockWrite writes[] = { 1442 MockWrite writes[] = {
1428 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1443 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1429 }; 1444 };
1430 MockRead reads[] = { 1445 MockRead reads[] = {
1431 MockRead(SYNCHRONOUS, ERR_FAILED, 1), 1446 MockRead(SYNCHRONOUS, ERR_FAILED, 1),
1432 }; 1447 };
1433 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1448 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1434 1449
1435 EXPECT_CALL(delegate_, 1450 EXPECT_CALL(delegate_,
1436 OnPipelineFeedback( 1451 OnPipelineFeedback(
1437 pipeline_.get(), 1452 pipeline_.get(),
1438 HttpPipelinedConnection::PIPELINE_SOCKET_ERROR)) 1453 HttpPipelinedConnection::PIPELINE_SOCKET_ERROR)).Times(1);
1439 .Times(1);
1440 1454
1441 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1455 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1442 HttpRequestHeaders headers; 1456 HttpRequestHeaders headers;
1443 HttpResponseInfo response; 1457 HttpResponseInfo response;
1444 EXPECT_EQ(OK, stream->SendRequest(headers, 1458 EXPECT_EQ(OK, stream->SendRequest(headers, &response, callback_.callback()));
1445 &response, callback_.callback()));
1446 EXPECT_EQ(ERR_FAILED, stream->ReadResponseHeaders(callback_.callback())); 1459 EXPECT_EQ(ERR_FAILED, stream->ReadResponseHeaders(callback_.callback()));
1447 } 1460 }
1448 1461
1449 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnNoInternetConnection) { 1462 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnNoInternetConnection) {
1450 MockWrite writes[] = { 1463 MockWrite writes[] = {
1451 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1464 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1452 }; 1465 };
1453 MockRead reads[] = { 1466 MockRead reads[] = {
1454 MockRead(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED, 1), 1467 MockRead(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED, 1),
1455 }; 1468 };
1456 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1469 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1457 1470
1458 EXPECT_CALL(delegate_, OnPipelineFeedback(_, _)) 1471 EXPECT_CALL(delegate_, OnPipelineFeedback(_, _)).Times(0);
1459 .Times(0);
1460 1472
1461 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1473 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1462 HttpRequestHeaders headers; 1474 HttpRequestHeaders headers;
1463 HttpResponseInfo response; 1475 HttpResponseInfo response;
1464 EXPECT_EQ(OK, stream->SendRequest(headers, 1476 EXPECT_EQ(OK, stream->SendRequest(headers, &response, callback_.callback()));
1465 &response, callback_.callback()));
1466 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, 1477 EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
1467 stream->ReadResponseHeaders(callback_.callback())); 1478 stream->ReadResponseHeaders(callback_.callback()));
1468 } 1479 }
1469 1480
1470 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnHttp10) { 1481 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnHttp10) {
1471 MockWrite writes[] = { 1482 MockWrite writes[] = {
1472 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1483 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1473 }; 1484 };
1474 MockRead reads[] = { 1485 MockRead reads[] = {
1475 MockRead(SYNCHRONOUS, 1, "HTTP/1.0 200 OK\r\n"), 1486 MockRead(SYNCHRONOUS, 1, "HTTP/1.0 200 OK\r\n"),
1476 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n"), 1487 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n"),
1477 MockRead(SYNCHRONOUS, 3, "Connection: keep-alive\r\n\r\n"), 1488 MockRead(SYNCHRONOUS, 3, "Connection: keep-alive\r\n\r\n"),
1478 MockRead(SYNCHRONOUS, 4, "ok.html"), 1489 MockRead(SYNCHRONOUS, 4, "ok.html"),
1479 }; 1490 };
1480 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1491 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1481 1492
1482 EXPECT_CALL(delegate_, 1493 EXPECT_CALL(delegate_,
1483 OnPipelineFeedback(pipeline_.get(), 1494 OnPipelineFeedback(pipeline_.get(),
1484 HttpPipelinedConnection::OLD_HTTP_VERSION)) 1495 HttpPipelinedConnection::OLD_HTTP_VERSION))
1485 .Times(1); 1496 .Times(1);
1486 1497
1487 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1498 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1488 TestSyncRequest(stream, "ok.html"); 1499 TestSyncRequest(stream, "ok.html");
1489 } 1500 }
1490 1501
1491 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnMustClose) { 1502 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnMustClose) {
1492 MockWrite writes[] = { 1503 MockWrite writes[] = {
1493 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1504 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1494 }; 1505 };
1495 MockRead reads[] = { 1506 MockRead reads[] = {
1496 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"), 1507 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n"),
1497 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n"), 1508 MockRead(SYNCHRONOUS, 2, "Content-Length: 7\r\n"),
1498 MockRead(SYNCHRONOUS, 3, "Connection: close\r\n\r\n"), 1509 MockRead(SYNCHRONOUS, 3, "Connection: close\r\n\r\n"),
1499 MockRead(SYNCHRONOUS, 4, "ok.html"), 1510 MockRead(SYNCHRONOUS, 4, "ok.html"),
1500 }; 1511 };
1501 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1512 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1502 1513
1503 EXPECT_CALL(delegate_, 1514 EXPECT_CALL(delegate_,
1504 OnPipelineFeedback( 1515 OnPipelineFeedback(
1505 pipeline_.get(), 1516 pipeline_.get(),
1506 HttpPipelinedConnection::MUST_CLOSE_CONNECTION)) 1517 HttpPipelinedConnection::MUST_CLOSE_CONNECTION)).Times(1);
1507 .Times(1);
1508 1518
1509 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1519 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1510 TestSyncRequest(stream, "ok.html"); 1520 TestSyncRequest(stream, "ok.html");
1511 } 1521 }
1512 1522
1513 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnNoContentLength) { 1523 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnNoContentLength) {
1514 MockWrite writes[] = { 1524 MockWrite writes[] = {
1515 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1525 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1516 }; 1526 };
1517 MockRead reads[] = { 1527 MockRead reads[] = {
1518 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"), 1528 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 200 OK\r\n\r\n"),
1519 MockRead(SYNCHRONOUS, 2, "ok.html"), 1529 MockRead(SYNCHRONOUS, 2, "ok.html"),
1520 }; 1530 };
1521 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1531 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1522 1532
1523 EXPECT_CALL(delegate_, 1533 EXPECT_CALL(delegate_,
1524 OnPipelineFeedback( 1534 OnPipelineFeedback(
1525 pipeline_.get(), 1535 pipeline_.get(),
1526 HttpPipelinedConnection::MUST_CLOSE_CONNECTION)) 1536 HttpPipelinedConnection::MUST_CLOSE_CONNECTION)).Times(1);
1527 .Times(1);
1528 1537
1529 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1538 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1530 TestSyncRequest(stream, "ok.html"); 1539 TestSyncRequest(stream, "ok.html");
1531 } 1540 }
1532 1541
1533 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnAuthenticationRequired) { 1542 TEST_F(HttpPipelinedConnectionImplTest, FeedbackOnAuthenticationRequired) {
1534 MockWrite writes[] = { 1543 MockWrite writes[] = {
1535 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1544 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1536 }; 1545 };
1537 MockRead reads[] = { 1546 MockRead reads[] = {
1538 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 401 Unauthorized\r\n"), 1547 MockRead(SYNCHRONOUS, 1, "HTTP/1.1 401 Unauthorized\r\n"),
1539 MockRead(SYNCHRONOUS, 2, "WWW-Authenticate: NTLM\r\n"), 1548 MockRead(SYNCHRONOUS, 2, "WWW-Authenticate: NTLM\r\n"),
1540 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"), 1549 MockRead(SYNCHRONOUS, 3, "Content-Length: 7\r\n\r\n"),
1541 MockRead(SYNCHRONOUS, 4, "ok.html"), 1550 MockRead(SYNCHRONOUS, 4, "ok.html"),
1542 }; 1551 };
1543 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 1552 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1544 1553
1545 EXPECT_CALL(delegate_, 1554 EXPECT_CALL(delegate_,
1546 OnPipelineFeedback( 1555 OnPipelineFeedback(
1547 pipeline_.get(), 1556 pipeline_.get(),
1548 HttpPipelinedConnection::AUTHENTICATION_REQUIRED)) 1557 HttpPipelinedConnection::AUTHENTICATION_REQUIRED)).Times(1);
1549 .Times(1);
1550 1558
1551 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1559 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1552 TestSyncRequest(stream, "ok.html"); 1560 TestSyncRequest(stream, "ok.html");
1553 } 1561 }
1554 1562
1555 TEST_F(HttpPipelinedConnectionImplTest, OnPipelineHasCapacity) { 1563 TEST_F(HttpPipelinedConnectionImplTest, OnPipelineHasCapacity) {
1556 MockWrite writes[] = { 1564 MockWrite writes[] = {
1557 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1565 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1558 }; 1566 };
1559 Initialize(NULL, 0, writes, arraysize(writes)); 1567 Initialize(NULL, 0, writes, arraysize(writes));
1560 1568
1561 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(0); 1569 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(0);
1562 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1570 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1563 1571
1564 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1); 1572 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1);
1565 HttpRequestHeaders headers; 1573 HttpRequestHeaders headers;
1566 HttpResponseInfo response; 1574 HttpResponseInfo response;
1567 EXPECT_EQ(OK, stream->SendRequest(headers, 1575 EXPECT_EQ(OK, stream->SendRequest(headers, &response, callback_.callback()));
1568 &response, callback_.callback()));
1569 1576
1570 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(0); 1577 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(0);
1571 base::MessageLoop::current()->RunUntilIdle(); 1578 base::MessageLoop::current()->RunUntilIdle();
1572 1579
1573 stream->Close(false); 1580 stream->Close(false);
1574 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1); 1581 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1);
1575 stream.reset(NULL); 1582 stream.reset(NULL);
1576 } 1583 }
1577 1584
1578 TEST_F(HttpPipelinedConnectionImplTest, OnPipelineHasCapacityWithoutSend) { 1585 TEST_F(HttpPipelinedConnectionImplTest, OnPipelineHasCapacityWithoutSend) {
1579 MockWrite writes[] = { 1586 MockWrite writes[] = {
1580 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"), 1587 MockWrite(SYNCHRONOUS, 0, "GET /ok.html HTTP/1.1\r\n\r\n"),
1581 }; 1588 };
1582 Initialize(NULL, 0, writes, arraysize(writes)); 1589 Initialize(NULL, 0, writes, arraysize(writes));
1583 1590
1584 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(0); 1591 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(0);
1585 scoped_ptr<HttpStream> stream(NewTestStream("ok.html")); 1592 scoped_ptr<HttpStream> stream(NewTestStream("ok.html"));
1586 1593
1587 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1); 1594 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1);
1588 base::MessageLoop::current()->RunUntilIdle(); 1595 base::MessageLoop::current()->RunUntilIdle();
1589 1596
1590 stream->Close(false); 1597 stream->Close(false);
1591 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1); 1598 EXPECT_CALL(delegate_, OnPipelineHasCapacity(pipeline_.get())).Times(1);
1592 stream.reset(NULL); 1599 stream.reset(NULL);
1593 } 1600 }
1594 1601
1595 } // anonymous namespace 1602 } // anonymous namespace
1596 1603
1597 } // namespace net 1604 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698