Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Unified Diff: ios/chrome/browser/web/mailto_url_rewriter_unittest.mm

Issue 2852003002: Adds mailto: URL support to app launching. (Closed)
Patch Set: separate migration from auto-default even more Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ios/chrome/browser/web/mailto_url_rewriter.mm ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ios/chrome/browser/web/mailto_url_rewriter_unittest.mm
diff --git a/ios/chrome/browser/web/mailto_url_rewriter_unittest.mm b/ios/chrome/browser/web/mailto_url_rewriter_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..8edead2b7f832e499b5a881045e498d81bbab1f5
--- /dev/null
+++ b/ios/chrome/browser/web/mailto_url_rewriter_unittest.mm
@@ -0,0 +1,214 @@
+// Copyright 2017 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 "ios/chrome/browser/web/mailto_url_rewriter.h"
+
+#import "ios/chrome/browser/web/mailto_handler.h"
+#import "ios/chrome/browser/web/mailto_handler_gmail.h"
+#import "ios/chrome/browser/web/mailto_handler_system_mail.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+// Defines the 3 valid states for ShouldAutoOpenLinks_422689480.
+enum {
+ kAutoOpenLinksNotSet = 0,
+ kAutoOpenLinksNo = 1,
+ kAutoOpenLinksYes = 2,
+};
+NSString* const kLegacyShouldAutoOpenKey = @"ShouldAutoOpenLinks_422689480";
+NSString* const kGmailAppStoreID = @"422689480";
+
+} // namespace
+
+#pragma mark - Gmail not installed
+
+@interface FakeMailtoHandlerGmailNotInstalled : MailtoHandlerGmail
+@end
+
+@implementation FakeMailtoHandlerGmailNotInstalled
+- (BOOL)isAvailable {
+ return NO;
+}
+@end
+
+#pragma mark - Gmail is installed
+
+@interface FakeMailtoHandlerGmailInstalled : MailtoHandlerGmail
+@end
+
+@implementation FakeMailtoHandlerGmailInstalled
+- (BOOL)isAvailable {
+ return YES;
+}
+@end
+
+#pragma mark - MailtoURLRewriter private interfaces for testing.
+
+@interface MailtoURLRewriter ()
++ (void)resetDefaultHandlerIDForTesting;
+- (void)addMailtoApps:(NSArray<MailtoHandler*>*)handlerApps;
+@end
+
+#pragma mark - Unit Test Cases
+
+class MailtoURLRewriterTest : public PlatformTest {
+ protected:
+ void SetUp() override { [MailtoURLRewriter resetDefaultHandlerIDForTesting]; }
+};
+
+// Tests that a standard instance has the expected values.
+TEST_F(MailtoURLRewriterTest, TestStandardInstance) {
+ MailtoURLRewriter* rewriter =
+ [[MailtoURLRewriter alloc] initWithStandardHandlers];
+ EXPECT_TRUE(rewriter);
+ // ID for system Mail client app must not be an empty string.
+ EXPECT_GT([[MailtoURLRewriter systemMailApp] length], 0U);
+
+ NSArray<MailtoHandler*>* handlers = [rewriter defaultHandlers];
+ EXPECT_GE([handlers count], 1U);
+ for (MailtoHandler* handler in handlers) {
+ ASSERT_TRUE(handler);
+ NSString* appStoreID = [handler appStoreID];
+ [rewriter setDefaultHandlerID:appStoreID];
+ EXPECT_NSEQ(appStoreID, [rewriter defaultHandlerID]);
+ }
+}
+
+TEST_F(MailtoURLRewriterTest, TestUserPreferencePersistence) {
+ // Sets up a first MailtoURLRewriter with at least 2 MailtoHandler objects.
+ // A faked Gmail handler that is installed must be used or -addMailtoApp:
+ // will just skip it.
+ MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init];
+ MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init];
+ MailtoHandler* fakeGmailHandler =
+ [[FakeMailtoHandlerGmailInstalled alloc] init];
+ [rewriter addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+
+ // Verifies that there must be 2 registered handlers. Then find a
+ // MailtoHandler that is not the current default and set that as the new
+ // default.
+ NSArray<MailtoHandler*>* handlers = [rewriter defaultHandlers];
+ ASSERT_GE([handlers count], 2U);
+ NSString* initialHandlerID = [rewriter defaultHandlerID];
+ NSString* otherHandlerID = nil;
+ for (MailtoHandler* handler in handlers) {
+ if (![initialHandlerID isEqualToString:[handler appStoreID]]) {
+ otherHandlerID = [handler appStoreID];
+ break;
+ }
+ }
+ ASSERT_TRUE([otherHandlerID length]);
+ [rewriter setDefaultHandlerID:otherHandlerID];
+
+ // Create a new MailtoURLRewriter object and verify that the current
+ // default is the |otherHandlerID| set in the previous step.
+ MailtoURLRewriter* rewriter2 = [[MailtoURLRewriter alloc] init];
+ [rewriter2 addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+ EXPECT_NSEQ(otherHandlerID, [rewriter2 defaultHandlerID]);
+}
+
+// Tests that a new user without Gmail app installed launches system Mail app.
+TEST_F(MailtoURLRewriterTest, TestNewUserNoGmail) {
+ // Sets pre-condition for a user who did not have Chrome installed.
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults removeObjectForKey:kLegacyShouldAutoOpenKey];
+ // A faked MailtoHandler for Gmail.
+ MailtoHandler* fakeGmailHandler =
+ [[FakeMailtoHandlerGmailNotInstalled alloc] init];
+
+ // Sets up a MailtoURLRewriter for testing.
+ MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init];
+ MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init];
+ [rewriter addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+
+ // Verify that MailtoURLRewriter will use the system Mail app.
+ EXPECT_NSEQ([MailtoURLRewriter systemMailApp], [rewriter defaultHandlerID]);
+}
+
+// Tests that a new user with Gmail app installed launches Gmail app.
+TEST_F(MailtoURLRewriterTest, TestNewUserWithGmail) {
+ // Sets pre-condition for a user who did not have Chrome installed.
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults removeObjectForKey:kLegacyShouldAutoOpenKey];
+ // A faked MailtoHandler for Gmail.
+ MailtoHandler* fakeGmailHandler =
+ [[FakeMailtoHandlerGmailInstalled alloc] init];
+
+ // Sets up a MailtoURLRewriter for testing.
+ MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init];
+ MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init];
+ [rewriter addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+
+ // Verify that MailtoURLRewriter will use Gmail app.
+ EXPECT_NSEQ(kGmailAppStoreID, [rewriter defaultHandlerID]);
+}
+
+// Tests that a user who has Gmail installed but has chosen not to use Gmail
+// as the app to handle mailto: links retains the same behavior when upgrading
+// Chrome.
+TEST_F(MailtoURLRewriterTest, TestUpgradeUserWithGmailDisabled) {
+ // Sets pre-condition for a user who had Chrome installed.
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setObject:@(kAutoOpenLinksNo) forKey:kLegacyShouldAutoOpenKey];
+ // A faked MailtoHandler for Gmail.
+ MailtoHandler* fakeGmailHandler =
+ [[FakeMailtoHandlerGmailInstalled alloc] init];
+
+ // Sets up a MailtoURLRewriter for testing.
+ MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init];
+ MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init];
+ [rewriter addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+
+ // Verify that MailtoURLRewriter will use the system Mail app. As part of the
+ // "upgrade", the legacy key should be removed as well.
+ EXPECT_NSEQ([MailtoURLRewriter systemMailApp], [rewriter defaultHandlerID]);
+ EXPECT_FALSE([defaults objectForKey:kLegacyShouldAutoOpenKey]);
+}
+
+// Tests that a user who has Gmail installed and has chosen to use Gmail as the
+// app to handle mailto: links retains the same behavior.
+TEST_F(MailtoURLRewriterTest, TestUpgradeUserWithGmailEnabled) {
+ // Sets pre-condition for a user who did not have Chrome installed.
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setObject:@(kAutoOpenLinksYes) forKey:kLegacyShouldAutoOpenKey];
+ // A faked MailtoHandler for Gmail.
+ MailtoHandler* fakeGmailHandler =
+ [[FakeMailtoHandlerGmailInstalled alloc] init];
+
+ // Sets up a MailtoURLRewriter for testing.
+ MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init];
+ MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init];
+ [rewriter addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+
+ // Verify that MailtoURLRewriter will use Gmail app. As part of the upgrade,
+ // the legacy key should be removed as well.
+ EXPECT_NSEQ(kGmailAppStoreID, [rewriter defaultHandlerID]);
+ EXPECT_FALSE([defaults objectForKey:kLegacyShouldAutoOpenKey]);
+}
+
+// Tests that a user who installed Gmail after started using Chrome gets Gmail
+// as the handler of mailto: links.
+TEST_F(MailtoURLRewriterTest, TestInstalledGmailAfterChrome) {
+ // Pre-condition for a user who did not have Chrome installed.
+ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+ [defaults removeObjectForKey:kLegacyShouldAutoOpenKey];
+ // A faked MailtoHandler for Gmail.
+ MailtoHandler* fakeGmailHandler =
+ [[FakeMailtoHandlerGmailInstalled alloc] init];
+
+ // Sets up a MailtoURLRewriter for testing.
+ MailtoURLRewriter* rewriter = [[MailtoURLRewriter alloc] init];
+ MailtoHandler* systemMailHandler = [[MailtoHandlerSystemMail alloc] init];
+ [rewriter addMailtoApps:@[ systemMailHandler, fakeGmailHandler ]];
+
+ // Verify that MailtoURLRewriter will use Gmail app.
+ EXPECT_NSEQ(kGmailAppStoreID, [rewriter defaultHandlerID]);
+}
« no previous file with comments | « ios/chrome/browser/web/mailto_url_rewriter.mm ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698