blob: 654bf93abc253e57972eeaea3e120bf51109afed [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 LIB_VFS_CPP_TESTING_DIR_TEST_UTIL_H_
#define LIB_VFS_CPP_TESTING_DIR_TEST_UTIL_H_
#include <fuchsia/io/cpp/fidl.h>
#include <lib/fdio/vfs.h>
#include <lib/gtest/real_loop_fixture.h>
#include <lib/vfs/cpp/internal/directory.h>
namespace vfs_tests {
class Dirent {
public:
static Dirent DirentForDot();
static Dirent DirentForDirectory(const std::string& name);
static Dirent DirentForFile(const std::string& name);
static Dirent DirentForService(const std::string& name);
std::string String();
uint64_t ino() const { return ino_; }
uint8_t type() const { return type_; }
uint8_t size() const { return size_; }
const std::string& name() const { return name_; }
uint64_t size_in_bytes() const { return size_in_bytes_; }
private:
Dirent(uint64_t ino, uint8_t type, const std::string& name);
uint64_t ino_;
uint8_t type_;
uint8_t size_;
std::string name_;
uint64_t size_in_bytes_;
};
class DirConnection : public gtest::RealLoopFixture {
protected:
virtual vfs::internal::Directory* GetDirectoryNode() = 0;
void AssertOpen(async_dispatcher_t* dispatcher, uint32_t flags, zx_status_t expected_status,
bool test_on_open_event = true);
void AssertReadDirents(fuchsia::io::DirectorySyncPtr& ptr, uint64_t max_bytes,
std::vector<Dirent>& expected_dirents,
zx_status_t expected_status = ZX_OK);
void AssertRewind(fuchsia::io::DirectorySyncPtr& ptr, zx_status_t expected_status = ZX_OK);
template <typename T>
void AssertOpenPathImpl(std::string caller_file, int caller_line,
fuchsia::io::DirectorySyncPtr& dir_ptr, const std::string& path,
::fidl::SynchronousInterfacePtr<T>& out_sync_ptr, uint32_t flags,
uint32_t mode = 0, zx_status_t expected_status = ZX_OK) {
::fidl::InterfacePtr<fuchsia::io::Node> node_ptr;
dir_ptr->Open(flags | fuchsia::io::OPEN_FLAG_DESCRIBE, mode, path, node_ptr.NewRequest());
bool on_open_called = false;
node_ptr.events().OnOpen = [&](zx_status_t status,
std::unique_ptr<fuchsia::io::NodeInfo> unused) {
EXPECT_FALSE(on_open_called); // should be called only once
on_open_called = true;
EXPECT_EQ(expected_status, status) << "from file " << caller_file << ", line " << caller_line;
};
RunLoopUntil([&]() { return on_open_called; }, zx::msec(1));
// Bind channel to sync_ptr
out_sync_ptr.Bind(node_ptr.Unbind().TakeChannel());
}
void AssertRead(fuchsia::io::FileSyncPtr& file, int count, const std::string& expected_str,
zx_status_t expected_status = ZX_OK);
};
} // namespace vfs_tests
#define AssertOpenPath(...) AssertOpenPathImpl(__FILE__, __LINE__, __VA_ARGS__)
#endif // LIB_VFS_CPP_TESTING_DIR_TEST_UTIL_H_