Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1142)

Side by Side Diff: webkit/browser/fileapi/local_file_system_operation_write_unittest.cc

Issue 21370003: Rename fileapi::LocalFileSystemOperation to FileSystemOperationImpl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <vector>
6
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/weak_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/message_loop/message_loop_proxy.h"
12 #include "net/url_request/url_request.h"
13 #include "net/url_request/url_request_context.h"
14 #include "net/url_request/url_request_job.h"
15 #include "net/url_request/url_request_job_factory_impl.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "url/gurl.h"
18 #include "webkit/browser/blob/blob_storage_controller.h"
19 #include "webkit/browser/blob/blob_url_request_job.h"
20 #include "webkit/browser/blob/mock_blob_url_request_context.h"
21 #include "webkit/browser/fileapi/file_system_context.h"
22 #include "webkit/browser/fileapi/file_system_file_util.h"
23 #include "webkit/browser/fileapi/file_system_operation_context.h"
24 #include "webkit/browser/fileapi/file_system_operation_runner.h"
25 #include "webkit/browser/fileapi/local_file_util.h"
26 #include "webkit/browser/fileapi/mock_file_change_observer.h"
27 #include "webkit/browser/fileapi/mock_file_system_context.h"
28 #include "webkit/browser/fileapi/test_file_system_backend.h"
29 #include "webkit/browser/quota/mock_quota_manager.h"
30 #include "webkit/common/blob/blob_data.h"
31 #include "webkit/common/fileapi/file_system_util.h"
32
33 using webkit_blob::MockBlobURLRequestContext;
34 using webkit_blob::ScopedTextBlob;
35
36 namespace fileapi {
37
38 namespace {
39
40 const GURL kOrigin("http://example.com");
41 const FileSystemType kFileSystemType = kFileSystemTypeTest;
42
43 void AssertStatusEq(base::PlatformFileError expected,
44 base::PlatformFileError actual) {
45 ASSERT_EQ(expected, actual);
46 }
47
48 } // namespace
49
50 class LocalFileSystemOperationWriteTest
51 : public testing::Test,
52 public base::SupportsWeakPtr<LocalFileSystemOperationWriteTest> {
53 public:
54 LocalFileSystemOperationWriteTest()
55 : loop_(base::MessageLoop::TYPE_IO),
56 status_(base::PLATFORM_FILE_OK),
57 cancel_status_(base::PLATFORM_FILE_ERROR_FAILED),
58 bytes_written_(0),
59 complete_(false) {
60 change_observers_ = MockFileChangeObserver::CreateList(&change_observer_);
61 }
62
63 virtual void SetUp() {
64 ASSERT_TRUE(dir_.CreateUniqueTempDir());
65
66 quota_manager_ =
67 new quota::MockQuotaManager(false /* is_incognito */,
68 dir_.path(),
69 base::MessageLoopProxy::current().get(),
70 base::MessageLoopProxy::current().get(),
71 NULL /* special storage policy */);
72 virtual_path_ = base::FilePath(FILE_PATH_LITERAL("temporary file"));
73
74 file_system_context_ = CreateFileSystemContextForTesting(
75 quota_manager_->proxy(), dir_.path());
76 url_request_context_.reset(
77 new MockBlobURLRequestContext(file_system_context_.get()));
78
79 file_system_context_->operation_runner()->CreateFile(
80 URLForPath(virtual_path_), true /* exclusive */,
81 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK));
82
83 static_cast<TestFileSystemBackend*>(
84 file_system_context_->GetFileSystemBackend(kFileSystemType))
85 ->AddFileChangeObserver(change_observer());
86 }
87
88 virtual void TearDown() {
89 quota_manager_ = NULL;
90 file_system_context_ = NULL;
91 base::MessageLoop::current()->RunUntilIdle();
92 }
93
94 base::PlatformFileError status() const { return status_; }
95 base::PlatformFileError cancel_status() const { return cancel_status_; }
96 void add_bytes_written(int64 bytes, bool complete) {
97 bytes_written_ += bytes;
98 EXPECT_FALSE(complete_);
99 complete_ = complete;
100 }
101 int64 bytes_written() const { return bytes_written_; }
102 bool complete() const { return complete_; }
103
104 protected:
105 const ChangeObserverList& change_observers() const {
106 return change_observers_;
107 }
108
109 MockFileChangeObserver* change_observer() {
110 return &change_observer_;
111 }
112
113 FileSystemURL URLForPath(const base::FilePath& path) const {
114 return file_system_context_->CreateCrackedFileSystemURL(
115 kOrigin, kFileSystemType, path);
116 }
117
118 // Callback function for recording test results.
119 FileSystemOperation::WriteCallback RecordWriteCallback() {
120 return base::Bind(&LocalFileSystemOperationWriteTest::DidWrite,
121 AsWeakPtr());
122 }
123
124 FileSystemOperation::StatusCallback RecordCancelCallback() {
125 return base::Bind(&LocalFileSystemOperationWriteTest::DidCancel,
126 AsWeakPtr());
127 }
128
129 void DidWrite(base::PlatformFileError status, int64 bytes, bool complete) {
130 if (status == base::PLATFORM_FILE_OK) {
131 add_bytes_written(bytes, complete);
132 if (complete)
133 base::MessageLoop::current()->Quit();
134 } else {
135 EXPECT_FALSE(complete_);
136 EXPECT_EQ(status_, base::PLATFORM_FILE_OK);
137 complete_ = true;
138 status_ = status;
139 if (base::MessageLoop::current()->is_running())
140 base::MessageLoop::current()->Quit();
141 }
142 }
143
144 void DidCancel(base::PlatformFileError status) {
145 cancel_status_ = status;
146 }
147
148 const MockBlobURLRequestContext& url_request_context() const {
149 return *url_request_context_;
150 }
151
152 scoped_refptr<FileSystemContext> file_system_context_;
153 scoped_refptr<quota::MockQuotaManager> quota_manager_;
154
155 base::MessageLoop loop_;
156
157 base::ScopedTempDir dir_;
158 base::FilePath virtual_path_;
159
160 // For post-operation status.
161 base::PlatformFileError status_;
162 base::PlatformFileError cancel_status_;
163 int64 bytes_written_;
164 bool complete_;
165
166 scoped_ptr<MockBlobURLRequestContext> url_request_context_;
167
168 MockFileChangeObserver change_observer_;
169 ChangeObserverList change_observers_;
170
171 DISALLOW_COPY_AND_ASSIGN(LocalFileSystemOperationWriteTest);
172 };
173
174 TEST_F(LocalFileSystemOperationWriteTest, TestWriteSuccess) {
175 const GURL blob_url("blob:success");
176 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n");
177
178 file_system_context_->operation_runner()->Write(
179 &url_request_context(), URLForPath(virtual_path_), blob_url,
180 0, RecordWriteCallback());
181 base::MessageLoop::current()->Run();
182
183 EXPECT_EQ(14, bytes_written());
184 EXPECT_EQ(base::PLATFORM_FILE_OK, status());
185 EXPECT_TRUE(complete());
186
187 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
188 }
189
190 TEST_F(LocalFileSystemOperationWriteTest, TestWriteZero) {
191 GURL blob_url("blob:zero");
192 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
193
194 url_request_context().blob_storage_controller()
195 ->AddFinishedBlob(blob_url, blob_data.get());
196
197 file_system_context_->operation_runner()->Write(
198 &url_request_context(), URLForPath(virtual_path_),
199 blob_url, 0, RecordWriteCallback());
200 base::MessageLoop::current()->Run();
201
202 url_request_context().blob_storage_controller()->RemoveBlob(blob_url);
203
204 EXPECT_EQ(0, bytes_written());
205 EXPECT_EQ(base::PLATFORM_FILE_OK, status());
206 EXPECT_TRUE(complete());
207
208 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
209 }
210
211 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidBlobUrl) {
212 file_system_context_->operation_runner()->Write(
213 &url_request_context(), URLForPath(virtual_path_),
214 GURL("blob:invalid"), 0, RecordWriteCallback());
215 base::MessageLoop::current()->Run();
216
217 EXPECT_EQ(0, bytes_written());
218 EXPECT_EQ(base::PLATFORM_FILE_ERROR_FAILED, status());
219 EXPECT_TRUE(complete());
220
221 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count());
222 }
223
224 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidFile) {
225 GURL blob_url("blob:writeinvalidfile");
226 ScopedTextBlob blob(url_request_context(), blob_url,
227 "It\'ll not be written.");
228
229 file_system_context_->operation_runner()->Write(
230 &url_request_context(),
231 URLForPath(base::FilePath(FILE_PATH_LITERAL("nonexist"))),
232 blob_url, 0, RecordWriteCallback());
233 base::MessageLoop::current()->Run();
234
235 EXPECT_EQ(0, bytes_written());
236 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status());
237 EXPECT_TRUE(complete());
238
239 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
240 }
241
242 TEST_F(LocalFileSystemOperationWriteTest, TestWriteDir) {
243 base::FilePath virtual_dir_path(FILE_PATH_LITERAL("d"));
244 file_system_context_->operation_runner()->CreateDirectory(
245 URLForPath(virtual_dir_path),
246 true /* exclusive */, false /* recursive */,
247 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK));
248
249 GURL blob_url("blob:writedir");
250 ScopedTextBlob blob(url_request_context(), blob_url,
251 "It\'ll not be written, too.");
252
253 file_system_context_->operation_runner()->Write(
254 &url_request_context(), URLForPath(virtual_dir_path),
255 blob_url, 0, RecordWriteCallback());
256 base::MessageLoop::current()->Run();
257
258 EXPECT_EQ(0, bytes_written());
259 // TODO(kinuko): This error code is platform- or fileutil- dependent
260 // right now. Make it return PLATFORM_FILE_ERROR_NOT_A_FILE in every case.
261 EXPECT_TRUE(status() == base::PLATFORM_FILE_ERROR_NOT_A_FILE ||
262 status() == base::PLATFORM_FILE_ERROR_ACCESS_DENIED ||
263 status() == base::PLATFORM_FILE_ERROR_FAILED);
264 EXPECT_TRUE(complete());
265
266 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
267 }
268
269 TEST_F(LocalFileSystemOperationWriteTest, TestWriteFailureByQuota) {
270 GURL blob_url("blob:success");
271 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n");
272
273 quota_manager_->SetQuota(
274 kOrigin, FileSystemTypeToQuotaStorageType(kFileSystemType), 10);
275 file_system_context_->operation_runner()->Write(
276 &url_request_context(), URLForPath(virtual_path_), blob_url,
277 0, RecordWriteCallback());
278 base::MessageLoop::current()->Run();
279
280 EXPECT_EQ(10, bytes_written());
281 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status());
282 EXPECT_TRUE(complete());
283
284 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count());
285 }
286
287 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) {
288 GURL blob_url("blob:success");
289 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n");
290
291 FileSystemOperationRunner::OperationID id =
292 file_system_context_->operation_runner()->Write(
293 &url_request_context(), URLForPath(virtual_path_),
294 blob_url, 0, RecordWriteCallback());
295 file_system_context_->operation_runner()->Cancel(id, RecordCancelCallback());
296 // We use RunAllPendings() instead of Run() here, because we won't dispatch
297 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need
298 // to run another write cycle.
299 base::MessageLoop::current()->RunUntilIdle();
300
301 // Issued Cancel() before receiving any response from Write(),
302 // so nothing should have happen.
303 EXPECT_EQ(0, bytes_written());
304 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status());
305 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status());
306 EXPECT_TRUE(complete());
307
308 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count());
309 }
310
311 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelFailingWrite) {
312 GURL blob_url("blob:writeinvalidfile");
313 ScopedTextBlob blob(url_request_context(), blob_url,
314 "It\'ll not be written.");
315
316 FileSystemOperationRunner::OperationID id =
317 file_system_context_->operation_runner()->Write(
318 &url_request_context(),
319 URLForPath(base::FilePath(FILE_PATH_LITERAL("nonexist"))),
320 blob_url, 0, RecordWriteCallback());
321 file_system_context_->operation_runner()->Cancel(id, RecordCancelCallback());
322 // We use RunAllPendings() instead of Run() here, because we won't dispatch
323 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need
324 // to run another write cycle.
325 base::MessageLoop::current()->RunUntilIdle();
326
327 // Issued Cancel() before receiving any response from Write(),
328 // so nothing should have happen.
329 EXPECT_EQ(0, bytes_written());
330 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status());
331 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status());
332 EXPECT_TRUE(complete());
333
334 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count());
335 }
336
337 // TODO(ericu,dmikurube,kinuko): Add more tests for cancel cases.
338
339 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/browser/fileapi/local_file_system_operation_unittest.cc ('k') | webkit/browser/fileapi/sandbox_file_system_backend.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698