| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 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 "webkit/fileapi/webfilewriter_base.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "base/memory/scoped_ptr.h" | |
| 9 #include "base/message_loop.h" | |
| 10 #include "base/utf_string_conversions.h" | |
| 11 #include "googleurl/src/gurl.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | |
| 13 #include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" | |
| 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileError.h" | |
| 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFileWriterClient.h
" | |
| 16 | |
| 17 namespace fileapi { | |
| 18 | |
| 19 namespace { | |
| 20 | |
| 21 // We use particular offsets to trigger particular behaviors | |
| 22 // in the TestableFileWriter. | |
| 23 const int kNoOffset = -1; | |
| 24 const int kBasicFileTruncate_Offset = 1; | |
| 25 const int kErrorFileTruncate_Offset = 2; | |
| 26 const int kCancelFileTruncate_Offset = 3; | |
| 27 const int kCancelFailedTruncate_Offset = 4; | |
| 28 const int kBasicFileWrite_Offset = 1; | |
| 29 const int kErrorFileWrite_Offset = 2; | |
| 30 const int kMultiFileWrite_Offset = 3; | |
| 31 const int kCancelFileWriteBeforeCompletion_Offset = 4; | |
| 32 const int kCancelFileWriteAfterCompletion_Offset = 5; | |
| 33 | |
| 34 GURL mock_path_as_gurl() { | |
| 35 return GURL("MockPath"); | |
| 36 } | |
| 37 | |
| 38 } // namespace | |
| 39 | |
| 40 class TestableFileWriter : public WebFileWriterBase { | |
| 41 public: | |
| 42 explicit TestableFileWriter(WebKit::WebFileWriterClient* client) | |
| 43 : WebFileWriterBase(mock_path_as_gurl(), client) { | |
| 44 reset(); | |
| 45 } | |
| 46 | |
| 47 void reset() { | |
| 48 received_truncate_ = false; | |
| 49 received_truncate_path_ = GURL(); | |
| 50 received_truncate_offset_ = kNoOffset; | |
| 51 received_write_ = false; | |
| 52 received_write_path_ = GURL(); | |
| 53 received_write_offset_ = kNoOffset; | |
| 54 received_write_blob_url_ = GURL(); | |
| 55 received_cancel_ = false; | |
| 56 } | |
| 57 | |
| 58 bool received_truncate_; | |
| 59 GURL received_truncate_path_; | |
| 60 int64 received_truncate_offset_; | |
| 61 bool received_write_; | |
| 62 GURL received_write_path_; | |
| 63 GURL received_write_blob_url_; | |
| 64 int64 received_write_offset_; | |
| 65 bool received_cancel_; | |
| 66 | |
| 67 protected: | |
| 68 virtual void DoTruncate(const GURL& path, int64 offset) OVERRIDE { | |
| 69 received_truncate_ = true; | |
| 70 received_truncate_path_ = path; | |
| 71 received_truncate_offset_ = offset; | |
| 72 | |
| 73 if (offset == kBasicFileTruncate_Offset) { | |
| 74 DidSucceed(); | |
| 75 } else if (offset == kErrorFileTruncate_Offset) { | |
| 76 DidFail(base::PLATFORM_FILE_ERROR_NOT_FOUND); | |
| 77 } else if (offset == kCancelFileTruncate_Offset) { | |
| 78 cancel(); | |
| 79 DidSucceed(); // truncate completion | |
| 80 DidSucceed(); // cancel completion | |
| 81 } else if (offset == kCancelFailedTruncate_Offset) { | |
| 82 cancel(); | |
| 83 DidFail(base::PLATFORM_FILE_ERROR_NOT_FOUND); // truncate completion | |
| 84 DidSucceed(); // cancel completion | |
| 85 } else { | |
| 86 FAIL(); | |
| 87 } | |
| 88 } | |
| 89 | |
| 90 virtual void DoWrite(const GURL& path, const GURL& blob_url, | |
| 91 int64 offset) OVERRIDE { | |
| 92 received_write_ = true; | |
| 93 received_write_path_ = path; | |
| 94 received_write_offset_ = offset; | |
| 95 received_write_blob_url_ = blob_url; | |
| 96 | |
| 97 if (offset == kBasicFileWrite_Offset) { | |
| 98 DidWrite(1, true); | |
| 99 } else if (offset == kErrorFileWrite_Offset) { | |
| 100 DidFail(base::PLATFORM_FILE_ERROR_NOT_FOUND); | |
| 101 } else if (offset == kMultiFileWrite_Offset) { | |
| 102 DidWrite(1, false); | |
| 103 DidWrite(1, false); | |
| 104 DidWrite(1, true); | |
| 105 } else if (offset == kCancelFileWriteBeforeCompletion_Offset) { | |
| 106 DidWrite(1, false); | |
| 107 cancel(); | |
| 108 DidWrite(1, false); | |
| 109 DidWrite(1, false); | |
| 110 DidFail(base::PLATFORM_FILE_ERROR_FAILED); // write completion | |
| 111 DidSucceed(); // cancel completion | |
| 112 } else if (offset == kCancelFileWriteAfterCompletion_Offset) { | |
| 113 DidWrite(1, false); | |
| 114 cancel(); | |
| 115 DidWrite(1, false); | |
| 116 DidWrite(1, false); | |
| 117 DidWrite(1, true); // write completion | |
| 118 DidFail(base::PLATFORM_FILE_ERROR_FAILED); // cancel completion | |
| 119 } else { | |
| 120 FAIL(); | |
| 121 } | |
| 122 } | |
| 123 | |
| 124 virtual void DoCancel() OVERRIDE { | |
| 125 received_cancel_ = true; | |
| 126 } | |
| 127 }; | |
| 128 | |
| 129 class FileWriterTest : public testing::Test, | |
| 130 public WebKit::WebFileWriterClient { | |
| 131 public: | |
| 132 FileWriterTest() { | |
| 133 reset(); | |
| 134 } | |
| 135 | |
| 136 WebKit::WebFileWriter* writer() { | |
| 137 return testable_writer_.get(); | |
| 138 } | |
| 139 | |
| 140 // WebFileWriterClient overrides | |
| 141 virtual void didWrite(long long bytes, bool complete) { | |
| 142 EXPECT_FALSE(received_did_write_complete_); | |
| 143 ++received_did_write_count_; | |
| 144 received_did_write_bytes_total_ += bytes; | |
| 145 if (complete) | |
| 146 received_did_write_complete_ = true; | |
| 147 | |
| 148 if (delete_in_client_callback_) | |
| 149 testable_writer_.reset(NULL); | |
| 150 } | |
| 151 | |
| 152 virtual void didTruncate() { | |
| 153 EXPECT_FALSE(received_did_truncate_); | |
| 154 received_did_truncate_ = true; | |
| 155 if (delete_in_client_callback_) | |
| 156 testable_writer_.reset(NULL); | |
| 157 } | |
| 158 | |
| 159 virtual void didFail(WebKit::WebFileError error) { | |
| 160 EXPECT_FALSE(received_did_fail_); | |
| 161 received_did_fail_ = true; | |
| 162 fail_error_received_ = error; | |
| 163 if (delete_in_client_callback_) | |
| 164 testable_writer_.reset(NULL); | |
| 165 } | |
| 166 | |
| 167 protected: | |
| 168 void reset() { | |
| 169 testable_writer_.reset(new TestableFileWriter(this)); | |
| 170 delete_in_client_callback_ = false; | |
| 171 received_did_write_count_ = 0; | |
| 172 received_did_write_bytes_total_ = 0; | |
| 173 received_did_write_complete_ = false; | |
| 174 received_did_truncate_ = false; | |
| 175 received_did_fail_ = false; | |
| 176 fail_error_received_ = static_cast<WebKit::WebFileError>(0); | |
| 177 } | |
| 178 | |
| 179 scoped_ptr<TestableFileWriter> testable_writer_; | |
| 180 bool delete_in_client_callback_; | |
| 181 | |
| 182 // Observed WebFileWriterClient artifacts. | |
| 183 int received_did_write_count_; | |
| 184 long long received_did_write_bytes_total_; | |
| 185 bool received_did_write_complete_; | |
| 186 bool received_did_truncate_; | |
| 187 bool received_did_fail_; | |
| 188 WebKit::WebFileError fail_error_received_; | |
| 189 | |
| 190 DISALLOW_COPY_AND_ASSIGN(FileWriterTest); | |
| 191 }; | |
| 192 | |
| 193 TEST_F(FileWriterTest, BasicFileWrite) { | |
| 194 // Call the webkit facing api. | |
| 195 const GURL kBlobUrl("blob://bloburl/"); | |
| 196 writer()->write(kBasicFileWrite_Offset, kBlobUrl); | |
| 197 | |
| 198 // Check that the derived class gets called correctly. | |
| 199 EXPECT_TRUE(testable_writer_->received_write_); | |
| 200 EXPECT_EQ(testable_writer_->received_write_path_, | |
| 201 mock_path_as_gurl()); | |
| 202 EXPECT_EQ(kBasicFileWrite_Offset, | |
| 203 testable_writer_->received_write_offset_); | |
| 204 EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); | |
| 205 EXPECT_FALSE(testable_writer_->received_truncate_); | |
| 206 EXPECT_FALSE(testable_writer_->received_cancel_); | |
| 207 | |
| 208 // Check that the client gets called correctly. | |
| 209 EXPECT_EQ(1, received_did_write_count_); | |
| 210 EXPECT_TRUE(received_did_write_complete_); | |
| 211 EXPECT_EQ(1, received_did_write_bytes_total_); | |
| 212 EXPECT_FALSE(received_did_truncate_); | |
| 213 EXPECT_FALSE(received_did_fail_); | |
| 214 } | |
| 215 | |
| 216 TEST_F(FileWriterTest, BasicFileTruncate) { | |
| 217 // Call the webkit facing api. | |
| 218 writer()->truncate(kBasicFileTruncate_Offset); | |
| 219 | |
| 220 // Check that the derived class gets called correctly. | |
| 221 EXPECT_TRUE(testable_writer_->received_truncate_); | |
| 222 EXPECT_EQ(mock_path_as_gurl(), | |
| 223 testable_writer_->received_truncate_path_); | |
| 224 EXPECT_EQ(kBasicFileTruncate_Offset, | |
| 225 testable_writer_->received_truncate_offset_); | |
| 226 EXPECT_FALSE(testable_writer_->received_write_); | |
| 227 EXPECT_FALSE(testable_writer_->received_cancel_); | |
| 228 | |
| 229 // Check that the client gets called correctly. | |
| 230 EXPECT_TRUE(received_did_truncate_); | |
| 231 EXPECT_EQ(0, received_did_write_count_); | |
| 232 EXPECT_FALSE(received_did_fail_); | |
| 233 } | |
| 234 | |
| 235 TEST_F(FileWriterTest, ErrorFileWrite) { | |
| 236 // Call the webkit facing api. | |
| 237 const GURL kBlobUrl("blob://bloburl/"); | |
| 238 writer()->write(kErrorFileWrite_Offset, kBlobUrl); | |
| 239 | |
| 240 // Check that the derived class gets called correctly. | |
| 241 EXPECT_TRUE(testable_writer_->received_write_); | |
| 242 EXPECT_EQ(testable_writer_->received_write_path_, | |
| 243 mock_path_as_gurl()); | |
| 244 EXPECT_EQ(kErrorFileWrite_Offset, | |
| 245 testable_writer_->received_write_offset_); | |
| 246 EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); | |
| 247 EXPECT_FALSE(testable_writer_->received_truncate_); | |
| 248 EXPECT_FALSE(testable_writer_->received_cancel_); | |
| 249 | |
| 250 // Check that the client gets called correctly. | |
| 251 EXPECT_TRUE(received_did_fail_); | |
| 252 EXPECT_EQ(WebKit::WebFileErrorNotFound, fail_error_received_); | |
| 253 EXPECT_EQ(0, received_did_write_count_); | |
| 254 EXPECT_FALSE(received_did_truncate_); | |
| 255 } | |
| 256 | |
| 257 TEST_F(FileWriterTest, ErrorFileTruncate) { | |
| 258 // Call the webkit facing api. | |
| 259 writer()->truncate(kErrorFileTruncate_Offset); | |
| 260 | |
| 261 // Check that the derived class gets called correctly. | |
| 262 EXPECT_TRUE(testable_writer_->received_truncate_); | |
| 263 EXPECT_EQ(mock_path_as_gurl(), | |
| 264 testable_writer_->received_truncate_path_); | |
| 265 EXPECT_EQ(kErrorFileTruncate_Offset, | |
| 266 testable_writer_->received_truncate_offset_); | |
| 267 EXPECT_FALSE(testable_writer_->received_write_); | |
| 268 EXPECT_FALSE(testable_writer_->received_cancel_); | |
| 269 | |
| 270 // Check that the client gets called correctly. | |
| 271 EXPECT_TRUE(received_did_fail_); | |
| 272 EXPECT_EQ(WebKit::WebFileErrorNotFound, fail_error_received_); | |
| 273 EXPECT_FALSE(received_did_truncate_); | |
| 274 EXPECT_EQ(0, received_did_write_count_); | |
| 275 } | |
| 276 | |
| 277 TEST_F(FileWriterTest, MultiFileWrite) { | |
| 278 // Call the webkit facing api. | |
| 279 const GURL kBlobUrl("blob://bloburl/"); | |
| 280 writer()->write(kMultiFileWrite_Offset, kBlobUrl); | |
| 281 | |
| 282 // Check that the derived class gets called correctly. | |
| 283 EXPECT_TRUE(testable_writer_->received_write_); | |
| 284 EXPECT_EQ(testable_writer_->received_write_path_, | |
| 285 mock_path_as_gurl()); | |
| 286 EXPECT_EQ(kMultiFileWrite_Offset, | |
| 287 testable_writer_->received_write_offset_); | |
| 288 EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); | |
| 289 EXPECT_FALSE(testable_writer_->received_truncate_); | |
| 290 EXPECT_FALSE(testable_writer_->received_cancel_); | |
| 291 | |
| 292 // Check that the client gets called correctly. | |
| 293 EXPECT_EQ(3, received_did_write_count_); | |
| 294 EXPECT_TRUE(received_did_write_complete_); | |
| 295 EXPECT_EQ(3, received_did_write_bytes_total_); | |
| 296 EXPECT_FALSE(received_did_truncate_); | |
| 297 EXPECT_FALSE(received_did_fail_); | |
| 298 } | |
| 299 | |
| 300 TEST_F(FileWriterTest, CancelFileWriteBeforeCompletion) { | |
| 301 // Call the webkit facing api. | |
| 302 const GURL kBlobUrl("blob://bloburl/"); | |
| 303 writer()->write(kCancelFileWriteBeforeCompletion_Offset, kBlobUrl); | |
| 304 | |
| 305 // Check that the derived class gets called correctly. | |
| 306 EXPECT_TRUE(testable_writer_->received_write_); | |
| 307 EXPECT_EQ(testable_writer_->received_write_path_, | |
| 308 mock_path_as_gurl()); | |
| 309 EXPECT_EQ(kCancelFileWriteBeforeCompletion_Offset, | |
| 310 testable_writer_->received_write_offset_); | |
| 311 EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); | |
| 312 EXPECT_TRUE(testable_writer_->received_cancel_); | |
| 313 EXPECT_FALSE(testable_writer_->received_truncate_); | |
| 314 | |
| 315 // Check that the client gets called correctly. | |
| 316 EXPECT_TRUE(received_did_fail_); | |
| 317 EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); | |
| 318 EXPECT_EQ(1, received_did_write_count_); | |
| 319 EXPECT_FALSE(received_did_write_complete_); | |
| 320 EXPECT_EQ(1, received_did_write_bytes_total_); | |
| 321 EXPECT_FALSE(received_did_truncate_); | |
| 322 } | |
| 323 | |
| 324 TEST_F(FileWriterTest, CancelFileWriteAfterCompletion) { | |
| 325 // Call the webkit facing api. | |
| 326 const GURL kBlobUrl("blob://bloburl/"); | |
| 327 writer()->write(kCancelFileWriteAfterCompletion_Offset, kBlobUrl); | |
| 328 | |
| 329 // Check that the derived class gets called correctly. | |
| 330 EXPECT_TRUE(testable_writer_->received_write_); | |
| 331 EXPECT_EQ(testable_writer_->received_write_path_, | |
| 332 mock_path_as_gurl()); | |
| 333 EXPECT_EQ(kCancelFileWriteAfterCompletion_Offset, | |
| 334 testable_writer_->received_write_offset_); | |
| 335 EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); | |
| 336 EXPECT_TRUE(testable_writer_->received_cancel_); | |
| 337 EXPECT_FALSE(testable_writer_->received_truncate_); | |
| 338 | |
| 339 // Check that the client gets called correctly. | |
| 340 EXPECT_TRUE(received_did_fail_); | |
| 341 EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); | |
| 342 EXPECT_EQ(1, received_did_write_count_); | |
| 343 EXPECT_FALSE(received_did_write_complete_); | |
| 344 EXPECT_EQ(1, received_did_write_bytes_total_); | |
| 345 EXPECT_FALSE(received_did_truncate_); | |
| 346 } | |
| 347 | |
| 348 TEST_F(FileWriterTest, CancelFileTruncate) { | |
| 349 // Call the webkit facing api. | |
| 350 writer()->truncate(kCancelFileTruncate_Offset); | |
| 351 | |
| 352 // Check that the derived class gets called correctly. | |
| 353 EXPECT_TRUE(testable_writer_->received_truncate_); | |
| 354 EXPECT_EQ(mock_path_as_gurl(), | |
| 355 testable_writer_->received_truncate_path_); | |
| 356 EXPECT_EQ(kCancelFileTruncate_Offset, | |
| 357 testable_writer_->received_truncate_offset_); | |
| 358 EXPECT_TRUE(testable_writer_->received_cancel_); | |
| 359 EXPECT_FALSE(testable_writer_->received_write_); | |
| 360 | |
| 361 // Check that the client gets called correctly. | |
| 362 EXPECT_TRUE(received_did_fail_); | |
| 363 EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); | |
| 364 EXPECT_FALSE(received_did_truncate_); | |
| 365 EXPECT_EQ(0, received_did_write_count_); | |
| 366 } | |
| 367 | |
| 368 TEST_F(FileWriterTest, CancelFailedTruncate) { | |
| 369 // Call the webkit facing api. | |
| 370 writer()->truncate(kCancelFailedTruncate_Offset); | |
| 371 | |
| 372 // Check that the derived class gets called correctly. | |
| 373 EXPECT_TRUE(testable_writer_->received_truncate_); | |
| 374 EXPECT_EQ(mock_path_as_gurl(), | |
| 375 testable_writer_->received_truncate_path_); | |
| 376 EXPECT_EQ(kCancelFailedTruncate_Offset, | |
| 377 testable_writer_->received_truncate_offset_); | |
| 378 EXPECT_TRUE(testable_writer_->received_cancel_); | |
| 379 EXPECT_FALSE(testable_writer_->received_write_); | |
| 380 | |
| 381 // Check that the client gets called correctly. | |
| 382 EXPECT_TRUE(received_did_fail_); | |
| 383 EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); | |
| 384 EXPECT_FALSE(received_did_truncate_); | |
| 385 EXPECT_EQ(0, received_did_write_count_); | |
| 386 } | |
| 387 | |
| 388 TEST_F(FileWriterTest, DeleteInCompletionCallbacks) { | |
| 389 delete_in_client_callback_ = true; | |
| 390 writer()->write(kBasicFileWrite_Offset, GURL("blob://bloburl/")); | |
| 391 EXPECT_FALSE(testable_writer_.get()); | |
| 392 | |
| 393 reset(); | |
| 394 delete_in_client_callback_ = true; | |
| 395 writer()->truncate(kBasicFileTruncate_Offset); | |
| 396 EXPECT_FALSE(testable_writer_.get()); | |
| 397 | |
| 398 reset(); | |
| 399 delete_in_client_callback_ = true; | |
| 400 writer()->write(kErrorFileWrite_Offset, GURL("blob://bloburl/")); | |
| 401 EXPECT_FALSE(testable_writer_.get()); | |
| 402 | |
| 403 reset(); | |
| 404 delete_in_client_callback_ = true; | |
| 405 writer()->truncate(kErrorFileTruncate_Offset); | |
| 406 EXPECT_FALSE(testable_writer_.get()); | |
| 407 | |
| 408 // Not crashing counts as passing. | |
| 409 } | |
| 410 | |
| 411 } // namespace fileapi | |
| OLD | NEW |