// Copyright 2023 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/loader_app/reset_evergreen_update.h"

#include <string>
#include <vector>

#include "starboard/common/file.h"
#include "starboard/directory.h"
#include "testing/gtest/include/gtest/gtest.h"

#if SB_IS(EVERGREEN_COMPATIBLE)

namespace starboard {
namespace loader_app {
namespace {

TEST(ResetEvergreenUpdateTest, TestSunnyDayFile) {
  std::vector<char> storage_path(kSbFileMaxPath);
  ASSERT_TRUE(SbSystemGetPath(kSbSystemPathStorageDirectory,
                              storage_path.data(), kSbFileMaxPath));

  std::string file_path = storage_path.data();
  file_path += kSbFileSepString;
  file_path += "test.txt";
  SB_LOG(INFO) << "file: " << file_path;

  {
    SbFileError error;
    ScopedFile file(file_path.c_str(), kSbFileOpenAlways | kSbFileWrite,
                    nullptr, &error);
    ASSERT_EQ(kSbFileOk, error) << "Failed to open file for writing";
    std::string data = "abc";
    int bytes_written = file.WriteAll(data.c_str(), data.size());
  }

  ASSERT_TRUE(SbFileExists(file_path.data()));

  ASSERT_TRUE(ResetEvergreenUpdate());

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

TEST(ResetEvergreenUpdateTest, TestSunnyDaySubdir) {
  std::vector<char> storage_path(kSbFileMaxPath);
  ASSERT_TRUE(SbSystemGetPath(kSbSystemPathStorageDirectory,
                              storage_path.data(), kSbFileMaxPath));

  std::string subdir_path = storage_path.data();
  subdir_path += kSbFileSepString;
  subdir_path += "test";
  ASSERT_TRUE(SbDirectoryCreate(subdir_path.c_str()));

  std::string file_path = subdir_path.data();
  file_path += kSbFileSepString;
  file_path += "test.txt";
  SB_LOG(INFO) << "file: " << file_path;

  {
    SbFileError error;
    ScopedFile file(file_path.c_str(), kSbFileOpenAlways | kSbFileWrite,
                    nullptr, &error);
    ASSERT_EQ(kSbFileOk, error) << "Failed to open file for writing";
    std::string data = "abc";
    int bytes_written = file.WriteAll(data.c_str(), data.size());
  }

  ASSERT_TRUE(SbFileExists(file_path.data()));

  ASSERT_TRUE(ResetEvergreenUpdate());

  ASSERT_FALSE(SbFileExists(file_path.data()));
  ASSERT_TRUE(SbFileExists(storage_path.data()));
}
}  // namespace
}  // namespace loader_app
}  // namespace starboard

#endif  //  SB_IS(EVERGREEN_COMPATIBLE)
