blob: 6eb0a5b01425d41caaa7af3b482b302ef8efe9d7 [file] [log] [blame]
// 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_