blob: c8fd4f0f4e7c18403aa8dc723f67331ff0182e55 [file] [log] [blame]
// Copyright 2025 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_DEBUG_DEBUG_AGENT_TESTING_RUNTIME_DIR_HELPER_H_
#define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_TESTING_RUNTIME_DIR_HELPER_H_
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include "fbl/ref_ptr.h"
#include "fidl/fuchsia.io/cpp/fidl.h"
#include "src/storage/lib/vfs/cpp/managed_vfs.h"
#include "src/storage/lib/vfs/cpp/pseudo_dir.h"
namespace testing {
// A class that can emulate multiple component runtime directories by constructing a flat namespace
// of directories named by given job koids, which will each contain a nested file at the relative
// path elf/job_id, which contains the same job koid as the parent directory, but is readable by
// entities expecting to have a handle to the "root" of a component's namespaced runtime directory.
//
// Tests may use this to emulate any number of mocked component runtime directories. All directories
// that are to be serviced by this helper must be created before calling |Start|.
class RuntimeDirHelper {
public:
RuntimeDirHelper()
: loop_(&kAsyncLoopConfigNoAttachToCurrentThread),
vfs_(loop_.dispatcher()),
root_dir_(fbl::MakeRefCounted<fs::PseudoDir>()) {}
~RuntimeDirHelper();
// Starts serving the VFS instance on a separate thread. |client_dispatcher| will service the
// client end of the connection. Any calls that attempt to add a new directory after calling this
// method will assert.
void Start(async_dispatcher_t* client_dispatcher);
// Cleans up the VFS instance and shuts down the dedicated message loop thread.
void Cleanup();
// Adds a new top-level directory for |job|, containing a file with a path "elf/job_id" containing
// the same job koid.
void AddJobIdFile(zx_koid_t job);
fidl::ClientEnd<fuchsia_io::Directory> GetScopedDirectoryHandle(zx_koid_t job);
private:
async::Loop loop_;
fs::ManagedVfs vfs_;
// The root directory served by |vfs_|. Consumed when |Start| is called.
fbl::RefPtr<fs::PseudoDir> root_dir_;
fidl::Client<fuchsia_io::Directory> root_dir_client_;
};
} // namespace testing
#endif // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_TESTING_RUNTIME_DIR_HELPER_H_