blob: 90f2bc825a2f42feb980653245dd19312e3a2336 [file] [log] [blame] [edit]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_TEST_BASE_TESTING_PROFILE_MANAGER_H_
#define CHROME_TEST_BASE_TESTING_PROFILE_MANAGER_H_
#include <map>
#include <memory>
#include <string>
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/scoped_multi_source_observation.h"
#include "base/test/scoped_path_override.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_observer.h"
#include "chrome/test/base/testing_profile.h"
#include "components/policy/core/common/policy_service.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
class ProfileAttributesStorage;
class ProfileManager;
class TestingBrowserProcess;
namespace sync_preferences {
class PrefServiceSyncable;
}
// The TestingProfileManager is a TestingProfile factory for a multi-profile
// environment. It will bring up a full ProfileManager and attach it to the
// TestingBrowserProcess set up in your test.
//
// When a Profile is needed for testing, create it through the factory method
// below instead of creating it via |new TestingProfile|. It is not possible
// to register profiles created in that fashion with the ProfileManager.
class TestingProfileManager : public ProfileObserver {
public:
explicit TestingProfileManager(TestingBrowserProcess* browser_process);
TestingProfileManager(const TestingProfileManager&) = delete;
TestingProfileManager& operator=(const TestingProfileManager&) = delete;
~TestingProfileManager() override;
// This needs to be called in testing::Test::SetUp() to put the object in a
// valid state. Some work cannot be done in a constructor because it may
// call gtest asserts to verify setup. The result of this call can be used
// to ASSERT before doing more SetUp work in the test.
// |profiles_dir| is the path in which new directories would be placed.
// If empty, one will be created (and deleted upon destruction of |this|).
// If not empty, it will be used, but ownership is maintained by the caller.
// If `profile_manager` is supplied, then it will be set as |profile_manager|
// of this TestingProfileManager, instead of creating a new one in
// SetUpInternal().
[[nodiscard]] bool SetUp(
const base::FilePath& profiles_path = base::FilePath(),
std::unique_ptr<ProfileManager> profile_manager = nullptr);
#if BUILDFLAG(IS_CHROMEOS)
using OnProfileCreatedCallback =
base::RepeatingCallback<void(const std::string&, Profile*)>;
void set_on_profile_created_callback(OnProfileCreatedCallback callback) {
callback_ = callback;
}
OnProfileCreatedCallback callback_;
#endif
// Creates a new TestingProfile whose data lives in a directory related to
// profile_name, which is a non-user-visible key for the test environment.
// |prefs| is the PrefService used by the profile. If it is NULL, the profile
// creates a PrefService on demand.
// |user_name|, |avatar_id| and |is_supervised_profile| status are passed
// along to the ProfileAttributesStorage and provide the user-visible profile
// metadata. This will register the TestingProfile with the profile subsystem
// as well. The subsystem owns the Profile and returns a weak pointer.
// |factories| contains BCKSs to use with the newly created profile.
TestingProfile* CreateTestingProfile(
const std::string& profile_name,
std::unique_ptr<sync_preferences::PrefServiceSyncable> prefs,
const std::u16string& user_name,
int avatar_id,
TestingProfile::TestingFactories testing_factories,
bool is_supervised_profile = false,
std::optional<bool> is_new_profile = std::nullopt,
std::optional<std::unique_ptr<policy::PolicyService>> policy_service =
std::nullopt,
scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory =
nullptr);
// Small helpers for creating testing profiles. Just forward to above.
TestingProfile* CreateTestingProfile(
const std::string& name,
TestingProfile::TestingFactories testing_factories = {},
scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory =
nullptr);
// Creates a new guest TestingProfile whose data lives in the guest profile
// test environment directory, as specified by the profile manager. If the
// builder is given, it will be used to create a guest profile. This profile
// will not be added to the ProfileAttributesStorage. This will register the
// TestingProfile with the profile subsystem as well. The subsystem owns the
// Profile and returns a weak pointer.
TestingProfile* CreateGuestProfile(
std::optional<TestingProfile::Builder> builder = std::nullopt);
#if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
// Creates a new system TestingProfile whose data lives in the system profile
// test environment directory, as specified by the profile manager.
// This profile will not be added to the ProfileAttributesStorage. This will
// register the TestingProfile with the profile subsystem as well.
// The subsystem owns the Profile and returns a weak pointer.
TestingProfile* CreateSystemProfile();
#endif // !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
// Deletes a TestingProfile from the profile subsystem.
void DeleteTestingProfile(const std::string& profile_name);
// Deletes all TestingProfiles from the profile subsystem, including guest
// profiles.
void DeleteAllTestingProfiles();
// Deletes a guest TestingProfile from the profile manager.
void DeleteGuestProfile();
#if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
// Deletes a system TestingProfile from the profile manager.
void DeleteSystemProfile();
#endif // !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
// Deletes the storage instance. This is useful for testing that the storage
// is properly persisting data.
void DeleteProfileAttributesStorage();
// Get the full profile path from the profile name.
base::FilePath GetProfilePath(const std::string& profile_name);
// Helper accessors.
const base::FilePath& profiles_dir();
ProfileManager* profile_manager();
ProfileAttributesStorage* profile_attributes_storage();
// ProfileObserver:
void OnProfileWillBeDestroyed(Profile* profile) override;
private:
friend class ProfileAttributesStorageTest;
friend class ProfileNameVerifierObserver;
typedef std::map<std::string, raw_ptr<TestingProfile, CtnExperimental>>
TestingProfilesMap;
// Does the actual ASSERT-checked SetUp work. This function cannot have a
// return value, so it sets the |called_set_up_| flag on success and that is
// returned in the public SetUp.
void SetUpInternal(const base::FilePath& profiles_path,
std::unique_ptr<ProfileManager> profile_manager);
// Whether SetUp() was called to put the object in a valid state.
bool called_set_up_;
// |profiles_path_| is the path under which new directories for the profiles
// will be placed.
base::FilePath profiles_path_;
// The user data directory in the path service is overriden because some
// functions, e.g. GetPathOfHighResAvatarAtIndex, get the user data directory
// by the path service instead of the profile manager. The override is scoped
// with the help of this variable.
std::unique_ptr<base::ScopedPathOverride> user_data_dir_override_;
// Weak reference to the browser process on which the ProfileManager is set.
raw_ptr<TestingBrowserProcess> browser_process_;
// Weak reference to the profile manager.
raw_ptr<ProfileManager, DanglingUntriaged> profile_manager_;
// Map of profile_name to TestingProfile* from CreateTestingProfile().
TestingProfilesMap testing_profiles_;
// Listens for Profile* destruction to perform some cleanup.
base::ScopedMultiSourceObservation<Profile, ProfileObserver>
profile_observations_{this};
};
#endif // CHROME_TEST_BASE_TESTING_PROFILE_MANAGER_H_