// Copyright 2026 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 <fcntl.h>
#include <sys/mount.h>
#include <unistd.h>

#include <string>

#include <fbl/unique_fd.h>
#include <gtest/gtest.h>

#include "src/lib/files/file.h"
#include "src/starnix/tests/syscalls/cpp/syscall_matchers.h"
#include "src/starnix/tests/syscalls/cpp/test_helper.h"

namespace {

TEST(Ext4WriteTest, ReadWriteAndTruncate) {
  char* mutable_storage = getenv("TEST_EXT4_ROOT");
  std::string path = std::string(mutable_storage) + "/hello_world.txt";
  std::string expected_original_content;
  ASSERT_TRUE(
      files::ReadFileToString("data/tests/deps/hello_world.txt", &expected_original_content));

  // Verify initial content
  {
    std::string read_content;
    ASSERT_TRUE(files::ReadFileToString(path, &read_content));
    EXPECT_EQ(read_content, expected_original_content);
  }

  std::string_view overwrite_content = "HELLO, WORLD!\n";
  ASSERT_NE(overwrite_content, expected_original_content);
  {
    fbl::unique_fd fd(open(path.c_str(), O_RDWR));
    ASSERT_TRUE(fd.is_valid()) << "failed to open " << path << ": " << strerror(errno);
    ASSERT_EQ(write(fd.get(), overwrite_content.data(), overwrite_content.size()),
              static_cast<ssize_t>(overwrite_content.size()));
    fd.reset();

    std::string read_content;
    ASSERT_TRUE(files::ReadFileToString(path, &read_content));
    EXPECT_EQ(read_content, overwrite_content);
  }

  // Truncate and overwrite the file
  // Note that this ext4 library only supports overwriting file contents. So the new content that we
  // write should be the same length as the original content.
  std::string_view new_content = "HELLoo WOrld!\n";
  {
    fbl::unique_fd fd(open(path.c_str(), O_RDWR | O_TRUNC));
    ASSERT_TRUE(fd.is_valid()) << "failed to open " << path << ": " << strerror(errno);
    ASSERT_EQ(write(fd.get(), new_content.data(), new_content.size()),
              static_cast<ssize_t>(new_content.size()));
    fd.reset();

    std::string read_content;
    ASSERT_TRUE(files::ReadFileToString(path, &read_content));
    EXPECT_EQ(read_content, new_content);
  }
}

}  // namespace
