| Index: remoting/jingle_glue/jingle_channel_unittest.cc
|
| diff --git a/remoting/jingle_glue/jingle_channel_unittest.cc b/remoting/jingle_glue/jingle_channel_unittest.cc
|
| index 94bb137ca1649de217d46fec97c6e4ca03f24dfd..175d69cad1a7776c6941a041aca0e545d94d1115 100644
|
| --- a/remoting/jingle_glue/jingle_channel_unittest.cc
|
| +++ b/remoting/jingle_glue/jingle_channel_unittest.cc
|
| @@ -3,6 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| #include "base/ref_counted.h"
|
| +#include "base/waitable_event.h"
|
| #include "media/base/data_buffer.h"
|
| #include "remoting/jingle_glue/jingle_channel.h"
|
| #include "remoting/jingle_glue/jingle_thread.h"
|
| @@ -22,7 +23,7 @@ namespace {
|
| const size_t kBufferSize = 100;
|
| } // namespace
|
|
|
| -class MockCallback : public JingleChannel::Callback {
|
| +class MockJingleChannelCallback : public JingleChannel::Callback {
|
| public:
|
| MOCK_METHOD2(OnStateChange, void(JingleChannel*, JingleChannel::State));
|
| MOCK_METHOD2(OnPacketReceived, void(JingleChannel*,
|
| @@ -44,107 +45,146 @@ class MockStream : public talk_base::StreamInterface {
|
| MOCK_METHOD2(PostEvent, void(int, int));
|
| };
|
|
|
| -TEST(JingleChannelTest, Init) {
|
| - JingleThread thread;
|
| -
|
| - MockStream* stream = new MockStream();
|
| - MockCallback callback;
|
| +class JingleChannelTest : public testing::Test {
|
| + public:
|
| + virtual ~JingleChannelTest() { }
|
| +
|
| + // A helper that calls OnStreamEvent(). Need this because we want
|
| + // to call it on the jingle thread.
|
| + static void StreamEvent(JingleChannel* channel,
|
| + talk_base::StreamInterface* stream,
|
| + int event, int error,
|
| + base::WaitableEvent* done_event) {
|
| + channel->OnStreamEvent(stream, event, error);
|
| + if (done_event)
|
| + done_event->Signal();
|
| + }
|
| +
|
| + static void OnClosed(bool* called) {
|
| + *called = true;
|
| + }
|
| +
|
| + protected:
|
| + virtual void SetUp() {
|
| + stream_ = new MockStream(); // Freed by the channel.
|
| + channel_ = new JingleChannel(&callback_);
|
| + channel_->thread_ = &thread_;
|
| + channel_->stream_.reset(stream_);
|
| + }
|
| +
|
| + JingleThread thread_;
|
| + MockStream* stream_;
|
| + MockJingleChannelCallback callback_;
|
| + scoped_refptr<JingleChannel> channel_;
|
| +};
|
|
|
| - EXPECT_CALL(*stream, GetState())
|
| +TEST_F(JingleChannelTest, Init) {
|
| + EXPECT_CALL(*stream_, GetState())
|
| .Times(1)
|
| .WillRepeatedly(Return(talk_base::SS_OPENING));
|
|
|
| - scoped_refptr<JingleChannel> channel = new JingleChannel(&callback);
|
| -
|
| - EXPECT_CALL(callback, OnStateChange(channel.get(), JingleChannel::CONNECTING))
|
| + EXPECT_CALL(callback_, OnStateChange(channel_.get(),
|
| + JingleChannel::CONNECTING))
|
| .Times(1);
|
|
|
| - thread.Start();
|
| + thread_.Start();
|
|
|
| - EXPECT_EQ(JingleChannel::INITIALIZING, channel->state());
|
| - channel->Init(&thread, stream, "user@domain.com");
|
| - EXPECT_EQ(JingleChannel::CONNECTING, channel->state());
|
| - channel->state_ = JingleChannel::CLOSED;
|
| + EXPECT_EQ(JingleChannel::INITIALIZING, channel_->state());
|
| + channel_->Init(&thread_, stream_, "user@domain.com");
|
| + EXPECT_EQ(JingleChannel::CONNECTING, channel_->state());
|
| + channel_->closed_ = true;
|
|
|
| - thread.Stop();
|
| + thread_.Stop();
|
| }
|
|
|
| -TEST(JingleChannelTest, Write) {
|
| - JingleThread thread;
|
| - MockStream* stream = new MockStream(); // Freed by the channel.
|
| - MockCallback callback;
|
| -
|
| +TEST_F(JingleChannelTest, Write) {
|
| scoped_refptr<media::DataBuffer> data = new media::DataBuffer(kBufferSize);
|
| data->SetDataSize(kBufferSize);
|
|
|
| - EXPECT_CALL(*stream, Write(static_cast<const void*>(data->GetData()),
|
| + EXPECT_CALL(*stream_, Write(static_cast<const void*>(data->GetData()),
|
| kBufferSize, _, _))
|
| .WillOnce(DoAll(SetArgumentPointee<2>(kBufferSize),
|
| Return(talk_base::SR_SUCCESS)));
|
|
|
| - scoped_refptr<JingleChannel> channel = new JingleChannel(&callback);
|
| -
|
| - channel->thread_ = &thread;
|
| - channel->stream_.reset(stream);
|
| - channel->state_ = JingleChannel::OPEN;
|
| - thread.Start();
|
| - channel->Write(data);
|
| - thread.Stop();
|
| - channel->state_ = JingleChannel::CLOSED;
|
| + channel_->state_ = JingleChannel::OPEN;
|
| + thread_.Start();
|
| + channel_->Write(data);
|
| + thread_.Stop();
|
| + channel_->closed_ = true;
|
| }
|
|
|
| -TEST(JingleChannelTest, Read) {
|
| - JingleThread thread;
|
| - MockStream* stream = new MockStream(); // Freed by the channel.
|
| - MockCallback callback;
|
| -
|
| +TEST_F(JingleChannelTest, Read) {
|
| scoped_refptr<media::DataBuffer> data = new media::DataBuffer(kBufferSize);
|
| data->SetDataSize(kBufferSize);
|
|
|
| - scoped_refptr<JingleChannel> channel = new JingleChannel(&callback);
|
| -
|
| - EXPECT_CALL(callback, OnPacketReceived(channel.get(), _))
|
| + EXPECT_CALL(callback_, OnPacketReceived(channel_.get(), _))
|
| .Times(1);
|
|
|
| - EXPECT_CALL(*stream, GetAvailable(_))
|
| + EXPECT_CALL(*stream_, GetAvailable(_))
|
| .WillOnce(DoAll(SetArgumentPointee<0>(kBufferSize),
|
| Return(true)))
|
| .WillOnce(DoAll(SetArgumentPointee<0>(0),
|
| Return(true)));
|
|
|
| - EXPECT_CALL(*stream, Read(_, kBufferSize, _, _))
|
| + EXPECT_CALL(*stream_, Read(_, kBufferSize, _, _))
|
| .WillOnce(DoAll(SetArgumentPointee<2>(kBufferSize),
|
| Return(talk_base::SR_SUCCESS)));
|
|
|
| - channel->thread_ = &thread;
|
| - channel->stream_.reset(stream);
|
| - channel->state_ = JingleChannel::OPEN;
|
| - thread.Start();
|
| - channel->OnStreamEvent(stream, talk_base::SE_READ, 0);
|
| - thread.Stop();
|
| - channel->state_ = JingleChannel::CLOSED;
|
| + channel_->state_ = JingleChannel::OPEN;
|
| + thread_.Start();
|
| +
|
| + base::WaitableEvent done_event(true, false);
|
| + thread_.message_loop()->PostTask(FROM_HERE, NewRunnableFunction(
|
| + &JingleChannelTest::StreamEvent, channel_.get(), stream_,
|
| + talk_base::SE_READ, 0, &done_event));
|
| + done_event.Wait();
|
| +
|
| + thread_.Stop();
|
| +
|
| + channel_->closed_ = true;
|
| }
|
|
|
| -TEST(JingleChannelTest, Close) {
|
| - JingleThread thread;
|
| - MockStream* stream = new MockStream(); // Freed by the channel.
|
| - MockCallback callback;
|
| +TEST_F(JingleChannelTest, Close) {
|
| + EXPECT_CALL(*stream_, Close()).Times(1);
|
| + // Don't expect any calls except Close().
|
| + EXPECT_CALL(*stream_, GetAvailable(_)).Times(0);
|
| + EXPECT_CALL(*stream_, Read(_, _, _, _)).Times(0);
|
| + EXPECT_CALL(callback_, OnPacketReceived(_, _)).Times(0);
|
| +
|
| + thread_.Start();
|
| + channel_->Close();
|
| + // Verify that the channel doesn't call callback anymore.
|
| + thread_.message_loop()->PostTask(FROM_HERE, NewRunnableFunction(
|
| + &JingleChannelTest::StreamEvent, channel_.get(), stream_,
|
| + talk_base::SE_READ, 0, static_cast<base::WaitableEvent*>(NULL)));
|
| + thread_.Stop();
|
| +}
|
|
|
| - EXPECT_CALL(*stream, Close())
|
| +TEST_F(JingleChannelTest, ClosedTask) {
|
| + EXPECT_CALL(*stream_, Close())
|
| .Times(1);
|
|
|
| - scoped_refptr<JingleChannel> channel = new JingleChannel(&callback);
|
| -
|
| - channel->thread_ = &thread;
|
| - channel->stream_.reset(stream);
|
| - channel->state_ = JingleChannel::OPEN;
|
| + thread_.Start();
|
| + bool closed = false;
|
| + channel_->Close(NewRunnableFunction(&JingleChannelTest::OnClosed,
|
| + &closed));
|
| + thread_.Stop();
|
| + EXPECT_TRUE(closed);
|
| +}
|
|
|
| - EXPECT_CALL(callback, OnStateChange(channel.get(), JingleChannel::CLOSED))
|
| +TEST_F(JingleChannelTest, DoubleClose) {
|
| + EXPECT_CALL(*stream_, Close())
|
| .Times(1);
|
|
|
| - thread.Start();
|
| - channel->Close();
|
| - thread.Stop();
|
| + thread_.Start();
|
| + bool closed1 = false;
|
| + channel_->Close(NewRunnableFunction(&JingleChannelTest::OnClosed,
|
| + &closed1));
|
| + bool closed2 = false;
|
| + channel_->Close(NewRunnableFunction(&JingleChannelTest::OnClosed,
|
| + &closed2));
|
| + thread_.Stop();
|
| + EXPECT_TRUE(closed1 && closed2);
|
| }
|
|
|
| } // namespace remoting
|
|
|