// 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_