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