blob: 1ec062d4d2fd2449799a75f16fdafab0f047e524 [file] [log] [blame]
// 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 SRC_LEDGER_BIN_TESTS_CLOUD_PROVIDER_LAUNCHER_VALIDATION_TESTS_LAUNCHER_H_
#define SRC_LEDGER_BIN_TESTS_CLOUD_PROVIDER_LAUNCHER_VALIDATION_TESTS_LAUNCHER_H_
#include <fuchsia/ledger/cloud/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/callback/auto_cleanable.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/testing/service_directory_provider.h>
#include <functional>
#include <string>
namespace cloud_provider {
// Helper for building launcher apps for the validation tests.
class ValidationTestsLauncher {
public:
// The constructor.
//
// |factory| is called to produce instances of the cloud provider under test.
// It may return a component controller: when the cloud provider instance is
// not used anymore (ie. the other end of the interface request is closed),
// the component controller is closed, which terminates the cloud provider.
ValidationTestsLauncher(
sys::ComponentContext* component_context,
fit::function<fuchsia::sys::ComponentControllerPtr(
fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider>)>
factory);
// Starts the tests.
//
// |arguments| are passed to the test binary.
// |callback| is called after the tests are finished and passed the exit code
// of the test binary.
void Run(const std::vector<std::string>& arguments,
fit::function<void(int32_t)> callback);
private:
// Proxies requests from |request| to |proxied|, and terminates the component
// controlled by |controller| when one of the ends closes the channel.
class CloudProviderProxy {
public:
CloudProviderProxy(
fidl::InterfacePtr<fuchsia::ledger::cloud::CloudProvider> proxied,
fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider> request,
fuchsia::sys::ComponentControllerPtr controller);
~CloudProviderProxy();
void set_on_empty(fit::closure on_empty);
private:
fidl::Binding<fuchsia::ledger::cloud::CloudProvider> binding_;
fidl::InterfacePtr<fuchsia::ledger::cloud::CloudProvider> proxied_;
fuchsia::sys::ComponentControllerPtr controller_;
fit::closure on_empty_;
};
sys::ComponentContext* const component_context_;
fit::function<fuchsia::sys::ComponentControllerPtr(
fidl::InterfaceRequest<fuchsia::ledger::cloud::CloudProvider>)>
factory_;
sys::testing::ServiceDirectoryProvider service_directory_provider_;
fuchsia::sys::ComponentControllerPtr validation_tests_controller_;
fit::function<void(int32_t)> callback_;
callback::AutoCleanableSet<CloudProviderProxy> proxies_;
};
} // namespace cloud_provider
#endif // SRC_LEDGER_BIN_TESTS_CLOUD_PROVIDER_LAUNCHER_VALIDATION_TESTS_LAUNCHER_H_