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