/*
 *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#ifndef API_TEST_TIME_CONTROLLER_H_
#define API_TEST_TIME_CONTROLLER_H_

#include <functional>
#include <memory>
#include <string>

#include "api/task_queue/task_queue_factory.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "modules/utility/include/process_thread.h"
#include "rtc_base/synchronization/yield_policy.h"
#include "rtc_base/thread.h"
#include "system_wrappers/include/clock.h"

namespace webrtc {
// Interface for controlling time progress. This allows us to execute test code
// in either real time or simulated time by using different implementation of
// this interface.
class TimeController {
 public:
  virtual ~TimeController() = default;
  // Provides a clock instance that follows implementation defined time
  // progress.
  virtual Clock* GetClock() = 0;
  // The returned factory will created task queues that runs in implementation
  // defined time domain.
  virtual TaskQueueFactory* GetTaskQueueFactory() = 0;
  // Creates a process thread.
  virtual std::unique_ptr<ProcessThread> CreateProcessThread(
      const char* thread_name) = 0;
  // Creates an rtc::Thread instance. If |socket_server| is nullptr, a default
  // noop socket server is created.
  virtual std::unique_ptr<rtc::Thread> CreateThread(
      const std::string& name,
      std::unique_ptr<rtc::SocketServer> socket_server = nullptr) = 0;

  // Creates an rtc::Thread instance that ensure that it's set as the current
  // thread.
  virtual rtc::Thread* GetMainThread() = 0;
  // Allow task queues and process threads created by this instance to execute
  // for the given |duration|.
  virtual void AdvanceTime(TimeDelta duration) = 0;

  // Waits until done() == true, polling done() in small time intervals.
  bool Wait(const std::function<bool()>& done,
            TimeDelta max_duration = TimeDelta::seconds(5));
};

// Interface for telling time, scheduling an event to fire at a particular time,
// and waiting for time to pass.
class ControlledAlarmClock {
 public:
  virtual ~ControlledAlarmClock() = default;

  // Gets a clock that tells the alarm clock's notion of time.
  virtual Clock* GetClock() = 0;

  // Schedules the alarm to fire at |deadline|.
  // An alarm clock only supports one deadline. Calls to |ScheduleAlarmAt| with
  // an earlier deadline will reset the alarm to fire earlier.Calls to
  // |ScheduleAlarmAt| with a later deadline are ignored. Returns true if the
  // deadline changed, false otherwise.
  virtual bool ScheduleAlarmAt(Timestamp deadline) = 0;

  // Sets the callback that should be run when the alarm fires.
  virtual void SetCallback(std::function<void()> callback) = 0;

  // Waits for |duration| to pass, according to the alarm clock.
  virtual void Sleep(TimeDelta duration) = 0;
};

}  // namespace webrtc
#endif  // API_TEST_TIME_CONTROLLER_H_
