// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/test/test_file_util.h"

#include <windows.h>
#include <string>

#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/win/scoped_handle.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {

namespace {

class ScopedFileForTest {
 public:
  ScopedFileForTest(const FilePath& filename)
      : long_path_(L"\\\\?\\" + filename.value()) {
    win::ScopedHandle handle(::CreateFile(long_path_.c_str(), GENERIC_WRITE, 0,
                                          nullptr, CREATE_NEW,
                                          FILE_ATTRIBUTE_NORMAL, nullptr));

    valid_ = handle.is_valid();
  }

  ScopedFileForTest(ScopedFileForTest&&) = delete;
  ScopedFileForTest& operator=(ScopedFileForTest&&) = delete;

  bool IsValid() const { return valid_; }

  ~ScopedFileForTest() {
    if (valid_)
      ::DeleteFile(long_path_.c_str());
  }

 private:
  FilePath::StringType long_path_;
  bool valid_;
};

}  // namespace

TEST(TestFileUtil, EvictNonExistingFile) {
  ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());

  FilePath path = temp_dir.GetPath().Append(FilePath(L"non_existing"));

  ASSERT_FALSE(EvictFileFromSystemCache(path));
}

TEST(TestFileUtil, EvictFileWithShortName) {
  ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());

  FilePath temp_file = temp_dir.GetPath().Append(FilePath(L"file_for_evict"));
  ASSERT_TRUE(temp_file.value().length() < MAX_PATH);
  ScopedFileForTest file(temp_file);
  ASSERT_TRUE(file.IsValid());

  ASSERT_TRUE(EvictFileFromSystemCache(temp_file));
}

TEST(TestFileUtil, EvictFileWithLongName) {
  ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());

  // Create subdirectory with long name.
  FilePath subdir =
      temp_dir.GetPath().Append(FilePath(std::wstring(100, L'a')));
  ASSERT_TRUE(subdir.value().length() < MAX_PATH);
  ASSERT_TRUE(CreateDirectory(subdir));

  // Create file with long name in subdirectory.
  FilePath temp_file = subdir.Append(FilePath(std::wstring(200, L'b')));
  ASSERT_TRUE(temp_file.value().length() > MAX_PATH);
  ScopedFileForTest file(temp_file);
  ASSERT_TRUE(file.IsValid());

  ASSERT_TRUE(EvictFileFromSystemCache(temp_file));
}

TEST(TestFileUtil, GetTempDirForTesting) {
  ASSERT_FALSE(GetTempDirForTesting().value().empty());
}

}  // namespace base
