|
22 | 22 | #include "base/test/task_environment.h"
|
23 | 23 | #include "base/threading/thread.h"
|
24 | 24 | #include "base/time/time.h"
|
| 25 | +#include "build/build_config.h" |
| 26 | +#include "components/file_access/scoped_file_access_delegate.h" |
25 | 27 | #include "net/base/io_buffer.h"
|
26 | 28 | #include "net/base/net_errors.h"
|
27 | 29 | #include "net/base/test_completion_callback.h"
|
28 | 30 | #include "storage/browser/file_system/file_stream_reader_test.h"
|
29 | 31 | #include "storage/browser/file_system/file_stream_test_utils.h"
|
| 32 | +#include "testing/gmock/include/gmock/gmock.h" |
30 | 33 | #include "testing/gtest/include/gtest/gtest.h"
|
31 | 34 |
|
| 35 | +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) |
| 36 | +#include "base/files/scoped_file.h" |
| 37 | +#endif |
| 38 | + |
32 | 39 | namespace storage {
|
33 | 40 |
|
| 41 | +namespace { |
| 42 | + |
| 43 | +using ::testing::_; |
| 44 | + |
| 45 | +class MockScopedFileAccessDelegate |
| 46 | + : public file_access::ScopedFileAccessDelegate { |
| 47 | + public: |
| 48 | + MOCK_METHOD3( |
| 49 | + RequestFilesAccess, |
| 50 | + void(const std::vector<base::FilePath>& files, |
| 51 | + const GURL& destination_url, |
| 52 | + base::OnceCallback<void(file_access::ScopedFileAccess)> callback)); |
| 53 | + MOCK_METHOD2( |
| 54 | + RequestFilesAccessForSystem, |
| 55 | + void(const std::vector<base::FilePath>& files, |
| 56 | + base::OnceCallback<void(file_access::ScopedFileAccess)> callback)); |
| 57 | +}; |
| 58 | + |
| 59 | +file_access::ScopedFileAccess CreateScopedFileAccess(bool allowed) { |
| 60 | +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) |
| 61 | + return file_access::ScopedFileAccess(allowed, base::ScopedFD()); |
| 62 | +#else |
| 63 | + return file_access::ScopedFileAccess(allowed); |
| 64 | +#endif |
| 65 | +} |
| 66 | + |
| 67 | +} // namespace |
| 68 | + |
34 | 69 | class LocalFileStreamReaderTest : public FileStreamReaderTest {
|
35 | 70 | public:
|
36 | 71 | LocalFileStreamReaderTest() : file_thread_("TestFileThread") {}
|
@@ -100,4 +135,52 @@ INSTANTIATE_TYPED_TEST_SUITE_P(Local,
|
100 | 135 | FileStreamReaderTypedTest,
|
101 | 136 | LocalFileStreamReaderTest);
|
102 | 137 |
|
| 138 | +// TODO(crbug.com/1354502): Use RequestFileAccess() instead of |
| 139 | +// RequestFileAccessForSystem() when destionion URLs can be obtained in |
| 140 | +// //storage/. |
| 141 | +TEST_F(LocalFileStreamReaderTest, ReadAllowedByDataLeakPrevention) { |
| 142 | + this->WriteTestFile(); |
| 143 | + std::unique_ptr<FileStreamReader> reader( |
| 144 | + this->CreateFileReader(std::string(this->kTestFileName), 0, |
| 145 | + this->test_file_modification_time())); |
| 146 | + |
| 147 | + MockScopedFileAccessDelegate scoped_file_access_delegate; |
| 148 | + EXPECT_CALL(scoped_file_access_delegate, RequestFilesAccessForSystem(_, _)) |
| 149 | + .WillOnce([&](const std::vector<base::FilePath>& files, |
| 150 | + base::OnceCallback<void(file_access::ScopedFileAccess)> |
| 151 | + callback) { |
| 152 | + std::move(callback).Run(CreateScopedFileAccess(true)); |
| 153 | + }); |
| 154 | + |
| 155 | + int result = 0; |
| 156 | + std::string data; |
| 157 | + ReadFromReader(reader.get(), &data, this->kTestData.size(), &result); |
| 158 | + ASSERT_EQ(net::OK, result); |
| 159 | + ASSERT_EQ(this->kTestData, data); |
| 160 | +} |
| 161 | + |
| 162 | +// TODO(crbug.com/1354502): Use RequestFileAccess() instead of |
| 163 | +// RequestFileAccessForSystem() when destionion URLs can be obtained in |
| 164 | +// //storage/. |
| 165 | +TEST_F(LocalFileStreamReaderTest, ReadBlockedByDataLeakPrevention) { |
| 166 | + this->WriteTestFile(); |
| 167 | + std::unique_ptr<FileStreamReader> reader( |
| 168 | + this->CreateFileReader(std::string(this->kTestFileName), 0, |
| 169 | + this->test_file_modification_time())); |
| 170 | + |
| 171 | + MockScopedFileAccessDelegate scoped_file_access_delegate; |
| 172 | + EXPECT_CALL(scoped_file_access_delegate, RequestFilesAccessForSystem(_, _)) |
| 173 | + .WillOnce([&](const std::vector<base::FilePath>& files, |
| 174 | + base::OnceCallback<void(file_access::ScopedFileAccess)> |
| 175 | + callback) { |
| 176 | + std::move(callback).Run(CreateScopedFileAccess(false)); |
| 177 | + }); |
| 178 | + |
| 179 | + int result = 0; |
| 180 | + std::string data; |
| 181 | + ReadFromReader(reader.get(), &data, this->kTestData.size(), &result); |
| 182 | + ASSERT_EQ(net::ERR_ACCESS_DENIED, result); |
| 183 | + ASSERT_EQ("", data); |
| 184 | +} |
| 185 | + |
103 | 186 | } // namespace storage
|
0 commit comments