// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_PROXY_RESOURCE_MESSAGE_TEST_SINK_H_ #define PPAPI_PROXY_RESOURCE_MESSAGE_TEST_SINK_H_ #include "ipc/ipc_test_sink.h" #include "ppapi/c/pp_stdint.h" namespace ppapi { namespace proxy { class ResourceMessageCallParams; class ResourceMessageReplyParams; // Extends IPC::TestSink to add extra capabilities for searching for and // decoding resource messages. class ResourceMessageTestSink : public IPC::TestSink { public: ResourceMessageTestSink(); virtual ~ResourceMessageTestSink(); // IPC::TestSink. // Overridden to handle sync messages. virtual bool Send(IPC::Message* msg) OVERRIDE; // Sets the reply message that will be returned to the next sync message sent. // This test sink owns any reply messages passed into this method. void SetSyncReplyMessage(IPC::Message* reply_msg); // Searches the queue for the first resource call message with a nested // message matching the given ID. On success, returns true and populates the // givem params and nested message. bool GetFirstResourceCallMatching( uint32 id, ResourceMessageCallParams* params, IPC::Message* nested_msg) const; // Like GetFirstResourceCallMatching except for replies. bool GetFirstResourceReplyMatching( uint32 id, ResourceMessageReplyParams* params, IPC::Message* nested_msg); private: scoped_ptr sync_reply_msg_; }; // This is a message handler which generates reply messages for synchronous // resource calls. This allows unit testing of the plugin side of resources // which send sync messages. If you want to reply to a sync message type named // |PpapiHostMsg_X_Y| with |PpapiPluginMsg_X_YReply| then usage would be as // follows (from within |PluginProxyTest|s): // // PpapiHostMsg_X_YReply my_reply; // ResourceSyncCallHandler handler(&sink(), // PpapiHostMsg_X_Y::ID, // PP_OK, // my_reply); // sink().AddFilter(&handler); // // Do stuff to send a sync message ... // // You can check handler.last_handled_msg() to ensure the correct message was // // handled. // sink().RemoveFilter(&handler); class ResourceSyncCallHandler : public IPC::Listener { public: ResourceSyncCallHandler(ResourceMessageTestSink* test_sink, uint32 incoming_type, int32_t result, const IPC::Message& reply_msg); virtual ~ResourceSyncCallHandler(); // IPC::Listener. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; IPC::Message last_handled_msg() { return last_handled_msg_; } private: ResourceMessageTestSink* test_sink_; uint32 incoming_type_; int32_t result_; IPC::Message reply_msg_; IPC::Message last_handled_msg_; }; } // namespace proxy } // namespace ppapi #endif // PPAPI_PROXY_RESOURCE_MESSAGE_TEST_SINK_H_