summaryrefslogtreecommitdiffstats
path: root/jingle/glue/thread_wrapper_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'jingle/glue/thread_wrapper_unittest.cc')
-rw-r--r--jingle/glue/thread_wrapper_unittest.cc195
1 files changed, 50 insertions, 145 deletions
diff --git a/jingle/glue/thread_wrapper_unittest.cc b/jingle/glue/thread_wrapper_unittest.cc
index 87ef510..20f3648 100644
--- a/jingle/glue/thread_wrapper_unittest.cc
+++ b/jingle/glue/thread_wrapper_unittest.cc
@@ -2,17 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/bind.h"
#include "base/message_loop.h"
-#include "base/threading/thread.h"
#include "jingle/glue/thread_wrapper.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-using ::testing::DoAll;
using ::testing::InSequence;
-using ::testing::InvokeWithoutArgs;
-using ::testing::Mock;
namespace jingle_glue {
@@ -30,100 +25,88 @@ class MockMessageHandler : public talk_base::MessageHandler {
MOCK_METHOD1(OnMessage, void(talk_base::Message* msg));
};
-MATCHER_P3(MatchMessage, handler, message_id, data, "") {
- return arg->phandler == handler &&
- arg->message_id == message_id &&
- arg->pdata == data;
-}
-
-ACTION(DeleteMessageData) {
- delete arg0->pdata;
-}
-
class ThreadWrapperTest : public testing::Test {
- public:
- // This method is used by the SendDuringSend test. It sends message to the
- // main thread synchronously using Send().
- void PingMainThread() {
- talk_base::MessageData* data = new talk_base::MessageData();
- MockMessageHandler handler;
-
- EXPECT_CALL(handler, OnMessage(
- MatchMessage(&handler, kTestMessage2, data)))
- .WillOnce(DeleteMessageData());
- thread_->Send(&handler, kTestMessage2, data);
+ protected:
+ ThreadWrapperTest() {
}
- protected:
- ThreadWrapperTest()
- : thread_(NULL) {
+ talk_base::Thread* thread() {
+ return talk_base::Thread::Current();
}
virtual void SetUp() OVERRIDE {
JingleThreadWrapper::EnsureForCurrentThread();
- thread_ = talk_base::Thread::Current();
}
// ThreadWrapper destroyes itself when |message_loop_| is destroyed.
MessageLoop message_loop_;
- talk_base::Thread* thread_;
MockMessageHandler handler1_;
MockMessageHandler handler2_;
};
+MATCHER_P3(MatchMessage, handler, message_id, data, "") {
+ return arg->phandler == handler &&
+ arg->message_id == message_id &&
+ arg->pdata == data;
+}
+
+ACTION(DeleteMessageData) {
+ delete arg0->pdata;
+}
+
TEST_F(ThreadWrapperTest, Post) {
- talk_base::MessageData* data1 = new talk_base::MessageData();
- talk_base::MessageData* data2 = new talk_base::MessageData();
- talk_base::MessageData* data3 = new talk_base::MessageData();
- talk_base::MessageData* data4 = new talk_base::MessageData();
+ talk_base::MessageData* data1_ = new talk_base::MessageData();
+ talk_base::MessageData* data2_ = new talk_base::MessageData();
+ talk_base::MessageData* data3_ = new talk_base::MessageData();
+ talk_base::MessageData* data4_ = new talk_base::MessageData();
- thread_->Post(&handler1_, kTestMessage1, data1);
- thread_->Post(&handler1_, kTestMessage2, data2);
- thread_->Post(&handler2_, kTestMessage1, data3);
- thread_->Post(&handler2_, kTestMessage1, data4);
+ thread()->Post(&handler1_, kTestMessage1, data1_);
+ thread()->Post(&handler1_, kTestMessage2, data2_);
+ thread()->Post(&handler2_, kTestMessage1, data3_);
+ thread()->Post(&handler2_, kTestMessage1, data4_);
InSequence in_seq;
EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage1, data1)))
+ MatchMessage(&handler1_, kTestMessage1, data1_)))
.WillOnce(DeleteMessageData());
EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage2, data2)))
+ MatchMessage(&handler1_, kTestMessage2, data2_)))
.WillOnce(DeleteMessageData());
EXPECT_CALL(handler2_, OnMessage(
- MatchMessage(&handler2_, kTestMessage1, data3)))
+ MatchMessage(&handler2_, kTestMessage1, data3_)))
.WillOnce(DeleteMessageData());
EXPECT_CALL(handler2_, OnMessage(
- MatchMessage(&handler2_, kTestMessage1, data4)))
+ MatchMessage(&handler2_, kTestMessage1, data4_)))
.WillOnce(DeleteMessageData());
message_loop_.RunAllPending();
}
TEST_F(ThreadWrapperTest, PostDelayed) {
- talk_base::MessageData* data1 = new talk_base::MessageData();
- talk_base::MessageData* data2 = new talk_base::MessageData();
- talk_base::MessageData* data3 = new talk_base::MessageData();
- talk_base::MessageData* data4 = new talk_base::MessageData();
+ talk_base::MessageData* data1_ = new talk_base::MessageData();
+ talk_base::MessageData* data2_ = new talk_base::MessageData();
+ talk_base::MessageData* data3_ = new talk_base::MessageData();
+ talk_base::MessageData* data4_ = new talk_base::MessageData();
- thread_->PostDelayed(kTestDelayMs1, &handler1_, kTestMessage1, data1);
- thread_->PostDelayed(kTestDelayMs2, &handler1_, kTestMessage2, data2);
- thread_->PostDelayed(kTestDelayMs3, &handler2_, kTestMessage1, data3);
- thread_->PostDelayed(kTestDelayMs4, &handler2_, kTestMessage1, data4);
+ thread()->PostDelayed(kTestDelayMs1, &handler1_, kTestMessage1, data1_);
+ thread()->PostDelayed(kTestDelayMs2, &handler1_, kTestMessage2, data2_);
+ thread()->PostDelayed(kTestDelayMs3, &handler2_, kTestMessage1, data3_);
+ thread()->PostDelayed(kTestDelayMs4, &handler2_, kTestMessage1, data4_);
InSequence in_seq;
EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage1, data1)))
+ MatchMessage(&handler1_, kTestMessage1, data1_)))
.WillOnce(DeleteMessageData());
EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage2, data2)))
+ MatchMessage(&handler1_, kTestMessage2, data2_)))
.WillOnce(DeleteMessageData());
EXPECT_CALL(handler2_, OnMessage(
- MatchMessage(&handler2_, kTestMessage1, data3)))
+ MatchMessage(&handler2_, kTestMessage1, data3_)))
.WillOnce(DeleteMessageData());
EXPECT_CALL(handler2_, OnMessage(
- MatchMessage(&handler2_, kTestMessage1, data4)))
+ MatchMessage(&handler2_, kTestMessage1, data4_)))
.WillOnce(DeleteMessageData());
message_loop_.PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask(),
@@ -132,12 +115,12 @@ TEST_F(ThreadWrapperTest, PostDelayed) {
}
TEST_F(ThreadWrapperTest, Clear) {
- thread_->Post(&handler1_, kTestMessage1, NULL);
- thread_->Post(&handler1_, kTestMessage2, NULL);
- thread_->Post(&handler2_, kTestMessage1, NULL);
- thread_->Post(&handler2_, kTestMessage2, NULL);
+ thread()->Post(&handler1_, kTestMessage1, NULL);
+ thread()->Post(&handler1_, kTestMessage2, NULL);
+ thread()->Post(&handler2_, kTestMessage1, NULL);
+ thread()->Post(&handler2_, kTestMessage2, NULL);
- thread_->Clear(&handler1_, kTestMessage2);
+ thread()->Clear(&handler1_, kTestMessage2);
InSequence in_seq;
@@ -156,12 +139,12 @@ TEST_F(ThreadWrapperTest, Clear) {
}
TEST_F(ThreadWrapperTest, ClearDelayed) {
- thread_->PostDelayed(kTestDelayMs1, &handler1_, kTestMessage1, NULL);
- thread_->PostDelayed(kTestDelayMs2, &handler1_, kTestMessage2, NULL);
- thread_->PostDelayed(kTestDelayMs3, &handler2_, kTestMessage1, NULL);
- thread_->PostDelayed(kTestDelayMs4, &handler2_, kTestMessage1, NULL);
+ thread()->PostDelayed(kTestDelayMs1, &handler1_, kTestMessage1, NULL);
+ thread()->PostDelayed(kTestDelayMs2, &handler1_, kTestMessage2, NULL);
+ thread()->PostDelayed(kTestDelayMs3, &handler2_, kTestMessage1, NULL);
+ thread()->PostDelayed(kTestDelayMs4, &handler2_, kTestMessage1, NULL);
- thread_->Clear(&handler1_, kTestMessage2);
+ thread()->Clear(&handler1_, kTestMessage2);
InSequence in_seq;
@@ -187,89 +170,11 @@ TEST_F(ThreadWrapperTest, ClearDestoroyed) {
{
MockMessageHandler handler;
handler_ptr = &handler;
- thread_->Post(&handler, kTestMessage1, NULL);
+ thread()->Post(&handler, kTestMessage1, NULL);
}
talk_base::MessageList removed;
- thread_->Clear(handler_ptr, talk_base::MQID_ANY, &removed);
+ thread()->Clear(handler_ptr, talk_base::MQID_ANY, &removed);
DCHECK_EQ(0U, removed.size());
}
-// Verify that Send() calls handler synchronously when called on the
-// same thread.
-TEST_F(ThreadWrapperTest, SendSameThread) {
- talk_base::MessageData* data = new talk_base::MessageData();
-
- EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage1, data)))
- .WillOnce(DeleteMessageData());
- thread_->Send(&handler1_, kTestMessage1, data);
-}
-
-void InitializeWrapperForNewThread(talk_base::Thread** thread,
- base::WaitableEvent* done_event) {
- JingleThreadWrapper::EnsureForCurrentThread();
- JingleThreadWrapper::current()->set_send_allowed(true);
- *thread = JingleThreadWrapper::current();
- done_event->Signal();
-}
-
-// Verify that Send() calls handler synchronously when called for a
-// different thread.
-TEST_F(ThreadWrapperTest, SendToOtherThread) {
- JingleThreadWrapper::current()->set_send_allowed(true);
-
- base::Thread second_thread("JingleThreadWrapperTest");
- second_thread.Start();
-
- base::WaitableEvent initialized_event(true, false);
- talk_base::Thread* target;
- second_thread.message_loop()->PostTask(
- FROM_HERE, base::Bind(&InitializeWrapperForNewThread,
- &target, &initialized_event));
- initialized_event.Wait();
-
- ASSERT_TRUE(target != NULL);
-
- talk_base::MessageData* data = new talk_base::MessageData();
-
- EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage1, data)))
- .WillOnce(DeleteMessageData());
- target->Send(&handler1_, kTestMessage1, data);
-
- Mock::VerifyAndClearExpectations(&handler1_);
-}
-
-// Verify that thread handles Send() while another Send() is
-// pending. The test creates second thread and Send()s kTestMessage1
-// to that thread. kTestMessage1 handler calls PingMainThread() which
-// tries to Send() kTestMessage2 to the main thread.
-TEST_F(ThreadWrapperTest, SendDuringSend) {
- JingleThreadWrapper::current()->set_send_allowed(true);
-
- base::Thread second_thread("JingleThreadWrapperTest");
- second_thread.Start();
-
- base::WaitableEvent initialized_event(true, false);
- talk_base::Thread* target;
- second_thread.message_loop()->PostTask(
- FROM_HERE, base::Bind(&InitializeWrapperForNewThread,
- &target, &initialized_event));
- initialized_event.Wait();
-
- ASSERT_TRUE(target != NULL);
-
- talk_base::MessageData* data = new talk_base::MessageData();
-
- EXPECT_CALL(handler1_, OnMessage(
- MatchMessage(&handler1_, kTestMessage1, data)))
- .WillOnce(DoAll(
- InvokeWithoutArgs(
- this, &ThreadWrapperTest::PingMainThread),
- DeleteMessageData()));
- target->Send(&handler1_, kTestMessage1, data);
-
- Mock::VerifyAndClearExpectations(&handler1_);
-}
-
} // namespace jingle_glue