blob: 0ecbc702a5073df836ba11e051df3712bac0aeee [file] [log] [blame]
Bence Béky7294fc22018-02-08 14:26:171// Copyright 2018 The Chromium Authors. All rights reserved.
2// 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/websockets/websocket_basic_stream_adapters.h"
6
7#include <utility>
8
9#include "base/memory/scoped_refptr.h"
Bence Béky29f661602018-02-16 02:45:0210#include "base/memory/weak_ptr.h"
11#include "base/run_loop.h"
Bence Béky7294fc22018-02-08 14:26:1712#include "base/strings/string_piece.h"
13#include "net/base/host_port_pair.h"
14#include "net/base/io_buffer.h"
15#include "net/base/net_errors.h"
Bence Béky29f661602018-02-16 02:45:0216#include "net/base/privacy_mode.h"
17#include "net/base/proxy_server.h"
Bence Béky7294fc22018-02-08 14:26:1718#include "net/base/test_completion_callback.h"
19#include "net/dns/mock_host_resolver.h"
20#include "net/http/http_network_session.h"
Bence Béky29f661602018-02-16 02:45:0221#include "net/log/net_log_with_source.h"
Bence Béky7294fc22018-02-08 14:26:1722#include "net/socket/client_socket_handle.h"
23#include "net/socket/client_socket_pool_manager_impl.h"
Bence Béky29f661602018-02-16 02:45:0224#include "net/socket/socket_tag.h"
Bence Béky7294fc22018-02-08 14:26:1725#include "net/socket/socket_test_util.h"
26#include "net/socket/ssl_client_socket_pool.h"
27#include "net/socket/transport_client_socket_pool.h"
Bence Béky29f661602018-02-16 02:45:0228#include "net/spdy/chromium/spdy_session.h"
29#include "net/spdy/chromium/spdy_session_key.h"
30#include "net/spdy/chromium/spdy_test_util_common.h"
Bence Béky7294fc22018-02-08 14:26:1731#include "net/ssl/ssl_config.h"
Bence Béky29f661602018-02-16 02:45:0232#include "net/ssl/ssl_info.h"
33#include "net/test/cert_test_util.h"
Bence Béky7294fc22018-02-08 14:26:1734#include "net/test/gtest_util.h"
Bence Béky29f661602018-02-16 02:45:0235#include "net/test/test_data_directory.h"
Bence Béky7294fc22018-02-08 14:26:1736#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
Bence Béky29f661602018-02-16 02:45:0237#include "testing/gmock/include/gmock/gmock.h"
Bence Béky7294fc22018-02-08 14:26:1738#include "testing/gtest/include/gtest/gtest.h"
39
Bence Béky29f661602018-02-16 02:45:0240using testing::Test;
41using testing::StrictMock;
42using testing::_;
43
Bence Béky7294fc22018-02-08 14:26:1744namespace net {
45
46namespace test {
47
48const char* const kGroupName = "ssl/www.example.org:443";
49
Bence Béky29f661602018-02-16 02:45:0250class WebSocketClientSocketHandleAdapterTest : public Test {
Bence Béky7294fc22018-02-08 14:26:1751 protected:
52 WebSocketClientSocketHandleAdapterTest()
53 : host_port_pair_("www.example.org", 443),
54 socket_pool_manager_(std::make_unique<ClientSocketPoolManagerImpl>(
Bence Béky29f661602018-02-16 02:45:0255 net_log_.net_log(),
Bence Béky7294fc22018-02-08 14:26:1756 &socket_factory_,
57 nullptr,
58 nullptr,
59 &host_resolver,
60 nullptr,
61 nullptr,
62 nullptr,
63 nullptr,
64 nullptr,
65 "test_shard",
66 nullptr,
67 HttpNetworkSession::NORMAL_SOCKET_POOL)),
68 transport_params_(base::MakeRefCounted<TransportSocketParams>(
69 host_port_pair_,
70 false,
71 OnHostResolutionCallback(),
72 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)),
73 ssl_params_(base::MakeRefCounted<SSLSocketParams>(transport_params_,
74 nullptr,
75 nullptr,
76 host_port_pair_,
77 SSLConfig(),
78 PRIVACY_MODE_DISABLED,
79 0,
80 false)) {}
81
Bence Béky29f661602018-02-16 02:45:0282 ~WebSocketClientSocketHandleAdapterTest() override = default;
83
Bence Béky7294fc22018-02-08 14:26:1784 bool InitClientSocketHandle(ClientSocketHandle* connection) {
85 TestCompletionCallback callback;
86 int rv = connection->Init(
87 kGroupName, ssl_params_, MEDIUM, SocketTag(),
88 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Bence Béky29f661602018-02-16 02:45:0289 socket_pool_manager_->GetSSLSocketPool(), net_log_);
Bence Béky7294fc22018-02-08 14:26:1790 rv = callback.GetResult(rv);
91 return rv == OK;
92 }
93
94 const HostPortPair host_port_pair_;
Bence Béky29f661602018-02-16 02:45:0295 NetLogWithSource net_log_;
Bence Béky7294fc22018-02-08 14:26:1796 MockClientSocketFactory socket_factory_;
97 MockHostResolver host_resolver;
98 std::unique_ptr<ClientSocketPoolManagerImpl> socket_pool_manager_;
99 scoped_refptr<TransportSocketParams> transport_params_;
100 scoped_refptr<SSLSocketParams> ssl_params_;
101};
102
103TEST_F(WebSocketClientSocketHandleAdapterTest, Uninitialized) {
104 auto connection = std::make_unique<ClientSocketHandle>();
105 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
106 EXPECT_FALSE(adapter.is_initialized());
107}
108
109TEST_F(WebSocketClientSocketHandleAdapterTest, IsInitialized) {
110 StaticSocketDataProvider data(nullptr, 0, nullptr, 0);
111 socket_factory_.AddSocketDataProvider(&data);
112 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
113 socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
114
115 auto connection = std::make_unique<ClientSocketHandle>();
116 ClientSocketHandle* const connection_ptr = connection.get();
117
118 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
119 EXPECT_FALSE(adapter.is_initialized());
120
121 EXPECT_TRUE(InitClientSocketHandle(connection_ptr));
122
123 EXPECT_TRUE(adapter.is_initialized());
124}
125
126TEST_F(WebSocketClientSocketHandleAdapterTest, Disconnect) {
127 StaticSocketDataProvider data(nullptr, 0, nullptr, 0);
128 socket_factory_.AddSocketDataProvider(&data);
129 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
130 socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
131
132 auto connection = std::make_unique<ClientSocketHandle>();
133 EXPECT_TRUE(InitClientSocketHandle(connection.get()));
134
135 StreamSocket* const socket = connection->socket();
136
137 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
138 EXPECT_TRUE(adapter.is_initialized());
139
140 EXPECT_TRUE(socket->IsConnected());
141 adapter.Disconnect();
142 EXPECT_FALSE(socket->IsConnected());
143}
144
145TEST_F(WebSocketClientSocketHandleAdapterTest, Read) {
146 MockRead reads[] = {MockRead(SYNCHRONOUS, "foo"), MockRead("bar")};
147 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0);
148 socket_factory_.AddSocketDataProvider(&data);
149 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
150 socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
151
152 auto connection = std::make_unique<ClientSocketHandle>();
153 EXPECT_TRUE(InitClientSocketHandle(connection.get()));
154
155 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
156 EXPECT_TRUE(adapter.is_initialized());
157
158 // Buffer larger than each MockRead.
159 const int kReadBufSize = 1024;
160 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
161 int rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
162 ASSERT_EQ(3, rv);
163 EXPECT_EQ("foo", base::StringPiece(read_buf->data(), rv));
164
165 TestCompletionCallback callback;
166 rv = adapter.Read(read_buf.get(), kReadBufSize, callback.callback());
167 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
168 rv = callback.WaitForResult();
169 ASSERT_EQ(3, rv);
170 EXPECT_EQ("bar", base::StringPiece(read_buf->data(), rv));
171
172 EXPECT_TRUE(data.AllReadDataConsumed());
173 EXPECT_TRUE(data.AllWriteDataConsumed());
174}
175
176TEST_F(WebSocketClientSocketHandleAdapterTest, ReadIntoSmallBuffer) {
177 MockRead reads[] = {MockRead(SYNCHRONOUS, "foo"), MockRead("bar")};
178 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0);
179 socket_factory_.AddSocketDataProvider(&data);
180 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
181 socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
182
183 auto connection = std::make_unique<ClientSocketHandle>();
184 EXPECT_TRUE(InitClientSocketHandle(connection.get()));
185
186 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
187 EXPECT_TRUE(adapter.is_initialized());
188
189 // Buffer smaller than each MockRead.
190 const int kReadBufSize = 2;
191 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
192 int rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
193 ASSERT_EQ(2, rv);
194 EXPECT_EQ("fo", base::StringPiece(read_buf->data(), rv));
195
196 rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
197 ASSERT_EQ(1, rv);
198 EXPECT_EQ("o", base::StringPiece(read_buf->data(), rv));
199
200 TestCompletionCallback callback1;
201 rv = adapter.Read(read_buf.get(), kReadBufSize, callback1.callback());
202 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
203 rv = callback1.WaitForResult();
204 ASSERT_EQ(2, rv);
205 EXPECT_EQ("ba", base::StringPiece(read_buf->data(), rv));
206
207 rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
208 ASSERT_EQ(1, rv);
209 EXPECT_EQ("r", base::StringPiece(read_buf->data(), rv));
210
211 EXPECT_TRUE(data.AllReadDataConsumed());
212 EXPECT_TRUE(data.AllWriteDataConsumed());
213}
214
215TEST_F(WebSocketClientSocketHandleAdapterTest, Write) {
216 MockWrite writes[] = {MockWrite(SYNCHRONOUS, "foo"), MockWrite("bar")};
217 StaticSocketDataProvider data(nullptr, 0, writes, arraysize(writes));
218 socket_factory_.AddSocketDataProvider(&data);
219 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
220 socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
221
222 auto connection = std::make_unique<ClientSocketHandle>();
223 EXPECT_TRUE(InitClientSocketHandle(connection.get()));
224
225 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
226 EXPECT_TRUE(adapter.is_initialized());
227
228 auto write_buf1 = base::MakeRefCounted<StringIOBuffer>("foo");
229 int rv = adapter.Write(write_buf1.get(), write_buf1->size(),
230 CompletionCallback(), TRAFFIC_ANNOTATION_FOR_TESTS);
231 ASSERT_EQ(3, rv);
232
233 auto write_buf2 = base::MakeRefCounted<StringIOBuffer>("bar");
234 TestCompletionCallback callback;
235 rv = adapter.Write(write_buf2.get(), write_buf2->size(), callback.callback(),
236 TRAFFIC_ANNOTATION_FOR_TESTS);
237 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
238 rv = callback.WaitForResult();
239 ASSERT_EQ(3, rv);
240
241 EXPECT_TRUE(data.AllReadDataConsumed());
242 EXPECT_TRUE(data.AllWriteDataConsumed());
243}
244
245// Test that if both Read() and Write() returns asynchronously,
246// the two callbacks are handled correctly.
247TEST_F(WebSocketClientSocketHandleAdapterTest, AsyncReadAndWrite) {
248 MockRead reads[] = {MockRead("foobar")};
249 MockWrite writes[] = {MockWrite("baz")};
250 StaticSocketDataProvider data(reads, arraysize(reads), writes,
251 arraysize(writes));
252 socket_factory_.AddSocketDataProvider(&data);
253 SSLSocketDataProvider ssl_socket_data(ASYNC, OK);
254 socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
255
256 auto connection = std::make_unique<ClientSocketHandle>();
257 EXPECT_TRUE(InitClientSocketHandle(connection.get()));
258
259 WebSocketClientSocketHandleAdapter adapter(std::move(connection));
260 EXPECT_TRUE(adapter.is_initialized());
261
262 const int kReadBufSize = 1024;
263 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
264 TestCompletionCallback read_callback;
265 int rv = adapter.Read(read_buf.get(), kReadBufSize, read_callback.callback());
266 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
267
268 auto write_buf = base::MakeRefCounted<StringIOBuffer>("baz");
269 TestCompletionCallback write_callback;
270 rv = adapter.Write(write_buf.get(), write_buf->size(),
271 write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
272 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
273
274 rv = read_callback.WaitForResult();
275 ASSERT_EQ(6, rv);
276 EXPECT_EQ("foobar", base::StringPiece(read_buf->data(), rv));
277
278 rv = write_callback.WaitForResult();
279 ASSERT_EQ(3, rv);
280
281 EXPECT_TRUE(data.AllReadDataConsumed());
282 EXPECT_TRUE(data.AllWriteDataConsumed());
283}
284
Bence Béky29f661602018-02-16 02:45:02285class MockDelegate : public WebSocketSpdyStreamAdapter::Delegate {
286 public:
287 virtual ~MockDelegate() = default;
288 MOCK_METHOD0(OnHeadersSent, void());
289 MOCK_METHOD1(OnHeadersReceived, void(const SpdyHeaderBlock&));
290 MOCK_METHOD1(OnClose, void(int));
291};
292
293class WebSocketSpdyStreamAdapterTest : public Test {
294 protected:
295 WebSocketSpdyStreamAdapterTest()
296 : url_("wss://www.example.org/"),
297 key_(HostPortPair::FromURL(url_),
298 ProxyServer::Direct(),
299 PRIVACY_MODE_DISABLED,
300 SocketTag()),
301 session_(SpdySessionDependencies::SpdyCreateSession(&session_deps_)),
302 ssl_(SYNCHRONOUS, OK) {}
303
304 ~WebSocketSpdyStreamAdapterTest() override = default;
305
306 static SpdyHeaderBlock RequestHeaders() {
307 SpdyHeaderBlock request_headers;
308 request_headers[kHttp2MethodHeader] = "CONNECT";
309 request_headers[kHttp2AuthorityHeader] = "www.example.org:443";
310 request_headers[kHttp2SchemeHeader] = "https";
311 request_headers[kHttp2PathHeader] = "/";
312 request_headers[":protocol"] = "websocket";
313 request_headers["origin"] = "http://www.example.org";
314 request_headers["sec-websocket-version"] = "13";
315 request_headers["sec-websocket-extensions"] =
316 "permessage-deflate; client_max_window_bits";
317 return request_headers;
318 }
319
320 static SpdyHeaderBlock ResponseHeaders() {
321 SpdyHeaderBlock response_headers;
322 response_headers[kHttp2StatusHeader] = "200";
323 return response_headers;
324 }
325
326 void AddSocketData(SocketDataProvider* data) {
327 session_deps_.socket_factory->AddSocketDataProvider(data);
328 }
329
330 void AddSSLSocketData() {
331 ssl_.ssl_info.cert =
332 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
333 ASSERT_TRUE(ssl_.ssl_info.cert);
334 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_);
335 }
336
337 base::WeakPtr<SpdySession> CreateSpdySession() {
338 return ::net::CreateSpdySession(session_.get(), key_, net_log_);
339 }
340
341 base::WeakPtr<SpdyStream> CreateSpdyStream(
342 base::WeakPtr<SpdySession> session) {
343 return CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, session, url_,
344 LOWEST, net_log_);
345 }
346
347 SpdyTestUtil spdy_util_;
348 StrictMock<MockDelegate> mock_delegate_;
349 NetLogWithSource net_log_;
350
351 private:
352 const GURL url_;
353 SpdySessionKey key_;
354 SpdySessionDependencies session_deps_;
355 std::unique_ptr<HttpNetworkSession> session_;
356 SSLSocketDataProvider ssl_;
357};
358
359TEST_F(WebSocketSpdyStreamAdapterTest, Disconnect) {
360 MockRead reads[] = {MockRead(ASYNC, ERR_IO_PENDING, 0),
361 MockRead(ASYNC, 0, 1)};
362 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
363 AddSocketData(&data);
364 AddSSLSocketData();
365
366 base::WeakPtr<SpdySession> session = CreateSpdySession();
367 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
368 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
369 EXPECT_TRUE(adapter.is_initialized());
370
371 base::RunLoop().RunUntilIdle();
372
373 EXPECT_TRUE(stream);
374 adapter.Disconnect();
375 EXPECT_FALSE(stream);
376
377 // Read EOF.
378 EXPECT_TRUE(session);
379 data.Resume();
380 base::RunLoop().RunUntilIdle();
381 EXPECT_FALSE(session);
382
383 EXPECT_TRUE(data.AllReadDataConsumed());
384 EXPECT_TRUE(data.AllWriteDataConsumed());
385}
386
387TEST_F(WebSocketSpdyStreamAdapterTest, SendRequestHeadersThenDisconnect) {
388 MockRead reads[] = {MockRead(ASYNC, ERR_IO_PENDING, 0),
389 MockRead(ASYNC, 0, 3)};
390 SpdySerializedFrame headers(spdy_util_.ConstructSpdyHeaders(
391 1, RequestHeaders(), DEFAULT_PRIORITY, false));
392 SpdySerializedFrame rst(
393 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_CANCEL));
394 MockWrite writes[] = {CreateMockWrite(headers, 1), CreateMockWrite(rst, 2)};
395 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
396 AddSocketData(&data);
397 AddSSLSocketData();
398
399 base::WeakPtr<SpdySession> session = CreateSpdySession();
400 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
401 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
402 EXPECT_TRUE(adapter.is_initialized());
403
404 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
405 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
406
407 // First read is a pause and it has lower sequence number than first write.
408 // Therefore writing headers does not complete while |data| is paused.
409 base::RunLoop().RunUntilIdle();
410
411 // Reset the stream before writing completes.
412 // OnHeadersSent() will never be called.
413 EXPECT_TRUE(stream);
414 adapter.Disconnect();
415 EXPECT_FALSE(stream);
416
417 // Resume |data|, finish writing headers, and read EOF.
418 EXPECT_TRUE(session);
419 data.Resume();
420 base::RunLoop().RunUntilIdle();
421 EXPECT_FALSE(session);
422
423 EXPECT_TRUE(data.AllReadDataConsumed());
424 EXPECT_TRUE(data.AllWriteDataConsumed());
425}
426
427TEST_F(WebSocketSpdyStreamAdapterTest, OnHeadersSentThenDisconnect) {
428 MockRead reads[] = {MockRead(ASYNC, 0, 2)};
429 SpdySerializedFrame headers(spdy_util_.ConstructSpdyHeaders(
430 1, RequestHeaders(), DEFAULT_PRIORITY, false));
431 SpdySerializedFrame rst(
432 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_CANCEL));
433 MockWrite writes[] = {CreateMockWrite(headers, 0), CreateMockWrite(rst, 1)};
434 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
435 AddSocketData(&data);
436 AddSSLSocketData();
437
438 EXPECT_CALL(mock_delegate_, OnHeadersSent());
439
440 base::WeakPtr<SpdySession> session = CreateSpdySession();
441 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
442 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
443 EXPECT_TRUE(adapter.is_initialized());
444
445 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
446 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
447
448 // Finish asynchronous write of headers. This calls OnHeadersSent().
449 base::RunLoop().RunUntilIdle();
450
451 EXPECT_TRUE(stream);
452 adapter.Disconnect();
453 EXPECT_FALSE(stream);
454
455 // Read EOF.
456 EXPECT_TRUE(session);
457 base::RunLoop().RunUntilIdle();
458 EXPECT_FALSE(session);
459
460 EXPECT_TRUE(data.AllReadDataConsumed());
461 EXPECT_TRUE(data.AllWriteDataConsumed());
462}
463
464TEST_F(WebSocketSpdyStreamAdapterTest, OnHeadersReceivedThenDisconnect) {
465 SpdySerializedFrame response_headers(
466 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
467 MockRead reads[] = {CreateMockRead(response_headers, 1),
468 MockRead(ASYNC, 0, 3)};
469 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
470 1, RequestHeaders(), DEFAULT_PRIORITY, false));
471 SpdySerializedFrame rst(
472 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_CANCEL));
473 MockWrite writes[] = {CreateMockWrite(request_headers, 0),
474 CreateMockWrite(rst, 2)};
475 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
476 AddSocketData(&data);
477 AddSSLSocketData();
478
479 EXPECT_CALL(mock_delegate_, OnHeadersSent());
480 EXPECT_CALL(mock_delegate_, OnHeadersReceived(_));
481
482 base::WeakPtr<SpdySession> session = CreateSpdySession();
483 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
484 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
485 EXPECT_TRUE(adapter.is_initialized());
486
487 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
488 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
489
490 base::RunLoop().RunUntilIdle();
491
492 EXPECT_TRUE(stream);
493 adapter.Disconnect();
494 EXPECT_FALSE(stream);
495
496 // Read EOF.
497 EXPECT_TRUE(session);
498 base::RunLoop().RunUntilIdle();
499 EXPECT_FALSE(session);
500
501 EXPECT_TRUE(data.AllReadDataConsumed());
502 EXPECT_TRUE(data.AllWriteDataConsumed());
503}
504
505TEST_F(WebSocketSpdyStreamAdapterTest, ServerClosesConnection) {
506 MockRead reads[] = {MockRead(ASYNC, 0, 0)};
507 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
508 AddSocketData(&data);
509 AddSSLSocketData();
510
511 EXPECT_CALL(mock_delegate_, OnClose(ERR_CONNECTION_CLOSED));
512
513 base::WeakPtr<SpdySession> session = CreateSpdySession();
514 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
515 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
516 EXPECT_TRUE(adapter.is_initialized());
517
518 EXPECT_TRUE(session);
519 EXPECT_TRUE(stream);
520 base::RunLoop().RunUntilIdle();
521 EXPECT_FALSE(session);
522 EXPECT_FALSE(stream);
523
524 EXPECT_TRUE(data.AllReadDataConsumed());
525 EXPECT_TRUE(data.AllWriteDataConsumed());
526}
527
528TEST_F(WebSocketSpdyStreamAdapterTest,
529 SendRequestHeadersThenServerClosesConnection) {
530 MockRead reads[] = {MockRead(ASYNC, 0, 1)};
531 SpdySerializedFrame headers(spdy_util_.ConstructSpdyHeaders(
532 1, RequestHeaders(), DEFAULT_PRIORITY, false));
533 MockWrite writes[] = {CreateMockWrite(headers, 0)};
534 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
535 AddSocketData(&data);
536 AddSSLSocketData();
537
538 EXPECT_CALL(mock_delegate_, OnHeadersSent());
539 EXPECT_CALL(mock_delegate_, OnClose(ERR_CONNECTION_CLOSED));
540
541 base::WeakPtr<SpdySession> session = CreateSpdySession();
542 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
543 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
544 EXPECT_TRUE(adapter.is_initialized());
545
546 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
547 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
548
549 EXPECT_TRUE(session);
550 EXPECT_TRUE(stream);
551 base::RunLoop().RunUntilIdle();
552 EXPECT_FALSE(session);
553 EXPECT_FALSE(stream);
554
555 EXPECT_TRUE(data.AllReadDataConsumed());
556 EXPECT_TRUE(data.AllWriteDataConsumed());
557}
558
559TEST_F(WebSocketSpdyStreamAdapterTest,
560 OnHeadersReceivedThenServerClosesConnection) {
561 SpdySerializedFrame response_headers(
562 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
563 MockRead reads[] = {CreateMockRead(response_headers, 1),
564 MockRead(ASYNC, 0, 2)};
565 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
566 1, RequestHeaders(), DEFAULT_PRIORITY, false));
567 MockWrite writes[] = {CreateMockWrite(request_headers, 0)};
568 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
569 AddSocketData(&data);
570 AddSSLSocketData();
571
572 EXPECT_CALL(mock_delegate_, OnHeadersSent());
573 EXPECT_CALL(mock_delegate_, OnHeadersReceived(_));
574 EXPECT_CALL(mock_delegate_, OnClose(ERR_CONNECTION_CLOSED));
575
576 base::WeakPtr<SpdySession> session = CreateSpdySession();
577 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
578 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
579 EXPECT_TRUE(adapter.is_initialized());
580
581 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
582 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
583
584 EXPECT_TRUE(session);
585 EXPECT_TRUE(stream);
586 base::RunLoop().RunUntilIdle();
587 EXPECT_FALSE(session);
588 EXPECT_FALSE(stream);
589
590 EXPECT_TRUE(data.AllReadDataConsumed());
591 EXPECT_TRUE(data.AllWriteDataConsumed());
592}
593
594TEST_F(WebSocketSpdyStreamAdapterTest, DetachDelegate) {
595 SpdySerializedFrame response_headers(
596 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
597 MockRead reads[] = {CreateMockRead(response_headers, 1),
598 MockRead(ASYNC, 0, 2)};
599 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
600 1, RequestHeaders(), DEFAULT_PRIORITY, false));
601 MockWrite writes[] = {CreateMockWrite(request_headers, 0)};
602 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
603 AddSocketData(&data);
604 AddSSLSocketData();
605
606 base::WeakPtr<SpdySession> session = CreateSpdySession();
607 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
608 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
609 EXPECT_TRUE(adapter.is_initialized());
610
611 // No Delegate methods shall be called after this.
612 adapter.DetachDelegate();
613
614 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
615 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
616
617 EXPECT_TRUE(session);
618 EXPECT_TRUE(stream);
619 base::RunLoop().RunUntilIdle();
620 EXPECT_FALSE(session);
621 EXPECT_FALSE(stream);
622
623 EXPECT_TRUE(data.AllReadDataConsumed());
624 EXPECT_TRUE(data.AllWriteDataConsumed());
625}
626
627TEST_F(WebSocketSpdyStreamAdapterTest, Read) {
628 SpdySerializedFrame response_headers(
629 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
630 // First read is the same size as the buffer, next is smaller, last is larger.
631 SpdySerializedFrame data_frame1(
Bence Békyd74f4382018-02-20 18:26:19632 spdy_util_.ConstructSpdyDataFrame(1, "foo", false));
Bence Béky29f661602018-02-16 02:45:02633 SpdySerializedFrame data_frame2(
Bence Békyd74f4382018-02-20 18:26:19634 spdy_util_.ConstructSpdyDataFrame(1, "ba", false));
Bence Béky29f661602018-02-16 02:45:02635 SpdySerializedFrame data_frame3(
Bence Békyd74f4382018-02-20 18:26:19636 spdy_util_.ConstructSpdyDataFrame(1, "rbaz", true));
Bence Béky29f661602018-02-16 02:45:02637 MockRead reads[] = {CreateMockRead(response_headers, 1),
638 CreateMockRead(data_frame1, 2),
639 CreateMockRead(data_frame2, 3),
640 CreateMockRead(data_frame3, 4), MockRead(ASYNC, 0, 5)};
641 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
642 1, RequestHeaders(), DEFAULT_PRIORITY, false));
643 MockWrite writes[] = {CreateMockWrite(request_headers, 0)};
644 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
645 AddSocketData(&data);
646 AddSSLSocketData();
647
648 EXPECT_CALL(mock_delegate_, OnHeadersSent());
649 EXPECT_CALL(mock_delegate_, OnHeadersReceived(_));
650
651 base::WeakPtr<SpdySession> session = CreateSpdySession();
652 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
653 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
654 EXPECT_TRUE(adapter.is_initialized());
655
656 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
657 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
658
659 const int kReadBufSize = 3;
660 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
661 TestCompletionCallback callback;
662 rv = adapter.Read(read_buf.get(), kReadBufSize, callback.callback());
663 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
664 rv = callback.WaitForResult();
665 ASSERT_EQ(3, rv);
666 EXPECT_EQ("foo", base::StringPiece(read_buf->data(), rv));
667
668 // Read EOF to destroy the connection and the stream.
669 // This calls SpdySession::Delegate::OnClose().
670 EXPECT_TRUE(session);
671 EXPECT_TRUE(stream);
672 base::RunLoop().RunUntilIdle();
673 EXPECT_FALSE(session);
674 EXPECT_FALSE(stream);
675
676 // Two socket reads are concatenated by WebSocketSpdyStreamAdapter.
677 rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
678 ASSERT_EQ(3, rv);
679 EXPECT_EQ("bar", base::StringPiece(read_buf->data(), rv));
680
681 rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
682 ASSERT_EQ(3, rv);
683 EXPECT_EQ("baz", base::StringPiece(read_buf->data(), rv));
684
685 // Even though connection and stream are already closed,
686 // WebSocketSpdyStreamAdapter::Delegate::OnClose() is only called after all
687 // buffered data are read.
688 EXPECT_CALL(mock_delegate_, OnClose(ERR_CONNECTION_CLOSED));
689
690 base::RunLoop().RunUntilIdle();
691
692 EXPECT_TRUE(data.AllReadDataConsumed());
693 EXPECT_TRUE(data.AllWriteDataConsumed());
694}
695
696TEST_F(WebSocketSpdyStreamAdapterTest, CallDelegateOnCloseShouldNotCrash) {
697 SpdySerializedFrame response_headers(
698 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
699 SpdySerializedFrame data_frame1(
Bence Békyd74f4382018-02-20 18:26:19700 spdy_util_.ConstructSpdyDataFrame(1, "foo", false));
Bence Béky29f661602018-02-16 02:45:02701 SpdySerializedFrame data_frame2(
Bence Békyd74f4382018-02-20 18:26:19702 spdy_util_.ConstructSpdyDataFrame(1, "bar", false));
Bence Béky29f661602018-02-16 02:45:02703 SpdySerializedFrame rst(
704 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_CANCEL));
705 MockRead reads[] = {CreateMockRead(response_headers, 1),
706 CreateMockRead(data_frame1, 2),
707 CreateMockRead(data_frame2, 3), CreateMockRead(rst, 4),
708 MockRead(ASYNC, 0, 5)};
709 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
710 1, RequestHeaders(), DEFAULT_PRIORITY, false));
711 MockWrite writes[] = {CreateMockWrite(request_headers, 0)};
712 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
713 AddSocketData(&data);
714 AddSSLSocketData();
715
716 EXPECT_CALL(mock_delegate_, OnHeadersSent());
717 EXPECT_CALL(mock_delegate_, OnHeadersReceived(_));
718
719 base::WeakPtr<SpdySession> session = CreateSpdySession();
720 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
721 WebSocketSpdyStreamAdapter adapter(stream, &mock_delegate_, net_log_);
722 EXPECT_TRUE(adapter.is_initialized());
723
724 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
725 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
726
727 // Buffer larger than each MockRead.
728 const int kReadBufSize = 1024;
729 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
730 TestCompletionCallback callback;
731 rv = adapter.Read(read_buf.get(), kReadBufSize, callback.callback());
732 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
733 rv = callback.WaitForResult();
734 ASSERT_EQ(3, rv);
735 EXPECT_EQ("foo", base::StringPiece(read_buf->data(), rv));
736
737 // Read RST_STREAM to destroy the stream.
738 // This calls SpdySession::Delegate::OnClose().
739 EXPECT_TRUE(session);
740 EXPECT_TRUE(stream);
741 base::RunLoop().RunUntilIdle();
742 EXPECT_FALSE(session);
743 EXPECT_FALSE(stream);
744
745 // Read remaining buffered data. This will PostTask CallDelegateOnClose().
746 rv = adapter.Read(read_buf.get(), kReadBufSize, CompletionCallback());
747 ASSERT_EQ(3, rv);
748 EXPECT_EQ("bar", base::StringPiece(read_buf->data(), rv));
749
750 adapter.DetachDelegate();
751
752 // Run CallDelegateOnClose(), which should not crash
753 // even if |delegate_| is null.
754 base::RunLoop().RunUntilIdle();
755
756 EXPECT_TRUE(data.AllReadDataConsumed());
757 EXPECT_TRUE(data.AllWriteDataConsumed());
758}
759
760TEST_F(WebSocketSpdyStreamAdapterTest, Write) {
761 SpdySerializedFrame response_headers(
762 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
763 MockRead reads[] = {CreateMockRead(response_headers, 1),
764 MockRead(ASYNC, 0, 3)};
765 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
766 1, RequestHeaders(), DEFAULT_PRIORITY, false));
767 SpdySerializedFrame data_frame(
Bence Békyd74f4382018-02-20 18:26:19768 spdy_util_.ConstructSpdyDataFrame(1, "foo", false));
Bence Béky29f661602018-02-16 02:45:02769 MockWrite writes[] = {CreateMockWrite(request_headers, 0),
770 CreateMockWrite(data_frame, 2)};
771 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
772 AddSocketData(&data);
773 AddSSLSocketData();
774
775 base::WeakPtr<SpdySession> session = CreateSpdySession();
776 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
777 WebSocketSpdyStreamAdapter adapter(stream, nullptr, net_log_);
778 EXPECT_TRUE(adapter.is_initialized());
779
780 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
781 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
782
783 base::RunLoop().RunUntilIdle();
784
785 auto write_buf = base::MakeRefCounted<StringIOBuffer>("foo");
786 TestCompletionCallback callback;
787 rv = adapter.Write(write_buf.get(), write_buf->size(), callback.callback(),
788 TRAFFIC_ANNOTATION_FOR_TESTS);
789 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
790 rv = callback.WaitForResult();
791 ASSERT_EQ(3, rv);
792
793 // Read EOF.
794 base::RunLoop().RunUntilIdle();
795
796 EXPECT_TRUE(data.AllReadDataConsumed());
797 EXPECT_TRUE(data.AllWriteDataConsumed());
798}
799
800// Test that if both Read() and Write() returns asynchronously,
801// the two callbacks are handled correctly.
802TEST_F(WebSocketSpdyStreamAdapterTest, AsyncReadAndWrite) {
803 SpdySerializedFrame response_headers(
804 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
805 SpdySerializedFrame read_data_frame(
Bence Békyd74f4382018-02-20 18:26:19806 spdy_util_.ConstructSpdyDataFrame(1, "foobar", true));
Bence Béky29f661602018-02-16 02:45:02807 MockRead reads[] = {CreateMockRead(response_headers, 1),
808 CreateMockRead(read_data_frame, 3),
809 MockRead(ASYNC, 0, 4)};
810 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
811 1, RequestHeaders(), DEFAULT_PRIORITY, false));
812 SpdySerializedFrame write_data_frame(
Bence Békyd74f4382018-02-20 18:26:19813 spdy_util_.ConstructSpdyDataFrame(1, "baz", false));
Bence Béky29f661602018-02-16 02:45:02814 MockWrite writes[] = {CreateMockWrite(request_headers, 0),
815 CreateMockWrite(write_data_frame, 2)};
816 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
817 AddSocketData(&data);
818 AddSSLSocketData();
819
820 base::WeakPtr<SpdySession> session = CreateSpdySession();
821 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
822 WebSocketSpdyStreamAdapter adapter(stream, nullptr, net_log_);
823 EXPECT_TRUE(adapter.is_initialized());
824
825 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
826 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
827
828 base::RunLoop().RunUntilIdle();
829
830 const int kReadBufSize = 1024;
831 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
832 TestCompletionCallback read_callback;
833 rv = adapter.Read(read_buf.get(), kReadBufSize, read_callback.callback());
834 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
835
836 auto write_buf = base::MakeRefCounted<StringIOBuffer>("baz");
837 TestCompletionCallback write_callback;
838 rv = adapter.Write(write_buf.get(), write_buf->size(),
839 write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
840 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
841
842 rv = read_callback.WaitForResult();
843 ASSERT_EQ(6, rv);
844 EXPECT_EQ("foobar", base::StringPiece(read_buf->data(), rv));
845
846 rv = write_callback.WaitForResult();
847 ASSERT_EQ(3, rv);
848
849 // Read EOF.
850 base::RunLoop().RunUntilIdle();
851
852 EXPECT_TRUE(data.AllReadDataConsumed());
853 EXPECT_TRUE(data.AllWriteDataConsumed());
854}
855
856// KillerCallback will delete the adapter as part of the callback.
857class KillerCallback : public TestCompletionCallbackBase {
858 public:
859 explicit KillerCallback(std::unique_ptr<WebSocketSpdyStreamAdapter> adapter)
860 : adapter_(std::move(adapter)) {}
861
862 ~KillerCallback() override = default;
863
864 CompletionCallback callback() {
865 return base::Bind(&KillerCallback::OnComplete, base::Unretained(this));
866 }
867
868 private:
869 void OnComplete(int result) {
870 adapter_.reset();
871 SetResult(result);
872 }
873
874 std::unique_ptr<WebSocketSpdyStreamAdapter> adapter_;
875};
876
877TEST_F(WebSocketSpdyStreamAdapterTest, ReadCallbackDestroysAdapter) {
878 SpdySerializedFrame response_headers(
879 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
880 MockRead reads[] = {CreateMockRead(response_headers, 1),
881 MockRead(ASYNC, ERR_IO_PENDING, 2),
882 MockRead(ASYNC, 0, 3)};
883 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
884 1, RequestHeaders(), DEFAULT_PRIORITY, false));
885 MockWrite writes[] = {CreateMockWrite(request_headers, 0)};
886 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
887 AddSocketData(&data);
888 AddSSLSocketData();
889
890 EXPECT_CALL(mock_delegate_, OnHeadersSent());
891 EXPECT_CALL(mock_delegate_, OnHeadersReceived(_));
892
893 base::WeakPtr<SpdySession> session = CreateSpdySession();
894 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
895 auto adapter = std::make_unique<WebSocketSpdyStreamAdapter>(
896 stream, &mock_delegate_, net_log_);
897 EXPECT_TRUE(adapter->is_initialized());
898
899 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
900 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
901
902 // Send headers.
903 base::RunLoop().RunUntilIdle();
904
905 WebSocketSpdyStreamAdapter* adapter_raw = adapter.get();
906 KillerCallback callback(std::move(adapter));
907
908 const int kReadBufSize = 1024;
909 auto read_buf = base::MakeRefCounted<IOBuffer>(kReadBufSize);
910 rv = adapter_raw->Read(read_buf.get(), kReadBufSize, callback.callback());
911 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
912
913 // Read EOF while read is pending. WebSocketSpdyStreamAdapter::OnClose()
914 // should not crash if read callback destroys |adapter|.
915 data.Resume();
916 rv = callback.WaitForResult();
917 EXPECT_THAT(rv, IsError(ERR_CONNECTION_CLOSED));
918
919 base::RunLoop().RunUntilIdle();
920 EXPECT_FALSE(session);
921 EXPECT_FALSE(stream);
922
923 EXPECT_TRUE(data.AllReadDataConsumed());
924 EXPECT_TRUE(data.AllWriteDataConsumed());
925}
926
927TEST_F(WebSocketSpdyStreamAdapterTest, WriteCallbackDestroysAdapter) {
928 SpdySerializedFrame response_headers(
929 spdy_util_.ConstructSpdyResponseHeaders(1, ResponseHeaders(), false));
930 MockRead reads[] = {CreateMockRead(response_headers, 1),
931 MockRead(ASYNC, ERR_IO_PENDING, 2),
932 MockRead(ASYNC, 0, 3)};
933 SpdySerializedFrame request_headers(spdy_util_.ConstructSpdyHeaders(
934 1, RequestHeaders(), DEFAULT_PRIORITY, false));
935 MockWrite writes[] = {CreateMockWrite(request_headers, 0)};
936 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
937 AddSocketData(&data);
938 AddSSLSocketData();
939
940 EXPECT_CALL(mock_delegate_, OnHeadersSent());
941 EXPECT_CALL(mock_delegate_, OnHeadersReceived(_));
942
943 base::WeakPtr<SpdySession> session = CreateSpdySession();
944 base::WeakPtr<SpdyStream> stream = CreateSpdyStream(session);
945 auto adapter = std::make_unique<WebSocketSpdyStreamAdapter>(
946 stream, &mock_delegate_, net_log_);
947 EXPECT_TRUE(adapter->is_initialized());
948
949 int rv = stream->SendRequestHeaders(RequestHeaders(), MORE_DATA_TO_SEND);
950 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
951
952 // Send headers.
953 base::RunLoop().RunUntilIdle();
954
955 WebSocketSpdyStreamAdapter* adapter_raw = adapter.get();
956 KillerCallback callback(std::move(adapter));
957
958 auto write_buf = base::MakeRefCounted<StringIOBuffer>("foo");
959 rv = adapter_raw->Write(write_buf.get(), write_buf->size(),
960 callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS);
961 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
962
963 // Read EOF while write is pending. WebSocketSpdyStreamAdapter::OnClose()
964 // should not crash if write callback destroys |adapter|.
965 data.Resume();
966 rv = callback.WaitForResult();
967 EXPECT_THAT(rv, IsError(ERR_CONNECTION_CLOSED));
968
969 base::RunLoop().RunUntilIdle();
970 EXPECT_FALSE(session);
971 EXPECT_FALSE(stream);
972
973 EXPECT_TRUE(data.AllReadDataConsumed());
974 EXPECT_TRUE(data.AllWriteDataConsumed());
975}
976
Bence Béky7294fc22018-02-08 14:26:17977} // namespace test
978
979} // namespace net