1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_FRAME_TEST_AUTOMATION_CLIENT_MOCK_H_
6 #define CHROME_FRAME_TEST_AUTOMATION_CLIENT_MOCK_H_
11 #include "base/strings/string_util.h"
12 #include "chrome_frame/chrome_frame_automation.h"
13 #include "chrome_frame/test/chrome_frame_test_utils.h"
14 #include "chrome_frame/test/proxy_factory_mock.h"
15 #include "chrome_frame/utils.h"
16 #include "gmock/gmock.h"
18 using testing::StrictMock;
20 // ChromeFrameAutomationClient [CFAC] tests.
21 struct MockCFDelegate : public ChromeFrameDelegateImpl {
22 MOCK_CONST_METHOD0(GetWindow, WindowType());
23 MOCK_METHOD1(GetBounds, void(RECT* bounds));
24 MOCK_METHOD0(GetDocumentUrl, std::string());
25 MOCK_METHOD2(ExecuteScript, bool(const std::string& script,
26 std::string* result));
27 MOCK_METHOD0(OnAutomationServerReady, void());
28 MOCK_METHOD2(OnAutomationServerLaunchFailed, void(
29 AutomationLaunchResult reason, const std::string& server_version));
30 // This remains in interface since we call it if Navigate()
31 // returns immediate error.
32 MOCK_METHOD2(OnLoadFailed, void(int error_code, const std::string& url));
34 // Do not mock this method. :) Use it as message demuxer and dispatcher
35 // to the following methods (which we mock)
36 // MOCK_METHOD1(OnMessageReceived, void(const IPC::Message&));
38 MOCK_METHOD0(OnChannelError, void(void));
39 MOCK_METHOD1(OnNavigationStateChanged, void(int flags));
40 MOCK_METHOD1(OnUpdateTargetUrl, void(
41 const std::wstring& new_target_url));
42 MOCK_METHOD1(OnAcceleratorPressed, void(const MSG& accel_message));
43 MOCK_METHOD1(OnTabbedOut, void(bool reverse));
44 MOCK_METHOD2(OnOpenURL, void(const GURL& url, int open_disposition));
45 MOCK_METHOD1(OnDidNavigate, void(
46 const NavigationInfo& navigation_info));
47 MOCK_METHOD2(OnNavigationFailed, void(int error_code, const GURL& gurl));
48 MOCK_METHOD1(OnLoad, void(const GURL& url));
49 MOCK_METHOD3(OnMessageFromChromeFrame, void(
50 const std::string& message,
51 const std::string& origin,
52 const std::string& target));
53 MOCK_METHOD3(OnHandleContextMenu, void(HANDLE menu_handle,
54 int align_flags, const MiniContextMenuParams& params));
55 MOCK_METHOD2(OnRequestStart, void(int request_id,
56 const AutomationURLRequest& request));
57 MOCK_METHOD2(OnRequestRead, void(int request_id, int bytes_to_read));
58 MOCK_METHOD2(OnRequestEnd, void(int request_id,
59 const net::URLRequestStatus& status));
60 MOCK_METHOD2(OnSetCookieAsync, void(const GURL& url,
61 const std::string& cookie));
63 // Use for sending network responses
64 void SetRequestDelegate(PluginUrlRequestDelegate* request_delegate) {
65 request_delegate_ = request_delegate;
68 void ReplyStarted(int request_id, const char* headers) {
69 request_delegate_->OnResponseStarted(request_id, "text/html", headers,
70 0, base::Time::Now(), EmptyString(), 0, net::HostPortPair(), 0);
73 void ReplyData(int request_id, const std::string* data) {
74 request_delegate_->OnReadComplete(request_id, *data);
77 void Reply(const net::URLRequestStatus& status, int request_id) {
78 request_delegate_->OnResponseEnd(request_id, status);
81 void Reply404(int request_id) {
82 ReplyStarted(request_id, "HTTP/1.1 404\r\n\r\n");
83 Reply(net::URLRequestStatus(), request_id);
86 PluginUrlRequestDelegate* request_delegate_;
89 class MockAutomationProxy : public ChromeFrameAutomationProxy {
91 MOCK_METHOD1(Send, bool(IPC::Message*));
92 MOCK_METHOD3(SendAsAsync,
93 void(IPC::SyncMessage* msg,
94 SyncMessageReplyDispatcher::SyncMessageCallContext* context,
96 MOCK_METHOD1(CancelAsync, void(void* key));
97 MOCK_METHOD1(CreateTabProxy, scoped_refptr<TabProxy>(int handle));
98 MOCK_METHOD1(ReleaseTabProxy, void(AutomationHandle handle));
99 MOCK_METHOD0(server_version, std::string(void));
100 MOCK_METHOD1(SendProxyConfig, void(const std::string&));
102 ~MockAutomationProxy() {}
105 struct MockAutomationMessageSender : public AutomationMessageSender {
106 virtual bool Send(IPC::Message* msg) {
107 return proxy_->Send(msg);
110 virtual bool Send(IPC::Message* msg, int timeout_ms) {
111 return proxy_->Send(msg);
114 void ForwardTo(StrictMock<MockAutomationProxy> *p) {
118 StrictMock<MockAutomationProxy>* proxy_;
121 // [CFAC] -- uses a ProxyFactory for creation of ChromeFrameAutomationProxy
122 // -- uses ChromeFrameAutomationProxy
123 // -- uses TabProxy obtained from ChromeFrameAutomationProxy
124 // -- uses ChromeFrameDelegate as outgoing interface
126 // We mock ProxyFactory to return mock object (MockAutomationProxy) implementing
127 // ChromeFrameAutomationProxy interface.
128 // Since CFAC uses TabProxy for few calls and TabProxy is not easy mockable,
129 // we create 'real' TabProxy but with fake AutomationSender (the one responsible
130 // for sending messages over channel).
131 // Additionally we have mock implementation ChromeFrameDelagate interface -
134 // Test fixture, saves typing all of it's members.
135 class CFACMockTest : public testing::Test {
137 MockProxyFactory factory_;
139 chrome_frame_test::TimedMsgLoop loop_;
140 // Most of the test uses the mocked proxy, but some tests need
141 // to validate the functionality of the real proxy object.
142 // So we have a mock that is used as the default for the returned_proxy_
143 // pointer, but tests can set their own pointer in there as needed.
144 StrictMock<MockAutomationProxy> mock_proxy_;
145 ChromeFrameAutomationProxy* returned_proxy_;
146 scoped_ptr<AutomationHandleTracker> tracker_;
147 MockAutomationMessageSender dummy_sender_;
148 scoped_refptr<TabProxy> tab_;
149 // the victim of all tests
150 scoped_refptr<ChromeFrameAutomationClient> client_;
152 base::FilePath profile_path_;
154 void* id_; // Automation server id we are going to return
155 int tab_handle_; // Tab handle. Any non-zero value is Ok.
157 inline ChromeFrameAutomationProxy* get_proxy() {
158 return returned_proxy_;
161 inline void CreateTab() {
162 ASSERT_EQ(NULL, tab_.get());
163 tab_ = new TabProxy(&dummy_sender_, tracker_.get(), tab_handle_);
166 // Easy methods to set expectations.
167 void SetAutomationServerOk(int times);
168 void Set_CFD_LaunchFailed(AutomationLaunchResult result);
173 returned_proxy_(static_cast<ChromeFrameAutomationProxy*>(&mock_proxy_)) {
174 GetChromeFrameProfilePath(L"Adam.N.Epilinter", &profile_path_);
175 id_ = reinterpret_cast<void*>(5);
179 virtual void SetUp() {
180 dummy_sender_.ForwardTo(&mock_proxy_);
181 tracker_.reset(new AutomationHandleTracker());
183 client_ = new ChromeFrameAutomationClient;
184 client_->set_proxy_factory(&factory_);
188 #endif // CHROME_FRAME_TEST_AUTOMATION_CLIENT_MOCK_H_