OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/message_loop_proxy.h" | 10 #include "base/message_loop_proxy.h" |
11 #include "base/scoped_temp_dir.h" | 11 #include "base/scoped_temp_dir.h" |
12 #include "googleurl/src/gurl.h" | 12 #include "googleurl/src/gurl.h" |
13 #include "net/url_request/url_request.h" | 13 #include "net/url_request/url_request.h" |
14 #include "net/url_request/url_request_context.h" | 14 #include "net/url_request/url_request_context.h" |
15 #include "net/url_request/url_request_job.h" | 15 #include "net/url_request/url_request_job.h" |
16 #include "net/url_request/url_request_job_factory_impl.h" | 16 #include "net/url_request/url_request_job_factory_impl.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "webkit/blob/blob_data.h" | 18 #include "webkit/blob/blob_data.h" |
19 #include "webkit/blob/blob_storage_controller.h" | 19 #include "webkit/blob/blob_storage_controller.h" |
20 #include "webkit/blob/blob_url_request_job.h" | 20 #include "webkit/blob/blob_url_request_job.h" |
21 #include "webkit/fileapi/file_system_context.h" | 21 #include "webkit/fileapi/file_system_context.h" |
22 #include "webkit/fileapi/file_system_file_util.h" | 22 #include "webkit/fileapi/file_system_file_util.h" |
23 #include "webkit/fileapi/file_system_util.h" | 23 #include "webkit/fileapi/file_system_util.h" |
24 #include "webkit/fileapi/local_file_system_operation.h" | 24 #include "webkit/fileapi/local_file_system_operation.h" |
25 #include "webkit/fileapi/local_file_system_test_helper.h" | 25 #include "webkit/fileapi/local_file_system_test_helper.h" |
26 #include "webkit/fileapi/local_file_util.h" | 26 #include "webkit/fileapi/local_file_util.h" |
| 27 #include "webkit/fileapi/mock_file_change_observer.h" |
27 #include "webkit/quota/quota_manager.h" | 28 #include "webkit/quota/quota_manager.h" |
28 | 29 |
29 using quota::QuotaManager; | 30 using quota::QuotaManager; |
30 | 31 |
31 namespace fileapi { | 32 namespace fileapi { |
32 | 33 |
33 namespace { | 34 namespace { |
34 | 35 |
35 void AssertStatusEq(base::PlatformFileError expected, | 36 void AssertStatusEq(base::PlatformFileError expected, |
36 base::PlatformFileError actual) { | 37 base::PlatformFileError actual) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 class LocalFileSystemOperationWriteTest | 70 class LocalFileSystemOperationWriteTest |
70 : public testing::Test, | 71 : public testing::Test, |
71 public base::SupportsWeakPtr<LocalFileSystemOperationWriteTest> { | 72 public base::SupportsWeakPtr<LocalFileSystemOperationWriteTest> { |
72 public: | 73 public: |
73 LocalFileSystemOperationWriteTest() | 74 LocalFileSystemOperationWriteTest() |
74 : test_helper_(GURL("http://example.com"), kFileSystemTypeTest), | 75 : test_helper_(GURL("http://example.com"), kFileSystemTypeTest), |
75 loop_(MessageLoop::TYPE_IO), | 76 loop_(MessageLoop::TYPE_IO), |
76 status_(base::PLATFORM_FILE_OK), | 77 status_(base::PLATFORM_FILE_OK), |
77 cancel_status_(base::PLATFORM_FILE_ERROR_FAILED), | 78 cancel_status_(base::PLATFORM_FILE_ERROR_FAILED), |
78 bytes_written_(0), | 79 bytes_written_(0), |
79 complete_(false) {} | 80 complete_(false) { |
| 81 change_observers_ = MockFileChangeObserver::CreateList(&change_observer_); |
| 82 } |
80 | 83 |
81 LocalFileSystemOperation* operation(); | 84 LocalFileSystemOperation* operation(); |
82 | 85 |
83 base::PlatformFileError status() const { return status_; } | 86 base::PlatformFileError status() const { return status_; } |
84 base::PlatformFileError cancel_status() const { return cancel_status_; } | 87 base::PlatformFileError cancel_status() const { return cancel_status_; } |
85 void add_bytes_written(int64 bytes, bool complete) { | 88 void add_bytes_written(int64 bytes, bool complete) { |
86 bytes_written_ += bytes; | 89 bytes_written_ += bytes; |
87 EXPECT_FALSE(complete_); | 90 EXPECT_FALSE(complete_); |
88 complete_ = complete; | 91 complete_ = complete; |
89 } | 92 } |
90 int64 bytes_written() const { return bytes_written_; } | 93 int64 bytes_written() const { return bytes_written_; } |
91 bool complete() const { return complete_; } | 94 bool complete() const { return complete_; } |
92 | 95 |
93 virtual void SetUp(); | 96 virtual void SetUp(); |
94 virtual void TearDown(); | 97 virtual void TearDown(); |
95 | 98 |
96 protected: | 99 protected: |
| 100 const ChangeObserverList& change_observers() const { |
| 101 return change_observers_; |
| 102 } |
| 103 |
| 104 MockFileChangeObserver* change_observer() { |
| 105 return &change_observer_; |
| 106 } |
| 107 |
97 FileSystemURL URLForPath(const FilePath& path) const { | 108 FileSystemURL URLForPath(const FilePath& path) const { |
98 return test_helper_.CreateURL(path); | 109 return test_helper_.CreateURL(path); |
99 } | 110 } |
100 | 111 |
101 // Callback function for recording test results. | 112 // Callback function for recording test results. |
102 FileSystemOperation::WriteCallback RecordWriteCallback() { | 113 FileSystemOperation::WriteCallback RecordWriteCallback() { |
103 return base::Bind(&LocalFileSystemOperationWriteTest::DidWrite, | 114 return base::Bind(&LocalFileSystemOperationWriteTest::DidWrite, |
104 AsWeakPtr()); | 115 AsWeakPtr()); |
105 } | 116 } |
106 | 117 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 ScopedTempDir dir_; | 151 ScopedTempDir dir_; |
141 FilePath virtual_path_; | 152 FilePath virtual_path_; |
142 | 153 |
143 // For post-operation status. | 154 // For post-operation status. |
144 base::PlatformFileError status_; | 155 base::PlatformFileError status_; |
145 base::PlatformFileError cancel_status_; | 156 base::PlatformFileError cancel_status_; |
146 int64 bytes_written_; | 157 int64 bytes_written_; |
147 bool complete_; | 158 bool complete_; |
148 | 159 |
149 DISALLOW_COPY_AND_ASSIGN(LocalFileSystemOperationWriteTest); | 160 DISALLOW_COPY_AND_ASSIGN(LocalFileSystemOperationWriteTest); |
| 161 |
| 162 private: |
| 163 MockFileChangeObserver change_observer_; |
| 164 ChangeObserverList change_observers_; |
150 }; | 165 }; |
151 | 166 |
152 namespace { | 167 namespace { |
153 | 168 |
154 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { | 169 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { |
155 public: | 170 public: |
156 explicit TestProtocolHandler( | 171 explicit TestProtocolHandler( |
157 webkit_blob::BlobStorageController* blob_storage_controller) | 172 webkit_blob::BlobStorageController* blob_storage_controller) |
158 : blob_storage_controller_(blob_storage_controller) {} | 173 : blob_storage_controller_(blob_storage_controller) {} |
159 | 174 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 URLForPath(virtual_path_), true /* exclusive */, | 230 URLForPath(virtual_path_), true /* exclusive */, |
216 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK)); | 231 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK)); |
217 } | 232 } |
218 | 233 |
219 void LocalFileSystemOperationWriteTest::TearDown() { | 234 void LocalFileSystemOperationWriteTest::TearDown() { |
220 quota_manager_ = NULL; | 235 quota_manager_ = NULL; |
221 test_helper_.TearDown(); | 236 test_helper_.TearDown(); |
222 } | 237 } |
223 | 238 |
224 LocalFileSystemOperation* LocalFileSystemOperationWriteTest::operation() { | 239 LocalFileSystemOperation* LocalFileSystemOperationWriteTest::operation() { |
225 return test_helper_.NewOperation(); | 240 LocalFileSystemOperation* operation = test_helper_.NewOperation(); |
| 241 operation->operation_context()->set_change_observers(change_observers()); |
| 242 return operation; |
226 } | 243 } |
227 | 244 |
228 TEST_F(LocalFileSystemOperationWriteTest, TestWriteSuccess) { | 245 TEST_F(LocalFileSystemOperationWriteTest, TestWriteSuccess) { |
229 GURL blob_url("blob:success"); | 246 GURL blob_url("blob:success"); |
230 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 247 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
231 blob_data->AppendData("Hello, world!\n"); | 248 blob_data->AppendData("Hello, world!\n"); |
232 | 249 |
233 TestURLRequestContext url_request_context; | 250 TestURLRequestContext url_request_context; |
234 url_request_context.blob_storage_controller()->AddFinishedBlob( | 251 url_request_context.blob_storage_controller()->AddFinishedBlob( |
235 blob_url, blob_data); | 252 blob_url, blob_data); |
236 | 253 |
237 operation()->Write(&url_request_context, URLForPath(virtual_path_), blob_url, | 254 operation()->Write(&url_request_context, URLForPath(virtual_path_), blob_url, |
238 0, RecordWriteCallback()); | 255 0, RecordWriteCallback()); |
239 MessageLoop::current()->Run(); | 256 MessageLoop::current()->Run(); |
240 | 257 |
241 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 258 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
242 | 259 |
243 EXPECT_EQ(14, bytes_written()); | 260 EXPECT_EQ(14, bytes_written()); |
244 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); | 261 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
245 EXPECT_TRUE(complete()); | 262 EXPECT_TRUE(complete()); |
| 263 |
| 264 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
246 } | 265 } |
247 | 266 |
248 TEST_F(LocalFileSystemOperationWriteTest, TestWriteZero) { | 267 TEST_F(LocalFileSystemOperationWriteTest, TestWriteZero) { |
249 GURL blob_url("blob:zero"); | 268 GURL blob_url("blob:zero"); |
250 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 269 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
251 | 270 |
252 TestURLRequestContext url_request_context; | 271 TestURLRequestContext url_request_context; |
253 url_request_context.blob_storage_controller()->AddFinishedBlob( | 272 url_request_context.blob_storage_controller()->AddFinishedBlob( |
254 blob_url, blob_data); | 273 blob_url, blob_data); |
255 | 274 |
256 operation()->Write(&url_request_context, URLForPath(virtual_path_), | 275 operation()->Write(&url_request_context, URLForPath(virtual_path_), |
257 blob_url, 0, RecordWriteCallback()); | 276 blob_url, 0, RecordWriteCallback()); |
258 MessageLoop::current()->Run(); | 277 MessageLoop::current()->Run(); |
259 | 278 |
260 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 279 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
261 | 280 |
262 EXPECT_EQ(0, bytes_written()); | 281 EXPECT_EQ(0, bytes_written()); |
263 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); | 282 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
264 EXPECT_TRUE(complete()); | 283 EXPECT_TRUE(complete()); |
| 284 |
| 285 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
265 } | 286 } |
266 | 287 |
267 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidBlobUrl) { | 288 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidBlobUrl) { |
268 TestURLRequestContext url_request_context; | 289 TestURLRequestContext url_request_context; |
269 | 290 |
270 operation()->Write(&url_request_context, URLForPath(virtual_path_), | 291 operation()->Write(&url_request_context, URLForPath(virtual_path_), |
271 GURL("blob:invalid"), 0, RecordWriteCallback()); | 292 GURL("blob:invalid"), 0, RecordWriteCallback()); |
272 MessageLoop::current()->Run(); | 293 MessageLoop::current()->Run(); |
273 | 294 |
274 EXPECT_EQ(0, bytes_written()); | 295 EXPECT_EQ(0, bytes_written()); |
275 EXPECT_EQ(base::PLATFORM_FILE_ERROR_FAILED, status()); | 296 EXPECT_EQ(base::PLATFORM_FILE_ERROR_FAILED, status()); |
276 EXPECT_TRUE(complete()); | 297 EXPECT_TRUE(complete()); |
| 298 |
| 299 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); |
277 } | 300 } |
278 | 301 |
279 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidFile) { | 302 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidFile) { |
280 GURL blob_url("blob:writeinvalidfile"); | 303 GURL blob_url("blob:writeinvalidfile"); |
281 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 304 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
282 blob_data->AppendData("It\'ll not be written."); | 305 blob_data->AppendData("It\'ll not be written."); |
283 | 306 |
284 TestURLRequestContext url_request_context; | 307 TestURLRequestContext url_request_context; |
285 url_request_context.blob_storage_controller()->AddFinishedBlob( | 308 url_request_context.blob_storage_controller()->AddFinishedBlob( |
286 blob_url, blob_data); | 309 blob_url, blob_data); |
287 | 310 |
288 operation()->Write(&url_request_context, | 311 operation()->Write(&url_request_context, |
289 URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))), | 312 URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))), |
290 blob_url, 0, RecordWriteCallback()); | 313 blob_url, 0, RecordWriteCallback()); |
291 MessageLoop::current()->Run(); | 314 MessageLoop::current()->Run(); |
292 | 315 |
293 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 316 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
294 | 317 |
295 EXPECT_EQ(0, bytes_written()); | 318 EXPECT_EQ(0, bytes_written()); |
296 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status()); | 319 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status()); |
297 EXPECT_TRUE(complete()); | 320 EXPECT_TRUE(complete()); |
| 321 |
| 322 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
298 } | 323 } |
299 | 324 |
300 TEST_F(LocalFileSystemOperationWriteTest, TestWriteDir) { | 325 TEST_F(LocalFileSystemOperationWriteTest, TestWriteDir) { |
301 FilePath virtual_dir_path(FILE_PATH_LITERAL("d")); | 326 FilePath virtual_dir_path(FILE_PATH_LITERAL("d")); |
302 operation()->CreateDirectory( | 327 operation()->CreateDirectory( |
303 URLForPath(virtual_dir_path), | 328 URLForPath(virtual_dir_path), |
304 true /* exclusive */, false /* recursive */, | 329 true /* exclusive */, false /* recursive */, |
305 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK)); | 330 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK)); |
306 | 331 |
307 GURL blob_url("blob:writedir"); | 332 GURL blob_url("blob:writedir"); |
(...skipping 10 matching lines...) Expand all Loading... |
318 | 343 |
319 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 344 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
320 | 345 |
321 EXPECT_EQ(0, bytes_written()); | 346 EXPECT_EQ(0, bytes_written()); |
322 // TODO(kinuko): This error code is platform- or fileutil- dependent | 347 // TODO(kinuko): This error code is platform- or fileutil- dependent |
323 // right now. Make it return PLATFORM_FILE_ERROR_NOT_A_FILE in every case. | 348 // right now. Make it return PLATFORM_FILE_ERROR_NOT_A_FILE in every case. |
324 EXPECT_TRUE(status() == base::PLATFORM_FILE_ERROR_NOT_A_FILE || | 349 EXPECT_TRUE(status() == base::PLATFORM_FILE_ERROR_NOT_A_FILE || |
325 status() == base::PLATFORM_FILE_ERROR_ACCESS_DENIED || | 350 status() == base::PLATFORM_FILE_ERROR_ACCESS_DENIED || |
326 status() == base::PLATFORM_FILE_ERROR_FAILED); | 351 status() == base::PLATFORM_FILE_ERROR_FAILED); |
327 EXPECT_TRUE(complete()); | 352 EXPECT_TRUE(complete()); |
| 353 |
| 354 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
328 } | 355 } |
329 | 356 |
330 TEST_F(LocalFileSystemOperationWriteTest, TestWriteFailureByQuota) { | 357 TEST_F(LocalFileSystemOperationWriteTest, TestWriteFailureByQuota) { |
331 GURL blob_url("blob:success"); | 358 GURL blob_url("blob:success"); |
332 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 359 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
333 blob_data->AppendData("Hello, world!\n"); | 360 blob_data->AppendData("Hello, world!\n"); |
334 | 361 |
335 TestURLRequestContext url_request_context; | 362 TestURLRequestContext url_request_context; |
336 url_request_context.blob_storage_controller()->AddFinishedBlob( | 363 url_request_context.blob_storage_controller()->AddFinishedBlob( |
337 blob_url, blob_data); | 364 blob_url, blob_data); |
338 | 365 |
339 quota_manager_->set_quota(10); | 366 quota_manager_->set_quota(10); |
340 operation()->Write(&url_request_context, URLForPath(virtual_path_), blob_url, | 367 operation()->Write(&url_request_context, URLForPath(virtual_path_), blob_url, |
341 0, RecordWriteCallback()); | 368 0, RecordWriteCallback()); |
342 MessageLoop::current()->Run(); | 369 MessageLoop::current()->Run(); |
343 | 370 |
344 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 371 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
345 | 372 |
346 EXPECT_EQ(10, bytes_written()); | 373 EXPECT_EQ(10, bytes_written()); |
347 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); | 374 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); |
348 EXPECT_TRUE(complete()); | 375 EXPECT_TRUE(complete()); |
| 376 |
| 377 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
349 } | 378 } |
350 | 379 |
351 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) { | 380 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) { |
352 GURL blob_url("blob:success"); | 381 GURL blob_url("blob:success"); |
353 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 382 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
354 blob_data->AppendData("Hello, world!\n"); | 383 blob_data->AppendData("Hello, world!\n"); |
355 | 384 |
356 TestURLRequestContext url_request_context; | 385 TestURLRequestContext url_request_context; |
357 url_request_context.blob_storage_controller()->AddFinishedBlob( | 386 url_request_context.blob_storage_controller()->AddFinishedBlob( |
358 blob_url, blob_data); | 387 blob_url, blob_data); |
359 | 388 |
360 FileSystemOperation* write_operation = operation(); | 389 FileSystemOperation* write_operation = operation(); |
361 write_operation->Write(&url_request_context, URLForPath(virtual_path_), | 390 write_operation->Write(&url_request_context, URLForPath(virtual_path_), |
362 blob_url, 0, RecordWriteCallback()); | 391 blob_url, 0, RecordWriteCallback()); |
363 write_operation->Cancel(RecordCancelCallback()); | 392 write_operation->Cancel(RecordCancelCallback()); |
364 // We use RunAllPendings() instead of Run() here, because we won't dispatch | 393 // We use RunAllPendings() instead of Run() here, because we won't dispatch |
365 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need | 394 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need |
366 // to run another write cycle. | 395 // to run another write cycle. |
367 MessageLoop::current()->RunAllPending(); | 396 MessageLoop::current()->RunAllPending(); |
368 | 397 |
369 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 398 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
370 | 399 |
371 // Issued Cancel() before receiving any response from Write(), | 400 // Issued Cancel() before receiving any response from Write(), |
372 // so nothing should have happen. | 401 // so nothing should have happen. |
373 EXPECT_EQ(0, bytes_written()); | 402 EXPECT_EQ(0, bytes_written()); |
374 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); | 403 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); |
375 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); | 404 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); |
376 EXPECT_TRUE(complete()); | 405 EXPECT_TRUE(complete()); |
| 406 |
| 407 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); |
377 } | 408 } |
378 | 409 |
379 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelFailingWrite) { | 410 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelFailingWrite) { |
380 GURL blob_url("blob:writeinvalidfile"); | 411 GURL blob_url("blob:writeinvalidfile"); |
381 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 412 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
382 blob_data->AppendData("It\'ll not be written."); | 413 blob_data->AppendData("It\'ll not be written."); |
383 | 414 |
384 TestURLRequestContext url_request_context; | 415 TestURLRequestContext url_request_context; |
385 url_request_context.blob_storage_controller()->AddFinishedBlob( | 416 url_request_context.blob_storage_controller()->AddFinishedBlob( |
386 blob_url, blob_data); | 417 blob_url, blob_data); |
387 | 418 |
388 FileSystemOperation* write_operation = operation(); | 419 FileSystemOperation* write_operation = operation(); |
389 write_operation->Write(&url_request_context, | 420 write_operation->Write(&url_request_context, |
390 URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))), | 421 URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))), |
391 blob_url, 0, RecordWriteCallback()); | 422 blob_url, 0, RecordWriteCallback()); |
392 write_operation->Cancel(RecordCancelCallback()); | 423 write_operation->Cancel(RecordCancelCallback()); |
393 // We use RunAllPendings() instead of Run() here, because we won't dispatch | 424 // We use RunAllPendings() instead of Run() here, because we won't dispatch |
394 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need | 425 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need |
395 // to run another write cycle. | 426 // to run another write cycle. |
396 MessageLoop::current()->RunAllPending(); | 427 MessageLoop::current()->RunAllPending(); |
397 | 428 |
398 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); | 429 url_request_context.blob_storage_controller()->RemoveBlob(blob_url); |
399 | 430 |
400 // Issued Cancel() before receiving any response from Write(), | 431 // Issued Cancel() before receiving any response from Write(), |
401 // so nothing should have happen. | 432 // so nothing should have happen. |
402 EXPECT_EQ(0, bytes_written()); | 433 EXPECT_EQ(0, bytes_written()); |
403 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); | 434 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); |
404 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); | 435 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); |
405 EXPECT_TRUE(complete()); | 436 EXPECT_TRUE(complete()); |
| 437 |
| 438 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); |
406 } | 439 } |
407 | 440 |
408 // TODO(ericu,dmikurube,kinuko): Add more tests for cancel cases. | 441 // TODO(ericu,dmikurube,kinuko): Add more tests for cancel cases. |
409 | 442 |
410 } // namespace fileapi | 443 } // namespace fileapi |
OLD | NEW |