// Copyright 2018 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 "chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.h"

#include <utility>

#include "base/bind_helpers.h"
#include "base/task/post_task.h"
#include "chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.h"
#include "chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h"
#include "chrome/browser/resource_coordinator/tab_helper.h"
#include "chrome/browser/tab_contents/form_interaction_tab_helper.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/system_connector.h"
#include "content/public/browser/web_contents.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"

namespace resource_coordinator {
namespace testing {

internal::LocalSiteCharacteristicsDataImpl*
GetLocalSiteCharacteristicsDataImplForWC(content::WebContents* web_contents) {
  ResourceCoordinatorTabHelper* tab_helper =
      ResourceCoordinatorTabHelper::FromWebContents(web_contents);
  DCHECK(tab_helper);
  auto* wc_observer = tab_helper->local_site_characteristics_wc_observer();
  DCHECK(wc_observer);

  auto* writer = static_cast<LocalSiteCharacteristicsDataWriter*>(
      wc_observer->GetWriterForTesting());

  if (!writer)
    return nullptr;

  return writer->impl_for_testing();
}

void WaitForLocalDBEntryToBeInitialized(
    content::WebContents* web_contents,
    base::RepeatingClosure run_pending_tasks) {
  internal::LocalSiteCharacteristicsDataImpl* impl =
      GetLocalSiteCharacteristicsDataImplForWC(web_contents);
  DCHECK(impl);
  while (!impl->fully_initialized_for_testing())
    run_pending_tasks.Run();
}

void ExpireLocalDBObservationWindows(content::WebContents* web_contents) {
  internal::LocalSiteCharacteristicsDataImpl* impl =
      GetLocalSiteCharacteristicsDataImplForWC(web_contents);
  DCHECK(impl);
  impl->ExpireAllObservationWindowsForTesting();
}

void MarkWebContentsAsLoadedInBackground(content::WebContents* web_contents) {
  internal::LocalSiteCharacteristicsDataImpl* impl =
      GetLocalSiteCharacteristicsDataImplForWC(web_contents);
  DCHECK(impl);
  impl->NotifySiteLoaded();
  impl->NotifyLoadedSiteBackgrounded();
}

MockLocalSiteCharacteristicsDataImplOnDestroyDelegate::
    MockLocalSiteCharacteristicsDataImplOnDestroyDelegate() = default;
MockLocalSiteCharacteristicsDataImplOnDestroyDelegate::
    ~MockLocalSiteCharacteristicsDataImplOnDestroyDelegate() = default;

NoopLocalSiteCharacteristicsDatabase::NoopLocalSiteCharacteristicsDatabase() =
    default;
NoopLocalSiteCharacteristicsDatabase::~NoopLocalSiteCharacteristicsDatabase() =
    default;

void NoopLocalSiteCharacteristicsDatabase::ReadSiteCharacteristicsFromDB(
    const url::Origin& origin,
    ReadSiteCharacteristicsFromDBCallback callback) {
  std::move(callback).Run(base::nullopt);
}

void NoopLocalSiteCharacteristicsDatabase::WriteSiteCharacteristicsIntoDB(
    const url::Origin& origin,
    const SiteDataProto& site_characteristic_proto) {}

void NoopLocalSiteCharacteristicsDatabase::RemoveSiteCharacteristicsFromDB(
    const std::vector<url::Origin>& site_origins) {}

void NoopLocalSiteCharacteristicsDatabase::ClearDatabase() {}

void NoopLocalSiteCharacteristicsDatabase::GetDatabaseSize(
    GetDatabaseSizeCallback callback) {
  std::move(callback).Run(base::nullopt, base::nullopt);
}

ChromeTestHarnessWithLocalDB::~ChromeTestHarnessWithLocalDB() = default;

void ChromeTestHarnessWithLocalDB::SetUp() {
  // Enable the LocalSiteCharacteristicsDataStoreFactory before calling
  // ChromeRenderViewHostTestHarness::SetUp(), this will prevent the creation
  // of a non-mock version of a data store when browser_context() gets
  // initialized.
  performance_manager_ =
      performance_manager::PerformanceManagerImpl::Create(base::DoNothing());
  registry_ = performance_manager::PerformanceManagerRegistry::Create();

  performance_manager::PerformanceManagerImpl::CallOnGraph(
      FROM_HERE, base::BindOnce([](performance_manager::Graph* graph) {
        graph->PassToGraph(FormInteractionTabHelper::CreateGraphObserver());
      }));

  LocalSiteCharacteristicsDataStoreFactory::EnableForTesting();

  // TODO(siggi): Can this die now?
  mojo::PendingReceiver<service_manager::mojom::Connector> connector_receiver;
  content::SetSystemConnectorForTesting(
      service_manager::Connector::Create(&connector_receiver));
  ChromeRenderViewHostTestHarness::SetUp();
}

void ChromeTestHarnessWithLocalDB::TearDown() {
  registry_->TearDown();
  registry_.reset();
  performance_manager::PerformanceManagerImpl::Destroy(
      std::move(performance_manager_));
  content::SetSystemConnectorForTesting(nullptr);
  ChromeRenderViewHostTestHarness::TearDown();
}

}  // namespace testing
}  // namespace resource_coordinator
