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