| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "base/functional/bind.h" |
| #import "base/test/ios/wait_util.h" |
| #import "components/strings/grit/components_strings.h" |
| #import "ios/chrome/browser/download/model/download_test_util.h" |
| #import "ios/chrome/browser/download/model/mime_type_util.h" |
| #import "ios/chrome/browser/download/ui_bundled/features.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_matchers.h" |
| #import "ios/chrome/test/earl_grey/chrome_test_case.h" |
| #import "ios/testing/earl_grey/app_launch_manager.h" |
| #import "ios/testing/earl_grey/earl_grey_test.h" |
| #import "net/test/embedded_test_server/embedded_test_server.h" |
| #import "net/test/embedded_test_server/http_request.h" |
| #import "net/test/embedded_test_server/http_response.h" |
| #import "ui/base/l10n/l10n_util_mac.h" |
| |
| using base::test::ios::kWaitForDownloadTimeout; |
| using chrome_test_util::ButtonWithAccessibilityLabelId; |
| |
| namespace { |
| |
| // Files landing page and download request handler. |
| std::unique_ptr<net::test_server::HttpResponse> GetResponse( |
| const net::test_server::HttpRequest& request) { |
| auto result = std::make_unique<net::test_server::BasicHttpResponse>(); |
| result->set_code(net::HTTP_OK); |
| |
| if (request.GetURL().path() == "/") { |
| result->set_content( |
| "<a id='mobileconfig' href='/mobileconfig'>Mobileconfig</a>" |
| "<br>" |
| "<a id='calendar' href='/calendar'>Calendar</a>"); |
| } else if (request.GetURL().path() == "/mobileconfig") { |
| result->AddCustomHeader("Content-Type", kMobileConfigurationType); |
| result->set_content( |
| testing::GetTestFileContents(testing::kMobileConfigFilePath)); |
| } else if (request.GetURL().path() == "/calendar") { |
| result->AddCustomHeader("Content-Type", kCalendarMimeType); |
| result->set_content( |
| testing::GetTestFileContents(testing::kCalendarFilePath)); |
| } |
| |
| return result; |
| } |
| |
| // Waits until the warning alert is shown. |
| [[nodiscard]] bool WaitForWarningAlert(NSString* alertMessage) { |
| return base::test::ios::WaitUntilConditionOrTimeout( |
| base::test::ios::kWaitForPageLoadTimeout, ^{ |
| NSError* error = nil; |
| [[EarlGrey selectElementWithMatcher:grey_text(alertMessage)] |
| assertWithMatcher:grey_notNil() |
| error:&error]; |
| return (error == nil); |
| }); |
| } |
| |
| } // namespace |
| |
| // Tests downloading files using SFSafariViewController. |
| @interface SafariDownloadEGTest : ChromeTestCase |
| |
| @end |
| |
| @implementation SafariDownloadEGTest |
| |
| - (AppLaunchConfiguration)appConfigurationForTestCase { |
| AppLaunchConfiguration config; |
| return config; |
| } |
| |
| - (void)setUp { |
| [super setUp]; |
| |
| self.testServer->RegisterRequestHandler(base::BindRepeating(&GetResponse)); |
| GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); |
| } |
| |
| // Tests that the correct warning alert is shown and when tapping 'Continue' a |
| // SFSafariViewController is presented. |
| - (void)testMobileConfigDownloadAndContinue { |
| [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]; |
| [ChromeEarlGrey waitForWebStateContainingText:"Mobileconfig"]; |
| [ChromeEarlGrey tapWebStateElementWithID:@"mobileconfig"]; |
| |
| GREYAssert(WaitForWarningAlert(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_MOBILECONFIG_FILE_WARNING_TITLE)), |
| @"The warning alert did not show up"); |
| |
| // Tap on 'Continue' to present the SFSafariViewController. |
| [[EarlGrey |
| selectElementWithMatcher:grey_text(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_MOBILECONFIG_CONTINUE))] |
| performAction:grey_tap()]; |
| |
| // Verify SFSafariViewController is presented. |
| [[EarlGrey selectElementWithMatcher:grey_kindOfClassName(@"SFSafariView")] |
| assertWithMatcher:grey_notNil()]; |
| } |
| |
| // Tests that a warning alert is shown and when tapping 'Cancel' the alert is |
| // dismissed without presenting a SFSafariViewController. |
| - (void)testMobileConfigDownloadAndCancel { |
| [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]; |
| [ChromeEarlGrey waitForWebStateContainingText:"Mobileconfig"]; |
| [ChromeEarlGrey tapWebStateElementWithID:@"mobileconfig"]; |
| |
| GREYAssert(WaitForWarningAlert(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_MOBILECONFIG_FILE_WARNING_TITLE)), |
| @"The warning alert did not show up"); |
| |
| // Tap on 'Cancel' to dismiss the warning alert. |
| [[EarlGrey |
| selectElementWithMatcher:ButtonWithAccessibilityLabelId(IDS_CANCEL)] |
| performAction:grey_tap()]; |
| |
| // Verify SFSafariViewController is not presented. |
| [[EarlGrey selectElementWithMatcher:grey_kindOfClassName(@"SFSafariView")] |
| assertWithMatcher:grey_nil()]; |
| // Verify the warning alert is dismissed. |
| [[EarlGrey selectElementWithMatcher: |
| grey_text(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_MOBILECONFIG_FILE_WARNING_TITLE))] |
| assertWithMatcher:grey_nil()]; |
| } |
| |
| // Tests that the correct warning alert is shown and when tapping 'Continue' a |
| // SFSafariViewController is presented. |
| - (void)testCalendarDownloadAndContinue { |
| [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]; |
| [ChromeEarlGrey waitForWebStateContainingText:"Calendar"]; |
| [ChromeEarlGrey tapWebStateElementWithID:@"calendar"]; |
| |
| GREYAssert(WaitForWarningAlert(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_CALENDAR_FILE_WARNING_MESSAGE)), |
| @"The warning alert did not show up"); |
| // Tap on 'Continue' to present the SFSafariViewController. |
| [[EarlGrey |
| selectElementWithMatcher:grey_text(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_MOBILECONFIG_CONTINUE))] |
| performAction:grey_tap()]; |
| |
| // Verify SFSafariViewController is presented. |
| [[EarlGrey selectElementWithMatcher:grey_kindOfClassName(@"SFSafariView")] |
| assertWithMatcher:grey_notNil()]; |
| } |
| |
| // Tests that a warning alert is shown and when tapping 'Cancel' the alert is |
| // dismissed without presenting a SFSafariViewController. |
| - (void)testCalendarDownloadAndCancel { |
| [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]; |
| [ChromeEarlGrey waitForWebStateContainingText:"Calendar"]; |
| [ChromeEarlGrey tapWebStateElementWithID:@"calendar"]; |
| |
| GREYAssert(WaitForWarningAlert(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_CALENDAR_FILE_WARNING_MESSAGE)), |
| @"The warning alert did not show up"); |
| |
| // Tap on 'Cancel' to dismiss the warning alert. |
| [[EarlGrey |
| selectElementWithMatcher:ButtonWithAccessibilityLabelId(IDS_CANCEL)] |
| performAction:grey_tap()]; |
| |
| // Verify SFSafariViewController is not presented. |
| [[EarlGrey selectElementWithMatcher:grey_kindOfClassName(@"SFSafariView")] |
| assertWithMatcher:grey_nil()]; |
| // Verify the warning alert is dismissed. |
| [[EarlGrey selectElementWithMatcher: |
| grey_text(l10n_util::GetNSString( |
| IDS_IOS_DOWNLOAD_MOBILECONFIG_FILE_WARNING_TITLE))] |
| assertWithMatcher:grey_nil()]; |
| } |
| @end |