OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import "ios/chrome/browser/web/mailto_url_rewriter.h" |
| 6 |
| 7 #import "ios/chrome/browser/web/mailto_handler.h" |
| 8 #import "ios/chrome/browser/web/mailto_handler_gmail.h" |
| 9 #import "ios/chrome/browser/web/mailto_handler_system_mail.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "testing/gtest_mac.h" |
| 12 #include "testing/platform_test.h" |
| 13 |
| 14 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 15 #error "This file requires ARC support." |
| 16 #endif |
| 17 |
| 18 namespace { |
| 19 |
| 20 // Defines the 3 valid states for ShouldAutoOpenLinks_422689480. |
| 21 enum { |
| 22 kAutoOpenLinksNotSet = 0, |
| 23 kAutoOpenLinksNo = 1, |
| 24 kAutoOpenLinksYes = 2, |
| 25 }; |
| 26 NSString* const kLegacyShouldAutoOpenKey = @"ShouldAutoOpenLinks_422689480"; |
| 27 NSString* const kGmailAppStoreID = @"422689480"; |
| 28 |
| 29 } // namespace |
| 30 |
| 31 #pragma mark - Gmail not installed |
| 32 |
| 33 @interface FakeMailtoHandlerGmailNotInstalled : MailtoHandlerGmail |
| 34 @end |
| 35 |
| 36 @implementation FakeMailtoHandlerGmailNotInstalled |
| 37 - (BOOL)isAvailable { |
| 38 return NO; |
| 39 } |
| 40 @end |
| 41 |
| 42 #pragma mark - Gmail is installed |
| 43 |
| 44 @interface FakeMailtoHandlerGmailInstalled : MailtoHandlerGmail |
| 45 @end |
| 46 |
| 47 @implementation FakeMailtoHandlerGmailInstalled |
| 48 - (BOOL)isAvailable { |
| 49 return YES; |
| 50 } |
| 51 @end |
| 52 |
| 53 #pragma mark - MailtoURLRewriter private interfaces for TEST_Fing. |
| 54 |
| 55 @interface MailtoURLRewriter () |
| 56 + (void)resetDefaultHandlerID; |
| 57 - (void)addMailtoApp:(MailtoHandler*)handlerApp; |
| 58 - (void)convertLegacyOptions; |
| 59 @end |
| 60 |
| 61 #pragma mark - Unit Test Cases |
| 62 |
| 63 class MailtoURLRewriterTest : public PlatformTest { |
| 64 protected: |
| 65 void SetUp() override { [MailtoURLRewriter resetDefaultHandlerID]; } |
| 66 }; |
| 67 |
| 68 // Tests that a standard instance has the expected values. |
| 69 TEST_F(MailtoURLRewriterTest, TestStandardInstance) { |
| 70 MailtoURLRewriter* rewriter = |
| 71 [[MailtoURLRewriter alloc] initWithStandardHandlers]; |
| 72 EXPECT_TRUE(rewriter); |
| 73 // ID for system Mail client app must not be an empty string. |
| 74 EXPECT_GT([[MailtoURLRewriter systemMailApp] length], 0U); |
| 75 |
| 76 NSArray<MailtoHandler*>* handlers = [rewriter defaultHandlers]; |
| 77 EXPECT_GE([handlers count], 1U); |
| 78 for (MailtoHandler* handler : handlers) { |
| 79 ASSERT_TRUE(handler); |
| 80 NSString* appStoreID = [handler appStoreID]; |
| 81 [rewriter setDefaultHandlerID:appStoreID]; |
| 82 EXPECT_NSEQ(appStoreID, [rewriter defaultHandlerID]); |
| 83 } |
| 84 } |
| 85 |
| 86 TEST_F(MailtoURLRewriterTest, TestUserPreferencePersistence) { |
| 87 MailtoURLRewriter* rewriter = |
| 88 [[MailtoURLRewriter alloc] initWithStandardHandlers]; |
| 89 EXPECT_TRUE(rewriter); |
| 90 NSArray<MailtoHandler*>* handlers = [rewriter defaultHandlers]; |
| 91 ASSERT_GE([handlers count], 2U); |
| 92 NSString* initialHandlerID = [rewriter defaultHandlerID]; |
| 93 NSString* otherHandlerID = nil; |
| 94 for (MailtoHandler* handler : handlers) { |
| 95 if ([initialHandlerID isEqualToString:[handler appStoreID]]) |
| 96 continue; |
| 97 otherHandlerID = [handler appStoreID]; |
| 98 } |
| 99 ASSERT_TRUE([otherHandlerID length]); |
| 100 [rewriter setDefaultHandlerID:otherHandlerID]; |
| 101 |
| 102 MailtoURLRewriter* rewriter2 = |
| 103 [[MailtoURLRewriter alloc] initWithStandardHandlers]; |
| 104 EXPECT_NSEQ(otherHandlerID, [rewriter2 defaultHandlerID]); |
| 105 } |
| 106 |
| 107 // Tests that a new user without Gmail app installed launches system Mail app. |
| 108 TEST_F(MailtoURLRewriterTest, TestNewUserNoGmail) { |
| 109 // Sets pre-condition for a user who did not have Chrome installed. |
| 110 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 111 [defaults removeObjectForKey:kLegacyShouldAutoOpenKey]; |
| 112 // A faked MailtoHandler for Gmail. |
| 113 MailtoHandler* fakeGmailHandler = |
| 114 [[FakeMailtoHandlerGmailNotInstalled alloc] init]; |
| 115 |
| 116 // Sets up a MailtoURLRewriter for testing. |
| 117 MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init]; |
| 118 MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init]; |
| 119 [rewriter addMailtoApp:systemMailHandler]; |
| 120 [rewriter addMailtoApp:fakeGmailHandler]; |
| 121 [rewriter convertLegacyOptions]; |
| 122 |
| 123 // Verify that MailtoURLRewriter will use the system Mail app. |
| 124 EXPECT_NSEQ([MailtoURLRewriter systemMailApp], [rewriter defaultHandlerID]); |
| 125 } |
| 126 |
| 127 // Tests that a new user with Gmail app installed launches Gmail app. |
| 128 TEST_F(MailtoURLRewriterTest, TestNewUserWithGmail) { |
| 129 // Sets pre-condition for a user who did not have Chrome installed. |
| 130 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 131 [defaults removeObjectForKey:kLegacyShouldAutoOpenKey]; |
| 132 // A faked MailtoHandler for Gmail. |
| 133 MailtoHandler* fakeGmailHandler = |
| 134 [[FakeMailtoHandlerGmailInstalled alloc] init]; |
| 135 |
| 136 // Sets up a MailtoURLRewriter for testing. |
| 137 MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init]; |
| 138 MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init]; |
| 139 [rewriter addMailtoApp:systemMailHandler]; |
| 140 [rewriter addMailtoApp:fakeGmailHandler]; |
| 141 [rewriter convertLegacyOptions]; |
| 142 |
| 143 // Verify that MailtoURLRewriter will use Gmail app. |
| 144 EXPECT_NSEQ(kGmailAppStoreID, [rewriter defaultHandlerID]); |
| 145 } |
| 146 |
| 147 // Tests that a user who has Gmail installed but has chosen not to use Gmail |
| 148 // as the app to handle mailto: links retains the same behavior when upgrading |
| 149 // Chrome. |
| 150 TEST_F(MailtoURLRewriterTest, TestUpgradeUserWithGmailDisabled) { |
| 151 // Sets pre-condition for a user who had Chrome installed. |
| 152 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 153 [defaults setObject:@(kAutoOpenLinksNo) forKey:kLegacyShouldAutoOpenKey]; |
| 154 // A faked MailtoHandler for Gmail. |
| 155 MailtoHandler* fakeGmailHandler = |
| 156 [[FakeMailtoHandlerGmailInstalled alloc] init]; |
| 157 |
| 158 // Sets up a MailtoURLRewriter for testing. |
| 159 MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init]; |
| 160 MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init]; |
| 161 [rewriter addMailtoApp:systemMailHandler]; |
| 162 [rewriter addMailtoApp:fakeGmailHandler]; |
| 163 [rewriter convertLegacyOptions]; |
| 164 |
| 165 // Verify that MailtoURLRewriter will use the system Mail app. As part of the |
| 166 // "upgrade", the legacy key should be removed as well. |
| 167 EXPECT_NSEQ([MailtoURLRewriter systemMailApp], [rewriter defaultHandlerID]); |
| 168 EXPECT_FALSE([defaults objectForKey:kLegacyShouldAutoOpenKey]); |
| 169 } |
| 170 |
| 171 // Tests that a user who has Gmail installed and has chosen to use Gmail as the |
| 172 // app to handle mailto: links retains the same behavior. |
| 173 TEST_F(MailtoURLRewriterTest, TestUpgradeUserWithGmailEnabled) { |
| 174 // Sets pre-condition for a user who did not have Chrome installed. |
| 175 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 176 [defaults setObject:@(kAutoOpenLinksYes) forKey:kLegacyShouldAutoOpenKey]; |
| 177 // A faked MailtoHandler for Gmail. |
| 178 MailtoHandler* fakeGmailHandler = |
| 179 [[FakeMailtoHandlerGmailInstalled alloc] init]; |
| 180 |
| 181 // Sets up a MailtoURLRewriter for testing. |
| 182 MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init]; |
| 183 MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init]; |
| 184 [rewriter addMailtoApp:systemMailHandler]; |
| 185 [rewriter addMailtoApp:fakeGmailHandler]; |
| 186 [rewriter convertLegacyOptions]; |
| 187 |
| 188 // Verify that MailtoURLRewriter will use Gmail app. As part of the upgrade, |
| 189 // the legacy key should be removed as well. |
| 190 EXPECT_NSEQ(kGmailAppStoreID, [rewriter defaultHandlerID]); |
| 191 EXPECT_FALSE([defaults objectForKey:kLegacyShouldAutoOpenKey]); |
| 192 } |
| 193 |
| 194 // Tests that a user who installed Gmail after started using Chrome gets Gmail |
| 195 // as the handler of mailto: links. |
| 196 TEST_F(MailtoURLRewriterTest, TestInstalledGmailAfterChrome) { |
| 197 // Pre-condition for a user who did not have Chrome installed. |
| 198 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 199 [defaults removeObjectForKey:kLegacyShouldAutoOpenKey]; |
| 200 // A faked MailtoHandler for Gmail. |
| 201 MailtoHandler* fakeGmailHandler = |
| 202 [[FakeMailtoHandlerGmailInstalled alloc] init]; |
| 203 |
| 204 // Sets up a MailtoURLRewriter for testing. |
| 205 MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init]; |
| 206 MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init]; |
| 207 [rewriter addMailtoApp:systemMailHandler]; |
| 208 [rewriter addMailtoApp:fakeGmailHandler]; |
| 209 [rewriter convertLegacyOptions]; |
| 210 |
| 211 // Verify that MailtoURLRewriter will use Gmail app. |
| 212 EXPECT_NSEQ(kGmailAppStoreID, [rewriter defaultHandlerID]); |
| 213 } |
OLD | NEW |