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