/*
 *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "rtc_base/platform_file.h"

#include "test/gtest.h"
#include "test/testsupport/file_utils.h"

namespace rtc {

void FillWithDummyDataAndClose(FILE* const file, const std::string& filename) {
  EXPECT_GT(fprintf(file, "%s", "Dummy data"), 0)
      << "Failed to write to file: " << filename;
  fclose(file);
}

TEST(PlatformFileTest, CreateWriteAndDelete) {
  const std::string filename = webrtc::test::GenerateTempFilename(
      webrtc::test::OutputPath(), ".testfile");
  const PlatformFile fd = rtc::CreatePlatformFile(filename);
  ASSERT_NE(fd, rtc::kInvalidPlatformFileValue)
      << "Failed to create file descriptor for file: " << filename;
  FILE* const file = rtc::FdopenPlatformFile(fd, "w");
  ASSERT_TRUE(file != nullptr) << "Failed to open file: " << filename;
  FillWithDummyDataAndClose(file, filename);
  webrtc::test::RemoveFile(filename);
}

TEST(PlatformFileTest, OpenExistingWriteAndDelete) {
  const std::string filename = webrtc::test::GenerateTempFilename(
      webrtc::test::OutputPath(), ".testfile");

  // Create file with dummy data.
  FILE* file = fopen(filename.c_str(), "wb");
  ASSERT_TRUE(file != nullptr) << "Failed to open file: " << filename;
  FillWithDummyDataAndClose(file, filename);

  // Open it for write, write and delete.
  const PlatformFile fd = rtc::OpenPlatformFile(filename);
  ASSERT_NE(fd, rtc::kInvalidPlatformFileValue)
      << "Failed to open file descriptor for file: " << filename;
  file = rtc::FdopenPlatformFile(fd, "w");
  ASSERT_TRUE(file != nullptr) << "Failed to open file: " << filename;
  FillWithDummyDataAndClose(file, filename);
  webrtc::test::RemoveFile(filename);
}

TEST(PlatformFileTest, OpenExistingReadOnlyAndDelete) {
  const std::string filename = webrtc::test::GenerateTempFilename(
      webrtc::test::OutputPath(), ".testfile");

  // Create file with dummy data.
  FILE* file = fopen(filename.c_str(), "wb");
  ASSERT_TRUE(file != nullptr) << "Failed to open file: " << filename;
  FillWithDummyDataAndClose(file, filename);

  // Open it for read, read and delete.
  const PlatformFile fd = rtc::OpenPlatformFileReadOnly(filename);
  ASSERT_NE(fd, rtc::kInvalidPlatformFileValue)
      << "Failed to open file descriptor for file: " << filename;
  file = rtc::FdopenPlatformFile(fd, "r");
  ASSERT_TRUE(file != nullptr) << "Failed to open file: " << filename;

  int buf[]{0};
  ASSERT_GT(fread(&buf, 1, 1, file), 0u)
      << "Failed to read from file: " << filename;
  fclose(file);
  webrtc::test::RemoveFile(filename);
}

}  // namespace rtc
