blob: 771b2acc33ca472e270e5426070c176dd39e058d [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_H_
#define SRC_LIB_TESTING_LOOP_FIXTURE_TEST_LOOP_H_
#include <lib/async-testing/test_loop.h>
#include <lib/fit/function.h>
#include <functional>
#include "src/lib/fxl/macros.h"
namespace loop_fixture {
class TestLoop {
protected:
TestLoop();
~TestLoop();
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) { return loop_.RunRepeatedlyFor(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(TestLoop);
};
} // namespace loop_fixture
#endif // SRC_LIB_TESTING_LOOP_FIXTURE_TEST_LOOP_H_