| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import <EarlGrey/EarlGrey.h> |
| #import <XCTest/XCTest.h> |
| |
| #include "base/strings/sys_string_conversions.h" |
| #import "base/test/ios/wait_util.h" |
| #include "components/signin/core/browser/signin_manager.h" |
| #include "ios/chrome/browser/experimental_flags.h" |
| #include "ios/chrome/browser/signin/signin_manager_factory.h" |
| #import "ios/chrome/browser/ui/commands/open_url_command.h" |
| #import "ios/chrome/browser/ui/settings/accounts_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h" |
| #import "ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h" |
| #import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h" |
| #include "ios/chrome/browser/ui/ui_util.h" |
| #include "ios/chrome/grit/ios_strings.h" |
| #import "ios/chrome/test/app/chrome_test_util.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/public/provider/chrome/browser/signin/fake_chrome_identity.h" |
| #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h" |
| #import "ios/testing/earl_grey/disabled_test_macros.h" |
| #import "ios/testing/wait_util.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace { |
| |
| // Returns a fake identity. |
| ChromeIdentity* GetFakeIdentity1() { |
| return [FakeChromeIdentity identityWithEmail:@"foo@gmail.com" |
| gaiaID:@"fooID" |
| name:@"Fake Foo"]; |
| } |
| |
| // Returns a second fake identity. |
| ChromeIdentity* GetFakeIdentity2() { |
| return [FakeChromeIdentity identityWithEmail:@"bar@gmail.com" |
| gaiaID:@"barID" |
| name:@"Fake Bar"]; |
| } |
| |
| ChromeIdentity* GetFakeManagedIdentity() { |
| return [FakeChromeIdentity identityWithEmail:@"managed@foo.com" |
| gaiaID:@"managedID" |
| name:@"Fake Managed"]; |
| } |
| |
| // Changes the EarlGrey synchronization status to |enabled|. |
| void SetEarlGreySynchronizationEnabled(BOOL enabled) { |
| [[GREYConfiguration sharedInstance] |
| setValue:[NSNumber numberWithBool:enabled] |
| forConfigKey:kGREYConfigKeySynchronizationEnabled]; |
| } |
| |
| // Taps the view with acessibility identifier |accessibility_id|. |
| void TapViewWithAccessibilityId(NSString* accessiblity_id) { |
| // grey_sufficientlyVisible() is necessary because reloading a cell in a |
| // collection view might duplicate it (with the old one being hidden but |
| // EarlGrey can find it). |
| id<GREYMatcher> matcher = grey_allOf(grey_accessibilityID(accessiblity_id), |
| grey_sufficientlyVisible(), nil); |
| [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; |
| } |
| |
| // Taps the button with accessibility label |label|. |
| void TapButtonWithAccessibilityLabel(NSString* label) { |
| id<GREYMatcher> matcher = |
| chrome_test_util::ButtonWithAccessibilityLabel(label); |
| [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; |
| } |
| |
| // Taps the button with accessibility labelId |message_id|. |
| void TapButtonWithLabelId(int message_id) { |
| id<GREYMatcher> matcher = |
| chrome_test_util::ButtonWithAccessibilityLabelId(message_id); |
| [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()]; |
| } |
| |
| // Opens the signin screen from the settings page. Must be called from the NTP. |
| // User must not be signed in. |
| void OpenSignInFromSettings() { |
| const CGFloat scroll_displacement = 50.0; |
| |
| [ChromeEarlGreyUI openToolsMenu]; |
| [[[EarlGrey |
| selectElementWithMatcher:grey_accessibilityID(kToolsMenuSettingsId)] |
| usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
| scroll_displacement) |
| onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)] |
| performAction:grey_tap()]; |
| |
| TapViewWithAccessibilityId(kSettingsSignInCellId); |
| } |
| |
| // Wait until |matcher| is accessible (not nil) |
| void WaitForMatcher(id<GREYMatcher> matcher) { |
| ConditionBlock condition = ^{ |
| NSError* error = nil; |
| [[EarlGrey selectElementWithMatcher:matcher] assertWithMatcher:grey_notNil() |
| error:&error]; |
| return error == nil; |
| }; |
| GREYAssert(testing::WaitUntilConditionOrTimeout( |
| testing::kWaitForUIElementTimeout, condition), |
| @"Waiting for matcher %@ failed.", matcher); |
| } |
| |
| // Asserts that |identity| is actually signed in to the active profile. |
| void AssertAuthenticatedIdentityInActiveProfile(ChromeIdentity* identity) { |
| [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; |
| |
| ios::ChromeBrowserState* browser_state = |
| chrome_test_util::GetOriginalBrowserState(); |
| AccountInfo info = |
| ios::SigninManagerFactory::GetForBrowserState(browser_state) |
| ->GetAuthenticatedAccountInfo(); |
| |
| GREYAssertEqual(base::SysNSStringToUTF8(identity.gaiaID), info.gaia, |
| @"Gaia ID of signed in user isn't %@ but %s", identity.gaiaID, |
| info.gaia.c_str()); |
| } |
| |
| } // namespace |
| |
| @interface SigninInteractionControllerTestCase : ChromeTestCase |
| @end |
| |
| @implementation SigninInteractionControllerTestCase |
| |
| // Tests that opening the sign-in screen from the Settings and signing in works |
| // correctly when there is already an identity on the device. |
| - (void)testSignInOneUser { |
| // Set up a fake identity. |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| // Open the sign in screen. |
| OpenSignInFromSettings(); |
| |
| // Select the user. |
| TapButtonWithAccessibilityLabel(identity.userEmail); |
| |
| // Sign in and confirm. |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| |
| // Check |identity| is signed-in. |
| AssertAuthenticatedIdentityInActiveProfile(identity); |
| } |
| |
| // Tests signing in with one account, switching sync account to a second and |
| // choosing to keep the browsing data separate during the switch. |
| - (void)testSignInSwitchAccountsAndKeepDataSeparate { |
| // Set up the fake identities. |
| ios::FakeChromeIdentityService* identity_service = |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); |
| ChromeIdentity* identity1 = GetFakeIdentity1(); |
| ChromeIdentity* identity2 = GetFakeIdentity2(); |
| identity_service->AddIdentity(identity1); |
| identity_service->AddIdentity(identity2); |
| |
| // Sign in to |identity1|. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(identity1.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(identity1); |
| |
| // Open accounts settings, then sync settings. |
| TapViewWithAccessibilityId(kSettingsAccountCellId); |
| TapViewWithAccessibilityId(kSettingsAccountsSyncCellId); |
| |
| // Switch Sync account to |identity2|. |
| TapButtonWithAccessibilityLabel(identity2.userEmail); |
| |
| // Keep data separate, with synchronization off due to an infinite spinner. |
| SetEarlGreySynchronizationEnabled(NO); |
| WaitForMatcher(grey_accessibilityID(kImportDataKeepSeparateCellId)); |
| TapViewWithAccessibilityId(kImportDataKeepSeparateCellId); |
| TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON); |
| SetEarlGreySynchronizationEnabled(YES); |
| |
| // Check the signed-in user did change. |
| AssertAuthenticatedIdentityInActiveProfile(identity2); |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| |
| // Tests signing in with one account, switching sync account to a second and |
| // choosing to import the browsing data during the switch. |
| - (void)testSignInSwitchAccountsAndImportData { |
| // Set up the fake identities. |
| ios::FakeChromeIdentityService* identity_service = |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); |
| ChromeIdentity* identity1 = GetFakeIdentity1(); |
| ChromeIdentity* identity2 = GetFakeIdentity2(); |
| identity_service->AddIdentity(identity1); |
| identity_service->AddIdentity(identity2); |
| |
| // Sign in to |identity1|. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(identity1.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(identity1); |
| |
| // Open accounts settings, then sync settings. |
| TapViewWithAccessibilityId(kSettingsAccountCellId); |
| TapViewWithAccessibilityId(kSettingsAccountsSyncCellId); |
| |
| // Switch Sync account to |identity2|. |
| TapButtonWithAccessibilityLabel(identity2.userEmail); |
| |
| // Import data, with synchronization off due to an infinite spinner. |
| SetEarlGreySynchronizationEnabled(NO); |
| WaitForMatcher(grey_accessibilityID(kImportDataImportCellId)); |
| TapViewWithAccessibilityId(kImportDataImportCellId); |
| TapButtonWithLabelId(IDS_IOS_OPTIONS_IMPORT_DATA_CONTINUE_BUTTON); |
| SetEarlGreySynchronizationEnabled(YES); |
| |
| // Check the signed-in user did change. |
| AssertAuthenticatedIdentityInActiveProfile(identity2); |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| |
| // Tests that switching from a managed account to a non-managed account works |
| // correctly and displays the expected warnings. |
| - (void)testSignInSwitchManagedAccount { |
| if (!experimental_flags::IsMDMIntegrationEnabled()) { |
| EARL_GREY_TEST_SKIPPED(@"Only enabled with MDM integration."); |
| } |
| |
| // Set up the fake identities. |
| ios::FakeChromeIdentityService* identity_service = |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); |
| ChromeIdentity* managed_identity = GetFakeManagedIdentity(); |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| identity_service->AddIdentity(managed_identity); |
| identity_service->AddIdentity(identity); |
| |
| // Sign in to |managed_identity|. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(managed_identity.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| |
| // Accept warning for signing into a managed identity, with synchronization |
| // off due to an infinite spinner. |
| SetEarlGreySynchronizationEnabled(NO); |
| WaitForMatcher(chrome_test_util::ButtonWithAccessibilityLabelId( |
| IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON)); |
| TapButtonWithLabelId(IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON); |
| SetEarlGreySynchronizationEnabled(YES); |
| |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(managed_identity); |
| |
| // Switch Sync account to |identity|. |
| TapViewWithAccessibilityId(kSettingsAccountCellId); |
| TapViewWithAccessibilityId(kSettingsAccountsSyncCellId); |
| TapButtonWithAccessibilityLabel(identity.userEmail); |
| |
| // Accept warning for signout out of a managed identity, with synchronization |
| // off due to an infinite spinner. |
| SetEarlGreySynchronizationEnabled(NO); |
| WaitForMatcher(chrome_test_util::ButtonWithAccessibilityLabelId( |
| IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON)); |
| TapButtonWithLabelId(IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON); |
| SetEarlGreySynchronizationEnabled(YES); |
| |
| AssertAuthenticatedIdentityInActiveProfile(identity); |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| |
| // Tests that signing out from the Settings works correctly. |
| - (void)testSignInDisconnectFromChrome { |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| // Sign in to |identity|. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(identity.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(identity); |
| |
| // Go to Accounts Settings and tap the sign out button. |
| TapViewWithAccessibilityId(kSettingsAccountCellId); |
| const CGFloat scroll_displacement = 100.0; |
| [[[EarlGrey selectElementWithMatcher:grey_accessibilityID( |
| kSettingsAccountsSignoutCellId)] |
| usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
| scroll_displacement) |
| onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] |
| performAction:grey_tap()]; |
| TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE); |
| |
| // Check that the settings home screen is shown. |
| WaitForMatcher(grey_accessibilityID(kSettingsSignInCellId)); |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| |
| // Check that there is no signed in user. |
| AssertAuthenticatedIdentityInActiveProfile(nil); |
| } |
| |
| // Tests that signing out of a managed account from the Settings works |
| // correctly. |
| - (void)testSignInDisconnectFromChromeManaged { |
| if (!experimental_flags::IsMDMIntegrationEnabled()) { |
| EARL_GREY_TEST_SKIPPED(@"Only enabled with MDM integration."); |
| } |
| |
| ChromeIdentity* identity = GetFakeManagedIdentity(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| // Sign in to |identity|. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(identity.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| // Synchronization off due to an infinite spinner. |
| SetEarlGreySynchronizationEnabled(NO); |
| WaitForMatcher(chrome_test_util::ButtonWithAccessibilityLabelId( |
| IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON)); |
| TapButtonWithLabelId(IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON); |
| SetEarlGreySynchronizationEnabled(YES); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(identity); |
| |
| // Go to Accounts Settings and tap the sign out button. |
| TapViewWithAccessibilityId(kSettingsAccountCellId); |
| const CGFloat scroll_displacement = 100.0; |
| [[[EarlGrey selectElementWithMatcher:grey_accessibilityID( |
| kSettingsAccountsSignoutCellId)] |
| usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
| scroll_displacement) |
| onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] |
| performAction:grey_tap()]; |
| TapButtonWithLabelId(IDS_IOS_MANAGED_DISCONNECT_DIALOG_ACCEPT); |
| |
| // Check that the settings home screen is shown. |
| WaitForMatcher(grey_accessibilityID(kSettingsSignInCellId)); |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| |
| // Check that there is no signed in user. |
| AssertAuthenticatedIdentityInActiveProfile(nil); |
| } |
| |
| // Tests that signing in, tapping the Settings link on the confirmation screen |
| // and closing the Settings correctly leaves the user signed in without any |
| // Settings shown. |
| - (void)testSignInOpenSettings { |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| // Sign in to |identity|. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(identity.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| |
| // Tap Settings link. |
| id<GREYMatcher> settings_link_matcher = grey_allOf( |
| grey_accessibilityLabel(@"Settings"), grey_sufficientlyVisible(), nil); |
| [[EarlGrey selectElementWithMatcher:settings_link_matcher] |
| performAction:grey_tap()]; |
| |
| // Close Settings. |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| |
| // All Settings should be gone and user signed in. |
| id<GREYMatcher> settings_matcher = |
| chrome_test_util::StaticTextWithAccessibilityLabelId( |
| IDS_IOS_SETTINGS_TITLE); |
| [[EarlGrey selectElementWithMatcher:settings_matcher] |
| assertWithMatcher:grey_notVisible()]; |
| AssertAuthenticatedIdentityInActiveProfile(identity); |
| } |
| |
| // Opens the sign in screen and then cancel it by opening a new tab. Ensures |
| // that the sign in screen is correctly dismissed. crbug.com/462200 |
| - (void)testSignInCancelIdentityPicker { |
| // Add an identity to avoid arriving on the Add Account screen when opening |
| // sign-in. |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| OpenSignInFromSettings(); |
| |
| // Open new tab to cancel sign-in. |
| OpenUrlCommand* command = |
| [[OpenUrlCommand alloc] initWithURLFromChrome:GURL("about:blank")]; |
| chrome_test_util::RunCommandWithActiveViewController(command); |
| |
| // Re-open the sign-in screen. If it wasn't correctly dismissed previously, |
| // this will fail. |
| OpenSignInFromSettings(); |
| id<GREYMatcher> signin_matcher = |
| chrome_test_util::StaticTextWithAccessibilityLabelId( |
| IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_DESCRIPTION); |
| [[EarlGrey selectElementWithMatcher:signin_matcher] |
| assertWithMatcher:grey_sufficientlyVisible()]; |
| |
| // Close sign-in screen and Settings. |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| |
| // Opens the add account screen and then cancels it by opening a new tab. |
| // Ensures that the add account screen is correctly dismissed. crbug.com/462200 |
| - (void)testSignInCancelAddAccount { |
| // Add an identity to avoid arriving on the Add Account screen when opening |
| // sign-in. |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| OpenSignInFromSettings(); |
| |
| // Open Add Account screen. |
| id<GREYMatcher> add_account_matcher = |
| chrome_test_util::StaticTextWithAccessibilityLabelId( |
| IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_ADD_ACCOUNT_BUTTON); |
| [[EarlGrey selectElementWithMatcher:add_account_matcher] |
| performAction:grey_tap()]; |
| [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; |
| |
| // Open new tab to cancel sign-in. |
| OpenUrlCommand* command = |
| [[OpenUrlCommand alloc] initWithURLFromChrome:GURL("about:blank")]; |
| chrome_test_util::RunCommandWithActiveViewController(command); |
| |
| // Re-open the sign-in screen. If it wasn't correctly dismissed previously, |
| // this will fail. |
| OpenSignInFromSettings(); |
| id<GREYMatcher> signin_matcher = |
| chrome_test_util::StaticTextWithAccessibilityLabelId( |
| IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_DESCRIPTION); |
| [[EarlGrey selectElementWithMatcher:signin_matcher] |
| assertWithMatcher:grey_sufficientlyVisible()]; |
| |
| // Close sign-in screen and Settings. |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| |
| // Starts an authentication flow and cancel it by opening a new tab. Ensures |
| // that the authentication flow is correctly canceled and dismissed. |
| // crbug.com/462202 |
| - (void)testSignInCancelAuthenticationFlow { |
| // Set up the fake identities. |
| ios::FakeChromeIdentityService* identity_service = |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider(); |
| ChromeIdentity* identity1 = GetFakeIdentity1(); |
| ChromeIdentity* identity2 = GetFakeIdentity2(); |
| identity_service->AddIdentity(identity1); |
| identity_service->AddIdentity(identity2); |
| |
| // This signs in |identity2| first, ensuring that the "Clear Data Before |
| // Syncing" dialog is shown during the second sign-in. This dialog will |
| // effectively block the authentication flow, ensuring that the authentication |
| // flow is always still running when the sign-in is being cancelled. |
| OpenSignInFromSettings(); |
| TapButtonWithAccessibilityLabel(identity2.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_OK_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(identity2); |
| |
| // Go to Accounts Settings and tap the sign out button. |
| TapViewWithAccessibilityId(kSettingsAccountCellId); |
| const CGFloat scroll_displacement = 100.0; |
| [[[EarlGrey selectElementWithMatcher:grey_accessibilityID( |
| kSettingsAccountsSignoutCellId)] |
| usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
| scroll_displacement) |
| onElementWithMatcher:grey_accessibilityID(kSettingsAccountsId)] |
| performAction:grey_tap()]; |
| TapButtonWithLabelId(IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE); |
| AssertAuthenticatedIdentityInActiveProfile(nil); |
| |
| // Start sign-in with |identity1|. |
| WaitForMatcher(grey_accessibilityID(kSettingsSignInCellId)); |
| TapViewWithAccessibilityId(kSettingsSignInCellId); |
| TapButtonWithAccessibilityLabel(identity1.userEmail); |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SIGNIN_BUTTON); |
| |
| // Open new tab to cancel sign-in. |
| OpenUrlCommand* command = |
| [[OpenUrlCommand alloc] initWithURLFromChrome:GURL("about:blank")]; |
| chrome_test_util::RunCommandWithActiveViewController(command); |
| |
| // Re-open the sign-in screen. If it wasn't correctly dismissed previously, |
| // this will fail. |
| OpenSignInFromSettings(); |
| id<GREYMatcher> signin_matcher = |
| chrome_test_util::StaticTextWithAccessibilityLabelId( |
| IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_DESCRIPTION); |
| [[EarlGrey selectElementWithMatcher:signin_matcher] |
| assertWithMatcher:grey_sufficientlyVisible()]; |
| |
| // Close sign-in screen and Settings. |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON); |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| AssertAuthenticatedIdentityInActiveProfile(nil); |
| } |
| |
| // Opens the sign in screen from the bookmarks and then cancel it by opening a |
| // new tab. Ensures that the sign in screen is correctly dismissed. |
| // Regression test for crbug.com/596029. |
| - (void)testSignInCancelFromBookmarks { |
| ChromeIdentity* identity = GetFakeIdentity1(); |
| ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( |
| identity); |
| |
| // Open Bookmarks and tap on Sign In promo button. |
| const CGFloat scroll_displacement = 50.0; |
| [ChromeEarlGreyUI openToolsMenu]; |
| [[[EarlGrey |
| selectElementWithMatcher:grey_accessibilityID(kToolsMenuBookmarksId)] |
| usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
| scroll_displacement) |
| onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)] |
| performAction:grey_tap()]; |
| |
| if (!IsIPadIdiom()) { |
| // Opens the bookmark manager sidebar on handsets. |
| [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Menu")] |
| performAction:grey_tap()]; |
| } |
| |
| // Selects the top level folder (Sign In promo is only shown there). |
| NSString* topLevelFolderTitle = @"Mobile Bookmarks"; |
| id<GREYMatcher> all_bookmarks_matcher = |
| grey_allOf(grey_kindOfClass(NSClassFromString(@"BookmarkMenuCell")), |
| grey_descendant(grey_text(topLevelFolderTitle)), nil); |
| [[EarlGrey selectElementWithMatcher:all_bookmarks_matcher] |
| performAction:grey_tap()]; |
| |
| TapButtonWithLabelId(IDS_IOS_BOOKMARK_PROMO_SIGN_IN_BUTTON); |
| |
| // Assert sign-in screen was shown. |
| id<GREYMatcher> signin_matcher = |
| chrome_test_util::StaticTextWithAccessibilityLabelId( |
| IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_DESCRIPTION); |
| [[EarlGrey selectElementWithMatcher:signin_matcher] |
| assertWithMatcher:grey_sufficientlyVisible()]; |
| |
| // Open new tab to cancel sign-in. |
| OpenUrlCommand* command = |
| [[OpenUrlCommand alloc] initWithURLFromChrome:GURL("about:blank")]; |
| chrome_test_util::RunCommandWithActiveViewController(command); |
| |
| // Re-open the sign-in screen. If it wasn't correctly dismissed previously, |
| // this will fail. |
| [ChromeEarlGreyUI openToolsMenu]; |
| [[[EarlGrey |
| selectElementWithMatcher:grey_accessibilityID(kToolsMenuBookmarksId)] |
| usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, |
| scroll_displacement) |
| onElementWithMatcher:grey_accessibilityID(kToolsMenuTableViewId)] |
| performAction:grey_tap()]; |
| if (!IsIPadIdiom()) { |
| [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Menu")] |
| performAction:grey_tap()]; |
| } |
| [[EarlGrey selectElementWithMatcher:all_bookmarks_matcher] |
| performAction:grey_tap()]; |
| TapButtonWithLabelId(IDS_IOS_BOOKMARK_PROMO_SIGN_IN_BUTTON); |
| [[EarlGrey selectElementWithMatcher:signin_matcher] |
| assertWithMatcher:grey_sufficientlyVisible()]; |
| |
| // Close sign-in screen and Bookmarks. |
| TapButtonWithLabelId(IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON); |
| if (!IsIPadIdiom()) { |
| TapButtonWithLabelId(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON); |
| } |
| } |
| |
| @end |