// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "starboard/shared/starboard/player/file_cache_reader.h"

#include <algorithm>
#include <string>
#include <vector>

#include "starboard/configuration_constants.h"
#include "starboard/file.h"
#include "starboard/memory.h"
#include "starboard/shared/starboard/player/filter/testing/test_util.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace starboard {
namespace shared {
namespace starboard {
namespace player {
namespace filter {
namespace testing {
namespace {

const char kTestFilename[] = "beneath_the_canopy_aac_stereo.dmp";

class FileCacheReaderTest : public ::testing::Test {
 public:
  FileCacheReaderTest()
      : file_cache_reader_(ResolveTestFileName(kTestFilename).c_str(),
                           1024 * 1024) {}

 protected:
  FileCacheReader file_cache_reader_;
};

TEST_F(FileCacheReaderTest, FileCacheReader) {
  const std::vector<int> sizes_to_read = {0, 1, 2, 3, 4, 0, 5, 8, 13};

  std::vector<char> true_contents;
  {
    // Use a 5MB snippet from the true file to compare against.
    const size_t kTestSize = 5 * 1024 * 1024;
    ScopedFile file(ResolveTestFileName(kTestFilename).c_str(),
                    kSbFileOpenOnly | kSbFileRead);
    true_contents.resize(kTestSize);
    int bytes_read = file.ReadAll(true_contents.data(), kTestSize);
    SB_CHECK(bytes_read == kTestSize);
  }

  // Output buffer for file reading, when it is read in chunks.
  std::vector<char> read_contents;

  int true_offset = 0;
  int size_index = 0;
  while (true_offset < true_contents.size()) {
    auto size_to_read =
        std::min(sizes_to_read[size_index],
                 static_cast<int>(true_contents.size()) - true_offset);
    size_index = (size_index + 1) % sizes_to_read.size();

    read_contents.resize(size_to_read);
    int bytes_read =
        file_cache_reader_.Read(read_contents.data(), size_to_read);

    ASSERT_EQ(bytes_read, size_to_read);
    // Compare the true content of these files, with the chunked contents of
    // these files to ensure that file I/O is working as expected.
    int result = SbMemoryCompare(
        read_contents.data(), true_contents.data() + true_offset, bytes_read);
    ASSERT_EQ(0, result);
    true_offset += bytes_read;
  }
  EXPECT_EQ(true_offset, true_contents.size());
}

}  // namespace
}  // namespace testing
}  // namespace filter
}  // namespace player
}  // namespace starboard
}  // namespace shared
}  // namespace starboard
