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

Side by Side Diff: net/socket/socket_bio_adapter_unittest.cc

Issue 2593063003: Add Socket::ReadIfReady() (Closed)
Patch Set: Self Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/socket_bio_adapter.h" 5 #include "net/socket/socket_bio_adapter.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/run_loop.h" 15 #include "base/run_loop.h"
16 #include "base/test/scoped_feature_list.h"
16 #include "crypto/openssl_util.h" 17 #include "crypto/openssl_util.h"
17 #include "net/base/address_list.h" 18 #include "net/base/address_list.h"
18 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
19 #include "net/log/net_log_source.h" 20 #include "net/log/net_log_source.h"
20 #include "net/socket/socket_test_util.h" 21 #include "net/socket/socket_test_util.h"
21 #include "net/socket/stream_socket.h" 22 #include "net/socket/stream_socket.h"
22 #include "net/ssl/openssl_ssl_util.h" 23 #include "net/ssl/openssl_ssl_util.h"
23 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
24 #include "third_party/boringssl/src/include/openssl/bio.h" 25 #include "third_party/boringssl/src/include/openssl/bio.h"
25 #include "third_party/boringssl/src/include/openssl/err.h" 26 #include "third_party/boringssl/src/include/openssl/err.h"
26 #include "third_party/boringssl/src/include/openssl/ssl.h" 27 #include "third_party/boringssl/src/include/openssl/ssl.h"
27 28
28 namespace net { 29 namespace net {
29 30
30 class SocketBIOAdapterTest : public testing::Test, 31 enum ReadIfReadySupport {
32 // ReadIfReady() field trial is enabled, but ReadyIfReady() is unimplemented.
33 READ_IF_READY_ENABLED_SUPPORTED,
34 // ReadIfReady() field trial is enabled, and ReadyIfReady() is implemented.
35 READ_IF_READY_ENABLED_NOT_SUPPORTED,
36 // ReadIfReady() field trial is disabled.
37 READ_IF_READY_DISABLED,
38 };
39
40 class SocketBIOAdapterTest : public testing::TestWithParam<ReadIfReadySupport>,
31 public SocketBIOAdapter::Delegate { 41 public SocketBIOAdapter::Delegate {
32 protected: 42 protected:
43 void SetUp() override {
44 if (GetParam() != READ_IF_READY_DISABLED)
45 scoped_feature_list_.InitAndEnableFeature(Socket::kReadIfReadyExperiment);
46 if (GetParam() == READ_IF_READY_ENABLED_SUPPORTED)
47 factory_.set_enable_read_if_ready(true);
48 }
49
33 std::unique_ptr<StreamSocket> MakeTestSocket(SocketDataProvider* data) { 50 std::unique_ptr<StreamSocket> MakeTestSocket(SocketDataProvider* data) {
34 data->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 51 data->set_connect_data(MockConnect(SYNCHRONOUS, OK));
35 factory_.AddSocketDataProvider(data); 52 factory_.AddSocketDataProvider(data);
36 std::unique_ptr<StreamSocket> socket = factory_.CreateTransportClientSocket( 53 std::unique_ptr<StreamSocket> socket = factory_.CreateTransportClientSocket(
37 AddressList(), nullptr, nullptr, NetLogSource()); 54 AddressList(), nullptr, nullptr, NetLogSource());
38 CHECK_EQ(OK, socket->Connect(net::CompletionCallback())); 55 CHECK_EQ(OK, socket->Connect(net::CompletionCallback()));
39 return socket; 56 return socket;
40 } 57 }
41 58
42 void set_reset_on_write_ready( 59 void set_reset_on_write_ready(
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 132
116 void WaitForBothReady() { 133 void WaitForBothReady() {
117 expect_read_ready_ = true; 134 expect_read_ready_ = true;
118 expect_write_ready_ = true; 135 expect_write_ready_ = true;
119 base::RunLoop().RunUntilIdle(); 136 base::RunLoop().RunUntilIdle();
120 EXPECT_FALSE(expect_read_ready_); 137 EXPECT_FALSE(expect_read_ready_);
121 EXPECT_FALSE(expect_write_ready_); 138 EXPECT_FALSE(expect_write_ready_);
122 } 139 }
123 140
124 // SocketBIOAdapter::Delegate implementation: 141 // SocketBIOAdapter::Delegate implementation:
125 void OnReadReady() override { 142 void OnReadReady(int rv) override {
143 EXPECT_GE(OK, rv);
126 EXPECT_TRUE(expect_read_ready_); 144 EXPECT_TRUE(expect_read_ready_);
127 expect_read_ready_ = false; 145 expect_read_ready_ = false;
128 } 146 }
129 147
130 void OnWriteReady() override { 148 void OnWriteReady(int rv) override {
149 EXPECT_GE(OK, rv);
131 EXPECT_TRUE(expect_write_ready_); 150 EXPECT_TRUE(expect_write_ready_);
132 expect_write_ready_ = false; 151 expect_write_ready_ = false;
133 if (reset_on_write_ready_) 152 if (reset_on_write_ready_)
134 reset_on_write_ready_->reset(); 153 reset_on_write_ready_->reset();
135 } 154 }
136 155
137 private: 156 private:
138 bool expect_read_ready_ = false; 157 bool expect_read_ready_ = false;
139 bool expect_write_ready_ = false; 158 bool expect_write_ready_ = false;
140 MockClientSocketFactory factory_; 159 MockClientSocketFactory factory_;
141 std::unique_ptr<SocketBIOAdapter>* reset_on_write_ready_ = nullptr; 160 std::unique_ptr<SocketBIOAdapter>* reset_on_write_ready_ = nullptr;
161 base::test::ScopedFeatureList scoped_feature_list_;
142 }; 162 };
143 163
164 INSTANTIATE_TEST_CASE_P(/* no prefix */,
165 SocketBIOAdapterTest,
166 testing::Values(READ_IF_READY_ENABLED_SUPPORTED,
167 READ_IF_READY_ENABLED_NOT_SUPPORTED,
168 READ_IF_READY_DISABLED));
169
144 // Test that data can be read synchronously. 170 // Test that data can be read synchronously.
145 TEST_F(SocketBIOAdapterTest, ReadSync) { 171 TEST_P(SocketBIOAdapterTest, ReadSync) {
146 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 172 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
147 173
148 MockRead reads[] = { 174 MockRead reads[] = {
149 MockRead(SYNCHRONOUS, 0, "hello"), MockRead(SYNCHRONOUS, 1, "world"), 175 MockRead(SYNCHRONOUS, 0, "hello"), MockRead(SYNCHRONOUS, 1, "world"),
150 MockRead(SYNCHRONOUS, ERR_CONNECTION_RESET, 2), 176 MockRead(SYNCHRONOUS, ERR_CONNECTION_RESET, 2),
151 }; 177 };
152 178
153 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); 179 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
154 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data); 180 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data);
155 std::unique_ptr<SocketBIOAdapter> adapter = 181 std::unique_ptr<SocketBIOAdapter> adapter =
(...skipping 20 matching lines...) Expand all
176 // The remainder may be consumed in a single BIO_read. 202 // The remainder may be consumed in a single BIO_read.
177 EXPECT_EQ(3, BIO_read(bio, buf, sizeof(buf))); 203 EXPECT_EQ(3, BIO_read(bio, buf, sizeof(buf)));
178 EXPECT_EQ(0, memcmp("rld", buf, 3)); 204 EXPECT_EQ(0, memcmp("rld", buf, 3));
179 EXPECT_FALSE(adapter->HasPendingReadData()); 205 EXPECT_FALSE(adapter->HasPendingReadData());
180 206
181 // The error is available synchoronously. 207 // The error is available synchoronously.
182 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer); 208 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer);
183 } 209 }
184 210
185 // Test that data can be read asynchronously. 211 // Test that data can be read asynchronously.
186 TEST_F(SocketBIOAdapterTest, ReadAsync) { 212 TEST_P(SocketBIOAdapterTest, ReadAsync) {
187 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 213 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
188 214
189 MockRead reads[] = { 215 MockRead reads[] = {
190 MockRead(ASYNC, 0, "hello"), MockRead(ASYNC, 1, "world"), 216 MockRead(ASYNC, 0, "hello"), MockRead(ASYNC, 1, "world"),
191 MockRead(ASYNC, ERR_CONNECTION_RESET, 2), 217 MockRead(ASYNC, ERR_CONNECTION_RESET, 2),
192 }; 218 };
193 219
194 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); 220 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
195 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data); 221 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data);
196 std::unique_ptr<SocketBIOAdapter> adapter = 222 std::unique_ptr<SocketBIOAdapter> adapter =
197 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this); 223 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this);
198 BIO* bio = adapter->bio(); 224 BIO* bio = adapter->bio();
199 EXPECT_FALSE(adapter->HasPendingReadData()); 225 EXPECT_FALSE(adapter->HasPendingReadData());
200 226
201 // Attempt to read data. It will fail but schedule a Read. 227 // Attempt to read data. It will fail but schedule a Read.
202 char buf[10]; 228 char buf[10];
203 ExpectBlockingRead(bio, buf, sizeof(buf)); 229 ExpectBlockingRead(bio, buf, sizeof(buf));
204 EXPECT_FALSE(adapter->HasPendingReadData()); 230 EXPECT_FALSE(adapter->HasPendingReadData());
205 231
206 // After waiting, the data is available. 232 // After waiting, the data is available if Read() is used.
207 WaitForReadReady(); 233 WaitForReadReady();
208 EXPECT_TRUE(adapter->HasPendingReadData()); 234 if (GetParam() == READ_IF_READY_ENABLED_SUPPORTED) {
235 EXPECT_FALSE(adapter->HasPendingReadData());
236 } else {
237 EXPECT_TRUE(adapter->HasPendingReadData());
238 }
209 239
210 // The first read is now available synchronously. 240 // The first read is now available synchronously.
211 EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf))); 241 EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf)));
212 EXPECT_EQ(0, memcmp("hello", buf, 5)); 242 EXPECT_EQ(0, memcmp("hello", buf, 5));
213 EXPECT_FALSE(adapter->HasPendingReadData()); 243 EXPECT_FALSE(adapter->HasPendingReadData());
214 244
215 // The adapter does not schedule another Read until BIO_read is next called. 245 // The adapter does not schedule another Read until BIO_read is next called.
216 base::RunLoop().RunUntilIdle(); 246 base::RunLoop().RunUntilIdle();
217 EXPECT_FALSE(adapter->HasPendingReadData()); 247 EXPECT_FALSE(adapter->HasPendingReadData());
218 248
219 // This time, under-request the data. The adapter should still read the full 249 // This time, under-request the data. The adapter should still read the full
220 // amount. 250 // amount.
221 ExpectBlockingRead(bio, buf, 1); 251 ExpectBlockingRead(bio, buf, 1);
222 EXPECT_FALSE(adapter->HasPendingReadData()); 252 EXPECT_FALSE(adapter->HasPendingReadData());
253
254 // After waiting, the data is available if Read() is used.
223 WaitForReadReady(); 255 WaitForReadReady();
224 EXPECT_TRUE(adapter->HasPendingReadData()); 256 if (GetParam() == READ_IF_READY_ENABLED_SUPPORTED) {
257 EXPECT_FALSE(adapter->HasPendingReadData());
258 } else {
259 EXPECT_TRUE(adapter->HasPendingReadData());
260 }
225 261
226 // The next read is now available synchronously. 262 // The next read is now available synchronously.
227 EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf))); 263 EXPECT_EQ(5, BIO_read(bio, buf, sizeof(buf)));
228 EXPECT_EQ(0, memcmp("world", buf, 5)); 264 EXPECT_EQ(0, memcmp("world", buf, 5));
229 EXPECT_FALSE(adapter->HasPendingReadData()); 265 EXPECT_FALSE(adapter->HasPendingReadData());
230 266
231 // The error is not yet available. 267 // The error is not yet available.
232 ExpectBlockingRead(bio, buf, sizeof(buf)); 268 ExpectBlockingRead(bio, buf, sizeof(buf));
233 WaitForReadReady(); 269 WaitForReadReady();
234 270
235 // The error is now available synchoronously. 271 // The error is now available synchoronously.
236 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer); 272 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer);
237 } 273 }
238 274
239 // Test that synchronous EOF is mapped to ERR_CONNECTION_CLOSED. 275 // Test that synchronous EOF is mapped to ERR_CONNECTION_CLOSED.
240 TEST_F(SocketBIOAdapterTest, ReadEOFSync) { 276 TEST_P(SocketBIOAdapterTest, ReadEOFSync) {
241 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 277 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
242 278
243 MockRead reads[] = { 279 MockRead reads[] = {
244 MockRead(SYNCHRONOUS, 0, 0), 280 MockRead(SYNCHRONOUS, 0, 0),
245 }; 281 };
246 282
247 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); 283 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
248 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data); 284 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data);
249 std::unique_ptr<SocketBIOAdapter> adapter = 285 std::unique_ptr<SocketBIOAdapter> adapter =
250 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this); 286 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this);
251 287
252 ExpectReadError(adapter->bio(), ERR_CONNECTION_CLOSED, tracer); 288 ExpectReadError(adapter->bio(), ERR_CONNECTION_CLOSED, tracer);
253 } 289 }
254 290
255 // Test that asynchronous EOF is mapped to ERR_CONNECTION_CLOSED. 291 // Test that asynchronous EOF is mapped to ERR_CONNECTION_CLOSED.
256 TEST_F(SocketBIOAdapterTest, ReadEOFAsync) { 292 TEST_P(SocketBIOAdapterTest, ReadEOFAsync) {
257 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 293 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
258 294
259 MockRead reads[] = { 295 MockRead reads[] = {
260 MockRead(ASYNC, 0, 0), 296 MockRead(ASYNC, 0, 0),
261 }; 297 };
262 298
263 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); 299 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
264 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data); 300 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data);
265 std::unique_ptr<SocketBIOAdapter> adapter = 301 std::unique_ptr<SocketBIOAdapter> adapter =
266 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this); 302 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this);
267 303
268 char buf; 304 char buf;
269 ExpectBlockingRead(adapter->bio(), &buf, 1); 305 ExpectBlockingRead(adapter->bio(), &buf, 1);
270 WaitForReadReady(); 306 WaitForReadReady();
271 ExpectReadError(adapter->bio(), ERR_CONNECTION_CLOSED, tracer); 307 ExpectReadError(adapter->bio(), ERR_CONNECTION_CLOSED, tracer);
272 } 308 }
273 309
274 // Test that data can be written synchronously. 310 // Test that data can be written synchronously.
275 TEST_F(SocketBIOAdapterTest, WriteSync) { 311 TEST_P(SocketBIOAdapterTest, WriteSync) {
276 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 312 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
277 313
278 MockWrite writes[] = { 314 MockWrite writes[] = {
279 MockWrite(SYNCHRONOUS, 0, "hello"), 315 MockWrite(SYNCHRONOUS, 0, "hello"),
280 MockWrite(SYNCHRONOUS, 1, "wor"), 316 MockWrite(SYNCHRONOUS, 1, "wor"),
281 MockWrite(SYNCHRONOUS, 2, "ld"), 317 MockWrite(SYNCHRONOUS, 2, "ld"),
282 MockWrite(SYNCHRONOUS, 3, "helloworld"), 318 MockWrite(SYNCHRONOUS, 3, "helloworld"),
283 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 4), 319 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 4),
284 }; 320 };
285 321
(...skipping 14 matching lines...) Expand all
300 336
301 // Writing "aaaaa" fails (event 4), but there is a write buffer, so errors 337 // Writing "aaaaa" fails (event 4), but there is a write buffer, so errors
302 // are delayed. 338 // are delayed.
303 EXPECT_EQ(5, BIO_write(bio, "aaaaa", 5)); 339 EXPECT_EQ(5, BIO_write(bio, "aaaaa", 5));
304 340
305 // However once the error is registered, subsequent writes fail. 341 // However once the error is registered, subsequent writes fail.
306 ExpectWriteError(bio, ERR_CONNECTION_RESET, tracer); 342 ExpectWriteError(bio, ERR_CONNECTION_RESET, tracer);
307 } 343 }
308 344
309 // Test that data can be written asynchronously. 345 // Test that data can be written asynchronously.
310 TEST_F(SocketBIOAdapterTest, WriteAsync) { 346 TEST_P(SocketBIOAdapterTest, WriteAsync) {
311 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 347 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
312 348
313 MockWrite writes[] = { 349 MockWrite writes[] = {
314 MockWrite(ASYNC, 0, "aaa"), 350 MockWrite(ASYNC, 0, "aaa"),
315 MockWrite(ASYNC, ERR_IO_PENDING, 1), // pause 351 MockWrite(ASYNC, ERR_IO_PENDING, 1), // pause
316 MockWrite(ASYNC, 2, "aabbbbb"), 352 MockWrite(ASYNC, 2, "aabbbbb"),
317 MockWrite(ASYNC, 3, "ccc"), 353 MockWrite(ASYNC, 3, "ccc"),
318 MockWrite(ASYNC, 4, "ddd"), 354 MockWrite(ASYNC, 4, "ddd"),
319 MockWrite(ASYNC, ERR_IO_PENDING, 5), // pause 355 MockWrite(ASYNC, ERR_IO_PENDING, 5), // pause
320 MockWrite(ASYNC, 6, "dd"), 356 MockWrite(ASYNC, 6, "dd"),
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 EXPECT_EQ(5, BIO_write(bio, "hhhhh", 5)); 465 EXPECT_EQ(5, BIO_write(bio, "hhhhh", 5));
430 466
431 // Release the write error (event 14). At this point future BIO_write calls 467 // Release the write error (event 14). At this point future BIO_write calls
432 // fail. The buffer was not full, so OnWriteReady is not signalled. 468 // fail. The buffer was not full, so OnWriteReady is not signalled.
433 base::RunLoop().RunUntilIdle(); 469 base::RunLoop().RunUntilIdle();
434 ExpectWriteError(bio, ERR_CONNECTION_RESET, tracer); 470 ExpectWriteError(bio, ERR_CONNECTION_RESET, tracer);
435 } 471 }
436 472
437 // Test that a failed socket write is reported through BIO_read and prevents it 473 // Test that a failed socket write is reported through BIO_read and prevents it
438 // from scheduling a socket read. See https://crbug.com/249848. 474 // from scheduling a socket read. See https://crbug.com/249848.
439 TEST_F(SocketBIOAdapterTest, WriteStopsRead) { 475 TEST_P(SocketBIOAdapterTest, WriteStopsRead) {
440 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 476 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
441 477
442 MockWrite writes[] = { 478 MockWrite writes[] = {
443 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 0), 479 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 0),
444 }; 480 };
445 481
446 SequencedSocketData data(nullptr, 0, writes, arraysize(writes)); 482 SequencedSocketData data(nullptr, 0, writes, arraysize(writes));
447 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data); 483 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data);
448 std::unique_ptr<SocketBIOAdapter> adapter = 484 std::unique_ptr<SocketBIOAdapter> adapter =
449 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this); 485 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this);
450 BIO* bio = adapter->bio(); 486 BIO* bio = adapter->bio();
451 487
452 // The write fails, but there is a write buffer, so errors are delayed. 488 // The write fails, but there is a write buffer, so errors are delayed.
453 EXPECT_EQ(5, BIO_write(bio, "aaaaa", 5)); 489 EXPECT_EQ(5, BIO_write(bio, "aaaaa", 5));
454 490
455 // The write error is surfaced out of BIO_read. There are no MockReads, so 491 // The write error is surfaced out of BIO_read. There are no MockReads, so
456 // this also tests that no socket reads are attempted. 492 // this also tests that no socket reads are attempted.
457 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer); 493 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer);
458 } 494 }
459 495
460 // Test that a synchronous failed socket write interrupts a blocked 496 // Test that a synchronous failed socket write interrupts a blocked
461 // BIO_read. See https://crbug.com/249848. 497 // BIO_read. See https://crbug.com/249848.
462 TEST_F(SocketBIOAdapterTest, SyncWriteInterruptsRead) { 498 TEST_P(SocketBIOAdapterTest, SyncWriteInterruptsRead) {
463 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 499 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
464 500
465 MockRead reads[] = { 501 MockRead reads[] = {
466 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0), 502 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
467 }; 503 };
468 504
469 MockWrite writes[] = { 505 MockWrite writes[] = {
470 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 1), 506 MockWrite(SYNCHRONOUS, ERR_CONNECTION_RESET, 1),
471 }; 507 };
472 508
(...skipping 12 matching lines...) Expand all
485 521
486 // The write error triggers OnReadReady. 522 // The write error triggers OnReadReady.
487 WaitForReadReady(); 523 WaitForReadReady();
488 524
489 // The write error is surfaced out of BIO_read. 525 // The write error is surfaced out of BIO_read.
490 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer); 526 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer);
491 } 527 }
492 528
493 // Test that an asynchronous failed socket write interrupts a blocked 529 // Test that an asynchronous failed socket write interrupts a blocked
494 // BIO_read. See https://crbug.com/249848. 530 // BIO_read. See https://crbug.com/249848.
495 TEST_F(SocketBIOAdapterTest, AsyncWriteInterruptsRead) { 531 TEST_P(SocketBIOAdapterTest, AsyncWriteInterruptsRead) {
496 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 532 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
497 533
498 MockRead reads[] = { 534 MockRead reads[] = {
499 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0), 535 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
500 }; 536 };
501 537
502 MockWrite writes[] = { 538 MockWrite writes[] = {
503 MockWrite(ASYNC, ERR_CONNECTION_RESET, 1), 539 MockWrite(ASYNC, ERR_CONNECTION_RESET, 1),
504 }; 540 };
505 541
(...skipping 14 matching lines...) Expand all
520 // OnReadReady is signaled. The write buffer was not full, so OnWriteReady is 556 // OnReadReady is signaled. The write buffer was not full, so OnWriteReady is
521 // not signaled. 557 // not signaled.
522 WaitForReadReady(); 558 WaitForReadReady();
523 559
524 // The write error is surfaced out of BIO_read. 560 // The write error is surfaced out of BIO_read.
525 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer); 561 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer);
526 } 562 }
527 563
528 // Test that an asynchronous failed socket write interrupts a blocked BIO_read, 564 // Test that an asynchronous failed socket write interrupts a blocked BIO_read,
529 // signaling both if the buffer was full. See https://crbug.com/249848. 565 // signaling both if the buffer was full. See https://crbug.com/249848.
530 TEST_F(SocketBIOAdapterTest, AsyncWriteInterruptsBoth) { 566 TEST_P(SocketBIOAdapterTest, AsyncWriteInterruptsBoth) {
531 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 567 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
532 568
533 MockRead reads[] = { 569 MockRead reads[] = {
534 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0), 570 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
535 }; 571 };
536 572
537 MockWrite writes[] = { 573 MockWrite writes[] = {
538 MockWrite(ASYNC, ERR_CONNECTION_RESET, 1), 574 MockWrite(ASYNC, ERR_CONNECTION_RESET, 1),
539 }; 575 };
540 576
(...skipping 14 matching lines...) Expand all
555 // OnReadReady is signaled. The write buffer was full, so both OnWriteReady is 591 // OnReadReady is signaled. The write buffer was full, so both OnWriteReady is
556 // also signaled. 592 // also signaled.
557 WaitForBothReady(); 593 WaitForBothReady();
558 594
559 // The write error is surfaced out of BIO_read. 595 // The write error is surfaced out of BIO_read.
560 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer); 596 ExpectReadError(bio, ERR_CONNECTION_RESET, tracer);
561 } 597 }
562 598
563 // Test that SocketBIOAdapter handles OnWriteReady deleting itself when both 599 // Test that SocketBIOAdapter handles OnWriteReady deleting itself when both
564 // need to be signaled. 600 // need to be signaled.
565 TEST_F(SocketBIOAdapterTest, DeleteOnWriteReady) { 601 TEST_P(SocketBIOAdapterTest, DeleteOnWriteReady) {
566 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 602 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
567 603
568 MockRead reads[] = { 604 MockRead reads[] = {
569 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0), 605 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0),
570 }; 606 };
571 607
572 MockWrite writes[] = { 608 MockWrite writes[] = {
573 MockWrite(ASYNC, ERR_CONNECTION_RESET, 1), 609 MockWrite(ASYNC, ERR_CONNECTION_RESET, 1),
574 }; 610 };
575 611
(...skipping 12 matching lines...) Expand all
588 // Both OnWriteReady and OnReadReady would be signaled, but OnWriteReady 624 // Both OnWriteReady and OnReadReady would be signaled, but OnWriteReady
589 // deletes the adapter first. 625 // deletes the adapter first.
590 set_reset_on_write_ready(&adapter); 626 set_reset_on_write_ready(&adapter);
591 WaitForWriteReady(nullptr); 627 WaitForWriteReady(nullptr);
592 628
593 EXPECT_FALSE(adapter); 629 EXPECT_FALSE(adapter);
594 } 630 }
595 631
596 // Test that using a BIO after the underlying adapter is destroyed fails 632 // Test that using a BIO after the underlying adapter is destroyed fails
597 // gracefully. 633 // gracefully.
598 TEST_F(SocketBIOAdapterTest, Detached) { 634 TEST_P(SocketBIOAdapterTest, Detached) {
599 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 635 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
600 636
601 SequencedSocketData data(nullptr, 0, nullptr, 0); 637 SequencedSocketData data(nullptr, 0, nullptr, 0);
602 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data); 638 std::unique_ptr<StreamSocket> socket = MakeTestSocket(&data);
603 std::unique_ptr<SocketBIOAdapter> adapter = 639 std::unique_ptr<SocketBIOAdapter> adapter =
604 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this); 640 base::MakeUnique<SocketBIOAdapter>(socket.get(), 100, 100, this);
605 641
606 // Retain an additional reference to the BIO. 642 // Retain an additional reference to the BIO.
607 bssl::UniquePtr<BIO> bio(adapter->bio()); 643 bssl::UniquePtr<BIO> bio(adapter->bio());
608 BIO_up_ref(bio.get()); 644 BIO_up_ref(bio.get());
609 645
610 // Release the adapter. 646 // Release the adapter.
611 adapter.reset(); 647 adapter.reset();
612 648
613 ExpectReadError(bio.get(), ERR_UNEXPECTED, tracer); 649 ExpectReadError(bio.get(), ERR_UNEXPECTED, tracer);
614 ExpectWriteError(bio.get(), ERR_UNEXPECTED, tracer); 650 ExpectWriteError(bio.get(), ERR_UNEXPECTED, tracer);
615 } 651 }
616 652
617 } // namespace net 653 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698