summaryrefslogtreecommitdiffstats
path: root/remoting/jingle_glue/jingle_channel_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/jingle_glue/jingle_channel_unittest.cc')
-rw-r--r--remoting/jingle_glue/jingle_channel_unittest.cc164
1 files changed, 102 insertions, 62 deletions
diff --git a/remoting/jingle_glue/jingle_channel_unittest.cc b/remoting/jingle_glue/jingle_channel_unittest.cc
index 94bb137..175d69c 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