// Copyright 2020 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 <string>
#include <vector>

#include "starboard/common/log.h"
#include "starboard/configuration.h"
#include "starboard/file.h"
#include "starboard/memory.h"
#include "starboard/nplb/nplb_evergreen_compat_tests/checks.h"
#include "starboard/system.h"
#include "testing/gtest/include/gtest/gtest.h"

#if SB_IS(EVERGREEN_COMPATIBLE)

namespace starboard {
namespace nplb {
namespace nplb_evergreen_compat_tests {

namespace {

const char kFileName[] = "test_file.data";
const size_t kBufSize = 96 * 1024 * 1024;  // 96 MB

class StorageTest : public ::testing::Test {
 protected:
  StorageTest() {}
  ~StorageTest() {}
};

void WriteBuffer(const char* file_path,
                 const char* buffer,
                 size_t buffer_size) {
  SbFileError error;
  ScopedFile file(file_path, kSbFileOpenAlways | kSbFileWrite, nullptr, &error);
  ASSERT_EQ(kSbFileOk, error) << "Failed to open file for writing";
  int bytes_written = file.WriteAll(buffer, buffer_size);
  ASSERT_EQ(kBufSize, bytes_written);
}

void ReadBuffer(const char* file_path, char* buffer, size_t buffer_size) {
  SbFileError error;
  ScopedFile file(file_path, kSbFileOpenOnly | kSbFileRead, nullptr, &error);
  ASSERT_EQ(kSbFileOk, error) << "Failed to open file for reading";
  int count = file.ReadAll(buffer, buffer_size);
  ASSERT_EQ(kBufSize, count);
}

TEST_F(StorageTest, VerifyStorageDirectory) {
  std::vector<char> storage_dir(kSbFileMaxPath);
  ASSERT_TRUE(SbSystemGetPath(kSbSystemPathStorageDirectory, storage_dir.data(),
                              kSbFileMaxPath));

  std::string file_path = storage_dir.data();
  file_path += kSbFileSepString;
  file_path += kFileName;
  SB_LOG(INFO) << "file: " << file_path;

  std::vector<char> buf(kBufSize);
  SbMemorySet(buf.data(), 'A', kBufSize);

  WriteBuffer(file_path.c_str(), buf.data(), kBufSize);

  SbMemorySet(buf.data(), 0, kBufSize);

  ReadBuffer(file_path.c_str(), buf.data(), kBufSize);

  for (int i = 0; i < kBufSize; i++) {
    ASSERT_EQ('A', buf[i]);
  }

  ASSERT_TRUE(SbFileDelete(file_path.data()));
  ASSERT_FALSE(SbFileExists(file_path.data()));
}

}  // namespace
}  // namespace nplb_evergreen_compat_tests
}  // namespace nplb
}  // namespace starboard

#endif  // SB_IS(EVERGREEN_COMPATIBLE)
