Index: ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller_unittest.mm |
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller_unittest.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..533751502594ac3009d7d888bd2b4a0379db243d |
--- /dev/null |
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller_unittest.mm |
@@ -0,0 +1,238 @@ |
+// Copyright 2014 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/ui/ntp/recent_tabs/recent_tabs_panel_controller.h" |
+ |
+#import <UIKit/UIKit.h> |
+ |
+#include <memory> |
+ |
+#import "base/mac/scoped_nsautorelease_pool.h" |
+#import "base/mac/scoped_nsobject.h" |
+#include "base/memory/ptr_util.h" |
+#include "components/browser_sync/profile_sync_service.h" |
+#include "components/browser_sync/profile_sync_service_mock.h" |
+#include "components/signin/core/browser/signin_manager.h" |
+#include "components/sync_sessions/open_tabs_ui_delegate.h" |
+#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" |
+#include "ios/chrome/browser/signin/signin_manager_factory.h" |
+#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h" |
+#include "ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h" |
+#include "ios/chrome/browser/sync/sync_setup_service.h" |
+#include "ios/chrome/browser/sync/sync_setup_service_factory.h" |
+#include "ios/chrome/browser/sync/sync_setup_service_mock.h" |
+#import "ios/chrome/browser/ui/ntp/centering_scrollview.h" |
+#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_panel_controller.h" |
+#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_view_controller.h" |
+#include "ios/chrome/test/block_cleanup_test.h" |
+#include "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" |
+#include "ios/web/public/test/test_web_thread_bundle.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#import "third_party/ocmock/OCMock/OCMock.h" |
+#import "third_party/ocmock/gtest_support.h" |
+ |
+using testing::_; |
+using testing::AtLeast; |
+using testing::Return; |
+ |
+namespace { |
+ |
+std::unique_ptr<KeyedService> CreateSyncSetupService( |
+ web::BrowserState* context) { |
+ ios::ChromeBrowserState* chrome_browser_state = |
+ ios::ChromeBrowserState::FromBrowserState(context); |
+ syncer::SyncService* sync_service = |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState( |
+ chrome_browser_state); |
+ return base::MakeUnique<SyncSetupServiceMock>( |
+ sync_service, chrome_browser_state->GetPrefs()); |
+} |
+ |
+class ProfileSyncServiceMockForRecentTabsPanelController |
+ : public browser_sync::ProfileSyncServiceMock { |
+ public: |
+ explicit ProfileSyncServiceMockForRecentTabsPanelController( |
+ InitParams init_params) |
+ : browser_sync::ProfileSyncServiceMock(std::move(init_params)) {} |
+ ~ProfileSyncServiceMockForRecentTabsPanelController() override {} |
+ |
+ MOCK_METHOD0(GetOpenTabsUIDelegate, sync_sessions::OpenTabsUIDelegate*()); |
+}; |
+ |
+std::unique_ptr<KeyedService> |
+BuildMockProfileSyncServiceForRecentTabsPanelController( |
+ web::BrowserState* context) { |
+ return base::MakeUnique<ProfileSyncServiceMockForRecentTabsPanelController>( |
+ CreateProfileSyncServiceParamsForTest( |
+ nullptr, ios::ChromeBrowserState::FromBrowserState(context))); |
+} |
+ |
+class OpenTabsUIDelegateMock : public sync_sessions::OpenTabsUIDelegate { |
+ public: |
+ OpenTabsUIDelegateMock() {} |
+ ~OpenTabsUIDelegateMock() override {} |
+ |
+ MOCK_CONST_METHOD2(GetSyncedFaviconForPageURL, |
+ bool(const std::string& pageurl, |
+ scoped_refptr<base::RefCountedMemory>* favicon_png)); |
+ MOCK_METHOD1( |
+ GetAllForeignSessions, |
+ bool(std::vector<const sync_sessions::SyncedSession*>* sessions)); |
+ MOCK_METHOD3(GetForeignTab, |
+ bool(const std::string& tag, |
+ const SessionID::id_type tab_id, |
+ const sessions::SessionTab** tab)); |
+ MOCK_METHOD1(DeleteForeignSession, void(const std::string& tag)); |
+ MOCK_METHOD2(GetForeignSession, |
+ bool(const std::string& tag, |
+ std::vector<const sessions::SessionWindow*>* windows)); |
+ MOCK_METHOD2(GetForeignSessionTabs, |
+ bool(const std::string& tag, |
+ std::vector<const sessions::SessionTab*>* tabs)); |
+ MOCK_METHOD1(GetLocalSession, |
+ bool(const sync_sessions::SyncedSession** local)); |
+}; |
+ |
+class RecentTabsPanelControllerTest : public BlockCleanupTest { |
+ public: |
+ RecentTabsPanelControllerTest() : no_error_(GoogleServiceAuthError::NONE) {} |
+ |
+ protected: |
+ void SetUp() override { |
+ BlockCleanupTest::SetUp(); |
+ |
+ TestChromeBrowserState::Builder test_cbs_builder; |
+ test_cbs_builder.AddTestingFactory(SyncSetupServiceFactory::GetInstance(), |
+ &CreateSyncSetupService); |
+ test_cbs_builder.AddTestingFactory( |
+ IOSChromeProfileSyncServiceFactory::GetInstance(), |
+ &BuildMockProfileSyncServiceForRecentTabsPanelController); |
+ chrome_browser_state_ = test_cbs_builder.Build(); |
+ |
+ ProfileSyncServiceMockForRecentTabsPanelController* sync_service = |
+ static_cast<ProfileSyncServiceMockForRecentTabsPanelController*>( |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get())); |
+ EXPECT_CALL(*sync_service, GetAuthError()) |
+ .WillRepeatedly(::testing::ReturnRef(no_error_)); |
+ ON_CALL(*sync_service, GetRegisteredDataTypes()) |
+ .WillByDefault(Return(syncer::ModelTypeSet())); |
+ sync_service->Initialize(); |
+ EXPECT_CALL(*sync_service, IsEngineInitialized()) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*sync_service, GetOpenTabsUIDelegate()) |
+ .WillRepeatedly(Return(nullptr)); |
+ |
+ mock_table_view_controller_.reset([[OCMockObject |
+ niceMockForClass:[RecentTabsTableViewController class]] retain]); |
+ } |
+ |
+ void SetupSyncState(BOOL signedIn, |
+ BOOL syncEnabled, |
+ BOOL hasForeignSessions) { |
+ SigninManager* siginManager = ios::SigninManagerFactory::GetForBrowserState( |
+ chrome_browser_state_.get()); |
+ if (signedIn) |
+ siginManager->SetAuthenticatedAccountInfo("test", "test"); |
+ else if (siginManager->IsAuthenticated()) |
+ siginManager->SignOut(signin_metrics::SIGNOUT_TEST, |
+ signin_metrics::SignoutDelete::IGNORE_METRIC); |
+ |
+ SyncSetupServiceMock* syncSetupService = static_cast<SyncSetupServiceMock*>( |
+ SyncSetupServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get())); |
+ EXPECT_CALL(*syncSetupService, IsSyncEnabled()) |
+ .WillRepeatedly(Return(syncEnabled)); |
+ EXPECT_CALL(*syncSetupService, IsDataTypeEnabled(syncer::PROXY_TABS)) |
+ .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*syncSetupService, GetSyncServiceState()) |
+ .WillRepeatedly(Return(SyncSetupService::kNoSyncServiceError)); |
+ |
+ if (syncEnabled) { |
+ ProfileSyncServiceMockForRecentTabsPanelController* sync_service = |
+ static_cast<ProfileSyncServiceMockForRecentTabsPanelController*>( |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get())); |
+ open_tabs_ui_delegate_.reset(new OpenTabsUIDelegateMock()); |
+ EXPECT_CALL(*sync_service, GetOpenTabsUIDelegate()) |
+ .WillRepeatedly(Return(open_tabs_ui_delegate_.get())); |
+ EXPECT_CALL(*open_tabs_ui_delegate_, GetAllForeignSessions(_)) |
+ .WillRepeatedly(Return(hasForeignSessions)); |
+ } |
+ } |
+ |
+ void CreateController() { |
+ // Sets up the test expectations for the Sync Service Observer Bridge. |
+ // RecentTabsPanelController must be added as an observer of |
+ // ProfileSyncService changes and removed when it is destroyed. |
+ browser_sync::ProfileSyncServiceMock* sync_service = |
+ static_cast<browser_sync::ProfileSyncServiceMock*>( |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState( |
+ chrome_browser_state_.get())); |
+ EXPECT_CALL(*sync_service, AddObserver(_)).Times(AtLeast(1)); |
+ EXPECT_CALL(*sync_service, RemoveObserver(_)).Times(AtLeast(1)); |
+ controller_.reset([[RecentTabsPanelController alloc] |
+ initWithController:(RecentTabsTableViewController*) |
+ mock_table_view_controller_.get() |
+ browserState:chrome_browser_state_.get()]); |
+ } |
+ |
+ protected: |
+ web::TestWebThreadBundle thread_bundle_; |
+ GoogleServiceAuthError no_error_; |
+ IOSChromeScopedTestingLocalState local_state_; |
+ |
+ std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; |
+ std::unique_ptr<OpenTabsUIDelegateMock> open_tabs_ui_delegate_; |
+ |
+ // Must be declared *after* |chrome_browser_state_| so it can outlive it. |
+ base::scoped_nsobject<OCMockObject> mock_table_view_controller_; |
+ base::scoped_nsobject<RecentTabsPanelController> controller_; |
+ |
+ // Sets up a private Autorelease Pool so objects retained by OCMockObject |
+ // are released as soon as possible. Otherwise, weak pointers in the |
+ // objects retained by OCMockObject may surface as a BADACC when the |
+ // unit test autorelease pool is released. |
+ base::mac::ScopedNSAutoreleasePool pool_; |
+}; |
+ |
+TEST_F(RecentTabsPanelControllerTest, TestConstructorDestructor) { |
+ CreateController(); |
+ EXPECT_TRUE(controller_.get()); |
+} |
+ |
+TEST_F(RecentTabsPanelControllerTest, TestUserSignedOut) { |
+ [[mock_table_view_controller_ expect] |
+ refreshUserState:SessionsSyncUserState::USER_SIGNED_OUT]; |
+ SetupSyncState(NO, NO, NO); |
+ CreateController(); |
+ EXPECT_OCMOCK_VERIFY(mock_table_view_controller_); |
+} |
+ |
+TEST_F(RecentTabsPanelControllerTest, TestUserSignedInSyncOff) { |
+ [[mock_table_view_controller_ expect] |
+ refreshUserState:SessionsSyncUserState::USER_SIGNED_IN_SYNC_OFF]; |
+ SetupSyncState(YES, NO, NO); |
+ CreateController(); |
+ EXPECT_OCMOCK_VERIFY(mock_table_view_controller_); |
+} |
+ |
+TEST_F(RecentTabsPanelControllerTest, TestUserSignedInSyncInProgress) { |
+ [[mock_table_view_controller_ expect] |
+ refreshUserState:SessionsSyncUserState::USER_SIGNED_IN_SYNC_IN_PROGRESS]; |
+ SetupSyncState(YES, YES, NO); |
+ CreateController(); |
+ EXPECT_OCMOCK_VERIFY(mock_table_view_controller_); |
+} |
+ |
+TEST_F(RecentTabsPanelControllerTest, TestUserSignedInSyncOnWithSessions) { |
+ [[mock_table_view_controller_ expect] |
+ refreshUserState:SessionsSyncUserState:: |
+ USER_SIGNED_IN_SYNC_ON_WITH_SESSIONS]; |
+ SetupSyncState(YES, YES, YES); |
+ CreateController(); |
+ EXPECT_OCMOCK_VERIFY(mock_table_view_controller_); |
+} |
+ |
+} // namespace |