blob: 313f16dcef0764d3aa62ad8771aca6872e3632fd [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "components/policy/policy_constants.h"
#import "components/signin/public/base/signin_metrics.h"
#import "components/sync/base/user_selectable_type.h"
#import "ios/chrome/browser/authentication/ui_bundled/expected_signin_histograms.h"
#import "ios/chrome/browser/authentication/ui_bundled/history_sync/pref_names.h"
#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h"
#import "ios/chrome/browser/authentication/ui_bundled/signin_earl_grey.h"
#import "ios/chrome/browser/authentication/ui_bundled/signin_earl_grey_ui_test_util.h"
#import "ios/chrome/browser/authentication/ui_bundled/signin_matchers.h"
#import "ios/chrome/browser/metrics/model/metrics_app_interface.h"
#import "ios/chrome/browser/policy/model/policy_app_interface.h"
#import "ios/chrome/browser/policy/model/policy_earl_grey_utils.h"
#import "ios/chrome/browser/policy/model/policy_util.h"
#import "ios/chrome/browser/settings/ui_bundled/elements/elements_constants.h"
#import "ios/chrome/browser/settings/ui_bundled/settings_table_view_controller_constants.h"
#import "ios/chrome/browser/shared/public/features/features.h"
#import "ios/chrome/browser/signin/model/fake_system_identity.h"
#import "ios/chrome/browser/signin/model/test_constants.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "ios/chrome/common/ui/promo_style/constants.h"
#import "ios/chrome/grit/ios_branded_strings.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
#import "ios/chrome/test/earl_grey/chrome_matchers.h"
#import "ios/chrome/test/earl_grey/chrome_test_case.h"
#import "ios/testing/earl_grey/earl_grey_test.h"
#import "net/test/embedded_test_server/embedded_test_server.h"
#import "ui/base/l10n/l10n_util.h"
using chrome_test_util::GoogleSyncSettingsButton;
using chrome_test_util::SettingsSignInRowMatcher;
@interface SigninSettingsTestCase : ChromeTestCase
@end
@implementation SigninSettingsTestCase
- (void)tearDownHelper {
[PolicyAppInterface clearPolicies];
[super tearDownHelper];
}
- (void)testPromoCardHidden {
[ChromeEarlGreyUI openSettingsMenu];
[SigninEarlGreyUI verifySigninPromoNotVisible];
}
// Tests the history sync opt-in after sign-in in settings.
- (void)testSigninWithHistorySync {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Verify that the History Sync Opt-In screen is shown.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_sufficientlyVisible()];
// Verify that the footer is shown without the user's email.
id<GREYMatcher> footerTextMatcher = grey_allOf(
grey_text(
l10n_util::GetNSString(IDS_IOS_HISTORY_SYNC_FOOTER_WITHOUT_EMAIL)),
grey_sufficientlyVisible(), nil);
[[[EarlGrey selectElementWithMatcher:footerTextMatcher]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_notNil()];
// Verify that buttons of the History Sync screen have the expected colors.
[[EarlGrey
selectElementWithMatcher:
grey_allOf(chrome_test_util::ButtonWithForegroundColor(
kSolidButtonTextColor),
chrome_test_util::ButtonWithBackgroundColor(kBlueColor),
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher(),
nil)] assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey
selectElementWithMatcher:
grey_allOf(
chrome_test_util::ButtonWithForegroundColor(kBlueColor),
chrome_test_util::SigninScreenPromoSecondaryButtonMatcher(), nil)]
assertWithMatcher:grey_sufficientlyVisible()];
// Accept History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
// Verify that the history sync is enabled.
GREYAssertTrue(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be enabled.");
GREYAssertTrue(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be enabled.");
}
// Tests the history sync opt-in after sign-in in settings. Capabilities are not
// set to simulate unsuccessful capabilities fetches.
- (void)testSigninWithHistorySyncWithUnknownCapabilities {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity withUnknownCapabilities:YES];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Wait for the History Sync Opt-In screen.
[ChromeEarlGrey
waitForSufficientlyVisibleElementWithMatcher:
grey_accessibilityID(kHistorySyncViewAccessibilityIdentifier)];
// Verify that the buttons of the History Sync screen have the same foreground
// and background colors.
NSString* foregroundColorName = kBlueColor;
NSString* backgroundColorName = kBlueHaloColor;
[[EarlGrey
selectElementWithMatcher:
grey_allOf(
chrome_test_util::ButtonWithForegroundColor(foregroundColorName),
chrome_test_util::ButtonWithBackgroundColor(backgroundColorName),
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher(), nil)]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey
selectElementWithMatcher:
grey_allOf(
chrome_test_util::ButtonWithForegroundColor(foregroundColorName),
chrome_test_util::ButtonWithBackgroundColor(backgroundColorName),
chrome_test_util::SigninScreenPromoSecondaryButtonMatcher(), nil)]
assertWithMatcher:grey_sufficientlyVisible()];
// Accept History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
// Verify that the history sync is enabled.
GREYAssertTrue(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be enabled.");
GREYAssertTrue(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be enabled.");
}
// Tests that history sync opt-in is not presented after sign-in a second time.
- (void)testSigninSecondTimeShouldNotShowHistorySyncOptin {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Accept History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
[SigninEarlGreyUI signOut];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// History sync opt-in not visibled.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_nil()];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
// Verify that the history sync is enabled.
GREYAssertTrue(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be enabled.");
GREYAssertTrue(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be enabled.");
}
// Tests that history sync opt-in is presented for the following scenario:
// + Add account
// + Sign-in and accept history sync
// + Sign-out
// + Remove account
// + Add same account again
// + Sign-in
// => Expect history sync opt-in dialog.
- (void)testSigninSecondTimeAfterAddingAccountAgain {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Accept History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
[SigninEarlGreyUI signOut];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// History sync opt-in not visibled.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_nil()];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
// Verify that the history sync is enabled.
GREYAssertTrue(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be enabled.");
GREYAssertTrue(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be enabled.");
}
// Tests sign-in and accept history sync opt-in from the settings when having
// no account on the device.
- (void)testSigninWithNoAccountOnDevice {
chrome_test_util::GREYAssertErrorNil(
[MetricsAppInterface setupHistogramTester]);
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Set up a fake identity to add and sign-in with.
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentityForSSOAuthAddAccountFlow:fakeIdentity];
[[EarlGrey
selectElementWithMatcher:grey_allOf(
grey_accessibilityID(
kFakeAuthAddAccountButtonIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Make sure the fake SSO view controller is fully removed.
[ChromeEarlGreyUI waitForAppToIdle];
// Verify that buttons of the History Sync screen have the expected colors.
[[EarlGrey
selectElementWithMatcher:
grey_allOf(chrome_test_util::ButtonWithForegroundColor(
kSolidButtonTextColor),
chrome_test_util::ButtonWithBackgroundColor(kBlueColor),
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher(),
nil)] assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey
selectElementWithMatcher:
grey_allOf(
chrome_test_util::ButtonWithForegroundColor(kBlueColor),
chrome_test_util::SigninScreenPromoSecondaryButtonMatcher(), nil)]
assertWithMatcher:grey_sufficientlyVisible()];
// Accept History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
// Verify that the history sync is enabled.
GREYAssertTrue(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be enabled.");
GREYAssertTrue(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be enabled.");
ExpectedSigninHistograms* expecteds = [[ExpectedSigninHistograms alloc]
initWithAccessPoint:signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS];
// TODO(crbug.com/41493423): We should log that the signin was offered,
// completed and Signin.SigninStartedAccessPoint.
expecteds.signinSignInStarted = 1;
[SigninEarlGrey assertExpectedSigninHistograms:expecteds];
}
// Tests sign-in and accept history sync opt-in from the settings when having
// no account on the device. Capabilities are not set to simulate unsuccessful
// capabilities fetches.
- (void)testSigninWithNoAccountOnDeviceWithUnknownCapabilities {
chrome_test_util::GREYAssertErrorNil(
[MetricsAppInterface setupHistogramTester]);
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Set up a fake identity with unset capabilities to add and sign-in with.
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentityForSSOAuthAddAccountFlow:fakeIdentity
withUnknownCapabilities:YES];
[[EarlGrey
selectElementWithMatcher:grey_allOf(
grey_accessibilityID(
kFakeAuthAddAccountButtonIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Make sure the fake SSO view controller is fully removed.
[ChromeEarlGreyUI waitForAppToIdle];
// Wait for the History Sync Opt-In screen.
[ChromeEarlGrey
waitForSufficientlyVisibleElementWithMatcher:
grey_accessibilityID(kHistorySyncViewAccessibilityIdentifier)];
// Verify that the buttons of the History Sync screen have the same foreground
// and background colors.
NSString* foregroundColorName = kBlueColor;
NSString* backgroundColorName = kBlueHaloColor;
[[EarlGrey
selectElementWithMatcher:
grey_allOf(
chrome_test_util::ButtonWithForegroundColor(foregroundColorName),
chrome_test_util::ButtonWithBackgroundColor(backgroundColorName),
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher(), nil)]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey
selectElementWithMatcher:
grey_allOf(
chrome_test_util::ButtonWithForegroundColor(foregroundColorName),
chrome_test_util::ButtonWithBackgroundColor(backgroundColorName),
chrome_test_util::SigninScreenPromoSecondaryButtonMatcher(), nil)]
assertWithMatcher:grey_sufficientlyVisible()];
// Accept History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoPrimaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGreyUI waitForAppToIdle];
// Close settings.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
// Verify that the history sync is enabled.
GREYAssertTrue(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be enabled.");
GREYAssertTrue(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be enabled.");
ExpectedSigninHistograms* expecteds = [[ExpectedSigninHistograms alloc]
initWithAccessPoint:signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS];
// TODO(crbug.com/41493423): We should log that the signin was offered,
// completed and Signin.SigninStartedAccessPoint.
expecteds.signinSignInStarted = 1;
[SigninEarlGrey assertExpectedSigninHistograms:expecteds];
}
// For a signed out user with device accounts, tests that the sign-in row is
// shown with the correct strings and opens the sign-in sheet upon tap.
- (void)testSigninRowOpensSheetIfSignedOutAndSomeDeviceAccounts {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
[ChromeEarlGreyUI openSettingsMenu];
[[EarlGrey
selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString(
IDS_IOS_IDENTITY_DISC_SIGN_IN_PROMO_LABEL))]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
[[EarlGrey
selectElementWithMatcher:
grey_accessibilityID(kWebSigninPrimaryButtonAccessibilityIdentifier)]
assertWithMatcher:grey_sufficientlyVisible()];
}
// For a signed out user with no device accounts, tests that the sign-in row is
// shown with the correct strings and opens the auth activity on tap.
- (void)testSigninRowOpensAuthActivityIfSignedOutAndNoDeviceAccounts {
chrome_test_util::GREYAssertErrorNil(
[MetricsAppInterface setupHistogramTester]);
[ChromeEarlGreyUI openSettingsMenu];
[[EarlGrey
selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString(
IDS_IOS_IDENTITY_DISC_SIGN_IN_PROMO_LABEL))]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
kFakeAuthActivityViewIdentifier)]
assertWithMatcher:grey_sufficientlyVisible()];
ExpectedSigninHistograms* expecteds = [[ExpectedSigninHistograms alloc]
initWithAccessPoint:signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS];
// TODO(crbug.com/41493423): We should log that the signin was offered,
// completed and Signin.SigninStartedAccessPoint.
expecteds.signinSignInStarted = 1;
[SigninEarlGrey assertExpectedSigninHistograms:expecteds];
}
// For a signed out user with the SyncDisabled policy, tests that the sign-in
// row is still enabled, since it leads to sign-in only.
- (void)testSigninRowNotDisabledBySyncPolicy {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
[ChromeEarlGreyUI openSettingsMenu];
// Set policy after opening settings so there's no need to dismiss the policy
// bottom sheet.
policy_test_utils::SetPolicy(true, policy::key::kSyncDisabled);
[[EarlGrey
selectElementWithMatcher:grey_accessibilityLabel(l10n_util::GetNSString(
IDS_IOS_IDENTITY_DISC_SIGN_IN_PROMO_LABEL))]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
[[EarlGrey
selectElementWithMatcher:
grey_accessibilityID(kWebSigninPrimaryButtonAccessibilityIdentifier)]
assertWithMatcher:grey_sufficientlyVisible()];
}
// For a signed out user with the BrowserSignin policy, tests that the sign-in
// row is disabled and opens the "disabled by policy" bubble upon tap.
- (void)testSigninRowDisabledBySigninPolicy {
policy_test_utils::SetPolicy(static_cast<int>(BrowserSigninMode::kDisabled),
policy::key::kBrowserSignin);
[ChromeEarlGreyUI openSettingsMenu];
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
kSettingsSignInDisabledCellId)]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
kSettingsSignInDisabledCellId)]
performAction:grey_tap()];
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
kEnterpriseInfoBubbleViewId)]
assertWithMatcher:grey_sufficientlyVisible()];
[[EarlGrey selectElementWithMatcher:
grey_text(l10n_util::GetNSString(
IDS_IOS_SETTINGS_SIGNIN_DISABLED_POPOVER_TEXT))]
assertWithMatcher:grey_sufficientlyVisible()];
}
// Tests that when signing-in using the settings cell, the user is not signed
// out if history sync is declined.
- (void)testSignInAndDeclineHistorySync {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
[ChromeEarlGreyUI openSettingsMenu];
// Tap on sign-in cell.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Verify that the History Sync Opt-In screen is shown.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_sufficientlyVisible()];
// Verify that the footer is shown without the user's email.
id<GREYMatcher> footerTextMatcher = grey_allOf(
grey_text(
l10n_util::GetNSString(IDS_IOS_HISTORY_SYNC_FOOTER_WITHOUT_EMAIL)),
grey_sufficientlyVisible(), nil);
[[[EarlGrey selectElementWithMatcher:footerTextMatcher]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_notNil()];
// Decline History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoSecondaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGrey waitForUIElementToDisappearWithMatcher:
chrome_test_util::HistoryOptInPromoMatcher()];
// Verify that the history sync is disabled.
GREYAssertFalse(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be disabled.");
GREYAssertFalse(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be disabled.");
// Verify that the identity is still signed in.
[SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
}
// Tests that if a user signs in and declines History Sync, then sign-out, then
// History Sync screen is skipped if they sign-in again from the settings.
- (void)testHistorySyncSkippedIfDeclinedJustBefore {
FakeSystemIdentity* fakeIdentity1 = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity1];
[ChromeEarlGreyUI openSettingsMenu];
// Sign-in.
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Verify that the History Sync Opt-In screen is shown.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_sufficientlyVisible()];
// Decline History Sync.
[[[EarlGrey selectElementWithMatcher:
chrome_test_util::SigninScreenPromoSecondaryButtonMatcher()]
usingSearchAction:chrome_test_util::HistoryOptInScrollDown()
onElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
performAction:grey_tap()];
[ChromeEarlGrey waitForUIElementToDisappearWithMatcher:
chrome_test_util::HistoryOptInPromoMatcher()];
// Sign-out then forget fakeIdentity1.
[[EarlGrey selectElementWithMatcher:chrome_test_util::SettingsDoneButton()]
performAction:grey_tap()];
[SigninEarlGreyUI signOut];
[SigninEarlGrey forgetFakeIdentity:fakeIdentity1];
// Tap on sign-in cell in settings for fakeIdentity2.
[SigninEarlGrey addFakeIdentity:[FakeSystemIdentity fakeIdentity2]];
[ChromeEarlGreyUI openSettingsMenu];
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign-in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Verify that the History Sync Opt-In screen is not shown.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_notVisible()];
}
// Tests that if History Sync has been declined twice in a row previously, the
// opt-in screen will be skipped if a user signs-in in settings.
- (void)testHistorySyncSkippedIfDeclinedTwice {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
// Set the count of declined History Sync to 2.
[ChromeEarlGrey
setIntegerValue:2
forUserPref:history_sync_prefs::kHistorySyncSuccessiveDeclineCount];
// Tap on the sign-in cell in settings.
[ChromeEarlGreyUI openSettingsMenu];
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign-in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Verify that the History Sync Opt-In screen is skipped.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_notVisible()];
// Verify that the History Sync is disabled.
GREYAssertFalse(
[SigninEarlGrey
isSelectedTypeEnabled:syncer::UserSelectableType::kHistory],
@"History sync should be disabled.");
GREYAssertFalse(
[SigninEarlGrey isSelectedTypeEnabled:syncer::UserSelectableType::kTabs],
@"Tabs sync should be disabled.");
// Verify that the identity is still signed in.
[SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity];
}
// Tests that if an external app opens an URL when
// SigninAndHistorySyncCoordinator is shown, the coordinator is interrupted
// correctly without triggering DCHECK.
// See https://crbug.com/1485570.
- (void)testInterruptWhenHistoryOptInShown {
FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
[SigninEarlGrey addFakeIdentity:fakeIdentity];
// Tap on the sign-in cell in settings.
[ChromeEarlGreyUI openSettingsMenu];
[[EarlGrey selectElementWithMatcher:SettingsSignInRowMatcher()]
performAction:grey_tap()];
// Confirm sign-in.
[[EarlGrey selectElementWithMatcher:
grey_allOf(grey_accessibilityID(
kWebSigninPrimaryButtonAccessibilityIdentifier),
grey_sufficientlyVisible(), nil)]
performAction:grey_tap()];
// Verify that the History Sync Opt-In screen is shown.
[[EarlGrey
selectElementWithMatcher:chrome_test_util::HistoryOptInPromoMatcher()]
assertWithMatcher:grey_sufficientlyVisible()];
// Open the URL as if it was opened from another app.
GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
const GURL expectedURL = self.testServer->GetURL("/echo");
[ChromeEarlGrey
simulateExternalAppURLOpeningAndWaitUntilOpenedWithGURL:expectedURL];
}
@end