| 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/files/scoped_temp_dir.h" | 7 #include "base/files/scoped_temp_dir.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 const GURL kOrigin("http://example.com"); | 40 const GURL kOrigin("http://example.com"); |
| 41 const FileSystemType kFileSystemType = kFileSystemTypeTest; | 41 const FileSystemType kFileSystemType = kFileSystemTypeTest; |
| 42 | 42 |
| 43 void AssertStatusEq(base::PlatformFileError expected, | 43 void AssertStatusEq(base::PlatformFileError expected, |
| 44 base::PlatformFileError actual) { | 44 base::PlatformFileError actual) { |
| 45 ASSERT_EQ(expected, actual); | 45 ASSERT_EQ(expected, actual); |
| 46 } | 46 } |
| 47 | 47 |
| 48 } // namespace | 48 } // namespace |
| 49 | 49 |
| 50 class LocalFileSystemOperationWriteTest | 50 class FileSystemOperationImplWriteTest |
| 51 : public testing::Test, | 51 : public testing::Test, |
| 52 public base::SupportsWeakPtr<LocalFileSystemOperationWriteTest> { | 52 public base::SupportsWeakPtr<FileSystemOperationImplWriteTest> { |
| 53 public: | 53 public: |
| 54 LocalFileSystemOperationWriteTest() | 54 FileSystemOperationImplWriteTest() |
| 55 : loop_(base::MessageLoop::TYPE_IO), | 55 : loop_(base::MessageLoop::TYPE_IO), |
| 56 status_(base::PLATFORM_FILE_OK), | 56 status_(base::PLATFORM_FILE_OK), |
| 57 cancel_status_(base::PLATFORM_FILE_ERROR_FAILED), | 57 cancel_status_(base::PLATFORM_FILE_ERROR_FAILED), |
| 58 bytes_written_(0), | 58 bytes_written_(0), |
| 59 complete_(false) { | 59 complete_(false) { |
| 60 change_observers_ = MockFileChangeObserver::CreateList(&change_observer_); | 60 change_observers_ = MockFileChangeObserver::CreateList(&change_observer_); |
| 61 } | 61 } |
| 62 | 62 |
| 63 virtual void SetUp() { | 63 virtual void SetUp() { |
| 64 ASSERT_TRUE(dir_.CreateUniqueTempDir()); | 64 ASSERT_TRUE(dir_.CreateUniqueTempDir()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 return &change_observer_; | 110 return &change_observer_; |
| 111 } | 111 } |
| 112 | 112 |
| 113 FileSystemURL URLForPath(const base::FilePath& path) const { | 113 FileSystemURL URLForPath(const base::FilePath& path) const { |
| 114 return file_system_context_->CreateCrackedFileSystemURL( | 114 return file_system_context_->CreateCrackedFileSystemURL( |
| 115 kOrigin, kFileSystemType, path); | 115 kOrigin, kFileSystemType, path); |
| 116 } | 116 } |
| 117 | 117 |
| 118 // Callback function for recording test results. | 118 // Callback function for recording test results. |
| 119 FileSystemOperation::WriteCallback RecordWriteCallback() { | 119 FileSystemOperation::WriteCallback RecordWriteCallback() { |
| 120 return base::Bind(&LocalFileSystemOperationWriteTest::DidWrite, | 120 return base::Bind(&FileSystemOperationImplWriteTest::DidWrite, |
| 121 AsWeakPtr()); | 121 AsWeakPtr()); |
| 122 } | 122 } |
| 123 | 123 |
| 124 FileSystemOperation::StatusCallback RecordCancelCallback() { | 124 FileSystemOperation::StatusCallback RecordCancelCallback() { |
| 125 return base::Bind(&LocalFileSystemOperationWriteTest::DidCancel, | 125 return base::Bind(&FileSystemOperationImplWriteTest::DidCancel, |
| 126 AsWeakPtr()); | 126 AsWeakPtr()); |
| 127 } | 127 } |
| 128 | 128 |
| 129 void DidWrite(base::PlatformFileError status, int64 bytes, bool complete) { | 129 void DidWrite(base::PlatformFileError status, int64 bytes, bool complete) { |
| 130 if (status == base::PLATFORM_FILE_OK) { | 130 if (status == base::PLATFORM_FILE_OK) { |
| 131 add_bytes_written(bytes, complete); | 131 add_bytes_written(bytes, complete); |
| 132 if (complete) | 132 if (complete) |
| 133 base::MessageLoop::current()->Quit(); | 133 base::MessageLoop::current()->Quit(); |
| 134 } else { | 134 } else { |
| 135 EXPECT_FALSE(complete_); | 135 EXPECT_FALSE(complete_); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 161 base::PlatformFileError status_; | 161 base::PlatformFileError status_; |
| 162 base::PlatformFileError cancel_status_; | 162 base::PlatformFileError cancel_status_; |
| 163 int64 bytes_written_; | 163 int64 bytes_written_; |
| 164 bool complete_; | 164 bool complete_; |
| 165 | 165 |
| 166 scoped_ptr<MockBlobURLRequestContext> url_request_context_; | 166 scoped_ptr<MockBlobURLRequestContext> url_request_context_; |
| 167 | 167 |
| 168 MockFileChangeObserver change_observer_; | 168 MockFileChangeObserver change_observer_; |
| 169 ChangeObserverList change_observers_; | 169 ChangeObserverList change_observers_; |
| 170 | 170 |
| 171 DISALLOW_COPY_AND_ASSIGN(LocalFileSystemOperationWriteTest); | 171 DISALLOW_COPY_AND_ASSIGN(FileSystemOperationImplWriteTest); |
| 172 }; | 172 }; |
| 173 | 173 |
| 174 TEST_F(LocalFileSystemOperationWriteTest, TestWriteSuccess) { | 174 TEST_F(FileSystemOperationImplWriteTest, TestWriteSuccess) { |
| 175 const GURL blob_url("blob:success"); | 175 const GURL blob_url("blob:success"); |
| 176 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n"); | 176 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n"); |
| 177 | 177 |
| 178 file_system_context_->operation_runner()->Write( | 178 file_system_context_->operation_runner()->Write( |
| 179 &url_request_context(), URLForPath(virtual_path_), blob_url, | 179 &url_request_context(), URLForPath(virtual_path_), blob_url, |
| 180 0, RecordWriteCallback()); | 180 0, RecordWriteCallback()); |
| 181 base::MessageLoop::current()->Run(); | 181 base::MessageLoop::current()->Run(); |
| 182 | 182 |
| 183 EXPECT_EQ(14, bytes_written()); | 183 EXPECT_EQ(14, bytes_written()); |
| 184 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); | 184 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| 185 EXPECT_TRUE(complete()); | 185 EXPECT_TRUE(complete()); |
| 186 | 186 |
| 187 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); | 187 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
| 188 } | 188 } |
| 189 | 189 |
| 190 TEST_F(LocalFileSystemOperationWriteTest, TestWriteZero) { | 190 TEST_F(FileSystemOperationImplWriteTest, TestWriteZero) { |
| 191 GURL blob_url("blob:zero"); | 191 GURL blob_url("blob:zero"); |
| 192 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); | 192 scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData()); |
| 193 | 193 |
| 194 url_request_context().blob_storage_controller() | 194 url_request_context().blob_storage_controller() |
| 195 ->AddFinishedBlob(blob_url, blob_data.get()); | 195 ->AddFinishedBlob(blob_url, blob_data.get()); |
| 196 | 196 |
| 197 file_system_context_->operation_runner()->Write( | 197 file_system_context_->operation_runner()->Write( |
| 198 &url_request_context(), URLForPath(virtual_path_), | 198 &url_request_context(), URLForPath(virtual_path_), |
| 199 blob_url, 0, RecordWriteCallback()); | 199 blob_url, 0, RecordWriteCallback()); |
| 200 base::MessageLoop::current()->Run(); | 200 base::MessageLoop::current()->Run(); |
| 201 | 201 |
| 202 url_request_context().blob_storage_controller()->RemoveBlob(blob_url); | 202 url_request_context().blob_storage_controller()->RemoveBlob(blob_url); |
| 203 | 203 |
| 204 EXPECT_EQ(0, bytes_written()); | 204 EXPECT_EQ(0, bytes_written()); |
| 205 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); | 205 EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| 206 EXPECT_TRUE(complete()); | 206 EXPECT_TRUE(complete()); |
| 207 | 207 |
| 208 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); | 208 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
| 209 } | 209 } |
| 210 | 210 |
| 211 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidBlobUrl) { | 211 TEST_F(FileSystemOperationImplWriteTest, TestWriteInvalidBlobUrl) { |
| 212 file_system_context_->operation_runner()->Write( | 212 file_system_context_->operation_runner()->Write( |
| 213 &url_request_context(), URLForPath(virtual_path_), | 213 &url_request_context(), URLForPath(virtual_path_), |
| 214 GURL("blob:invalid"), 0, RecordWriteCallback()); | 214 GURL("blob:invalid"), 0, RecordWriteCallback()); |
| 215 base::MessageLoop::current()->Run(); | 215 base::MessageLoop::current()->Run(); |
| 216 | 216 |
| 217 EXPECT_EQ(0, bytes_written()); | 217 EXPECT_EQ(0, bytes_written()); |
| 218 EXPECT_EQ(base::PLATFORM_FILE_ERROR_FAILED, status()); | 218 EXPECT_EQ(base::PLATFORM_FILE_ERROR_FAILED, status()); |
| 219 EXPECT_TRUE(complete()); | 219 EXPECT_TRUE(complete()); |
| 220 | 220 |
| 221 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); | 221 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); |
| 222 } | 222 } |
| 223 | 223 |
| 224 TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidFile) { | 224 TEST_F(FileSystemOperationImplWriteTest, TestWriteInvalidFile) { |
| 225 GURL blob_url("blob:writeinvalidfile"); | 225 GURL blob_url("blob:writeinvalidfile"); |
| 226 ScopedTextBlob blob(url_request_context(), blob_url, | 226 ScopedTextBlob blob(url_request_context(), blob_url, |
| 227 "It\'ll not be written."); | 227 "It\'ll not be written."); |
| 228 | 228 |
| 229 file_system_context_->operation_runner()->Write( | 229 file_system_context_->operation_runner()->Write( |
| 230 &url_request_context(), | 230 &url_request_context(), |
| 231 URLForPath(base::FilePath(FILE_PATH_LITERAL("nonexist"))), | 231 URLForPath(base::FilePath(FILE_PATH_LITERAL("nonexist"))), |
| 232 blob_url, 0, RecordWriteCallback()); | 232 blob_url, 0, RecordWriteCallback()); |
| 233 base::MessageLoop::current()->Run(); | 233 base::MessageLoop::current()->Run(); |
| 234 | 234 |
| 235 EXPECT_EQ(0, bytes_written()); | 235 EXPECT_EQ(0, bytes_written()); |
| 236 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status()); | 236 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status()); |
| 237 EXPECT_TRUE(complete()); | 237 EXPECT_TRUE(complete()); |
| 238 | 238 |
| 239 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); | 239 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
| 240 } | 240 } |
| 241 | 241 |
| 242 TEST_F(LocalFileSystemOperationWriteTest, TestWriteDir) { | 242 TEST_F(FileSystemOperationImplWriteTest, TestWriteDir) { |
| 243 base::FilePath virtual_dir_path(FILE_PATH_LITERAL("d")); | 243 base::FilePath virtual_dir_path(FILE_PATH_LITERAL("d")); |
| 244 file_system_context_->operation_runner()->CreateDirectory( | 244 file_system_context_->operation_runner()->CreateDirectory( |
| 245 URLForPath(virtual_dir_path), | 245 URLForPath(virtual_dir_path), |
| 246 true /* exclusive */, false /* recursive */, | 246 true /* exclusive */, false /* recursive */, |
| 247 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK)); | 247 base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK)); |
| 248 | 248 |
| 249 GURL blob_url("blob:writedir"); | 249 GURL blob_url("blob:writedir"); |
| 250 ScopedTextBlob blob(url_request_context(), blob_url, | 250 ScopedTextBlob blob(url_request_context(), blob_url, |
| 251 "It\'ll not be written, too."); | 251 "It\'ll not be written, too."); |
| 252 | 252 |
| 253 file_system_context_->operation_runner()->Write( | 253 file_system_context_->operation_runner()->Write( |
| 254 &url_request_context(), URLForPath(virtual_dir_path), | 254 &url_request_context(), URLForPath(virtual_dir_path), |
| 255 blob_url, 0, RecordWriteCallback()); | 255 blob_url, 0, RecordWriteCallback()); |
| 256 base::MessageLoop::current()->Run(); | 256 base::MessageLoop::current()->Run(); |
| 257 | 257 |
| 258 EXPECT_EQ(0, bytes_written()); | 258 EXPECT_EQ(0, bytes_written()); |
| 259 // TODO(kinuko): This error code is platform- or fileutil- dependent | 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. | 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 || | 261 EXPECT_TRUE(status() == base::PLATFORM_FILE_ERROR_NOT_A_FILE || |
| 262 status() == base::PLATFORM_FILE_ERROR_ACCESS_DENIED || | 262 status() == base::PLATFORM_FILE_ERROR_ACCESS_DENIED || |
| 263 status() == base::PLATFORM_FILE_ERROR_FAILED); | 263 status() == base::PLATFORM_FILE_ERROR_FAILED); |
| 264 EXPECT_TRUE(complete()); | 264 EXPECT_TRUE(complete()); |
| 265 | 265 |
| 266 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); | 266 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
| 267 } | 267 } |
| 268 | 268 |
| 269 TEST_F(LocalFileSystemOperationWriteTest, TestWriteFailureByQuota) { | 269 TEST_F(FileSystemOperationImplWriteTest, TestWriteFailureByQuota) { |
| 270 GURL blob_url("blob:success"); | 270 GURL blob_url("blob:success"); |
| 271 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n"); | 271 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n"); |
| 272 | 272 |
| 273 quota_manager_->SetQuota( | 273 quota_manager_->SetQuota( |
| 274 kOrigin, FileSystemTypeToQuotaStorageType(kFileSystemType), 10); | 274 kOrigin, FileSystemTypeToQuotaStorageType(kFileSystemType), 10); |
| 275 file_system_context_->operation_runner()->Write( | 275 file_system_context_->operation_runner()->Write( |
| 276 &url_request_context(), URLForPath(virtual_path_), blob_url, | 276 &url_request_context(), URLForPath(virtual_path_), blob_url, |
| 277 0, RecordWriteCallback()); | 277 0, RecordWriteCallback()); |
| 278 base::MessageLoop::current()->Run(); | 278 base::MessageLoop::current()->Run(); |
| 279 | 279 |
| 280 EXPECT_EQ(10, bytes_written()); | 280 EXPECT_EQ(10, bytes_written()); |
| 281 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); | 281 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); |
| 282 EXPECT_TRUE(complete()); | 282 EXPECT_TRUE(complete()); |
| 283 | 283 |
| 284 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); | 284 EXPECT_EQ(1, change_observer()->get_and_reset_modify_file_count()); |
| 285 } | 285 } |
| 286 | 286 |
| 287 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) { | 287 TEST_F(FileSystemOperationImplWriteTest, TestImmediateCancelSuccessfulWrite) { |
| 288 GURL blob_url("blob:success"); | 288 GURL blob_url("blob:success"); |
| 289 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n"); | 289 ScopedTextBlob blob(url_request_context(), blob_url, "Hello, world!\n"); |
| 290 | 290 |
| 291 FileSystemOperationRunner::OperationID id = | 291 FileSystemOperationRunner::OperationID id = |
| 292 file_system_context_->operation_runner()->Write( | 292 file_system_context_->operation_runner()->Write( |
| 293 &url_request_context(), URLForPath(virtual_path_), | 293 &url_request_context(), URLForPath(virtual_path_), |
| 294 blob_url, 0, RecordWriteCallback()); | 294 blob_url, 0, RecordWriteCallback()); |
| 295 file_system_context_->operation_runner()->Cancel(id, RecordCancelCallback()); | 295 file_system_context_->operation_runner()->Cancel(id, RecordCancelCallback()); |
| 296 // We use RunAllPendings() instead of Run() here, because we won't dispatch | 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 | 297 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need |
| 298 // to run another write cycle. | 298 // to run another write cycle. |
| 299 base::MessageLoop::current()->RunUntilIdle(); | 299 base::MessageLoop::current()->RunUntilIdle(); |
| 300 | 300 |
| 301 // Issued Cancel() before receiving any response from Write(), | 301 // Issued Cancel() before receiving any response from Write(), |
| 302 // so nothing should have happen. | 302 // so nothing should have happen. |
| 303 EXPECT_EQ(0, bytes_written()); | 303 EXPECT_EQ(0, bytes_written()); |
| 304 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); | 304 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); |
| 305 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); | 305 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); |
| 306 EXPECT_TRUE(complete()); | 306 EXPECT_TRUE(complete()); |
| 307 | 307 |
| 308 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); | 308 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); |
| 309 } | 309 } |
| 310 | 310 |
| 311 TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelFailingWrite) { | 311 TEST_F(FileSystemOperationImplWriteTest, TestImmediateCancelFailingWrite) { |
| 312 GURL blob_url("blob:writeinvalidfile"); | 312 GURL blob_url("blob:writeinvalidfile"); |
| 313 ScopedTextBlob blob(url_request_context(), blob_url, | 313 ScopedTextBlob blob(url_request_context(), blob_url, |
| 314 "It\'ll not be written."); | 314 "It\'ll not be written."); |
| 315 | 315 |
| 316 FileSystemOperationRunner::OperationID id = | 316 FileSystemOperationRunner::OperationID id = |
| 317 file_system_context_->operation_runner()->Write( | 317 file_system_context_->operation_runner()->Write( |
| 318 &url_request_context(), | 318 &url_request_context(), |
| 319 URLForPath(base::FilePath(FILE_PATH_LITERAL("nonexist"))), | 319 URLForPath(base::FilePath(FILE_PATH_LITERAL("nonexist"))), |
| 320 blob_url, 0, RecordWriteCallback()); | 320 blob_url, 0, RecordWriteCallback()); |
| 321 file_system_context_->operation_runner()->Cancel(id, RecordCancelCallback()); | 321 file_system_context_->operation_runner()->Cancel(id, RecordCancelCallback()); |
| 322 // We use RunAllPendings() instead of Run() here, because we won't dispatch | 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 | 323 // callbacks after Cancel() is issued (so no chance to Quit) nor do we need |
| 324 // to run another write cycle. | 324 // to run another write cycle. |
| 325 base::MessageLoop::current()->RunUntilIdle(); | 325 base::MessageLoop::current()->RunUntilIdle(); |
| 326 | 326 |
| 327 // Issued Cancel() before receiving any response from Write(), | 327 // Issued Cancel() before receiving any response from Write(), |
| 328 // so nothing should have happen. | 328 // so nothing should have happen. |
| 329 EXPECT_EQ(0, bytes_written()); | 329 EXPECT_EQ(0, bytes_written()); |
| 330 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); | 330 EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status()); |
| 331 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); | 331 EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status()); |
| 332 EXPECT_TRUE(complete()); | 332 EXPECT_TRUE(complete()); |
| 333 | 333 |
| 334 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); | 334 EXPECT_EQ(0, change_observer()->get_and_reset_modify_file_count()); |
| 335 } | 335 } |
| 336 | 336 |
| 337 // TODO(ericu,dmikurube,kinuko): Add more tests for cancel cases. | 337 // TODO(ericu,dmikurube,kinuko): Add more tests for cancel cases. |
| 338 | 338 |
| 339 } // namespace fileapi | 339 } // namespace fileapi |
| OLD | NEW |