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

#include "components/update_client/background_downloader_win.h"

#include <windows.h>

#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/memory/scoped_refptr.h"
#include "base/test/task_environment.h"
#include "base/win/windows_types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace update_client {
namespace {
constexpr base::FilePath::CharType kTestDirPrefix[] =
    FILE_PATH_LITERAL("BackgroundDownloaderWinTest_chrome_BITS_(test)_");
constexpr base::FilePath::CharType kTestDirMatcher[] =
    FILE_PATH_LITERAL("BackgroundDownloaderWinTest_chrome_BITS_(test)_*");
constexpr wchar_t kTestDownloadFilename[] = L"test_file.txt";
constexpr char kTestDownloadContent[] = "Hello, World!";
}  // namespace

class BackgroundDownloaderWinTest : public testing::Test {
 protected:
  // Overrides from testing::Test
  void TearDown() override;

  base::test::TaskEnvironment task_environment_;
  scoped_refptr<BackgroundDownloader> downloader_ =
      base::MakeRefCounted<BackgroundDownloader>(nullptr,
                                                 "BackgroundDownloaderWinTest");
};

void BackgroundDownloaderWinTest::TearDown() {
  downloader_->EnumerateDownloadDirs(
      kTestDirMatcher,
      [](const base::FilePath& dir) { base::DeletePathRecursively(dir); });
}

TEST_F(BackgroundDownloaderWinTest, CleansStaleDownloads) {
  base::FilePath download_dir_path;
  ASSERT_TRUE(base::CreateNewTempDirectory(kTestDirPrefix, &download_dir_path));
  ASSERT_TRUE(base::WriteFile(download_dir_path.Append(kTestDownloadFilename),
                              kTestDownloadContent));

  // Manipulate the creation time of the directory.
  FILETIME creation_filetime =
      (base::Time::NowFromSystemTime() - base::Days(5)).ToFileTime();
  base::File download_dir(download_dir_path,
                          base::File::FLAG_OPEN |
                              base::File::FLAG_WIN_BACKUP_SEMANTICS |
                              base::File::FLAG_WRITE_ATTRIBUTES);
  ASSERT_TRUE(download_dir.IsValid());
  ASSERT_TRUE(::SetFileTime(download_dir.GetPlatformFile(), &creation_filetime,
                            NULL, NULL));
  download_dir.Close();
  downloader_->CleanupStaleDownloads();
  EXPECT_FALSE(base::DirectoryExists(download_dir_path));
}

TEST_F(BackgroundDownloaderWinTest, RetainsRecentDownloads) {
  base::FilePath download_dir_path;
  ASSERT_TRUE(base::CreateNewTempDirectory(kTestDirPrefix, &download_dir_path));
  ASSERT_TRUE(base::WriteFile(download_dir_path.Append(kTestDownloadFilename),
                              kTestDownloadContent));
  downloader_->CleanupStaleDownloads();
  EXPECT_TRUE(base::DirectoryExists(download_dir_path));
}

}  // namespace update_client
