| Index: apps/app_shim/extension_app_shim_handler_mac_unittest.cc
|
| diff --git a/apps/app_shim/extension_app_shim_handler_mac_unittest.cc b/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
|
| deleted file mode 100644
|
| index 27791d9539a40809c5ac26b30e473e67d6576e97..0000000000000000000000000000000000000000
|
| --- a/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
|
| +++ /dev/null
|
| @@ -1,396 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "apps/app_shim/extension_app_shim_handler_mac.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "apps/app_shim/app_shim_host_mac.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "chrome/browser/chrome_notification_types.h"
|
| -#include "chrome/test/base/testing_profile.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "extensions/common/extension.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace apps {
|
| -
|
| -using extensions::Extension;
|
| -typedef extensions::AppWindowRegistry::AppWindowList AppWindowList;
|
| -
|
| -using ::testing::_;
|
| -using ::testing::Invoke;
|
| -using ::testing::Return;
|
| -using ::testing::WithArgs;
|
| -
|
| -class MockDelegate : public ExtensionAppShimHandler::Delegate {
|
| - public:
|
| - virtual ~MockDelegate() {}
|
| -
|
| - MOCK_METHOD1(ProfileExistsForPath, bool(const base::FilePath&));
|
| - MOCK_METHOD1(ProfileForPath, Profile*(const base::FilePath&));
|
| - MOCK_METHOD2(LoadProfileAsync,
|
| - void(const base::FilePath&,
|
| - base::Callback<void(Profile*)>));
|
| -
|
| - MOCK_METHOD2(GetWindows, AppWindowList(Profile*, const std::string&));
|
| -
|
| - MOCK_METHOD2(GetAppExtension, const Extension*(Profile*, const std::string&));
|
| - MOCK_METHOD3(EnableExtension, void(Profile*,
|
| - const std::string&,
|
| - const base::Callback<void()>&));
|
| - MOCK_METHOD3(LaunchApp,
|
| - void(Profile*,
|
| - const Extension*,
|
| - const std::vector<base::FilePath>&));
|
| - MOCK_METHOD2(LaunchShim, void(Profile*, const Extension*));
|
| -
|
| - MOCK_METHOD0(MaybeTerminate, void());
|
| -
|
| - void CaptureLoadProfileCallback(
|
| - const base::FilePath& path,
|
| - base::Callback<void(Profile*)> callback) {
|
| - callbacks_[path] = callback;
|
| - }
|
| -
|
| - bool RunLoadProfileCallback(
|
| - const base::FilePath& path,
|
| - Profile* profile) {
|
| - callbacks_[path].Run(profile);
|
| - return callbacks_.erase(path);
|
| - }
|
| -
|
| - void RunCallback(const base::Callback<void()>& callback) {
|
| - callback.Run();
|
| - }
|
| -
|
| - private:
|
| - std::map<base::FilePath,
|
| - base::Callback<void(Profile*)> > callbacks_;
|
| -};
|
| -
|
| -class TestingExtensionAppShimHandler : public ExtensionAppShimHandler {
|
| - public:
|
| - TestingExtensionAppShimHandler(Delegate* delegate) {
|
| - set_delegate(delegate);
|
| - }
|
| - virtual ~TestingExtensionAppShimHandler() {}
|
| -
|
| - MOCK_METHOD3(OnShimFocus,
|
| - void(Host* host,
|
| - AppShimFocusType,
|
| - const std::vector<base::FilePath>& files));
|
| -
|
| - void RealOnShimFocus(Host* host,
|
| - AppShimFocusType focus_type,
|
| - const std::vector<base::FilePath>& files) {
|
| - ExtensionAppShimHandler::OnShimFocus(host, focus_type, files);
|
| - }
|
| -
|
| - AppShimHandler::Host* FindHost(Profile* profile,
|
| - const std::string& app_id) {
|
| - HostMap::const_iterator it = hosts().find(make_pair(profile, app_id));
|
| - return it == hosts().end() ? NULL : it->second;
|
| - }
|
| -
|
| - content::NotificationRegistrar& GetRegistrar() { return registrar(); }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(TestingExtensionAppShimHandler);
|
| -};
|
| -
|
| -const char kTestAppIdA[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
|
| -const char kTestAppIdB[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
|
| -
|
| -class FakeHost : public apps::AppShimHandler::Host {
|
| - public:
|
| - FakeHost(const base::FilePath& profile_path,
|
| - const std::string& app_id,
|
| - TestingExtensionAppShimHandler* handler)
|
| - : profile_path_(profile_path),
|
| - app_id_(app_id),
|
| - handler_(handler),
|
| - close_count_(0) {}
|
| -
|
| - MOCK_METHOD1(OnAppLaunchComplete, void(AppShimLaunchResult));
|
| -
|
| - virtual void OnAppClosed() OVERRIDE {
|
| - handler_->OnShimClose(this);
|
| - ++close_count_;
|
| - }
|
| - virtual void OnAppHide() OVERRIDE {}
|
| - virtual void OnAppRequestUserAttention(AppShimAttentionType type) OVERRIDE {}
|
| - virtual base::FilePath GetProfilePath() const OVERRIDE {
|
| - return profile_path_;
|
| - }
|
| - virtual std::string GetAppId() const OVERRIDE { return app_id_; }
|
| -
|
| - int close_count() { return close_count_; }
|
| -
|
| - private:
|
| - base::FilePath profile_path_;
|
| - std::string app_id_;
|
| - TestingExtensionAppShimHandler* handler_;
|
| - int close_count_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FakeHost);
|
| -};
|
| -
|
| -class ExtensionAppShimHandlerTest : public testing::Test {
|
| - protected:
|
| - ExtensionAppShimHandlerTest()
|
| - : delegate_(new MockDelegate),
|
| - handler_(new TestingExtensionAppShimHandler(delegate_)),
|
| - profile_path_a_("Profile A"),
|
| - profile_path_b_("Profile B"),
|
| - host_aa_(profile_path_a_, kTestAppIdA, handler_.get()),
|
| - host_ab_(profile_path_a_, kTestAppIdB, handler_.get()),
|
| - host_bb_(profile_path_b_, kTestAppIdB, handler_.get()),
|
| - host_aa_duplicate_(profile_path_a_, kTestAppIdA, handler_.get()) {
|
| - base::FilePath extension_path("/fake/path");
|
| - base::DictionaryValue manifest;
|
| - manifest.SetString("name", "Fake Name");
|
| - manifest.SetString("version", "1");
|
| - std::string error;
|
| - extension_a_ = Extension::Create(
|
| - extension_path, extensions::Manifest::INTERNAL, manifest,
|
| - Extension::NO_FLAGS, kTestAppIdA, &error);
|
| - EXPECT_TRUE(extension_a_.get()) << error;
|
| -
|
| - extension_b_ = Extension::Create(
|
| - extension_path, extensions::Manifest::INTERNAL, manifest,
|
| - Extension::NO_FLAGS, kTestAppIdB, &error);
|
| - EXPECT_TRUE(extension_b_.get()) << error;
|
| -
|
| - EXPECT_CALL(*delegate_, ProfileExistsForPath(profile_path_a_))
|
| - .WillRepeatedly(Return(true));
|
| - EXPECT_CALL(*delegate_, ProfileForPath(profile_path_a_))
|
| - .WillRepeatedly(Return(&profile_a_));
|
| - EXPECT_CALL(*delegate_, ProfileExistsForPath(profile_path_b_))
|
| - .WillRepeatedly(Return(true));
|
| - EXPECT_CALL(*delegate_, ProfileForPath(profile_path_b_))
|
| - .WillRepeatedly(Return(&profile_b_));
|
| -
|
| - // In most tests, we don't care about the result of GetWindows, it just
|
| - // needs to be non-empty.
|
| - AppWindowList app_window_list;
|
| - app_window_list.push_back(static_cast<extensions::AppWindow*>(NULL));
|
| - EXPECT_CALL(*delegate_, GetWindows(_, _))
|
| - .WillRepeatedly(Return(app_window_list));
|
| -
|
| - EXPECT_CALL(*delegate_, GetAppExtension(_, kTestAppIdA))
|
| - .WillRepeatedly(Return(extension_a_.get()));
|
| - EXPECT_CALL(*delegate_, GetAppExtension(_, kTestAppIdB))
|
| - .WillRepeatedly(Return(extension_b_.get()));
|
| - EXPECT_CALL(*delegate_, LaunchApp(_, _, _))
|
| - .WillRepeatedly(Return());
|
| - }
|
| -
|
| - void NormalLaunch(AppShimHandler::Host* host) {
|
| - handler_->OnShimLaunch(host,
|
| - APP_SHIM_LAUNCH_NORMAL,
|
| - std::vector<base::FilePath>());
|
| - }
|
| -
|
| - void RegisterOnlyLaunch(AppShimHandler::Host* host) {
|
| - handler_->OnShimLaunch(host,
|
| - APP_SHIM_LAUNCH_REGISTER_ONLY,
|
| - std::vector<base::FilePath>());
|
| - }
|
| -
|
| - MockDelegate* delegate_;
|
| - scoped_ptr<TestingExtensionAppShimHandler> handler_;
|
| - base::FilePath profile_path_a_;
|
| - base::FilePath profile_path_b_;
|
| - TestingProfile profile_a_;
|
| - TestingProfile profile_b_;
|
| - FakeHost host_aa_;
|
| - FakeHost host_ab_;
|
| - FakeHost host_bb_;
|
| - FakeHost host_aa_duplicate_;
|
| - scoped_refptr<Extension> extension_a_;
|
| - scoped_refptr<Extension> extension_b_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(ExtensionAppShimHandlerTest);
|
| -};
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, LaunchProfileNotFound) {
|
| - // Bad profile path.
|
| - EXPECT_CALL(*delegate_, ProfileExistsForPath(profile_path_a_))
|
| - .WillOnce(Return(false))
|
| - .WillRepeatedly(Return(true));
|
| - EXPECT_CALL(host_aa_, OnAppLaunchComplete(APP_SHIM_LAUNCH_PROFILE_NOT_FOUND));
|
| - NormalLaunch(&host_aa_);
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, LaunchAppNotFound) {
|
| - // App not found.
|
| - EXPECT_CALL(*delegate_, GetAppExtension(&profile_a_, kTestAppIdA))
|
| - .WillRepeatedly(Return(static_cast<const Extension*>(NULL)));
|
| - EXPECT_CALL(*delegate_, EnableExtension(&profile_a_, kTestAppIdA, _))
|
| - .WillOnce(WithArgs<2>(Invoke(delegate_, &MockDelegate::RunCallback)));
|
| - EXPECT_CALL(host_aa_, OnAppLaunchComplete(APP_SHIM_LAUNCH_APP_NOT_FOUND));
|
| - NormalLaunch(&host_aa_);
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, LaunchAppNotEnabled) {
|
| - // App not found.
|
| - EXPECT_CALL(*delegate_, GetAppExtension(&profile_a_, kTestAppIdA))
|
| - .WillOnce(Return(static_cast<const Extension*>(NULL)))
|
| - .WillRepeatedly(Return(extension_a_.get()));
|
| - EXPECT_CALL(*delegate_, EnableExtension(&profile_a_, kTestAppIdA, _))
|
| - .WillOnce(WithArgs<2>(Invoke(delegate_, &MockDelegate::RunCallback)));
|
| - NormalLaunch(&host_aa_);
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, LaunchAndCloseShim) {
|
| - // Normal startup.
|
| - NormalLaunch(&host_aa_);
|
| - EXPECT_EQ(&host_aa_, handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -
|
| - NormalLaunch(&host_ab_);
|
| - EXPECT_EQ(&host_ab_, handler_->FindHost(&profile_a_, kTestAppIdB));
|
| -
|
| - std::vector<base::FilePath> some_file(1, base::FilePath("some_file"));
|
| - EXPECT_CALL(*delegate_,
|
| - LaunchApp(&profile_b_, extension_b_.get(), some_file));
|
| - handler_->OnShimLaunch(&host_bb_, APP_SHIM_LAUNCH_NORMAL, some_file);
|
| - EXPECT_EQ(&host_bb_, handler_->FindHost(&profile_b_, kTestAppIdB));
|
| -
|
| - // Activation when there is a registered shim finishes launch with success and
|
| - // focuses the app.
|
| - EXPECT_CALL(host_aa_, OnAppLaunchComplete(APP_SHIM_LAUNCH_SUCCESS));
|
| - EXPECT_CALL(*handler_, OnShimFocus(&host_aa_, APP_SHIM_FOCUS_NORMAL, _));
|
| - handler_->OnAppActivated(&profile_a_, kTestAppIdA);
|
| -
|
| - // Starting and closing a second host just focuses the app.
|
| - EXPECT_CALL(*handler_, OnShimFocus(&host_aa_duplicate_,
|
| - APP_SHIM_FOCUS_REOPEN,
|
| - some_file));
|
| - EXPECT_CALL(host_aa_duplicate_,
|
| - OnAppLaunchComplete(APP_SHIM_LAUNCH_DUPLICATE_HOST));
|
| - handler_->OnShimLaunch(&host_aa_duplicate_,
|
| - APP_SHIM_LAUNCH_NORMAL,
|
| - some_file);
|
| - EXPECT_EQ(&host_aa_, handler_->FindHost(&profile_a_, kTestAppIdA));
|
| - handler_->OnShimClose(&host_aa_duplicate_);
|
| - EXPECT_EQ(&host_aa_, handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -
|
| - // Normal close.
|
| - handler_->OnShimClose(&host_aa_);
|
| - EXPECT_FALSE(handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -
|
| - // Closing the second host afterward does nothing.
|
| - handler_->OnShimClose(&host_aa_duplicate_);
|
| - EXPECT_FALSE(handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, AppLifetime) {
|
| - // When the app activates, if there is no shim, start one.
|
| - EXPECT_CALL(*delegate_, LaunchShim(&profile_a_, extension_a_.get()));
|
| - handler_->OnAppActivated(&profile_a_, kTestAppIdA);
|
| -
|
| - // Normal shim launch adds an entry in the map.
|
| - // App should not be launched here, but return success to the shim.
|
| - EXPECT_CALL(*delegate_,
|
| - LaunchApp(&profile_a_, extension_a_.get(), _))
|
| - .Times(0);
|
| - EXPECT_CALL(host_aa_, OnAppLaunchComplete(APP_SHIM_LAUNCH_SUCCESS));
|
| - RegisterOnlyLaunch(&host_aa_);
|
| - EXPECT_EQ(&host_aa_, handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -
|
| - // Return no app windows for OnShimFocus and OnShimQuit.
|
| - AppWindowList app_window_list;
|
| - EXPECT_CALL(*delegate_, GetWindows(&profile_a_, kTestAppIdA))
|
| - .WillRepeatedly(Return(app_window_list));
|
| -
|
| - // Non-reopen focus does nothing.
|
| - EXPECT_CALL(*handler_, OnShimFocus(&host_aa_, APP_SHIM_FOCUS_NORMAL, _))
|
| - .WillOnce(Invoke(handler_.get(),
|
| - &TestingExtensionAppShimHandler::RealOnShimFocus));
|
| - EXPECT_CALL(*delegate_,
|
| - LaunchApp(&profile_a_, extension_a_.get(), _))
|
| - .Times(0);
|
| - handler_->OnShimFocus(&host_aa_,
|
| - APP_SHIM_FOCUS_NORMAL,
|
| - std::vector<base::FilePath>());
|
| -
|
| - // Reopen focus launches the app.
|
| - EXPECT_CALL(*handler_, OnShimFocus(&host_aa_, APP_SHIM_FOCUS_REOPEN, _))
|
| - .WillOnce(Invoke(handler_.get(),
|
| - &TestingExtensionAppShimHandler::RealOnShimFocus));
|
| - std::vector<base::FilePath> some_file(1, base::FilePath("some_file"));
|
| - EXPECT_CALL(*delegate_,
|
| - LaunchApp(&profile_a_, extension_a_.get(), some_file));
|
| - handler_->OnShimFocus(&host_aa_, APP_SHIM_FOCUS_REOPEN, some_file);
|
| -
|
| - // Quit just closes all the windows. This tests that it doesn't terminate,
|
| - // but we expect closing all windows triggers a OnAppDeactivated from
|
| - // AppLifetimeMonitor.
|
| - handler_->OnShimQuit(&host_aa_);
|
| -
|
| - // Closing all windows closes the shim and checks if Chrome should be
|
| - // terminated.
|
| - EXPECT_CALL(*delegate_, MaybeTerminate())
|
| - .WillOnce(Return());
|
| - handler_->OnAppDeactivated(&profile_a_, kTestAppIdA);
|
| - EXPECT_EQ(1, host_aa_.close_count());
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, MaybeTerminate) {
|
| - // Launch shims, adding entries in the map.
|
| - EXPECT_CALL(host_aa_, OnAppLaunchComplete(APP_SHIM_LAUNCH_SUCCESS));
|
| - RegisterOnlyLaunch(&host_aa_);
|
| - EXPECT_EQ(&host_aa_, handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -
|
| - EXPECT_CALL(host_ab_, OnAppLaunchComplete(APP_SHIM_LAUNCH_SUCCESS));
|
| - RegisterOnlyLaunch(&host_ab_);
|
| - EXPECT_EQ(&host_ab_, handler_->FindHost(&profile_a_, kTestAppIdB));
|
| -
|
| - // Return empty window list.
|
| - AppWindowList app_window_list;
|
| - EXPECT_CALL(*delegate_, GetWindows(_, _))
|
| - .WillRepeatedly(Return(app_window_list));
|
| -
|
| - // Quitting when there's another shim should not terminate.
|
| - EXPECT_CALL(*delegate_, MaybeTerminate())
|
| - .Times(0);
|
| - handler_->OnAppDeactivated(&profile_a_, kTestAppIdA);
|
| -
|
| - // Quitting when it's the last shim should terminate.
|
| - EXPECT_CALL(*delegate_, MaybeTerminate());
|
| - handler_->OnAppDeactivated(&profile_a_, kTestAppIdB);
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, RegisterOnly) {
|
| - // For an APP_SHIM_LAUNCH_REGISTER_ONLY, don't launch the app.
|
| - EXPECT_CALL(*delegate_, LaunchApp(_, _, _))
|
| - .Times(0);
|
| - EXPECT_CALL(host_aa_, OnAppLaunchComplete(APP_SHIM_LAUNCH_SUCCESS));
|
| - RegisterOnlyLaunch(&host_aa_);
|
| - EXPECT_TRUE(handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -
|
| - // Close the shim, removing the entry in the map.
|
| - handler_->OnShimClose(&host_aa_);
|
| - EXPECT_FALSE(handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -}
|
| -
|
| -TEST_F(ExtensionAppShimHandlerTest, LoadProfile) {
|
| - // If the profile is not loaded when an OnShimLaunch arrives, return false
|
| - // and load the profile asynchronously. Launch the app when the profile is
|
| - // ready.
|
| - EXPECT_CALL(*delegate_, ProfileForPath(profile_path_a_))
|
| - .WillOnce(Return(static_cast<Profile*>(NULL)))
|
| - .WillRepeatedly(Return(&profile_a_));
|
| - EXPECT_CALL(*delegate_, LoadProfileAsync(profile_path_a_, _))
|
| - .WillOnce(Invoke(delegate_, &MockDelegate::CaptureLoadProfileCallback));
|
| - NormalLaunch(&host_aa_);
|
| - EXPECT_FALSE(handler_->FindHost(&profile_a_, kTestAppIdA));
|
| - delegate_->RunLoadProfileCallback(profile_path_a_, &profile_a_);
|
| - EXPECT_TRUE(handler_->FindHost(&profile_a_, kTestAppIdA));
|
| -}
|
| -
|
| -} // namespace apps
|
|
|