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

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

Issue 3108038: Fix bug where pushed SPDY streams were never actually closed.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Will's comments Created 10 years, 4 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
« no previous file with comments | « net/spdy/spdy_http_stream.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "net/base/net_log_unittest.h" 8 #include "net/base/net_log_unittest.h"
9 #include "net/http/http_stream_handle.h" 9 #include "net/http/http_stream_handle.h"
10 #include "net/http/http_transaction_unittest.h" 10 #include "net/http/http_transaction_unittest.h"
11 #include "net/spdy/spdy_http_stream.h" 11 #include "net/spdy/spdy_http_stream.h"
12 #include "net/spdy/spdy_session.h" 12 #include "net/spdy/spdy_session.h"
13 #include "net/spdy/spdy_session_pool.h"
13 #include "net/spdy/spdy_test_util.h" 14 #include "net/spdy/spdy_test_util.h"
14 #include "net/url_request/url_request_unittest.h" 15 #include "net/url_request/url_request_unittest.h"
15 #include "testing/platform_test.h" 16 #include "testing/platform_test.h"
16 17
17 //----------------------------------------------------------------------------- 18 //-----------------------------------------------------------------------------
18 19
19 namespace net { 20 namespace net {
20 21
21 // This is the expected list of advertised protocols from the browser's NPN 22 // This is the expected list of advertised protocols from the browser's NPN
22 // list. 23 // list.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 port_ = 80; 76 port_ = 80;
76 break; 77 break;
77 case SPDYNPN: 78 case SPDYNPN:
78 port_ = 443; 79 port_ = 443;
79 break; 80 break;
80 default: 81 default:
81 NOTREACHED(); 82 NOTREACHED();
82 } 83 }
83 } 84 }
84 85
86 ~NormalSpdyTransactionHelper() {
87 // Any test which doesn't close the socket by sending it an EOF will
88 // have a valid session left open, which leaks the entire session pool.
89 // This is just fine - in fact, some of our tests intentionally do this
90 // so that we can check consistency of the SpdySessionPool as the test
91 // finishes. If we had put an EOF on the socket, the SpdySession would
92 // have closed and we wouldn't be able to check the consistency.
93
94 // Forcefully close existing sessions here.
95 session()->spdy_session_pool()->CloseAllSessions();
96 }
97
85 void SetDeterministic() { 98 void SetDeterministic() {
86 session_ = SpdySessionDependencies::SpdyCreateSessionDeterministic( 99 session_ = SpdySessionDependencies::SpdyCreateSessionDeterministic(
87 session_deps_.get()); 100 session_deps_.get());
88 deterministic_ = true; 101 deterministic_ = true;
89 } 102 }
90 103
91 void RunPreTestSetup() { 104 void RunPreTestSetup() {
92 if (!session_deps_.get()) 105 if (!session_deps_.get())
93 session_deps_.reset(new SpdySessionDependencies()); 106 session_deps_.reset(new SpdySessionDependencies());
94 if (!session_.get()) 107 if (!session_.get())
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 DCHECK(deterministic_); 253 DCHECK(deterministic_);
241 session_deps_->deterministic_socket_factory->AddSocketDataProvider(data); 254 session_deps_->deterministic_socket_factory->AddSocketDataProvider(data);
242 } 255 }
243 256
244 void SetSession(const scoped_refptr<HttpNetworkSession>& session) { 257 void SetSession(const scoped_refptr<HttpNetworkSession>& session) {
245 session_ = session; 258 session_ = session;
246 } 259 }
247 HttpNetworkTransaction* trans() { return trans_.get(); } 260 HttpNetworkTransaction* trans() { return trans_.get(); }
248 void ResetTrans() { trans_.reset(); } 261 void ResetTrans() { trans_.reset(); }
249 TransactionHelperResult& output() { return output_; } 262 TransactionHelperResult& output() { return output_; }
250 HttpRequestInfo& request() { return request_; } 263 const HttpRequestInfo& request() const { return request_; }
251 scoped_refptr<HttpNetworkSession>& session() { return session_; } 264 const scoped_refptr<HttpNetworkSession>& session() const {
265 return session_;
266 }
252 scoped_ptr<SpdySessionDependencies>& session_deps() { 267 scoped_ptr<SpdySessionDependencies>& session_deps() {
253 return session_deps_; 268 return session_deps_;
254 } 269 }
255 int port() { return port_; } 270 int port() const { return port_; }
271 SpdyNetworkTransactionTestTypes test_type() const { return test_type_; }
256 272
257 private: 273 private:
258 typedef std::vector<StaticSocketDataProvider*> DataVector; 274 typedef std::vector<StaticSocketDataProvider*> DataVector;
259 typedef std::vector<linked_ptr<SSLSocketDataProvider> > SSLVector; 275 typedef std::vector<linked_ptr<SSLSocketDataProvider> > SSLVector;
260 HttpRequestInfo request_; 276 HttpRequestInfo request_;
261 scoped_ptr<SpdySessionDependencies> session_deps_; 277 scoped_ptr<SpdySessionDependencies> session_deps_;
262 scoped_refptr<HttpNetworkSession> session_; 278 scoped_refptr<HttpNetworkSession> session_;
263 TransactionHelperResult output_; 279 TransactionHelperResult output_;
264 scoped_ptr<StaticSocketDataProvider> first_transaction_; 280 scoped_ptr<StaticSocketDataProvider> first_transaction_;
265 SSLVector ssl_vector_; 281 SSLVector ssl_vector_;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 google_post_request_.method = "POST"; 316 google_post_request_.method = "POST";
301 google_post_request_.url = GURL(kDefaultURL); 317 google_post_request_.url = GURL(kDefaultURL);
302 google_post_request_.upload_data = new UploadData(); 318 google_post_request_.upload_data = new UploadData();
303 google_post_request_.upload_data->AppendBytes(kUploadData, 319 google_post_request_.upload_data->AppendBytes(kUploadData,
304 kUploadDataSize); 320 kUploadDataSize);
305 google_post_request_initialized_ = true; 321 google_post_request_initialized_ = true;
306 } 322 }
307 return google_post_request_; 323 return google_post_request_;
308 } 324 }
309 325
310 class RunServerPushTestCallback : public CallbackRunner< Tuple1<int> > { 326 // Read the result of a particular transaction, knowing that we've got
311 public: 327 // multiple transactions in the read pipeline; so as we read, we may have
312 RunServerPushTestCallback(scoped_refptr<net::IOBufferWithSize> buffer, 328 // to skip over data destined for other transactions while we consume
313 std::string& result, bool& need_read_callback) 329 // the data for |trans|.
314 : buffer_(buffer), result_(result), 330 int ReadResult(HttpNetworkTransaction* trans,
315 need_read_callback_(need_read_callback) {} 331 OrderedSocketData* data,
332 std::string* result) {
333 const int kSize = 3000;
316 334
317 virtual void RunWithParams(const Tuple1<int>& params) { 335 int bytes_read = 0;
318 // Indicates some type of error. 336 scoped_refptr<net::IOBufferWithSize> buf = new net::IOBufferWithSize(kSize);
319 if(params.a <= 0) 337 TestCompletionCallback callback;
320 return; 338 while (true) {
339 int rv = trans->Read(buf, kSize, &callback);
340 if (rv == ERR_IO_PENDING) {
341 // Multiple transactions may be in the data set. Keep pulling off
342 // reads until we complete our callback.
343 while (!callback.have_result()) {
344 data->CompleteRead();
345 MessageLoop::current()->RunAllPending();
346 }
347 rv = callback.WaitForResult();
348 } else if (rv <= 0) {
349 break;
350 }
351 result->append(buf->data(), rv);
352 bytes_read += rv;
353 }
354 return bytes_read;
355 }
321 356
322 std::string temp(buffer_->data(), params.a); 357 void VerifyStreamsClosed(const NormalSpdyTransactionHelper& helper) {
323 result_.append(temp); 358 // This lengthy block is reaching into the pool to dig out the active
324 need_read_callback_ = true; 359 // session. Once we have the session, we verify that the streams are
325 } 360 // all closed and not leaked at this point.
326 361 const GURL& url = helper.request().url;
327 private: 362 int port = helper.test_type() == SPDYNPN ? 443 : 80;
328 scoped_refptr<net::IOBufferWithSize> buffer_; 363 HostPortPair host_port_pair(url.host(), port);
329 std::string& result_; 364 HostPortProxyPair pair(host_port_pair, "DIRECT");
330 bool need_read_callback_; 365 BoundNetLog log;
331 }; 366 const scoped_refptr<HttpNetworkSession>& session = helper.session();
367 scoped_refptr<SpdySessionPool> pool(session->spdy_session_pool());
368 EXPECT_TRUE(pool->HasSession(pair));
369 scoped_refptr<SpdySession> spdy_session(pool->Get(pair, session, log));
370 ASSERT_TRUE(spdy_session.get() != NULL);
371 EXPECT_EQ(0u, spdy_session->num_active_streams());
372 EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams());
373 }
332 374
333 void RunServerPushTest(MockWrite writes[], int writes_length, 375 void RunServerPushTest(MockWrite writes[], int writes_length,
334 MockRead reads[], int reads_length, 376 MockRead reads[], int reads_length,
335 HttpResponseInfo* response, 377 HttpResponseInfo* response,
336 HttpResponseInfo* response2, 378 HttpResponseInfo* response2,
337 std::string& expected) { 379 std::string& expected) {
338 scoped_refptr<OrderedSocketData> data( 380 scoped_refptr<OrderedSocketData> data(
339 new OrderedSocketData(reads, reads_length, 381 new OrderedSocketData(reads, reads_length,
340 writes, writes_length)); 382 writes, writes_length));
341 NormalSpdyTransactionHelper helper(CreateGetRequest(), 383 NormalSpdyTransactionHelper helper(CreateGetRequest(),
342 BoundNetLog(), GetParam()); 384 BoundNetLog(), GetParam());
343 385
344 helper.RunPreTestSetup(); 386 helper.RunPreTestSetup();
345 helper.AddData(data.get()); 387 helper.AddData(data.get());
346 388
347 HttpNetworkTransaction* trans = helper.trans(); 389 HttpNetworkTransaction* trans = helper.trans();
348 390
349 // Start the transaction with basic parameters. 391 // Start the transaction with basic parameters.
350 TestCompletionCallback callback; 392 TestCompletionCallback callback;
351 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); 393 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
352 EXPECT_EQ(ERR_IO_PENDING, rv); 394 EXPECT_EQ(ERR_IO_PENDING, rv);
353 rv = callback.WaitForResult(); 395 rv = callback.WaitForResult();
354 396
355 // Request the pushed path. 397 // Request the pushed path.
356 const int kSize = 3000;
357 scoped_refptr<net::IOBufferWithSize> buf = new net::IOBufferWithSize(kSize);
358 scoped_ptr<HttpNetworkTransaction> trans2( 398 scoped_ptr<HttpNetworkTransaction> trans2(
359 new HttpNetworkTransaction(helper.session())); 399 new HttpNetworkTransaction(helper.session()));
360 rv = trans2->Start(&CreateGetPushRequest(), &callback, BoundNetLog()); 400 rv = trans2->Start(&CreateGetPushRequest(), &callback, BoundNetLog());
361 EXPECT_EQ(ERR_IO_PENDING, rv); 401 EXPECT_EQ(ERR_IO_PENDING, rv);
362 MessageLoop::current()->RunAllPending(); 402 MessageLoop::current()->RunAllPending();
363 403
364 // The data for the pushed path may be coming in more than 1 packet. Compile 404 // The data for the pushed path may be coming in more than 1 packet. Compile
365 // the results into a single string. 405 // the results into a single string.
406
407 // Read the server push body.
408 std::string result2;
409 ReadResult(trans2.get(), data, &result2);
410 // Read the response body.
366 std::string result; 411 std::string result;
367 bool need_read_callback = true; 412 ReadResult(trans, data, &result);
368 RunServerPushTestCallback callback2(buf, result, need_read_callback);
369 while(!data->at_read_eof())
370 {
371 if(need_read_callback) {
372 while((rv = trans2->Read(buf, kSize, &callback2)) > 0) {
373 std::string result1(buf->data(),rv);
374 result.append(result1);
375 }
376 need_read_callback = false;
377 }
378 else
379 data->CompleteRead();
380 MessageLoop::current()->RunAllPending();
381 }
382 413
383 // Verify that we consumed all test data. 414 // Verify that we consumed all test data.
384 EXPECT_TRUE(data->at_read_eof()); 415 EXPECT_TRUE(data->at_read_eof());
385 EXPECT_TRUE(data->at_write_eof()); 416 EXPECT_TRUE(data->at_write_eof());
386 417
387 // Verify that the received push data is same as the expected push data. 418 // Verify that the received push data is same as the expected push data.
388 EXPECT_EQ(result.compare(expected),0) << "Received data: " 419 EXPECT_EQ(result2.compare(expected), 0) << "Received data: "
389 << result 420 << result2
390 << "||||| Expected data: " 421 << "||||| Expected data: "
391 << expected; 422 << expected;
392 423
393 // Verify the SYN_REPLY. 424 // Verify the SYN_REPLY.
394 // Copy the response info, because trans goes away. 425 // Copy the response info, because trans goes away.
395 *response = *trans->GetResponseInfo(); 426 *response = *trans->GetResponseInfo();
396 *response2 = *trans2->GetResponseInfo(); 427 *response2 = *trans2->GetResponseInfo();
428
429 VerifyStreamsClosed(helper);
397 } 430 }
398 431
399 private: 432 private:
400 bool google_get_request_initialized_; 433 bool google_get_request_initialized_;
401 bool google_post_request_initialized_; 434 bool google_post_request_initialized_;
402 HttpRequestInfo google_get_request_; 435 HttpRequestInfo google_get_request_;
403 HttpRequestInfo google_post_request_; 436 HttpRequestInfo google_post_request_;
404 HttpRequestInfo google_get_push_request_; 437 HttpRequestInfo google_get_push_request_;
405 }; 438 };
406 439
(...skipping 1352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1759 data->SetStop(20); 1792 data->SetStop(20);
1760 data->Run(); 1793 data->Run();
1761 1794
1762 helper.VerifyDataConsumed(); 1795 helper.VerifyDataConsumed();
1763 } 1796 }
1764 1797
1765 class SpdyNetworkTransactionTest::StartTransactionCallback 1798 class SpdyNetworkTransactionTest::StartTransactionCallback
1766 : public CallbackRunner< Tuple1<int> > { 1799 : public CallbackRunner< Tuple1<int> > {
1767 public: 1800 public:
1768 explicit StartTransactionCallback( 1801 explicit StartTransactionCallback(
1769 scoped_refptr<HttpNetworkSession>& session, 1802 const scoped_refptr<HttpNetworkSession>& session,
1770 NormalSpdyTransactionHelper& helper) 1803 NormalSpdyTransactionHelper& helper)
1771 : session_(session), helper_(helper) {} 1804 : session_(session), helper_(helper) {}
1772 1805
1773 // We try to start another transaction, which should succeed. 1806 // We try to start another transaction, which should succeed.
1774 virtual void RunWithParams(const Tuple1<int>& params) { 1807 virtual void RunWithParams(const Tuple1<int>& params) {
1775 scoped_ptr<HttpNetworkTransaction> trans( 1808 scoped_ptr<HttpNetworkTransaction> trans(
1776 new HttpNetworkTransaction(session_)); 1809 new HttpNetworkTransaction(session_));
1777 TestCompletionCallback callback; 1810 TestCompletionCallback callback;
1778 HttpRequestInfo request; 1811 HttpRequestInfo request;
1779 request.method = "GET"; 1812 request.method = "GET";
1780 request.url = GURL("http://www.google.com/"); 1813 request.url = GURL("http://www.google.com/");
1781 request.load_flags = 0; 1814 request.load_flags = 0;
1782 int rv = trans->Start(&request, &callback, BoundNetLog()); 1815 int rv = trans->Start(&request, &callback, BoundNetLog());
1783 EXPECT_EQ(ERR_IO_PENDING, rv); 1816 EXPECT_EQ(ERR_IO_PENDING, rv);
1784 rv = callback.WaitForResult(); 1817 rv = callback.WaitForResult();
1785 } 1818 }
1786 1819
1787 private: 1820 private:
1788 scoped_refptr<HttpNetworkSession>& session_; 1821 const scoped_refptr<HttpNetworkSession>& session_;
1789 NormalSpdyTransactionHelper& helper_; 1822 NormalSpdyTransactionHelper& helper_;
1790 }; 1823 };
1791 1824
1792 // Verify that the client can correctly deal with the user callback attempting 1825 // Verify that the client can correctly deal with the user callback attempting
1793 // to start another transaction on a session that is closing down. See 1826 // to start another transaction on a session that is closing down. See
1794 // http://crbug.com/47455 1827 // http://crbug.com/47455
1795 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { 1828 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) {
1796 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 1829 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
1797 MockWrite writes[] = { CreateMockWrite(*req) }; 1830 MockWrite writes[] = { CreateMockWrite(*req) };
1798 MockWrite writes2[] = { CreateMockWrite(*req) }; 1831 MockWrite writes2[] = { CreateMockWrite(*req) };
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after
2149 data2->CompleteRead(); 2182 data2->CompleteRead();
2150 EXPECT_TRUE(data->at_read_eof()); 2183 EXPECT_TRUE(data->at_read_eof());
2151 EXPECT_TRUE(data->at_write_eof()); 2184 EXPECT_TRUE(data->at_write_eof());
2152 EXPECT_TRUE(data2->at_read_eof()); 2185 EXPECT_TRUE(data2->at_read_eof());
2153 EXPECT_TRUE(data2->at_write_eof()); 2186 EXPECT_TRUE(data2->at_write_eof());
2154 } 2187 }
2155 2188
2156 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2189 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2157 static const unsigned char kPushBodyFrame[] = { 2190 static const unsigned char kPushBodyFrame[] = {
2158 0x00, 0x00, 0x00, 0x02, // header, ID 2191 0x00, 0x00, 0x00, 0x02, // header, ID
2159 0x01, 0x00, 0x00, 0x05, // FIN, length 2192 0x01, 0x00, 0x00, 0x06, // FIN, length
2160 'h', 'e', 'l', 'l', 'o', // "hello" 2193 'p', 'u', 's', 'h', 'e', 'd' // "pushed"
2194 };
2195 scoped_ptr<spdy::SpdyFrame>
2196 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2197 scoped_ptr<spdy::SpdyFrame>
2198 stream1_body(ConstructSpdyBodyFrame(1, true));
2199 MockWrite writes[] = {
2200 CreateMockWrite(*stream1_syn, 1),
2161 }; 2201 };
2162 2202
2163 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 2203 scoped_ptr<spdy::SpdyFrame>
2164 MockWrite writes[] = { 2204 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2165 CreateMockWrite(*req, 1), 2205 scoped_ptr<spdy::SpdyFrame>
2166 }; 2206 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
2167
2168 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
2169 scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
2170 MockRead reads[] = { 2207 MockRead reads[] = {
2171 CreateMockRead(*resp, 2), 2208 CreateMockRead(*stream1_reply, 2),
2172 CreateMockRead(*rep, 3), 2209 CreateMockRead(*stream2_syn, 3),
2210 CreateMockRead(*stream1_body, 4, false),
2173 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame), 2211 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame),
2174 arraysize(kPushBodyFrame), 4), 2212 arraysize(kPushBodyFrame), 5),
2175 MockRead(true, ERR_IO_PENDING, 5), // Force a pause 2213 MockRead(true, ERR_IO_PENDING, 6), // Force a pause
2176 MockRead(true, 0, 0, 6) // EOF
2177 }; 2214 };
2178 2215
2179 HttpResponseInfo response; 2216 HttpResponseInfo response;
2180 HttpResponseInfo response2; 2217 HttpResponseInfo response2;
2181 std::string expected_push_result("hello"); 2218 std::string expected_push_result("pushed");
2182 RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads), 2219 RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads),
2183 &response, &response2, expected_push_result); 2220 &response, &response2, expected_push_result);
2184 2221
2185 // Verify the SYN_REPLY. 2222 // Verify the SYN_REPLY.
2186 EXPECT_TRUE(response.headers != NULL); 2223 EXPECT_TRUE(response.headers != NULL);
2187 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2224 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2188 2225
2189 // Verify the pushed stream. 2226 // Verify the pushed stream.
2190 EXPECT_TRUE(response2.headers != NULL); 2227 EXPECT_TRUE(response2.headers != NULL);
2191 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2228 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2192 } 2229 }
2193 2230
2231 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2232 scoped_ptr<spdy::SpdyFrame>
2233 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2234 scoped_ptr<spdy::SpdyFrame>
2235 stream1_body(ConstructSpdyBodyFrame(1, true));
2236 MockWrite writes[] = {
2237 CreateMockWrite(*stream1_syn, 1),
2238 };
2239
2240 scoped_ptr<spdy::SpdyFrame>
2241 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2242 scoped_ptr<spdy::SpdyFrame>
2243 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
2244 scoped_ptr<spdy::SpdyFrame>
2245 stream2_rst(ConstructSpdyRstStream(2, spdy::PROTOCOL_ERROR));
2246 MockRead reads[] = {
2247 CreateMockRead(*stream1_reply, 2),
2248 CreateMockRead(*stream2_syn, 3),
2249 CreateMockRead(*stream2_rst, 4),
2250 CreateMockRead(*stream1_body, 5, false),
2251 MockRead(true, ERR_IO_PENDING, 6), // Force a pause
2252 };
2253
2254 scoped_refptr<OrderedSocketData> data(
2255 new OrderedSocketData(reads, arraysize(reads),
2256 writes, arraysize(writes)));
2257 NormalSpdyTransactionHelper helper(CreateGetRequest(),
2258 BoundNetLog(), GetParam());
2259
2260 helper.RunPreTestSetup();
2261 helper.AddData(data.get());
2262
2263 HttpNetworkTransaction* trans = helper.trans();
2264
2265 // Start the transaction with basic parameters.
2266 TestCompletionCallback callback;
2267 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
2268 EXPECT_EQ(ERR_IO_PENDING, rv);
2269 rv = callback.WaitForResult();
2270 EXPECT_EQ(OK, rv);
2271
2272 // Verify that we consumed all test data.
2273 EXPECT_TRUE(data->at_read_eof()) << "Read count: "
2274 << data->read_count()
2275 << " Read index: "
2276 << data->read_index();
2277 EXPECT_TRUE(data->at_write_eof()) << "Write count: "
2278 << data->write_count()
2279 << " Write index: "
2280 << data->write_index();
2281
2282 // Verify the SYN_REPLY.
2283 HttpResponseInfo response = *trans->GetResponseInfo();
2284 EXPECT_TRUE(response.headers != NULL);
2285 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2286 }
2287
2194 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2288 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2195 static const unsigned char kPushBodyFrame1[] = { 2289 static const unsigned char kPushBodyFrame1[] = {
2196 0x00, 0x00, 0x00, 0x02, // header, ID 2290 0x00, 0x00, 0x00, 0x02, // header, ID
2197 0x01, 0x00, 0x00, 0x1E, // FIN, length 2291 0x01, 0x00, 0x00, 0x1F, // FIN, length
2198 'h', 'e', 'l', 'l', 'o', // "hello" 2292 'p', 'u', 's', 'h', 'e', 'd' // "pushed"
2199 }; 2293 };
2200 static const char kPushBodyFrame2[] = " my darling"; 2294 static const char kPushBodyFrame2[] = " my darling";
2201 static const char kPushBodyFrame3[] = " hello"; 2295 static const char kPushBodyFrame3[] = " hello";
2202 static const char kPushBodyFrame4[] = " my baby"; 2296 static const char kPushBodyFrame4[] = " my baby";
2203 2297
2204 scoped_ptr<spdy::SpdyFrame> req( 2298 scoped_ptr<spdy::SpdyFrame>
2205 ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 2299 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2300 scoped_ptr<spdy::SpdyFrame>
2301 stream1_body(ConstructSpdyBodyFrame(1, true));
2206 MockWrite writes[] = { 2302 MockWrite writes[] = {
2207 CreateMockWrite(*req, 1), 2303 CreateMockWrite(*stream1_syn, 1),
2208 }; 2304 };
2209 2305
2210 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 2306 scoped_ptr<spdy::SpdyFrame>
2211 scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat")); 2307 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2308 scoped_ptr<spdy::SpdyFrame>
2309 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
2212 MockRead reads[] = { 2310 MockRead reads[] = {
2213 CreateMockRead(*resp, 2), 2311 CreateMockRead(*stream1_reply, 2),
2214 CreateMockRead(*rep, 3), 2312 CreateMockRead(*stream2_syn, 3),
2215 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame1), 2313 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame1),
2216 arraysize(kPushBodyFrame1), 4), 2314 arraysize(kPushBodyFrame1), 4),
2217 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame2), 2315 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame2),
2218 arraysize(kPushBodyFrame2) - 1, 5), 2316 arraysize(kPushBodyFrame2) - 1, 5),
2219 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame3), 2317 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame3),
2220 arraysize(kPushBodyFrame3) - 1, 6), 2318 arraysize(kPushBodyFrame3) - 1, 6),
2221 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame4), 2319 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame4),
2222 arraysize(kPushBodyFrame4) - 1, 7), 2320 arraysize(kPushBodyFrame4) - 1, 7),
2223 MockRead(true, ERR_IO_PENDING, 8), // Force a pause 2321 CreateMockRead(*stream1_body, 8, false),
2224 MockRead(true, 0, 0, 9) // EOF 2322 MockRead(true, ERR_IO_PENDING, 9), // Force a pause
2225 }; 2323 };
2226 2324
2227 HttpResponseInfo response; 2325 HttpResponseInfo response;
2228 HttpResponseInfo response2; 2326 HttpResponseInfo response2;
2229 std::string expected_push_result("hello my darling hello my baby"); 2327 std::string expected_push_result("pushed my darling hello my baby");
2230 RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads), 2328 RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads),
2231 &response, &response2, expected_push_result); 2329 &response, &response2, expected_push_result);
2232 2330
2233 // Verify the SYN_REPLY. 2331 // Verify the SYN_REPLY.
2234 EXPECT_TRUE(response.headers != NULL); 2332 EXPECT_TRUE(response.headers != NULL);
2235 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2333 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2236 2334
2237 // Verify the pushed stream. 2335 // Verify the pushed stream.
2238 EXPECT_TRUE(response2.headers != NULL); 2336 EXPECT_TRUE(response2.headers != NULL);
2239 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2337 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2240 } 2338 }
2241 2339
2242 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2340 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2243 static const unsigned char kPushBodyFrame1[] = { 2341 static const unsigned char kPushBodyFrame1[] = {
2244 0x00, 0x00, 0x00, 0x02, // header, ID 2342 0x00, 0x00, 0x00, 0x02, // header, ID
2245 0x01, 0x00, 0x00, 0x1E, // FIN, length 2343 0x01, 0x00, 0x00, 0x1F, // FIN, length
2246 'h', 'e', 'l', 'l', 'o', // "hello" 2344 'p', 'u', 's', 'h', 'e', 'd' // "pushed"
2247 }; 2345 };
2248 static const char kPushBodyFrame2[] = " my darling"; 2346 static const char kPushBodyFrame2[] = " my darling";
2249 static const char kPushBodyFrame3[] = " hello"; 2347 static const char kPushBodyFrame3[] = " hello";
2250 static const char kPushBodyFrame4[] = " my baby"; 2348 static const char kPushBodyFrame4[] = " my baby";
2251 2349
2252 scoped_ptr<spdy::SpdyFrame> req( 2350 scoped_ptr<spdy::SpdyFrame>
2253 ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 2351 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2352 scoped_ptr<spdy::SpdyFrame>
2353 stream1_body(ConstructSpdyBodyFrame(1, true));
2254 MockWrite writes[] = { 2354 MockWrite writes[] = {
2255 CreateMockWrite(*req, 1), 2355 CreateMockWrite(*stream1_syn, 1),
2256 }; 2356 };
2257 2357
2258 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 2358 scoped_ptr<spdy::SpdyFrame>
2259 scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat")); 2359 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2360 scoped_ptr<spdy::SpdyFrame>
2361 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
2260 MockRead reads[] = { 2362 MockRead reads[] = {
2261 CreateMockRead(*resp, 2), 2363 CreateMockRead(*stream1_reply, 2),
2262 CreateMockRead(*rep, 3), 2364 CreateMockRead(*stream2_syn, 3),
2263 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame1), 2365 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame1),
2264 arraysize(kPushBodyFrame1), 4), 2366 arraysize(kPushBodyFrame1), 4),
2265 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame2), 2367 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame2),
2266 arraysize(kPushBodyFrame2) - 1, 5), 2368 arraysize(kPushBodyFrame2) - 1, 5),
2267 MockRead(true, ERR_IO_PENDING, 6), // Force a pause 2369 MockRead(true, ERR_IO_PENDING, 6), // Force a pause
2268 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame3), 2370 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame3),
2269 arraysize(kPushBodyFrame3) - 1, 7), 2371 arraysize(kPushBodyFrame3) - 1, 7),
2270 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame4), 2372 MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame4),
2271 arraysize(kPushBodyFrame4) - 1, 8), 2373 arraysize(kPushBodyFrame4) - 1, 8),
2272 MockRead(true, 0, 0, 9) // EOF 2374 CreateMockRead(*stream1_body.get(), 9, false),
2375 MockRead(true, ERR_IO_PENDING, 10) // Force a pause.
2273 }; 2376 };
2274 2377
2275 HttpResponseInfo response; 2378 HttpResponseInfo response;
2276 HttpResponseInfo response2; 2379 HttpResponseInfo response2;
2277 std::string expected_push_result("hello my darling hello my baby"); 2380 std::string expected_push_result("pushed my darling hello my baby");
2278 RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads), 2381 RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads),
2279 &response, &response2, expected_push_result); 2382 &response, &response2, expected_push_result);
2280 2383
2281 // Verify the SYN_REPLY. 2384 // Verify the SYN_REPLY.
2282 EXPECT_TRUE(response.headers != NULL); 2385 EXPECT_TRUE(response.headers != NULL);
2283 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2386 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2284 2387
2285 // Verify the pushed stream. 2388 // Verify the pushed stream.
2286 EXPECT_TRUE(response2.headers != NULL); 2389 EXPECT_TRUE(response2.headers != NULL);
2287 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine()); 2390 EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
2288 } 2391 }
2289 2392
2290 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2393 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2291 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 2394 scoped_ptr<spdy::SpdyFrame>
2292 scoped_ptr<spdy::SpdyFrame> res( 2395 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2293 ConstructSpdyRstStream(2, spdy::INVALID_STREAM)); 2396 scoped_ptr<spdy::SpdyFrame>
2397 stream1_body(ConstructSpdyBodyFrame(1, true));
2398 scoped_ptr<spdy::SpdyFrame>
2399 stream2_rst(ConstructSpdyRstStream(2, spdy::INVALID_STREAM));
2294 MockWrite writes[] = { 2400 MockWrite writes[] = {
2295 CreateMockWrite(*req, 1), 2401 CreateMockWrite(*stream1_syn, 1),
2296 CreateMockWrite(*res, 4), 2402 CreateMockWrite(*stream2_rst, 4),
2297 }; 2403 };
2298 2404
2299 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 2405 scoped_ptr<spdy::SpdyFrame>
2300 scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 0, "/foo.dat")); 2406 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2407 scoped_ptr<spdy::SpdyFrame>
2408 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 0, "/foo.dat"));
2301 MockRead reads[] = { 2409 MockRead reads[] = {
2302 CreateMockRead(*resp, 2), 2410 CreateMockRead(*stream1_reply, 2),
2303 CreateMockRead(*rep, 3), 2411 CreateMockRead(*stream2_syn, 3),
2304 MockRead(true, 0, 0, 5) // EOF 2412 CreateMockRead(*stream1_body, 4),
2413 MockRead(true, ERR_IO_PENDING, 5) // Force a pause
2305 }; 2414 };
2306 2415
2307 scoped_refptr<OrderedSocketData> data( 2416 scoped_refptr<OrderedSocketData> data(
2308 new OrderedSocketData(reads, arraysize(reads), 2417 new OrderedSocketData(reads, arraysize(reads),
2309 writes, arraysize(writes))); 2418 writes, arraysize(writes)));
2310 NormalSpdyTransactionHelper helper(CreateGetRequest(), 2419 NormalSpdyTransactionHelper helper(CreateGetRequest(),
2311 BoundNetLog(), GetParam()); 2420 BoundNetLog(), GetParam());
2312 2421
2313 helper.RunPreTestSetup(); 2422 helper.RunPreTestSetup();
2314 helper.AddData(data.get()); 2423 helper.AddData(data.get());
2315 2424
2316 HttpNetworkTransaction* trans = helper.trans(); 2425 HttpNetworkTransaction* trans = helper.trans();
2317 2426
2318 // Start the transaction with basic parameters. 2427 // Start the transaction with basic parameters.
2319 TestCompletionCallback callback; 2428 TestCompletionCallback callback;
2320 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); 2429 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
2321 EXPECT_EQ(ERR_IO_PENDING, rv); 2430 EXPECT_EQ(ERR_IO_PENDING, rv);
2322 rv = callback.WaitForResult(); 2431 rv = callback.WaitForResult();
2323 data->CompleteRead();
2324 EXPECT_EQ(OK, rv); 2432 EXPECT_EQ(OK, rv);
2325 2433
2326 // Verify that we consumed all test data. 2434 // Verify that we consumed all test data.
2327 EXPECT_TRUE(data->at_read_eof()) << "Read count: " 2435 EXPECT_TRUE(data->at_read_eof()) << "Read count: "
2328 << data->read_count() 2436 << data->read_count()
2329 << " Read index: " 2437 << " Read index: "
2330 << data->read_index(); 2438 << data->read_index();
2331 EXPECT_TRUE(data->at_write_eof()) << "Write count: " 2439 EXPECT_TRUE(data->at_write_eof()) << "Write count: "
2332 << data->write_count() 2440 << data->write_count()
2333 << " Write index: " 2441 << " Write index: "
2334 << data->write_index(); 2442 << data->write_index();
2335 2443
2336 // Verify the SYN_REPLY. 2444 // Verify the SYN_REPLY.
2337 HttpResponseInfo response = *trans->GetResponseInfo(); 2445 HttpResponseInfo response = *trans->GetResponseInfo();
2338 EXPECT_TRUE(response.headers != NULL); 2446 EXPECT_TRUE(response.headers != NULL);
2339 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2447 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2340 } 2448 }
2341 2449
2342 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2450 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
2343 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 2451 scoped_ptr<spdy::SpdyFrame>
2344 scoped_ptr<spdy::SpdyFrame> res( 2452 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2345 ConstructSpdyRstStream(2, spdy::INVALID_ASSOCIATED_STREAM)); 2453 scoped_ptr<spdy::SpdyFrame>
2454 stream1_body(ConstructSpdyBodyFrame(1, true));
2455 scoped_ptr<spdy::SpdyFrame>
2456 stream2_rst(ConstructSpdyRstStream(2, spdy::INVALID_ASSOCIATED_STREAM));
2346 MockWrite writes[] = { 2457 MockWrite writes[] = {
2347 CreateMockWrite(*req, 1), 2458 CreateMockWrite(*stream1_syn, 1),
2348 CreateMockWrite(*res, 4), 2459 CreateMockWrite(*stream2_rst, 4),
2349 }; 2460 };
2350 2461
2351 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 2462 scoped_ptr<spdy::SpdyFrame>
2352 scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 9, "/foo.dat")); 2463 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2464 scoped_ptr<spdy::SpdyFrame>
2465 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 9, "/foo.dat"));
2353 MockRead reads[] = { 2466 MockRead reads[] = {
2354 CreateMockRead(*resp, 2), 2467 CreateMockRead(*stream1_reply, 2),
2355 CreateMockRead(*rep, 3), 2468 CreateMockRead(*stream2_syn, 3),
2356 MockRead(true, 0, 0, 5) // EOF 2469 CreateMockRead(*stream1_body, 4),
2470 MockRead(true, ERR_IO_PENDING, 5), // Force a pause
2357 }; 2471 };
2358 2472
2359 scoped_refptr<OrderedSocketData> data( 2473 scoped_refptr<OrderedSocketData> data(
2360 new OrderedSocketData(reads, arraysize(reads), 2474 new OrderedSocketData(reads, arraysize(reads),
2361 writes, arraysize(writes))); 2475 writes, arraysize(writes)));
2362 NormalSpdyTransactionHelper helper(CreateGetRequest(), 2476 NormalSpdyTransactionHelper helper(CreateGetRequest(),
2363 BoundNetLog(), GetParam()); 2477 BoundNetLog(), GetParam());
2364 2478
2365 helper.RunPreTestSetup(); 2479 helper.RunPreTestSetup();
2366 helper.AddData(data.get()); 2480 helper.AddData(data.get());
2367 2481
2368 HttpNetworkTransaction* trans = helper.trans(); 2482 HttpNetworkTransaction* trans = helper.trans();
2369 2483
2370 // Start the transaction with basic parameters. 2484 // Start the transaction with basic parameters.
2371 TestCompletionCallback callback; 2485 TestCompletionCallback callback;
2372 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); 2486 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
2373 EXPECT_EQ(ERR_IO_PENDING, rv); 2487 EXPECT_EQ(ERR_IO_PENDING, rv);
2374 rv = callback.WaitForResult(); 2488 rv = callback.WaitForResult();
2375 data->CompleteRead();
2376 EXPECT_EQ(OK, rv); 2489 EXPECT_EQ(OK, rv);
2377 2490
2378 // Verify that we consumed all test data. 2491 // Verify that we consumed all test data.
2379 EXPECT_TRUE(data->at_read_eof()) << "Read count: " 2492 EXPECT_TRUE(data->at_read_eof()) << "Read count: "
2380 << data->read_count() 2493 << data->read_count()
2381 << " Read index: " 2494 << " Read index: "
2382 << data->read_index(); 2495 << data->read_index();
2383 EXPECT_TRUE(data->at_write_eof()) << "Write count: " 2496 EXPECT_TRUE(data->at_write_eof()) << "Write count: "
2384 << data->write_count() 2497 << data->write_count()
2385 << " Write index: " 2498 << " Write index: "
2386 << data->write_index(); 2499 << data->write_index();
2387 2500
2388 // Verify the SYN_REPLY. 2501 // Verify the SYN_REPLY.
2389 HttpResponseInfo response = *trans->GetResponseInfo(); 2502 HttpResponseInfo response = *trans->GetResponseInfo();
2390 EXPECT_TRUE(response.headers != NULL); 2503 EXPECT_TRUE(response.headers != NULL);
2391 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); 2504 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
2392 } 2505 }
2393 2506
2394 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) { 2507 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) {
2395 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); 2508 scoped_ptr<spdy::SpdyFrame>
2396 scoped_ptr<spdy::SpdyFrame> res( 2509 stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
2397 ConstructSpdyRstStream(2, spdy::PROTOCOL_ERROR)); 2510 scoped_ptr<spdy::SpdyFrame>
2511 stream1_body(ConstructSpdyBodyFrame(1, true));
2512 scoped_ptr<spdy::SpdyFrame>
2513 stream2_rst(ConstructSpdyRstStream(2, spdy::PROTOCOL_ERROR));
2398 MockWrite writes[] = { 2514 MockWrite writes[] = {
2399 CreateMockWrite(*req, 1), 2515 CreateMockWrite(*stream1_syn, 1),
2400 CreateMockWrite(*res, 4), 2516 CreateMockWrite(*stream2_rst, 4),
2401 }; 2517 };
2402 2518
2403 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); 2519 scoped_ptr<spdy::SpdyFrame>
2404 scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1)); 2520 stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
2521 scoped_ptr<spdy::SpdyFrame>
2522 stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1));
2405 MockRead reads[] = { 2523 MockRead reads[] = {
2406 CreateMockRead(*resp, 2), 2524 CreateMockRead(*stream1_reply, 2),
2407 CreateMockRead(*rep, 3), 2525 CreateMockRead(*stream2_syn, 3),
2408 MockRead(true, 0, 0, 5) // EOF 2526 CreateMockRead(*stream1_body, 4),
2527 MockRead(true, ERR_IO_PENDING, 5) // Force a pause
2409 }; 2528 };
2410 2529
2411 scoped_refptr<OrderedSocketData> data( 2530 scoped_refptr<OrderedSocketData> data(
2412 new OrderedSocketData(reads, arraysize(reads), 2531 new OrderedSocketData(reads, arraysize(reads),
2413 writes, arraysize(writes))); 2532 writes, arraysize(writes)));
2414 NormalSpdyTransactionHelper helper(CreateGetRequest(), 2533 NormalSpdyTransactionHelper helper(CreateGetRequest(),
2415 BoundNetLog(), GetParam()); 2534 BoundNetLog(), GetParam());
2416 2535
2417 helper.RunPreTestSetup(); 2536 helper.RunPreTestSetup();
2418 helper.AddData(data.get()); 2537 helper.AddData(data.get());
2419 2538
2420 HttpNetworkTransaction* trans = helper.trans(); 2539 HttpNetworkTransaction* trans = helper.trans();
2421 2540
2422 // Start the transaction with basic parameters. 2541 // Start the transaction with basic parameters.
2423 TestCompletionCallback callback; 2542 TestCompletionCallback callback;
2424 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog()); 2543 int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
2425 EXPECT_EQ(ERR_IO_PENDING, rv); 2544 EXPECT_EQ(ERR_IO_PENDING, rv);
2426 rv = callback.WaitForResult(); 2545 rv = callback.WaitForResult();
2427 data->CompleteRead();
2428 EXPECT_EQ(OK, rv); 2546 EXPECT_EQ(OK, rv);
2429 // Verify that we consumed all test data. 2547 // Verify that we consumed all test data.
2430 EXPECT_TRUE(data->at_read_eof()) << "Read count: " 2548 EXPECT_TRUE(data->at_read_eof()) << "Read count: "
2431 << data->read_count() 2549 << data->read_count()
2432 << " Read index: " 2550 << " Read index: "
2433 << data->read_index(); 2551 << data->read_index();
2434 EXPECT_TRUE(data->at_write_eof()) << "Write count: " 2552 EXPECT_TRUE(data->at_write_eof()) << "Write count: "
2435 << data->write_count() 2553 << data->write_count()
2436 << " Write index: " 2554 << " Write index: "
2437 << data->write_index(); 2555 << data->write_index();
(...skipping 1298 matching lines...) Expand 10 before | Expand all | Expand 10 after
3736 // Verify that we consumed all test data. 3854 // Verify that we consumed all test data.
3737 helper.VerifyDataConsumed(); 3855 helper.VerifyDataConsumed();
3738 } 3856 }
3739 3857
3740 // Test to make sure we can correctly connect through a proxy. 3858 // Test to make sure we can correctly connect through a proxy.
3741 TEST_P(SpdyNetworkTransactionTest, ProxyConnect) { 3859 TEST_P(SpdyNetworkTransactionTest, ProxyConnect) {
3742 NormalSpdyTransactionHelper helper(CreateGetRequest(), 3860 NormalSpdyTransactionHelper helper(CreateGetRequest(),
3743 BoundNetLog(), GetParam()); 3861 BoundNetLog(), GetParam());
3744 helper.session_deps().reset(new SpdySessionDependencies( 3862 helper.session_deps().reset(new SpdySessionDependencies(
3745 net::SpdyCreateFixedProxyService("myproxy:70"))); 3863 net::SpdyCreateFixedProxyService("myproxy:70")));
3746 helper.session() = SpdySessionDependencies::SpdyCreateSession( 3864 helper.SetSession(SpdySessionDependencies::SpdyCreateSession(
3747 helper.session_deps().get()); 3865 helper.session_deps().get()));
3748 helper.RunPreTestSetup(); 3866 helper.RunPreTestSetup();
3749 HttpNetworkTransaction* trans = helper.trans(); 3867 HttpNetworkTransaction* trans = helper.trans();
3750 3868
3751 const char kConnect443[] = {"CONNECT www.google.com:443 HTTP/1.1\r\n" 3869 const char kConnect443[] = {"CONNECT www.google.com:443 HTTP/1.1\r\n"
3752 "Host: www.google.com\r\n" 3870 "Host: www.google.com\r\n"
3753 "Proxy-Connection: keep-alive\r\n\r\n"}; 3871 "Proxy-Connection: keep-alive\r\n\r\n"};
3754 const char kConnect80[] = {"CONNECT www.google.com:80 HTTP/1.1\r\n" 3872 const char kConnect80[] = {"CONNECT www.google.com:80 HTTP/1.1\r\n"
3755 "Host: www.google.com\r\n" 3873 "Host: www.google.com\r\n"
3756 "Proxy-Connection: keep-alive\r\n\r\n"}; 3874 "Proxy-Connection: keep-alive\r\n\r\n"};
3757 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 3875 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
3963 scoped_ptr<SpdySessionDependencies> ssd_proxy( 4081 scoped_ptr<SpdySessionDependencies> ssd_proxy(
3964 new SpdySessionDependencies(net::SpdyCreateFixedProxyService( 4082 new SpdySessionDependencies(net::SpdyCreateFixedProxyService(
3965 "myproxy:70"))); 4083 "myproxy:70")));
3966 // Ensure that this transaction uses the same SpdySessionPool. 4084 // Ensure that this transaction uses the same SpdySessionPool.
3967 ssd_proxy->spdy_session_pool = spdy_session_pool; 4085 ssd_proxy->spdy_session_pool = spdy_session_pool;
3968 scoped_refptr<HttpNetworkSession> session_proxy = 4086 scoped_refptr<HttpNetworkSession> session_proxy =
3969 SpdySessionDependencies::SpdyCreateSession(ssd_proxy.get()); 4087 SpdySessionDependencies::SpdyCreateSession(ssd_proxy.get());
3970 NormalSpdyTransactionHelper helper_proxy(request_proxy, 4088 NormalSpdyTransactionHelper helper_proxy(request_proxy,
3971 BoundNetLog(), GetParam()); 4089 BoundNetLog(), GetParam());
3972 helper_proxy.session_deps().swap(ssd_proxy); 4090 helper_proxy.session_deps().swap(ssd_proxy);
3973 helper_proxy.session() = session_proxy; 4091 helper_proxy.SetSession(session_proxy);
3974 helper_proxy.RunPreTestSetup(); 4092 helper_proxy.RunPreTestSetup();
3975 helper_proxy.AddData(data_proxy.get()); 4093 helper_proxy.AddData(data_proxy.get());
3976 4094
3977 HttpNetworkTransaction* trans_proxy = helper_proxy.trans(); 4095 HttpNetworkTransaction* trans_proxy = helper_proxy.trans();
3978 TestCompletionCallback callback_proxy; 4096 TestCompletionCallback callback_proxy;
3979 int rv = trans_proxy->Start(&request_proxy, &callback_proxy, BoundNetLog()); 4097 int rv = trans_proxy->Start(&request_proxy, &callback_proxy, BoundNetLog());
3980 EXPECT_EQ(ERR_IO_PENDING, rv); 4098 EXPECT_EQ(ERR_IO_PENDING, rv);
3981 rv = callback_proxy.WaitForResult(); 4099 rv = callback_proxy.WaitForResult();
3982 EXPECT_EQ(0, rv); 4100 EXPECT_EQ(0, rv);
3983 4101
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
4070 rv = ReadTransaction(trans.get(), &response_data); 4188 rv = ReadTransaction(trans.get(), &response_data);
4071 EXPECT_EQ(OK, rv); 4189 EXPECT_EQ(OK, rv);
4072 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 4190 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
4073 EXPECT_EQ("hello!", response_data); 4191 EXPECT_EQ("hello!", response_data);
4074 } 4192 }
4075 4193
4076 helper.VerifyDataConsumed(); 4194 helper.VerifyDataConsumed();
4077 } 4195 }
4078 } 4196 }
4079 } // namespace net 4197 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_http_stream.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698