diff options
-rw-r--r-- | webkit/fileapi/file_system_operation_unittest.cc | 14 | ||||
-rw-r--r-- | webkit/fileapi/webfilewriter_base_unittest.cc | 419 | ||||
-rw-r--r-- | webkit/tools/test_shell/test_shell.gypi | 1 |
3 files changed, 429 insertions, 5 deletions
diff --git a/webkit/fileapi/file_system_operation_unittest.cc b/webkit/fileapi/file_system_operation_unittest.cc index 00e13ad..fb300bf 100644 --- a/webkit/fileapi/file_system_operation_unittest.cc +++ b/webkit/fileapi/file_system_operation_unittest.cc @@ -12,17 +12,19 @@ #include "webkit/fileapi/file_system_callback_dispatcher.h" #include "webkit/fileapi/file_system_operation.h" +namespace fileapi { + const int kInvalidRequestId = -1; const int kFileOperationStatusNotSet = 0; const int kFileOperationSucceeded = 1; static int last_request_id = -1; -bool FileExists(FilePath path) { +static bool FileExists(FilePath path) { return file_util::PathExists(path) && !file_util::DirectoryExists(path); } -class MockDispatcher : public fileapi::FileSystemCallbackDispatcher { +class MockDispatcher : public FileSystemCallbackDispatcher { public: MockDispatcher(int request_id) : status_(kFileOperationStatusNotSet), @@ -80,10 +82,10 @@ class FileSystemOperationTest : public testing::Test { EXPECT_TRUE(base_.IsValid()); } - fileapi::FileSystemOperation* operation() { + FileSystemOperation* operation() { request_id_ = ++last_request_id; mock_dispatcher_ = new MockDispatcher(request_id_); - operation_.reset(new fileapi::FileSystemOperation( + operation_.reset(new FileSystemOperation( mock_dispatcher_, base::MessageLoopProxy::CreateForCurrentThread())); return operation_.get(); } @@ -93,7 +95,7 @@ class FileSystemOperationTest : public testing::Test { ScopedTempDir base_; int request_id_; - scoped_ptr<fileapi::FileSystemOperation> operation_; + scoped_ptr<FileSystemOperation> operation_; // Owned by |operation_|. MockDispatcher* mock_dispatcher_; @@ -784,3 +786,5 @@ TEST_F(FileSystemOperationTest, TestTruncate) { for (int i = 0; i < length; ++i) EXPECT_EQ(test_data[i], data[i]); } + +} // namespace fileapi diff --git a/webkit/fileapi/webfilewriter_base_unittest.cc b/webkit/fileapi/webfilewriter_base_unittest.cc new file mode 100644 index 0000000..5be1936 --- /dev/null +++ b/webkit/fileapi/webfilewriter_base_unittest.cc @@ -0,0 +1,419 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "webkit/fileapi/webfilewriter_base.h" + +#include "base/logging.h" +#include "base/message_loop.h" +#include "base/scoped_ptr.h" +#include "base/utf_string_conversions.h" +#include "googleurl/src/gurl.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/WebKit/WebKit/chromium/public/WebFileError.h" +#include "third_party/WebKit/WebKit/chromium/public/WebFileWriterClient.h" +#include "third_party/WebKit/WebKit/chromium/public/WebURL.h" + +namespace fileapi { + +namespace { + +// We use particular offsets to trigger particular behaviors +// in the TestableFileWriter. +const int kNoOffset = -1; +const int kBasicFileTruncate_Offset = 1; +const int kErrorFileTruncate_Offset = 2; +const int kCancelFileTruncate_Offset = 3; +const int kCancelFailedTruncate_Offset = 4; +const int kBasicFileWrite_Offset = 1; +const int kErrorFileWrite_Offset = 2; +const int kMultiFileWrite_Offset = 3; +const int kCancelFileWriteBeforeCompletion_Offset = 4; +const int kCancelFileWriteAfterCompletion_Offset = 5; + +std::string mock_path_as_ascii() { + return std::string("MockPath"); +} + +string16 mock_path_as_string16() { + return ASCIIToUTF16(mock_path_as_ascii()); +} + +FilePath mock_path_as_file_path() { + return FilePath().AppendASCII(mock_path_as_ascii()); +} + +} // namespace + +class TestableFileWriter : public WebFileWriterBase { + public: + explicit TestableFileWriter(WebKit::WebFileWriterClient* client) + : WebFileWriterBase(mock_path_as_string16(), client) { + reset(); + } + + void reset() { + received_truncate_ = false; + received_truncate_path_ = FilePath(); + received_truncate_offset_ = kNoOffset; + received_write_ = false; + received_write_path_ = FilePath(); + received_write_offset_ = kNoOffset; + received_write_blob_url_ = GURL(); + received_cancel_ = false; + } + + bool received_truncate_; + FilePath received_truncate_path_; + int64 received_truncate_offset_; + bool received_write_; + FilePath received_write_path_; + GURL received_write_blob_url_; + int64 received_write_offset_; + bool received_cancel_; + + protected: + virtual void DoTruncate(const FilePath& path, int64 offset) { + received_truncate_ = true; + received_truncate_path_ = path; + received_truncate_offset_ = offset; + + if (offset == kBasicFileTruncate_Offset) { + DidSucceed(); + } else if (offset == kErrorFileTruncate_Offset) { + DidFail(base::PLATFORM_FILE_ERROR_NOT_FOUND); + } else if (offset == kCancelFileTruncate_Offset) { + cancel(); + DidSucceed(); // truncate completion + DidSucceed(); // cancel completion + } else if (offset == kCancelFailedTruncate_Offset) { + cancel(); + DidFail(base::PLATFORM_FILE_ERROR_NOT_FOUND); // truncate completion + DidSucceed(); // cancel completion + } else { + ASSERT_TRUE(false); + } + } + + virtual void DoWrite(const FilePath& path, const GURL& blob_url, + int64 offset) { + received_write_ = true; + received_write_path_ = path; + received_write_offset_ = offset; + received_write_blob_url_ = blob_url; + + if (offset == kBasicFileWrite_Offset) { + DidWrite(1, true); + } else if (offset == kErrorFileWrite_Offset) { + DidFail(base::PLATFORM_FILE_ERROR_NOT_FOUND); + } else if (offset == kMultiFileWrite_Offset) { + DidWrite(1, false); + DidWrite(1, false); + DidWrite(1, true); + } else if (offset == kCancelFileWriteBeforeCompletion_Offset) { + DidWrite(1, false); + cancel(); + DidWrite(1, false); + DidWrite(1, false); + DidFail(base::PLATFORM_FILE_ERROR_FAILED); // write completion + DidSucceed(); // cancel completion + } else if (offset == kCancelFileWriteAfterCompletion_Offset) { + DidWrite(1, false); + cancel(); + DidWrite(1, false); + DidWrite(1, false); + DidWrite(1, true); // write completion + DidFail(base::PLATFORM_FILE_ERROR_FAILED); // cancel completion + } else { + ASSERT_TRUE(false); + } + } + + virtual void DoCancel() { + received_cancel_ = true; + } +}; + +class FileWriterTest : public testing::Test, + public WebKit::WebFileWriterClient { + public: + FileWriterTest() { + reset(); + } + + WebKit::WebFileWriter* writer() { + return testable_writer_.get(); + } + + // WebFileWriterClient overrides + virtual void didWrite(long long bytes, bool complete) { + EXPECT_FALSE(received_did_write_complete_); + ++received_did_write_count_; + received_did_write_bytes_total_ += bytes; + if (complete) + received_did_write_complete_ = true; + + if (delete_in_client_callback_) + testable_writer_.reset(NULL); + } + + virtual void didTruncate() { + EXPECT_FALSE(received_did_truncate_); + received_did_truncate_ = true; + if (delete_in_client_callback_) + testable_writer_.reset(NULL); + } + + virtual void didFail(WebKit::WebFileError error) { + EXPECT_FALSE(received_did_fail_); + received_did_fail_ = true; + fail_error_received_ = error; + if (delete_in_client_callback_) + testable_writer_.reset(NULL); + } + + protected: + void reset() { + testable_writer_.reset(new TestableFileWriter(this)); + delete_in_client_callback_ = false; + received_did_write_count_ = 0; + received_did_write_bytes_total_ = 0; + received_did_write_complete_ = false; + received_did_truncate_ = false; + received_did_fail_ = false; + fail_error_received_ = static_cast<WebKit::WebFileError>(0); + } + + scoped_ptr<TestableFileWriter> testable_writer_; + bool delete_in_client_callback_; + + // Observed WebFileWriterClient artifacts. + int received_did_write_count_; + long long received_did_write_bytes_total_; + bool received_did_write_complete_; + bool received_did_truncate_; + bool received_did_fail_; + WebKit::WebFileError fail_error_received_; + + DISALLOW_COPY_AND_ASSIGN(FileWriterTest); +}; + +TEST_F(FileWriterTest, BasicFileWrite) { + // Call the webkit facing api. + const GURL kBlobUrl("blob://bloburl/"); + writer()->write(kBasicFileWrite_Offset, kBlobUrl); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_write_); + EXPECT_EQ(testable_writer_->received_write_path_.value(), + mock_path_as_file_path().value()); + EXPECT_EQ(kBasicFileWrite_Offset, + testable_writer_->received_write_offset_); + EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); + EXPECT_FALSE(testable_writer_->received_truncate_); + EXPECT_FALSE(testable_writer_->received_cancel_); + + // Check that the client gets called correctly. + EXPECT_EQ(1, received_did_write_count_); + EXPECT_TRUE(received_did_write_complete_); + EXPECT_EQ(1, received_did_write_bytes_total_); + EXPECT_FALSE(received_did_truncate_); + EXPECT_FALSE(received_did_fail_); +} + +TEST_F(FileWriterTest, BasicFileTruncate) { + // Call the webkit facing api. + writer()->truncate(kBasicFileTruncate_Offset); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_truncate_); + EXPECT_EQ(mock_path_as_file_path().value(), + testable_writer_->received_truncate_path_.value()); + EXPECT_EQ(kBasicFileTruncate_Offset, + testable_writer_->received_truncate_offset_); + EXPECT_FALSE(testable_writer_->received_write_); + EXPECT_FALSE(testable_writer_->received_cancel_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_truncate_); + EXPECT_EQ(0, received_did_write_count_); + EXPECT_FALSE(received_did_fail_); +} + +TEST_F(FileWriterTest, ErrorFileWrite) { + // Call the webkit facing api. + const GURL kBlobUrl("blob://bloburl/"); + writer()->write(kErrorFileWrite_Offset, kBlobUrl); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_write_); + EXPECT_EQ(testable_writer_->received_write_path_.value(), + mock_path_as_file_path().value()); + EXPECT_EQ(kErrorFileWrite_Offset, + testable_writer_->received_write_offset_); + EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); + EXPECT_FALSE(testable_writer_->received_truncate_); + EXPECT_FALSE(testable_writer_->received_cancel_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_fail_); + EXPECT_EQ(WebKit::WebFileErrorNotFound, fail_error_received_); + EXPECT_EQ(0, received_did_write_count_); + EXPECT_FALSE(received_did_truncate_); +} + +TEST_F(FileWriterTest, ErrorFileTruncate) { + // Call the webkit facing api. + writer()->truncate(kErrorFileTruncate_Offset); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_truncate_); + EXPECT_EQ(mock_path_as_file_path().value(), + testable_writer_->received_truncate_path_.value()); + EXPECT_EQ(kErrorFileTruncate_Offset, + testable_writer_->received_truncate_offset_); + EXPECT_FALSE(testable_writer_->received_write_); + EXPECT_FALSE(testable_writer_->received_cancel_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_fail_); + EXPECT_EQ(WebKit::WebFileErrorNotFound, fail_error_received_); + EXPECT_FALSE(received_did_truncate_); + EXPECT_EQ(0, received_did_write_count_); +} + +TEST_F(FileWriterTest, MultiFileWrite) { + // Call the webkit facing api. + const GURL kBlobUrl("blob://bloburl/"); + writer()->write(kMultiFileWrite_Offset, kBlobUrl); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_write_); + EXPECT_EQ(testable_writer_->received_write_path_.value(), + mock_path_as_file_path().value()); + EXPECT_EQ(kMultiFileWrite_Offset, + testable_writer_->received_write_offset_); + EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); + EXPECT_FALSE(testable_writer_->received_truncate_); + EXPECT_FALSE(testable_writer_->received_cancel_); + + // Check that the client gets called correctly. + EXPECT_EQ(3, received_did_write_count_); + EXPECT_TRUE(received_did_write_complete_); + EXPECT_EQ(3, received_did_write_bytes_total_); + EXPECT_FALSE(received_did_truncate_); + EXPECT_FALSE(received_did_fail_); +} + +TEST_F(FileWriterTest, CancelFileWriteBeforeCompletion) { + // Call the webkit facing api. + const GURL kBlobUrl("blob://bloburl/"); + writer()->write(kCancelFileWriteBeforeCompletion_Offset, kBlobUrl); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_write_); + EXPECT_EQ(testable_writer_->received_write_path_.value(), + mock_path_as_file_path().value()); + EXPECT_EQ(kCancelFileWriteBeforeCompletion_Offset, + testable_writer_->received_write_offset_); + EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); + EXPECT_TRUE(testable_writer_->received_cancel_); + EXPECT_FALSE(testable_writer_->received_truncate_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_fail_); + EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); + EXPECT_EQ(1, received_did_write_count_); + EXPECT_FALSE(received_did_write_complete_); + EXPECT_EQ(1, received_did_write_bytes_total_); + EXPECT_FALSE(received_did_truncate_); +} + +TEST_F(FileWriterTest, CancelFileWriteAfterCompletion) { + // Call the webkit facing api. + const GURL kBlobUrl("blob://bloburl/"); + writer()->write(kCancelFileWriteAfterCompletion_Offset, kBlobUrl); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_write_); + EXPECT_EQ(testable_writer_->received_write_path_.value(), + mock_path_as_file_path().value()); + EXPECT_EQ(kCancelFileWriteAfterCompletion_Offset, + testable_writer_->received_write_offset_); + EXPECT_EQ(kBlobUrl, testable_writer_->received_write_blob_url_); + EXPECT_TRUE(testable_writer_->received_cancel_); + EXPECT_FALSE(testable_writer_->received_truncate_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_fail_); + EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); + EXPECT_EQ(1, received_did_write_count_); + EXPECT_FALSE(received_did_write_complete_); + EXPECT_EQ(1, received_did_write_bytes_total_); + EXPECT_FALSE(received_did_truncate_); +} + +TEST_F(FileWriterTest, CancelFileTruncate) { + // Call the webkit facing api. + writer()->truncate(kCancelFileTruncate_Offset); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_truncate_); + EXPECT_EQ(mock_path_as_file_path().value(), + testable_writer_->received_truncate_path_.value()); + EXPECT_EQ(kCancelFileTruncate_Offset, + testable_writer_->received_truncate_offset_); + EXPECT_TRUE(testable_writer_->received_cancel_); + EXPECT_FALSE(testable_writer_->received_write_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_fail_); + EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); + EXPECT_FALSE(received_did_truncate_); + EXPECT_EQ(0, received_did_write_count_); +} + +TEST_F(FileWriterTest, CancelFailedTruncate) { + // Call the webkit facing api. + writer()->truncate(kCancelFailedTruncate_Offset); + + // Check that the derived class gets called correctly. + EXPECT_TRUE(testable_writer_->received_truncate_); + EXPECT_EQ(mock_path_as_file_path().value(), + testable_writer_->received_truncate_path_.value()); + EXPECT_EQ(kCancelFailedTruncate_Offset, + testable_writer_->received_truncate_offset_); + EXPECT_TRUE(testable_writer_->received_cancel_); + EXPECT_FALSE(testable_writer_->received_write_); + + // Check that the client gets called correctly. + EXPECT_TRUE(received_did_fail_); + EXPECT_EQ(WebKit::WebFileErrorAbort, fail_error_received_); + EXPECT_FALSE(received_did_truncate_); + EXPECT_EQ(0, received_did_write_count_); +} + +TEST_F(FileWriterTest, DeleteInCompletionCallbacks) { + delete_in_client_callback_ = true; + writer()->write(kBasicFileWrite_Offset, GURL("blob://bloburl/")); + EXPECT_FALSE(testable_writer_.get()); + + reset(); + delete_in_client_callback_ = true; + writer()->truncate(kBasicFileTruncate_Offset); + EXPECT_FALSE(testable_writer_.get()); + + reset(); + delete_in_client_callback_ = true; + writer()->write(kErrorFileWrite_Offset, GURL("blob://bloburl/")); + EXPECT_FALSE(testable_writer_.get()); + + reset(); + delete_in_client_callback_ = true; + writer()->truncate(kErrorFileTruncate_Offset); + EXPECT_FALSE(testable_writer_.get()); + + // Not crashing counts as passing. +} + +} // namespace fileapi diff --git a/webkit/tools/test_shell/test_shell.gypi b/webkit/tools/test_shell/test_shell.gypi index 14b7386..bdcb274 100644 --- a/webkit/tools/test_shell/test_shell.gypi +++ b/webkit/tools/test_shell/test_shell.gypi @@ -378,6 +378,7 @@ '../../fileapi/file_system_operation_unittest.cc', '../../fileapi/file_system_path_manager_unittest.cc', '../../fileapi/file_system_quota_unittest.cc', + '../../fileapi/webfilewriter_base_unittest.cc', '../../glue/bookmarklet_unittest.cc', '../../glue/context_menu_unittest.cc', '../../glue/cpp_bound_class_unittest.cc', |