blob: 78c8ce5738d9ed722ea41430d0e6c3468a7dbd2d [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);
bncb03b1092016-04-06 11:19:5595 SpdySerializedFrame* ConstructConnectRequestFrame();
96 SpdySerializedFrame* ConstructConnectAuthRequestFrame();
97 SpdySerializedFrame* ConstructConnectReplyFrame();
98 SpdySerializedFrame* ConstructConnectAuthReplyFrame();
99 SpdySerializedFrame* ConstructConnectRedirectReplyFrame();
100 SpdySerializedFrame* ConstructConnectErrorReplyFrame();
101 SpdySerializedFrame* 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_;
danakjaee3e1ec2016-04-16 00:23:18137 std::unique_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_;
danakjaee3e1ec2016-04-16 00:23:18140 std::unique_ptr<SequencedSocketData> data_;
vishal.b62985ca92015-04-17 08:45:51141 BoundTestNetLog net_log_;
[email protected]fe2f62a2010-10-01 03:34:07142
143 private:
danakjaee3e1ec2016-04-16 00:23:18144 std::unique_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),
bnc38dcd392016-02-09 23:19:49172 framer_(spdy_util_.spdy_version()),
[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();
rdsmith2e54d1f2016-03-21 19:48:17182 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority();
rdsmithebb50aa2015-11-12 03:44:38183}
184
185SpdyProxyClientSocketTest::~SpdyProxyClientSocketTest() {
mmenke666a6fea2015-12-19 04:16:33186 EXPECT_TRUE(data_->AllWriteDataConsumed());
187 EXPECT_TRUE(data_->AllReadDataConsumed());
[email protected]fe2f62a2010-10-01 03:34:07188}
189
[email protected]1723f692013-05-16 03:39:37190void SpdyProxyClientSocketTest::TearDown() {
[email protected]90499482013-06-01 00:39:50191 if (session_.get() != NULL)
[email protected]fe2f62a2010-10-01 03:34:07192 session_->spdy_session_pool()->CloseAllSessions();
193
[email protected]fe2f62a2010-10-01 03:34:07194 // Empty the current queue.
[email protected]2da659e2013-05-23 20:51:34195 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:07196 PlatformTest::TearDown();
197}
198
rdsmithebb50aa2015-11-12 03:44:38199NextProto SpdyProxyClientSocketTest::GetProtocol() const {
200 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2;
201}
202
203bool SpdyProxyClientSocketTest::GetDependenciesFromPriority() const {
204 return GetParam() == kTestCaseHTTP2PriorityDependencies;
205}
206
[email protected]1723f692013-05-16 03:39:37207void SpdyProxyClientSocketTest::Initialize(MockRead* reads,
mmenkee24011922015-12-17 22:12:59208 size_t reads_count,
209 MockWrite* writes,
210 size_t writes_count) {
mmenke666a6fea2015-12-19 04:16:33211 data_.reset(
212 new SequencedSocketData(reads, reads_count, writes, writes_count));
[email protected]fe2f62a2010-10-01 03:34:07213 data_->set_connect_data(connect_data_);
[email protected]fe2f62a2010-10-01 03:34:07214
mmenke666a6fea2015-12-19 04:16:33215 session_deps_.socket_factory->AddSocketDataProvider(data_.get());
[email protected]fe2f62a2010-10-01 03:34:07216 session_deps_.host_resolver->set_synchronous_mode(true);
217
mmenke666a6fea2015-12-19 04:16:33218 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
[email protected]fe2f62a2010-10-01 03:34:07219
[email protected]41d64e82013-07-03 22:44:26220 // Creates the SPDY session and stream.
mmenkee65e7af2015-10-13 17:16:42221 spdy_session_ = CreateInsecureSpdySession(
222 session_.get(), endpoint_spdy_session_key_, BoundNetLog());
[email protected]d26ff352013-05-13 08:48:28223 base::WeakPtr<SpdyStream> spdy_stream(
224 CreateStreamSynchronously(
[email protected]fb73cd672013-05-27 12:53:08225 SPDY_BIDIRECTIONAL_STREAM, spdy_session_, url_, LOWEST,
226 net_log_.bound()));
[email protected]d26ff352013-05-13 08:48:28227 ASSERT_TRUE(spdy_stream.get() != NULL);
[email protected]fe2f62a2010-10-01 03:34:07228
[email protected]f6c63db52013-02-02 00:35:22229 // Create the SpdyProxyClientSocket.
rchecd3c552015-04-07 20:53:54230 sock_.reset(new SpdyProxyClientSocket(
231 spdy_stream, user_agent_, endpoint_host_port_pair_, proxy_host_port_,
mmenke2a1781d2015-10-07 19:25:33232 net_log_.bound(),
233 new HttpAuthController(
234 HttpAuth::AUTH_PROXY, GURL("https://" + proxy_host_port_.ToString()),
235 session_->http_auth_cache(), session_->http_auth_handler_factory())));
[email protected]fe2f62a2010-10-01 03:34:07236}
237
[email protected]1723f692013-05-16 03:39:37238scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer(
[email protected]fe2f62a2010-10-01 03:34:07239 const char* data, int size) {
240 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size));
241 memcpy(buf->data(), data, size);
242 return buf;
243}
244
[email protected]1723f692013-05-16 03:39:37245void SpdyProxyClientSocketTest::AssertConnectSucceeds() {
[email protected]83039bb2011-12-09 18:43:55246 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07247 ASSERT_EQ(OK, read_callback_.WaitForResult());
248}
249
[email protected]1723f692013-05-16 03:39:37250void SpdyProxyClientSocketTest::AssertConnectFails(int result) {
[email protected]83039bb2011-12-09 18:43:55251 ASSERT_EQ(ERR_IO_PENDING, sock_->Connect(read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07252 ASSERT_EQ(result, read_callback_.WaitForResult());
253}
254
[email protected]1723f692013-05-16 03:39:37255void SpdyProxyClientSocketTest::AssertConnectionEstablished() {
[email protected]fe2f62a2010-10-01 03:34:07256 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
257 ASSERT_TRUE(response != NULL);
258 ASSERT_EQ(200, response->headers->response_code());
[email protected]fe2f62a2010-10-01 03:34:07259}
260
[email protected]1723f692013-05-16 03:39:37261void SpdyProxyClientSocketTest::AssertSyncReadEquals(const char* data,
[email protected]fe2f62a2010-10-01 03:34:07262 int len) {
263 scoped_refptr<IOBuffer> buf(new IOBuffer(len));
[email protected]90499482013-06-01 00:39:50264 ASSERT_EQ(len, sock_->Read(buf.get(), len, CompletionCallback()));
[email protected]fe2f62a2010-10-01 03:34:07265 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len));
266 ASSERT_TRUE(sock_->IsConnected());
267}
268
[email protected]1723f692013-05-16 03:39:37269void SpdyProxyClientSocketTest::AssertAsyncReadEquals(const char* data,
mmenkee24011922015-12-17 22:12:59270 int len) {
[email protected]fe2f62a2010-10-01 03:34:07271 // Issue the read, which will be completed asynchronously
272 scoped_refptr<IOBuffer> buf(new IOBuffer(len));
[email protected]90499482013-06-01 00:39:50273 ASSERT_EQ(ERR_IO_PENDING,
274 sock_->Read(buf.get(), len, read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07275 EXPECT_TRUE(sock_->IsConnected());
[email protected]fe2f62a2010-10-01 03:34:07276
mmenke666a6fea2015-12-19 04:16:33277 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07278
[email protected]fe2f62a2010-10-01 03:34:07279 EXPECT_EQ(len, read_callback_.WaitForResult());
mmenke666a6fea2015-12-19 04:16:33280 EXPECT_TRUE(sock_->IsConnected());
[email protected]fe2f62a2010-10-01 03:34:07281 ASSERT_EQ(std::string(data, len), std::string(buf->data(), len));
282}
283
mmenkee24011922015-12-17 22:12:59284void SpdyProxyClientSocketTest::AssertReadStarts(const char* data, int len) {
mmenke666a6fea2015-12-19 04:16:33285 // Issue the read, which will be completed asynchronously.
[email protected]fe2f62a2010-10-01 03:34:07286 read_buf_ = new IOBuffer(len);
[email protected]83039bb2011-12-09 18:43:55287 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:50288 sock_->Read(read_buf_.get(), len, read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:07289 EXPECT_TRUE(sock_->IsConnected());
290}
291
mmenkee24011922015-12-17 22:12:59292void SpdyProxyClientSocketTest::AssertReadReturns(const char* data, int len) {
[email protected]fe2f62a2010-10-01 03:34:07293 EXPECT_TRUE(sock_->IsConnected());
294
295 // Now the read will return
296 EXPECT_EQ(len, read_callback_.WaitForResult());
297 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len));
298}
299
[email protected]1723f692013-05-16 03:39:37300void SpdyProxyClientSocketTest::AssertAsyncWriteSucceeds(const char* data,
[email protected]448d4ca52012-03-04 04:12:23301 int len) {
[email protected]5e6609582010-10-05 18:14:20302 AssertWriteReturns(data, len, ERR_IO_PENDING);
[email protected]5e6609582010-10-05 18:14:20303 AssertWriteLength(len);
304}
305
[email protected]1723f692013-05-16 03:39:37306void SpdyProxyClientSocketTest::AssertWriteReturns(const char* data,
mmenkee24011922015-12-17 22:12:59307 int len,
308 int rv) {
[email protected]fe2f62a2010-10-01 03:34:07309 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(data, len));
[email protected]90499482013-06-01 00:39:50310 EXPECT_EQ(rv,
311 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
[email protected]5e6609582010-10-05 18:14:20312}
[email protected]fe2f62a2010-10-01 03:34:07313
[email protected]1723f692013-05-16 03:39:37314void SpdyProxyClientSocketTest::AssertWriteLength(int len) {
[email protected]5e6609582010-10-05 18:14:20315 EXPECT_EQ(len, write_callback_.WaitForResult());
[email protected]fe2f62a2010-10-01 03:34:07316}
317
[email protected]601e03f12014-04-06 16:26:39318void SpdyProxyClientSocketTest::PopulateConnectRequestIR(
[email protected]745aa9c2014-06-27 02:21:29319 SpdyHeaderBlock* block) {
bnc7ecc1122015-09-28 13:22:49320 spdy_util_.MaybeAddVersionHeader(block);
[email protected]745aa9c2014-06-27 02:21:29321 (*block)[spdy_util_.GetMethodKey()] = "CONNECT";
bnc6b996d532015-07-29 10:51:32322 if (spdy_util_.spdy_version() == HTTP2) {
323 (*block)[spdy_util_.GetHostKey()] = kOriginHostPort;
324 } else {
bnc6b996d532015-07-29 10:51:32325 (*block)[spdy_util_.GetHostKey()] = kOriginHost;
bnc7ecc1122015-09-28 13:22:49326 (*block)[spdy_util_.GetPathKey()] = kOriginHostPort;
bnc6b996d532015-07-29 10:51:32327 }
[email protected]745aa9c2014-06-27 02:21:29328 (*block)["user-agent"] = kUserAgent;
[email protected]601e03f12014-04-06 16:26:39329}
330
[email protected]745aa9c2014-06-27 02:21:29331void SpdyProxyClientSocketTest::PopulateConnectReplyIR(SpdyHeaderBlock* block,
[email protected]601e03f12014-04-06 16:26:39332 const char* status) {
[email protected]745aa9c2014-06-27 02:21:29333 (*block)[spdy_util_.GetStatusKey()] = status;
334 spdy_util_.MaybeAddVersionHeader(block);
[email protected]601e03f12014-04-06 16:26:39335}
336
[email protected]fe2f62a2010-10-01 03:34:07337// Constructs a standard SPDY SYN_STREAM frame for a CONNECT request.
bncb03b1092016-04-06 11:19:55338SpdySerializedFrame* SpdyProxyClientSocketTest::ConstructConnectRequestFrame() {
[email protected]745aa9c2014-06-27 02:21:29339 SpdyHeaderBlock block;
340 PopulateConnectRequestIR(&block);
bnc38dcd392016-02-09 23:19:49341 return spdy_util_.ConstructSpdySyn(kStreamId, block, LOWEST, false);
[email protected]fe2f62a2010-10-01 03:34:07342}
343
344// Constructs a SPDY SYN_STREAM frame for a CONNECT request which includes
345// Proxy-Authorization headers.
bncb03b1092016-04-06 11:19:55346SpdySerializedFrame*
347SpdyProxyClientSocketTest::ConstructConnectAuthRequestFrame() {
[email protected]745aa9c2014-06-27 02:21:29348 SpdyHeaderBlock block;
349 PopulateConnectRequestIR(&block);
350 block["proxy-authorization"] = "Basic Zm9vOmJhcg==";
bnc38dcd392016-02-09 23:19:49351 return spdy_util_.ConstructSpdySyn(kStreamId, block, LOWEST, false);
[email protected]fe2f62a2010-10-01 03:34:07352}
353
354// Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT.
bncb03b1092016-04-06 11:19:55355SpdySerializedFrame* SpdyProxyClientSocketTest::ConstructConnectReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29356 SpdyHeaderBlock block;
357 PopulateConnectReplyIR(&block, "200");
[email protected]601e03f12014-04-06 16:26:39358 SpdySynReplyIR reply_ir(kStreamId);
[email protected]745aa9c2014-06-27 02:21:29359 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]fe2f62a2010-10-01 03:34:07360}
361
[email protected]601e03f12014-04-06 16:26:39362// Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT,
363// including Proxy-Authenticate headers.
bncb03b1092016-04-06 11:19:55364SpdySerializedFrame*
365SpdyProxyClientSocketTest::ConstructConnectAuthReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29366 SpdyHeaderBlock block;
367 PopulateConnectReplyIR(&block, "407");
368 block["proxy-authenticate"] = "Basic realm=\"MyRealm1\"";
369 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]fe2f62a2010-10-01 03:34:07370}
371
[email protected]4eddbc732012-08-09 05:40:17372// Constructs a SPDY SYN_REPLY frame with an HTTP 302 redirect.
bncb03b1092016-04-06 11:19:55373SpdySerializedFrame*
374SpdyProxyClientSocketTest::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.
bncb03b1092016-04-06 11:19:55383SpdySerializedFrame*
384SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() {
[email protected]745aa9c2014-06-27 02:21:29385 SpdyHeaderBlock block;
386 PopulateConnectReplyIR(&block, "500");
387 return spdy_util_.ConstructSpdyReply(kStreamId, block);
[email protected]fe2f62a2010-10-01 03:34:07388}
389
bncb03b1092016-04-06 11:19:55390SpdySerializedFrame* SpdyProxyClientSocketTest::ConstructBodyFrame(
[email protected]1723f692013-05-16 03:39:37391 const char* data,
392 int length) {
[email protected]ff98d7f02012-03-22 21:44:19393 return framer_.CreateDataFrame(kStreamId, data, length, DATA_FLAG_NONE);
[email protected]fe2f62a2010-10-01 03:34:07394}
395
396// ----------- Connect
397
[email protected]1723f692013-05-16 03:39:37398TEST_P(SpdyProxyClientSocketTest, ConnectSendsCorrectRequest) {
danakjaee3e1ec2016-04-16 00:23:18399 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07400 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06401 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07402 };
403
danakjaee3e1ec2016-04-16 00:23:18404 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07405 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33406 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07407 };
408
409 Initialize(reads, arraysize(reads), writes, arraysize(writes));
410
411 ASSERT_FALSE(sock_->IsConnected());
412
413 AssertConnectSucceeds();
414
415 AssertConnectionEstablished();
416}
417
[email protected]1723f692013-05-16 03:39:37418TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthRequested) {
danakjaee3e1ec2016-04-16 00:23:18419 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07420 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06421 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07422 };
423
danakjaee3e1ec2016-04-16 00:23:18424 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectAuthReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07425 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33426 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07427 };
428
429 Initialize(reads, arraysize(reads), writes, arraysize(writes));
430
[email protected]b40d5cb2012-02-27 05:30:18431 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
[email protected]fe3b7dc2012-02-03 19:52:09432
433 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
434 ASSERT_TRUE(response != NULL);
435 ASSERT_EQ(407, response->headers->response_code());
[email protected]fe2f62a2010-10-01 03:34:07436}
437
[email protected]1723f692013-05-16 03:39:37438TEST_P(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) {
danakjaee3e1ec2016-04-16 00:23:18439 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectAuthRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07440 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06441 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07442 };
443
danakjaee3e1ec2016-04-16 00:23:18444 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07445 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33446 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07447 };
448
449 Initialize(reads, arraysize(reads), writes, arraysize(writes));
450 AddAuthToCache();
451
452 AssertConnectSucceeds();
453
454 AssertConnectionEstablished();
455}
456
[email protected]1723f692013-05-16 03:39:37457TEST_P(SpdyProxyClientSocketTest, ConnectRedirects) {
danakjaee3e1ec2016-04-16 00:23:18458 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
459 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:24460 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]4eddbc732012-08-09 05:40:17461 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33462 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]4eddbc732012-08-09 05:40:17463 };
464
danakjaee3e1ec2016-04-16 00:23:18465 std::unique_ptr<SpdySerializedFrame> resp(
466 ConstructConnectRedirectReplyFrame());
[email protected]4eddbc732012-08-09 05:40:17467 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33468 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]4eddbc732012-08-09 05:40:17469 };
470
471 Initialize(reads, arraysize(reads), writes, arraysize(writes));
472
473 AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE);
474
475 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
476 ASSERT_TRUE(response != NULL);
477
[email protected]90499482013-06-01 00:39:50478 const HttpResponseHeaders* headers = response->headers.get();
[email protected]4eddbc732012-08-09 05:40:17479 ASSERT_EQ(302, headers->response_code());
480 ASSERT_FALSE(headers->HasHeader("set-cookie"));
481 ASSERT_TRUE(headers->HasHeaderValue("content-length", "0"));
482
483 std::string location;
484 ASSERT_TRUE(headers->IsRedirect(&location));
485 ASSERT_EQ(location, kRedirectUrl);
[email protected]975da41a2014-06-05 03:36:24486
487 // Let the RST_STREAM write while |rst| is in-scope.
488 base::MessageLoop::current()->RunUntilIdle();
[email protected]4eddbc732012-08-09 05:40:17489}
490
[email protected]1723f692013-05-16 03:39:37491TEST_P(SpdyProxyClientSocketTest, ConnectFails) {
danakjaee3e1ec2016-04-16 00:23:18492 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07493 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06494 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07495 };
496
danakjaee3e1ec2016-04-16 00:23:18497 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07498 MockRead reads[] = {
[email protected]8ddf8322012-02-23 18:08:06499 MockRead(ASYNC, 0, 1), // EOF
[email protected]fe2f62a2010-10-01 03:34:07500 };
501
502 Initialize(reads, arraysize(reads), writes, arraysize(writes));
503
504 ASSERT_FALSE(sock_->IsConnected());
505
506 AssertConnectFails(ERR_CONNECTION_CLOSED);
507
508 ASSERT_FALSE(sock_->IsConnected());
509}
510
511// ----------- WasEverUsed
512
[email protected]1723f692013-05-16 03:39:37513TEST_P(SpdyProxyClientSocketTest, WasEverUsedReturnsCorrectValues) {
danakjaee3e1ec2016-04-16 00:23:18514 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
515 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:24516 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]fe2f62a2010-10-01 03:34:07517 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33518 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]fe2f62a2010-10-01 03:34:07519 };
520
danakjaee3e1ec2016-04-16 00:23:18521 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07522 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33523 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07524 };
525
526 Initialize(reads, arraysize(reads), writes, arraysize(writes));
527
528 EXPECT_FALSE(sock_->WasEverUsed());
529 AssertConnectSucceeds();
530 EXPECT_TRUE(sock_->WasEverUsed());
531 sock_->Disconnect();
532 EXPECT_TRUE(sock_->WasEverUsed());
[email protected]975da41a2014-06-05 03:36:24533
534 // Let the RST_STREAM write while |rst| is in-scope.
535 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:07536}
537
538// ----------- GetPeerAddress
539
[email protected]1723f692013-05-16 03:39:37540TEST_P(SpdyProxyClientSocketTest, GetPeerAddressReturnsCorrectValues) {
danakjaee3e1ec2016-04-16 00:23:18541 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07542 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06543 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07544 };
545
danakjaee3e1ec2016-04-16 00:23:18546 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07547 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33548 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
549 MockRead(ASYNC, 0, 3), // EOF
[email protected]fe2f62a2010-10-01 03:34:07550 };
551
552 Initialize(reads, arraysize(reads), writes, arraysize(writes));
553
ttuttle859dc7a2015-04-23 19:42:29554 IPEndPoint addr;
[email protected]88e03fa2010-10-05 03:09:04555 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr));
556
[email protected]fe2f62a2010-10-01 03:34:07557 AssertConnectSucceeds();
558 EXPECT_TRUE(sock_->IsConnected());
559 EXPECT_EQ(OK, sock_->GetPeerAddress(&addr));
[email protected]88e03fa2010-10-05 03:09:04560
mmenke666a6fea2015-12-19 04:16:33561 ResumeAndRun();
[email protected]194c7a92011-12-03 04:54:18562
563 EXPECT_FALSE(sock_->IsConnected());
564 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr));
565
[email protected]fe2f62a2010-10-01 03:34:07566 sock_->Disconnect();
[email protected]194c7a92011-12-03 04:54:18567
[email protected]88e03fa2010-10-05 03:09:04568 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->GetPeerAddress(&addr));
[email protected]fe2f62a2010-10-01 03:34:07569}
570
571// ----------- Write
572
[email protected]1723f692013-05-16 03:39:37573TEST_P(SpdyProxyClientSocketTest, WriteSendsDataInDataFrame) {
danakjaee3e1ec2016-04-16 00:23:18574 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
575 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
576 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07577 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33578 CreateMockWrite(*conn, 0, SYNCHRONOUS),
579 CreateMockWrite(*msg1, 3, SYNCHRONOUS),
580 CreateMockWrite(*msg2, 4, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07581 };
582
danakjaee3e1ec2016-04-16 00:23:18583 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07584 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33585 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07586 };
587
588 Initialize(reads, arraysize(reads), writes, arraysize(writes));
589
590 AssertConnectSucceeds();
591
592 AssertAsyncWriteSucceeds(kMsg1, kLen1);
593 AssertAsyncWriteSucceeds(kMsg2, kLen2);
594}
595
[email protected]1723f692013-05-16 03:39:37596TEST_P(SpdyProxyClientSocketTest, WriteSplitsLargeDataIntoMultipleFrames) {
[email protected]fe2f62a2010-10-01 03:34:07597 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x');
danakjaee3e1ec2016-04-16 00:23:18598 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
599 std::unique_ptr<SpdySerializedFrame> chunk(
bncb03b1092016-04-06 11:19:55600 ConstructBodyFrame(chunk_data.data(), chunk_data.length()));
mmenke666a6fea2015-12-19 04:16:33601 MockWrite writes[] = {CreateMockWrite(*conn, 0, SYNCHRONOUS),
602 CreateMockWrite(*chunk, 3, SYNCHRONOUS),
603 CreateMockWrite(*chunk, 4, SYNCHRONOUS),
604 CreateMockWrite(*chunk, 5, SYNCHRONOUS)};
[email protected]fe2f62a2010-10-01 03:34:07605
danakjaee3e1ec2016-04-16 00:23:18606 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07607 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33608 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:07609 };
610
611 Initialize(reads, arraysize(reads), writes, arraysize(writes));
612
613 AssertConnectSucceeds();
614
615 std::string big_data(kMaxSpdyFrameChunkSize * 3, 'x');
[email protected]5e6609582010-10-05 18:14:20616 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(big_data.data(),
617 big_data.length()));
618
[email protected]90499482013-06-01 00:39:50619 EXPECT_EQ(ERR_IO_PENDING,
620 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
[email protected]5e6609582010-10-05 18:14:20621 EXPECT_EQ(buf->size(), write_callback_.WaitForResult());
[email protected]fe2f62a2010-10-01 03:34:07622}
623
624// ----------- Read
625
[email protected]1723f692013-05-16 03:39:37626TEST_P(SpdyProxyClientSocketTest, ReadReadsDataInDataFrame) {
danakjaee3e1ec2016-04-16 00:23:18627 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07628 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06629 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07630 };
631
danakjaee3e1ec2016-04-16 00:23:18632 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
633 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]fe2f62a2010-10-01 03:34:07634 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33635 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
636 CreateMockRead(*msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]fe2f62a2010-10-01 03:34:07637 };
638
639 Initialize(reads, arraysize(reads), writes, arraysize(writes));
640
641 AssertConnectSucceeds();
642
mmenke666a6fea2015-12-19 04:16:33643 // SpdySession consumes the next read and sends it to sock_ to be buffered.
644 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07645 AssertSyncReadEquals(kMsg1, kLen1);
646}
647
[email protected]1723f692013-05-16 03:39:37648TEST_P(SpdyProxyClientSocketTest, ReadDataFromBufferedFrames) {
danakjaee3e1ec2016-04-16 00:23:18649 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07650 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06651 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07652 };
653
danakjaee3e1ec2016-04-16 00:23:18654 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
655 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
656 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07657 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33658 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
659 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4),
660 CreateMockRead(*msg2, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
[email protected]fe2f62a2010-10-01 03:34:07661 };
662
663 Initialize(reads, arraysize(reads), writes, arraysize(writes));
664
665 AssertConnectSucceeds();
666
mmenke666a6fea2015-12-19 04:16:33667 // SpdySession consumes the next read and sends it to sock_ to be buffered.
668 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07669 AssertSyncReadEquals(kMsg1, kLen1);
mmenke666a6fea2015-12-19 04:16:33670 // SpdySession consumes the next read and sends it to sock_ to be buffered.
671 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07672 AssertSyncReadEquals(kMsg2, kLen2);
673}
674
[email protected]1723f692013-05-16 03:39:37675TEST_P(SpdyProxyClientSocketTest, ReadDataMultipleBufferedFrames) {
danakjaee3e1ec2016-04-16 00:23:18676 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07677 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06678 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07679 };
680
danakjaee3e1ec2016-04-16 00:23:18681 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
682 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
683 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07684 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33685 CreateMockRead(*resp, 1, ASYNC),
686 MockRead(ASYNC, ERR_IO_PENDING, 2),
687 CreateMockRead(*msg1, 3, ASYNC),
688 CreateMockRead(*msg2, 4, ASYNC),
689 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07690 };
691
692 Initialize(reads, arraysize(reads), writes, arraysize(writes));
693
694 AssertConnectSucceeds();
695
mmenke666a6fea2015-12-19 04:16:33696 // SpdySession consumes the next two reads and sends then to sock_ to be
697 // buffered.
698 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07699 AssertSyncReadEquals(kMsg1, kLen1);
700 AssertSyncReadEquals(kMsg2, kLen2);
701}
702
[email protected]1723f692013-05-16 03:39:37703TEST_P(SpdyProxyClientSocketTest,
[email protected]448d4ca52012-03-04 04:12:23704 LargeReadWillMergeDataFromDifferentFrames) {
danakjaee3e1ec2016-04-16 00:23:18705 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07706 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06707 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07708 };
709
danakjaee3e1ec2016-04-16 00:23:18710 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
711 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
712 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
[email protected]fe2f62a2010-10-01 03:34:07713 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33714 CreateMockRead(*resp, 1, ASYNC),
715 MockRead(ASYNC, ERR_IO_PENDING, 2),
716 CreateMockRead(*msg3, 3, ASYNC),
717 CreateMockRead(*msg3, 4, ASYNC),
718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07719 };
720
721 Initialize(reads, arraysize(reads), writes, arraysize(writes));
722
723 AssertConnectSucceeds();
724
mmenke666a6fea2015-12-19 04:16:33725 // SpdySession consumes the next two reads and sends then to sock_ to be
726 // buffered.
727 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07728 // The payload from two data frames, each with kMsg3 will be combined
729 // together into a single read().
730 AssertSyncReadEquals(kMsg33, kLen33);
731}
732
[email protected]1723f692013-05-16 03:39:37733TEST_P(SpdyProxyClientSocketTest, MultipleShortReadsThenMoreRead) {
danakjaee3e1ec2016-04-16 00:23:18734 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07735 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06736 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07737 };
738
danakjaee3e1ec2016-04-16 00:23:18739 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
740 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
741 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
742 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07743 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33744 CreateMockRead(*resp, 1, ASYNC),
745 MockRead(ASYNC, ERR_IO_PENDING, 2),
746 CreateMockRead(*msg1, 3, ASYNC),
747 CreateMockRead(*msg3, 4, ASYNC),
748 CreateMockRead(*msg3, 5, ASYNC),
749 CreateMockRead(*msg2, 6, ASYNC),
750 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7),
[email protected]fe2f62a2010-10-01 03:34:07751 };
752
753 Initialize(reads, arraysize(reads), writes, arraysize(writes));
754
755 AssertConnectSucceeds();
756
mmenke666a6fea2015-12-19 04:16:33757 // SpdySession consumes the next four reads and sends then to sock_ to be
758 // buffered.
759 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07760 AssertSyncReadEquals(kMsg1, kLen1);
761 // The payload from two data frames, each with kMsg3 will be combined
762 // together into a single read().
763 AssertSyncReadEquals(kMsg33, kLen33);
764 AssertSyncReadEquals(kMsg2, kLen2);
765}
766
[email protected]1723f692013-05-16 03:39:37767TEST_P(SpdyProxyClientSocketTest, ReadWillSplitDataFromLargeFrame) {
danakjaee3e1ec2016-04-16 00:23:18768 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07769 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06770 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07771 };
772
danakjaee3e1ec2016-04-16 00:23:18773 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
774 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
775 std::unique_ptr<SpdySerializedFrame> msg33(
776 ConstructBodyFrame(kMsg33, kLen33));
777 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07778 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33779 CreateMockRead(*resp, 1, ASYNC),
780 MockRead(ASYNC, ERR_IO_PENDING, 2),
781 CreateMockRead(*msg1, 3, ASYNC),
782 CreateMockRead(*msg33, 4, ASYNC),
783 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07784 };
785
786 Initialize(reads, arraysize(reads), writes, arraysize(writes));
787
788 AssertConnectSucceeds();
789
mmenke666a6fea2015-12-19 04:16:33790 // SpdySession consumes the next two reads and sends then to sock_ to be
791 // buffered.
792 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07793 AssertSyncReadEquals(kMsg1, kLen1);
794 // The payload from the single large data frame will be read across
795 // two different reads.
796 AssertSyncReadEquals(kMsg3, kLen3);
797 AssertSyncReadEquals(kMsg3, kLen3);
798}
[email protected]87d3c4a2010-10-07 03:00:42799
[email protected]1723f692013-05-16 03:39:37800TEST_P(SpdyProxyClientSocketTest, MultipleReadsFromSameLargeFrame) {
danakjaee3e1ec2016-04-16 00:23:18801 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]87d3c4a2010-10-07 03:00:42802 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06803 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]87d3c4a2010-10-07 03:00:42804 };
805
danakjaee3e1ec2016-04-16 00:23:18806 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
807 std::unique_ptr<SpdySerializedFrame> msg333(
808 ConstructBodyFrame(kMsg333, kLen333));
[email protected]87d3c4a2010-10-07 03:00:42809 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33810 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
811 CreateMockRead(*msg333, 3, ASYNC),
812 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]87d3c4a2010-10-07 03:00:42813 };
814
815 Initialize(reads, arraysize(reads), writes, arraysize(writes));
816
817 AssertConnectSucceeds();
818
mmenke666a6fea2015-12-19 04:16:33819 // SpdySession consumes the next read and sends it to sock_ to be buffered.
820 ResumeAndRun();
[email protected]87d3c4a2010-10-07 03:00:42821 // The payload from the single large data frame will be read across
822 // two different reads.
823 AssertSyncReadEquals(kMsg33, kLen33);
824
825 // Now attempt to do a read of more data than remains buffered
826 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen33));
[email protected]90499482013-06-01 00:39:50827 ASSERT_EQ(kLen3, sock_->Read(buf.get(), kLen33, read_callback_.callback()));
[email protected]87d3c4a2010-10-07 03:00:42828 ASSERT_EQ(std::string(kMsg3, kLen3), std::string(buf->data(), kLen3));
829 ASSERT_TRUE(sock_->IsConnected());
830}
831
[email protected]1723f692013-05-16 03:39:37832TEST_P(SpdyProxyClientSocketTest, ReadAuthResponseBody) {
danakjaee3e1ec2016-04-16 00:23:18833 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07834 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06835 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07836 };
837
danakjaee3e1ec2016-04-16 00:23:18838 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectAuthReplyFrame());
839 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
840 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07841 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33842 CreateMockRead(*resp, 1, ASYNC),
843 MockRead(ASYNC, ERR_IO_PENDING, 2),
844 CreateMockRead(*msg1, 3, ASYNC),
845 CreateMockRead(*msg2, 4, ASYNC),
846 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
[email protected]fe2f62a2010-10-01 03:34:07847 };
848
849 Initialize(reads, arraysize(reads), writes, arraysize(writes));
850
[email protected]b40d5cb2012-02-27 05:30:18851 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
[email protected]fe2f62a2010-10-01 03:34:07852
mmenke666a6fea2015-12-19 04:16:33853 // SpdySession consumes the next two reads and sends then to sock_ to be
854 // buffered.
855 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07856 AssertSyncReadEquals(kMsg1, kLen1);
857 AssertSyncReadEquals(kMsg2, kLen2);
858}
859
[email protected]1723f692013-05-16 03:39:37860TEST_P(SpdyProxyClientSocketTest, ReadErrorResponseBody) {
danakjaee3e1ec2016-04-16 00:23:18861 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07862 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06863 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07864 };
865
danakjaee3e1ec2016-04-16 00:23:18866 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectErrorReplyFrame());
867 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
868 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07869 MockRead reads[] = {
[email protected]8ddf8322012-02-23 18:08:06870 CreateMockRead(*resp, 1, ASYNC),
871 CreateMockRead(*msg1, 2, ASYNC),
872 CreateMockRead(*msg2, 3, ASYNC),
873 MockRead(ASYNC, 0, 4), // EOF
[email protected]fe2f62a2010-10-01 03:34:07874 };
875
876 Initialize(reads, arraysize(reads), writes, arraysize(writes));
877
[email protected]4eddbc732012-08-09 05:40:17878 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED);
[email protected]fe2f62a2010-10-01 03:34:07879}
880
881// ----------- Reads and Writes
882
[email protected]1723f692013-05-16 03:39:37883TEST_P(SpdyProxyClientSocketTest, AsyncReadAroundWrite) {
danakjaee3e1ec2016-04-16 00:23:18884 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
885 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]fe2f62a2010-10-01 03:34:07886 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33887 CreateMockWrite(*conn, 0, SYNCHRONOUS),
888 CreateMockWrite(*msg2, 4, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07889 };
890
danakjaee3e1ec2016-04-16 00:23:18891 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
892 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
893 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
[email protected]fe2f62a2010-10-01 03:34:07894 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33895 CreateMockRead(*resp, 1, ASYNC),
896 MockRead(ASYNC, ERR_IO_PENDING, 2),
897 CreateMockRead(*msg1, 3, ASYNC), // sync read
898 MockRead(ASYNC, ERR_IO_PENDING, 5),
899 CreateMockRead(*msg3, 6, ASYNC), // async read
900 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7),
[email protected]fe2f62a2010-10-01 03:34:07901 };
902
903 Initialize(reads, arraysize(reads), writes, arraysize(writes));
904
905 AssertConnectSucceeds();
906
mmenke666a6fea2015-12-19 04:16:33907 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07908 AssertSyncReadEquals(kMsg1, kLen1);
909
910 AssertReadStarts(kMsg3, kLen3);
mmenke666a6fea2015-12-19 04:16:33911 // Read should block until after the write succeeds.
[email protected]fe2f62a2010-10-01 03:34:07912
mmenke666a6fea2015-12-19 04:16:33913 AssertAsyncWriteSucceeds(kMsg2, kLen2); // Advances past paused read.
[email protected]fe2f62a2010-10-01 03:34:07914
915 ASSERT_FALSE(read_callback_.have_result());
mmenke666a6fea2015-12-19 04:16:33916 ResumeAndRun();
917 // Now the read will return.
[email protected]fe2f62a2010-10-01 03:34:07918 AssertReadReturns(kMsg3, kLen3);
919}
920
[email protected]1723f692013-05-16 03:39:37921TEST_P(SpdyProxyClientSocketTest, AsyncWriteAroundReads) {
danakjaee3e1ec2016-04-16 00:23:18922 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
923 std::unique_ptr<SpdySerializedFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
[email protected]5e6609582010-10-05 18:14:20924 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:33925 CreateMockWrite(*conn, 0, SYNCHRONOUS),
926 MockWrite(ASYNC, ERR_IO_PENDING, 7), CreateMockWrite(*msg2, 8, ASYNC),
[email protected]5e6609582010-10-05 18:14:20927 };
928
danakjaee3e1ec2016-04-16 00:23:18929 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
930 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
931 std::unique_ptr<SpdySerializedFrame> msg3(ConstructBodyFrame(kMsg3, kLen3));
[email protected]5e6609582010-10-05 18:14:20932 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33933 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
934 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 4),
935 CreateMockRead(*msg3, 5, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
[email protected]5e6609582010-10-05 18:14:20936 };
937
938 Initialize(reads, arraysize(reads), writes, arraysize(writes));
939
940 AssertConnectSucceeds();
941
mmenke666a6fea2015-12-19 04:16:33942 ResumeAndRun();
[email protected]5e6609582010-10-05 18:14:20943 AssertSyncReadEquals(kMsg1, kLen1);
944 // Write should block until the read completes
945 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING);
946
947 AssertAsyncReadEquals(kMsg3, kLen3);
948
949 ASSERT_FALSE(write_callback_.have_result());
950
951 // Now the write will complete
mmenke666a6fea2015-12-19 04:16:33952 ResumeAndRun();
[email protected]5e6609582010-10-05 18:14:20953 AssertWriteLength(kLen2);
954}
[email protected]fe2f62a2010-10-01 03:34:07955
956// ----------- Reading/Writing on Closed socket
957
958// Reading from an already closed socket should return 0
[email protected]1723f692013-05-16 03:39:37959TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsZero) {
danakjaee3e1ec2016-04-16 00:23:18960 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:07961 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06962 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:07963 };
964
danakjaee3e1ec2016-04-16 00:23:18965 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:07966 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33967 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
968 MockRead(ASYNC, 0, 3), // EOF
[email protected]fe2f62a2010-10-01 03:34:07969 };
970
971 Initialize(reads, arraysize(reads), writes, arraysize(writes));
972
973 AssertConnectSucceeds();
974
mmenke666a6fea2015-12-19 04:16:33975 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:07976
[email protected]194c7a92011-12-03 04:54:18977 ASSERT_FALSE(sock_->IsConnected());
[email protected]83039bb2011-12-09 18:43:55978 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
979 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
980 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
[email protected]43549a8f2011-05-16 23:37:15981 ASSERT_FALSE(sock_->IsConnectedAndIdle());
[email protected]fe2f62a2010-10-01 03:34:07982}
983
[email protected]d9da5fe2010-10-13 22:37:16984// Read pending when socket is closed should return 0
[email protected]1723f692013-05-16 03:39:37985TEST_P(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) {
danakjaee3e1ec2016-04-16 00:23:18986 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]d9da5fe2010-10-13 22:37:16987 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:06988 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]d9da5fe2010-10-13 22:37:16989 };
990
danakjaee3e1ec2016-04-16 00:23:18991 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]d9da5fe2010-10-13 22:37:16992 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:33993 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
994 MockRead(ASYNC, 0, 3), // EOF
[email protected]d9da5fe2010-10-13 22:37:16995 };
996
997 Initialize(reads, arraysize(reads), writes, arraysize(writes));
998
999 AssertConnectSucceeds();
1000
1001 AssertReadStarts(kMsg1, kLen1);
1002
mmenke666a6fea2015-12-19 04:16:331003 ResumeAndRun();
[email protected]d9da5fe2010-10-13 22:37:161004
1005 ASSERT_EQ(0, read_callback_.WaitForResult());
1006}
1007
1008// Reading from a disconnected socket is an error
[email protected]1723f692013-05-16 03:39:371009TEST_P(SpdyProxyClientSocketTest,
[email protected]448d4ca52012-03-04 04:12:231010 ReadOnDisconnectSocketReturnsNotConnected) {
danakjaee3e1ec2016-04-16 00:23:181011 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
1012 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:241013 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]d9da5fe2010-10-13 22:37:161014 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331015 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]d9da5fe2010-10-13 22:37:161016 };
1017
danakjaee3e1ec2016-04-16 00:23:181018 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]d9da5fe2010-10-13 22:37:161019 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331020 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]d9da5fe2010-10-13 22:37:161021 };
1022
1023 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1024
1025 AssertConnectSucceeds();
1026
1027 sock_->Disconnect();
1028
[email protected]83039bb2011-12-09 18:43:551029 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
1030 sock_->Read(NULL, 1, CompletionCallback()));
[email protected]975da41a2014-06-05 03:36:241031
1032 // Let the RST_STREAM write while |rst| is in-scope.
1033 base::MessageLoop::current()->RunUntilIdle();
[email protected]d9da5fe2010-10-13 22:37:161034}
1035
1036// Reading buffered data from an already closed socket should return
1037// buffered data, then 0.
[email protected]1723f692013-05-16 03:39:371038TEST_P(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) {
danakjaee3e1ec2016-04-16 00:23:181039 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]d9da5fe2010-10-13 22:37:161040 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061041 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]d9da5fe2010-10-13 22:37:161042 };
1043
danakjaee3e1ec2016-04-16 00:23:181044 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
1045 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]d9da5fe2010-10-13 22:37:161046 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331047 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1048 CreateMockRead(*msg1, 3, ASYNC), MockRead(ASYNC, 0, 4), // EOF
[email protected]d9da5fe2010-10-13 22:37:161049 };
1050
1051 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1052
1053 AssertConnectSucceeds();
1054
mmenke666a6fea2015-12-19 04:16:331055 ResumeAndRun();
[email protected]d9da5fe2010-10-13 22:37:161056
[email protected]194c7a92011-12-03 04:54:181057 ASSERT_FALSE(sock_->IsConnected());
1058 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
[email protected]90499482013-06-01 00:39:501059 ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionCallback()));
[email protected]194c7a92011-12-03 04:54:181060 ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1));
1061
[email protected]83039bb2011-12-09 18:43:551062 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
1063 ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionCallback()));
[email protected]194c7a92011-12-03 04:54:181064 sock_->Disconnect();
[email protected]83039bb2011-12-09 18:43:551065 ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
1066 sock_->Read(NULL, 1, CompletionCallback()));
[email protected]d9da5fe2010-10-13 22:37:161067}
1068
[email protected]fe2f62a2010-10-01 03:34:071069// Calling Write() on a closed socket is an error
[email protected]1723f692013-05-16 03:39:371070TEST_P(SpdyProxyClientSocketTest, WriteOnClosedStream) {
danakjaee3e1ec2016-04-16 00:23:181071 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]fe2f62a2010-10-01 03:34:071072 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061073 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]fe2f62a2010-10-01 03:34:071074 };
1075
danakjaee3e1ec2016-04-16 00:23:181076 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
1077 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]fe2f62a2010-10-01 03:34:071078 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331079 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1080 MockRead(ASYNC, 0, 3), // EOF
[email protected]fe2f62a2010-10-01 03:34:071081 };
1082
1083 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1084
1085 AssertConnectSucceeds();
1086
mmenke666a6fea2015-12-19 04:16:331087 // Read EOF which will close the stream.
1088 ResumeAndRun();
[email protected]fe2f62a2010-10-01 03:34:071089 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551090 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
[email protected]90499482013-06-01 00:39:501091 sock_->Write(buf.get(), buf->size(), CompletionCallback()));
[email protected]fe2f62a2010-10-01 03:34:071092}
1093
mmenke666a6fea2015-12-19 04:16:331094// Calling Write() on a disconnected socket is an error.
[email protected]1723f692013-05-16 03:39:371095TEST_P(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) {
danakjaee3e1ec2016-04-16 00:23:181096 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
1097 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:241098 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]d9da5fe2010-10-13 22:37:161099 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331100 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]d9da5fe2010-10-13 22:37:161101 };
1102
danakjaee3e1ec2016-04-16 00:23:181103 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
1104 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]d9da5fe2010-10-13 22:37:161105 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331106 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]d9da5fe2010-10-13 22:37:161107 };
1108
1109 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1110
1111 AssertConnectSucceeds();
1112
1113 sock_->Disconnect();
1114
1115 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551116 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
[email protected]90499482013-06-01 00:39:501117 sock_->Write(buf.get(), buf->size(), CompletionCallback()));
[email protected]975da41a2014-06-05 03:36:241118
1119 // Let the RST_STREAM write while |rst| is in-scope.
1120 base::MessageLoop::current()->RunUntilIdle();
[email protected]d9da5fe2010-10-13 22:37:161121}
[email protected]fe2f62a2010-10-01 03:34:071122
1123// If the socket is closed with a pending Write(), the callback
[email protected]d9da5fe2010-10-13 22:37:161124// should be called with ERR_CONNECTION_CLOSED.
[email protected]1723f692013-05-16 03:39:371125TEST_P(SpdyProxyClientSocketTest, WritePendingOnClose) {
danakjaee3e1ec2016-04-16 00:23:181126 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]d9da5fe2010-10-13 22:37:161127 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331128 CreateMockWrite(*conn, 0, SYNCHRONOUS),
1129 MockWrite(SYNCHRONOUS, ERR_IO_PENDING, 3),
[email protected]d9da5fe2010-10-13 22:37:161130 };
1131
danakjaee3e1ec2016-04-16 00:23:181132 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]d9da5fe2010-10-13 22:37:161133 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331134 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]d9da5fe2010-10-13 22:37:161135 };
1136
1137 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1138
1139 AssertConnectSucceeds();
1140
1141 EXPECT_TRUE(sock_->IsConnected());
1142
1143 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551144 EXPECT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501145 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
mmenke666a6fea2015-12-19 04:16:331146 // Make sure the write actually starts.
1147 base::RunLoop().RunUntilIdle();
[email protected]d9da5fe2010-10-13 22:37:161148
[email protected]795cbf82013-07-22 09:37:271149 CloseSpdySession(ERR_ABORTED, std::string());
[email protected]d9da5fe2010-10-13 22:37:161150
1151 EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult());
1152}
1153
1154// If the socket is Disconnected with a pending Write(), the callback
[email protected]fe2f62a2010-10-01 03:34:071155// should not be called.
[email protected]1723f692013-05-16 03:39:371156TEST_P(SpdyProxyClientSocketTest, DisconnectWithWritePending) {
danakjaee3e1ec2016-04-16 00:23:181157 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
1158 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:241159 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]fe2f62a2010-10-01 03:34:071160 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331161 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]fe2f62a2010-10-01 03:34:071162 };
1163
danakjaee3e1ec2016-04-16 00:23:181164 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:071165 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331166 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:071167 };
1168
1169 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1170
1171 AssertConnectSucceeds();
1172
1173 EXPECT_TRUE(sock_->IsConnected());
1174
1175 scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1));
[email protected]83039bb2011-12-09 18:43:551176 EXPECT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501177 sock_->Write(buf.get(), buf->size(), write_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:071178
1179 sock_->Disconnect();
1180
1181 EXPECT_FALSE(sock_->IsConnected());
1182 EXPECT_FALSE(write_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241183
1184 // Let the RST_STREAM write while |rst| is in-scope.
1185 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:071186}
1187
[email protected]d9da5fe2010-10-13 22:37:161188// If the socket is Disconnected with a pending Read(), the callback
[email protected]fe2f62a2010-10-01 03:34:071189// should not be called.
[email protected]1723f692013-05-16 03:39:371190TEST_P(SpdyProxyClientSocketTest, DisconnectWithReadPending) {
danakjaee3e1ec2016-04-16 00:23:181191 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
1192 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:241193 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]fe2f62a2010-10-01 03:34:071194 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331195 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 3),
[email protected]fe2f62a2010-10-01 03:34:071196 };
1197
danakjaee3e1ec2016-04-16 00:23:181198 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
[email protected]fe2f62a2010-10-01 03:34:071199 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331200 CreateMockRead(*resp, 1, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2),
[email protected]fe2f62a2010-10-01 03:34:071201 };
1202
1203 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1204
1205 AssertConnectSucceeds();
1206
1207 EXPECT_TRUE(sock_->IsConnected());
1208
1209 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
[email protected]83039bb2011-12-09 18:43:551210 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501211 sock_->Read(buf.get(), kLen1, read_callback_.callback()));
[email protected]fe2f62a2010-10-01 03:34:071212
1213 sock_->Disconnect();
1214
1215 EXPECT_FALSE(sock_->IsConnected());
1216 EXPECT_FALSE(read_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241217
1218 // Let the RST_STREAM write while |rst| is in-scope.
1219 base::MessageLoop::current()->RunUntilIdle();
[email protected]fe2f62a2010-10-01 03:34:071220}
1221
[email protected]6af4e412011-11-29 23:39:181222// If the socket is Reset when both a read and write are pending,
1223// both should be called back.
[email protected]1723f692013-05-16 03:39:371224TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePending) {
danakjaee3e1ec2016-04-16 00:23:181225 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]6af4e412011-11-29 23:39:181226 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061227 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]6af4e412011-11-29 23:39:181228 };
1229
danakjaee3e1ec2016-04-16 00:23:181230 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
1231 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]c10b20852013-05-15 21:29:201232 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]6af4e412011-11-29 23:39:181233 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331234 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1235 CreateMockRead(*rst, 3, ASYNC), MockRead(ASYNC, 0, 4) // EOF
[email protected]6af4e412011-11-29 23:39:181236 };
1237
1238 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1239
1240 AssertConnectSucceeds();
1241
1242 EXPECT_TRUE(sock_->IsConnected());
1243
1244 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1));
[email protected]83039bb2011-12-09 18:43:551245 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501246 sock_->Read(read_buf.get(), kLen1, read_callback_.callback()));
[email protected]6af4e412011-11-29 23:39:181247
1248 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1));
[email protected]90499482013-06-01 00:39:501249 EXPECT_EQ(
1250 ERR_IO_PENDING,
1251 sock_->Write(
1252 write_buf.get(), write_buf->size(), write_callback_.callback()));
[email protected]6af4e412011-11-29 23:39:181253
mmenke666a6fea2015-12-19 04:16:331254 ResumeAndRun();
[email protected]6af4e412011-11-29 23:39:181255
1256 EXPECT_TRUE(sock_.get());
1257 EXPECT_TRUE(read_callback_.have_result());
1258 EXPECT_TRUE(write_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241259
1260 // Let the RST_STREAM write while |rst| is in-scope.
1261 base::MessageLoop::current()->RunUntilIdle();
[email protected]6af4e412011-11-29 23:39:181262}
1263
[email protected]f6c63db52013-02-02 00:35:221264// Makes sure the proxy client socket's source gets the expected NetLog events
1265// and only the expected NetLog events (No SpdySession events).
[email protected]1723f692013-05-16 03:39:371266TEST_P(SpdyProxyClientSocketTest, NetLog) {
danakjaee3e1ec2016-04-16 00:23:181267 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
1268 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]975da41a2014-06-05 03:36:241269 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]f6c63db52013-02-02 00:35:221270 MockWrite writes[] = {
mmenke666a6fea2015-12-19 04:16:331271 CreateMockWrite(*conn, 0, SYNCHRONOUS), CreateMockWrite(*rst, 5),
[email protected]f6c63db52013-02-02 00:35:221272 };
1273
danakjaee3e1ec2016-04-16 00:23:181274 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
1275 std::unique_ptr<SpdySerializedFrame> msg1(ConstructBodyFrame(kMsg1, kLen1));
[email protected]f6c63db52013-02-02 00:35:221276 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331277 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1278 CreateMockRead(*msg1, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]f6c63db52013-02-02 00:35:221279 };
1280
1281 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1282
1283 AssertConnectSucceeds();
1284
mmenke666a6fea2015-12-19 04:16:331285 // SpdySession consumes the next read and sends it to sock_ to be buffered.
1286 ResumeAndRun();
[email protected]f6c63db52013-02-02 00:35:221287 AssertSyncReadEquals(kMsg1, kLen1);
1288
1289 NetLog::Source sock_source = sock_->NetLog().source();
1290 sock_.reset();
1291
mmenke43758e62015-05-04 21:09:461292 TestNetLogEntry::List entry_list;
[email protected]f6c63db52013-02-02 00:35:221293 net_log_.GetEntriesForSource(sock_source, &entry_list);
1294
1295 ASSERT_EQ(entry_list.size(), 10u);
1296 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 0, NetLog::TYPE_SOCKET_ALIVE));
1297 EXPECT_TRUE(LogContainsEvent(entry_list, 1,
bncbe32a032015-02-25 17:22:551298 NetLog::TYPE_HTTP2_PROXY_CLIENT_SESSION,
1299 NetLog::PHASE_NONE));
[email protected]f6c63db52013-02-02 00:35:221300 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 2,
1301 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST));
1302 EXPECT_TRUE(LogContainsEvent(entry_list, 3,
1303 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS,
1304 NetLog::PHASE_NONE));
1305 EXPECT_TRUE(LogContainsEndEvent(entry_list, 4,
1306 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_SEND_REQUEST));
1307 EXPECT_TRUE(LogContainsBeginEvent(entry_list, 5,
1308 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS));
1309 EXPECT_TRUE(LogContainsEvent(entry_list, 6,
1310 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS,
1311 NetLog::PHASE_NONE));
1312 EXPECT_TRUE(LogContainsEndEvent(entry_list, 7,
1313 NetLog::TYPE_HTTP_TRANSACTION_TUNNEL_READ_HEADERS));
1314 EXPECT_TRUE(LogContainsEvent(entry_list, 8,
1315 NetLog::TYPE_SOCKET_BYTES_RECEIVED,
1316 NetLog::PHASE_NONE));
1317 EXPECT_TRUE(LogContainsEndEvent(entry_list, 9, NetLog::TYPE_SOCKET_ALIVE));
[email protected]975da41a2014-06-05 03:36:241318
1319 // Let the RST_STREAM write while |rst| is in-scope.
1320 base::MessageLoop::current()->RunUntilIdle();
[email protected]f6c63db52013-02-02 00:35:221321}
1322
[email protected]6af4e412011-11-29 23:39:181323// CompletionCallback that causes the SpdyProxyClientSocket to be
1324// deleted when Run is invoked.
[email protected]49639fa2011-12-20 23:22:411325class DeleteSockCallback : public TestCompletionCallbackBase {
[email protected]6af4e412011-11-29 23:39:181326 public:
danakjaee3e1ec2016-04-16 00:23:181327 explicit DeleteSockCallback(std::unique_ptr<SpdyProxyClientSocket>* sock)
[email protected]aa249b52013-04-30 01:04:321328 : sock_(sock),
1329 callback_(base::Bind(&DeleteSockCallback::OnComplete,
danakjaee3e1ec2016-04-16 00:23:181330 base::Unretained(this))) {}
[email protected]6af4e412011-11-29 23:39:181331
dchengb03027d2014-10-21 12:00:201332 ~DeleteSockCallback() override {}
[email protected]6af4e412011-11-29 23:39:181333
[email protected]49639fa2011-12-20 23:22:411334 const CompletionCallback& callback() const { return callback_; }
[email protected]6af4e412011-11-29 23:39:181335
1336 private:
[email protected]49639fa2011-12-20 23:22:411337 void OnComplete(int result) {
1338 sock_->reset(NULL);
1339 SetResult(result);
1340 }
1341
danakjaee3e1ec2016-04-16 00:23:181342 std::unique_ptr<SpdyProxyClientSocket>* sock_;
[email protected]49639fa2011-12-20 23:22:411343 CompletionCallback callback_;
1344
1345 DISALLOW_COPY_AND_ASSIGN(DeleteSockCallback);
[email protected]6af4e412011-11-29 23:39:181346};
1347
1348// If the socket is Reset when both a read and write are pending, and the
1349// read callback causes the socket to be deleted, the write callback should
1350// not be called.
[email protected]1723f692013-05-16 03:39:371351TEST_P(SpdyProxyClientSocketTest, RstWithReadAndWritePendingDelete) {
danakjaee3e1ec2016-04-16 00:23:181352 std::unique_ptr<SpdySerializedFrame> conn(ConstructConnectRequestFrame());
[email protected]6af4e412011-11-29 23:39:181353 MockWrite writes[] = {
[email protected]8ddf8322012-02-23 18:08:061354 CreateMockWrite(*conn, 0, SYNCHRONOUS),
[email protected]6af4e412011-11-29 23:39:181355 };
1356
danakjaee3e1ec2016-04-16 00:23:181357 std::unique_ptr<SpdySerializedFrame> resp(ConstructConnectReplyFrame());
1358 std::unique_ptr<SpdySerializedFrame> rst(
[email protected]c10b20852013-05-15 21:29:201359 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
[email protected]6af4e412011-11-29 23:39:181360 MockRead reads[] = {
mmenke666a6fea2015-12-19 04:16:331361 CreateMockRead(*resp, 1, ASYNC), MockRead(ASYNC, ERR_IO_PENDING, 2),
1362 CreateMockRead(*rst, 3, ASYNC), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
[email protected]6af4e412011-11-29 23:39:181363 };
1364
1365 Initialize(reads, arraysize(reads), writes, arraysize(writes));
1366
1367 AssertConnectSucceeds();
1368
1369 EXPECT_TRUE(sock_->IsConnected());
1370
1371 DeleteSockCallback read_callback(&sock_);
1372
1373 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1));
[email protected]83039bb2011-12-09 18:43:551374 ASSERT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:501375 sock_->Read(read_buf.get(), kLen1, read_callback.callback()));
[email protected]6af4e412011-11-29 23:39:181376
1377 scoped_refptr<IOBufferWithSize> write_buf(CreateBuffer(kMsg1, kLen1));
[email protected]90499482013-06-01 00:39:501378 EXPECT_EQ(
1379 ERR_IO_PENDING,
1380 sock_->Write(
1381 write_buf.get(), write_buf->size(), write_callback_.callback()));
[email protected]6af4e412011-11-29 23:39:181382
mmenke666a6fea2015-12-19 04:16:331383 ResumeAndRun();
[email protected]6af4e412011-11-29 23:39:181384
1385 EXPECT_FALSE(sock_.get());
1386 EXPECT_TRUE(read_callback.have_result());
1387 EXPECT_FALSE(write_callback_.have_result());
[email protected]975da41a2014-06-05 03:36:241388
1389 // Let the RST_STREAM write while |rst| is in-scope.
1390 base::MessageLoop::current()->RunUntilIdle();
[email protected]6af4e412011-11-29 23:39:181391}
1392
[email protected]fe2f62a2010-10-01 03:34:071393} // namespace net