blob: d597af73a54a623858d71c04b70c237186ab03b7 [file] [log] [blame]
// Copyright 2019 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 EXAMPLES_TESTS_TEST_SUITE_H_
#define EXAMPLES_TESTS_TEST_SUITE_H_
#include <fuchsia/test/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/binding_set.h>
#include <string>
#include <unordered_set>
namespace example {
struct Options {
bool dont_service_get_tests = false;
bool dont_service_run = false;
bool close_channel_get_tests = false;
bool close_channel_run = false;
bool dont_send_on_finish_event = false;
};
struct TestInput {
std::string name;
fuchsia::test::Status status;
// Treat as disabled by developer if true
bool disabled = false;
/// Skips OnTestCaseFinished if true
bool incomplete_test = false;
// will not set status if false.
bool set_result_status = true;
};
class CaseIterator : public fuchsia::test::CaseIterator {
public:
CaseIterator(const std::vector<TestInput>& test_inputs,
fit::function<void(CaseIterator*)> done_callback)
: test_inputs_(test_inputs),
iter_(test_inputs_.begin()),
done_callback_(std::move(done_callback)) {}
void GetNext(GetNextCallback callback) override;
private:
const std::vector<TestInput>& test_inputs_;
std::vector<TestInput>::const_iterator iter_;
fit::function<void(CaseIterator*)> done_callback_;
};
class TestSuite : public fuchsia::test::Suite {
public:
explicit TestSuite(async::Loop* loop, std::vector<TestInput> inputs, Options options = Options{});
void GetTests(::fidl::InterfaceRequest<fuchsia::test::CaseIterator>) override;
void Run(std::vector<fuchsia::test::Invocation> tests, fuchsia::test::RunOptions /*unused*/,
fidl::InterfaceHandle<fuchsia::test::RunListener> run_listener) override;
fidl::InterfaceRequestHandler<fuchsia::test::Suite> GetHandler();
private:
bool ShouldSkipTest(const fuchsia::test::RunOptions& run_options,
const std::string& test_name) const;
fidl::Binding<fuchsia::test::Suite> binding_;
fidl::BindingSet<fuchsia::test::CaseIterator, std::unique_ptr<CaseIterator>>
case_iterator_bindings_;
const std::vector<TestInput> test_inputs_;
std::unordered_set<std::string> disabled_tests_;
Options options_;
async::Loop* loop_;
};
} // namespace example
#endif // EXAMPLES_TESTS_TEST_SUITE_H_