1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 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) {
ASSERT_EQ(0, CallbackCount());
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) {
ASSERT_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) {
ASSERT_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
|