103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/bind.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/message_loop/message_loop.h" 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/run_loop.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/string_piece.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "device/serial/async_waiter.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "device/serial/data_sender.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "device/serial/data_sink_receiver.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "device/serial/data_stream.mojom.h" 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/public/cpp/bindings/interface_ptr.h" 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace device { 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class DataSinkTest : public testing::Test { 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public: 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) enum Event { 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_NONE, 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_READ_BUFFER_READY, 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_CANCEL_RECEIVED, 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_SEND_SUCCESS, 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_SEND_ERROR, 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_CANCEL_COMPLETE, 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EVENT_ERROR, 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DataSinkTest() 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : bytes_sent_(0), 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) send_error_(0), 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) has_send_error_(false), 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cancel_error_(0), 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) seen_connection_error_(false), 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_event_(EVENT_NONE) {} 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void SetUp() OVERRIDE { 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) message_loop_.reset(new base::MessageLoop); 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) mojo::InterfacePtr<serial::DataSink> sink_handle; 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sink_receiver_ = mojo::WeakBindToProxy( 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new DataSinkReceiver( 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&DataSinkTest::OnDataToRead, base::Unretained(this)), 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&DataSinkTest::OnCancel, base::Unretained(this)), 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&DataSinkTest::OnError, base::Unretained(this))), 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &sink_handle); 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sender_.reset(new DataSender(sink_handle.Pass(), kBufferSize, kFatalError)); 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void TearDown() OVERRIDE { 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_.reset(); 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) message_loop_.reset(); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (sink_receiver_.get()) 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(sink_receiver_->HasOneRef()); 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void WaitForEvent(Event event) { 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_event_ = event; 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::RunLoop run_loop; 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) stop_run_loop_ = run_loop.QuitClosure(); 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) run_loop.Run(); 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void EventReceived(Event event) { 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (event == expected_event_ && !stop_run_loop_.is_null()) 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) stop_run_loop_.Run(); 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnError() { 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) seen_connection_error_ = true; 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventReceived(EVENT_ERROR); 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExpectDataAndReadAll(const base::StringPiece& expected_data) { 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectData(expected_data, static_cast<uint32_t>(expected_data.size()), 0); 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExpectData(const base::StringPiece& expected_data, 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint32_t bytes_to_read, 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int32_t error) { 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(bytes_to_read <= static_cast<uint32_t>(expected_data.size())); 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string data; 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) while (data.size() < static_cast<size_t>(expected_data.size())) { 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!read_buffer_) 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(read_buffer_); 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.append(read_buffer_->GetData(), read_buffer_->GetSize()); 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (bytes_to_read <= read_buffer_->GetSize()) { 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (error) 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_->DoneWithError(bytes_to_read, error); 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) else 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_->Done(bytes_to_read); 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_.reset(); 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } else { 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bytes_to_read -= read_buffer_->GetSize(); 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_->Done(read_buffer_->GetSize()); 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_.reset(); 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // If we terminate early, we may not see all of the data. In that case, 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // check that the part we saw matches what we expected. 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (static_cast<uint32_t>(data.size()) < 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static_cast<uint32_t>(expected_data.size()) && 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.size() >= bytes_to_read) { 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_data.substr(0, data.size()), data); 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return; 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_data, data); 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExpectSendSuccess(uint32_t expected_bytes_sent) { 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bytes_sent_ = 0; 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_SEND_SUCCESS); 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_bytes_sent, bytes_sent_); 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(has_send_error_); 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExpectSendError(uint32_t expected_bytes_sent, int32_t expected_error) { 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bytes_sent_ = 0; 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) has_send_error_ = 0; 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) send_error_ = 0; 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_SEND_ERROR); 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_bytes_sent, bytes_sent_); 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(has_send_error_); 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_error, send_error_); 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExpectCancel(int32_t expected_error) { 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cancel_error_ = 0; 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_CANCEL_RECEIVED); 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_error, cancel_error_); 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void ExpectCancelResult() { WaitForEvent(EVENT_CANCEL_COMPLETE); } 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool Send(const base::StringPiece& data) { 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return sender_->Send( 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data, 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&DataSinkTest::OnDataSent, base::Unretained(this)), 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&DataSinkTest::OnSendError, base::Unretained(this))); 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnDataSent(uint32_t bytes_sent) { 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bytes_sent_ = bytes_sent; 14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) has_send_error_ = false; 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventReceived(EVENT_SEND_SUCCESS); 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnSendError(uint32_t bytes_sent, int32_t error) { 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bytes_sent_ = bytes_sent; 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) send_error_ = error; 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) has_send_error_ = true; 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventReceived(EVENT_SEND_ERROR); 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnDataToRead(scoped_ptr<ReadOnlyBuffer> buffer) { 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_ = buffer.Pass(); 15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) read_buffer_contents_ = 16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string(read_buffer_->GetData(), read_buffer_->GetSize()); 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventReceived(EVENT_READ_BUFFER_READY); 16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool Cancel(int32_t error) { 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return sender_->Cancel( 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) error, base::Bind(&DataSinkTest::CancelAck, base::Unretained(this))); 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void CancelAck() { EventReceived(EVENT_CANCEL_COMPLETE); } 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void OnCancel(int32_t error) { 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) cancel_error_ = error; 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventReceived(EVENT_CANCEL_RECEIVED); 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) protected: 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static const int32_t kFatalError; 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static const uint32_t kBufferSize; 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<base::MessageLoop> message_loop_; 18003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Closure stop_run_loop_; 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<DataSinkReceiver> sink_receiver_; 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<DataSender> sender_; 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) uint32_t bytes_sent_; 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int32_t send_error_; 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool has_send_error_; 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int32_t cancel_error_; 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<ReadOnlyBuffer> read_buffer_; 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string read_buffer_contents_; 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool seen_connection_error_; 19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Event expected_event_; 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private: 19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DataSinkTest); 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}; 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const int32_t DataSinkTest::kFatalError = -10; 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const uint32_t DataSinkTest::kBufferSize = 100; 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, Basic) { 20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("a")); 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, LargeSend) { 21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string pattern = "1234567890"; 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string data; 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (uint32_t i = 0; i < kBufferSize; i++) 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.append(pattern); 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send(data)); 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll(data)); 21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(static_cast<uint32_t>(data.size())); 21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, ErrorAndAllData) { 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a", 1, -1)); 22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(1, -1); 22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, ErrorAndPartialData) { 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("ab")); 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("ab", 1, -1)); 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(1, -1); 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("c")); 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, ErrorAndPartialDataAtPacketBoundary) { 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("ab")); 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("ab", 2, -1)); 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(2, -1); 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("c")); 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, ErrorInSecondPacket) { 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("b")); 24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("ab", 2, -1)); 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(1, -1); 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("c")); 25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 25503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 25603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, ErrorBeforeLargeSend) { 25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 25903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string pattern = "123456789"; 26003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string data; 26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (int i = 0; i < 100; i++) 26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) data.append("1234567890"); 26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send(data)); 26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a" + data, 1, -1)); 26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(1, -1); 26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -1); 26703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 26803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, ErrorOnly) { 27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a", 0, -1)); 27203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -1); 27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 27403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("b")); 27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("b")); 27603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, Cancel) { 28003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Check that sends fail until the cancel operation completes. 28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(Send("b")); 28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectCancel(-2)); 28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a", 0, -1)); 28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Check that the error reported by the sink implementation is reported to the 28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // client - not the cancellation error. 28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -1); 29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("c")); 29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 29503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, CancelSinkSucceeds) { 29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("b")); 30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectCancel(-2)); 30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("ab", 1, 0)); 30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(1, -2); 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("c")); 30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 31203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, CancelTwice) { 31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 31403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectCancel(-2)); 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a", 0, -2)); 31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -2); 31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 32003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("b")); 32203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-3)); 32403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectCancel(-3)); 32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("b", 0, -3)); 32603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -3); 32703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 32803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("c")); 33003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 33403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, CancelTwiceWithNoSendBetween) { 33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectCancel(-2)); 33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a", 0, -2)); 34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -2); 34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-3)); 34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("b")); 34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("b")); 34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, CancelDuringError) { 35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("a", 0, -1)); 35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, -1); 35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("a")); 35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("a")); 36003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 36203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 36303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, CancelWithoutSend) { 36403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 36503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 36603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("a")); 36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("a")); 36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(0, cancel_error_); 37103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 37303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, CancelPartialPacket) { 37403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("ab")); 37503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_READ_BUFFER_READY); 37603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-2)); 37703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectCancel(-2)); 37803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectData("ab", 1, -2)); 37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(1, -2); 38003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 38103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 38203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(Send("c")); 38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExpectDataAndReadAll("c")); 38403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendSuccess(1); 38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 38603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 38703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, SinkReceiverShutdown) { 38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send(std::string(kBufferSize * 10, 'b'))); 39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-1)); 39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sink_receiver_->ShutDown(); 39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sink_receiver_ = NULL; 39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, kFatalError); 39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, kFatalError); 39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_FALSE(Send("a")); 39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_FALSE(Cancel(-1)); 39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 39903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSinkTest, SenderShutdown) { 40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send("a")); 40203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Send(std::string(kBufferSize * 10, 'b'))); 40303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ASSERT_TRUE(Cancel(-1)); 40403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sender_.reset(); 40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, kFatalError); 40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectSendError(0, kFatalError); 40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExpectCancelResult(); 40803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!seen_connection_error_) 40903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WaitForEvent(EVENT_ERROR); 41003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(seen_connection_error_); 41103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 41203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 41303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace device 414