// 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.

#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <threads.h>
#include <unistd.h>

#include <fbl/unique_fd.h>
#include <fuchsia/io/c/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/fdio/directory.h>
#include <lib/memfs/cpp/vnode.h>
#include <lib/memfs/memfs.h>
#include <lib/zx/channel.h>
#include <lib/zx/vmo.h>
#include <unittest/unittest.h>
#include <zircon/processargs.h>
#include <zircon/syscalls.h>

namespace {

bool test_vmofile_basic() {
    BEGIN_TEST;

    async::Loop loop(&kAsyncLoopConfigNoAttachToThread);
    ASSERT_EQ(loop.StartThread(), ZX_OK);
    async_dispatcher_t* dispatcher = loop.dispatcher();

    zx::channel client, server;
    ASSERT_EQ(zx::channel::create(0, &client, &server), ZX_OK);

    memfs::Vfs vfs;
    vfs.SetDispatcher(dispatcher);

    fbl::RefPtr<memfs::VnodeDir> root;
    ASSERT_EQ(memfs::CreateFilesystem("<tmp>", &vfs, &root), ZX_OK);

    zx::vmo backing_vmo;
    ASSERT_EQ(zx::vmo::create(64, 0, &backing_vmo), ZX_OK);
    ASSERT_EQ(backing_vmo.write("hello, world!", 0, 13), ZX_OK);
    ASSERT_EQ(vfs.CreateFromVmo(root.get(), "greeting", backing_vmo.get(), 0, 13),
              ZX_OK);
    ASSERT_EQ(vfs.ServeDirectory(std::move(root), std::move(server)), ZX_OK);

    zx::channel h, request;
    ASSERT_EQ(zx::channel::create(0, &h, &request), ZX_OK);
    ASSERT_EQ(fuchsia_io_DirectoryOpen(client.get(), ZX_FS_RIGHT_READABLE, 0,
                                       "greeting", 8, request.release()),
              ZX_OK);

    fuchsia_io_NodeInfo info = {};
    ASSERT_EQ(fuchsia_io_FileDescribe(h.get(), &info), ZX_OK);
    ASSERT_EQ(info.tag, fuchsia_io_NodeInfoTag_vmofile);
    ASSERT_EQ(info.vmofile.offset, 0u);
    ASSERT_EQ(info.vmofile.length, 13u);
    zx_handle_close(info.vmofile.vmo);

    zx_status_t status = ZX_OK;
    uint64_t seek = 0u;
    ASSERT_EQ(fuchsia_io_FileSeek(h.get(), 7u, fuchsia_io_SeekOrigin_START,
                                  &status, &seek),
              ZX_OK);
    ASSERT_EQ(status, ZX_OK);
    ASSERT_EQ(seek, 7u);
    memset(&info, 0, sizeof(info));
    ASSERT_EQ(fuchsia_io_FileDescribe(h.get(), &info), ZX_OK);
    ASSERT_EQ(info.tag, fuchsia_io_NodeInfoTag_vmofile);
    ASSERT_EQ(info.vmofile.offset, 0u);
    ASSERT_EQ(info.vmofile.length, 13u);
    zx_handle_close(info.vmofile.vmo);

    h.reset();

    vfs.Shutdown([](zx_status_t status) {
        EXPECT_EQ(status, ZX_OK);
    });

    loop.Shutdown();

    END_TEST;
}

} // namespace

BEGIN_TEST_CASE(vmofile_tests)
RUN_TEST(test_vmofile_basic)
END_TEST_CASE(vmofile_tests)
