blob: 1c174a16800064fb17002b1d51b867cc3e2a147d [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.
#include <vmofs/vmofs.h>
#include <unittest/unittest.h>
namespace {
bool test_vmofs_file() {
BEGIN_TEST;
zx::vmo vmo;
zx_status_t status = zx::vmo::create(64, 0, &vmo);
EXPECT_EQ(ZX_OK, status);
size_t actual = 0;
status = vmo.write("abcdefghijklmnop", 0, 16, &actual);
EXPECT_EQ(ZX_OK, status);
EXPECT_EQ(16, actual);
auto file = fbl::AdoptRef(new vmofs::VnodeFile(vmo.get(), 0, 3));
// open
fbl::RefPtr<fs::Vnode> redirect;
EXPECT_EQ(ZX_OK, file->ValidateFlags(ZX_FS_RIGHT_READABLE));
EXPECT_EQ(ZX_ERR_NOT_DIR, file->ValidateFlags(ZX_FS_FLAG_DIRECTORY));
EXPECT_EQ(ZX_ERR_ACCESS_DENIED, file->ValidateFlags(ZX_FS_RIGHT_WRITABLE));
EXPECT_EQ(ZX_OK, file->Open(ZX_FS_RIGHT_READABLE, &redirect));
EXPECT_NULL(redirect);
// read
char buffer[1024];
actual = 0;
EXPECT_EQ(ZX_OK, file->Read(buffer, 1024, 1, &actual));
EXPECT_EQ(2, actual);
EXPECT_EQ('b', buffer[0]);
EXPECT_EQ('c', buffer[1]);
// get attr
vnattr_t attr;
EXPECT_EQ(ZX_OK, file->Getattr(&attr));
EXPECT_EQ(V_TYPE_FILE | V_IRUSR, attr.mode);
EXPECT_EQ(3, attr.size);
EXPECT_EQ(1, attr.nlink);
// get handles
zx_handle_t handle = ZX_HANDLE_INVALID;
size_t handle_count;
uint32_t type = 0;
zx_off_t info[2];
uint32_t info_size;
EXPECT_EQ(ZX_OK, file->GetHandles(0, &handle, &handle_count, &type, info, &info_size));
EXPECT_EQ(1, handle_count);
EXPECT_NE(ZX_HANDLE_INVALID, handle);
EXPECT_EQ(ZX_OK, zx_handle_close(handle));
EXPECT_EQ(FDIO_PROTOCOL_VMOFILE, type);
EXPECT_EQ(sizeof(info), info_size);
EXPECT_EQ(0, info[0]);
EXPECT_EQ(3, info[1]);
END_TEST;
}
bool test_vmofs_dir() {
BEGIN_TEST;
zx::vmo vmo;
zx_status_t status = zx::vmo::create(64, 0, &vmo);
EXPECT_EQ(ZX_OK, status);
size_t actual = 0;
status = vmo.write("abcdefghijklmnop", 0, 16, &actual);
EXPECT_EQ(ZX_OK, status);
EXPECT_EQ(16, actual);
fbl::Array<fbl::StringPiece> names(new fbl::StringPiece[3], 3);
names[0] = "alpha";
names[1] = "beta";
names[2] = "gamma";
fbl::Array<fbl::RefPtr<vmofs::Vnode>> files(new fbl::RefPtr<vmofs::Vnode>[3], 3);
files[0] = fbl::AdoptRef(new vmofs::VnodeFile(vmo.get(), 0, 8));
files[1] = fbl::AdoptRef(new vmofs::VnodeFile(vmo.get(), 4, 8));
files[2] = fbl::AdoptRef(new vmofs::VnodeFile(vmo.get(), 8, 8));
auto dir = fbl::AdoptRef(new vmofs::VnodeDir(fbl::move(names), fbl::move(files)));
// open
fbl::RefPtr<fs::Vnode> redirect;
EXPECT_EQ(ZX_OK, dir->ValidateFlags(ZX_FS_RIGHT_READABLE));
EXPECT_EQ(ZX_OK, dir->ValidateFlags(ZX_FS_FLAG_DIRECTORY));
EXPECT_EQ(ZX_ERR_NOT_FILE, dir->ValidateFlags(ZX_FS_RIGHT_WRITABLE));
EXPECT_EQ(ZX_OK, dir->Open(ZX_FS_RIGHT_READABLE, &redirect));
EXPECT_NULL(redirect);
// get attr
vnattr_t attr;
EXPECT_EQ(ZX_OK, dir->Getattr(&attr));
EXPECT_EQ(V_TYPE_DIR | V_IRUSR, attr.mode);
EXPECT_EQ(0, attr.size);
EXPECT_EQ(1, attr.nlink);
// lookup
fbl::RefPtr<fs::Vnode> found;
EXPECT_EQ(ZX_ERR_NOT_FOUND, dir->Lookup(&found, "aaa"));
EXPECT_FALSE(found);
EXPECT_EQ(ZX_OK, dir->Lookup(&found, "alpha"));
char buffer[1024];
actual = 0;
EXPECT_EQ(ZX_OK, found->Read(buffer, 1024, 0, &actual));
EXPECT_EQ(8, actual);
EXPECT_EQ(0, memcmp(buffer, "abcdefgh", 8));
found = nullptr;
EXPECT_EQ(ZX_ERR_NOT_FOUND, dir->Lookup(&found, "bbb"));
EXPECT_FALSE(found);
EXPECT_EQ(ZX_OK, dir->Lookup(&found, "beta"));
actual = 0;
EXPECT_EQ(ZX_OK, found->Read(buffer, 1024, 0, &actual));
EXPECT_EQ(8, actual);
EXPECT_EQ(0, memcmp(buffer, "efghijkl", 8));
found = nullptr;
EXPECT_EQ(ZX_ERR_NOT_FOUND, dir->Lookup(&found, "ccc"));
EXPECT_FALSE(found);
EXPECT_EQ(ZX_OK, dir->Lookup(&found, "gamma"));
actual = 0;
EXPECT_EQ(ZX_OK, found->Read(buffer, 1024, 0, &actual));
EXPECT_EQ(8, actual);
EXPECT_EQ(0, memcmp(buffer, "ijklmnop", 8));
found = nullptr;
EXPECT_EQ(ZX_ERR_NOT_FOUND, dir->Lookup(&found, "zzz"));
EXPECT_FALSE(found);
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(vmofs_tests)
RUN_TEST(test_vmofs_file)
RUN_TEST(test_vmofs_dir)
END_TEST_CASE(vmofs_tests)