// 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 "mojo/edk/system/mock_simple_dispatcher.h"

#include "base/logging.h"
#include "mojo/edk/util/thread_annotations.h"

using mojo::util::MakeRefCounted;
using mojo::util::MutexLocker;
using mojo::util::RefPtr;

namespace mojo {
namespace system {
namespace test {

void MockSimpleDispatcher::SetSatisfiedSignals(
    MojoHandleSignals new_satisfied_signals) {
  MutexLocker locker(&mutex());

  // Any new signals that are set should be satisfiable.
  CHECK_EQ(new_satisfied_signals & ~state_.satisfied_signals,
           new_satisfied_signals & ~state_.satisfied_signals &
               state_.satisfiable_signals);

  if (new_satisfied_signals == state_.satisfied_signals)
    return;

  state_.satisfied_signals = new_satisfied_signals;
  HandleSignalsStateChangedNoLock();
}

void MockSimpleDispatcher::SetSatisfiableSignals(
    MojoHandleSignals new_satisfiable_signals) {
  MutexLocker locker(&mutex());

  // Satisfied implies satisfiable.
  CHECK_EQ(new_satisfiable_signals & state_.satisfied_signals,
           state_.satisfied_signals);

  if (new_satisfiable_signals == state_.satisfiable_signals)
    return;

  state_.satisfiable_signals = new_satisfiable_signals;
  HandleSignalsStateChangedNoLock();
}

Dispatcher::Type MockSimpleDispatcher::GetType() const {
  return Type::UNKNOWN;
}

bool MockSimpleDispatcher::SupportsEntrypointClass(
    EntrypointClass entrypoint_class) const {
  return (entrypoint_class == EntrypointClass::NONE);
}

MockSimpleDispatcher::MockSimpleDispatcher(
    MojoHandleSignals satisfied_signals,
    MojoHandleSignals satisfiable_signals)
    : state_(satisfied_signals, satisfiable_signals) {}

MockSimpleDispatcher::MockSimpleDispatcher(const HandleSignalsState& state)
    : state_(state) {}

MockSimpleDispatcher::~MockSimpleDispatcher() {}

RefPtr<Dispatcher>
MockSimpleDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock(
    MessagePipe* /*message_pipe*/,
    unsigned /*port*/) MOJO_NO_THREAD_SAFETY_ANALYSIS {
  CancelAllAwakablesNoLock();
  return MakeRefCounted<MockSimpleDispatcher>(state_);
}

HandleSignalsState MockSimpleDispatcher::GetHandleSignalsStateImplNoLock()
    const {
  mutex().AssertHeld();
  return state_;
}

}  // namespace test
}  // namespace system
}  // namespace mojo
