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