1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/socket/socket_test_util.h"
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "testing/platform_test.h"
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "testing/gtest/include/gtest/gtest.h"
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick//-----------------------------------------------------------------------------
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kMsg1[] = "\0hello!\xff";
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kLen1 = arraysize(kMsg1);
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kMsg2[] = "\012345678\0";
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kLen2 = arraysize(kMsg2);
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kMsg3[] = "bye!";
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kLen3 = arraysize(kMsg3);
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // anonymous namespace
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace net {
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass DeterministicSocketDataTest : public PlatformTest {
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DeterministicSocketDataTest();
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TearDown();
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes,
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                  size_t writes_count);
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertSyncReadEquals(const char* data, int len);
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertAsyncReadEquals(const char* data, int len);
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertReadReturns(const char* data, int len, int rv);
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertReadBufferEquals(const char* data, int len);
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertSyncWriteEquals(const char* data, int len);
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertAsyncWriteEquals(const char* data, int len);
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AssertWriteReturns(const char* data, int len, int rv);
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TestCompletionCallback read_callback_;
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TestCompletionCallback write_callback_;
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ClientSocket* sock_;
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<DeterministicSocketData> data_;
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<IOBuffer> read_buf_;
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockConnect connect_data_;
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  GURL url_;
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  HostPortPair endpoint_;
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_refptr<TransportSocketParams> tcp_params_;
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ClientSocketPoolHistograms histograms_;
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DeterministicMockClientSocketFactory socket_factory_;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockTransportClientSocketPool socket_pool_;
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ClientSocketHandle connection_;
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(DeterministicSocketDataTest);
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
64731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickDeterministicSocketDataTest::DeterministicSocketDataTest()
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : read_callback_(),
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      write_callback_(),
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      sock_(NULL),
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      data_(NULL),
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      read_buf_(NULL),
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      connect_data_(false, OK),
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      url_("https://www.google.com"),
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      endpoint_("www.google.com", 443),
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tcp_params_(new TransportSocketParams(endpoint_,
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            LOWEST,
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            url_,
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            false,
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            false)),
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      histograms_(""),
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      socket_pool_(10, 10, &histograms_, &socket_factory_) {
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::TearDown() {
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Empty the current queue.
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MessageLoop::current()->RunAllPending();
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  PlatformTest::TearDown();
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::Initialize(MockRead* reads,
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           size_t reads_count,
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           MockWrite* writes,
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                           size_t writes_count) {
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_ = new DeterministicSocketData(reads, reads_count, writes, writes_count);
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->set_connect_data(connect_data_);
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  socket_factory_.AddSocketDataProvider(data_.get());
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Perform the TCP connect
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(OK,
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            connection_.Init(endpoint_.ToString(),
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                tcp_params_,
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                LOWEST,
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                NULL,
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                reinterpret_cast<TransportClientSocketPool*>(&socket_pool_),
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                BoundNetLog()));
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  sock_ = connection_.socket();
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertSyncReadEquals(const char* data,
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                       int len) {
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read, which will complete immediately
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(data, len, len);
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadBufferEquals(data, len);
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertAsyncReadEquals(const char* data,
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                        int len) {
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read, which will be completed asynchronously
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(data, len, ERR_IO_PENDING);
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(read_callback_.have_result());
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(sock_->IsConnected());
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);  // Runs 1 step, to cause the callbacks to be invoked
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Now the read should complete
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(len, read_callback_.WaitForResult());
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadBufferEquals(data, len);
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertReadReturns(const char* data,
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                    int len, int rv) {
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  read_buf_ = new IOBuffer(len);
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(rv, sock_->Read(read_buf_, len, &read_callback_));
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertReadBufferEquals(const char* data,
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                         int len) {
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(std::string(data, len), std::string(read_buf_->data(), len));
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertSyncWriteEquals(const char* data,
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                         int len) {
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<IOBuffer> buf(new IOBuffer(len));
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  memcpy(buf->data(), data, len);
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the write, which will complete immediately
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(len, sock_->Write(buf, len, &write_callback_));
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertAsyncWriteEquals(const char* data,
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                         int len) {
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read, which will be completed asynchronously
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertWriteReturns(data, len, ERR_IO_PENDING);
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_FALSE(read_callback_.have_result());
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(sock_->IsConnected());
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);  // Runs 1 step, to cause the callbacks to be invoked
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(len, write_callback_.WaitForResult());
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid DeterministicSocketDataTest::AssertWriteReturns(const char* data,
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                     int len, int rv) {
162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<IOBuffer> buf(new IOBuffer(len));
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  memcpy(buf->data(), data, len);
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read, which will complete asynchronously
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(rv, sock_->Write(buf, len, &write_callback_));
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// ----------- Read
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
171731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleSyncReadWhileStopped) {
172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 0),  // Sync Read
174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 1),  // EOF
175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->SetStopped(true);
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(kMsg1, kLen1, ERR_UNEXPECTED);
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
183731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleSyncReadTooEarly) {
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 1),  // Sync Read
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 2),  // EOF
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(2);
192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_FALSE(data_->stopped());
193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(kMsg1, kLen1, ERR_UNEXPECTED);
194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
196731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleSyncRead) {
197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 0),  // Sync Read
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 1),  // EOF
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Make sure we don't stop before we've read all the data
204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
208731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MultipleSyncReads) {
209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 0),  // Sync Read
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg2, kLen2, 1),  // Sync Read
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg3, kLen3, 2),  // Sync Read
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg3, kLen3, 3),  // Sync Read
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg2, kLen2, 4),  // Sync Read
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg3, kLen3, 5),  // Sync Read
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 6),  // Sync Read
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 7),  // EOF
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Make sure we don't stop before we've read all the data
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(10);
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg2, kLen2);
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg3, kLen3);
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg3, kLen3);
228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg2, kLen2);
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg3, kLen3);
230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
233731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleAsyncRead) {
234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, kMsg1, kLen1, 0),  // Async Read
236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 1),  // EOF
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg1, kLen1);
242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
244731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MultipleAsyncReads) {
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg1, kLen1, 0),  // Async Read
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg2, kLen2, 1),  // Async Read
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg3, kLen3, 2),  // Async Read
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg3, kLen3, 3),  // Async Read
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg2, kLen2, 4),  // Async Read
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg3, kLen3, 5),  // Async Read
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg1, kLen1, 6),  // Async Read
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(false, 0, 7),  // EOF
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg1, kLen1);
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg2, kLen2);
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg3, kLen3);
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg3, kLen3);
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg2, kLen2);
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg3, kLen3);
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg1, kLen1);
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
267731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MixedReads) {
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(false, kMsg1, kLen1, 0),  // Sync Read
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg2, kLen2, 1),   // Async Read
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(false, kMsg3, kLen3, 2),  // Sync Read
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg3, kLen3, 3),   // Async Read
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(false, kMsg2, kLen2, 4),  // Sync Read
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(true, kMsg3, kLen3, 5),   // Async Read
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(false, kMsg1, kLen1, 6),  // Sync Read
276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      MockRead(false, 0, 7),  // EOF
277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), NULL, 0);
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg2, kLen2);
284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg3, kLen3);
286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg3, kLen3);
287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg2, kLen2);
289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg3, kLen3);
290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// ----------- Write
295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
296731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleSyncWriteWhileStopped) {
297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 0),  // Sync Read
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->SetStopped(true);
304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertWriteReturns(kMsg1, kLen1, ERR_UNEXPECTED);
305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
307731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleSyncWriteTooEarly) {
308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 1),  // Sync Write
310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(2);
315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_FALSE(data_->stopped());
316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertWriteReturns(kMsg1, kLen1, ERR_UNEXPECTED);
317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
319731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleSyncWrite) {
320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 0),  // Sync Write
322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Make sure we don't stop before we've read all the data
327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg1, kLen1);
329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
331731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MultipleSyncWrites) {
332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 0),  // Sync Write
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg2, kLen2, 1),  // Sync Write
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg3, kLen3, 2),  // Sync Write
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg3, kLen3, 3),  // Sync Write
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg2, kLen2, 4),  // Sync Write
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg3, kLen3, 5),  // Sync Write
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 6),  // Sync Write
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Make sure we don't stop before we've read all the data
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(10);
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg1, kLen1);
347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg2, kLen2);
348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg3, kLen3);
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg3, kLen3);
350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg2, kLen2);
351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg3, kLen3);
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg1, kLen1);
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
355731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, SingleAsyncWrite) {
356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg1, kLen1, 0),  // Async Write
358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg1, kLen1);
363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
365731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MultipleAsyncWrites) {
366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg1, kLen1, 0),  // Async Write
368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg2, kLen2, 1),  // Async Write
369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 2),  // Async Write
370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 3),  // Async Write
371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg2, kLen2, 4),  // Async Write
372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 5),  // Async Write
373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg1, kLen1, 6),  // Async Write
374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg1, kLen1);
379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg2, kLen2);
380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg3, kLen3);
381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg3, kLen3);
382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg2, kLen2);
383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg3, kLen3);
384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg1, kLen1);
385731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
387731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MixedWrites) {
388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 0),  // Sync Write
390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg2, kLen2, 1),   // Async Write
391731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg3, kLen3, 2),  // Sync Write
392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 3),   // Async Write
393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg2, kLen2, 4),  // Sync Write
394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 5),   // Async Write
395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg1, kLen1, 6),  // Sync Write
396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(NULL, 0, writes, arraysize(writes));
399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
400731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg1, kLen1);
402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg2, kLen2);
403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg3, kLen3);
405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg3, kLen3);
406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg2, kLen2);
408731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg3, kLen3);
409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg1, kLen1);
411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// ----------- Mixed Reads and Writes
414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
415731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MixedSyncOperations) {
416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 0),  // Sync Read
418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg2, kLen2, 3),  // Sync Read
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 4),  // EOF
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg2, kLen2, 1),  // Sync Write
424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg3, kLen3, 2),  // Sync Write
425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), writes, arraysize(writes));
428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Make sure we don't stop before we've read/written everything
430731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(10);
431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg2, kLen2);
433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg3, kLen3);
434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg2, kLen2);
435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
437731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, MixedAsyncOperations) {
438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, kMsg1, kLen1, 0),  // Sync Read
440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, kMsg2, kLen2, 3),  // Sync Read
441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, 0, 4),  // EOF
442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg2, kLen2, 1),  // Sync Write
446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 2),  // Sync Write
447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), writes, arraysize(writes));
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg1, kLen1);
452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg2, kLen2);
453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncWriteEquals(kMsg3, kLen3);
454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertAsyncReadEquals(kMsg2, kLen2);
455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
457731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, InterleavedAsyncOperations) {
458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Order of completion is read, write, write, read
459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, kMsg1, kLen1, 0),  // Async Read
461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, kMsg2, kLen2, 3),  // Async Read
462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, 0, 4),  // EOF
463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg2, kLen2, 1),  // Async Write
467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg3, kLen3, 2),  // Async Write
468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), writes, arraysize(writes));
471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the write, which will block until the read completes
473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING);
474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read which will return first
476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(kMsg1, kLen1, ERR_IO_PENDING);
477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);
479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(kLen1, read_callback_.WaitForResult());
480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadBufferEquals(kMsg1, kLen1);
481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);
483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(kLen2, write_callback_.WaitForResult());
484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read, which will block until the write completes
487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(kMsg2, kLen2, ERR_IO_PENDING);
488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the writes which will return first
490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertWriteReturns(kMsg3, kLen3, ERR_IO_PENDING);
491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);
493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(kLen3, write_callback_.WaitForResult());
494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);
496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(kLen2, read_callback_.WaitForResult());
497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadBufferEquals(kMsg2, kLen2);
498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
500731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(DeterministicSocketDataTest, InterleavedMixedOperations) {
501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Order of completion is read, write, write, read
502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockRead reads[] = {
503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, kMsg1, kLen1, 0),  // Sync Read
504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(true, kMsg2, kLen2, 3),   // Async Read
505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockRead(false, 0, 4),  // EOF
506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MockWrite writes[] = {
509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(true, kMsg2, kLen2, 1),   // Async Write
510731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MockWrite(false, kMsg3, kLen3, 2),  // Sync Write
511731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
512731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Initialize(reads, arraysize(reads), writes, arraysize(writes));
514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the write, which will block until the read completes
516731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertWriteReturns(kMsg2, kLen2, ERR_IO_PENDING);
517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the writes which will complete immediately
519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
520731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncReadEquals(kMsg1, kLen1);
521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);
523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(kLen2, write_callback_.WaitForResult());
524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
525731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the read, which will block until the write completes
526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadReturns(kMsg2, kLen2, ERR_IO_PENDING);
527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
528731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Issue the writes which will complete immediately
529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->StopAfter(1);
530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertSyncWriteEquals(kMsg3, kLen3);
531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  data_->RunFor(1);
533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_EQ(kLen2, read_callback_.WaitForResult());
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AssertReadBufferEquals(kMsg2, kLen2);
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace net
538