// Copyright 2019 The Chromium OS 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 "arc/vm/vsock_proxy/file_descriptor_util.h"

#include <errno.h>

#include <utility>
#include <vector>

#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/files/scoped_temp_dir.h>
#include <base/macros.h>
#include <gtest/gtest.h>

namespace arc {
namespace {

class FileDescriptorUtilSocketTest : public testing::Test {
 public:
  FileDescriptorUtilSocketTest() = default;
  ~FileDescriptorUtilSocketTest() override = default;

 protected:
  void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }

  void TearDown() override { EXPECT_TRUE(temp_dir_.Delete()); }

  const base::FilePath& temp_dir() const { return temp_dir_.GetPath(); }

 private:
  base::ScopedTempDir temp_dir_;

  DISALLOW_COPY_AND_ASSIGN(FileDescriptorUtilSocketTest);
};

// Checks the common scenario about using unix domain socket; create a socket,
// connect to it, accept the connection, then send a message between them.
TEST_F(FileDescriptorUtilSocketTest, UnixDomainSocket) {
  const base::FilePath path = temp_dir().Append("test.sock");
  auto socket = CreateUnixDomainSocket(path);
  std::pair<int, base::ScopedFD> errno_fd_pair = ConnectUnixDomainSocket(path);
  ASSERT_EQ(0, errno_fd_pair.first);
  auto accepted = AcceptSocket(socket.get());
  auto connected = std::move(errno_fd_pair.second);
  // Now |accepted| and |connected| should be connected each other.
  // Try to exchange some messages to make sure.
  constexpr char kTestData[] = "test_data";
  ASSERT_EQ(Sendmsg(accepted.get(), kTestData, sizeof(kTestData), {}),
            sizeof(kTestData));

  std::vector<base::ScopedFD> fds;
  char buf[256];
  ASSERT_EQ(sizeof(kTestData),
            Recvmsg(connected.get(), buf, sizeof(buf), &fds));
  EXPECT_STREQ("test_data", buf);
}

// Makes sure the errno from connect(2) is returned to the caller.
TEST_F(FileDescriptorUtilSocketTest, NoUnixDomainSocket) {
  const base::FilePath path = temp_dir().Append("test.sock");
  // Try to connect non-exist socket file.
  std::pair<int, base::ScopedFD> errno_fd_pair = ConnectUnixDomainSocket(path);
  // Make sure errno is properly returned.
  EXPECT_EQ(ENOENT, errno_fd_pair.first);
}

}  // namespace
}  // namespace arc
