/*
 *  Copyright (c) 2013 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 "modules/audio_processing/transient/file_utils.h"

#include <string.h>
#include <memory>
#include <string>
#include <vector>

#include "rtc_base/system/file_wrapper.h"
#include "test/gtest.h"
#include "test/testsupport/fileutils.h"

namespace webrtc {

static const uint8_t kPiBytesf[4] = {0xDB, 0x0F, 0x49, 0x40};
static const uint8_t kEBytesf[4] = {0x54, 0xF8, 0x2D, 0x40};
static const uint8_t kAvogadroBytesf[4] = {0x2F, 0x0C, 0xFF, 0x66};

static const uint8_t kPiBytes[8] = {0x18, 0x2D, 0x44, 0x54,
                                    0xFB, 0x21, 0x09, 0x40};
static const uint8_t kEBytes[8] = {0x69, 0x57, 0x14, 0x8B,
                                   0x0A, 0xBF, 0x05, 0x40};
static const uint8_t kAvogadroBytes[8] = {0xF4, 0xBC, 0xA8, 0xDF,
                                          0x85, 0xE1, 0xDF, 0x44};

static const double kPi = 3.14159265358979323846;
static const double kE = 2.71828182845904523536;
static const double kAvogadro = 602214100000000000000000.0;

class TransientFileUtilsTest : public ::testing::Test {
 protected:
  TransientFileUtilsTest()
      : kTestFileName(
            test::ResourcePath("audio_processing/transient/double-utils",
                               "dat")),
        kTestFileNamef(
            test::ResourcePath("audio_processing/transient/float-utils",
                               "dat")) {}

  ~TransientFileUtilsTest() override { CleanupTempFiles(); }

  std::string CreateTempFilename(const std::string& dir,
                                 const std::string& prefix) {
    std::string filename = test::TempFilename(dir, prefix);
    temp_filenames_.push_back(filename);
    return filename;
  }

  void CleanupTempFiles() {
    for (const std::string& filename : temp_filenames_) {
      remove(filename.c_str());
    }
    temp_filenames_.clear();
  }

  // This file (used in some tests) contains binary data. The data correspond to
  // the double representation of the constants: Pi, E, and the Avogadro's
  // Number;
  // appended in that order.
  const std::string kTestFileName;

  // This file (used in some tests) contains binary data. The data correspond to
  // the float representation of the constants: Pi, E, and the Avogadro's
  // Number;
  // appended in that order.
  const std::string kTestFileNamef;

  // List of temporary filenames created by CreateTempFilename.
  std::vector<std::string> temp_filenames_;
};

#if defined(WEBRTC_IOS)
#define MAYBE_ConvertByteArrayToFloat DISABLED_ConvertByteArrayToFloat
#else
#define MAYBE_ConvertByteArrayToFloat ConvertByteArrayToFloat
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ConvertByteArrayToFloat) {
  float value = 0.0;

  EXPECT_EQ(0, ConvertByteArrayToFloat(kPiBytesf, &value));
  EXPECT_FLOAT_EQ(kPi, value);

  EXPECT_EQ(0, ConvertByteArrayToFloat(kEBytesf, &value));
  EXPECT_FLOAT_EQ(kE, value);

  EXPECT_EQ(0, ConvertByteArrayToFloat(kAvogadroBytesf, &value));
  EXPECT_FLOAT_EQ(kAvogadro, value);
}

#if defined(WEBRTC_IOS)
#define MAYBE_ConvertByteArrayToDouble DISABLED_ConvertByteArrayToDouble
#else
#define MAYBE_ConvertByteArrayToDouble ConvertByteArrayToDouble
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ConvertByteArrayToDouble) {
  double value = 0.0;

  EXPECT_EQ(0, ConvertByteArrayToDouble(kPiBytes, &value));
  EXPECT_DOUBLE_EQ(kPi, value);

  EXPECT_EQ(0, ConvertByteArrayToDouble(kEBytes, &value));
  EXPECT_DOUBLE_EQ(kE, value);

  EXPECT_EQ(0, ConvertByteArrayToDouble(kAvogadroBytes, &value));
  EXPECT_DOUBLE_EQ(kAvogadro, value);
}

#if defined(WEBRTC_IOS)
#define MAYBE_ConvertFloatToByteArray DISABLED_ConvertFloatToByteArray
#else
#define MAYBE_ConvertFloatToByteArray ConvertFloatToByteArray
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ConvertFloatToByteArray) {
  std::unique_ptr<uint8_t[]> bytes(new uint8_t[4]);

  EXPECT_EQ(0, ConvertFloatToByteArray(kPi, bytes.get()));
  EXPECT_EQ(0, memcmp(bytes.get(), kPiBytesf, 4));

  EXPECT_EQ(0, ConvertFloatToByteArray(kE, bytes.get()));
  EXPECT_EQ(0, memcmp(bytes.get(), kEBytesf, 4));

  EXPECT_EQ(0, ConvertFloatToByteArray(kAvogadro, bytes.get()));
  EXPECT_EQ(0, memcmp(bytes.get(), kAvogadroBytesf, 4));
}

#if defined(WEBRTC_IOS)
#define MAYBE_ConvertDoubleToByteArray DISABLED_ConvertDoubleToByteArray
#else
#define MAYBE_ConvertDoubleToByteArray ConvertDoubleToByteArray
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ConvertDoubleToByteArray) {
  std::unique_ptr<uint8_t[]> bytes(new uint8_t[8]);

  EXPECT_EQ(0, ConvertDoubleToByteArray(kPi, bytes.get()));
  EXPECT_EQ(0, memcmp(bytes.get(), kPiBytes, 8));

  EXPECT_EQ(0, ConvertDoubleToByteArray(kE, bytes.get()));
  EXPECT_EQ(0, memcmp(bytes.get(), kEBytes, 8));

  EXPECT_EQ(0, ConvertDoubleToByteArray(kAvogadro, bytes.get()));
  EXPECT_EQ(0, memcmp(bytes.get(), kAvogadroBytes, 8));
}

#if defined(WEBRTC_IOS)
#define MAYBE_ReadInt16BufferFromFile DISABLED_ReadInt16BufferFromFile
#else
#define MAYBE_ReadInt16BufferFromFile ReadInt16BufferFromFile
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16BufferFromFile) {
  std::string test_filename = kTestFileName;

  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  file->OpenFile(test_filename.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();

  const size_t kBufferLength = 12;
  std::unique_ptr<int16_t[]> buffer(new int16_t[kBufferLength]);

  EXPECT_EQ(kBufferLength,
            ReadInt16BufferFromFile(file.get(), kBufferLength, buffer.get()));
  EXPECT_EQ(22377, buffer[4]);
  EXPECT_EQ(16389, buffer[7]);
  EXPECT_EQ(17631, buffer[kBufferLength - 1]);

  file->Rewind();

  // The next test is for checking the case where there are not as much data as
  // needed in the file, but reads to the end, and it returns the number of
  // int16s read.
  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
  buffer.reset(new int16_t[kBufferLenghtLargerThanFile]);
  EXPECT_EQ(kBufferLength,
            ReadInt16BufferFromFile(file.get(), kBufferLenghtLargerThanFile,
                                    buffer.get()));
  EXPECT_EQ(11544, buffer[0]);
  EXPECT_EQ(22377, buffer[4]);
  EXPECT_EQ(16389, buffer[7]);
  EXPECT_EQ(17631, buffer[kBufferLength - 1]);
}

#if defined(WEBRTC_IOS)
#define MAYBE_ReadInt16FromFileToFloatBuffer \
  DISABLED_ReadInt16FromFileToFloatBuffer
#else
#define MAYBE_ReadInt16FromFileToFloatBuffer ReadInt16FromFileToFloatBuffer
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16FromFileToFloatBuffer) {
  std::string test_filename = kTestFileName;

  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  file->OpenFile(test_filename.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();

  const size_t kBufferLength = 12;
  std::unique_ptr<float[]> buffer(new float[kBufferLength]);

  EXPECT_EQ(kBufferLength, ReadInt16FromFileToFloatBuffer(
                               file.get(), kBufferLength, buffer.get()));

  EXPECT_DOUBLE_EQ(11544, buffer[0]);
  EXPECT_DOUBLE_EQ(22377, buffer[4]);
  EXPECT_DOUBLE_EQ(16389, buffer[7]);
  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);

  file->Rewind();

  // The next test is for checking the case where there are not as much data as
  // needed in the file, but reads to the end, and it returns the number of
  // int16s read.
  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
  buffer.reset(new float[kBufferLenghtLargerThanFile]);
  EXPECT_EQ(kBufferLength,
            ReadInt16FromFileToFloatBuffer(
                file.get(), kBufferLenghtLargerThanFile, buffer.get()));
  EXPECT_DOUBLE_EQ(11544, buffer[0]);
  EXPECT_DOUBLE_EQ(22377, buffer[4]);
  EXPECT_DOUBLE_EQ(16389, buffer[7]);
  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);
}

#if defined(WEBRTC_IOS)
#define MAYBE_ReadInt16FromFileToDoubleBuffer \
  DISABLED_ReadInt16FromFileToDoubleBuffer
#else
#define MAYBE_ReadInt16FromFileToDoubleBuffer ReadInt16FromFileToDoubleBuffer
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16FromFileToDoubleBuffer) {
  std::string test_filename = kTestFileName;

  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  file->OpenFile(test_filename.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();

  const size_t kBufferLength = 12;
  std::unique_ptr<double[]> buffer(new double[kBufferLength]);

  EXPECT_EQ(kBufferLength, ReadInt16FromFileToDoubleBuffer(
                               file.get(), kBufferLength, buffer.get()));
  EXPECT_DOUBLE_EQ(11544, buffer[0]);
  EXPECT_DOUBLE_EQ(22377, buffer[4]);
  EXPECT_DOUBLE_EQ(16389, buffer[7]);
  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);

  file->Rewind();

  // The next test is for checking the case where there are not as much data as
  // needed in the file, but reads to the end, and it returns the number of
  // int16s read.
  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
  buffer.reset(new double[kBufferLenghtLargerThanFile]);
  EXPECT_EQ(kBufferLength,
            ReadInt16FromFileToDoubleBuffer(
                file.get(), kBufferLenghtLargerThanFile, buffer.get()));
  EXPECT_DOUBLE_EQ(11544, buffer[0]);
  EXPECT_DOUBLE_EQ(22377, buffer[4]);
  EXPECT_DOUBLE_EQ(16389, buffer[7]);
  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);
}

#if defined(WEBRTC_IOS)
#define MAYBE_ReadFloatBufferFromFile DISABLED_ReadFloatBufferFromFile
#else
#define MAYBE_ReadFloatBufferFromFile ReadFloatBufferFromFile
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ReadFloatBufferFromFile) {
  std::string test_filename = kTestFileNamef;

  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  file->OpenFile(test_filename.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kTestFileNamef.c_str();

  const size_t kBufferLength = 3;
  std::unique_ptr<float[]> buffer(new float[kBufferLength]);

  EXPECT_EQ(kBufferLength,
            ReadFloatBufferFromFile(file.get(), kBufferLength, buffer.get()));
  EXPECT_FLOAT_EQ(kPi, buffer[0]);
  EXPECT_FLOAT_EQ(kE, buffer[1]);
  EXPECT_FLOAT_EQ(kAvogadro, buffer[2]);

  file->Rewind();

  // The next test is for checking the case where there are not as much data as
  // needed in the file, but reads to the end, and it returns the number of
  // doubles read.
  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
  buffer.reset(new float[kBufferLenghtLargerThanFile]);
  EXPECT_EQ(kBufferLength,
            ReadFloatBufferFromFile(file.get(), kBufferLenghtLargerThanFile,
                                    buffer.get()));
  EXPECT_FLOAT_EQ(kPi, buffer[0]);
  EXPECT_FLOAT_EQ(kE, buffer[1]);
  EXPECT_FLOAT_EQ(kAvogadro, buffer[2]);
}

#if defined(WEBRTC_IOS)
#define MAYBE_ReadDoubleBufferFromFile DISABLED_ReadDoubleBufferFromFile
#else
#define MAYBE_ReadDoubleBufferFromFile ReadDoubleBufferFromFile
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ReadDoubleBufferFromFile) {
  std::string test_filename = kTestFileName;

  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  file->OpenFile(test_filename.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();

  const size_t kBufferLength = 3;
  std::unique_ptr<double[]> buffer(new double[kBufferLength]);

  EXPECT_EQ(kBufferLength,
            ReadDoubleBufferFromFile(file.get(), kBufferLength, buffer.get()));
  EXPECT_DOUBLE_EQ(kPi, buffer[0]);
  EXPECT_DOUBLE_EQ(kE, buffer[1]);
  EXPECT_DOUBLE_EQ(kAvogadro, buffer[2]);

  file->Rewind();

  // The next test is for checking the case where there are not as much data as
  // needed in the file, but reads to the end, and it returns the number of
  // doubles read.
  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
  buffer.reset(new double[kBufferLenghtLargerThanFile]);
  EXPECT_EQ(kBufferLength,
            ReadDoubleBufferFromFile(file.get(), kBufferLenghtLargerThanFile,
                                     buffer.get()));
  EXPECT_DOUBLE_EQ(kPi, buffer[0]);
  EXPECT_DOUBLE_EQ(kE, buffer[1]);
  EXPECT_DOUBLE_EQ(kAvogadro, buffer[2]);
}

#if defined(WEBRTC_IOS)
#define MAYBE_WriteInt16BufferToFile DISABLED_WriteInt16BufferToFile
#else
#define MAYBE_WriteInt16BufferToFile WriteInt16BufferToFile
#endif
TEST_F(TransientFileUtilsTest, MAYBE_WriteInt16BufferToFile) {
  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  std::string kOutFileName =
      CreateTempFilename(test::OutputPath(), "utils_test");

  file->OpenFile(kOutFileName.c_str(), false);  // Write mode.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();

  const size_t kBufferLength = 3;
  std::unique_ptr<int16_t[]> written_buffer(new int16_t[kBufferLength]);
  std::unique_ptr<int16_t[]> read_buffer(new int16_t[kBufferLength]);

  written_buffer[0] = 1;
  written_buffer[1] = 2;
  written_buffer[2] = 3;

  EXPECT_EQ(kBufferLength, WriteInt16BufferToFile(file.get(), kBufferLength,
                                                  written_buffer.get()));

  file->CloseFile();

  file->OpenFile(kOutFileName.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();

  EXPECT_EQ(kBufferLength, ReadInt16BufferFromFile(file.get(), kBufferLength,
                                                   read_buffer.get()));
  EXPECT_EQ(0, memcmp(written_buffer.get(), read_buffer.get(),
                      kBufferLength * sizeof(written_buffer[0])));
}

#if defined(WEBRTC_IOS)
#define MAYBE_WriteFloatBufferToFile DISABLED_WriteFloatBufferToFile
#else
#define MAYBE_WriteFloatBufferToFile WriteFloatBufferToFile
#endif
TEST_F(TransientFileUtilsTest, MAYBE_WriteFloatBufferToFile) {
  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  std::string kOutFileName =
      CreateTempFilename(test::OutputPath(), "utils_test");

  file->OpenFile(kOutFileName.c_str(), false);  // Write mode.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();

  const size_t kBufferLength = 3;
  std::unique_ptr<float[]> written_buffer(new float[kBufferLength]);
  std::unique_ptr<float[]> read_buffer(new float[kBufferLength]);

  written_buffer[0] = static_cast<float>(kPi);
  written_buffer[1] = static_cast<float>(kE);
  written_buffer[2] = static_cast<float>(kAvogadro);

  EXPECT_EQ(kBufferLength, WriteFloatBufferToFile(file.get(), kBufferLength,
                                                  written_buffer.get()));

  file->CloseFile();

  file->OpenFile(kOutFileName.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();

  EXPECT_EQ(kBufferLength, ReadFloatBufferFromFile(file.get(), kBufferLength,
                                                   read_buffer.get()));
  EXPECT_EQ(0, memcmp(written_buffer.get(), read_buffer.get(),
                      kBufferLength * sizeof(written_buffer[0])));
}

#if defined(WEBRTC_IOS)
#define MAYBE_WriteDoubleBufferToFile DISABLED_WriteDoubleBufferToFile
#else
#define MAYBE_WriteDoubleBufferToFile WriteDoubleBufferToFile
#endif
TEST_F(TransientFileUtilsTest, MAYBE_WriteDoubleBufferToFile) {
  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  std::string kOutFileName =
      CreateTempFilename(test::OutputPath(), "utils_test");

  file->OpenFile(kOutFileName.c_str(), false);  // Write mode.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();

  const size_t kBufferLength = 3;
  std::unique_ptr<double[]> written_buffer(new double[kBufferLength]);
  std::unique_ptr<double[]> read_buffer(new double[kBufferLength]);

  written_buffer[0] = kPi;
  written_buffer[1] = kE;
  written_buffer[2] = kAvogadro;

  EXPECT_EQ(kBufferLength, WriteDoubleBufferToFile(file.get(), kBufferLength,
                                                   written_buffer.get()));

  file->CloseFile();

  file->OpenFile(kOutFileName.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();

  EXPECT_EQ(kBufferLength, ReadDoubleBufferFromFile(file.get(), kBufferLength,
                                                    read_buffer.get()));
  EXPECT_EQ(0, memcmp(written_buffer.get(), read_buffer.get(),
                      kBufferLength * sizeof(written_buffer[0])));
}

#if defined(WEBRTC_IOS)
#define MAYBE_ExpectedErrorReturnValues DISABLED_ExpectedErrorReturnValues
#else
#define MAYBE_ExpectedErrorReturnValues ExpectedErrorReturnValues
#endif
TEST_F(TransientFileUtilsTest, MAYBE_ExpectedErrorReturnValues) {
  std::string test_filename = kTestFileName;

  double value;
  std::unique_ptr<int16_t[]> int16_buffer(new int16_t[1]);
  std::unique_ptr<double[]> double_buffer(new double[1]);
  std::unique_ptr<FileWrapper> file(FileWrapper::Create());

  EXPECT_EQ(-1, ConvertByteArrayToDouble(NULL, &value));
  EXPECT_EQ(-1, ConvertByteArrayToDouble(kPiBytes, NULL));

  EXPECT_EQ(-1, ConvertDoubleToByteArray(kPi, NULL));

  // Tests with file not opened.
  EXPECT_EQ(0u, ReadInt16BufferFromFile(file.get(), 1, int16_buffer.get()));
  EXPECT_EQ(
      0u, ReadInt16FromFileToDoubleBuffer(file.get(), 1, double_buffer.get()));
  EXPECT_EQ(0u, ReadDoubleBufferFromFile(file.get(), 1, double_buffer.get()));
  EXPECT_EQ(0u, WriteInt16BufferToFile(file.get(), 1, int16_buffer.get()));
  EXPECT_EQ(0u, WriteDoubleBufferToFile(file.get(), 1, double_buffer.get()));

  file->OpenFile(test_filename.c_str(), true);  // Read only.
  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();

  EXPECT_EQ(0u, ReadInt16BufferFromFile(NULL, 1, int16_buffer.get()));
  EXPECT_EQ(0u, ReadInt16BufferFromFile(file.get(), 1, NULL));
  EXPECT_EQ(0u, ReadInt16BufferFromFile(file.get(), 0, int16_buffer.get()));

  EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(NULL, 1, double_buffer.get()));
  EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(file.get(), 1, NULL));
  EXPECT_EQ(
      0u, ReadInt16FromFileToDoubleBuffer(file.get(), 0, double_buffer.get()));

  EXPECT_EQ(0u, ReadDoubleBufferFromFile(NULL, 1, double_buffer.get()));
  EXPECT_EQ(0u, ReadDoubleBufferFromFile(file.get(), 1, NULL));
  EXPECT_EQ(0u, ReadDoubleBufferFromFile(file.get(), 0, double_buffer.get()));

  EXPECT_EQ(0u, WriteInt16BufferToFile(NULL, 1, int16_buffer.get()));
  EXPECT_EQ(0u, WriteInt16BufferToFile(file.get(), 1, NULL));
  EXPECT_EQ(0u, WriteInt16BufferToFile(file.get(), 0, int16_buffer.get()));

  EXPECT_EQ(0u, WriteDoubleBufferToFile(NULL, 1, double_buffer.get()));
  EXPECT_EQ(0u, WriteDoubleBufferToFile(file.get(), 1, NULL));
  EXPECT_EQ(0u, WriteDoubleBufferToFile(file.get(), 0, double_buffer.get()));
}

}  // namespace webrtc
