Index: ios/chrome/app/safe_mode/safe_mode_egtest.mm |
diff --git a/ios/chrome/app/safe_mode/safe_mode_egtest.mm b/ios/chrome/app/safe_mode/safe_mode_egtest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..88925dfe6f4505d1cf567b75c2aefe008e6cee8f |
--- /dev/null |
+++ b/ios/chrome/app/safe_mode/safe_mode_egtest.mm |
@@ -0,0 +1,160 @@ |
+// 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/logging.h" |
+#include "base/mac/foundation_util.h" |
+#include "base/mac/scoped_nsobject.h" |
+#import "ios/chrome/app/chrome_overlay_window.h" |
+#import "ios/chrome/app/safe_mode/safe_mode_view_controller.h" |
+#import "ios/chrome/browser/ui/main/main_view_controller.h" |
+#include "ios/chrome/grit/ios_chromium_strings.h" |
+#import "ios/chrome/test/base/scoped_block_swizzler.h" |
+#import "ios/chrome/test/earl_grey/chrome_test_case.h" |
+ |
+namespace { |
+ |
+// Returns the top view controller for rendering the Safe Mode Controller. |
+UIViewController* GetActiveViewController() { |
+ UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow]; |
+ DCHECK([mainWindow isKindOfClass:[ChromeOverlayWindow class]]); |
+ MainViewController* main_view_controller = |
+ base::mac::ObjCCast<MainViewController>([mainWindow rootViewController]); |
+ return main_view_controller.activeViewController; |
+} |
+ |
+// Verifies that |message| is displayed. |
+void AssertMessageOnPage(NSString* message) { |
+ id<GREYMatcher> messageMatcher = [GREYMatchers matcherForText:message]; |
+ [[EarlGrey selectElementWithMatcher:messageMatcher] |
+ assertWithMatcher:grey_notNil()]; |
+} |
+ |
+// Verifies that |message| is not displayed. |
+void AssertMessageNotOnPage(NSString* message) { |
+ id<GREYMatcher> messageMatcher = [GREYMatchers matcherForText:message]; |
+ [[EarlGrey selectElementWithMatcher:messageMatcher] |
+ assertWithMatcher:grey_nil()]; |
+} |
+ |
+// Verifies that the button to reload chrome is displayed. |
+void AssertTryAgainButtonOnPage() { |
+ NSString* tryAgain = |
+ NSLocalizedString(@"IDS_IOS_SAFE_MODE_RELOAD_CHROME", @""); |
+ // This is uppercased to match MDC button label convention. |
+ NSString* tryAgainPrimaryAction = |
+ [tryAgain uppercaseStringWithLocale:[NSLocale currentLocale]]; |
+ id<GREYMatcher> tryAgainMatcher = |
+ [GREYMatchers matcherForButtonTitle:tryAgainPrimaryAction]; |
+ [[EarlGrey selectElementWithMatcher:tryAgainMatcher] |
+ assertWithMatcher:grey_notNil()]; |
+} |
+ |
+} // namespace |
+ |
+// Tests the display of Safe Mode Controller under different error states of |
+// jailbroken-ness and whether a crash dump was saved. |
+@interface SafeModeTestCase : ChromeTestCase |
+@end |
+ |
+@implementation SafeModeTestCase |
+ |
+// Tests that Safe Mode crash upload screen is displayed when there are crash |
+// reports to upload. |
+- (void)testSafeModeSendingCrashReport { |
+ // Mocks the +hasReportToUpload method by swizzling to return positively that |
+ // there are crash reports to upload. |
+ ScopedBlockSwizzler hasReport([SafeModeViewController class], |
+ @selector(hasReportToUpload), ^{ |
+ return YES; |
+ }); |
+ |
+ // Instantiates a Safe Mode controller and displays it. |
+ base::scoped_nsobject<SafeModeViewController> safeModeController( |
+ [[SafeModeViewController alloc] initWithDelegate:nil]); |
+ [GetActiveViewController() presentViewController:safeModeController |
+ animated:NO |
+ completion:nil]; |
+ // Verifies screen content that shows that crash report is being uploaded. |
+ AssertMessageOnPage(NSLocalizedString(@"IDS_IOS_SAFE_MODE_AW_SNAP", @"")); |
+ AssertMessageOnPage( |
+ NSLocalizedString(@"IDS_IOS_SAFE_MODE_UNKNOWN_CAUSE", @"")); |
+ AssertTryAgainButtonOnPage(); |
+ AssertMessageOnPage( |
+ NSLocalizedString(@"IDS_IOS_SAFE_MODE_SENDING_CRASH_REPORT", @"")); |
+} |
+ |
+// Tests that Safe Mode screen is displayed with a message that there are |
+// jailbroken mods that caused a crash. Crash reports are not sent. |
+- (void)testSafeModeDetectedThirdPartyMods { |
+ // Mocks the +detectedThirdPartyMods method by swizzling to return positively |
+ // that device appears to be jailbroken and contains third party mods. |
+ ScopedBlockSwizzler thirdParty([SafeModeViewController class], |
+ @selector(detectedThirdPartyMods), ^{ |
+ return YES; |
+ }); |
+ // Returns an empty list to simulate no known mods detected. |
+ ScopedBlockSwizzler badModules([SafeModeViewController class], |
+ @selector(startupCrashModules), ^{ |
+ return @[]; |
+ }); |
+ |
+ // Instantiates a Safe Mode controller and displays it. |
+ base::scoped_nsobject<SafeModeViewController> safeModeController( |
+ [[SafeModeViewController alloc] initWithDelegate:nil]); |
+ [GetActiveViewController() presentViewController:safeModeController |
+ animated:NO |
+ completion:nil]; |
+ // Verifies screen content that does not show crash report being uploaded. |
+ // When devices are jailbroken, the crash reports are not very useful. |
+ AssertMessageOnPage(NSLocalizedString(@"IDS_IOS_SAFE_MODE_AW_SNAP", @"")); |
+ AssertMessageOnPage( |
+ NSLocalizedString(@"IDS_IOS_SAFE_MODE_TWEAKS_FOUND", @"")); |
+ AssertTryAgainButtonOnPage(); |
+ AssertMessageNotOnPage( |
+ NSLocalizedString(@"IDS_IOS_SAFE_MODE_SENDING_CRASH_REPORT", @"")); |
+} |
+ |
+// Tests that Safe Mode screen is displayed with a message that there are |
+// jailbroken mods listing the names of the known to be bad mods that caused a |
+// crash. Crash reports are not sent. |
+- (void)testSafeModeBothThirdPartyModsAndHasReport { |
+ // Mocks the +detectedThirdPartyMods method by swizzling to return positively |
+ // that device appears to be jailbroken and contains third party mods. |
+ ScopedBlockSwizzler thirdParty([SafeModeViewController class], |
+ @selector(detectedThirdPartyMods), ^{ |
+ return YES; |
+ }); |
+ // Mocked list of bad jailbroken mods. These will be checked later. |
+ NSArray* badModulesList = @[ @"iAmBad", @"MJackson" ]; |
+ ScopedBlockSwizzler badModules([SafeModeViewController class], |
+ @selector(startupCrashModules), ^{ |
+ return badModulesList; |
+ }); |
+ ScopedBlockSwizzler hasReport([SafeModeViewController class], |
+ @selector(hasReportToUpload), ^{ |
+ return YES; |
+ }); |
+ // Instantiates a Safe Mode controller and displays it. |
+ base::scoped_nsobject<SafeModeViewController> safeModeController( |
+ [[SafeModeViewController alloc] initWithDelegate:nil]); |
+ [GetActiveViewController() presentViewController:safeModeController |
+ animated:NO |
+ completion:nil]; |
+ // Verifies screen content that does not show crash report being uploaded. |
+ // When devices are jailbroken, the crash reports are not very useful. |
+ AssertMessageOnPage(NSLocalizedString(@"IDS_IOS_SAFE_MODE_AW_SNAP", @"")); |
+ // Constructs the list of bad mods based on |badModulesList| above. |
+ NSString* message = |
+ [NSLocalizedString(@"IDS_IOS_SAFE_MODE_NAMED_TWEAKS_FOUND", @"") |
+ stringByAppendingString:@"\n\n iAmBad\n MJackson"]; |
+ AssertMessageOnPage(message); |
+ AssertTryAgainButtonOnPage(); |
+ AssertMessageNotOnPage( |
+ NSLocalizedString(@"IDS_IOS_SAFE_MODE_SENDING_CRASH_REPORT", @"")); |
+} |
+ |
+@end |