// 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 = 128 * 1024 * 1024;  // 128 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)
