// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_LIB_TESTING_LOOP_FIXTURE_TEST_LOOP_FIXTURE_H_
#define SRC_LIB_TESTING_LOOP_FIXTURE_TEST_LOOP_FIXTURE_H_

#include <lib/async-testing/test_loop.h>
#include <lib/fit/function.h>

#include <functional>

#include "gtest/gtest.h"
// #include "src/lib/fxl/macros.h"

namespace gtest {

// An extension of gtest's testing::Test class which sets up a message loop for
// the test.
//
// Example:
//
//   class FooTest : public ::gtest::TestLoopFixture { /* ... */ };
//
//   TEST_F(FooTest, TestCase) {
//
//     // Initialize an object with the underlying loop's dispatcher.
//     Foo foo(dispatcher());
//
//     /* Call a method of |foo| that posts a delayed task. */
//
//     RunLoopFor(zx::sec(17));
//
//     /* Make assertions about the state of the test case, say about |foo|. */
//   }
class TestLoopFixture : public ::testing::Test {
 protected:
  TestLoopFixture();
  ~TestLoopFixture();

  async_dispatcher_t* dispatcher() { return loop_.dispatcher(); }

  // Returns the current fake clock time.
  zx::time Now() { return loop_.Now(); }

  // Dispatches all waits and all tasks posted to the message loop with
  // deadlines up until |deadline|, progressively advancing the fake clock.
  // Returns true iff any tasks or waits were invoked during the run.
  bool RunLoopUntil(zx::time deadline) { return loop_.RunUntil(deadline); }

  // Dispatches all waits and all tasks posted to the message loop with
  // deadlines up until |duration| from the current time, progressively
  // advancing the fake clock.
  // Returns true iff any tasks or waits were invoked during the run.
  bool RunLoopFor(zx::duration duration) { return loop_.RunFor(duration); };

  // Dispatches all waits and all tasks posted to the message loop with
  // deadlines up until the current time, progressively advancing the fake
  // clock.
  // Returns true iff any tasks or waits were invoked during the run.
  bool RunLoopUntilIdle() { return loop_.RunUntilIdle(); }

  // Repeatedly runs the loop by |increment| until nothing further is left to
  // dispatch.
  void RunLoopRepeatedlyFor(zx::duration increment);

  // Quits the message loop. If called while running, it will immediately
  // exit and dispatch no further tasks or waits; if called before running,
  // then next call to run will immediately exit. Further calls to run will
  // continue to dispatch.
  void QuitLoop() { loop_.Quit(); }

  // A callback that quits the message loop when called.
  fit::closure QuitLoopClosure() {
    return [this] { loop_.Quit(); };
  }

  // Accessor for the underlying TestLoop.
  async::TestLoop& test_loop() { return loop_; }

 private:
  // The test message loop for the test fixture.
  async::TestLoop loop_;

  TestLoopFixture(const TestLoopFixture&) = delete;
  TestLoopFixture& operator=(const TestLoopFixture&) = delete;
};

}  // namespace gtest

#endif  // SRC_LIB_TESTING_LOOP_FIXTURE_TEST_LOOP_FIXTURE_H_
