15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/glue/thread_wrapper.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InvokeWithoutArgs; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint32 kTestMessage1 = 1; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint32 kTestMessage2 = 2; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTestDelayMs1 = 10; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTestDelayMs2 = 20; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTestDelayMs3 = 30; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTestDelayMs4 = 40; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMaxTestDelay = 40; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MockMessageHandler : public rtc::MessageHandler { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOCK_METHOD1(OnMessage, void(rtc::Message* msg)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P3(MatchMessage, handler, message_id, data, "") { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg->phandler == handler && 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg->message_id == message_id && 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arg->pdata == data; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(DeleteMessageData) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete arg0->pdata; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class used in the Dispose test. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeletableObject { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeletableObject(bool* deleted) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : deleted_(deleted) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *deleted = false; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~DeletableObject() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *deleted_ = true; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* deleted_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ThreadWrapperTest : public testing::Test { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is used by the SendDuringSend test. It sends message to the 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // main thread synchronously using Send(). 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PingMainThread() { 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data = new rtc::MessageData(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMessageHandler handler; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler, OnMessage( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler, kTestMessage2, data))) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Send(&handler, kTestMessage2, data); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadWrapperTest() 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : thread_(NULL) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JingleThreadWrapper::EnsureForCurrentMessageLoop(); 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) thread_ = rtc::Thread::Current(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ThreadWrapper destroyes itself when |message_loop_| is destroyed. 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::Thread* thread_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMessageHandler handler1_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMessageHandler handler2_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, Post) { 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data1 = new rtc::MessageData(); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data2 = new rtc::MessageData(); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data3 = new rtc::MessageData(); 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data4 = new rtc::MessageData(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler1_, kTestMessage1, data1); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler1_, kTestMessage2, data2); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler2_, kTestMessage1, data3); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler2_, kTestMessage1, data4); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence in_seq; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, data1))) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage2, data2))) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, data3))) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, data4))) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, PostDelayed) { 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data1 = new rtc::MessageData(); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data2 = new rtc::MessageData(); 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data3 = new rtc::MessageData(); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data4 = new rtc::MessageData(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs1, &handler1_, kTestMessage1, data1); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs2, &handler1_, kTestMessage2, data2); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs3, &handler2_, kTestMessage1, data3); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs4, &handler2_, kTestMessage1, data4); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence in_seq; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, data1))) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage2, data2))) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, data3))) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, data4))) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostDelayedTask( 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::QuitClosure(), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMaxTestDelay)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, Clear) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler1_, kTestMessage1, NULL); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler1_, kTestMessage2, NULL); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler2_, kTestMessage1, NULL); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler2_, kTestMessage2, NULL); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Clear(&handler1_, kTestMessage2); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence in_seq; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* null_data = NULL; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, null_data))) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, null_data))) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage2, null_data))) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, ClearDelayed) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs1, &handler1_, kTestMessage1, NULL); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs2, &handler1_, kTestMessage2, NULL); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs3, &handler2_, kTestMessage1, NULL); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->PostDelayed(kTestDelayMs4, &handler2_, kTestMessage1, NULL); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Clear(&handler1_, kTestMessage2); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence in_seq; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* null_data = NULL; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, null_data))) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, null_data))) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler2_, OnMessage( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler2_, kTestMessage1, null_data))) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostDelayedTask( 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::QuitClosure(), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kMaxTestDelay)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.Run(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the queue is cleared when a handler is destroyed. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, ClearDestoroyed) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMessageHandler* handler_ptr; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockMessageHandler handler; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_ptr = &handler; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Post(&handler, kTestMessage1, NULL); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageList removed; 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) thread_->Clear(handler_ptr, rtc::MQID_ANY, &removed); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(0U, removed.size()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that Send() calls handler synchronously when called on the 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same thread. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, SendSameThread) { 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data = new rtc::MessageData(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, data))) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Send(&handler1_, kTestMessage1, data); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void InitializeWrapperForNewThread(rtc::Thread** thread, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* done_event) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JingleThreadWrapper::EnsureForCurrentMessageLoop(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JingleThreadWrapper::current()->set_send_allowed(true); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thread = JingleThreadWrapper::current(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_event->Signal(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that Send() calls handler synchronously when called for a 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different thread. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, SendToOtherThread) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JingleThreadWrapper::current()->set_send_allowed(true); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread second_thread("JingleThreadWrapperTest"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_thread.Start(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent initialized_event(true, false); 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::Thread* target; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_thread.message_loop()->PostTask( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&InitializeWrapperForNewThread, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &target, &initialized_event)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_event.Wait(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target != NULL); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data = new rtc::MessageData(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, data))) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DeleteMessageData()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Send(&handler1_, kTestMessage1, data); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&handler1_); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that thread handles Send() while another Send() is 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending. The test creates second thread and Send()s kTestMessage1 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to that thread. kTestMessage1 handler calls PingMainThread() which 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tries to Send() kTestMessage2 to the main thread. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, SendDuringSend) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JingleThreadWrapper::current()->set_send_allowed(true); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread second_thread("JingleThreadWrapperTest"); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_thread.Start(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent initialized_event(true, false); 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::Thread* target; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_thread.message_loop()->PostTask( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&InitializeWrapperForNewThread, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &target, &initialized_event)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_event.Wait(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target != NULL); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::MessageData* data = new rtc::MessageData(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler1_, OnMessage( 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(&handler1_, kTestMessage1, data))) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll( 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvokeWithoutArgs( 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, &ThreadWrapperTest::PingMainThread), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteMessageData())); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->Send(&handler1_, kTestMessage1, data); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&handler1_); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThreadWrapperTest, Dispose) { 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool deleted_ = false; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->Dispose(new DeletableObject(&deleted_)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(deleted_); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(deleted_); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace jingle_glue 309