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

Side by Side Diff: chrome/browser/profiles/profile_manager_unittest.cc

Issue 14923004: [Mac] AppController needs to update its "last profile" pointer when the active profile is deleted (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase & fixed comments 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/scoped_temp_dir.h" 9 #include "base/files/scoped_temp_dir.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 #include "chrome/browser/chromeos/login/user_manager.h" 44 #include "chrome/browser/chromeos/login/user_manager.h"
45 #include "chrome/browser/chromeos/settings/cros_settings.h" 45 #include "chrome/browser/chromeos/settings/cros_settings.h"
46 #include "chrome/browser/chromeos/settings/device_settings_service.h" 46 #include "chrome/browser/chromeos/settings/device_settings_service.h"
47 #include "chromeos/chromeos_switches.h" 47 #include "chromeos/chromeos_switches.h"
48 #endif 48 #endif
49 49
50 using content::BrowserThread; 50 using content::BrowserThread;
51 51
52 namespace { 52 namespace {
53 53
54 void CheckLastUsedProfile(const base::FilePath& profile_path,
55 const std::string& profile_name) {
56 EXPECT_EQ(
57 g_browser_process->profile_manager()->GetLastUsedProfile()->GetPath(),
58 profile_path);
59 EXPECT_EQ(
60 g_browser_process->local_state()->GetString(prefs::kProfileLastUsed),
61 profile_name);
62 }
63
64 // This class listens to the ProfileInfoCache for profile deletions
65 // and then runs a callback, which checks that the correct
66 // next active profile is set.
67 class ProfileRemovalObserver : public ProfileInfoCacheObserver {
68 public:
69 ProfileRemovalObserver(
70 ProfileManager* profile_manager,
71 base::Callback<void(void)> cb)
72 : profile_manager_(profile_manager),
73 callback_(cb) {
74 profile_manager_->GetProfileInfoCache().AddObserver(this);
75 }
76
77 virtual ~ProfileRemovalObserver() {
78 profile_manager_->GetProfileInfoCache().RemoveObserver(this);
79 }
80 private:
81 // ProfileInfoCacheObserver implementation:
82 virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE {}
83 virtual void OnProfileWasRemoved(const base::FilePath& profile_path,
84 const string16& profile_name) OVERRIDE {
85 callback_.Run();
86 }
87 virtual void OnProfileWillBeRemoved(
88 const base::FilePath& profile_path) OVERRIDE {}
89 virtual void OnProfileNameChanged(
90 const base::FilePath& profile_path, const string16& old_profile_name)
91 OVERRIDE {}
92 virtual void OnProfileAvatarChanged(
93 const base::FilePath& profile_path) OVERRIDE {}
94
95 ProfileManager* profile_manager_;
96 base::Callback<void(void)> callback_;
97 DISALLOW_COPY_AND_ASSIGN(ProfileRemovalObserver);
98 };
99
54 // This global variable is used to check that value returned to different 100 // This global variable is used to check that value returned to different
55 // observers is the same. 101 // observers is the same.
56 Profile* g_created_profile; 102 Profile* g_created_profile;
57 103
58 } // namespace 104 } // namespace
59 105
60 namespace testing { 106 namespace testing {
61 107
62 class ProfileManager : public ::ProfileManagerWithoutInit { 108 class ProfileManager : public ::ProfileManagerWithoutInit {
63 public: 109 public:
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 EXPECT_FALSE( 489 EXPECT_FALSE(
444 profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord()); 490 profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord());
445 491
446 // GetLastUsedProfileAllowedByPolicy() returns the incognito Profile when 492 // GetLastUsedProfileAllowedByPolicy() returns the incognito Profile when
447 // incognito mode is forced. 493 // incognito mode is forced.
448 IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::FORCED); 494 IncognitoModePrefs::SetAvailability(prefs, IncognitoModePrefs::FORCED);
449 EXPECT_TRUE( 495 EXPECT_TRUE(
450 profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord()); 496 profile_manager->GetLastUsedProfileAllowedByPolicy()->IsOffTheRecord());
451 } 497 }
452 498
499 TEST_F(ProfileManagerTest, ActiveProfileDeleted) {
500 ProfileManager* profile_manager = g_browser_process->profile_manager();
501 ASSERT_TRUE(profile_manager);
502 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
Alexei Svitkine (slow) 2013/06/12 21:42:23 Either make it const or a pointer. Style guide di
noms (inactive) 2013/06/13 20:56:25 Done.
503
504 // Create and load two profiles.
505 base::FilePath dest_path1 =
506 temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 1"));
507 base::FilePath dest_path2 =
508 temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 2"));
509
510 MockObserver mock_observer;
511 EXPECT_CALL(mock_observer, OnProfileCreated(
512 testing::NotNull(), NotFail())).Times(testing::AtLeast(3));
513
514 profile_manager->CreateProfileAsync(dest_path1,
515 base::Bind(&MockObserver::OnProfileCreated,
516 base::Unretained(&mock_observer)),
517 string16(), string16(), false);
Alexei Svitkine (slow) 2013/06/12 21:42:23 Can you refactor this block into a helper function
noms (inactive) 2013/06/13 20:56:25 Done.
518 profile_manager->CreateProfileAsync(dest_path2,
519 base::Bind(&MockObserver::OnProfileCreated,
520 base::Unretained(&mock_observer)),
521 string16(), string16(), false);
522
523 message_loop_.RunUntilIdle();
524 EXPECT_EQ(2u, profile_manager->GetLoadedProfiles().size());
525 EXPECT_EQ(2u, cache.GetNumberOfProfiles());
526
527 // Set the active profile.
528 PrefService* local_state = g_browser_process->local_state();
529 local_state->SetString(prefs::kProfileLastUsed,
530 dest_path1.BaseName().MaybeAsASCII());
531
532 ProfileRemovalObserver observer(
533 profile_manager,
534 base::Bind(&CheckLastUsedProfile, dest_path2, "New Profile 2"));
Alexei Svitkine (slow) 2013/06/12 21:42:23 Do you need this class? Can't you just do the cal
noms (inactive) 2013/06/13 20:56:25 Done.
535
536 // Delete the active profile. The observer will check the next active profile
537 // is set correctly.
538 profile_manager->ScheduleProfileForDeletion(dest_path1,
539 ProfileManager::CreateCallback());
540 // Spin the message loop so that all the callbacks can finish running.
541 message_loop_.RunUntilIdle();
542 }
543
544 TEST_F(ProfileManagerTest, ActiveProfileDeletedNeedsToLoadNextProfile) {
545 ProfileManager* profile_manager = g_browser_process->profile_manager();
546 ASSERT_TRUE(profile_manager);
547 ProfileInfoCache& cache = profile_manager->GetProfileInfoCache();
548
549 // Create and load one profile, and just create a second profile.
550 base::FilePath dest_path1 =
551 temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 1"));
552 base::FilePath dest_path2 =
553 temp_dir_.path().Append(FILE_PATH_LITERAL("New Profile 2"));
554
555 MockObserver mock_observer;
556 EXPECT_CALL(mock_observer, OnProfileCreated(
557 testing::NotNull(), NotFail())).Times(testing::AtLeast(2));
558
559 profile_manager->CreateProfileAsync(dest_path1,
560 base::Bind(&MockObserver::OnProfileCreated,
561 base::Unretained(&mock_observer)),
562 string16(), string16(), false);
563
564 // Track the profile, but don't load it.
565 cache.AddProfileToCache(dest_path2, ASCIIToUTF16("New Profile 2"),
566 string16(), 0, false);
567
568 message_loop_.RunUntilIdle();
569
570 EXPECT_EQ(1u, profile_manager->GetLoadedProfiles().size());
571 EXPECT_EQ(2u, cache.GetNumberOfProfiles());
572
573 // Set the active profile.
574 PrefService* local_state = g_browser_process->local_state();
575 local_state->SetString(prefs::kProfileLastUsed,
576 dest_path1.BaseName().MaybeAsASCII());
577
578 ProfileRemovalObserver observer(
579 profile_manager,
580 base::Bind(&CheckLastUsedProfile, dest_path2, "New Profile 2"));
581
582 // Delete the active profile. This should switch and load the unloaded
583 // profile. The observer will check the next active profile
584 // is set correctly.
585 profile_manager->ScheduleProfileForDeletion(dest_path1,
586 ProfileManager::CreateCallback());
587
588 // Spin the message loop so that all the callbacks can finish running.
589 message_loop_.RunUntilIdle();
590 }
Alexei Svitkine (slow) 2013/06/12 21:42:23 Can you also add a test that exercises the "re-try
591
453 #if !defined(OS_ANDROID) 592 #if !defined(OS_ANDROID)
454 // There's no Browser object on Android. 593 // There's no Browser object on Android.
455 TEST_F(ProfileManagerTest, LastOpenedProfiles) { 594 TEST_F(ProfileManagerTest, LastOpenedProfiles) {
456 base::FilePath dest_path1 = temp_dir_.path(); 595 base::FilePath dest_path1 = temp_dir_.path();
457 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1")); 596 dest_path1 = dest_path1.Append(FILE_PATH_LITERAL("New Profile 1"));
458 597
459 base::FilePath dest_path2 = temp_dir_.path(); 598 base::FilePath dest_path2 = temp_dir_.path();
460 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2")); 599 dest_path2 = dest_path2.Append(FILE_PATH_LITERAL("New Profile 2"));
461 600
462 ProfileManager* profile_manager = g_browser_process->profile_manager(); 601 ProfileManager* profile_manager = g_browser_process->profile_manager();
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 browser2b.reset(); 772 browser2b.reset();
634 last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 773 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
635 ASSERT_EQ(1U, last_opened_profiles.size()); 774 ASSERT_EQ(1U, last_opened_profiles.size());
636 EXPECT_EQ(profile1, last_opened_profiles[0]); 775 EXPECT_EQ(profile1, last_opened_profiles[0]);
637 776
638 browser1.reset(); 777 browser1.reset();
639 last_opened_profiles = profile_manager->GetLastOpenedProfiles(); 778 last_opened_profiles = profile_manager->GetLastOpenedProfiles();
640 ASSERT_EQ(0U, last_opened_profiles.size()); 779 ASSERT_EQ(0U, last_opened_profiles.size());
641 } 780 }
642 #endif // !defined(OS_ANDROID) 781 #endif // !defined(OS_ANDROID)
OLDNEW
« chrome/browser/profiles/profile_manager.cc ('K') | « chrome/browser/profiles/profile_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698