blob: f926b2af3a2f4e8fa9f50be04edeee4e42e2dbc6 [file] [log] [blame]
// Copyright 2018 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.
#pragma once
#include <fbl/unique_fd.h>
#include <lib/devmgr-launcher/launch.h>
#include <lib/zx/job.h>
#include <lib/zx/time.h>
namespace devmgr_integration_test {
class IsolatedDevmgr {
IsolatedDevmgr() = default;
IsolatedDevmgr(const IsolatedDevmgr&) = delete;
IsolatedDevmgr& operator=(const IsolatedDevmgr&) = delete;
IsolatedDevmgr(IsolatedDevmgr&& other)
: job_(std::move(other.job_)), devfs_root_(std::move(other.devfs_root_)) {}
IsolatedDevmgr& operator=(IsolatedDevmgr&& other) {
job_ = std::move(other.job_);
devfs_root_ = std::move(other.devfs_root_);
return *this;
// Path to the test sysdev driver
static inline constexpr char kSysdevDriver[] = "/boot/driver/test/";
// Get an args structure pre-populated with the test sysdev driver, the
// test control driver, and the test driver directory.
static devmgr_launcher::Args DefaultArgs();
// Launch a new isolated devmgr. The instance will be destroyed when
// |*out|'s dtor runs.
static zx_status_t Create(devmgr_launcher::Args args, IsolatedDevmgr* out);
// Get a fd to the root of the isolate devmgr's devfs. This fd
// may be used with openat() and fdio_watch_directory().
const fbl::unique_fd& devfs_root() const { return devfs_root_; }
// Borrow the handle to the job containing the isolated devmgr. This may be
// used for things like binding to an exception port.
const zx::job& containing_job() const { return job_; }
void reset() {
*this = IsolatedDevmgr();
// Job that contains the devmgr environment
zx::job job_;
// FD to the root of devmgr's devfs
fbl::unique_fd devfs_root_;
// Wait for |file| to appear in |dir|, and open it when it does.
zx_status_t WaitForFile(const fbl::unique_fd& dir, const char* file, zx::time deadline,
fbl::unique_fd* out);
// Waits for the relative |path| starting in |dir| to appear, and opens it.
zx_status_t RecursiveWaitForFile(const fbl::unique_fd& dir, const char* path,
zx::time deadline, fbl::unique_fd* out);
} // namespace devmgr_integration_test