15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "build/build_config.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/pickle.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/thread.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_message.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_test_base.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Get basic type definitions. 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define IPC_MESSAGE_IMPL 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/ipc_channel_proxy_unittest_messages.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Generate constructors. 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/struct_constructor_macros.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/ipc_channel_proxy_unittest_messages.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Generate destructors. 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/struct_destructor_macros.h" 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/ipc_channel_proxy_unittest_messages.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Generate param traits write methods. 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/param_traits_write_macros.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace IPC { 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/ipc_channel_proxy_unittest_messages.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace IPC 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Generate param traits read methods. 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/param_traits_read_macros.h" 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace IPC { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/ipc_channel_proxy_unittest_messages.h" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace IPC 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Generate param traits log methods. 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/param_traits_log_macros.h" 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace IPC { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ipc/ipc_channel_proxy_unittest_messages.h" 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace IPC 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuitListener : public IPC::Listener { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) QuitListener() : bad_message_received_(false) {} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~QuitListener() {} 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(QuitListener, message) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnBadMessageReceived(const IPC::Message& message) OVERRIDE { 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bad_message_received_ = true; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnQuit() { 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnBadMessage(const BadType& bad_type) { 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Should never be called since IPC wouldn't be deserialized correctly. 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CHECK(false); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool bad_message_received_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ChannelReflectorListener : public IPC::Listener { 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChannelReflectorListener() : channel_(NULL) {} 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ChannelReflectorListener() {} 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Init(IPC::Channel* channel) { 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!channel_); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_ = channel; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(ChannelReflectorListener, message) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(TestMsg_Bounce, OnTestBounce) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(TestMsg_SendBadMessage, OnSendBadMessage) 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(UtilityMsg_Bounce, OnUtilityBounce) 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerMsg_Bounce, OnBounce) 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit) 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnTestBounce() { 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_->Send(new TestMsg_Bounce()); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnSendBadMessage() { 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_->Send(new TestMsg_BadMessage(BadType())); 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnUtilityBounce() { 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_->Send(new UtilityMsg_Bounce()); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnBounce() { 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_->Send(new WorkerMsg_Bounce()); 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnQuit() { 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_->Send(new WorkerMsg_Quit()); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::Channel* channel_; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MessageCountFilter : public IPC::MessageFilter { 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch enum FilterEvent { 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NONE, 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FILTER_ADDED, 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CHANNEL_CONNECTED, 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CHANNEL_ERROR, 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CHANNEL_CLOSING, 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FILTER_REMOVED 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }; 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MessageCountFilter() 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : messages_received_(0), 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supported_message_class_(0), 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_global_filter_(true), 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_(NONE), 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_filtering_enabled_(false) {} 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MessageCountFilter(uint32 supported_message_class) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : messages_received_(0), 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supported_message_class_(supported_message_class), 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_global_filter_(false), 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_(NONE), 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_filtering_enabled_(false) {} 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE { 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(sender); 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(NONE, last_filter_event_); 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_ = FILTER_ADDED; 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void OnChannelConnected(int32_t peer_pid) OVERRIDE { 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(FILTER_ADDED, last_filter_event_); 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_NE(static_cast<int32_t>(base::kNullProcessId), peer_pid); 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_ = CHANNEL_CONNECTED; 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void OnChannelError() OVERRIDE { 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_); 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_ = CHANNEL_ERROR; 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void OnChannelClosing() OVERRIDE { 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We may or may not have gotten OnChannelError; if not, the last event has 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // to be OnChannelConnected. 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (last_filter_event_ != CHANNEL_ERROR) 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_); 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_ = CHANNEL_CLOSING; 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnFilterRemoved() OVERRIDE { 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // If the channel didn't get a chance to connect, we might see the 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // OnFilterRemoved event with no other events preceding it. We still want 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // OnFilterRemoved to be called to allow for deleting the Filter. 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (last_filter_event_ != NONE) 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(CHANNEL_CLOSING, last_filter_event_); 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch last_filter_event_ = FILTER_REMOVED; 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We should always get the OnFilterAdded and OnChannelConnected events 1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // prior to any messages. 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_); 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!is_global_filter_) { 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message)); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++messages_received_; 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!message_filtering_enabled_) 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool handled = true; 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(MessageCountFilter, message) 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage) 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return handled; 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnBadMessage(const BadType& bad_type) { 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Should never be called since IPC wouldn't be deserialized correctly. 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CHECK(false); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool GetSupportedMessageClasses( 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<uint32>* supported_message_classes) const OVERRIDE { 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (is_global_filter_) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) supported_message_classes->push_back(supported_message_class_); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_message_filtering_enabled(bool enabled) { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_filtering_enabled_ = enabled; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t messages_received() const { return messages_received_; } 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FilterEvent last_filter_event() const { return last_filter_event_; } 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~MessageCountFilter() {} 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t messages_received_; 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 supported_message_class_; 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_global_filter_; 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FilterEvent last_filter_event_; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool message_filtering_enabled_; 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IPCChannelProxyTest : public IPCTestBase { 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPCChannelProxyTest() {} 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~IPCChannelProxyTest() {} 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPCTestBase::SetUp(); 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Init("ChannelProxyClient"); 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) thread_.reset(new base::Thread("ChannelProxyTestServerThread")); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Thread::Options options; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.message_loop_type = base::MessageLoop::TYPE_IO; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) thread_->StartWithOptions(options); 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener_.reset(new QuitListener()); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateChannelProxy(listener_.get(), thread_->message_loop_proxy().get()); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(StartClient()); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TearDown() { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DestroyChannelProxy(); 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) thread_.reset(); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener_.reset(); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPCTestBase::TearDown(); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SendQuitMessageAndWaitForIdle() { 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new WorkerMsg_Quit); 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->Run(); 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(WaitForClientShutdown()); 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool DidListenerGetBadMessage() { 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return listener_->bad_message_received_; 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::Thread> thread_; 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<QuitListener> listener_; 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IPCChannelProxyTest, MessageClassFilters) { 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Construct a filter per message class. 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<scoped_refptr<MessageCountFilter> > class_filters; 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class_filters.push_back(make_scoped_refptr( 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MessageCountFilter(TestMsgStart))); 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class_filters.push_back(make_scoped_refptr( 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MessageCountFilter(UtilityMsgStart))); 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < class_filters.size(); ++i) 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_proxy()->AddFilter(class_filters[i].get()); 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Send a message for each class; each filter should receive just one message. 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new TestMsg_Bounce()); 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new UtilityMsg_Bounce()); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Send some messages not assigned to a specific or valid message class. 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new WorkerMsg_Bounce); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Each filter should have received just the one sent message of the 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // corresponding class. 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendQuitMessageAndWaitForIdle(); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < class_filters.size(); ++i) 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, class_filters[i]->messages_received()); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) { 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add a class and global filter. 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<MessageCountFilter> class_filter( 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MessageCountFilter(TestMsgStart)); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class_filter->set_message_filtering_enabled(false); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_proxy()->AddFilter(class_filter.get()); 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter()); 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) global_filter->set_message_filtering_enabled(false); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_proxy()->AddFilter(global_filter.get()); 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // A message of class Test should be seen by both the global filter and 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Test-specific filter. 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new TestMsg_Bounce); 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A message of a different class should be seen only by the global filter. 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new UtilityMsg_Bounce); 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Flush all messages. 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendQuitMessageAndWaitForIdle(); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The class filter should have received only the class-specific message. 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1U, class_filter->messages_received()); 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The global filter should have received both messages, as well as the final 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // QUIT message. 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(3U, global_filter->messages_received()); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IPCChannelProxyTest, FilterRemoval) { 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add a class and global filter. 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<MessageCountFilter> class_filter( 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MessageCountFilter(TestMsgStart)); 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter()); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add and remove both types of filters. 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_proxy()->AddFilter(class_filter.get()); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_proxy()->AddFilter(global_filter.get()); 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_proxy()->RemoveFilter(global_filter.get()); 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_proxy()->RemoveFilter(class_filter.get()); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Send some messages; they should not be seen by either filter. 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new TestMsg_Bounce); 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new UtilityMsg_Bounce); 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ensure that the filters were removed and did not receive any messages. 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendQuitMessageAndWaitForIdle(); 3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(MessageCountFilter::FILTER_REMOVED, 3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch global_filter->last_filter_event()); 3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(MessageCountFilter::FILTER_REMOVED, 3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch class_filter->last_filter_event()); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, class_filter->messages_received()); 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0U, global_filter->messages_received()); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The test that follow trigger DCHECKS in debug build. 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IPCChannelProxyTest, BadMessageOnListenerThread) { 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<MessageCountFilter> class_filter( 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MessageCountFilter(TestMsgStart)); 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class_filter->set_message_filtering_enabled(false); 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_proxy()->AddFilter(class_filter.get()); 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new TestMsg_SendBadMessage()); 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendQuitMessageAndWaitForIdle(); 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DidListenerGetBadMessage()); 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IPCChannelProxyTest, BadMessageOnIPCThread) { 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<MessageCountFilter> class_filter( 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MessageCountFilter(TestMsgStart)); 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class_filter->set_message_filtering_enabled(true); 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) channel_proxy()->AddFilter(class_filter.get()); 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new TestMsg_SendBadMessage()); 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendQuitMessageAndWaitForIdle(); 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DidListenerGetBadMessage()); 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IPCChannelBadMessageTest : public IPCTestBase { 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPCChannelBadMessageTest() {} 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~IPCChannelBadMessageTest() {} 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUp() OVERRIDE { 387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPCTestBase::SetUp(); 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Init("ChannelProxyClient"); 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener_.reset(new QuitListener()); 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateChannel(listener_.get()); 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(ConnectChannel()); 394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(StartClient()); 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void TearDown() { 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener_.reset(); 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPCTestBase::TearDown(); 401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SendQuitMessageAndWaitForIdle() { 404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new WorkerMsg_Quit); 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop::current()->Run(); 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(WaitForClientShutdown()); 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool DidListenerGetBadMessage() { 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return listener_->bad_message_received_; 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<QuitListener> listener_; 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_WIN) 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(jam): for some reason this is flaky on win buildbots. 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IPCChannelBadMessageTest, BadMessage) { 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sender()->Send(new TestMsg_SendBadMessage()); 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SendQuitMessageAndWaitForIdle(); 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DidListenerGetBadMessage()); 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ChannelProxyClient) { 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoopForIO main_message_loop; 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ChannelReflectorListener listener; 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<IPC::Channel> channel(IPC::Channel::CreateClient( 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPCTestBase::GetChannelName("ChannelProxyClient"), 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &listener)); 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CHECK(channel->Connect()); 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener.Init(channel.get()); 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop::current()->Run(); 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 442