910e62b5创建于 1月15日历史提交
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_APP_TESTS_HOOK_H_
#define IOS_CHROME_APP_TESTS_HOOK_H_

#import <memory>
#import <optional>

#import "base/containers/span.h"

class PrefService;
class ProfileIOS;
class ProfileOAuth2TokenServiceDelegate;
class ProfileOAuth2TokenService;
class ShareKitService;
class SystemIdentityManager;
class TabGroupService;
class TrustedVaultClientBackend;
@class UIImage;

namespace base {
class TimeDelta;
}  // namespace base

namespace collaboration {
class CollaborationService;
}  // namespace collaboration

namespace commerce {
class ShoppingService;
}  // namespace commerce

namespace data_sharing {
class DataSharingService;
}  // namespace data_sharing

namespace drive {
class DriveService;
}  // namespace drive

namespace feature_engagement {
class FeatureActivation;
}  // namespace feature_engagement

namespace policy {
class ConfigurationPolicyProvider;
}  // namespace policy

namespace password_manager {
class BulkLeakCheckServiceInterface;
class RecipientsFetcher;
}  // namespace password_manager

namespace plus_addresses {
class PlusAddressService;
}  // namespace plus_addresses

namespace tab_groups {
class TabGroupSyncService;
}  // namespace tab_groups

