Index: chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc |
diff --git a/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a54b8ced6734fffd33ad6d5b853424675e1bcf07 |
--- /dev/null |
+++ b/chrome/browser/ui/app_list/app_list_service_impl_browsertest.cc |
@@ -0,0 +1,104 @@ |
+// Copyright 2014 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 "chrome/browser/ui/app_list/app_list_service_impl.h" |
+ |
+#include "base/prefs/pref_service.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
+#include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+ |
+namespace test { |
+ |
+// Test API to access private members of AppListServiceImpl. |
+class AppListServiceImplTestApi { |
+ public: |
+ explicit AppListServiceImplTestApi(AppListServiceImpl* impl) : impl_(impl) {} |
+ |
+ ProfileLoader* profile_loader() { return impl_->profile_loader_.get(); } |
+ |
+ private: |
+ AppListServiceImpl* impl_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AppListServiceImplTestApi); |
+}; |
+ |
+} // namespace test |
+ |
+// Browser Test for AppListServiceImpl that runs on all platforms supporting |
+// app_list. |
+class AppListServiceImplBrowserTest : public InProcessBrowserTest { |
+ public: |
+ AppListServiceImplBrowserTest() {} |
+ |
+ // Overridden from InProcessBrowserTest: |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ service_ = test::GetAppListServiceImpl(); |
+ test_api_.reset(new test::AppListServiceImplTestApi(service_)); |
+ } |
+ |
+ protected: |
+ AppListServiceImpl* service_; |
+ scoped_ptr<test::AppListServiceImplTestApi> test_api_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(AppListServiceImplBrowserTest); |
+}; |
+ |
+// Test that showing a loaded profile for the first time is lazy and |
+// synchronous. Then tests that showing a second loaded profile without |
+// dismissing correctly switches profiles. |
+IN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, ShowLoadedProfiles) { |
+ PrefService* local_state = g_browser_process->local_state(); |
+ EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile)); |
+ |
+ // When never shown, profile path should match the last used profile. |
+ base::FilePath user_data_dir = |
+ g_browser_process->profile_manager()->user_data_dir(); |
+ EXPECT_EQ(service_->GetProfilePath(user_data_dir), |
+ browser()->profile()->GetPath()); |
+ |
+ // Just requesting the profile path shouldn't set it. |
+ EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile)); |
+ |
+ // Loading the Profile* should be lazy, except on ChromeOS where it is bound |
+ // to ChromeLauncherController, which always has a profile. |
+#if defined(OS_CHROMEOS) |
+ EXPECT_TRUE(service_->GetCurrentAppListProfile()); |
+#else |
+ EXPECT_FALSE(service_->GetCurrentAppListProfile()); |
+#endif |
+ |
+ // Showing the app list for an unspecified profile, uses the loaded profile. |
+ service_->Show(); |
+ |
+ // Load should be synchronous. |
+ EXPECT_FALSE(test_api_->profile_loader()->IsAnyProfileLoading()); |
+ EXPECT_EQ(service_->GetCurrentAppListProfile(), browser()->profile()); |
+ |
+#if defined(OS_CHROMEOS) |
+ // ChromeOS doesn't record the app list profile pref, and doesn't do profile |
+ // switching. |
+ EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile)); |
+ |
+#else |
+ // Preference should be updated automatically. |
+ EXPECT_TRUE(local_state->HasPrefPath(prefs::kAppListProfile)); |
+ EXPECT_EQ(local_state->GetString(prefs::kAppListProfile), |
+ browser()->profile()->GetPath().BaseName().MaybeAsASCII()); |
+ |
+ // Show for a second, pre-loaded profile without dismissing. Don't try this on |
+ // ChromeOS because it does not support profile switching the app list. |
+ Profile* profile2 = test::CreateSecondProfileAsync(); |
+ service_->ShowForProfile(profile2); |
+ |
+ // Current profile and saved path should update synchronously. |
+ EXPECT_FALSE(test_api_->profile_loader()->IsAnyProfileLoading()); |
+ EXPECT_EQ(profile2->GetPath(), service_->GetProfilePath(user_data_dir)); |
+ EXPECT_EQ(profile2, service_->GetCurrentAppListProfile()); |
+#endif |
+} |