// 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 <lib/zxio/inception.h>
#include <lib/zxio/zxio.h>
#include <lib/zx/channel.h>
#include <lib/zx/vmo.h>

#include <unittest/unittest.h>

#define ALPHABET "abcdefghijklmnopqrstuvwxyz"

bool vmofile_basic_test(void) {
    BEGIN_TEST;

    zx::vmo backing;
    ASSERT_EQ(ZX_OK, zx::vmo::create(300u, 0u, &backing));
    size_t len = strlen(ALPHABET);
    ASSERT_EQ(ZX_OK, backing.write(ALPHABET, 0, len));
    ASSERT_EQ(ZX_OK, backing.write(ALPHABET, len, len + len));

    zx::channel h1, h2;
    ASSERT_EQ(ZX_OK, zx::channel::create(0u, &h1, &h2));

    zxio_storage_t storage;
    zxio_vmofile_init(&storage, h1.release(), backing.release(), 4, len, 3);
    zxio_t* io = &storage.io;

    zxio_signals_t observed = ZXIO_SIGNAL_NONE;
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_wait_one(io, ZXIO_READABLE,
                                                  ZX_TIME_INFINITE, &observed));

    zx::channel clone1, clone2;
    ASSERT_EQ(ZX_OK, zx::channel::create(0u, &clone1, &clone2));

    ASSERT_EQ(ZX_OK, zxio_clone_async(io, 0u, clone1.release()));
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_sync(io));

    zxio_node_attr_t attr = {};
    ASSERT_EQ(ZX_OK, zxio_attr_get(io, &attr));
    EXPECT_EQ(len, attr.content_size);
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_attr_set(io, 0u, &attr));
    char buffer[1024];
    memset(buffer, 0, sizeof(buffer));
    size_t actual = 0u;
    ASSERT_EQ(ZX_OK, zxio_read(io, buffer, 8, &actual));
    EXPECT_EQ(actual, 8);
    EXPECT_STR_EQ("hijklmno", buffer);
    memset(buffer, 0, sizeof(buffer));
    actual = 0u;
    ASSERT_EQ(ZX_OK, zxio_read_at(io, 1u, buffer, 6, &actual));
    EXPECT_EQ(actual, 6);
    EXPECT_STR_EQ("fghijk", buffer);
    ASSERT_EQ(ZX_ERR_WRONG_TYPE, zxio_write(io, buffer, sizeof(buffer), &actual));
    ASSERT_EQ(ZX_ERR_WRONG_TYPE, zxio_write_at(io, 0u, buffer, sizeof(buffer), &actual));
    size_t offset = 2u;
    ASSERT_EQ(ZX_OK, zxio_seek(io, 2u, fuchsia_io_SeekOrigin_START, &offset));
    EXPECT_EQ(offset, 2u);
    memset(buffer, 0, sizeof(buffer));
    actual = 0u;
    ASSERT_EQ(ZX_OK, zxio_read(io, buffer, 3, &actual));
    EXPECT_STR_EQ("ghi", buffer);
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_truncate(io, 0u));
    uint32_t flags = 0u;
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_flags_get(io, &flags));
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_flags_set(io, flags));
    zx_handle_t vmo = ZX_HANDLE_INVALID;
    size_t size = 0u;
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_vmo_get_copy(io, &vmo, &size));
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_vmo_get_clone(io, &vmo, &size));
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_vmo_get_exact(io, &vmo, &size));

    zxio_t* result = nullptr;
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_open(io, 0u, 0u, "hello", &result));
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED,
              zxio_open_async(io, 0u, 0u, "hello", ZX_HANDLE_INVALID));
    ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_unlink(io, "hello"));

    ASSERT_EQ(ZX_OK, zxio_close(io));

    END_TEST;
}

BEGIN_TEST_CASE(vmofile_test)
RUN_TEST(vmofile_basic_test);
END_TEST_CASE(vmofile_test)
