Index: chrome_frame/cfproxy_test.cc |
diff --git a/chrome_frame/cfproxy_test.cc b/chrome_frame/cfproxy_test.cc |
deleted file mode 100644 |
index 338244a45037ad16329291a0667ce8a25463f0e2..0000000000000000000000000000000000000000 |
--- a/chrome_frame/cfproxy_test.cc |
+++ /dev/null |
@@ -1,374 +0,0 @@ |
-// 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. |
- |
-#include <string> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/file_path.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "chrome/common/automation_messages.h" |
-#include "chrome_frame/cfproxy_private.h" |
-#include "chrome_frame/test/chrome_frame_test_utils.h" |
-#include "chrome_frame/test/test_scrubber.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gmock_mutant.h" |
- |
-using testing::_; |
-using testing::DoAll; |
-using testing::NotNull; |
-using testing::Return; |
-using testing::StrictMock; |
-using testing::InvokeWithoutArgs; |
-using testing::WithoutArgs; |
-using testing::CreateFunctor; |
-using testing::StrEq; |
-using testing::Eq; |
- |
-// There is not much to test here since CFProxy is pretty dumb. |
-struct MockFactory : public ChromeProxyFactory { |
- MOCK_METHOD0(CreateProxy, ChromeProxy*()); |
-}; |
- |
-struct MockChromeProxyDelegate : public ChromeProxyDelegate { |
- MOCK_METHOD1(OnMessageReceived, bool(const IPC::Message& message)); |
- MOCK_METHOD1(Connected, void(ChromeProxy* proxy)); |
- MOCK_METHOD2(PeerLost, void(ChromeProxy*, enum DisconnectReason reason)); |
- MOCK_METHOD0(Disconnected, void()); |
- MOCK_METHOD0(tab_handle, int()); |
- |
- MOCK_METHOD5(Completed_CreateTab, void(bool success, HWND chrome_wnd, |
- HWND tab_window, int tab_handle, int session_id)); |
- MOCK_METHOD5(Completed_ConnectToTab, void(bool success, HWND chrome_window, |
- HWND tab_window, int tab_handle, int session_id)); |
- MOCK_METHOD2(Completed_Navigate, void(bool success, |
- enum AutomationMsg_NavigationResponseValues res)); |
- |
- // Network requests from Chrome. |
- MOCK_METHOD2(Network_Start, void(int request_id, |
- const AutomationURLRequest& request_info)); |
- MOCK_METHOD2(Network_Read, void(int request_id, int bytes_to_read)); |
- MOCK_METHOD2(Network_End, void(int request_id, |
- const net::URLRequestStatus& s)); |
- MOCK_METHOD1(Network_DownloadInHost, void(int request_id)); |
- MOCK_METHOD2(GetCookies, void(const GURL& url, int cookie_id)); |
- MOCK_METHOD2(SetCookie, void(const GURL& url, const std::string& cookie)); |
- |
- // Navigation progress notifications. |
- MOCK_METHOD2(NavigationStateChanged, void(int flags, |
- const NavigationInfo& nav_info)); |
- MOCK_METHOD1(UpdateTargetUrl, void(const std::wstring& url)); |
- MOCK_METHOD2(NavigationFailed, void(int error_code, const GURL& gurl)); |
- MOCK_METHOD1(DidNavigate, void(const NavigationInfo& navigation_info)); |
- MOCK_METHOD1(TabLoaded, void(const GURL& url)); |
- |
- // |
- MOCK_METHOD3(OpenURL, void(const GURL& url_to_open, const GURL& referrer, |
- int open_disposition)); |
- MOCK_METHOD1(GoToHistoryOffset, void(int offset)); |
- MOCK_METHOD3(MessageToHost, void(const std::string& message, |
- const std::string& origin, const std::string& target)); |
- |
- // Misc. UI. |
- MOCK_METHOD1(HandleAccelerator, void(const MSG& accel_message)); |
- MOCK_METHOD3(HandleContextMenu, void(HANDLE menu_handle, int align_flags, |
- const MiniContextMenuParams& params)); |
- MOCK_METHOD1(TabbedOut, void(bool reverse)); |
- |
- // |
- MOCK_METHOD0(TabClosed, void()); |
- MOCK_METHOD1(AttachTab, void(const AttachExternalTabParams& attach_params)); |
-}; |
- |
-struct MockSender : public IPC::Message::Sender { |
- MOCK_METHOD1(Send, bool(IPC::Message* m)); |
-}; |
- |
-struct MockCFProxyTraits : public CFProxyTraits { |
- MOCK_METHOD2(DoCreateChannel, IPC::Message::Sender*(const std::string& id, |
- IPC::Channel::Listener* l)); |
- MOCK_METHOD1(CloseChannel, void(IPC::Message::Sender* s)); |
- MOCK_METHOD1(LaunchApp, bool(const std::wstring& cmd_line)); |
- |
- // Forward the CreateChannel to DoCreateChannel, but save the ipc_thread |
- // and the listener (i.e. proxy implementation of Channel::Listener) |
- virtual IPC::Message::Sender* CreateChannel(const std::string& id, |
- IPC::Channel::Listener* l) { |
- ipc_loop = MessageLoop::current(); |
- listener = l; |
- return this->DoCreateChannel(id, l); |
- } |
- |
- // Simulate some activity in the IPC thread. |
- // You may find API_FIRE_XXXX macros (see below) handy instead. |
- void FireConnect(base::TimeDelta t) { |
- ASSERT_TRUE(ipc_loop != NULL); |
- ipc_loop->PostDelayedTask( |
- FROM_HERE, base::Bind(&IPC::Channel::Listener::OnChannelConnected, |
- base::Unretained(listener), 0), |
- t.InMilliseconds()); |
- } |
- |
- void FireError(base::TimeDelta t) { |
- ASSERT_TRUE(ipc_loop != NULL); |
- ipc_loop->PostDelayedTask( |
- FROM_HERE, base::Bind(&IPC::Channel::Listener::OnChannelError, |
- base::Unretained(listener)), |
- t.InMilliseconds()); |
- } |
- |
- void FireMessage(const IPC::Message& m, base::TimeDelta t) { |
- ASSERT_TRUE(ipc_loop != NULL); |
- ipc_loop->PostDelayedTask( |
- FROM_HERE, |
- base::Bind( |
- base::IgnoreResult(&IPC::Channel::Listener::OnMessageReceived), |
- base::Unretained(listener), m), |
- t.InMilliseconds()); |
- } |
- |
- MockCFProxyTraits() : ipc_loop(NULL) {} |
- MockSender sender; |
- private: |
- MessageLoop* ipc_loop; |
- IPC::Channel::Listener* listener; |
-}; |
- |
-// Handy macros when we want so simulate something on the IPC thread. |
-#define API_FIRE_CONNECT(api, t) InvokeWithoutArgs(CreateFunctor(&api, \ |
- &MockCFProxyTraits::FireConnect, t)) |
-#define API_FIRE_ERROR(api, t) InvokeWithoutArgs(CreateFunctor(&api, \ |
- &MockCFProxyTraits::FireError, t)) |
-#define API_FIRE_MESSAGE(api, t) InvokeWithoutArgs(CreateFunctor(&api, \ |
- &MockCFProxyTraits::FireMessage, t)) |
- |
-class ChromeProxyTest : public ::testing::Test { |
- protected: |
- virtual void SetUp() OVERRIDE { |
- chrome_frame_test::OverrideDataDirectoryForThisTest( |
- chrome_frame_test::GetProfilePath(L"").value()); |
- params_.profile = "Adam N. Epilinter"; |
- params_.timeout = base::TimeDelta::FromSeconds(4); |
- } |
- |
- ProxyParams params_; |
-}; |
- |
-TEST_F(ChromeProxyTest, DelegateAddRemove) { |
- StrictMock<MockCFProxyTraits> api; |
- StrictMock<MockChromeProxyDelegate> delegate; |
- StrictMock<MockFactory> factory; // to be destroyed before other mocks |
- CFProxy* proxy = new CFProxy(&api); |
- |
- EXPECT_CALL(factory, CreateProxy()).WillOnce(Return(proxy)); |
- EXPECT_CALL(api, DoCreateChannel(_, proxy)).WillOnce(Return(&api.sender)); |
- EXPECT_CALL(api, LaunchApp(_)).WillOnce(Return(true)); |
- EXPECT_CALL(api, CloseChannel(&api.sender)); |
- |
- EXPECT_CALL(delegate, tab_handle()).WillRepeatedly(Return(0)); |
- EXPECT_CALL(delegate, Disconnected()); |
- |
- factory.GetProxy(&delegate, params_); |
- factory.ReleaseProxy(&delegate, params_.profile); |
-} |
- |
-// Not very useful test. Just for illustration. :) |
-TEST_F(ChromeProxyTest, SharedProxy) { |
- base::WaitableEvent done1(false, false); |
- base::WaitableEvent done2(false, false); |
- StrictMock<MockCFProxyTraits> api; |
- StrictMock<MockChromeProxyDelegate> delegate1; |
- StrictMock<MockChromeProxyDelegate> delegate2; |
- StrictMock<MockFactory> factory; |
- CFProxy* proxy = new CFProxy(&api); |
- |
- EXPECT_CALL(factory, CreateProxy()).WillOnce(Return(proxy)); |
- EXPECT_CALL(api, DoCreateChannel(_, proxy)).WillOnce(Return(&api.sender)); |
- EXPECT_CALL(api, LaunchApp(_)).WillOnce(DoAll( |
- API_FIRE_CONNECT(api, base::TimeDelta::FromMilliseconds(150)), |
- Return(true))); |
- EXPECT_CALL(api, CloseChannel(&api.sender)); |
- |
- EXPECT_CALL(delegate1, tab_handle()).WillRepeatedly(Return(0)); |
- EXPECT_CALL(delegate2, tab_handle()).WillRepeatedly(Return(0)); |
- |
- EXPECT_CALL(delegate1, Connected(proxy)) |
- .WillOnce(InvokeWithoutArgs(&done1, &base::WaitableEvent::Signal)); |
- EXPECT_CALL(delegate2, Connected(proxy)) |
- .WillOnce(InvokeWithoutArgs(&done2, &base::WaitableEvent::Signal)); |
- |
- factory.GetProxy(&delegate1, params_); |
- params_.timeout = base::TimeDelta::FromSeconds(2); |
- factory.GetProxy(&delegate2, params_); |
- |
- EXPECT_TRUE(done1.TimedWait(base::TimeDelta::FromSeconds(1))); |
- EXPECT_TRUE(done2.TimedWait(base::TimeDelta::FromSeconds(1))); |
- |
- EXPECT_CALL(delegate2, Disconnected()); |
- EXPECT_CALL(delegate1, Disconnected()); |
- |
- factory.ReleaseProxy(&delegate2, params_.profile); |
- factory.ReleaseProxy(&delegate1, params_.profile); |
-} |
- |
-TEST_F(ChromeProxyTest, LaunchTimeout) { |
- base::WaitableEvent done(true, false); |
- StrictMock<MockCFProxyTraits> api; |
- StrictMock<MockChromeProxyDelegate> delegate; |
- StrictMock<MockFactory> factory; |
- CFProxy* proxy = new CFProxy(&api); |
- |
- EXPECT_CALL(delegate, tab_handle()).WillRepeatedly(Return(0)); |
- EXPECT_CALL(factory, CreateProxy()).WillOnce(Return(proxy)); |
- EXPECT_CALL(api, DoCreateChannel(_, proxy)).WillOnce(Return(&api.sender)); |
- EXPECT_CALL(api, LaunchApp(_)).WillOnce(Return(true)); |
- EXPECT_CALL(api, CloseChannel(&api.sender)); |
- |
- EXPECT_CALL(delegate, PeerLost(_, |
- ChromeProxyDelegate::CHROME_EXE_LAUNCH_TIMEOUT)) |
- .WillOnce(InvokeWithoutArgs(&done, &base::WaitableEvent::Signal)); |
- params_.timeout = base::TimeDelta::FromMilliseconds(300); |
- factory.GetProxy(&delegate, params_); |
- EXPECT_TRUE(done.TimedWait(base::TimeDelta::FromSeconds(1))); |
- |
- EXPECT_CALL(delegate, Disconnected()); |
- factory.ReleaseProxy(&delegate, params_.profile); |
-} |
- |
-TEST_F(ChromeProxyTest, LaunchChrome) { |
- base::WaitableEvent connected(false, false); |
- StrictMock<MockChromeProxyDelegate> delegate; |
- ChromeProxyFactory factory; |
- |
- params_.timeout = base::TimeDelta::FromSeconds(10); |
- |
- EXPECT_CALL(delegate, tab_handle()).WillRepeatedly(Return(0)); |
- EXPECT_CALL(delegate, Connected(NotNull())) |
- .WillOnce(InvokeWithoutArgs(&connected, &base::WaitableEvent::Signal)); |
- |
- factory.GetProxy(&delegate, params_); |
- EXPECT_TRUE(connected.TimedWait(base::TimeDelta::FromSeconds(15))); |
- |
- EXPECT_CALL(delegate, Disconnected()); |
- factory.ReleaseProxy(&delegate, params_.profile); |
-} |
- |
-// Test that a channel error results in Completed_XYZ(false, ) called if |
-// the synchronious XYZ message has been sent. |
-TEST_F(ChromeProxyTest, ChannelError) { |
- base::WaitableEvent connected(false, false); |
- StrictMock<MockCFProxyTraits> api; |
- StrictMock<MockChromeProxyDelegate> delegate; |
- StrictMock<MockFactory> factory; |
- CFProxy* proxy = new CFProxy(&api); |
- |
- params_.timeout = base::TimeDelta::FromMilliseconds(300); |
- |
- testing::InSequence s; |
- |
- EXPECT_CALL(factory, CreateProxy()).WillOnce(Return(proxy)); |
- EXPECT_CALL(api, DoCreateChannel(_, proxy)).WillOnce(Return(&api.sender)); |
- EXPECT_CALL(api, LaunchApp(_)).WillOnce(DoAll( |
- API_FIRE_CONNECT(api, base::TimeDelta::FromMilliseconds(10)), |
- Return(true))); |
- EXPECT_CALL(delegate, Connected(proxy)) |
- .WillOnce(DoAll( |
- InvokeWithoutArgs(CreateFunctor(proxy, &ChromeProxy::ConnectTab, |
- &delegate, HWND(6), 512)), |
- InvokeWithoutArgs(&connected, &base::WaitableEvent::Signal))); |
- |
- EXPECT_CALL(api.sender, Send(_)); |
- EXPECT_CALL(delegate, Completed_ConnectToTab(false, _, _, _, _)); |
- EXPECT_CALL(api, CloseChannel(&api.sender)); |
- EXPECT_CALL(delegate, PeerLost(_, ChromeProxyDelegate::CHANNEL_ERROR)); |
- |
- factory.GetProxy(&delegate, params_); |
- EXPECT_TRUE(connected.TimedWait(base::TimeDelta::FromSeconds(15))); |
- // Simulate a channel error. |
- api.FireError(base::TimeDelta::FromMilliseconds(0)); |
- |
- // Expectations when the Proxy is destroyed. |
- EXPECT_CALL(delegate, tab_handle()).WillOnce(Return(0)); |
- EXPECT_CALL(delegate, Disconnected()); |
- factory.ReleaseProxy(&delegate, params_.profile); |
-} |
-/////////////////////////////////////////////////////////////////////////////// |
-namespace { |
-template <typename M, typename A> |
-inline IPC::Message* CreateReply(M* m, const A& a) { |
- IPC::Message* r = IPC::SyncMessage::GenerateReply(m); |
- if (r) { |
- M::WriteReplyParams(r, a); |
- } |
- return r; |
-} |
- |
-template <typename M, typename A, typename B> |
-inline IPC::Message* CreateReply(M* m, const A& a, const B& b) { |
- IPC::Message* r = IPC::SyncMessage::GenerateReply(m); |
- if (r) { |
- M::WriteReplyParams(r, a, b); |
- } |
- return r; |
-} |
- |
-template <typename M, typename A, typename B, typename C> |
-inline IPC::Message* CreateReply(M* m, const A& a, const B& b, const C& c) { |
- IPC::Message* r = IPC::SyncMessage::GenerateReply(m); |
- if (r) { |
- M::WriteReplyParams(r, a, b, c); |
- } |
- return r; |
-} |
- |
-template <typename M, typename A, typename B, typename C, typename D> |
-inline IPC::Message* CreateReply(M* m, const A& a, const B& b, const C& c, |
- const D& d) { |
- IPC::Message* r = IPC::SyncMessage::GenerateReply(m); |
- if (r) { |
- M::WriteReplyParams(r, a, b, c, d); |
- } |
- return r; |
-}} // namespace |
- |
-TEST(SyncMsgSender, Deserialize) { |
- // Note the ipc thread is not actually needed, but we try to be close |
- // to real-world conditions - that SyncMsgSender works from multiple threads. |
- base::Thread ipc("ipc"); |
- ipc.StartWithOptions(base::Thread::Options(MessageLoop::TYPE_IO, 0)); |
- |
- StrictMock<MockChromeProxyDelegate> d1; |
- TabsMap tab2delegate; |
- SyncMsgSender queue(&tab2delegate); |
- |
- const int kTabHandle = 6; |
- const int kSessionId = 8; |
- |
- // Create a sync message and its reply. |
- AutomationMsg_CreateExternalTab m(ExternalTabSettings(), 0, 0, 0, 0); |
- scoped_ptr<IPC::Message> r(CreateReply(&m, (HWND)1, (HWND)2, kTabHandle, |
- kSessionId)); |
- |
- queue.QueueSyncMessage(&m, &d1, NULL); |
- |
- testing::InSequence s; |
- EXPECT_CALL(d1, Completed_CreateTab(true, (HWND)1, (HWND)2, kTabHandle, |
- kSessionId)); |
- |
- // Execute replies in a worker thread. |
- ipc.message_loop()->PostTask( |
- FROM_HERE, |
- base::Bind(base::IgnoreResult(&SyncMsgSender::OnReplyReceived), |
- base::Unretained(&queue), r.get())); |
- ipc.Stop(); |
- |
- // Expect that tab 6 has been associated with the delegate. |
- EXPECT_EQ(&d1, tab2delegate[6]); |
-} |
- |
-TEST(SyncMsgSender, OnChannelClosed) { |
- // TODO(stoyan): implement. |
-} |