// 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_;

  FXL_DISALLOW_COPY_AND_ASSIGN(TestLoopFixture);
};

}  // namespace gtest

#endif  // SRC_LIB_TESTING_LOOP_FIXTURE_TEST_LOOP_FIXTURE_H_
