blob: 8c2f413c21ea1ea6355b0e53c7833a6467a76a23 [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);
status = vmo.write("abcdefghijklmnop", 0, 16);
EXPECT_EQ(ZX_OK, status);
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];
size_t 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;
uint32_t type = 0;
zxrio_object_info_t info;
EXPECT_EQ(ZX_OK, file->GetHandles(0, &handle, &type, &info));
EXPECT_NE(ZX_HANDLE_INVALID, handle);
EXPECT_EQ(ZX_OK, zx_handle_close(handle));
EXPECT_EQ(FDIO_PROTOCOL_VMOFILE, type);
EXPECT_EQ(0, info.vmofile.offset);
EXPECT_EQ(3, info.vmofile.length);
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);
status = vmo.write("abcdefghijklmnop", 0, 16);
EXPECT_EQ(ZX_OK, status);
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];
size_t 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)