Chromium Code Reviews| Index: components/ntp_snippets/sessions/tab_delegate_sync_adapter_unittest.cc |
| diff --git a/components/ntp_snippets/sessions/tab_delegate_sync_adapter_unittest.cc b/components/ntp_snippets/sessions/tab_delegate_sync_adapter_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8ec5fe0f2016bd16684ed19933da575733b791e8 |
| --- /dev/null |
| +++ b/components/ntp_snippets/sessions/tab_delegate_sync_adapter_unittest.cc |
| @@ -0,0 +1,152 @@ |
| +// 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. |
| + |
| +#include "components/ntp_snippets/sessions/tab_delegate_sync_adapter.h" |
| + |
| +#include <string> |
| + |
| +#include "base/macros.h" |
| +#include "components/sync/driver/fake_sync_service.h" |
| +#include "components/sync_sessions/open_tabs_ui_delegate.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using base::RefCountedMemory; |
| +using sessions::SessionTab; |
| +using sessions::SessionWindow; |
| +using syncer::SyncServiceObserver; |
| +using sync_sessions::SyncedSession; |
| +using sync_sessions::OpenTabsUIDelegate; |
| +using testing::Test; |
| + |
| +namespace ntp_snippets { |
| +namespace { |
| + |
| +class TestSyncService : public syncer::FakeSyncService { |
| + public: |
| + TestSyncService() {} |
| + OpenTabsUIDelegate* GetOpenTabsUIDelegate() override { return tabs_; } |
| + OpenTabsUIDelegate* tabs_ = nullptr; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(TestSyncService); |
| +}; |
| + |
| +class MockOpenTabsUIDelegate : public OpenTabsUIDelegate { |
| + public: |
| + MockOpenTabsUIDelegate() {} |
| + MOCK_CONST_METHOD2(GetSyncedFaviconForPageURL, |
| + bool(const std::string&, |
| + scoped_refptr<RefCountedMemory>*)); |
| + MOCK_METHOD1(GetAllForeignSessions, bool(std::vector<const SyncedSession*>*)); |
| + MOCK_METHOD3(GetForeignTab, |
| + bool(const std::string&, |
| + SessionID::id_type, |
| + const SessionTab**)); |
| + MOCK_METHOD1(DeleteForeignSession, void(const std::string&)); |
| + MOCK_METHOD2(GetForeignSession, |
| + bool(const std::string&, std::vector<const SessionWindow*>*)); |
| + MOCK_METHOD2(GetForeignSessionTabs, |
| + bool(const std::string&, std::vector<const SessionTab*>*)); |
| + MOCK_METHOD1(GetLocalSession, bool(const SyncedSession**)); |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(MockOpenTabsUIDelegate); |
| +}; |
| + |
| +class TabDelegateSyncAdapterTest : public Test { |
| + public: |
| + TabDelegateSyncAdapterTest() : adapter_(&service_) { |
| + adapter_.SubscribeForForeignTabChange(base::Bind( |
| + &TabDelegateSyncAdapterTest::OnChange, base::Unretained(this))); |
| + } |
| + |
| + SyncServiceObserver* observer() { return &adapter_; } |
| + |
| + void SetHasOpenTabs(bool is_enabled) { |
| + service_.tabs_ = is_enabled ? &tabs_ : nullptr; |
| + } |
| + |
| + void OnChange() { ++callback_count_; } |
| + |
| + int CallbackCount() { return callback_count_; } |
| + |
| + private: |
| + MockOpenTabsUIDelegate tabs_; |
| + TestSyncService service_; |
| + TabDelegateSyncAdapter adapter_; |
| + int callback_count_ = 0; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(TabDelegateSyncAdapterTest); |
| +}; |
| + |
| +// CallbackCount should only trigger on transitions between having and not |
| +// having open tabs. |
| +TEST_F(TabDelegateSyncAdapterTest, CallbackCount) { |
| + EXPECT_EQ(0, CallbackCount()); |
|
Marc Treib
2016/12/19 11:47:53
nit: ASSERT_EQ since this is a precondition rather
skym
2016/12/19 20:31:43
Done.
|
| + observer()->OnStateChanged(); |
| + EXPECT_EQ(0, CallbackCount()); |
| + |
| + SetHasOpenTabs(true); |
| + observer()->OnStateChanged(); |
| + EXPECT_EQ(1, CallbackCount()); |
| + observer()->OnStateChanged(); |
| + EXPECT_EQ(1, CallbackCount()); |
| + |
| + SetHasOpenTabs(false); |
| + observer()->OnStateChanged(); |
| + EXPECT_EQ(2, CallbackCount()); |
| + observer()->OnStateChanged(); |
| + EXPECT_EQ(2, CallbackCount()); |
| + |
| + // OnSyncCycleCompleted should behave like OnStateChanged. |
| + observer()->OnSyncCycleCompleted(); |
| + EXPECT_EQ(2, CallbackCount()); |
| + SetHasOpenTabs(true); |
| + observer()->OnSyncCycleCompleted(); |
| + EXPECT_EQ(3, CallbackCount()); |
| + observer()->OnSyncCycleCompleted(); |
| + EXPECT_EQ(3, CallbackCount()); |
| +} |
| + |
| +// No callback should be invoked from OnSyncConfigurationCompleted. |
| +TEST_F(TabDelegateSyncAdapterTest, OnSyncConfigurationCompleted) { |
| + EXPECT_EQ(0, CallbackCount()); |
| + |
| + observer()->OnSyncConfigurationCompleted(); |
| + EXPECT_EQ(0, CallbackCount()); |
| + |
| + SetHasOpenTabs(true); |
| + observer()->OnSyncConfigurationCompleted(); |
| + EXPECT_EQ(0, CallbackCount()); |
| +} |
| + |
| +// OnForeignSessionUpdated should always trigger a callback. |
| +TEST_F(TabDelegateSyncAdapterTest, OnForeignSessionUpdated) { |
| + EXPECT_EQ(0, CallbackCount()); |
| + observer()->OnForeignSessionUpdated(); |
| + EXPECT_EQ(1, CallbackCount()); |
| + observer()->OnForeignSessionUpdated(); |
| + EXPECT_EQ(2, CallbackCount()); |
| + |
| + SetHasOpenTabs(true); |
| + observer()->OnForeignSessionUpdated(); |
| + EXPECT_EQ(3, CallbackCount()); |
| + observer()->OnForeignSessionUpdated(); |
| + EXPECT_EQ(4, CallbackCount()); |
| +} |
| + |
| +// If OnForeignSessionUpdated is called before OnStateChanged, then calling |
| +// OnStateChanged should not trigger a callback. |
| +TEST_F(TabDelegateSyncAdapterTest, OnForeignSessionUpdatedUpdatesState) { |
| + SetHasOpenTabs(true); |
| + observer()->OnForeignSessionUpdated(); |
| + EXPECT_EQ(1, CallbackCount()); |
| + |
| + observer()->OnStateChanged(); |
| + EXPECT_EQ(1, CallbackCount()); |
| +} |
| + |
| +} // namespace |
| +} // namespace ntp_snippets |