blob: 53dee1fdf6ecd787a2a8b0775e2352e2e354ac84 [file] [log] [blame]
// Copyright 2021 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_SYS_TEST_RUNNERS_LEGACY_TEST_SUITE_H_
#define SRC_SYS_TEST_RUNNERS_LEGACY_TEST_SUITE_H_
#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/test/cpp/fidl.h>
#include <lib/async/cpp/executor.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/fpromise/promise.h>
#include <lib/sys/cpp/service_directory.h>
#include <map>
#include <memory>
#include <vector>
#include <src/sys/run_test_component/component.h>
#include <src/sys/run_test_component/test_metadata.h>
/// Implement and expose Suite protocol on behalf of wrapped legacy test component.
class Suite final : public fuchsia::test::Suite {
using ComponentMap = std::map<run::Component*, std::unique_ptr<run::Component>>;
public:
Suite(std::shared_ptr<sys::ServiceDirectory> parent_env_svc,
fuchsia::sys::EnvironmentPtr parent_env, std::shared_ptr<run::TestMetadata> test_metadata,
std::shared_ptr<sys::ServiceDirectory> test_component_svc, std::string legacy_url,
async_dispatcher_t* dispatcher);
~Suite() override;
void GetTests(fidl::InterfaceRequest<fuchsia::test::CaseIterator> iterator) override;
void Run(std::vector<fuchsia::test::Invocation> tests, fuchsia::test::RunOptions options,
fidl::InterfaceHandle<fuchsia::test::RunListener> listener) override;
fidl::InterfaceRequestHandler<fuchsia::test::Suite> GetHandler() {
return bindings_.GetHandler(this, dispatcher_);
}
void AddBinding(zx::channel request) {
bindings_.AddBinding(this, fidl::InterfaceRequest<fuchsia::test::Suite>(std::move(request)),
dispatcher_);
}
private:
fpromise::promise<> RunTest(zx::socket out, zx::socket err,
const std::vector<std::string>& arguments,
fidl::InterfacePtr<fuchsia::test::CaseListener> case_listener);
class CaseIterator final : public fuchsia::test::CaseIterator {
public:
CaseIterator(fidl::InterfaceRequest<fuchsia::test::CaseIterator> request,
async_dispatcher_t* dispatcher, fit::function<void(CaseIterator*)> done_callback);
void GetNext(GetNextCallback callback) override;
private:
int get_next_call_count = 0;
fidl::Binding<fuchsia::test::CaseIterator> binding_;
fit::function<void(CaseIterator*)> done_callback_;
};
const fuchsia::sys::EnvironmentPtr parent_env_;
const std::shared_ptr<sys::ServiceDirectory> parent_env_svc_;
const std::shared_ptr<sys::ServiceDirectory> test_component_svc_;
const std::shared_ptr<run::TestMetadata> test_metadata_;
const std::string legacy_url_;
std::shared_ptr<ComponentMap> test_components_;
std::map<CaseIterator*, std::unique_ptr<CaseIterator>> case_iterators_;
async_dispatcher_t* dispatcher_;
fidl::BindingSet<fuchsia::test::Suite> bindings_;
async::Executor executor_;
std::unique_ptr<CaseIterator> RemoveCaseInterator(CaseIterator*);
std::unique_ptr<run::Component> RemoveComponent(run::Component* ptr);
};
#endif // SRC_SYS_TEST_RUNNERS_LEGACY_TEST_SUITE_H_