// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Basic tests of things declared in mojio_unistd.h, as well as
// |mojio_creat()|/|mojio_open()| from mojio_fcntl.h. Note that more thorough
// tests are done more directly at a different level.

#include <errno.h>
#include <string.h>

#include "files/c/mojio_fcntl.h"
#include "files/c/mojio_sys_stat.h"
#include "files/c/mojio_unistd.h"
#include "files/c/tests/mojio_test_base.h"

namespace {

using MojioUnistdTest = mojio::test::MojioTestBase;

TEST_F(MojioUnistdTest, CreatWriteOpenCloseReadClose) {
  const char kTestFileName[] = "test_file";
  const char kTestData[] = "Hello mojio!";

  errno = 12345;
  int write_fd = mojio_creat(kTestFileName, MOJIO_S_IRWXU);
  int errno_value = errno;  // |ASSERT_EQ()| might conceivably change errno.
  ASSERT_EQ(0, write_fd);   // FDs are allocated starting from 0.
  EXPECT_EQ(12345, errno_value);  // errno should be untouched.

  errno = 12345;
  mojio_ssize_t bytes_written =
      mojio_write(write_fd, kTestData, sizeof(kTestData));
  errno_value = errno;
  EXPECT_EQ(static_cast<mojio_ssize_t>(sizeof(kTestData)), bytes_written);
  EXPECT_EQ(12345, errno_value);

  errno = 12345;
  int read_fd = mojio_open(kTestFileName, MOJIO_O_RDONLY);
  errno_value = errno;
  ASSERT_EQ(1, read_fd);  // |write_fd| is still open, so we should get 1.
  EXPECT_EQ(12345, errno_value);

  errno = 12345;
  int result = mojio_close(write_fd);
  errno_value = errno;
  EXPECT_EQ(0, result);
  EXPECT_EQ(12345, errno_value);

  char buffer[100] = {};
  errno = 12345;
  mojio_ssize_t bytes_read = mojio_read(read_fd, buffer, sizeof(buffer));
  errno_value = errno;
  EXPECT_EQ(static_cast<mojio_ssize_t>(sizeof(kTestData)), bytes_read);
  EXPECT_EQ(12345, errno_value);
  EXPECT_EQ(0, memcmp(buffer, kTestData, sizeof(kTestData)));
  EXPECT_EQ('\0', buffer[sizeof(kTestData)]);

  errno = 12345;
  result = mojio_close(read_fd);
  errno_value = errno;
  EXPECT_EQ(0, result);
  EXPECT_EQ(12345, errno_value);
}

TEST_F(MojioUnistdTest, FtruncateLseek) {
  const char kTestData[] = "Hello mojio!";

  int fd = mojio_open("my_file", MOJIO_O_CREAT | MOJIO_O_RDWR, MOJIO_S_IRWXU);
  EXPECT_GE(fd, 0);

  mojio_ssize_t bytes_written = mojio_write(fd, kTestData, sizeof(kTestData));
  EXPECT_EQ(static_cast<mojio_ssize_t>(sizeof(kTestData)), bytes_written);

  errno = 12345;
  int result = mojio_ftruncate(fd, sizeof(kTestData) - 2);
  int errno_value = errno;
  EXPECT_EQ(0, result);
  EXPECT_EQ(12345, errno_value);

  errno = 12345;
  mojio_off_t offset = mojio_lseek(fd, -5, MOJIO_SEEK_END);
  errno_value = errno;
  EXPECT_EQ(static_cast<mojio_off_t>(sizeof(kTestData)) - 2 - 5, offset);
  EXPECT_EQ(12345, errno_value);

  char buffer[100] = {};
  errno = 12345;
  mojio_ssize_t bytes_read = mojio_read(fd, buffer, sizeof(buffer));
  errno_value = errno;
  EXPECT_EQ(5, bytes_read);
  EXPECT_EQ(12345, errno_value);
  EXPECT_EQ(0, memcmp(buffer, &kTestData[sizeof(kTestData) - 2 - 5], 5));
  EXPECT_EQ('\0', buffer[5]);

  EXPECT_EQ(0, mojio_close(fd));
}

TEST_F(MojioUnistdTest, Ebadf) {
  errno = 12345;
  int result = mojio_close(-1);
  int errno_value = errno;
  EXPECT_EQ(-1, result);
  EXPECT_EQ(EBADF, errno_value);

  errno = 12345;
  result = mojio_dup(-1);
  errno_value = errno;
  EXPECT_EQ(-1, result);
  EXPECT_EQ(EBADF, errno_value);

  errno = 12345;
  result = mojio_ftruncate(-1, 0);
  errno_value = errno;
  EXPECT_EQ(-1, result);
  EXPECT_EQ(EBADF, errno_value);

  errno = 12345;
  mojio_off_t offset = mojio_lseek(-1, 0, MOJIO_SEEK_SET);
  errno_value = errno;
  EXPECT_EQ(-1, offset);
  EXPECT_EQ(EBADF, errno_value);

  char buf[10] = {};
  errno = 12345;
  mojio_ssize_t size = mojio_read(-1, buf, sizeof(buf));
  errno_value = errno;
  EXPECT_EQ(-1, size);
  EXPECT_EQ(EBADF, errno_value);

  errno = 12345;
  size = mojio_write(-1, buf, sizeof(buf));
  errno_value = errno;
  EXPECT_EQ(-1, size);
  EXPECT_EQ(EBADF, errno_value);
}

// TODO(vtl): mojio_chdir(), mojio_dup().

}  // namespace
