// 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. #ifndef BASE_FILES_BLOCK_TESTS_WRITING_TO_SPECIAL_DIRS_H_ #define BASE_FILES_BLOCK_TESTS_WRITING_TO_SPECIAL_DIRS_H_ #include #include #include #include "base/base_export.h" #include "base/gtest_prod_util.h" namespace base { class FilePath; using FileWriteBlockedForTestingFunctionPtr = void (*)(const FilePath&); // Utility class for production code to check if writing to special directories // is blocked for tests. class BASE_EXPORT BlockTestsWritingToSpecialDirs { public: static bool CanWriteToPath(const FilePath& path); BlockTestsWritingToSpecialDirs( std::vector blocked_dirs, FileWriteBlockedForTestingFunctionPtr failure_callback); BlockTestsWritingToSpecialDirs( const BlockTestsWritingToSpecialDirs& blocker) = delete; BlockTestsWritingToSpecialDirs& operator=( const BlockTestsWritingToSpecialDirs&) = delete; ~BlockTestsWritingToSpecialDirs(); private: friend class BlockTestsWritingToSpecialDirsTest; friend class ScopedBlockTestsWritingToSpecialDirs; // This private method is used by `ScopedBlockTestsWritingToSpecialDirs` to // create an object of this class stored in a function static object. // `CanWriteToPath` above checks the paths stored in that object, if it is // set. Thus, only ScopedBlockTestsWritingToSpecialDirs should be able to // block tests writing to special dirs. static std::optional& Get(); // `blocked_paths_` will be initialized lazily, from `blocked_dirs_`. std::set blocked_paths_; std::vector blocked_dirs_; FileWriteBlockedForTestingFunctionPtr failure_callback_ = nullptr; }; } // namespace base #endif // BASE_FILES_BLOCK_TESTS_WRITING_TO_SPECIAL_DIRS_H_