// Copyright 2016 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 "src/lib/fsl/socket/files.h"

#include <fcntl.h>
#include <lib/zx/socket.h>
#include <sys/stat.h>
#include <sys/types.h>

#include "src/lib/files/file.h"
#include "src/lib/files/scoped_temp_dir.h"
#include "src/lib/fsl/socket/strings.h"
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"

namespace fsl {
namespace {

using SockAndFileTest = ::gtest::TestLoopFixture;

TEST_F(SockAndFileTest, CopyToFileDescriptor) {
  files::ScopedTempDir tmp_dir;
  std::string tmp_file;
  tmp_dir.NewTempFile(&tmp_file);

  fbl::unique_fd destination(open(tmp_file.c_str(), O_WRONLY));
  EXPECT_TRUE(destination.is_valid());

  bool success;
  CopyToFileDescriptor(
      fsl::WriteStringToSocket("Hello"), std::move(destination), dispatcher(),
      [&success](bool success_value, fbl::unique_fd fd) { success = success_value; });
  RunLoopUntilIdle();

  EXPECT_TRUE(success);
  std::string content;
  EXPECT_TRUE(files::ReadFileToString(tmp_file, &content));
  EXPECT_EQ("Hello", content);
}

TEST_F(SockAndFileTest, CopyFromFileDescriptor) {
  files::ScopedTempDir tmp_dir;
  std::string tmp_file;
  tmp_dir.NewTempFile(&tmp_file);

  files::WriteFile(tmp_file, "Hello", 5);
  fbl::unique_fd source(open(tmp_file.c_str(), O_RDONLY));
  EXPECT_TRUE(source.is_valid());

  zx::socket socket1, socket2;
  EXPECT_EQ(ZX_OK, zx::socket::create(0u, &socket1, &socket2));

  bool success;
  CopyFromFileDescriptor(
      std::move(source), std::move(socket1), dispatcher(),
      [&success](bool success_value, fbl::unique_fd fd) { success = success_value; });
  RunLoopUntilIdle();

  EXPECT_TRUE(success);
  std::string content;
  EXPECT_TRUE(fsl::BlockingCopyToString(std::move(socket2), &content));
  EXPECT_EQ("Hello", content);
}

}  // namespace
}  // namespace fsl
