/*
 *  Copyright (c) 2013 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 TEST_RUN_LOOP_H_
#define TEST_RUN_LOOP_H_

#include "api/task_queue/to_queued_task.h"
#include "rtc_base/thread.h"

namespace webrtc {
namespace test {

// This utility class allows you to run a TaskQueue supported interface on the
// main test thread, call Run() while doing things asynchonously and break
// the loop (from the same thread) from a callback by calling Quit().
class RunLoop {
 public:
  RunLoop();
  ~RunLoop();

  TaskQueueBase* task_queue();

  void Run();
  void Quit();

  void Flush();

  // Convenience methods since TaskQueueBase doesn't support this sort of magic.
  template <typename Closure>
  void PostTask(Closure&& task) {
    task_queue()->PostTask(ToQueuedTask(std::forward<Closure>(task)));
  }

  template <typename Closure>
  void PostDelayedTask(Closure&& task, uint32_t milliseconds) {
    task_queue()->PostDelayedTask(ToQueuedTask(std::forward<Closure>(task)),
                                  milliseconds);
  }

 private:
  class FakeSocketServer : public rtc::SocketServer {
   public:
    FakeSocketServer();
    ~FakeSocketServer();

    void FailNextWait();

   private:
    bool Wait(int cms, bool process_io) override;
    void WakeUp() override;

    rtc::Socket* CreateSocket(int family, int type) override;

   private:
    bool fail_next_wait_ = false;
  };

  class WorkerThread : public rtc::Thread {
   public:
    explicit WorkerThread(rtc::SocketServer* ss);

   private:
    CurrentTaskQueueSetter tq_setter_;
  };

  FakeSocketServer socket_server_;
  WorkerThread worker_thread_{&socket_server_};
};

}  // namespace test
}  // namespace webrtc

#endif  // TEST_RUN_LOOP_H_
