Index: ios/chrome/browser/ui/authentication/re_signin_infobar_delegate_unittest.mm |
diff --git a/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate_unittest.mm b/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7550ff4c76704bfd59840b46caba262b638ddf3e |
--- /dev/null |
+++ b/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate_unittest.mm |
@@ -0,0 +1,218 @@ |
+// Copyright 2013 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. |
+ |
+#include "ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h" |
+ |
+#include <memory> |
+ |
+#include "base/mac/objc_property_releaser.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/memory/ptr_util.h" |
+#include "components/sync_preferences/testing_pref_service_syncable.h" |
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
+#include "ios/chrome/browser/infobars/confirm_infobar_controller.h" |
+#include "ios/chrome/browser/infobars/infobar.h" |
+#include "ios/chrome/browser/infobars/infobar_utils.h" |
+#include "ios/chrome/browser/signin/authentication_service.h" |
+#include "ios/chrome/browser/signin/authentication_service_factory.h" |
+#include "ios/chrome/browser/signin/authentication_service_fake.h" |
+#include "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" |
+#import "ios/chrome/browser/ui/commands/show_signin_command.h" |
+#include "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h" |
+#include "ios/web/public/test/test_web_thread_bundle.h" |
+#include "testing/gtest_mac.h" |
+#include "testing/platform_test.h" |
+ |
+// View that intercepts and stores chrome commands sent up the responder chain. |
+@interface CatchExecuteCommandView : UIView { |
+ base::mac::ObjCPropertyReleaser propertyReleaser_CatchExecuteCommandView_; |
+} |
+// Command sent up the responder chain and intercepted by this view. |
+@property(nonatomic, retain) id command; |
+@end |
+ |
+@implementation CatchExecuteCommandView |
+ |
+@synthesize command = _command; |
+ |
+- (instancetype)initWithFrame:(CGRect)frame { |
+ self = [super initWithFrame:frame]; |
+ if (self) { |
+ propertyReleaser_CatchExecuteCommandView_.Init( |
+ self, [CatchExecuteCommandView class]); |
+ } |
+ return self; |
+} |
+ |
+- (void)chromeExecuteCommand:(id)command { |
+ DCHECK(command); |
+ DCHECK(!self.command); |
+ self.command = command; |
+} |
+ |
+@end |
+ |
+namespace { |
+ |
+class ReSignInInfoBarDelegateTest : public PlatformTest { |
+ public: |
+ ReSignInInfoBarDelegateTest() {} |
+ |
+ protected: |
+ void SetUp() override { |
+ mainBrowserStateBuilder_.AddTestingFactory( |
+ AuthenticationServiceFactory::GetInstance(), |
+ AuthenticationServiceFake::CreateAuthenticationService); |
+ } |
+ |
+ void SetUpMainChromeBrowserStateNotSignedIn() { |
+ chrome_browser_state_ = mainBrowserStateBuilder_.Build(); |
+ } |
+ |
+ void SetUpMainChromeBrowserStateWithSignedInUser() { |
+ ChromeIdentity* chrome_identity = |
+ [FakeChromeIdentity identityWithEmail:@"john.appleseed@gmail.com" |
+ gaiaID:@"1234" |
+ name:@"John"]; |
+ |
+ chrome_browser_state_ = mainBrowserStateBuilder_.Build(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SignIn(chrome_identity, std::string()); |
+ } |
+ |
+ void SetUpMainChromeBrowserStateWithIncognito() { |
+ SetUpMainChromeBrowserStateNotSignedIn(); |
+ // Sets up an incognito ChromeBrowserState and attaches it to the main one. |
+ TestChromeBrowserState::Builder test_cbs_builder; |
+ chrome_browser_state_ = test_cbs_builder.Build(); |
+ } |
+ |
+ web::TestWebThreadBundle thread_bundle_; |
+ |
+ TestChromeBrowserState::Builder mainBrowserStateBuilder_; |
+ std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; |
+}; |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestCreateWhenNotPrompting) { |
+ // User is not signed in, but the "prompt" flag is not set. |
+ SetUpMainChromeBrowserStateNotSignedIn(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SetPromptForSignIn(false); |
+ std::unique_ptr<ReSignInInfoBarDelegate> infobar_delegate = |
+ ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
+ chrome_browser_state_.get()); |
+ // Infobar delegate should not be created. |
+ EXPECT_FALSE(infobar_delegate.get()); |
+ EXPECT_FALSE(authService->ShouldPromptForSignIn()); |
+} |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestCreateWhenNotSignedIn) { |
+ // User is not signed in, but the "prompt" flag is set. |
+ SetUpMainChromeBrowserStateNotSignedIn(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SetPromptForSignIn(true); |
+ std::unique_ptr<ReSignInInfoBarDelegate> infobar_delegate = |
+ ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
+ chrome_browser_state_.get()); |
+ // Infobar delegate should be created. |
+ EXPECT_TRUE(infobar_delegate.get()); |
+ EXPECT_TRUE(authService->ShouldPromptForSignIn()); |
+} |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestCreateWhenAlreadySignedIn) { |
+ // User is signed in and the "prompt" flag is set. |
+ SetUpMainChromeBrowserStateWithSignedInUser(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SetPromptForSignIn(true); |
+ std::unique_ptr<ReSignInInfoBarDelegate> infobar_delegate = |
+ ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
+ chrome_browser_state_.get()); |
+ // Infobar delegate should not be created. |
+ EXPECT_FALSE(infobar_delegate.get()); |
+ EXPECT_FALSE(authService->ShouldPromptForSignIn()); |
+} |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestCreateWhenIncognito) { |
+ // Tab is incognito, and the "prompt" flag is set. |
+ SetUpMainChromeBrowserStateWithIncognito(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SetPromptForSignIn(true); |
+ std::unique_ptr<ReSignInInfoBarDelegate> infobar_delegate = |
+ ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
+ chrome_browser_state_->GetOffTheRecordChromeBrowserState()); |
+ // Infobar delegate should not be created. |
+ EXPECT_FALSE(infobar_delegate.get()); |
+ EXPECT_TRUE(authService->ShouldPromptForSignIn()); |
+} |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestMessages) { |
+ SetUpMainChromeBrowserStateNotSignedIn(); |
+ std::unique_ptr<ReSignInInfoBarDelegate> delegate( |
+ new ReSignInInfoBarDelegate(chrome_browser_state_.get())); |
+ EXPECT_EQ(ConfirmInfoBarDelegate::BUTTON_OK, delegate->GetButtons()); |
+ base::string16 message_text = delegate->GetMessageText(); |
+ EXPECT_GT(message_text.length(), 0U); |
+ base::string16 button_label = |
+ delegate->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK); |
+ EXPECT_GT(button_label.length(), 0U); |
+} |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestAccept) { |
+ SetUpMainChromeBrowserStateNotSignedIn(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SetPromptForSignIn(true); |
+ std::unique_ptr<infobars::InfoBar> infobar( |
+ CreateConfirmInfoBar(ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
+ chrome_browser_state_.get()))); |
+ InfoBarIOS* infobarIOS = static_cast<InfoBarIOS*>(infobar.get()); |
+ infobarIOS->Layout(CGRectZero); |
+ base::scoped_nsobject<CatchExecuteCommandView> view( |
+ [[CatchExecuteCommandView alloc] initWithFrame:CGRectZero]); |
+ [view.get() addSubview:infobarIOS->view()]; |
+ |
+ ReSignInInfoBarDelegate* delegate = |
+ static_cast<ReSignInInfoBarDelegate*>(infobarIOS->delegate()); |
+ EXPECT_TRUE(delegate->Accept()); |
+ EXPECT_FALSE(authService->ShouldPromptForSignIn()); |
+ EXPECT_TRUE([view command]); |
+ EXPECT_TRUE([[view command] isKindOfClass:[ShowSigninCommand class]]); |
+ EXPECT_EQ(AUTHENTICATION_OPERATION_REAUTHENTICATE, |
+ static_cast<ShowSigninCommand*>([view command]).operation); |
+} |
+ |
+TEST_F(ReSignInInfoBarDelegateTest, TestInfoBarDismissed) { |
+ SetUpMainChromeBrowserStateNotSignedIn(); |
+ AuthenticationService* authService = |
+ AuthenticationServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ authService->SetPromptForSignIn(true); |
+ std::unique_ptr<infobars::InfoBar> infobar( |
+ CreateConfirmInfoBar(ReSignInInfoBarDelegate::CreateInfoBarDelegate( |
+ chrome_browser_state_.get()))); |
+ InfoBarIOS* infobarIOS = static_cast<InfoBarIOS*>(infobar.get()); |
+ infobarIOS->Layout(CGRectZero); |
+ base::scoped_nsobject<CatchExecuteCommandView> view( |
+ [[CatchExecuteCommandView alloc] initWithFrame:CGRectZero]); |
+ [view.get() addSubview:infobarIOS->view()]; |
+ |
+ ReSignInInfoBarDelegate* delegate = |
+ static_cast<ReSignInInfoBarDelegate*>(infobarIOS->delegate()); |
+ delegate->InfoBarDismissed(); |
+ EXPECT_FALSE(authService->ShouldPromptForSignIn()); |
+ EXPECT_FALSE([view command]); |
+} |
+ |
+} // namespace |