blob: bcdf618f9dba948ed9de7cb131e9023125725b3b [file] [log] [blame]
// 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)));
}
syncer::SyncService* service() { return &service_; }
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(service());
EXPECT_EQ(0, CallbackCount());
SetHasOpenTabs(true);
observer()->OnStateChanged(service());
EXPECT_EQ(1, CallbackCount());
observer()->OnStateChanged(service());
EXPECT_EQ(1, CallbackCount());
SetHasOpenTabs(false);
observer()->OnStateChanged(service());
EXPECT_EQ(2, CallbackCount());
observer()->OnStateChanged(service());
EXPECT_EQ(2, CallbackCount());
// OnSyncCycleCompleted should behave like OnStateChanged.
observer()->OnSyncCycleCompleted(service());
EXPECT_EQ(2, CallbackCount());
SetHasOpenTabs(true);
observer()->OnSyncCycleCompleted(service());
EXPECT_EQ(3, CallbackCount());
observer()->OnSyncCycleCompleted(service());
EXPECT_EQ(3, CallbackCount());
}
// No callback should be invoked from OnSyncConfigurationCompleted.
TEST_F(TabDelegateSyncAdapterTest, OnSyncConfigurationCompleted) {
ASSERT_EQ(0, CallbackCount());
observer()->OnSyncConfigurationCompleted(service());
EXPECT_EQ(0, CallbackCount());
SetHasOpenTabs(true);
observer()->OnSyncConfigurationCompleted(service());
EXPECT_EQ(0, CallbackCount());
}
// OnForeignSessionUpdated should always trigger a callback.
TEST_F(TabDelegateSyncAdapterTest, OnForeignSessionUpdated) {
ASSERT_EQ(0, CallbackCount());
observer()->OnForeignSessionUpdated(service());
EXPECT_EQ(1, CallbackCount());
observer()->OnForeignSessionUpdated(service());
EXPECT_EQ(2, CallbackCount());
SetHasOpenTabs(true);
observer()->OnForeignSessionUpdated(service());
EXPECT_EQ(3, CallbackCount());
observer()->OnForeignSessionUpdated(service());
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(service());
EXPECT_EQ(1, CallbackCount());
observer()->OnStateChanged(service());
EXPECT_EQ(1, CallbackCount());
}
} // namespace
} // namespace ntp_snippets