|  | // 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 |