background_mode_manager_unittest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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 "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/message_loop/message_loop.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_mode_manager.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/extensions/extension_function_test_utils.h"
120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon_menu_model.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_unittest_util.h"
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/message_center/message_center.h"
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/user_manager.h"
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Helper class that tracks state transitions in BackgroundModeManager and
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// exposes them via getters.
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SimpleTestBackgroundModeManager : public BackgroundModeManager {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimpleTestBackgroundModeManager(
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CommandLine* command_line, ProfileInfoCache* cache)
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : BackgroundModeManager(command_line, cache),
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        have_status_tray_(false),
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        launch_on_startup_(false),
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        has_shown_balloon_(false) {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ResumeBackgroundMode();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void EnableLaunchOnStartup(bool launch) OVERRIDE {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    launch_on_startup_ = launch;
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DisplayAppInstalledNotification(
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extension) OVERRIDE {
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    has_shown_balloon_ = true;
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void CreateStatusTrayIcon() OVERRIDE { have_status_tray_ = true; }
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RemoveStatusTrayIcon() OVERRIDE { have_status_tray_ = false; }
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool HaveStatusTray() const { return have_status_tray_; }
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool IsLaunchOnStartup() const { return launch_on_startup_; }
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool HasShownBalloon() const { return has_shown_balloon_; }
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetHasShownBalloon(bool value) { has_shown_balloon_ = value; }
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Flags to track whether we are launching on startup/have a status tray.
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool have_status_tray_;
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool launch_on_startup_;
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool has_shown_balloon_;
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SimpleTestBackgroundModeManager);
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestStatusIcon : public StatusIcon {
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestStatusIcon() {}
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetImage(const gfx::ImageSkia& image) OVERRIDE {}
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetPressedImage(const gfx::ImageSkia& image) OVERRIDE {}
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetToolTip(const base::string16& tool_tip) OVERRIDE {}
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DisplayBalloon(const gfx::ImageSkia& icon,
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              const base::string16& title,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              const base::string16& contents) OVERRIDE {}
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void UpdatePlatformContextMenu(
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      StatusIconMenuModel* menu) OVERRIDE {}
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestStatusIcon);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// More complex test helper that exposes APIs for fine grained control of
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// things like the number of background applications. This allows writing
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// smaller tests that don't have to install/uninstall extensions.
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestBackgroundModeManager : public SimpleTestBackgroundModeManager {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandLine* command_line, ProfileInfoCache* cache, bool enabled)
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : SimpleTestBackgroundModeManager(command_line, cache),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enabled_(enabled),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        app_count_(0),
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile_app_count_(0) {
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ResumeBackgroundMode();
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBackgroundAppCount() const OVERRIDE { return app_count_; }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBackgroundAppCountForProfile(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* const profile) const OVERRIDE {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile_app_count_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBackgroundAppCount(int count) { app_count_ = count; }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBackgroundAppCountForProfile(int count) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_app_count_ = count;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetEnabled(bool enabled) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enabled_ = enabled;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnBackgroundModeEnabledPrefChanged();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool IsBackgroundModePrefEnabled() const OVERRIDE { return enabled_; }
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enabled_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int app_count_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int profile_app_count_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestBackgroundModeManager);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid AssertBackgroundModeActive(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestBackgroundModeManager& manager) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(chrome::WillKeepAlive());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.HaveStatusTray());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.IsLaunchOnStartup());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid AssertBackgroundModeInactive(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TestBackgroundModeManager& manager) {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager.HaveStatusTray());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager.IsLaunchOnStartup());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid AssertBackgroundModeSuspended(
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const TestBackgroundModeManager& manager) {
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(manager.HaveStatusTray());
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(manager.IsLaunchOnStartup());
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass BackgroundModeManagerTest : public testing::Test {
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BackgroundModeManagerTest() {}
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~BackgroundModeManagerTest() {}
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    command_line_.reset(new CommandLine(CommandLine::NO_PROGRAM));
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile_manager_ = CreateTestingProfileManager();
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile_ = profile_manager_->CreateTestingProfile("p1");
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<CommandLine> command_line_;
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> CreateExtension(
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::Manifest::Location location,
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::string& data,
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::string& id) {
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<base::DictionaryValue> parsed_manifest(
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extension_function_test_utils::ParseDictionary(data));
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return extension_function_test_utils::CreateExtension(
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        location,
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        parsed_manifest.get(),
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        id);
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // From views::MenuModelAdapter::IsCommandEnabled with modification.
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool IsCommandEnabled(ui::MenuModel* model, int id) const {
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int index = 0;
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (ui::MenuModel::GetModelAndIndexForCommandId(id, &model, &index))
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return model->IsEnabledAt(index);
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<TestingProfileManager> profile_manager_;
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Test profile used by all tests - this is owned by profile_manager_.
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingProfile* profile_;
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<TestingProfileManager> CreateTestingProfileManager() {
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_ptr<TestingProfileManager> profile_manager
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        (new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(profile_manager->SetUp());
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return profile_manager.Pass();
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BackgroundModeManagerTest);
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass BackgroundModeManagerWithExtensionsTest
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : public BackgroundModeManagerTest {
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BackgroundModeManagerWithExtensionsTest() {}
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~BackgroundModeManagerWithExtensionsTest() {}
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    BackgroundModeManagerTest::SetUp();
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Aura clears notifications from the message center at shutdown.
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_center::MessageCenter::Initialize();
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // BackgroundModeManager actually affects Chrome start/stop state,
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // tearing down our thread bundle before we've had chance to clean
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // everything up. Keeping Chrome alive prevents this.
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // We aren't interested in if the keep alive works correctly in this test.
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    chrome::IncrementKeepAliveCount();
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_CHROMEOS)
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // On ChromeOS shutdown, HandleAppExitingForPlatform will call
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // chrome::DecrementKeepAliveCount because it assumes the aura shell
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // called chrome::IncrementKeepAliveCount. Simulate the call here.
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    chrome::IncrementKeepAliveCount();
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Create our test BackgroundModeManager.
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_.reset(new SimpleTestBackgroundModeManager(
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        command_line_.get(), profile_manager_->profile_info_cache()));
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->RegisterProfile(profile_);
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void TearDown() {
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Clean up the status icon. If this is not done before profile deletes,
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // the context menu updates will DCHECK with the now deleted profiles.
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    StatusIcon* status_icon = manager_->status_icon_;
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->status_icon_ = NULL;
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete status_icon;
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // We have to destroy the profiles now because we created them with real
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // thread state. This causes a lot of machinery to spin up that stops
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // working when we tear down our thread state at the end of the test.
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile_manager_->DeleteAllTestingProfiles();
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // We're getting ready to shutdown the message loop. Clear everything out!
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::MessageLoop::current()->RunUntilIdle();
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Matching the call to IncrementKeepAliveCount in SetUp().
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    chrome::DecrementKeepAliveCount();
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // SimpleTestBackgroundModeManager has dependencies on the infrastructure.
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // It should get cleared first.
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_.reset();
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The Profile Manager references the Browser Process.
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The Browser Process references the Notification UI Manager.
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The Notification UI Manager references the Message Center.
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // As a result, we have to clear the browser process state here
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // before tearing down the Message Center.
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    profile_manager_.reset();
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Message Center shutdown must occur after the DecrementKeepAliveCount
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // because DecrementKeepAliveCount will end up referencing the message
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // center during cleanup.
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_center::MessageCenter::Shutdown();
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Clear the shutdown flag to isolate the remaining effect of this test.
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    browser_shutdown::SetTryingToQuit(false);
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<SimpleTestBackgroundModeManager> manager_;
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Required for extension service.
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_CHROMEOS)
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ChromeOS needs extra services to run in the following order.
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chromeos::ScopedTestCrosSettings test_cros_settings_;
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chromeos::ScopedTestUserManager test_user_manager_;
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BackgroundModeManagerWithExtensionsTest);
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, BackgroundAppLoadUnload) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mimic app load.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manager.SuspendBackgroundMode();
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AssertBackgroundModeSuspended(manager);
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manager.ResumeBackgroundMode();
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mimic app unload.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(0);
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manager.SuspendBackgroundMode();
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Mimic app load while suspended, e.g. from sync. This should enable and
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // resume background mode.
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AssertBackgroundModeActive(manager);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// App installs while background mode is disabled should do nothing.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, BackgroundAppInstallUninstallWhileDisabled) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn off background mode.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(false);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.DisableBackgroundMode();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Status tray icons will not be created, launch on startup status will not
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be modified.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(0);
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-enable background mode.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(true);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.EnableBackgroundMode();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// App installs while disabled should do nothing until background mode is
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enabled..
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, EnableAfterBackgroundAppInstall) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app, should show status tray icon.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnBackgroundAppInstalled does not actually add an app to the
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BackgroundApplicationListModel which would result in another
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call to CreateStatusTray.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn off background mode - should hide status tray icon.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(false);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.DisableBackgroundMode();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn back on background mode - again, no status tray icon
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will show up since we didn't actually add anything to the list.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(true);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.EnableBackgroundMode();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall app, should hide status tray icon again.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(0);
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, MultiProfile) {
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingProfile* profile2 = profile_manager_->CreateTestingProfile("p2");
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.RegisterProfile(profile2);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app, should show status tray icon.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app for other profile, hsould show other status tray icon.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(2);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnApplicationListChanged(profile2);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should hide both status tray icons.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(false);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.DisableBackgroundMode();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn back on background mode - should show both status tray icons.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(true);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.EnableBackgroundMode();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnApplicationListChanged(profile2);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is still one background app alive
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeActive(manager);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(0);
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AssertBackgroundModeInactive(manager);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, ProfileInfoCacheStorage) {
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingProfile* profile2 = profile_manager_->CreateTestingProfile("p2");
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.RegisterProfile(profile2);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ProfileInfoCache* cache = profile_manager_->profile_info_cache();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, cache->GetNumberOfProfiles());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cache->GetBackgroundStatusOfProfileAtIndex(0));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cache->GetBackgroundStatusOfProfileAtIndex(1));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app, should show status tray icon.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(1);
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app for other profile.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(1);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnApplicationListChanged(profile2);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache->GetBackgroundStatusOfProfileAtIndex(0));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache->GetBackgroundStatusOfProfileAtIndex(1));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(0);
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t p1_index = cache->GetIndexOfProfileWithPath(profile_->GetPath());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cache->GetBackgroundStatusOfProfileAtIndex(p1_index));
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(0);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnApplicationListChanged(profile2);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t p2_index = cache->GetIndexOfProfileWithPath(profile_->GetPath());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cache->GetBackgroundStatusOfProfileAtIndex(p2_index));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even though neither has background status on, there should still be two
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profiles in the cache.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2u, cache->GetNumberOfProfiles());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, ProfileInfoCacheObserver) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Install app, should show status tray icon.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(1);
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnProfileNameChanged(
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile_->GetPath(),
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager.GetBackgroundModeData(profile_)->name());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::UTF8ToUTF16("p1"),
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            manager.GetBackgroundModeData(profile_)->name());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(chrome::WillKeepAlive());
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingProfile* profile2 = profile_manager_->CreateTestingProfile("p2");
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.RegisterProfile(profile2);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, manager.NumberOfBackgroundModeData());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnProfileAdded(profile2->GetPath());
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::UTF8ToUTF16("p2"),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager.GetBackgroundModeData(profile2)->name());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.OnProfileWillBeRemoved(profile2->GetPath());
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Should still be in background mode after deleting profile.
495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(chrome::WillKeepAlive());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, manager.NumberOfBackgroundModeData());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the background mode data we think is in the map actually is.
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::UTF8ToUTF16("p1"),
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            manager.GetBackgroundModeData(profile_)->name());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, DeleteBackgroundProfile) {
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Tests whether deleting the only profile when it is a BG profile works
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // or not (http://crbug.com/346214).
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestBackgroundModeManager manager(
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Install app, should show status tray icon.
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager.OnBackgroundAppInstalled(NULL);
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager.SetBackgroundAppCount(1);
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(1);
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnApplicationListChanged(profile_);
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager.OnProfileNameChanged(
518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile_->GetPath(),
519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager.GetBackgroundModeData(profile_)->name());
520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(chrome::WillKeepAlive());
522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager.SetBackgroundAppCount(0);
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager.SetBackgroundAppCountForProfile(0);
524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.OnProfileWillBeRemoved(profile_->GetPath());
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(chrome::WillKeepAlive());
526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest, DisableBackgroundModeUnderTestFlag) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line_->AppendSwitch(switches::kKeepAliveForTest);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), true);
532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager.ShouldBeInBackgroundMode());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager.SetEnabled(false);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager.ShouldBeInBackgroundMode());
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BackgroundModeManagerTest,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       BackgroundModeDisabledPreventsKeepAliveOnStartup) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line_->AppendSwitch(switches::kKeepAliveForTest);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBackgroundModeManager manager(
542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      command_line_.get(), profile_manager_->profile_info_cache(), false);
543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager.RegisterProfile(profile_);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager.ShouldBeInBackgroundMode());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
547116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(BackgroundModeManagerWithExtensionsTest, BackgroundMenuGeneration) {
5480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<extensions::Extension> component_extension(
5490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CreateExtension(
5500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        extensions::Manifest::COMPONENT,
5510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "{\"name\": \"Component Extension\","
5520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"version\": \"1.0\","
5530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"manifest_version\": 2,"
5540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"permissions\": [\"background\"]}",
5550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "ID-1"));
5560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<extensions::Extension> component_extension_with_options(
5580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CreateExtension(
5590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        extensions::Manifest::COMPONENT,
5600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "{\"name\": \"Component Extension with Options\","
5610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"version\": \"1.0\","
5620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"manifest_version\": 2,"
5630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"permissions\": [\"background\"],"
5640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"options_page\": \"test.html\"}",
5650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "ID-2"));
5660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<extensions::Extension> regular_extension(
5680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CreateExtension(
5690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        extensions::Manifest::COMMAND_LINE,
5700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "{\"name\": \"Regular Extension\", "
5710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"version\": \"1.0\","
5720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"manifest_version\": 2,"
5730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"permissions\": [\"background\"]}",
5740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "ID-3"));
5750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<extensions::Extension> regular_extension_with_options(
5770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    CreateExtension(
5780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        extensions::Manifest::COMMAND_LINE,
5790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "{\"name\": \"Regular Extension with Options\","
5800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"version\": \"1.0\","
5810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"manifest_version\": 2,"
5820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"permissions\": [\"background\"],"
5830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "\"options_page\": \"test.html\"}",
5840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        "ID-4"));
5850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  static_cast<extensions::TestExtensionSystem*>(
587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile_))->CreateExtensionService(
5880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          CommandLine::ForCurrentProcess(),
5890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          base::FilePath(),
5900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          false);
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* service =
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile_)->extension_service();
5930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  service->Init();
5940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  service->AddComponentExtension(component_extension);
5960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  service->AddComponentExtension(component_extension_with_options);
5970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  service->AddExtension(regular_extension);
5980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  service->AddExtension(regular_extension_with_options);
5990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<StatusIconMenuModel> menu(new StatusIconMenuModel(NULL));
6010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<StatusIconMenuModel> submenu(new StatusIconMenuModel(NULL));
6020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  BackgroundModeManager::BackgroundModeData* bmd =
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager_->GetBackgroundModeData(profile_);
6040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bmd->BuildProfileMenu(submenu.get(), menu.get());
6050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(
6060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      submenu->GetLabelAt(0) ==
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Component Extension"));
6080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_FALSE(submenu->IsCommandIdEnabled(submenu->GetCommandIdAt(0)));
6090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(
6100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      submenu->GetLabelAt(1) ==
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Component Extension with Options"));
6120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(submenu->IsCommandIdEnabled(submenu->GetCommandIdAt(1)));
6130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(
6140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      submenu->GetLabelAt(2) ==
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Regular Extension"));
6160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(submenu->IsCommandIdEnabled(submenu->GetCommandIdAt(2)));
6170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(
6180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      submenu->GetLabelAt(3) ==
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Regular Extension with Options"));
6200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  EXPECT_TRUE(submenu->IsCommandIdEnabled(submenu->GetCommandIdAt(3)));
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
623116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(BackgroundModeManagerWithExtensionsTest,
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch       BackgroundMenuGenerationMultipleProfile) {
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingProfile* profile2 = profile_manager_->CreateTestingProfile("p2");
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<extensions::Extension> component_extension(
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateExtension(
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        extensions::Manifest::COMPONENT,
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "{\"name\": \"Component Extension\","
630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"version\": \"1.0\","
631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"manifest_version\": 2,"
632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"permissions\": [\"background\"]}",
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "ID-1"));
634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<extensions::Extension> component_extension_with_options(
636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateExtension(
637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        extensions::Manifest::COMPONENT,
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "{\"name\": \"Component Extension with Options\","
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"version\": \"1.0\","
640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"manifest_version\": 2,"
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"permissions\": [\"background\"],"
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"options_page\": \"test.html\"}",
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "ID-2"));
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<extensions::Extension> regular_extension(
646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateExtension(
647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        extensions::Manifest::COMMAND_LINE,
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "{\"name\": \"Regular Extension\", "
649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"version\": \"1.0\","
650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"manifest_version\": 2,"
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"permissions\": [\"background\"]}",
652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "ID-3"));
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<extensions::Extension> regular_extension_with_options(
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateExtension(
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        extensions::Manifest::COMMAND_LINE,
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "{\"name\": \"Regular Extension with Options\","
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"version\": \"1.0\","
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"manifest_version\": 2,"
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"permissions\": [\"background\"],"
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "\"options_page\": \"test.html\"}",
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        "ID-4"));
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static_cast<extensions::TestExtensionSystem*>(
665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile_))->CreateExtensionService(
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          CommandLine::ForCurrentProcess(),
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::FilePath(),
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          false);
669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* service1 =
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile_)->extension_service();
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service1->Init();
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service1->AddComponentExtension(component_extension);
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service1->AddComponentExtension(component_extension_with_options);
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service1->AddExtension(regular_extension);
676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service1->AddExtension(regular_extension_with_options);
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static_cast<extensions::TestExtensionSystem*>(
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile2))->CreateExtensionService(
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          CommandLine::ForCurrentProcess(),
681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          base::FilePath(),
682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          false);
683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* service2 =
684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile2)->extension_service();
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service2->Init();
686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service2->AddComponentExtension(component_extension);
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service2->AddExtension(regular_extension);
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  service2->AddExtension(regular_extension_with_options);
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager_->RegisterProfile(profile2);
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager_->status_icon_ = new TestStatusIcon();
694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager_->UpdateStatusTrayIconContextMenu();
695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  StatusIconMenuModel* context_menu = manager_->context_menu_;
696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(context_menu != NULL);
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Background Profile Enable Checks
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(context_menu->GetLabelAt(3) == base::UTF8ToUTF16("p1"));
700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context_menu->IsCommandIdEnabled(context_menu->GetCommandIdAt(3)));
702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(context_menu->GetCommandIdAt(3) == 4);
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(context_menu->GetLabelAt(4) == base::UTF8ToUTF16("p2"));
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context_menu->IsCommandIdEnabled(context_menu->GetCommandIdAt(4)));
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(context_menu->GetCommandIdAt(4) == 8);
708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Profile 1 Submenu Checks
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  StatusIconMenuModel* profile1_submenu =
711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<StatusIconMenuModel*>(context_menu->GetSubmenuModelAt(3));
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->GetLabelAt(0) ==
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Component Extension"));
715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(
716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->IsCommandIdEnabled(
717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile1_submenu->GetCommandIdAt(0)));
718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile1_submenu->GetCommandIdAt(0) == 0);
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->GetLabelAt(1) ==
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Component Extension with Options"));
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->IsCommandIdEnabled(
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile1_submenu->GetCommandIdAt(1)));
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile1_submenu->GetCommandIdAt(1) == 1);
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->GetLabelAt(2) ==
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Regular Extension"));
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->IsCommandIdEnabled(
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile1_submenu->GetCommandIdAt(2)));
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile1_submenu->GetCommandIdAt(2) == 2);
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->GetLabelAt(3) ==
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Regular Extension with Options"));
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile1_submenu->IsCommandIdEnabled(
738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile1_submenu->GetCommandIdAt(3)));
739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile1_submenu->GetCommandIdAt(3) == 3);
740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Profile 2 Submenu Checks
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  StatusIconMenuModel* profile2_submenu =
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<StatusIconMenuModel*>(context_menu->GetSubmenuModelAt(4));
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile2_submenu->GetLabelAt(0) ==
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Component Extension"));
747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile2_submenu->IsCommandIdEnabled(
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile2_submenu->GetCommandIdAt(0)));
750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile2_submenu->GetCommandIdAt(0) == 5);
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile2_submenu->GetLabelAt(1) ==
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Regular Extension"));
754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile2_submenu->IsCommandIdEnabled(
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile2_submenu->GetCommandIdAt(1)));
757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile2_submenu->GetCommandIdAt(1) == 6);
758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile2_submenu->GetLabelAt(2) ==
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::UTF8ToUTF16("Regular Extension with Options"));
761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      profile2_submenu->IsCommandIdEnabled(
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          profile2_submenu->GetCommandIdAt(2)));
764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(profile2_submenu->GetCommandIdAt(2) == 7);
765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Model Adapter Checks for crbug.com/315164
767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // P1: Profile 1 Menu Item
768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // P2: Profile 2 Menu Item
769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // CE: Component Extension Menu Item
770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // CEO: Component Extenison with Options Menu Item
771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // RE: Regular Extension Menu Item
772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // REO: Regular Extension with Options Menu Item
773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(IsCommandEnabled(context_menu, 0)); // P1 - CE
774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 1));  // P1 - CEO
775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 2));  // P1 - RE
776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 3));  // P1 - REO
777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 4));  // P1
778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(IsCommandEnabled(context_menu, 5)); // P2 - CE
779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 6));  // P2 - RE
780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 7));  // P2 - REO
781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(IsCommandEnabled(context_menu, 8));  // P2
782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
784116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(BackgroundModeManagerWithExtensionsTest, BalloonDisplay) {
785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> bg_ext(
786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateExtension(
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::Manifest::COMMAND_LINE,
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "{\"name\": \"Background Extension\", "
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"version\": \"1.0\","
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"manifest_version\": 2,"
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"permissions\": [\"background\"]}",
792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "ID-1"));
793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> upgraded_bg_ext(
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateExtension(
796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::Manifest::COMMAND_LINE,
797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "{\"name\": \"Background Extension\", "
798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"version\": \"2.0\","
799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"manifest_version\": 2,"
800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"permissions\": [\"background\"]}",
801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "ID-1"));
802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> no_bg_ext(
804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateExtension(
805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::Manifest::COMMAND_LINE,
806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "{\"name\": \"Regular Extension\", "
807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"version\": \"1.0\","
808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"manifest_version\": 2,"
809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"permissions\": []}",
810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "ID-2"));
811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> upgraded_no_bg_ext_has_bg(
813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateExtension(
814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::Manifest::COMMAND_LINE,
815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "{\"name\": \"Regular Extension\", "
816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"version\": \"2.0\","
817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"manifest_version\": 2,"
818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "\"permissions\": [\"background\"]}",
819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        "ID-2"));
820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static_cast<extensions::TestExtensionSystem*>(
822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile_))->CreateExtensionService(
823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          CommandLine::ForCurrentProcess(),
824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::FilePath(),
825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          false);
826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* service =
828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::ExtensionSystem::Get(profile_)->extension_service();
829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!service->is_ready());
830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->Init();
831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(service->is_ready());
832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager_->status_icon_ = new TestStatusIcon();
833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager_->UpdateStatusTrayIconContextMenu();
834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Adding a background extension should show the balloon.
836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(manager_->HasShownBalloon());
837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->AddExtension(bg_ext);
838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(manager_->HasShownBalloon());
839116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Adding an extension without background should not show the balloon.
841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager_->SetHasShownBalloon(false);
842116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->AddExtension(no_bg_ext);
843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(manager_->HasShownBalloon());
844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Upgrading an extension that has background should not reshow the balloon.
846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->AddExtension(upgraded_bg_ext);
847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(manager_->HasShownBalloon());
848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Upgrading an extension that didn't have background to one that does should
850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // show the balloon.
851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->AddExtension(upgraded_no_bg_ext_has_bg);
852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(manager_->HasShownBalloon());
8530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
854