Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6279)

Unified Diff: chrome/browser/profiles/profile_loader_unittest.cc

Issue 16766003: Move ProfileLoader to chrome/browser/profiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: gyp-def out profile_loader* on android Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/profiles/profile_loader.cc ('k') | chrome/browser/ui/app_list/app_list_service_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/profile_loader_unittest.cc
diff --git a/chrome/browser/profiles/profile_loader_unittest.cc b/chrome/browser/profiles/profile_loader_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..3c3598bf4fa3eeee2203a31eb803d8fc43f0be04
--- /dev/null
+++ b/chrome/browser/profiles/profile_loader_unittest.cc
@@ -0,0 +1,132 @@
+// 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 "chrome/browser/profiles/profile_loader.h"
+
+#include <map>
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_loader.h"
+#include "chrome/test/base/testing_profile.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::Return;
+using ::testing::StrictMock;
+using ::testing::WithArgs;
+
+class TestProfileLoader : public ProfileLoader {
+ public:
+ TestProfileLoader() : ProfileLoader(NULL) {}
+ virtual ~TestProfileLoader() {}
+
+ MOCK_METHOD1(GetProfileByPath, Profile*(const base::FilePath&));
+ MOCK_METHOD5(CreateProfileAsync, void(const base::FilePath&,
+ const ProfileManager::CreateCallback&,
+ const string16&,
+ const string16&,
+ bool));
+
+ void SetCreateCallback(const base::FilePath& path,
+ const ProfileManager::CreateCallback& callback) {
+ callbacks_[path] = callback;
+ }
+
+ void RunCreateCallback(const base::FilePath& path,
+ Profile* profile,
+ Profile::CreateStatus status) {
+ callbacks_[path].Run(profile, status);
+ }
+
+ private:
+ std::map<base::FilePath, ProfileManager::CreateCallback> callbacks_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestProfileLoader);
+};
+
+class MockCallback : public base::RefCountedThreadSafe<MockCallback> {
+ public:
+ MockCallback();
+ MOCK_METHOD1(Run, void(Profile*));
+
+ protected:
+ friend class base::RefCountedThreadSafe<MockCallback>;
+ virtual ~MockCallback();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockCallback);
+};
+
+MockCallback::MockCallback() {}
+MockCallback::~MockCallback() {}
+
+TEST(ProfileLoaderTest, LoadProfileInvalidatingOtherLoads) {
+ TestingProfile profile;
+ base::FilePath fake_profile_path_1 =
+ base::FilePath::FromUTF8Unsafe("fake/profile 1");
+ base::FilePath fake_profile_path_2 =
+ base::FilePath::FromUTF8Unsafe("fake/profile 2");
+
+ TestProfileLoader loader;
+ EXPECT_FALSE(loader.IsAnyProfileLoading());
+
+ // path_1 never loads.
+ EXPECT_CALL(loader, GetProfileByPath(fake_profile_path_1))
+ .WillRepeatedly(Return(static_cast<Profile*>(NULL)));
+ EXPECT_CALL(loader, CreateProfileAsync(fake_profile_path_1, _, _, _, false))
+ .WillRepeatedly(WithArgs<0, 1>(
+ Invoke(&loader, &TestProfileLoader::SetCreateCallback)));
+
+ // path_2 loads after the first request.
+ EXPECT_CALL(loader, GetProfileByPath(fake_profile_path_2))
+ .WillOnce(Return(static_cast<Profile*>(NULL)))
+ .WillRepeatedly(Return(&profile));
+ EXPECT_CALL(loader, CreateProfileAsync(fake_profile_path_2, _, _, _, false))
+ .WillRepeatedly(WithArgs<0, 1>(
+ Invoke(&loader, &TestProfileLoader::SetCreateCallback)));
+
+ // Try to load both paths twice.
+ // path_1_load is never called because it is first invalidated by the load
+ // request for (path_2), and then invalidated manually.
+ // path_2_load is called both times.
+ StrictMock<MockCallback>* path_1_load = new StrictMock<MockCallback>();
+ StrictMock<MockCallback>* path_2_load = new StrictMock<MockCallback>();
+ EXPECT_CALL(*path_2_load, Run(&profile))
+ .Times(2);
+
+ // Try to load path_1.
+ loader.LoadProfileInvalidatingOtherLoads(
+ fake_profile_path_1, base::Bind(&MockCallback::Run, path_1_load));
+ EXPECT_TRUE(loader.IsAnyProfileLoading());
+
+ // Try to load path_2, this invalidates the previous request.
+ loader.LoadProfileInvalidatingOtherLoads(
+ fake_profile_path_2, base::Bind(&MockCallback::Run, path_2_load));
+
+ // Finish the load request for path_1, then for path_2.
+ loader.RunCreateCallback(fake_profile_path_1, &profile,
+ Profile::CREATE_STATUS_INITIALIZED);
+ loader.RunCreateCallback(fake_profile_path_2, &profile,
+ Profile::CREATE_STATUS_INITIALIZED);
+ EXPECT_FALSE(loader.IsAnyProfileLoading());
+
+ // The second request for path_2 should return immediately.
+ loader.LoadProfileInvalidatingOtherLoads(
+ fake_profile_path_2, base::Bind(&MockCallback::Run, path_2_load));
+
+ // Make a second request for path_1, and invalidate it.
+ loader.LoadProfileInvalidatingOtherLoads(
+ fake_profile_path_1, base::Bind(&MockCallback::Run, path_1_load));
+ loader.InvalidatePendingProfileLoads();
+}
+
+} // namespace
« no previous file with comments | « chrome/browser/profiles/profile_loader.cc ('k') | chrome/browser/ui/app_list/app_list_service_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698