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