| // 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 <optional> |
| #include <set> |
| #include <vector> |
| |
| #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<int> 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<BlockTestsWritingToSpecialDirs>& Get(); |
| |
| // `blocked_paths_` will be initialized lazily, from `blocked_dirs_`. |
| std::set<FilePath> blocked_paths_; |
| std::vector<int> blocked_dirs_; |
| FileWriteBlockedForTestingFunctionPtr failure_callback_ = nullptr; |
| }; |
| |
| } // namespace base |
| |
| #endif // BASE_FILES_BLOCK_TESTS_WRITING_TO_SPECIAL_DIRS_H_ |