15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/automation_client_mock.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/automation_messages.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/custom_sync_call_context.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/navigation_constraints.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/chrome_frame_test_utils.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/test/test_scrubber.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock_mutant.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::CreateFunctor; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::TimeDelta kChromeLaunchTimeout = base::TimeDelta::FromSeconds(15); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::TimeDelta kChromeLaunchTimeout = base::TimeDelta::FromSeconds(10); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSaneAutomationTimeoutMs = 10 * 1000; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(LaunchParamProfileEq, profile_name, "Check for profile name") { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return arg->profile_name().compare(profile_name) == 0; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockProxyFactory::GetServerImpl(ChromeFrameAutomationProxy* pxy, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* proxy_id, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationLaunchResult result, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LaunchDelegate* d, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeFrameLaunchParams* params, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** automation_server_id) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *automation_server_id = proxy_id; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_->PostDelayedTask(FROM_HERE, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&LaunchDelegate::LaunchComplete, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(d), pxy, result), 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(params->launch_timeout()) / 2); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CFACMockTest::SetAutomationServerOk(int times) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(factory_, GetAutomationServer(testing::NotNull(), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LaunchParamProfileEq(profile_path_.BaseName().value()), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull())) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(times) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(testing::Invoke(CreateFunctor(&factory_, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockProxyFactory::GetServerImpl, get_proxy(), id_, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AUTOMATION_SUCCESS))); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(factory_, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseAutomationServer(testing::Eq(id_), testing::NotNull())) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(times); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CFACMockTest::Set_CFD_LaunchFailed(AutomationLaunchResult result) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerLaunchFailed(testing::Eq(result), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::_)) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP(loop_)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(MsgType, msg_type, "IPC::Message::type()") { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& m = arg; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (m.type() == msg_type); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(EqNavigationInfoUrl, url, "IPC::NavigationInfo matcher") { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid() && url != arg.url) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(stevet): other members 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Could be implemented as MockAutomationProxy member (we have WithArgs<>!) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P4(HandleCreateTab, tab_handle, external_tab_container, tab_wnd, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arg0 - message 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arg1 - callback 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // arg2 - key 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExternalTabContext::output_type input_args(tab_wnd, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) external_tab_container, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_handle, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateExternalTabContext* context = 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<CreateExternalTabContext*>(arg1); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchToMethod(context, &CreateExternalTabContext::Completed, input_args); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete context; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P4(InitiateNavigation, client, url, referrer, constraints) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->InitiateNavigation(url, referrer, constraints); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromeFrameAutomationClient tests that launch Chrome. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CFACWithChrome : public testing::Test { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetUpTestCase(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void TearDownTestCase(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static base::FilePath profile_path_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCFDelegate cfd_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameAutomationClient> client_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameLaunchParams> launch_params_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_frame_test::TimedMsgLoop loop_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath CFACWithChrome::profile_path_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CFACWithChrome::SetUpTestCase() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChromeFrameProfilePath(L"Adam.N.Epilinter", &profile_path_); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CFACWithChrome::TearDownTestCase() { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_path_.clear(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CFACWithChrome::SetUp() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_frame_test::OverrideDataDirectoryForThisTest(profile_path_.value()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_ = new ChromeFrameAutomationClient(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL empty; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_params_ = new ChromeFrameLaunchParams( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty, empty, profile_path_, profile_path_.BaseName().value(), L"", 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, false, false); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_params_->set_version_check(false); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_params_->set_launch_timeout(kSaneAutomationTimeoutMs); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CFACWithChrome::TearDown() { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->Uninitialize(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We mock ChromeFrameDelegate only. The rest is with real AutomationProxy 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACWithChrome, CreateTooFast) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout = 0; // Chrome cannot send Hello message so fast. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerLaunchFailed(AUTOMATION_TIMEOUT, _)) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP(loop_)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_params_->set_launch_timeout(timeout); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, launch_params_)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(kChromeLaunchTimeout); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test may fail if Chrome take more that 10 seconds (timeout var) to 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// launch. In this case GMock shall print something like "unexpected call to 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnAutomationServerLaunchFailed". I'm yet to find out how to specify 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that this is an unexpected call, and still to execute an action. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACWithChrome, CreateNotSoFast) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerReady()) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP(loop_)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerLaunchFailed(_, _)) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(0); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, launch_params_)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(kChromeLaunchTimeout); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACWithChrome, NavigateOk) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationConstraintsImpl navigation_constraints; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string url = "about:version"; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerReady()) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InitiateNavigation(client_.get(), url, std::string(), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &navigation_constraints)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, GetBounds(_)).Times(testing::AnyNumber()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnNavigationStateChanged(_)) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(testing::AnyNumber()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::InSequence s; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnDidNavigate(EqNavigationInfoUrl(GURL()))) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnUpdateTargetUrl(_)).Times(testing::AtMost(1)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnLoad(_)) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP(loop_)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, launch_params_)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(kChromeLaunchTimeout); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACWithChrome, NavigateFailed) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationConstraintsImpl navigation_constraints; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string url = "http://127.0.0.3:65412/"; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLRequestStatus connection_failed(net::URLRequestStatus::FAILED, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ERR_INVALID_URL); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cfd_.SetRequestDelegate(client_); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerReady()) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(testing::IgnoreResult(testing::InvokeWithoutArgs(CreateFunctor( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_.get(), &ChromeFrameAutomationClient::InitiateNavigation, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, std::string(), &navigation_constraints)))); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, GetBounds(_)).Times(testing::AnyNumber()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnNavigationStateChanged(_)).Times(testing::AnyNumber()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnRequestStart(_, _)) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Often there's another request for the error page 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(testing::Between(1, 2)) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(testing::WithArgs<0>(testing::Invoke(CreateFunctor(&cfd_, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockCFDelegate::Reply, connection_failed)))); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnUpdateTargetUrl(_)).Times(testing::AnyNumber()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnLoad(_)).Times(testing::AtMost(1)); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnNavigationFailed(_, GURL(url))) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP_SOON(loop_, base::TimeDelta::FromSeconds(2))); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, launch_params_)); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(kChromeLaunchTimeout); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACMockTest, MockedCreateTabOk) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout = 500; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTab(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAutomationServerOk(1); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, server_version()).Times(testing::AnyNumber()) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return("")); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need some valid HWNDs, when responding to CreateExternalTab 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND h1 = ::GetDesktopWindow(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND h2 = ::GetDesktopWindow(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, SendAsAsync(testing::Property( 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IPC::SyncMessage::type, AutomationMsg_CreateExternalTab::ID), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), _)) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1).WillOnce(HandleCreateTab(tab_handle_, h1, h2, 99)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, CreateTabProxy(testing::Eq(tab_handle_))) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(tab_)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerReady()) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP(loop_)); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, CancelAsync(_)).Times(testing::AnyNumber()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we go! 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL empty; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameLaunchParams> clp(new ChromeFrameLaunchParams( 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty, empty, profile_path_, profile_path_.BaseName().value(), L"", 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, false, false)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clp->set_launch_timeout(timeout); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clp->set_version_check(false); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, clp)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(base::TimeDelta::FromSeconds(10)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, ReleaseTabProxy(testing::Eq(tab_handle_))).Times(1); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->Uninitialize(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACMockTest, MockedCreateTabFailed) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND null_wnd = NULL; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAutomationServerOk(1); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, server_version()).Times(testing::AnyNumber()) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return("")); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, SendAsAsync(testing::Property( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IPC::SyncMessage::type, AutomationMsg_CreateExternalTab::ID), 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), _)) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1).WillOnce(HandleCreateTab(tab_handle_, null_wnd, null_wnd, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99)); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, CreateTabProxy(_)).Times(0); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, CancelAsync(_)).Times(testing::AnyNumber()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Set_CFD_LaunchFailed(AUTOMATION_CREATE_TAB_FAILED); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we go! 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL empty; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameLaunchParams> clp(new ChromeFrameLaunchParams( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty, empty, profile_path_, profile_path_.BaseName().value(), L"", 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, false, false)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clp->set_launch_timeout(timeout_); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clp->set_version_check(false); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, clp)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(base::TimeDelta::FromSeconds(4)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->Uninitialize(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestChromeFrameAutomationProxyImpl 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ChromeFrameAutomationProxyImpl { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChromeFrameAutomationProxyImpl() 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 is an unneeded timeout. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ChromeFrameAutomationProxyImpl( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationProxy::GenerateChannelID(), 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1)) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3( 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendAsAsync, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(IPC::SyncMessage* msg, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncMessageReplyDispatcher::SyncMessageCallContext* context, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* key)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FakeChannelError() { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<IPC::ChannelProxy::MessageFilter*>(message_filter_.get())-> 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnChannelError(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACMockTest, OnChannelErrorEmpty) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChromeFrameAutomationProxyImpl proxy; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No tabs should do nothing yet still not fail either. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy.FakeChannelError(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACMockTest, OnChannelError) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta loop_duration = base::TimeDelta::FromSeconds(11); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChromeFrameAutomationProxyImpl proxy; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returned_proxy_ = &proxy; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL empty; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameLaunchParams> clp(new ChromeFrameLaunchParams( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty, empty, profile_path_, profile_path_.BaseName().value(), L"", 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, false, false)); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clp->set_launch_timeout(1); // Unneeded timeout, but can't be 0. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clp->set_version_check(false); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND h1 = ::GetDesktopWindow(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND h2 = ::GetDesktopWindow(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(proxy, SendAsAsync(testing::Property( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IPC::SyncMessage::type, AutomationMsg_CreateExternalTab::ID), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), _)).Times(3) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(HandleCreateTab(tab_handle_, h1, h2, 99)) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(HandleCreateTab(tab_handle_ * 2, h1, h2, 100)) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(HandleCreateTab(tab_handle_ * 3, h1, h2, 101)); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAutomationServerOk(3); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, try a single tab and make sure the notification find its way to the 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Chrome Frame Delegate. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockCFDelegate> cfd1; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameAutomationClient> client1; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client1 = new ChromeFrameAutomationClient; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client1->set_proxy_factory(&factory_); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd1, OnAutomationServerReady()).WillOnce(QUIT_LOOP(loop_)); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client1->Initialize(&cfd1, clp)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for OnAutomationServerReady to be called in the UI thread. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(loop_duration); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy.FakeChannelError(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd1, OnChannelError()).WillOnce(QUIT_LOOP(loop_)); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for OnChannelError to be propagated to delegate from the UI thread. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(loop_duration); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a second tab using a different delegate. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockCFDelegate> cfd2; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameAutomationClient> client2; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client2 = new ChromeFrameAutomationClient; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client2->set_proxy_factory(&factory_); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd2, OnAutomationServerReady()).WillOnce(QUIT_LOOP(loop_)); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client2->Initialize(&cfd2, clp)); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for OnAutomationServerReady to be called in the UI thread. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(loop_duration); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd1, OnChannelError()).Times(1); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd2, OnChannelError()).WillOnce(QUIT_LOOP(loop_)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy.FakeChannelError(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for OnChannelError to be propagated to delegate from the UI thread. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(loop_duration); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And now a 3rd tab using the first delegate. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameAutomationClient> client3; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client3 = new ChromeFrameAutomationClient; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client3->set_proxy_factory(&factory_); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd1, OnAutomationServerReady()).WillOnce(QUIT_LOOP(loop_)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client3->Initialize(&cfd1, clp)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for OnAutomationServerReady to be called in the UI thread. 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(loop_duration); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd2, OnChannelError()).Times(1); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd1, OnChannelError()).Times(2).WillOnce(Return()) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(QUIT_LOOP(loop_)); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy.FakeChannelError(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for OnChannelError to be propagated to delegate from the UI thread. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(loop_duration); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cleanup. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client1->Uninitialize(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client2->Uninitialize(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client3->Uninitialize(); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client1 = NULL; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client2 = NULL; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client3 = NULL; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CFACMockTest, NavigateTwiceAfterInitToSameUrl) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout = 500; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationConstraintsImpl navigation_constraints; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTab(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAutomationServerOk(1); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, server_version()).Times(testing::AnyNumber()) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return("")); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need some valid HWNDs, when responding to CreateExternalTab 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND h1 = ::GetDesktopWindow(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HWND h2 = ::GetDesktopWindow(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, SendAsAsync(testing::Property( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IPC::SyncMessage::type, AutomationMsg_CreateExternalTab::ID), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), _)) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1).WillOnce(HandleCreateTab(tab_handle_, h1, h2, 99)); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, CreateTabProxy(testing::Eq(tab_handle_))) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(tab_)); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, OnAutomationServerReady()) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(InitiateNavigation(client_.get(), 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("http://www.nonexistent.com"), 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(), &navigation_constraints)); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, SendAsAsync(testing::Property( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IPC::SyncMessage::type, AutomationMsg_NavigateInExternalTab::ID), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::NotNull(), _)) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1).WillOnce(QUIT_LOOP(loop_)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, CancelAsync(_)).Times(testing::AnyNumber()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, Send( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::Property(&IPC::Message::type, AutomationMsg_TabReposition::ID))) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(true)); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(cfd_, GetBounds(_)).Times(1); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we go! 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL empty; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ChromeFrameLaunchParams> launch_params( 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeFrameLaunchParams( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.nonexistent.com"), empty, profile_path_, 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_path_.BaseName().value(), L"", false, false, false)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_params->set_launch_timeout(timeout); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) launch_params->set_version_check(false); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client_->Initialize(&cfd_, launch_params)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loop_.RunFor(base::TimeDelta::FromSeconds(10)); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_proxy_, ReleaseTabProxy(testing::Eq(tab_handle_))).Times(1); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->Uninitialize(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475