namespace tests_hook {

// Returns true if Gemini eligibility check should be disabled as tests do
// not have the required identity internal state to perform the verification.
bool DisableGeminiEligibilityCheck();

// Returns true if app group access should be disabled as tests don't have the
// required entitlements.
// This is used by internal code.
bool DisableAppGroupAccess();

// Returns true if client-side field trials should be disabled, so
// that their associated base::Features always use the default
// behavior, avoiding unexpected randomness during testing.
bool DisableClientSideFieldTrials();

// Returns true if ContentSuggestions should be disabled to allow other tests to
// run unimpeded.
bool DisableContentSuggestions();

// Returns true if Discover feed should be disabled to allow tests to run
// without it.
bool DisableDiscoverFeed();

// Returns true if the first run UI, which would interfere with many tests,
// should by default be skipped. Note that even in a target where this function
// returns `false`, that's just a default, and individual tests may still enable
// the first run UI.
bool DisableDefaultFirstRun();

// Returns true if the geolocation should be disabled to avoid the user location
// prompt displaying for the omnibox.
bool DisableGeolocation();

// Returns true if the Promo Manager should avoid displaying promos
// on app startup to allow tests to run unimpeded.
bool DisablePromoManagerDisplayingPromo();

// Returns true if the search engine choice view, which would interfere with
// many tests, should by default be skipped. Note that even in a target where
// this function returns `false`, that's just a default, and individual tests
// may still enable this view.
bool DisableDefaultSearchEngineChoice();

// Returns a token service that can be installed as a fake identity management
// service that bridges iOS SSO library and Chrome account info when testing.
// May return nullptr.
std::unique_ptr<ProfileOAuth2TokenService> GetOverriddenTokenService(
    PrefService* user_prefs,
    std::unique_ptr<ProfileOAuth2TokenServiceDelegate> delegate);

// Returns true if the fullscreen sign-in promo should be disabled to allow
// other tests to run unimpeded.
bool DisableFullscreenSigninPromo();

// Returns true if the update service should be disabled so that the update
// infobar won't be shown during testing.
bool DisableUpdateService();

// Returns true if any app launch promos should delay themselves so EGTests
// can start before checking if the promo appears.
bool DelayAppLaunchPromos();

// Returns true if the data for discarded session should never be deleted.
// This is a workaround because during EG tests, the application delegate
// method -application:didDiscardSceneSessions: may be called with a list
// of identifiers that contains identifiers of UIScene that are active.
bool NeverPurgeDiscardedSessionsData();

// Returns true if the UI should be minimal for testing (after loading a
// simple UILabel into the first UIWindow).
bool LoadMinimalAppUI();

// Returns a policy provider that should be installed as the platform policy
// provider when testing. May return nullptr.
policy::ConfigurationPolicyProvider* GetOverriddenPlatformPolicyProvider();

// Whether a phone backup/restore state should be simulated for testing purpose.
// Uses`experimental_flags::SimulatePostDeviceRestore()` to check whether this
// feature should be enabled due to experimental feature.
bool SimulatePostDeviceRestore();

// Allows overriding the SystemIdentityManager factory. The real factory will
// be used if this hook returns null.
std::unique_ptr<SystemIdentityManager> CreateSystemIdentityManager();

// Allows overriding the TrustedVaultClientBackend factory. The real factory
// will be used if this hook returns null.
std::unique_ptr<TrustedVaultClientBackend> CreateTrustedVaultClientBackend();

// Allows overriding the TabGroupSyncService factory. The real factory will be
// used if this hook returns null.
std::unique_ptr<tab_groups::TabGroupSyncService> CreateTabGroupSyncService(
    ProfileIOS* profile);

// Allows overriding the ShoppingService factory. The real factory will be used
// if this hook returns null.
std::unique_ptr<commerce::ShoppingService> CreateShoppingService(
    ProfileIOS* profile);

// Allows additional test setup for the DataSharingService.
void DataSharingServiceHooks(
    data_sharing::DataSharingService* data_sharing_service);

// Allows overriding the ShareKitService factory. The real factory will be
// used if this hook returns null.
std::unique_ptr<ShareKitService> CreateShareKitService(
    data_sharing::DataSharingService* data_sharing_service,
    collaboration::CollaborationService* collaboration_service,
    tab_groups::TabGroupSyncService* sync_service,
    TabGroupService* tab_group_service);

// Returns a bulk leak check service that should be used when testing. The real
// factory will be used if this hook returns a nullptr.
std::unique_ptr<password_manager::BulkLeakCheckServiceInterface>
GetOverriddenBulkLeakCheckService();

// Returns a plus address service that should be used when testing. The real
// factory will be used if this hook returns a nullptr.
std::unique_ptr<plus_addresses::PlusAddressService>
GetOverriddenPlusAddressService();

// Returns a recipients fetcher instance that should be used in EG tests. The
// real instance will be used if this hook returns a nullptr.
std::unique_ptr<password_manager::RecipientsFetcher>
GetOverriddenRecipientsFetcher();

// Global integration tests setup.
void SetUpTestsIfPresent();

// Runs the integration tests.  This is not used by EarlGrey-based integration
// tests.
void RunTestsIfPresent();

// Signal that the app has successfully launched. Only used by performance
// tests.
void SignalAppLaunched();

// Minimum duration of password checks. The password check UI displays checks as
// in progress for at least this duration in order to avoid updating the UI too
// fast and making it flicker. Test targets do not have an artificial minimum
// duration as it can make test flaky.
base::TimeDelta PasswordCheckMinimumDuration();

// Returns a Drive service instance that should be used in EG tests. The real
// instance will be used if this hook returns a nullptr.
std::unique_ptr<drive::DriveService> GetOverriddenDriveService();

// Override the Feature Engagement Tracker used in tests with a demo version.
feature_engagement::FeatureActivation FETDemoModeOverride();

// If the given argv contains `-EGTestWipeProfile`, deletes the
// contents of the `Library` directory at the start of `main()`. This
// simulates launching the application with a fresh profile.
void WipeProfileIfRequested(base::span<const char* const> args);

// Delay before which the "Turn on AutoFill" button shown in Password Settings
// can be re-enabled. If the value is 0, the default value from Password
// Settings should not be updated.
base::TimeDelta
GetOverriddenDelayForRequestingTurningOnCredentialProviderExtension();

// Returns the default value for the snackbar message duration.
base::TimeDelta GetSnackbarMessageDuration();

// Returns a UIImage for users of PHPickerViewController to use to skip
// presenting that picker view controller in tests.
UIImage* GetPHPickerViewControllerImage();

}  // namespace tests_hook

#endif  // IOS_CHROME_APP_TESTS_HOOK_H_