blob: 22378ea0e8e41ee8af94a78134a755c8239d4ad8 [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 SRC_DEVELOPER_TRACING_LIB_TEST_UTILS_RUN_PROGRAM_H_
#define SRC_DEVELOPER_TRACING_LIB_TEST_UTILS_RUN_PROGRAM_H_
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fdio/spawn.h>
#include <lib/fit/function.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/syslog/cpp/log_settings.h>
#include <lib/zx/job.h>
#include <lib/zx/process.h>
#include <lib/zx/time.h>
#include <memory>
#include <string>
#include <vector>
namespace tracing {
namespace test {
// Append the current state of fxl::logging to |argv|.
// |prefix| is prepended to each argument.
// For example, if |prefix| is "--foo=" and verbosity is 2, then
// "--foo=--verbose=2" will be appended to |argv|.
void AppendLoggingArgs(std::vector<std::string>* argv, const char* prefix,
const syslog::LogSettings& log_settings);
// Wrapper around |fdio_spawn_etc()|.
// If |arg_handle| is not ZX_HANDLE_INVALID, then it is passed to the
// process with id PA_USER0.
zx_status_t SpawnProgram(const zx::job& job, const std::vector<std::string>& argv,
zx_handle_t arg_handle, zx::process* out_process);
// Wrapper around |fdio_spawn_etc()|.
zx_status_t RunProgram(const zx::job& job, const std::vector<std::string>& argv, size_t num_actions,
const fdio_spawn_action_t* actions, zx::process* out_process);
// Wait for |process| to exit.
// |program_name| is for logging purposes.
bool WaitAndGetReturnCode(const std::string& program_name, const zx::process& process,
int64_t* out_return_code);
// Wrapper on |RunProgram(),WaitAndGetReturnCode()|.
// The program must exit with a zero return code for success.
bool RunProgramAndWait(const zx::job& job, const std::vector<std::string>& argv, size_t num_actions,
const fdio_spawn_action_t* actions);
// Run an app within |context|.
// |app| is the component's URL.
bool RunComponent(sys::ComponentContext* context, const std::string& app,
const std::vector<std::string>& args,
std::unique_ptr<fuchsia::sys::FlatNamespace> flat_namespace,
fuchsia::sys::ComponentControllerPtr* component_controller);
// Wait for component |component_controller| to exit.
// |program_name| is for logging purposes.
bool WaitAndGetReturnCode(const std::string& program_name, async::Loop* loop,
fuchsia::sys::ComponentControllerPtr* component_controller,
int64_t* out_return_code);
// Wrapper on |RunComponent(),WaitAndGetReturnCode()|.
// The program must exit with a zero return code for success.
bool RunComponentAndWait(async::Loop* loop, sys::ComponentContext* context, const std::string& app,
const std::vector<std::string>& args,
std::unique_ptr<fuchsia::sys::FlatNamespace> flat_namespace);
} // namespace test
} // namespace tracing
#endif // SRC_DEVELOPER_TRACING_LIB_TEST_UTILS_RUN_PROGRAM_H_