| 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 |