// 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
