// Copyright 2017 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 PERIDOT_LIB_TESTING_TEST_WITH_LEDGER_H_
#define PERIDOT_LIB_TESTING_TEST_WITH_LEDGER_H_

#include <memory>

#include <lib/fit/function.h>
#include <lib/gtest/real_loop_fixture.h>

#include "peridot/lib/testing/ledger_repository_for_testing.h"

namespace modular {
class LedgerClient;

namespace testing {

// A test fixture class for a test case that needs a ledger repository, ledger,
// ledger client, or ledger page. This fixture sets up a ledger repository and a
// ledger client in SetUp() and erases the repository and stops the ledger in
// TearDown(). This also runs a message loop, which is required to interact with
// the ledger through fidl calls.
//
// The ledger client is available to the test case and its fixture through the
// ledger_client() getter, the ledger repository through ledger_repository().
//
// A fixture class that extends this fixture and has its own SetUp() and
// TearDown() must call this fixture's SetUp() and TearDown().
class TestWithLedger : public gtest::RealLoopFixture {
 public:
  TestWithLedger();
  ~TestWithLedger() override;

  void SetUp() override;
  void TearDown() override;

 protected:
  fuchsia::ledger::internal::LedgerRepository* ledger_repository() {
    return ledger_app_->ledger_repository();
  }
  LedgerClient* ledger_client() { return ledger_client_.get(); }

  // Increases default timeout over plain test with message loop, because
  // methods executing on the message loop are real fidl calls.
  //
  // Test cases involving ledger calls take about 300ms when running in CI.
  // Occasionally, however, they take much longer, presumably because of load on
  // shared machines. With the default timeout of RealLoopFixture of 1s, we
  // see flakiness. Cf. FW-287.
  bool RunLoopWithTimeout(zx::duration timeout = zx::sec(10));
  bool RunLoopWithTimeoutOrUntil(fit::function<bool()> condition,
                                 zx::duration timeout = zx::sec(10));

 private:
  std::unique_ptr<testing::LedgerRepositoryForTesting> ledger_app_;
  std::unique_ptr<LedgerClient> ledger_client_;
};

}  // namespace testing
}  // namespace modular

#endif  // PERIDOT_LIB_TESTING_TEST_WITH_LEDGER_H_
