blob: 2fcf3f431f8fbd33f8e3fdff15db077b8a159526 [file] [log] [blame]
[email protected]d973e99a2012-02-17 21:02:361// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]fe2f62a2010-10-01 03:34:072// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/spdy/spdy_proxy_client_socket.h"
6
[email protected]49639fa2011-12-20 23:22:417#include "base/bind.h"
8#include "base/bind_helpers.h"
Avi Drissman13fc8932015-12-20 04:40:469#include "base/macros.h"
mmenke666a6fea2015-12-19 04:16:3310#include "base/run_loop.h"
[email protected]750b2f3c2013-06-07 18:41:0511#include "base/strings/utf_string_conversions.h"
[email protected]fe2f62a2010-10-01 03:34:0712#include "net/base/address_list.h"
[email protected]fe2f62a2010-10-01 03:34:0713#include "net/base/test_completion_callback.h"
14#include "net/base/winsock_init.h"
[email protected]f2cb3cf2013-03-21 01:40:5315#include "net/dns/mock_host_resolver.h"
[email protected]fe2f62a2010-10-01 03:34:0716#include "net/http/http_response_headers.h"
[email protected]f2cb3cf2013-03-21 01:40:5317#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0718#include "net/log/net_log.h"
vishal.b62985ca92015-04-17 08:45:5119#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4620#include "net/log/test_net_log_entry.h"
21#include "net/log/test_net_log_util.h"
[email protected]fe2f62a2010-10-01 03:34:0722#include "net/socket/client_socket_factory.h"
[email protected]bb88e1d32013-05-03 23:11:0723#include "net/socket/next_proto.h"
[email protected]fe2f62a2010-10-01 03:34:0724#include "net/socket/socket_test_util.h"
[email protected]f2cb3cf2013-03-21 01:40:5325#include "net/socket/tcp_client_socket.h"
[email protected]f54c85792012-03-08 19:06:4126#include "net/spdy/buffered_spdy_framer.h"
[email protected]9e1bdd32011-02-03 21:48:3427#include "net/spdy/spdy_http_utils.h"
[email protected]fe2f62a2010-10-01 03:34:0728#include "net/spdy/spdy_protocol.h"
29#include "net/spdy/spdy_session_pool.h"
[email protected]e3861ca2013-03-02 01:00:4530#include "net/spdy/spdy_test_util_common.h"
[email protected]fe2f62a2010-10-01 03:34:0731#include "testing/gtest/include/gtest/gtest.h"
[email protected]f2cb3cf2013-03-21 01:40:5332#include "testing/platform_test.h"
[email protected]fe2f62a2010-10-01 03:34:0733
34//-----------------------------------------------------------------------------
35
36namespace {
37
rdsmithebb50aa2015-11-12 03:44:3838enum TestCase {
39 // Test using the SPDY/3.1 protocol.
40 kTestCaseSPDY31,
41
42 // Test using the HTTP/2 protocol, without specifying a stream
43 // dependency based on the RequestPriority.
44 kTestCaseHTTP2NoPriorityDependencies,
45
46 // Test using the HTTP/2 protocol, specifying a stream
47 // dependency based on the RequestPriority.
48 kTestCaseHTTP2PriorityDependencies
49};
50
[email protected]ff98d7f02012-03-22 21:44:1951static const char kRequestUrl[] = "https://www.google.com/";
[email protected]fe2f62a2010-10-01 03:34:0752static const char kOriginHost[] = "www.google.com";
53static const int kOriginPort = 443;
54static const char kOriginHostPort[] = "www.google.com:443";
[email protected]e9fa5482011-07-08 18:29:1155static const char kProxyUrl[] = "https://myproxy:6121/";
[email protected]fe2f62a2010-10-01 03:34:0756static const char kProxyHost[] = "myproxy";
57static const int kProxyPort = 6121;
58static const char kUserAgent[] = "Mozilla/1.0";
59
60static const int kStreamId = 1;
61
62static const char kMsg1[] = "\0hello!\xff";
63static const int kLen1 = 8;
[email protected]b99ebde2014-07-08 23:41:0464static const char kMsg2[] = "\0a2345678\0";
[email protected]fe2f62a2010-10-01 03:34:0765static const int kLen2 = 10;
66static const char kMsg3[] = "bye!";
67static const int kLen3 = 4;
68static const char kMsg33[] = "bye!bye!";
69static const int kLen33 = kLen3 + kLen3;
[email protected]87d3c4a2010-10-07 03:00:4270static const char kMsg333[] = "bye!bye!bye!";
71static const int kLen333 = kLen3 + kLen3 + kLen3;
[email protected]fe2f62a2010-10-01 03:34:0772
[email protected]4eddbc732012-08-09 05:40:1773static const char kRedirectUrl[] = "https://example.com/";
74
[email protected]fe2f62a2010-10-01 03:34:0775} // anonymous namespace
76
77namespace net {
78
rdsmithebb50aa2015-11-12 03:44:3879class SpdyProxyClientSocketTest : public PlatformTest,
80 public testing::WithParamInterface<TestCase> {
[email protected]fe2f62a2010-10-01 03:34:0781 public:
[email protected]1723f692013-05-16 03:39:3782 SpdyProxyClientSocketTest();
rdsmithebb50aa2015-11-12 03:44:3883 ~SpdyProxyClientSocketTest();
[email protected]fe2f62a2010-10-01 03:34:0784
dcheng67be2b1f2014-10-27 21:47:2985 void TearDown() override;
[email protected]fe2f62a2010-10-01 03:34:0786
87 protected:
rdsmithebb50aa2015-11-12 03:44:3888 NextProto GetProtocol() const;
89 bool GetDependenciesFromPriority() const;
90
[email protected]fe2f62a2010-10-01 03:34:0791 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes,
92 size_t writes_count);
[email protected]745aa9c2014-06-27 02:21:2993 void PopulateConnectRequestIR(SpdyHeaderBlock* syn_ir);
94 void PopulateConnectReplyIR(SpdyHeaderBlock* block, const char* status);
[email protected]ff98d7f02012-03-22 21:44:1995 SpdyFrame* ConstructConnectRequestFrame();
96 SpdyFrame* ConstructConnectAuthRequestFrame();
97 SpdyFrame* ConstructConnectReplyFrame();
98 SpdyFrame* ConstructConnectAuthReplyFrame();
[email protected]4eddbc732012-08-09 05:40:1799 SpdyFrame* ConstructConnectRedirectReplyFrame();
[email protected]ff98d7f02012-03-22 21:44:19100 SpdyFrame* ConstructConnectErrorReplyFrame();
101 SpdyFrame* ConstructBodyFrame(const char* data, int length);
[email protected]fe2f62a2010-10-01 03:34:07102 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size);
103 void AssertConnectSucceeds();
104 void AssertConnectFails(int result);
105 void AssertConnectionEstablished();
106 void AssertSyncReadEquals(const char* data, int len);
107 void AssertAsyncReadEquals(const char* data, int len);
108 void AssertReadStarts(const char* data, int len);
109 void AssertReadReturns(const char* data, int len);
110 void AssertAsyncWriteSucceeds(const char* data, int len);
[email protected]5e6609582010-10-05 18:14:20111 void AssertWriteReturns(const char* data, int len, int rv);
112 void AssertWriteLength(int len);
[email protected]fe2f62a2010-10-01 03:34:07113
114 void AddAuthToCache() {
[email protected]ad65a3e2013-12-25 18:18:01115 const base::string16 kFoo(base::ASCIIToUTF16("foo"));
116 const base::string16 kBar(base::ASCIIToUTF16("bar"));
[email protected]102e27c2011-02-23 01:01:31117 session_->http_auth_cache()->Add(GURL(kProxyUrl),
118 "MyRealm1",
119 HttpAuth::AUTH_SCHEME_BASIC,
120 "Basic realm=MyRealm1",
[email protected]f3cf9802011-10-28 18:44:58121 AuthCredentials(kFoo, kBar),
[email protected]102e27c2011-02-23 01:01:31122 "/");
[email protected]fe2f62a2010-10-01 03:34:07123 }
124
mmenke666a6fea2015-12-19 04:16:33125 void ResumeAndRun() {
126 // Run until the pause, if the provider isn't paused yet.
127 data_->RunUntilPaused();
128 data_->Resume();
129 base::RunLoop().RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:07130 }
131
ttuttle859dc7a2015-04-23 19:42:29132 void CloseSpdySession(Error error, const std::string& description) {
[email protected]795cbf82013-07-22 09:37:27133 spdy_session_->CloseSessionOnError(error, description);
134 }
135
[email protected]c10b20852013-05-15 21:29:20136 SpdyTestUtil spdy_util_;
[email protected]fe2f62a2010-10-01 03:34:07137 scoped_ptr<SpdyProxyClientSocket> sock_;
[email protected]83039bb2011-12-09 18:43:55138 TestCompletionCallback read_callback_;
[email protected]83039bb2011-12-09 18:43:55139 TestCompletionCallback write_callback_;
mmenke666a6fea2015-12-19 04:16:33140 scoped_ptr<SequencedSocketData> data_;
vishal.b62985ca92015-04-17 08:45:51141 BoundTestNetLog net_log_;
[email protected]fe2f62a2010-10-01 03:34:07142
143 private:
mmenkee65e7af2015-10-13 17:16:42144 scoped_ptr<HttpNetworkSession> session_;
[email protected]fe2f62a2010-10-01 03:34:07145 scoped_refptr<IOBuffer> read_buf_;
146 SpdySessionDependencies session_deps_;
147 MockConnect connect_data_;
[email protected]795cbf82013-07-22 09:37:27148 base::WeakPtr<SpdySession> spdy_session_;
[email protected]ff98d7f02012-03-22 21:44:19149 BufferedSpdyFramer framer_;
[email protected]fe2f62a2010-10-01 03:34:07150
151 std::string user_agent_;
152 GURL url_;
153 HostPortPair proxy_host_port_;
154 HostPortPair endpoint_host_port_pair_;
155 ProxyServer proxy_;
[email protected]e6d017652013-05-17 18:01:40156 SpdySessionKey endpoint_spdy_session_key_;
[email protected]fe2f62a2010-10-01 03:34:07157
[email protected]1723f692013-05-16 03:39:37158 DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocketTest);
[email protected]fe2f62a2010-10-01 03:34:07159};
160
rdsmithebb50aa2015-11-12 03:44:38161INSTANTIATE_TEST_CASE_P(ProtoPlusDepend,
bnc57685ae62015-03-10 21:27:20162 SpdyProxyClientSocketTest,
rdsmithebb50aa2015-11-12 03:44:38163 testing::Values(kTestCaseSPDY31,
164 kTestCaseHTTP2NoPriorityDependencies,
165 kTestCaseHTTP2PriorityDependencies));
[email protected]1723f692013-05-16 03:39:37166
167SpdyProxyClientSocketTest::SpdyProxyClientSocketTest()
rdsmithebb50aa2015-11-12 03:44:38168 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()),
[email protected]fe2f62a2010-10-01 03:34:07169 read_buf_(NULL),
rdsmithebb50aa2015-11-12 03:44:38170 session_deps_(GetProtocol()),
[email protected]d973e99a2012-02-17 21:02:36171 connect_data_(SYNCHRONOUS, OK),
[email protected]1723f692013-05-16 03:39:37172 framer_(spdy_util_.spdy_version(), false),
[email protected]fe2f62a2010-10-01 03:34:07173 user_agent_(kUserAgent),
[email protected]ff98d7f02012-03-22 21:44:19174 url_(kRequestUrl),
[email protected]fe2f62a2010-10-01 03:34:07175 proxy_host_port_(kProxyHost, kProxyPort),
176 endpoint_host_port_pair_(kOriginHost, kOriginPort),
177 proxy_(ProxyServer::SCHEME_HTTPS, proxy_host_port_),
[email protected]dd946bb2013-06-12 22:53:01178 endpoint_spdy_session_key_(endpoint_host_port_pair_,
179 proxy_,
[email protected]314b03992014-04-01 01:28:53180 PRIVACY_MODE_DISABLED) {
[email protected]f6c63db52013-02-02 00:35:22181 session_deps_.net_log = net_log_.bound().net_log();
rdsmithebb50aa2015-11-12 03:44:38182 SpdySession::SetPriorityDependencyDefaultForTesting(
183 GetDependenciesFromPriority());
184}
185
186SpdyProxyClientSocketTest::~SpdyProxyClientSocketTest() {
mmenke666a6fea2015-12-19 04:16:33187 EXPECT_TRUE(data_->AllWriteDataConsumed());
188 EXPECT_TRUE(data_->AllReadDataConsumed());
rdsmithebb50aa2015-11-12 03:44:38189 SpdySession::SetPriorityDependencyDefaultForTesting(false);
[email protected]fe2f62a2010-10-01 03:34:07190}
191
[email protected]1723f692013-05-16 03:39:37192void SpdyProxyClientSocketTest::TearDown() {
[email protected]90499482013-06-01 00:39:50193 if (session_.get() != NULL)
[email protected]fe2f62a2010-10-01 03:34:07194 session_->spdy_session_pool()->CloseAllSessions();
195
[email protected]fe2f62a2010-10-01 03:34:07196 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34197 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:07198 PlatformTest::TearDown();
199}
200
rdsmithebb50aa2015-11-12 03:44:38201NextProto SpdyProxyClientSocketTest::GetProtocol() const {
202 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2;
203}
204
205bool SpdyProxyClientSocketTest::GetDependenciesFromPriority() const {
206 return GetParam() == kTestCaseHTTP2PriorityDependencies;
207}
208
[email protected]1723f692013-05-16 03:39:37209void SpdyProxyClientSocketTest::Initialize(MockRead* reads,
mmenkee24011922015-12-17 22:12:59210 size_t reads_count,
211 MockWrite* writes,
212 size_t writes_count) {
mmenke666a6fea2015-12-19 04:16:33213 data_.reset(
214 new SequencedSocketData(reads, reads_count, writes, writes_count));
[email protected]fe2f62a2010-10-01 03:34:07215 data_->set_connect_data(connect_data_);
[email protected]fe2f62a2010-10-01 03:34:07216
mmenke666a6fea2015-12-19 04:16:33217 session_deps_.socket_factory->AddSocketDataProvider(data_.get());
[email protected]fe2f62a2010-10-01 03:34:07218 session_deps_.host_resolver->set_synchronous_mode(true);
219
mmenke666a6fea2015-12-19 04:16:33220 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
[email protected]fe2f62a2010-10-01 03:34:07221
[email protected]41d64e82013-07-03 22:44:26222 // Creates the SPDY session and stream.
mmenkee65e7af2015-10-13 17:16:42223 spdy_session_ = CreateInsecureSpdySession(
224 session_.get(), endpoint_spdy_session_key_, BoundNetLog());
[email protected]d26ff352013-05-13 08:48:28225 base::WeakPtr<SpdyStream> spdy_stream(
226 CreateStreamSynchronously(
[email protected]fb73cd672013-05-27 12:53:08227 SPDY_BIDIRECTIONAL_STREAM, spdy_session_, url_, LOWEST,
228 net_log_.bound()));
[email protected]d26ff352013-05-13 08:48:28229 ASSERT_TRUE(spdy_stream.get() != NULL);
[email protected]fe2f62a2010-10-01 03:34:07230
[email protected]f6c63db52013-02-02 00:35:22231 // Create the SpdyProxyClientSocket.
rchecd3c552015-04-07 20:53:54232 sock_.reset(new SpdyProxyClientSocket(
233 spdy_stream, user_agent_, endpoint_host_port_pair_, proxy_host_port_,
mmenke2a1781d2015-10-07 19:25:33234 net_log_.bound(),
235 new HttpAuthController(
236 HttpAuth::AUTH_PROXY, GURL("https://" + proxy_host_port_.ToString()),
237 session_->http_auth_cache(), session_->http_auth_handler_factory())));
[email protected]fe2f62a2010-10-01 03:34:07238}
239
[email protected]1723f692013-05-16 03:39:37240scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer(
[email protected]fe2f62a2010-10-01 03:34:07241 const char* data, int size) {
242 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size));
243 memcpy(buf->data(), data, size);
244 return buf;
245}
246
[email protected]1723f692013-05-16 03:39:37247void SpdyProxyClientSocketTest::AssertConnectSucceeds() {
[email protected]83039bb2011-12-09 18:43:55248 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07249 ASSERT_EQ(OK, read_callback_.WaitForResult());
250}
251
[email protected]1723f692013-05-16 03:39:37252void SpdyProxyClientSocketTest::AssertConnectFails(int result) {
[email protected]83039bb2011-12-09 18:43:55253 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07254 ASSERT_EQ(result, read_callback_.WaitForResult());
255}
256
[email protected]1723f692013-05-16 03:39:37257void SpdyProxyClientSocketTest::AssertConnectionEstablished() {
[email protected]fe2f62a2010-10-01 03:34:07258 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
259 ASSERT_TRUE(response != NULL);
260 ASSERT_EQ(200, response->headers->response_code());
[email protected]fe2f62a2010-10-01 03:34:07261}
262
[email protected]1723f692013-05-16 03:39:37263void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data,
[email protected]fe2f62a2010-10-01 03:34:07264 int len) {
265 scoped_refptr<IOBuffer> buf(new IOBuffer(len));
[email protected]90499482013-06-01 00:39:50266 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback()));
[email protected]fe2f62a2010-10-01 03:34:07267 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len));
268 ASSERT_TRUE(sock_->IsConnected());
269}
270
[email protected]1723f692013-05-16 03:39:37271void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data,
mmenkee24011922015-12-17 22:12:59272 int len) {
[email protected]fe2f62a2010-10-01 03:34:07273 // Issue the read, which will be completed asynchronously
274 scoped_refptr<IOBuffer> buf(new IOBuffer(len));
[email protected]90499482013-06-01 00:39:50275 ASSERT_EQ(ERR_IO_PENDING,
276 sock_->Read(buf.get(), len, read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07277 EXPECT_TRUE(sock_->IsConnected());
[email protected]fe2f62a2010-10-01 03:34:07278
mmenke666a6fea2015-12-19 04:16:33279 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07280
[email protected]fe2f62a2010-10-01 03:34:07281 EXPECT_EQ(len, read_callback_.WaitForResult());
mmenke666a6fea2015-12-19 04:16:33282 EXPECT_TRUE(sock_->IsConnected());
[email protected]fe2f62a2010-10-01 03:34:07283 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len));
284}
285
mmenkee24011922015-12-17 22:12:59286void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) {
mmenke666a6fea2015-12-19 04:16:33287 // Issue the read, which will be completed asynchronously.
[email protected]fe2f62a2010-10-01 03:34:07288 read_buf_ = new IOBuffer(len);
[email protected]83039bb2011-12-09 18:43:55289 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:50290 sock_->Read(read_buf_.get(), len, read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07291 EXPECT_TRUE(sock_->IsConnected());
292}
293
mmenkee24011922015-12-17 22:12:59294void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) {
[email protected]fe2f62a2010-10-01 03:34:07295 EXPECT_TRUE(sock_->IsConnected());
296
297 // Now the read will return
298 EXPECT_EQ(len, read_callback_.WaitForResult());
299 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len));
300}
301
[email protected]1723f692013-05-16 03:39:37302void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data,
[email protected]448d4ca52012-03-04 04:12:23303 int len) {
[email protected]5e6609582010-10-05 18:14:20304 AssertWriteReturns(data, len, ERR_IO_PENDING);
[email protected]5e6609582010-10-05 18:14:20305 AssertWriteLength(len);
306}
307
[email protected]1723f692013-05-16 03:39:37308void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data,
mmenkee24011922015-12-17 22:12:59309 int len,
310 int rv) {
[email protected]fe2f62a2010-10-01 03:34:07311 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len));
[email protected]90499482013-06-01 00:39:50312 EXPECT_EQ(rv,
313 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
[email protected]5e6609582010-10-05 18:14:20314}
[email protected]fe2f62a2010-10-01 03:34:07315
[email protected]1723f692013-05-16 03:39:37316void SpdyProxyClientSocketTest::AssertWriteLength(int len) {
[email protected]5e6609582010-10-05 18:14:20317 EXPECT_EQ(len, write_callback_.WaitForResult());
[email protected]fe2f62a2010-10-01 03:34:07318}
319
[email protected]601e03f12014-04-06 16:26:39320void SpdyProxyClientSocketTest::PopulateConnectRequestIR(
[email protected]745aa9c2014-06-27 02:21:29321 SpdyHeaderBlock* block) {
bnc7ecc1122015-09-28 13:22:49322 spdy_util_.MaybeAddVersionHeader(block);
[email protected]745aa9c2014-06-27 02:21:29323 (*block)[spdy_util_.GetMethodKey()] = "CONNECT";
bnc6b996d532015-07-29 10:51:32324 if (spdy_util_.spdy_version() == HTTP2) {
325 (*block)[spdy_util_.GetHostKey()] = kOriginHostPort;
326 } else {
bnc6b996d532015-07-29 10:51:32327 (*block)[spdy_util_.GetHostKey()] = kOriginHost;
bnc7ecc1122015-09-28 13:22:49328 (*block)[spdy_util_.GetPathKey()] = kOriginHostPort;
bnc6b996d532015-07-29 10:51:32329 }
[email protected]745aa9c2014-06-27 02:21:29330 (*block)["user-agent"] = kUserAgent;
[email protected]601e03f12014-04-06 16:26:39331}
332
[email protected]745aa9c2014-06-27 02:21:29333void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdyHeaderBlock* block,
[email protected]601e03f12014-04-06 16:26:39334 const char* status) {
[email protected]745aa9c2014-06-27 02:21:29335 (*block)[spdy_util_.GetStatusKey()] = status;
336 spdy_util_.MaybeAddVersionHeader(block);
[email protected]601e03f12014-04-06 16:26:39337}
338
[email protected]fe2f62a2010-10-01 03:34:07339// Constructs a standard SPDY SYN_STREAM frame for a CONNECT request.
[email protected]ff98d7f02012-03-22 21:44:19340SpdyFrame*
[email protected]1723f692013-05-16 03:39:37341SpdyProxyClientSocketTest::ConstructConnectRequestFrame() {
[email protected]745aa9c2014-06-27 02:21:29342 SpdyHeaderBlock block;
343 PopulateConnectRequestIR(&block);
344 return spdy_util_.ConstructSpdySyn(kStreamId, block, LOWEST, false, false);
[email protected]fe2f62a2010-10-01 03:34:07345}
346
347// Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes
348// Proxy-Authorization headers.
[email protected]601e03f12014-04-06 16:26:39349SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() {
[email protected]745aa9c2014-06-27 02:21:29350 SpdyHeaderBlock block;
351 PopulateConnectRequestIR(&block);
352 block["proxy-authorization"] = "Basic Zm9vOmJhcg==";
353 return spdy_util_.ConstructSpdySyn(kStreamId, block, LOWEST, false, false);
[email protected]fe2f62a2010-10-01 03:34:07354}
355
356// Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT.
[email protected]1723f692013-05-16 03:39:37357SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29358 SpdyHeaderBlock block;
359 PopulateConnectReplyIR(&block, "200");
[email protected]601e03f12014-04-06 16:26:39360 SpdySynReplyIR reply_ir(kStreamId);
[email protected]745aa9c2014-06-27 02:21:29361 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]fe2f62a2010-10-01 03:34:07362}
363
[email protected]601e03f12014-04-06 16:26:39364// Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT,
365// including Proxy-Authenticate headers.
366SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectAuthReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29367 SpdyHeaderBlock block;
368 PopulateConnectReplyIR(&block, "407");
369 block["proxy-authenticate"] = "Basic realm=\"MyRealm1\"";
370 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]fe2f62a2010-10-01 03:34:07371}
372
[email protected]4eddbc732012-08-09 05:40:17373// Constructs a SPDY SYN_REPLY frame with an HTTP 302 redirect.
[email protected]601e03f12014-04-06 16:26:39374SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectRedirectReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29375 SpdyHeaderBlock block;
376 PopulateConnectReplyIR(&block, "302");
377 block["location"] = kRedirectUrl;
378 block["set-cookie"] = "foo=bar";
379 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]4eddbc732012-08-09 05:40:17380}
381
[email protected]fe2f62a2010-10-01 03:34:07382// Constructs a SPDY SYN_REPLY frame with an HTTP 500 error.
[email protected]601e03f12014-04-06 16:26:39383SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29384 SpdyHeaderBlock block;
385 PopulateConnectReplyIR(&block, "500");
386 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]fe2f62a2010-10-01 03:34:07387}
388
[email protected]1723f692013-05-16 03:39:37389SpdyFrame* SpdyProxyClientSocketTest::ConstructBodyFrame(
390 const char* data,
391 int length) {
[email protected]ff98d7f02012-03-22 21:44:19392 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE);
[email protected]fe2f62a2010-10-01 03:34:07393}
394
395// ----------- Connect
396
[email protected]1723f692013-05-16 03:39:37397TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) {
[email protected]ff98d7f02012-03-22 21:44:19398 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07399 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06400 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07401 };
402
[email protected]ff98d7f02012-03-22 21:44:19403 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07404 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33405 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07406 };
407
408 Initialize(reads, arraysize(reads), writes, arraysize(writes));
409
410 ASSERT_FALSE(sock_->IsConnected());
411
412 AssertConnectSucceeds();
413
414 AssertConnectionEstablished();
415}
416
[email protected]1723f692013-05-16 03:39:37417TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) {
[email protected]ff98d7f02012-03-22 21:44:19418 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07419 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06420 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07421 };
422
[email protected]ff98d7f02012-03-22 21:44:19423 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07424 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33425 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07426 };
427
428 Initialize(reads, arraysize(reads), writes, arraysize(writes));
429
[email protected]b40d5cb2012-02-27 05:30:18430 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
[email protected]fe3b7dc2012-02-03 19:52:09431
432 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
433 ASSERT_TRUE(response != NULL);
434 ASSERT_EQ(407, response->headers->response_code());
[email protected]fe2f62a2010-10-01 03:34:07435}
436
[email protected]1723f692013-05-16 03:39:37437TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) {
[email protected]ff98d7f02012-03-22 21:44:19438 scoped_ptr<SpdyFrame> conn(ConstructConnectAuthRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07439 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06440 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07441 };
442
[email protected]ff98d7f02012-03-22 21:44:19443 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07444 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33445 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07446 };
447
448 Initialize(reads, arraysize(reads), writes, arraysize(writes));
449 AddAuthToCache();
450
451 AssertConnectSucceeds();
452
453 AssertConnectionEstablished();
454}
455
[email protected]1723f692013-05-16 03:39:37456TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) {
[email protected]4eddbc732012-08-09 05:40:17457 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:24458 scoped_ptr<SpdyFrame> rst(
459 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]4eddbc732012-08-09 05:40:17460 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33461 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]4eddbc732012-08-09 05:40:17462 };
463
464 scoped_ptr<SpdyFrame> resp(ConstructConnectRedirectReplyFrame());
465 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33466 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]4eddbc732012-08-09 05:40:17467 };
468
469 Initialize(reads, arraysize(reads), writes, arraysize(writes));
470
471 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE);
472
473 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
474 ASSERT_TRUE(response != NULL);
475
[email protected]90499482013-06-01 00:39:50476 const HttpResponseHeaders* headers = response->headers.get();
[email protected]4eddbc732012-08-09 05:40:17477 ASSERT_EQ(302, headers->response_code());
478 ASSERT_FALSE(headers->HasHeader("set-cookie"));
479 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0"));
480
481 std::string location;
482 ASSERT_TRUE(headers->IsRedirect(&location));
483 ASSERT_EQ(location, kRedirectUrl);
[email protected]975da41a2014-06-05 03:36:24484
485 // Let the RST_STREAM write while |rst| is in-scope.
486 base::MessageLoop::current()->RunUntilIdle();
[email protected]4eddbc732012-08-09 05:40:17487}
488
[email protected]1723f692013-05-16 03:39:37489TEST_P(SpdyProxyClientSocketTest, ConnectFails) {
[email protected]ff98d7f02012-03-22 21:44:19490 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07491 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06492 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07493 };
494
[email protected]ff98d7f02012-03-22 21:44:19495 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07496 MockRead reads[] = {
[email protected]8ddf8322012-02-23 18:08:06497 MockRead(ASYNC, 0, 1), // EOF
[email protected]fe2f62a2010-10-01 03:34:07498 };
499
500 Initialize(reads, arraysize(reads), writes, arraysize(writes));
501
502 ASSERT_FALSE(sock_->IsConnected());
503
504 AssertConnectFails(ERR_CONNECTION_CLOSED);
505
506 ASSERT_FALSE(sock_->IsConnected());
507}
508
509// ----------- WasEverUsed
510
[email protected]1723f692013-05-16 03:39:37511TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) {
[email protected]ff98d7f02012-03-22 21:44:19512 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:24513 scoped_ptr<SpdyFrame> rst(
514 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]fe2f62a2010-10-01 03:34:07515 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33516 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]fe2f62a2010-10-01 03:34:07517 };
518
[email protected]ff98d7f02012-03-22 21:44:19519 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07520 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33521 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07522 };
523
524 Initialize(reads, arraysize(reads), writes, arraysize(writes));
525
526 EXPECT_FALSE(sock_->WasEverUsed());
527 AssertConnectSucceeds();
528 EXPECT_TRUE(sock_->WasEverUsed());
529 sock_->Disconnect();
530 EXPECT_TRUE(sock_->WasEverUsed());
[email protected]975da41a2014-06-05 03:36:24531
532 // Let the RST_STREAM write while |rst| is in-scope.
533 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:07534}
535
536// ----------- GetPeerAddress
537
[email protected]1723f692013-05-16 03:39:37538TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) {
[email protected]ff98d7f02012-03-22 21:44:19539 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07540 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06541 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07542 };
543
[email protected]ff98d7f02012-03-22 21:44:19544 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07545 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33546 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
547 MockRead(ASYNC, 0, 3), // EOF
[email protected]fe2f62a2010-10-01 03:34:07548 };
549
550 Initialize(reads, arraysize(reads), writes, arraysize(writes));
551
ttuttle859dc7a2015-04-23 19:42:29552 IPEndPoint addr;
[email protected]88e03fa2010-10-05 03:09:04553 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr));
554
[email protected]fe2f62a2010-10-01 03:34:07555 AssertConnectSucceeds();
556 EXPECT_TRUE(sock_->IsConnected());
557 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr));
[email protected]88e03fa2010-10-05 03:09:04558
mmenke666a6fea2015-12-19 04:16:33559 ResumeAndRun();
[email protected]194c7a92011-12-03 04:54:18560
561 EXPECT_FALSE(sock_->IsConnected());
562 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr));
563
[email protected]fe2f62a2010-10-01 03:34:07564 sock_->Disconnect();
[email protected]194c7a92011-12-03 04:54:18565
[email protected]88e03fa2010-10-05 03:09:04566 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr));
[email protected]fe2f62a2010-10-01 03:34:07567}
568
569// ----------- Write
570
[email protected]1723f692013-05-16 03:39:37571TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) {
[email protected]ff98d7f02012-03-22 21:44:19572 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
573 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
574 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07575 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33576 CreateMockWrite(*conn, 0, SYNCHRONOUS),
577 CreateMockWrite(*msg1, 3, SYNCHRONOUS),
578 CreateMockWrite(*msg2, 4, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07579 };
580
[email protected]ff98d7f02012-03-22 21:44:19581 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07582 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33583 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07584 };
585
586 Initialize(reads, arraysize(reads), writes, arraysize(writes));
587
588 AssertConnectSucceeds();
589
590 AssertAsyncWriteSucceeds(kMsg1, kLen1);
591 AssertAsyncWriteSucceeds(kMsg2, kLen2);
592}
593
[email protected]1723f692013-05-16 03:39:37594TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) {
[email protected]fe2f62a2010-10-01 03:34:07595 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x');
[email protected]ff98d7f02012-03-22 21:44:19596 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
597 scoped_ptr<SpdyFrame> chunk(ConstructBodyFrame(chunk_data.data(),
[email protected]fe2f62a2010-10-01 03:34:07598 chunk_data.length()));
mmenke666a6fea2015-12-19 04:16:33599 MockWrite writes[] = {CreateMockWrite(*conn, 0, SYNCHRONOUS),
600 CreateMockWrite(*chunk, 3, SYNCHRONOUS),
601 CreateMockWrite(*chunk, 4, SYNCHRONOUS),
602 CreateMockWrite(*chunk, 5, SYNCHRONOUS)};
[email protected]fe2f62a2010-10-01 03:34:07603
[email protected]ff98d7f02012-03-22 21:44:19604 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07605 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33606 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07607 };
608
609 Initialize(reads, arraysize(reads), writes, arraysize(writes));
610
611 AssertConnectSucceeds();
612
613 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x');
[email protected]5e6609582010-10-05 18:14:20614 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(),
615 big_data.length()));
616
[email protected]90499482013-06-01 00:39:50617 EXPECT_EQ(ERR_IO_PENDING,
618 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
[email protected]5e6609582010-10-05 18:14:20619 EXPECT_EQ(buf->size(), write_callback_.WaitForResult());
[email protected]fe2f62a2010-10-01 03:34:07620}
621
622// ----------- Read
623
[email protected]1723f692013-05-16 03:39:37624TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) {
[email protected]ff98d7f02012-03-22 21:44:19625 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07626 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06627 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07628 };
629
[email protected]ff98d7f02012-03-22 21:44:19630 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
631 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]fe2f62a2010-10-01 03:34:07632 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33633 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
634 CreateMockRead(*msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]fe2f62a2010-10-01 03:34:07635 };
636
637 Initialize(reads, arraysize(reads), writes, arraysize(writes));
638
639 AssertConnectSucceeds();
640
mmenke666a6fea2015-12-19 04:16:33641 // SpdySession consumes the next read and sends it to sock_ to be buffered.
642 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07643 AssertSyncReadEquals(kMsg1, kLen1);
644}
645
[email protected]1723f692013-05-16 03:39:37646TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) {
[email protected]ff98d7f02012-03-22 21:44:19647 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07648 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06649 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07650 };
651
[email protected]ff98d7f02012-03-22 21:44:19652 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
653 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
654 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07655 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33656 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
657 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4),
658 CreateMockRead(*msg2, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
[email protected]fe2f62a2010-10-01 03:34:07659 };
660
661 Initialize(reads, arraysize(reads), writes, arraysize(writes));
662
663 AssertConnectSucceeds();
664
mmenke666a6fea2015-12-19 04:16:33665 // SpdySession consumes the next read and sends it to sock_ to be buffered.
666 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07667 AssertSyncReadEquals(kMsg1, kLen1);
mmenke666a6fea2015-12-19 04:16:33668 // SpdySession consumes the next read and sends it to sock_ to be buffered.
669 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07670 AssertSyncReadEquals(kMsg2, kLen2);
671}
672
[email protected]1723f692013-05-16 03:39:37673TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) {
[email protected]ff98d7f02012-03-22 21:44:19674 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07675 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06676 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07677 };
678
[email protected]ff98d7f02012-03-22 21:44:19679 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
680 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
681 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07682 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33683 CreateMockRead(*resp, 1, ASYNC),
684 MockRead(ASYNC, ERR_IO_PENDING, 2),
685 CreateMockRead(*msg1, 3, ASYNC),
686 CreateMockRead(*msg2, 4, ASYNC),
687 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07688 };
689
690 Initialize(reads, arraysize(reads), writes, arraysize(writes));
691
692 AssertConnectSucceeds();
693
mmenke666a6fea2015-12-19 04:16:33694 // SpdySession consumes the next two reads and sends then to sock_ to be
695 // buffered.
696 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07697 AssertSyncReadEquals(kMsg1, kLen1);
698 AssertSyncReadEquals(kMsg2, kLen2);
699}
700
[email protected]1723f692013-05-16 03:39:37701TEST_P(SpdyProxyClientSocketTest,
[email protected]448d4ca52012-03-04 04:12:23702 LargeReadWillMergeDataFromDifferentFrames) {
[email protected]ff98d7f02012-03-22 21:44:19703 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07704 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06705 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07706 };
707
[email protected]ff98d7f02012-03-22 21:44:19708 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
709 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
710 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
[email protected]fe2f62a2010-10-01 03:34:07711 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33712 CreateMockRead(*resp, 1, ASYNC),
713 MockRead(ASYNC, ERR_IO_PENDING, 2),
714 CreateMockRead(*msg3, 3, ASYNC),
715 CreateMockRead(*msg3, 4, ASYNC),
716 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07717 };
718
719 Initialize(reads, arraysize(reads), writes, arraysize(writes));
720
721 AssertConnectSucceeds();
722
mmenke666a6fea2015-12-19 04:16:33723 // SpdySession consumes the next two reads and sends then to sock_ to be
724 // buffered.
725 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07726 // The payload from two data frames, each with kMsg3 will be combined
727 // together into a single read().
728 AssertSyncReadEquals(kMsg33, kLen33);
729}
730
[email protected]1723f692013-05-16 03:39:37731TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) {
[email protected]ff98d7f02012-03-22 21:44:19732 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07733 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06734 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07735 };
736
[email protected]ff98d7f02012-03-22 21:44:19737 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
738 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
739 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
740 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07741 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33742 CreateMockRead(*resp, 1, ASYNC),
743 MockRead(ASYNC, ERR_IO_PENDING, 2),
744 CreateMockRead(*msg1, 3, ASYNC),
745 CreateMockRead(*msg3, 4, ASYNC),
746 CreateMockRead(*msg3, 5, ASYNC),
747 CreateMockRead(*msg2, 6, ASYNC),
748 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7),
[email protected]fe2f62a2010-10-01 03:34:07749 };
750
751 Initialize(reads, arraysize(reads), writes, arraysize(writes));
752
753 AssertConnectSucceeds();
754
mmenke666a6fea2015-12-19 04:16:33755 // SpdySession consumes the next four reads and sends then to sock_ to be
756 // buffered.
757 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07758 AssertSyncReadEquals(kMsg1, kLen1);
759 // The payload from two data frames, each with kMsg3 will be combined
760 // together into a single read().
761 AssertSyncReadEquals(kMsg33, kLen33);
762 AssertSyncReadEquals(kMsg2, kLen2);
763}
764
[email protected]1723f692013-05-16 03:39:37765TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) {
[email protected]ff98d7f02012-03-22 21:44:19766 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07767 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06768 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07769 };
770
[email protected]ff98d7f02012-03-22 21:44:19771 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
772 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
773 scoped_ptr<SpdyFrame> msg33(ConstructBodyFrame(kMsg33, kLen33));
774 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07775 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33776 CreateMockRead(*resp, 1, ASYNC),
777 MockRead(ASYNC, ERR_IO_PENDING, 2),
778 CreateMockRead(*msg1, 3, ASYNC),
779 CreateMockRead(*msg33, 4, ASYNC),
780 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07781 };
782
783 Initialize(reads, arraysize(reads), writes, arraysize(writes));
784
785 AssertConnectSucceeds();
786
mmenke666a6fea2015-12-19 04:16:33787 // SpdySession consumes the next two reads and sends then to sock_ to be
788 // buffered.
789 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07790 AssertSyncReadEquals(kMsg1, kLen1);
791 // The payload from the single large data frame will be read across
792 // two different reads.
793 AssertSyncReadEquals(kMsg3, kLen3);
794 AssertSyncReadEquals(kMsg3, kLen3);
795}
[email protected]87d3c4a2010-10-07 03:00:42796
[email protected]1723f692013-05-16 03:39:37797TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) {
[email protected]ff98d7f02012-03-22 21:44:19798 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]87d3c4a2010-10-07 03:00:42799 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06800 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]87d3c4a2010-10-07 03:00:42801 };
802
[email protected]ff98d7f02012-03-22 21:44:19803 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
804 scoped_ptr<SpdyFrame> msg333(ConstructBodyFrame(kMsg333, kLen333));
[email protected]87d3c4a2010-10-07 03:00:42805 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33806 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
807 CreateMockRead(*msg333, 3, ASYNC),
808 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]87d3c4a2010-10-07 03:00:42809 };
810
811 Initialize(reads, arraysize(reads), writes, arraysize(writes));
812
813 AssertConnectSucceeds();
814
mmenke666a6fea2015-12-19 04:16:33815 // SpdySession consumes the next read and sends it to sock_ to be buffered.
816 ResumeAndRun();
[email protected]87d3c4a2010-10-07 03:00:42817 // The payload from the single large data frame will be read across
818 // two different reads.
819 AssertSyncReadEquals(kMsg33, kLen33);
820
821 // Now attempt to do a read of more data than remains buffered
822 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33));
[email protected]90499482013-06-01 00:39:50823 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback()));
[email protected]87d3c4a2010-10-07 03:00:42824 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3));
825 ASSERT_TRUE(sock_->IsConnected());
826}
827
[email protected]1723f692013-05-16 03:39:37828TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) {
[email protected]ff98d7f02012-03-22 21:44:19829 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07830 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06831 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07832 };
833
[email protected]ff98d7f02012-03-22 21:44:19834 scoped_ptr<SpdyFrame> resp(ConstructConnectAuthReplyFrame());
835 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
836 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07837 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33838 CreateMockRead(*resp, 1, ASYNC),
839 MockRead(ASYNC, ERR_IO_PENDING, 2),
840 CreateMockRead(*msg1, 3, ASYNC),
841 CreateMockRead(*msg2, 4, ASYNC),
842 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07843 };
844
845 Initialize(reads, arraysize(reads), writes, arraysize(writes));
846
[email protected]b40d5cb2012-02-27 05:30:18847 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
[email protected]fe2f62a2010-10-01 03:34:07848
mmenke666a6fea2015-12-19 04:16:33849 // SpdySession consumes the next two reads and sends then to sock_ to be
850 // buffered.
851 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07852 AssertSyncReadEquals(kMsg1, kLen1);
853 AssertSyncReadEquals(kMsg2, kLen2);
854}
855
[email protected]1723f692013-05-16 03:39:37856TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) {
[email protected]ff98d7f02012-03-22 21:44:19857 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07858 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06859 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07860 };
861
[email protected]ff98d7f02012-03-22 21:44:19862 scoped_ptr<SpdyFrame> resp(ConstructConnectErrorReplyFrame());
863 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
864 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07865 MockRead reads[] = {
[email protected]8ddf8322012-02-23 18:08:06866 CreateMockRead(*resp, 1, ASYNC),
867 CreateMockRead(*msg1, 2, ASYNC),
868 CreateMockRead(*msg2, 3, ASYNC),
869 MockRead(ASYNC, 0, 4), // EOF
[email protected]fe2f62a2010-10-01 03:34:07870 };
871
872 Initialize(reads, arraysize(reads), writes, arraysize(writes));
873
[email protected]4eddbc732012-08-09 05:40:17874 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED);
[email protected]fe2f62a2010-10-01 03:34:07875}
876
877// ----------- Reads and Writes
878
[email protected]1723f692013-05-16 03:39:37879TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) {
[email protected]ff98d7f02012-03-22 21:44:19880 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
881 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07882 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33883 CreateMockWrite(*conn, 0, SYNCHRONOUS),
884 CreateMockWrite(*msg2, 4, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07885 };
886
[email protected]ff98d7f02012-03-22 21:44:19887 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
888 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
889 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
[email protected]fe2f62a2010-10-01 03:34:07890 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33891 CreateMockRead(*resp, 1, ASYNC),
892 MockRead(ASYNC, ERR_IO_PENDING, 2),
893 CreateMockRead(*msg1, 3, ASYNC), // sync read
894 MockRead(ASYNC, ERR_IO_PENDING, 5),
895 CreateMockRead(*msg3, 6, ASYNC), // async read
896 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7),
[email protected]fe2f62a2010-10-01 03:34:07897 };
898
899 Initialize(reads, arraysize(reads), writes, arraysize(writes));
900
901 AssertConnectSucceeds();
902
mmenke666a6fea2015-12-19 04:16:33903 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07904 AssertSyncReadEquals(kMsg1, kLen1);
905
906 AssertReadStarts(kMsg3, kLen3);
mmenke666a6fea2015-12-19 04:16:33907 // Read should block until after the write succeeds.
[email protected]fe2f62a2010-10-01 03:34:07908
mmenke666a6fea2015-12-19 04:16:33909 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Advances past paused read.
[email protected]fe2f62a2010-10-01 03:34:07910
911 ASSERT_FALSE(read_callback_.have_result());
mmenke666a6fea2015-12-19 04:16:33912 ResumeAndRun();
913 // Now the read will return.
[email protected]fe2f62a2010-10-01 03:34:07914 AssertReadReturns(kMsg3, kLen3);
915}
916
[email protected]1723f692013-05-16 03:39:37917TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) {
[email protected]ff98d7f02012-03-22 21:44:19918 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
919 scoped_ptr<SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]5e6609582010-10-05 18:14:20920 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33921 CreateMockWrite(*conn, 0, SYNCHRONOUS),
922 MockWrite(ASYNC, ERR_IO_PENDING, 7), CreateMockWrite(*msg2, 8, ASYNC),
[email protected]5e6609582010-10-05 18:14:20923 };
924
[email protected]ff98d7f02012-03-22 21:44:19925 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
926 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
927 scoped_ptr<SpdyFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
[email protected]5e6609582010-10-05 18:14:20928 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33929 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
930 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4),
931 CreateMockRead(*msg3, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
[email protected]5e6609582010-10-05 18:14:20932 };
933
934 Initialize(reads, arraysize(reads), writes, arraysize(writes));
935
936 AssertConnectSucceeds();
937
mmenke666a6fea2015-12-19 04:16:33938 ResumeAndRun();
[email protected]5e6609582010-10-05 18:14:20939 AssertSyncReadEquals(kMsg1, kLen1);
940 // Write should block until the read completes
941 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING);
942
943 AssertAsyncReadEquals(kMsg3, kLen3);
944
945 ASSERT_FALSE(write_callback_.have_result());
946
947 // Now the write will complete
mmenke666a6fea2015-12-19 04:16:33948 ResumeAndRun();
[email protected]5e6609582010-10-05 18:14:20949 AssertWriteLength(kLen2);
950}
[email protected]fe2f62a2010-10-01 03:34:07951
952// ----------- Reading/Writing on Closed socket
953
954// Reading from an already closed socket should return 0
[email protected]1723f692013-05-16 03:39:37955TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) {
[email protected]ff98d7f02012-03-22 21:44:19956 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07957 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06958 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07959 };
960
[email protected]ff98d7f02012-03-22 21:44:19961 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07962 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33963 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
964 MockRead(ASYNC, 0, 3), // EOF
[email protected]fe2f62a2010-10-01 03:34:07965 };
966
967 Initialize(reads, arraysize(reads), writes, arraysize(writes));
968
969 AssertConnectSucceeds();
970
mmenke666a6fea2015-12-19 04:16:33971 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07972
[email protected]194c7a92011-12-03 04:54:18973 ASSERT_FALSE(sock_->IsConnected());
[email protected]83039bb2011-12-09 18:43:55974 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
975 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
976 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
[email protected]43549a8f2011-05-16 23:37:15977 ASSERT_FALSE(sock_->IsConnectedAndIdle());
[email protected]fe2f62a2010-10-01 03:34:07978}
979
[email protected]d9da5fe2010-10-13 22:37:16980// Read pending when socket is closed should return 0
[email protected]1723f692013-05-16 03:39:37981TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) {
[email protected]ff98d7f02012-03-22 21:44:19982 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]d9da5fe2010-10-13 22:37:16983 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06984 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]d9da5fe2010-10-13 22:37:16985 };
986
[email protected]ff98d7f02012-03-22 21:44:19987 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]d9da5fe2010-10-13 22:37:16988 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33989 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
990 MockRead(ASYNC, 0, 3), // EOF
[email protected]d9da5fe2010-10-13 22:37:16991 };
992
993 Initialize(reads, arraysize(reads), writes, arraysize(writes));
994
995 AssertConnectSucceeds();
996
997 AssertReadStarts(kMsg1, kLen1);
998
mmenke666a6fea2015-12-19 04:16:33999 ResumeAndRun();
[email protected]d9da5fe2010-10-13 22:37:161000
1001 ASSERT_EQ(0, read_callback_.WaitForResult());
1002}
1003
1004// Reading from a disconnected socket is an error
[email protected]1723f692013-05-16 03:39:371005TEST_P(SpdyProxyClientSocketTest,
[email protected]448d4ca52012-03-04 04:12:231006 ReadOnDisconnectSocketReturnsNotConnected) {
[email protected]ff98d7f02012-03-22 21:44:191007 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:241008 scoped_ptr<SpdyFrame> rst(
1009 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]d9da5fe2010-10-13 22:37:161010 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331011 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]d9da5fe2010-10-13 22:37:161012 };
1013
[email protected]ff98d7f02012-03-22 21:44:191014 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]d9da5fe2010-10-13 22:37:161015 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331016 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]d9da5fe2010-10-13 22:37:161017 };
1018
1019 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1020
1021 AssertConnectSucceeds();
1022
1023 sock_->Disconnect();
1024
[email protected]83039bb2011-12-09 18:43:551025 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
1026 sock_->Read(NULL, 1, CompletionCallback()));
[email protected]975da41a2014-06-05 03:36:241027
1028 // Let the RST_STREAM write while |rst| is in-scope.
1029 base::MessageLoop::current()->RunUntilIdle();
[email protected]d9da5fe2010-10-13 22:37:161030}
1031
1032// Reading buffered data from an already closed socket should return
1033// buffered data, then 0.
[email protected]1723f692013-05-16 03:39:371034TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) {
[email protected]ff98d7f02012-03-22 21:44:191035 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]d9da5fe2010-10-13 22:37:161036 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061037 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]d9da5fe2010-10-13 22:37:161038 };
1039
[email protected]ff98d7f02012-03-22 21:44:191040 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
1041 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]d9da5fe2010-10-13 22:37:161042 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331043 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1044 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF
[email protected]d9da5fe2010-10-13 22:37:161045 };
1046
1047 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1048
1049 AssertConnectSucceeds();
1050
mmenke666a6fea2015-12-19 04:16:331051 ResumeAndRun();
[email protected]d9da5fe2010-10-13 22:37:161052
[email protected]194c7a92011-12-03 04:54:181053 ASSERT_FALSE(sock_->IsConnected());
1054 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
[email protected]90499482013-06-01 00:39:501055 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback()));
[email protected]194c7a92011-12-03 04:54:181056 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1));
1057
[email protected]83039bb2011-12-09 18:43:551058 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
1059 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
[email protected]194c7a92011-12-03 04:54:181060 sock_->Disconnect();
[email protected]83039bb2011-12-09 18:43:551061 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
1062 sock_->Read(NULL, 1, CompletionCallback()));
[email protected]d9da5fe2010-10-13 22:37:161063}
1064
[email protected]fe2f62a2010-10-01 03:34:071065// Calling Write() on a closed socket is an error
[email protected]1723f692013-05-16 03:39:371066TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) {
[email protected]ff98d7f02012-03-22 21:44:191067 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:071068 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061069 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:071070 };
1071
[email protected]ff98d7f02012-03-22 21:44:191072 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
1073 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]fe2f62a2010-10-01 03:34:071074 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331075 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1076 MockRead(ASYNC, 0, 3), // EOF
[email protected]fe2f62a2010-10-01 03:34:071077 };
1078
1079 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1080
1081 AssertConnectSucceeds();
1082
mmenke666a6fea2015-12-19 04:16:331083 // Read EOF which will close the stream.
1084 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:071085 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551086 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
[email protected]90499482013-06-01 00:39:501087 sock_->Write(buf.get(), buf->size(), CompletionCallback()));
[email protected]fe2f62a2010-10-01 03:34:071088}
1089
mmenke666a6fea2015-12-19 04:16:331090// Calling Write() on a disconnected socket is an error.
[email protected]1723f692013-05-16 03:39:371091TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) {
[email protected]ff98d7f02012-03-22 21:44:191092 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:241093 scoped_ptr<SpdyFrame> rst(
1094 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]d9da5fe2010-10-13 22:37:161095 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331096 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]d9da5fe2010-10-13 22:37:161097 };
1098
[email protected]ff98d7f02012-03-22 21:44:191099 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
1100 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]d9da5fe2010-10-13 22:37:161101 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331102 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]d9da5fe2010-10-13 22:37:161103 };
1104
1105 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1106
1107 AssertConnectSucceeds();
1108
1109 sock_->Disconnect();
1110
1111 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551112 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
[email protected]90499482013-06-01 00:39:501113 sock_->Write(buf.get(), buf->size(), CompletionCallback()));
[email protected]975da41a2014-06-05 03:36:241114
1115 // Let the RST_STREAM write while |rst| is in-scope.
1116 base::MessageLoop::current()->RunUntilIdle();
[email protected]d9da5fe2010-10-13 22:37:161117}
[email protected]fe2f62a2010-10-01 03:34:071118
1119// If the socket is closed with a pending Write(), the callback
[email protected]d9da5fe2010-10-13 22:37:161120// should be called with ERR_CONNECTION_CLOSED.
[email protected]1723f692013-05-16 03:39:371121TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) {
[email protected]ff98d7f02012-03-22 21:44:191122 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]d9da5fe2010-10-13 22:37:161123 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331124 CreateMockWrite(*conn, 0, SYNCHRONOUS),
1125 MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 3),
[email protected]d9da5fe2010-10-13 22:37:161126 };
1127
[email protected]ff98d7f02012-03-22 21:44:191128 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]d9da5fe2010-10-13 22:37:161129 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331130 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]d9da5fe2010-10-13 22:37:161131 };
1132
1133 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1134
1135 AssertConnectSucceeds();
1136
1137 EXPECT_TRUE(sock_->IsConnected());
1138
1139 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551140 EXPECT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501141 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
mmenke666a6fea2015-12-19 04:16:331142 // Make sure the write actually starts.
1143 base::RunLoop().RunUntilIdle();
[email protected]d9da5fe2010-10-13 22:37:161144
[email protected]795cbf82013-07-22 09:37:271145 CloseSpdySession(ERR_ABORTED, std::string());
[email protected]d9da5fe2010-10-13 22:37:161146
1147 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult());
1148}
1149
1150// If the socket is Disconnected with a pending Write(), the callback
[email protected]fe2f62a2010-10-01 03:34:071151// should not be called.
[email protected]1723f692013-05-16 03:39:371152TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) {
[email protected]ff98d7f02012-03-22 21:44:191153 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:241154 scoped_ptr<SpdyFrame> rst(
1155 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]fe2f62a2010-10-01 03:34:071156 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331157 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]fe2f62a2010-10-01 03:34:071158 };
1159
[email protected]ff98d7f02012-03-22 21:44:191160 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:071161 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331162 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:071163 };
1164
1165 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1166
1167 AssertConnectSucceeds();
1168
1169 EXPECT_TRUE(sock_->IsConnected());
1170
1171 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551172 EXPECT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501173 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:071174
1175 sock_->Disconnect();
1176
1177 EXPECT_FALSE(sock_->IsConnected());
1178 EXPECT_FALSE(write_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241179
1180 // Let the RST_STREAM write while |rst| is in-scope.
1181 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:071182}
1183
[email protected]d9da5fe2010-10-13 22:37:161184// If the socket is Disconnected with a pending Read(), the callback
[email protected]fe2f62a2010-10-01 03:34:071185// should not be called.
[email protected]1723f692013-05-16 03:39:371186TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) {
[email protected]ff98d7f02012-03-22 21:44:191187 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:241188 scoped_ptr<SpdyFrame> rst(
1189 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]fe2f62a2010-10-01 03:34:071190 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331191 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]fe2f62a2010-10-01 03:34:071192 };
1193
[email protected]ff98d7f02012-03-22 21:44:191194 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:071195 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331196 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:071197 };
1198
1199 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1200
1201 AssertConnectSucceeds();
1202
1203 EXPECT_TRUE(sock_->IsConnected());
1204
1205 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
[email protected]83039bb2011-12-09 18:43:551206 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501207 sock_->Read(buf.get(), kLen1, read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:071208
1209 sock_->Disconnect();
1210
1211 EXPECT_FALSE(sock_->IsConnected());
1212 EXPECT_FALSE(read_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241213
1214 // Let the RST_STREAM write while |rst| is in-scope.
1215 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:071216}
1217
[email protected]6af4e412011-11-29 23:39:181218// If the socket is Reset when both a read and write are pending,
1219// both should be called back.
[email protected]1723f692013-05-16 03:39:371220TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) {
[email protected]ff98d7f02012-03-22 21:44:191221 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]6af4e412011-11-29 23:39:181222 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061223 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]6af4e412011-11-29 23:39:181224 };
1225
[email protected]ff98d7f02012-03-22 21:44:191226 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]c10b20852013-05-15 21:29:201227 scoped_ptr<SpdyFrame> rst(
1228 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]6af4e412011-11-29 23:39:181229 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331230 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1231 CreateMockRead(*rst, 3, ASYNC), MockRead(ASYNC, 0, 4) // EOF
[email protected]6af4e412011-11-29 23:39:181232 };
1233
1234 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1235
1236 AssertConnectSucceeds();
1237
1238 EXPECT_TRUE(sock_->IsConnected());
1239
1240 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1));
[email protected]83039bb2011-12-09 18:43:551241 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501242 sock_->Read(read_buf.get(), kLen1, read_callback_.callback()));
[email protected]6af4e412011-11-29 23:39:181243
1244 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1));
[email protected]90499482013-06-01 00:39:501245 EXPECT_EQ(
1246 ERR_IO_PENDING,
1247 sock_->Write(
1248 write_buf.get(), write_buf->size(), write_callback_.callback()));
[email protected]6af4e412011-11-29 23:39:181249
mmenke666a6fea2015-12-19 04:16:331250 ResumeAndRun();
[email protected]6af4e412011-11-29 23:39:181251
1252 EXPECT_TRUE(sock_.get());
1253 EXPECT_TRUE(read_callback_.have_result());
1254 EXPECT_TRUE(write_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241255
1256 // Let the RST_STREAM write while |rst| is in-scope.
1257 base::MessageLoop::current()->RunUntilIdle();
[email protected]6af4e412011-11-29 23:39:181258}
1259
[email protected]f6c63db52013-02-02 00:35:221260// Makes sure the proxy client socket's source gets the expected NetLog events
1261// and only the expected NetLog events (No SpdySession events).
[email protected]1723f692013-05-16 03:39:371262TEST_P(SpdyProxyClientSocketTest, NetLog) {
[email protected]f6c63db52013-02-02 00:35:221263 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]975da41a2014-06-05 03:36:241264 scoped_ptr<SpdyFrame> rst(
1265 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]f6c63db52013-02-02 00:35:221266 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331267 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 5),
[email protected]f6c63db52013-02-02 00:35:221268 };
1269
1270 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
1271 scoped_ptr<SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
1272 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331273 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1274 CreateMockRead(*msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]f6c63db52013-02-02 00:35:221275 };
1276
1277 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1278
1279 AssertConnectSucceeds();
1280
mmenke666a6fea2015-12-19 04:16:331281 // SpdySession consumes the next read and sends it to sock_ to be buffered.
1282 ResumeAndRun();
[email protected]f6c63db52013-02-02 00:35:221283 AssertSyncReadEquals(kMsg1, kLen1);
1284
1285 NetLog::Source sock_source = sock_->NetLog().source();
1286 sock_.reset();
1287
mmenke43758e62015-05-04 21:09:461288 TestNetLogEntry::List entry_list;
[email protected]f6c63db52013-02-02 00:35:221289 net_log_.GetEntriesForSource(sock_source, &entry_list);
1290
1291 ASSERT_EQ(entry_list.size(), 10u);
1292 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 0, NetLog::TYPE_SOCKET_ALIVE));
1293 EXPECT_TRUE(LogContainsEvent(entry_list, 1,
bncbe32a032015-02-25 17:22:551294 NetLog::TYPE_HTTP2_PROXY_CLIENT_SESSION,
1295 NetLog::PHASE_NONE));
[email protected]f6c63db52013-02-02 00:35:221296 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 2,
1297 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST));
1298 EXPECT_TRUE(LogContainsEvent(entry_list, 3,
1299 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS,
1300 NetLog::PHASE_NONE));
1301 EXPECT_TRUE(LogContainsEndEvent(entry_list, 4,
1302 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST));
1303 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 5,
1304 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS));
1305 EXPECT_TRUE(LogContainsEvent(entry_list, 6,
1306 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS,
1307 NetLog::PHASE_NONE));
1308 EXPECT_TRUE(LogContainsEndEvent(entry_list, 7,
1309 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS));
1310 EXPECT_TRUE(LogContainsEvent(entry_list, 8,
1311 NetLog::TYPE_SOCKET_BYTES_RECEIVED,
1312 NetLog::PHASE_NONE));
1313 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE));
[email protected]975da41a2014-06-05 03:36:241314
1315 // Let the RST_STREAM write while |rst| is in-scope.
1316 base::MessageLoop::current()->RunUntilIdle();
[email protected]f6c63db52013-02-02 00:35:221317}
1318
[email protected]6af4e412011-11-29 23:39:181319// CompletionCallback that causes the SpdyProxyClientSocket to be
1320// deleted when Run is invoked.
[email protected]49639fa2011-12-20 23:22:411321class DeleteSockCallback : public TestCompletionCallbackBase {
[email protected]6af4e412011-11-29 23:39:181322 public:
1323 explicit DeleteSockCallback(scoped_ptr<SpdyProxyClientSocket>* sock)
[email protected]aa249b52013-04-30 01:04:321324 : sock_(sock),
1325 callback_(base::Bind(&DeleteSockCallback::OnComplete,
1326 base::Unretained(this))) {
[email protected]6af4e412011-11-29 23:39:181327 }
1328
dchengb03027d2014-10-21 12:00:201329 ~DeleteSockCallback() override {}
[email protected]6af4e412011-11-29 23:39:181330
[email protected]49639fa2011-12-20 23:22:411331 const CompletionCallback& callback() const { return callback_; }
[email protected]6af4e412011-11-29 23:39:181332
1333 private:
[email protected]49639fa2011-12-20 23:22:411334 void OnComplete(int result) {
1335 sock_->reset(NULL);
1336 SetResult(result);
1337 }
1338
[email protected]6af4e412011-11-29 23:39:181339 scoped_ptr<SpdyProxyClientSocket>* sock_;
[email protected]49639fa2011-12-20 23:22:411340 CompletionCallback callback_;
1341
1342 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback);
[email protected]6af4e412011-11-29 23:39:181343};
1344
1345// If the socket is Reset when both a read and write are pending, and the
1346// read callback causes the socket to be deleted, the write callback should
1347// not be called.
[email protected]1723f692013-05-16 03:39:371348TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) {
[email protected]ff98d7f02012-03-22 21:44:191349 scoped_ptr<SpdyFrame> conn(ConstructConnectRequestFrame());
[email protected]6af4e412011-11-29 23:39:181350 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061351 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]6af4e412011-11-29 23:39:181352 };
1353
[email protected]ff98d7f02012-03-22 21:44:191354 scoped_ptr<SpdyFrame> resp(ConstructConnectReplyFrame());
[email protected]c10b20852013-05-15 21:29:201355 scoped_ptr<SpdyFrame> rst(
1356 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]6af4e412011-11-29 23:39:181357 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331358 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1359 CreateMockRead(*rst, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]6af4e412011-11-29 23:39:181360 };
1361
1362 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1363
1364 AssertConnectSucceeds();
1365
1366 EXPECT_TRUE(sock_->IsConnected());
1367
1368 DeleteSockCallback read_callback(&sock_);
1369
1370 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1));
[email protected]83039bb2011-12-09 18:43:551371 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501372 sock_->Read(read_buf.get(), kLen1, read_callback.callback()));
[email protected]6af4e412011-11-29 23:39:181373
1374 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1));
[email protected]90499482013-06-01 00:39:501375 EXPECT_EQ(
1376 ERR_IO_PENDING,
1377 sock_->Write(
1378 write_buf.get(), write_buf->size(), write_callback_.callback()));
[email protected]6af4e412011-11-29 23:39:181379
mmenke666a6fea2015-12-19 04:16:331380 ResumeAndRun();
[email protected]6af4e412011-11-29 23:39:181381
1382 EXPECT_FALSE(sock_.get());
1383 EXPECT_TRUE(read_callback.have_result());
1384 EXPECT_FALSE(write_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241385
1386 // Let the RST_STREAM write while |rst| is in-scope.
1387 base::MessageLoop::current()->RunUntilIdle();
[email protected]6af4e412011-11-29 23:39:181388}
1389
[email protected]fe2f62a2010-10-01 03:34:071390} // namespace net