// 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 CHROME_FRAME_TEST_AUTOMATION_CLIENT_MOCK_H_ #define CHROME_FRAME_TEST_AUTOMATION_CLIENT_MOCK_H_ #include <windows.h> #include <string> #include "base/strings/string_util.h" #include "chrome_frame/chrome_frame_automation.h" #include "chrome_frame/test/chrome_frame_test_utils.h" #include "chrome_frame/test/proxy_factory_mock.h" #include "chrome_frame/utils.h" #include "gmock/gmock.h" using testing::StrictMock; // ChromeFrameAutomationClient [CFAC] tests. struct MockCFDelegate : public ChromeFrameDelegateImpl { MOCK_CONST_METHOD0(GetWindow, WindowType()); MOCK_METHOD1(GetBounds, void(RECT* bounds)); MOCK_METHOD0(GetDocumentUrl, std::string()); MOCK_METHOD2(ExecuteScript, bool(const std::string& script, std::string* result)); MOCK_METHOD0(OnAutomationServerReady, void()); MOCK_METHOD2(OnAutomationServerLaunchFailed, void( AutomationLaunchResult reason, const std::string& server_version)); // This remains in interface since we call it if Navigate() // returns immediate error. MOCK_METHOD2(OnLoadFailed, void(int error_code, const std::string& url)); // Do not mock this method. :) Use it as message demuxer and dispatcher // to the following methods (which we mock) // MOCK_METHOD1(OnMessageReceived, void(const IPC::Message&)); MOCK_METHOD0(OnChannelError, void(void)); MOCK_METHOD1(OnNavigationStateChanged, void(int flags)); MOCK_METHOD1(OnUpdateTargetUrl, void( const std::wstring& new_target_url)); MOCK_METHOD1(OnAcceleratorPressed, void(const MSG& accel_message)); MOCK_METHOD1(OnTabbedOut, void(bool reverse)); MOCK_METHOD2(OnOpenURL, void(const GURL& url, int open_disposition)); MOCK_METHOD1(OnDidNavigate, void( const NavigationInfo& navigation_info)); MOCK_METHOD2(OnNavigationFailed, void(int error_code, const GURL& gurl)); MOCK_METHOD1(OnLoad, void(const GURL& url)); MOCK_METHOD3(OnMessageFromChromeFrame, void( const std::string& message, const std::string& origin, const std::string& target)); MOCK_METHOD3(OnHandleContextMenu, void(HANDLE menu_handle, int align_flags, const MiniContextMenuParams& params)); MOCK_METHOD2(OnRequestStart, void(int request_id, const AutomationURLRequest& request)); MOCK_METHOD2(OnRequestRead, void(int request_id, int bytes_to_read)); MOCK_METHOD2(OnRequestEnd, void(int request_id, const net::URLRequestStatus& status)); // Use for sending network responses void SetRequestDelegate(PluginUrlRequestDelegate* request_delegate) { request_delegate_ = request_delegate; } void ReplyStarted(int request_id, const char* headers) { request_delegate_->OnResponseStarted(request_id, "text/html", headers, 0, base::Time::Now(), std::string(), 0, net::HostPortPair(), 0); } void ReplyData(int request_id, const std::string* data) { request_delegate_->OnReadComplete(request_id, *data); } void Reply(const net::URLRequestStatus& status, int request_id) { request_delegate_->OnResponseEnd(request_id, status); } void Reply404(int request_id) { ReplyStarted(request_id, "HTTP/1.1 404\r\n\r\n"); Reply(net::URLRequestStatus(), request_id); } PluginUrlRequestDelegate* request_delegate_; }; class MockAutomationProxy : public ChromeFrameAutomationProxy { public: MOCK_METHOD1(Send, bool(IPC::Message*)); MOCK_METHOD3(SendAsAsync, void(IPC::SyncMessage* msg, SyncMessageReplyDispatcher::SyncMessageCallContext* context, void* key)); MOCK_METHOD1(CancelAsync, void(void* key)); MOCK_METHOD1(CreateTabProxy, scoped_refptr<TabProxy>(int handle)); MOCK_METHOD1(ReleaseTabProxy, void(AutomationHandle handle)); MOCK_METHOD0(server_version, std::string(void)); MOCK_METHOD1(SendProxyConfig, void(const std::string&)); ~MockAutomationProxy() {} }; struct MockAutomationMessageSender : public AutomationMessageSender { virtual bool Send(IPC::Message* msg) { return proxy_->Send(msg); } virtual bool Send(IPC::Message* msg, int timeout_ms) { return proxy_->Send(msg); } void ForwardTo(StrictMock<MockAutomationProxy> *p) { proxy_ = p; } StrictMock<MockAutomationProxy>* proxy_; }; // [CFAC] -- uses a ProxyFactory for creation of ChromeFrameAutomationProxy // -- uses ChromeFrameAutomationProxy // -- uses TabProxy obtained from ChromeFrameAutomationProxy // -- uses ChromeFrameDelegate as outgoing interface // // We mock ProxyFactory to return mock object (MockAutomationProxy) implementing // ChromeFrameAutomationProxy interface. // Since CFAC uses TabProxy for few calls and TabProxy is not easy mockable, // we create 'real' TabProxy but with fake AutomationSender (the one responsible // for sending messages over channel). // Additionally we have mock implementation ChromeFrameDelagate interface - // MockCFDelegate. // Test fixture, saves typing all of it's members. class CFACMockTest : public testing::Test { public: MockProxyFactory factory_; MockCFDelegate cfd_; chrome_frame_test::TimedMsgLoop loop_; // Most of the test uses the mocked proxy, but some tests need // to validate the functionality of the real proxy object. // So we have a mock that is used as the default for the returned_proxy_ // pointer, but tests can set their own pointer in there as needed. StrictMock<MockAutomationProxy> mock_proxy_; ChromeFrameAutomationProxy* returned_proxy_; scoped_ptr<AutomationHandleTracker> tracker_; MockAutomationMessageSender dummy_sender_; scoped_refptr<TabProxy> tab_; // the victim of all tests scoped_refptr<ChromeFrameAutomationClient> client_; base::FilePath profile_path_; int timeout_; void* id_; // Automation server id we are going to return int tab_handle_; // Tab handle. Any non-zero value is Ok. inline ChromeFrameAutomationProxy* get_proxy() { return returned_proxy_; } inline void CreateTab() { ASSERT_EQ(NULL, tab_.get()); tab_ = new TabProxy(&dummy_sender_, tracker_.get(), tab_handle_); } // Easy methods to set expectations. void SetAutomationServerOk(int times); void Set_CFD_LaunchFailed(AutomationLaunchResult result); protected: CFACMockTest() : timeout_(500), returned_proxy_(static_cast<ChromeFrameAutomationProxy*>(&mock_proxy_)) { GetChromeFrameProfilePath(L"Adam.N.Epilinter", &profile_path_); id_ = reinterpret_cast<void*>(5); tab_handle_ = 3; } virtual void SetUp() { dummy_sender_.ForwardTo(&mock_proxy_); tracker_.reset(new AutomationHandleTracker()); client_ = new ChromeFrameAutomationClient; client_->set_proxy_factory(&factory_); } }; #endif // CHROME_FRAME_TEST_AUTOMATION_CLIENT_MOCK_H_