1 // Copyright (c) 2012 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/socket/socket_test_util.h" 6 7 #include <string.h> 8 9 #include "base/memory/ref_counted.h" 10 #include "testing/platform_test.h" 11 #include "testing/gtest/include/gtest/gtest.h" 12 13 //----------------------------------------------------------------------------- 14 15 namespace { 16 17 static const char kMsg1[] = "\0hello!\xff"; 18 static const int kLen1 = arraysize(kMsg1); 19 static const char kMsg2[] = "\012345678\0"; 20 static const int kLen2 = arraysize(kMsg2); 21 static const char kMsg3[] = "bye!"; 22 static const int kLen3 = arraysize(kMsg3); 23 24 } // anonymous namespace 25 26 namespace net { 27 28 class DeterministicSocketDataTest : public PlatformTest { 29 public: 30 DeterministicSocketDataTest(); 31 32 virtual void TearDown(); 33 34 void ReentrantReadCallback(int len, int rv); 35 void ReentrantWriteCallback(const char* data, int len, int rv); 36 37 protected: 38 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, 39 size_t writes_count); 40 41 void AssertSyncReadEquals(const char* data, int len); 42 void AssertAsyncReadEquals(const char* data, int len); 43 void AssertReadReturns(const char* data, int len, int rv); 44 void AssertReadBufferEquals(const char* data, int len); 45 46 void AssertSyncWriteEquals(const char* data, int len); 47 void AssertAsyncWriteEquals(const char* data, int len); 48 void AssertWriteReturns(const char* data, int len, int rv); 49 50 TestCompletionCallback read_callback_; 51 TestCompletionCallback write_callback_; 52 StreamSocket* sock_; 53 scoped_ptr<DeterministicSocketData> data_; 54 55 private: 56 scoped_refptr<IOBuffer> read_buf_; 57 MockConnect connect_data_; 58 59 HostPortPair endpoint_; 60 scoped_refptr<TransportSocketParams> tcp_params_; 61 ClientSocketPoolHistograms histograms_; 62 DeterministicMockClientSocketFactory socket_factory_; 63 MockTransportClientSocketPool socket_pool_; 64 ClientSocketHandle connection_; 65 66 DISALLOW_COPY_AND_ASSIGN(DeterministicSocketDataTest); 67 }; 68 69 DeterministicSocketDataTest::DeterministicSocketDataTest() 70 : sock_(NULL), 71 read_buf_(NULL), 72 connect_data_(SYNCHRONOUS, OK), 73 endpoint_("www.google.com", 443), 74 tcp_params_(new TransportSocketParams(endpoint_, 75 false, 76 false, 77 OnHostResolutionCallback())), 78 histograms_(std::string()), 79 socket_pool_(10, 10, &histograms_, &socket_factory_) {} 80 81 void DeterministicSocketDataTest::TearDown() { 82 // Empty the current queue. 83 base::MessageLoop::current()->RunUntilIdle(); 84 PlatformTest::TearDown(); 85 } 86 87 void DeterministicSocketDataTest::Initialize(MockRead* reads, 88 size_t reads_count, 89 MockWrite* writes, 90 size_t writes_count) { 91 data_.reset(new DeterministicSocketData(reads, reads_count, 92 writes, writes_count)); 93 data_->set_connect_data(connect_data_); 94 socket_factory_.AddSocketDataProvider(data_.get()); 95 96 // Perform the TCP connect 97 EXPECT_EQ(OK, 98 connection_.Init(endpoint_.ToString(), 99 tcp_params_, 100 LOWEST, 101 CompletionCallback(), 102 reinterpret_cast<TransportClientSocketPool*>(&socket_pool_), 103 BoundNetLog())); 104 sock_ = connection_.socket(); 105 } 106 107 void DeterministicSocketDataTest::AssertSyncReadEquals(const char* data, 108 int len) { 109 // Issue the read, which will complete immediately 110 AssertReadReturns(data, len, len); 111 AssertReadBufferEquals(data, len); 112 } 113 114 void DeterministicSocketDataTest::AssertAsyncReadEquals(const char* data, 115 int len) { 116 // Issue the read, which will be completed asynchronously 117 AssertReadReturns(data, len, ERR_IO_PENDING); 118 119 EXPECT_FALSE(read_callback_.have_result()); 120 EXPECT_TRUE(sock_->IsConnected()); 121 data_->RunFor(1); // Runs 1 step, to cause the callbacks to be invoked 122 123 // Now the read should complete 124 ASSERT_EQ(len, read_callback_.WaitForResult()); 125 AssertReadBufferEquals(data, len); 126 } 127 128 void DeterministicSocketDataTest::AssertReadReturns(const char* data, 129 int len, int rv) { 130 read_buf_ = new IOBuffer(len); 131 ASSERT_EQ(rv, sock_->Read(read_buf_.get(), len, read_callback_.callback())); 132 } 133 134 void DeterministicSocketDataTest::AssertReadBufferEquals(const char* data, 135 int len) { 136 ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len)); 137 } 138 139 void DeterministicSocketDataTest::AssertSyncWriteEquals(const char* data, 140 int len) { 141 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); 142 memcpy(buf->data(), data, len); 143 144 // Issue the write, which will complete immediately 145 ASSERT_EQ(len, sock_->Write(buf.get(), len, write_callback_.callback())); 146 } 147 148 void DeterministicSocketDataTest::AssertAsyncWriteEquals(const char* data, 149 int len) { 150 // Issue the read, which will be completed asynchronously 151 AssertWriteReturns(data, len, ERR_IO_PENDING); 152 153 EXPECT_FALSE(read_callback_.have_result()); 154 EXPECT_TRUE(sock_->IsConnected()); 155 data_->RunFor(1); // Runs 1 step, to cause the callbacks to be invoked 156 157 ASSERT_EQ(len, write_callback_.WaitForResult()); 158 } 159 160 void DeterministicSocketDataTest::AssertWriteReturns(const char* data, 161 int len, int rv) { 162 scoped_refptr<IOBuffer> buf(new IOBuffer(len)); 163 memcpy(buf->data(), data, len); 164 165 // Issue the read, which will complete asynchronously 166 ASSERT_EQ(rv, sock_->Write(buf.get(), len, write_callback_.callback())); 167 } 168 169 void DeterministicSocketDataTest::ReentrantReadCallback(int len, int rv) { 170 scoped_refptr<IOBuffer> read_buf(new IOBuffer(len)); 171 EXPECT_EQ(len, 172 sock_->Read( 173 read_buf.get(), 174 len, 175 base::Bind(&DeterministicSocketDataTest::ReentrantReadCallback, 176 base::Unretained(this), 177 len))); 178 } 179 180 void DeterministicSocketDataTest::ReentrantWriteCallback( 181 const char* data, int len, int rv) { 182 scoped_refptr<IOBuffer> write_buf(new IOBuffer(len)); 183 memcpy(write_buf->data(), data, len); 184 EXPECT_EQ(len, 185 sock_->Write( 186 write_buf.get(), 187 len, 188 base::Bind(&DeterministicSocketDataTest::ReentrantWriteCallback, 189 base::Unretained(this), 190 data, 191 len))); 192 } 193 194 // ----------- Read 195 196 TEST_F(DeterministicSocketDataTest, SingleSyncReadWhileStopped) { 197 MockRead reads[] = { 198 MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 199 MockRead(SYNCHRONOUS, 0, 1), // EOF 200 }; 201 202 Initialize(reads, arraysize(reads), NULL, 0); 203 204 data_->SetStopped(true); 205 AssertReadReturns(kMsg1, kLen1, ERR_UNEXPECTED); 206 } 207 208 TEST_F(DeterministicSocketDataTest, SingleSyncReadTooEarly) { 209 MockRead reads[] = { 210 MockRead(SYNCHRONOUS, kMsg1, kLen1, 1), // Sync Read 211 MockRead(SYNCHRONOUS, 0, 2), // EOF 212 }; 213 214 MockWrite writes[] = { 215 MockWrite(SYNCHRONOUS, 0, 0) 216 }; 217 218 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 219 220 data_->StopAfter(2); 221 ASSERT_FALSE(data_->stopped()); 222 AssertReadReturns(kMsg1, kLen1, ERR_UNEXPECTED); 223 } 224 225 TEST_F(DeterministicSocketDataTest, SingleSyncRead) { 226 MockRead reads[] = { 227 MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 228 MockRead(SYNCHRONOUS, 0, 1), // EOF 229 }; 230 231 Initialize(reads, arraysize(reads), NULL, 0); 232 // Make sure we don't stop before we've read all the data 233 data_->StopAfter(1); 234 AssertSyncReadEquals(kMsg1, kLen1); 235 } 236 237 TEST_F(DeterministicSocketDataTest, MultipleSyncReads) { 238 MockRead reads[] = { 239 MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 240 MockRead(SYNCHRONOUS, kMsg2, kLen2, 1), // Sync Read 241 MockRead(SYNCHRONOUS, kMsg3, kLen3, 2), // Sync Read 242 MockRead(SYNCHRONOUS, kMsg3, kLen3, 3), // Sync Read 243 MockRead(SYNCHRONOUS, kMsg2, kLen2, 4), // Sync Read 244 MockRead(SYNCHRONOUS, kMsg3, kLen3, 5), // Sync Read 245 MockRead(SYNCHRONOUS, kMsg1, kLen1, 6), // Sync Read 246 MockRead(SYNCHRONOUS, 0, 7), // EOF 247 }; 248 249 Initialize(reads, arraysize(reads), NULL, 0); 250 251 // Make sure we don't stop before we've read all the data 252 data_->StopAfter(10); 253 AssertSyncReadEquals(kMsg1, kLen1); 254 AssertSyncReadEquals(kMsg2, kLen2); 255 AssertSyncReadEquals(kMsg3, kLen3); 256 AssertSyncReadEquals(kMsg3, kLen3); 257 AssertSyncReadEquals(kMsg2, kLen2); 258 AssertSyncReadEquals(kMsg3, kLen3); 259 AssertSyncReadEquals(kMsg1, kLen1); 260 } 261 262 TEST_F(DeterministicSocketDataTest, SingleAsyncRead) { 263 MockRead reads[] = { 264 MockRead(ASYNC, kMsg1, kLen1, 0), // Async Read 265 MockRead(SYNCHRONOUS, 0, 1), // EOF 266 }; 267 268 Initialize(reads, arraysize(reads), NULL, 0); 269 270 AssertAsyncReadEquals(kMsg1, kLen1); 271 } 272 273 TEST_F(DeterministicSocketDataTest, MultipleAsyncReads) { 274 MockRead reads[] = { 275 MockRead(ASYNC, kMsg1, kLen1, 0), // Async Read 276 MockRead(ASYNC, kMsg2, kLen2, 1), // Async Read 277 MockRead(ASYNC, kMsg3, kLen3, 2), // Async Read 278 MockRead(ASYNC, kMsg3, kLen3, 3), // Async Read 279 MockRead(ASYNC, kMsg2, kLen2, 4), // Async Read 280 MockRead(ASYNC, kMsg3, kLen3, 5), // Async Read 281 MockRead(ASYNC, kMsg1, kLen1, 6), // Async Read 282 MockRead(SYNCHRONOUS, 0, 7), // EOF 283 }; 284 285 Initialize(reads, arraysize(reads), NULL, 0); 286 287 AssertAsyncReadEquals(kMsg1, kLen1); 288 AssertAsyncReadEquals(kMsg2, kLen2); 289 AssertAsyncReadEquals(kMsg3, kLen3); 290 AssertAsyncReadEquals(kMsg3, kLen3); 291 AssertAsyncReadEquals(kMsg2, kLen2); 292 AssertAsyncReadEquals(kMsg3, kLen3); 293 AssertAsyncReadEquals(kMsg1, kLen1); 294 } 295 296 TEST_F(DeterministicSocketDataTest, MixedReads) { 297 MockRead reads[] = { 298 MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 299 MockRead(ASYNC, kMsg2, kLen2, 1), // Async Read 300 MockRead(SYNCHRONOUS, kMsg3, kLen3, 2), // Sync Read 301 MockRead(ASYNC, kMsg3, kLen3, 3), // Async Read 302 MockRead(SYNCHRONOUS, kMsg2, kLen2, 4), // Sync Read 303 MockRead(ASYNC, kMsg3, kLen3, 5), // Async Read 304 MockRead(SYNCHRONOUS, kMsg1, kLen1, 6), // Sync Read 305 MockRead(SYNCHRONOUS, 0, 7), // EOF 306 }; 307 308 Initialize(reads, arraysize(reads), NULL, 0); 309 310 data_->StopAfter(1); 311 AssertSyncReadEquals(kMsg1, kLen1); 312 AssertAsyncReadEquals(kMsg2, kLen2); 313 data_->StopAfter(1); 314 AssertSyncReadEquals(kMsg3, kLen3); 315 AssertAsyncReadEquals(kMsg3, kLen3); 316 data_->StopAfter(1); 317 AssertSyncReadEquals(kMsg2, kLen2); 318 AssertAsyncReadEquals(kMsg3, kLen3); 319 data_->StopAfter(1); 320 AssertSyncReadEquals(kMsg1, kLen1); 321 } 322 323 TEST_F(DeterministicSocketDataTest, SyncReadFromCompletionCallback) { 324 MockRead reads[] = { 325 MockRead(ASYNC, kMsg1, kLen1, 0), // Async Read 326 MockRead(SYNCHRONOUS, kMsg2, kLen2, 1), // Sync Read 327 }; 328 329 Initialize(reads, arraysize(reads), NULL, 0); 330 331 data_->StopAfter(2); 332 333 scoped_refptr<IOBuffer> read_buf(new IOBuffer(kLen1)); 334 ASSERT_EQ(ERR_IO_PENDING, 335 sock_->Read( 336 read_buf.get(), 337 kLen1, 338 base::Bind(&DeterministicSocketDataTest::ReentrantReadCallback, 339 base::Unretained(this), 340 kLen2))); 341 data_->Run(); 342 } 343 344 // ----------- Write 345 346 TEST_F(DeterministicSocketDataTest, SingleSyncWriteWhileStopped) { 347 MockWrite writes[] = { 348 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 349 }; 350 351 Initialize(NULL, 0, writes, arraysize(writes)); 352 353 data_->SetStopped(true); 354 AssertWriteReturns(kMsg1, kLen1, ERR_UNEXPECTED); 355 } 356 357 TEST_F(DeterministicSocketDataTest, SingleSyncWriteTooEarly) { 358 MockWrite writes[] = { 359 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 1), // Sync Write 360 }; 361 362 MockRead reads[] = { 363 MockRead(SYNCHRONOUS, 0, 0) 364 }; 365 366 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 367 368 data_->StopAfter(2); 369 ASSERT_FALSE(data_->stopped()); 370 AssertWriteReturns(kMsg1, kLen1, ERR_UNEXPECTED); 371 } 372 373 TEST_F(DeterministicSocketDataTest, SingleSyncWrite) { 374 MockWrite writes[] = { 375 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Write 376 }; 377 378 Initialize(NULL, 0, writes, arraysize(writes)); 379 380 // Make sure we don't stop before we've read all the data 381 data_->StopAfter(1); 382 AssertSyncWriteEquals(kMsg1, kLen1); 383 } 384 385 TEST_F(DeterministicSocketDataTest, MultipleSyncWrites) { 386 MockWrite writes[] = { 387 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Write 388 MockWrite(SYNCHRONOUS, kMsg2, kLen2, 1), // Sync Write 389 MockWrite(SYNCHRONOUS, kMsg3, kLen3, 2), // Sync Write 390 MockWrite(SYNCHRONOUS, kMsg3, kLen3, 3), // Sync Write 391 MockWrite(SYNCHRONOUS, kMsg2, kLen2, 4), // Sync Write 392 MockWrite(SYNCHRONOUS, kMsg3, kLen3, 5), // Sync Write 393 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 6), // Sync Write 394 }; 395 396 Initialize(NULL, 0, writes, arraysize(writes)); 397 398 // Make sure we don't stop before we've read all the data 399 data_->StopAfter(10); 400 AssertSyncWriteEquals(kMsg1, kLen1); 401 AssertSyncWriteEquals(kMsg2, kLen2); 402 AssertSyncWriteEquals(kMsg3, kLen3); 403 AssertSyncWriteEquals(kMsg3, kLen3); 404 AssertSyncWriteEquals(kMsg2, kLen2); 405 AssertSyncWriteEquals(kMsg3, kLen3); 406 AssertSyncWriteEquals(kMsg1, kLen1); 407 } 408 409 TEST_F(DeterministicSocketDataTest, SingleAsyncWrite) { 410 MockWrite writes[] = { 411 MockWrite(ASYNC, kMsg1, kLen1, 0), // Async Write 412 }; 413 414 Initialize(NULL, 0, writes, arraysize(writes)); 415 416 AssertAsyncWriteEquals(kMsg1, kLen1); 417 } 418 419 TEST_F(DeterministicSocketDataTest, MultipleAsyncWrites) { 420 MockWrite writes[] = { 421 MockWrite(ASYNC, kMsg1, kLen1, 0), // Async Write 422 MockWrite(ASYNC, kMsg2, kLen2, 1), // Async Write 423 MockWrite(ASYNC, kMsg3, kLen3, 2), // Async Write 424 MockWrite(ASYNC, kMsg3, kLen3, 3), // Async Write 425 MockWrite(ASYNC, kMsg2, kLen2, 4), // Async Write 426 MockWrite(ASYNC, kMsg3, kLen3, 5), // Async Write 427 MockWrite(ASYNC, kMsg1, kLen1, 6), // Async Write 428 }; 429 430 Initialize(NULL, 0, writes, arraysize(writes)); 431 432 AssertAsyncWriteEquals(kMsg1, kLen1); 433 AssertAsyncWriteEquals(kMsg2, kLen2); 434 AssertAsyncWriteEquals(kMsg3, kLen3); 435 AssertAsyncWriteEquals(kMsg3, kLen3); 436 AssertAsyncWriteEquals(kMsg2, kLen2); 437 AssertAsyncWriteEquals(kMsg3, kLen3); 438 AssertAsyncWriteEquals(kMsg1, kLen1); 439 } 440 441 TEST_F(DeterministicSocketDataTest, MixedWrites) { 442 MockWrite writes[] = { 443 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Write 444 MockWrite(ASYNC, kMsg2, kLen2, 1), // Async Write 445 MockWrite(SYNCHRONOUS, kMsg3, kLen3, 2), // Sync Write 446 MockWrite(ASYNC, kMsg3, kLen3, 3), // Async Write 447 MockWrite(SYNCHRONOUS, kMsg2, kLen2, 4), // Sync Write 448 MockWrite(ASYNC, kMsg3, kLen3, 5), // Async Write 449 MockWrite(SYNCHRONOUS, kMsg1, kLen1, 6), // Sync Write 450 }; 451 452 Initialize(NULL, 0, writes, arraysize(writes)); 453 454 data_->StopAfter(1); 455 AssertSyncWriteEquals(kMsg1, kLen1); 456 AssertAsyncWriteEquals(kMsg2, kLen2); 457 data_->StopAfter(1); 458 AssertSyncWriteEquals(kMsg3, kLen3); 459 AssertAsyncWriteEquals(kMsg3, kLen3); 460 data_->StopAfter(1); 461 AssertSyncWriteEquals(kMsg2, kLen2); 462 AssertAsyncWriteEquals(kMsg3, kLen3); 463 data_->StopAfter(1); 464 AssertSyncWriteEquals(kMsg1, kLen1); 465 } 466 467 TEST_F(DeterministicSocketDataTest, SyncWriteFromCompletionCallback) { 468 MockWrite writes[] = { 469 MockWrite(ASYNC, kMsg1, kLen1, 0), // Async Write 470 MockWrite(SYNCHRONOUS, kMsg2, kLen2, 1), // Sync Write 471 }; 472 473 Initialize(NULL, 0, writes, arraysize(writes)); 474 475 data_->StopAfter(2); 476 477 scoped_refptr<IOBuffer> write_buf(new IOBuffer(kLen1)); 478 memcpy(write_buf->data(), kMsg1, kLen1); 479 ASSERT_EQ(ERR_IO_PENDING, 480 sock_->Write( 481 write_buf.get(), 482 kLen1, 483 base::Bind(&DeterministicSocketDataTest::ReentrantWriteCallback, 484 base::Unretained(this), 485 kMsg2, 486 kLen2))); 487 data_->Run(); 488 } 489 490 // ----------- Mixed Reads and Writes 491 492 TEST_F(DeterministicSocketDataTest, MixedSyncOperations) { 493 MockRead reads[] = { 494 MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 495 MockRead(SYNCHRONOUS, kMsg2, kLen2, 3), // Sync Read 496 MockRead(SYNCHRONOUS, 0, 4), // EOF 497 }; 498 499 MockWrite writes[] = { 500 MockWrite(SYNCHRONOUS, kMsg2, kLen2, 1), // Sync Write 501 MockWrite(SYNCHRONOUS, kMsg3, kLen3, 2), // Sync Write 502 }; 503 504 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 505 506 // Make sure we don't stop before we've read/written everything 507 data_->StopAfter(10); 508 AssertSyncReadEquals(kMsg1, kLen1); 509 AssertSyncWriteEquals(kMsg2, kLen2); 510 AssertSyncWriteEquals(kMsg3, kLen3); 511 AssertSyncReadEquals(kMsg2, kLen2); 512 } 513 514 TEST_F(DeterministicSocketDataTest, MixedAsyncOperations) { 515 MockRead reads[] = { 516 MockRead(ASYNC, kMsg1, kLen1, 0), // Sync Read 517 MockRead(ASYNC, kMsg2, kLen2, 3), // Sync Read 518 MockRead(ASYNC, 0, 4), // EOF 519 }; 520 521 MockWrite writes[] = { 522 MockWrite(ASYNC, kMsg2, kLen2, 1), // Sync Write 523 MockWrite(ASYNC, kMsg3, kLen3, 2), // Sync Write 524 }; 525 526 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 527 528 AssertAsyncReadEquals(kMsg1, kLen1); 529 AssertAsyncWriteEquals(kMsg2, kLen2); 530 AssertAsyncWriteEquals(kMsg3, kLen3); 531 AssertAsyncReadEquals(kMsg2, kLen2); 532 } 533 534 TEST_F(DeterministicSocketDataTest, InterleavedAsyncOperations) { 535 // Order of completion is read, write, write, read 536 MockRead reads[] = { 537 MockRead(ASYNC, kMsg1, kLen1, 0), // Async Read 538 MockRead(ASYNC, kMsg2, kLen2, 3), // Async Read 539 MockRead(ASYNC, 0, 4), // EOF 540 }; 541 542 MockWrite writes[] = { 543 MockWrite(ASYNC, kMsg2, kLen2, 1), // Async Write 544 MockWrite(ASYNC, kMsg3, kLen3, 2), // Async Write 545 }; 546 547 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 548 549 // Issue the write, which will block until the read completes 550 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); 551 552 // Issue the read which will return first 553 AssertReadReturns(kMsg1, kLen1, ERR_IO_PENDING); 554 555 data_->RunFor(1); 556 ASSERT_TRUE(read_callback_.have_result()); 557 ASSERT_EQ(kLen1, read_callback_.WaitForResult()); 558 AssertReadBufferEquals(kMsg1, kLen1); 559 560 data_->RunFor(1); 561 ASSERT_TRUE(write_callback_.have_result()); 562 ASSERT_EQ(kLen2, write_callback_.WaitForResult()); 563 564 data_->StopAfter(1); 565 // Issue the read, which will block until the write completes 566 AssertReadReturns(kMsg2, kLen2, ERR_IO_PENDING); 567 568 // Issue the writes which will return first 569 AssertWriteReturns(kMsg3, kLen3, ERR_IO_PENDING); 570 571 data_->RunFor(1); 572 ASSERT_TRUE(write_callback_.have_result()); 573 ASSERT_EQ(kLen3, write_callback_.WaitForResult()); 574 575 data_->RunFor(1); 576 ASSERT_TRUE(read_callback_.have_result()); 577 ASSERT_EQ(kLen2, read_callback_.WaitForResult()); 578 AssertReadBufferEquals(kMsg2, kLen2); 579 } 580 581 TEST_F(DeterministicSocketDataTest, InterleavedMixedOperations) { 582 // Order of completion is read, write, write, read 583 MockRead reads[] = { 584 MockRead(SYNCHRONOUS, kMsg1, kLen1, 0), // Sync Read 585 MockRead(ASYNC, kMsg2, kLen2, 3), // Async Read 586 MockRead(SYNCHRONOUS, 0, 4), // EOF 587 }; 588 589 MockWrite writes[] = { 590 MockWrite(ASYNC, kMsg2, kLen2, 1), // Async Write 591 MockWrite(SYNCHRONOUS, kMsg3, kLen3, 2), // Sync Write 592 }; 593 594 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 595 596 // Issue the write, which will block until the read completes 597 AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING); 598 599 // Issue the writes which will complete immediately 600 data_->StopAfter(1); 601 AssertSyncReadEquals(kMsg1, kLen1); 602 603 data_->RunFor(1); 604 ASSERT_TRUE(write_callback_.have_result()); 605 ASSERT_EQ(kLen2, write_callback_.WaitForResult()); 606 607 // Issue the read, which will block until the write completes 608 AssertReadReturns(kMsg2, kLen2, ERR_IO_PENDING); 609 610 // Issue the writes which will complete immediately 611 data_->StopAfter(1); 612 AssertSyncWriteEquals(kMsg3, kLen3); 613 614 data_->RunFor(1); 615 ASSERT_TRUE(read_callback_.have_result()); 616 ASSERT_EQ(kLen2, read_callback_.WaitForResult()); 617 AssertReadBufferEquals(kMsg2, kLen2); 618 } 619 620 } // namespace net 621