// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/protocol/protocol_mock_objects.h"

#include <memory>
#include <utility>

#include "base/check.h"
#include "base/task/single_thread_task_runner.h"
#include "remoting/protocol/session_plugin.h"
#include "remoting/protocol/video_stream.h"
#include "remoting/signaling/signaling_address.h"

namespace remoting::protocol {

MockAuthenticator::MockAuthenticator() = default;
MockAuthenticator::~MockAuthenticator() = default;

MockConnectionToClientEventHandler::MockConnectionToClientEventHandler() =
    default;
MockConnectionToClientEventHandler::~MockConnectionToClientEventHandler() =
    default;

MockClipboardStub::MockClipboardStub() = default;
MockClipboardStub::~MockClipboardStub() = default;

MockInputStub::MockInputStub() = default;
MockInputStub::~MockInputStub() = default;

MockHostStub::MockHostStub() = default;
MockHostStub::~MockHostStub() = default;

MockClientStub::MockClientStub() = default;
MockClientStub::~MockClientStub() = default;

MockCursorShapeStub::MockCursorShapeStub() = default;
MockCursorShapeStub::~MockCursorShapeStub() = default;

MockVideoStub::MockVideoStub() = default;
MockVideoStub::~MockVideoStub() = default;

MockSession::MockSession() = default;
MockSession::~MockSession() = default;

MockSessionManager::MockSessionManager() = default;
MockSessionManager::~MockSessionManager() = default;

MockSessionObserver::MockSessionObserver() = default;
MockSessionObserver::~MockSessionObserver() = default;

MockPairingRegistryDelegate::MockPairingRegistryDelegate() = default;
MockPairingRegistryDelegate::~MockPairingRegistryDelegate() = default;

base::Value::List MockPairingRegistryDelegate::LoadAll() {
  base::Value::List result;
  for (Pairings::const_iterator i = pairings_.begin(); i != pairings_.end();
       ++i) {
    result.Append(i->second.ToValue());
  }
  return result;
}

bool MockPairingRegistryDelegate::DeleteAll() {
  pairings_.clear();
  return true;
}

protocol::PairingRegistry::Pairing MockPairingRegistryDelegate::Load(
    const std::string& client_id) {
  Pairings::const_iterator i = pairings_.find(client_id);
  if (i != pairings_.end()) {
    return i->second;
  } else {
    return protocol::PairingRegistry::Pairing();
  }
}

bool MockPairingRegistryDelegate::Save(
    const protocol::PairingRegistry::Pairing& pairing) {
  pairings_[pairing.client_id()] = pairing;
  return true;
}

bool MockPairingRegistryDelegate::Delete(const std::string& client_id) {
  pairings_.erase(client_id);
  return true;
}

SynchronousPairingRegistry::SynchronousPairingRegistry(
    std::unique_ptr<Delegate> delegate)
    : PairingRegistry(base::SingleThreadTaskRunner::GetCurrentDefault(),
                      std::move(delegate)) {}
SynchronousPairingRegistry::~SynchronousPairingRegistry() = default;

void SynchronousPairingRegistry::PostTask(
    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
    const base::Location& from_here,
    base::OnceClosure task) {
  DCHECK(task_runner->BelongsToCurrentThread());
  std::move(task).Run();
}

}  // namespace remoting::protocol