| /* | 
 |  *  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/file_utils.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; | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str()); | 
 |   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, 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, 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; | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str()); | 
 |   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, 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, 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; | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str()); | 
 |   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, 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, 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; | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str()); | 
 |   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, 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, 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; | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str()); | 
 |   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, 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, 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::string kOutFileName = | 
 |       CreateTempFilename(test::OutputPath(), "utils_test"); | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName.c_str()); | 
 |   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, kBufferLength, written_buffer.get())); | 
 |  | 
 |   file.Close(); | 
 |  | 
 |   file = FileWrapper::OpenReadOnly(kOutFileName.c_str()); | 
 |   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n" | 
 |                               << kOutFileName.c_str(); | 
 |  | 
 |   EXPECT_EQ(kBufferLength, | 
 |             ReadInt16BufferFromFile(&file, 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::string kOutFileName = | 
 |       CreateTempFilename(test::OutputPath(), "utils_test"); | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName.c_str()); | 
 |   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, kBufferLength, written_buffer.get())); | 
 |  | 
 |   file.Close(); | 
 |  | 
 |   file = FileWrapper::OpenReadOnly(kOutFileName.c_str()); | 
 |   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n" | 
 |                               << kOutFileName.c_str(); | 
 |  | 
 |   EXPECT_EQ(kBufferLength, | 
 |             ReadFloatBufferFromFile(&file, 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::string kOutFileName = | 
 |       CreateTempFilename(test::OutputPath(), "utils_test"); | 
 |  | 
 |   FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName.c_str()); | 
 |   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, kBufferLength, | 
 |                                                    written_buffer.get())); | 
 |  | 
 |   file.Close(); | 
 |  | 
 |   file = FileWrapper::OpenReadOnly(kOutFileName.c_str()); | 
 |   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n" | 
 |                               << kOutFileName.c_str(); | 
 |  | 
 |   EXPECT_EQ(kBufferLength, | 
 |             ReadDoubleBufferFromFile(&file, 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]); | 
 |   FileWrapper file; | 
 |  | 
 |   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, 1, int16_buffer.get())); | 
 |   EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(&file, 1, double_buffer.get())); | 
 |   EXPECT_EQ(0u, ReadDoubleBufferFromFile(&file, 1, double_buffer.get())); | 
 |   EXPECT_EQ(0u, WriteInt16BufferToFile(&file, 1, int16_buffer.get())); | 
 |   EXPECT_EQ(0u, WriteDoubleBufferToFile(&file, 1, double_buffer.get())); | 
 |  | 
 |   file = FileWrapper::OpenReadOnly(test_filename.c_str()); | 
 |   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, 1, NULL)); | 
 |   EXPECT_EQ(0u, ReadInt16BufferFromFile(&file, 0, int16_buffer.get())); | 
 |  | 
 |   EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(NULL, 1, double_buffer.get())); | 
 |   EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(&file, 1, NULL)); | 
 |   EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(&file, 0, double_buffer.get())); | 
 |  | 
 |   EXPECT_EQ(0u, ReadDoubleBufferFromFile(NULL, 1, double_buffer.get())); | 
 |   EXPECT_EQ(0u, ReadDoubleBufferFromFile(&file, 1, NULL)); | 
 |   EXPECT_EQ(0u, ReadDoubleBufferFromFile(&file, 0, double_buffer.get())); | 
 |  | 
 |   EXPECT_EQ(0u, WriteInt16BufferToFile(NULL, 1, int16_buffer.get())); | 
 |   EXPECT_EQ(0u, WriteInt16BufferToFile(&file, 1, NULL)); | 
 |   EXPECT_EQ(0u, WriteInt16BufferToFile(&file, 0, int16_buffer.get())); | 
 |  | 
 |   EXPECT_EQ(0u, WriteDoubleBufferToFile(NULL, 1, double_buffer.get())); | 
 |   EXPECT_EQ(0u, WriteDoubleBufferToFile(&file, 1, NULL)); | 
 |   EXPECT_EQ(0u, WriteDoubleBufferToFile(&file, 0, double_buffer.get())); | 
 | } | 
 |  | 
 | }  // namespace webrtc |