Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Unified Diff: webkit/fileapi/file_system_operation_write_unittest.cc

Issue 9372044: Refactor FileSystemOperation to take callback for each method. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reflected kinuko's comments + Fixture for failing-Write -> Cancel pattern. Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/fileapi/file_system_operation_unittest.cc ('k') | webkit/fileapi/file_system_quota_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/fileapi/file_system_operation_write_unittest.cc
diff --git a/webkit/fileapi/file_system_operation_write_unittest.cc b/webkit/fileapi/file_system_operation_write_unittest.cc
index 28d0298d5041ec06aa87839f9d73b471e97637e2..7f4917df602bc446886cb91ac7fcd2040daf41ef 100644
--- a/webkit/fileapi/file_system_operation_write_unittest.cc
+++ b/webkit/fileapi/file_system_operation_write_unittest.cc
@@ -11,6 +11,7 @@
#include <vector>
#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "base/message_loop.h"
#include "base/message_loop.h"
#include "base/message_loop_proxy.h"
@@ -23,7 +24,6 @@
#include "webkit/blob/blob_data.h"
#include "webkit/blob/blob_storage_controller.h"
#include "webkit/blob/blob_url_request_job.h"
-#include "webkit/fileapi/file_system_callback_dispatcher.h"
#include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/file_system_file_util.h"
#include "webkit/fileapi/file_system_operation.h"
@@ -65,25 +65,22 @@ class MockQuotaManager : public QuotaManager {
} // namespace (anonymous)
-class FileSystemOperationWriteTest : public testing::Test {
+class FileSystemOperationWriteTest
+ : public testing::Test,
+ public base::SupportsWeakPtr<FileSystemOperationWriteTest> {
public:
FileSystemOperationWriteTest()
: local_file_util_(new LocalFileUtil(QuotaFileUtil::CreateDefault())),
loop_(MessageLoop::TYPE_IO),
status_(base::PLATFORM_FILE_OK),
+ cancel_status_(base::PLATFORM_FILE_ERROR_FAILED),
bytes_written_(0),
complete_(false) {}
FileSystemOperation* operation();
- void set_failure_status(base::PlatformFileError status) {
- EXPECT_FALSE(complete_);
- EXPECT_EQ(status_, base::PLATFORM_FILE_OK);
- EXPECT_NE(status, base::PLATFORM_FILE_OK);
- complete_ = true;
- status_ = status;
- }
base::PlatformFileError status() const { return status_; }
+ base::PlatformFileError cancel_status() const { return cancel_status_; }
void add_bytes_written(int64 bytes, bool complete) {
bytes_written_ += bytes;
EXPECT_FALSE(complete_);
@@ -100,6 +97,34 @@ class FileSystemOperationWriteTest : public testing::Test {
return test_helper_.GetURLForPath(path);
}
+ // Callback function for recording test results.
+ FileSystemOperationInterface::WriteCallback RecordWriteCallback() {
+ return base::Bind(&FileSystemOperationWriteTest::DidWrite, AsWeakPtr());
+ }
+
+ FileSystemOperationInterface::StatusCallback RecordCancelCallback() {
+ return base::Bind(&FileSystemOperationWriteTest::DidCancel, AsWeakPtr());
+ }
+
+ void DidWrite(base::PlatformFileError status, int64 bytes, bool complete) {
+ if (status == base::PLATFORM_FILE_OK) {
+ add_bytes_written(bytes, complete);
+ if (complete)
+ MessageLoop::current()->Quit();
+ } else {
+ EXPECT_FALSE(complete_);
+ EXPECT_EQ(status_, base::PLATFORM_FILE_OK);
+ complete_ = true;
+ status_ = status;
+ if (MessageLoop::current()->is_running())
+ MessageLoop::current()->Quit();
+ }
+ }
+
+ void DidCancel(base::PlatformFileError status) {
+ cancel_status_ = status;
+ }
+
scoped_ptr<LocalFileUtil> local_file_util_;
scoped_refptr<MockQuotaManager> quota_manager_;
FileSystemTestOriginHelper test_helper_;
@@ -113,6 +138,7 @@ class FileSystemOperationWriteTest : public testing::Test {
// For post-operation status.
base::PlatformFileError status_;
+ base::PlatformFileError cancel_status_;
int64 bytes_written_;
bool complete_;
@@ -147,45 +173,6 @@ static net::URLRequestJob* BlobURLRequestJobFactory(net::URLRequest* request,
base::MessageLoopProxy::current());
}
-class MockDispatcher : public FileSystemCallbackDispatcher {
- public:
- MockDispatcher(FileSystemOperationWriteTest* test) : test_(test) { }
-
- virtual void DidFail(base::PlatformFileError status) {
- test_->set_failure_status(status);
- MessageLoop::current()->Quit();
- }
-
- virtual void DidSucceed() {
- ADD_FAILURE();
- }
-
- virtual void DidReadMetadata(
- const base::PlatformFileInfo& info,
- const FilePath& platform_path) {
- ADD_FAILURE();
- }
-
- virtual void DidReadDirectory(
- const std::vector<base::FileUtilProxy::Entry>& entries,
- bool /* has_more */) {
- ADD_FAILURE();
- }
-
- virtual void DidOpenFileSystem(const std::string&, const GURL&) {
- ADD_FAILURE();
- }
-
- virtual void DidWrite(int64 bytes, bool complete) {
- test_->add_bytes_written(bytes, complete);
- if (complete)
- MessageLoop::current()->Quit();
- }
-
- private:
- FileSystemOperationWriteTest* test_;
-};
-
} // namespace (anonymous)
void FileSystemOperationWriteTest::SetUp() {
@@ -213,7 +200,7 @@ void FileSystemOperationWriteTest::TearDown() {
}
FileSystemOperation* FileSystemOperationWriteTest::operation() {
- return test_helper_.NewOperation(new MockDispatcher(this));
+ return test_helper_.NewOperation();
}
TEST_F(FileSystemOperationWriteTest, TestWriteSuccess) {
@@ -227,7 +214,7 @@ TEST_F(FileSystemOperationWriteTest, TestWriteSuccess) {
blob_url, blob_data);
operation()->Write(url_request_context, URLForPath(virtual_path_), blob_url,
- 0);
+ 0, RecordWriteCallback());
MessageLoop::current()->Run();
url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
@@ -248,7 +235,7 @@ TEST_F(FileSystemOperationWriteTest, TestWriteZero) {
blob_url, blob_data);
operation()->Write(url_request_context, URLForPath(virtual_path_),
- blob_url, 0);
+ blob_url, 0, RecordWriteCallback());
MessageLoop::current()->Run();
url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
@@ -263,7 +250,7 @@ TEST_F(FileSystemOperationWriteTest, TestWriteInvalidBlobUrl) {
new TestURLRequestContext());
operation()->Write(url_request_context, URLForPath(virtual_path_),
- GURL("blob:invalid"), 0);
+ GURL("blob:invalid"), 0, RecordWriteCallback());
MessageLoop::current()->Run();
EXPECT_EQ(0, bytes_written());
@@ -283,7 +270,7 @@ TEST_F(FileSystemOperationWriteTest, TestWriteInvalidFile) {
operation()->Write(url_request_context,
URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))),
- blob_url, 0);
+ blob_url, 0, RecordWriteCallback());
MessageLoop::current()->Run();
url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
@@ -310,7 +297,7 @@ TEST_F(FileSystemOperationWriteTest, TestWriteDir) {
blob_url, blob_data);
operation()->Write(url_request_context, URLForPath(virtual_subdir_path),
- blob_url, 0);
+ blob_url, 0, RecordWriteCallback());
MessageLoop::current()->Run();
url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
@@ -332,7 +319,7 @@ TEST_F(FileSystemOperationWriteTest, TestWriteFailureByQuota) {
quota_manager_->set_quota(10);
operation()->Write(url_request_context, URLForPath(virtual_path_), blob_url,
- 0);
+ 0, RecordWriteCallback());
MessageLoop::current()->Run();
url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
@@ -342,6 +329,65 @@ TEST_F(FileSystemOperationWriteTest, TestWriteFailureByQuota) {
EXPECT_TRUE(complete());
}
-// TODO(ericu,dmikurube): Add tests for Cancel.
+TEST_F(FileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) {
+ GURL blob_url("blob:success");
+ scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
+ blob_data->AppendData("Hello, world!\n");
+
+ scoped_refptr<TestURLRequestContext> url_request_context(
+ new TestURLRequestContext());
+ url_request_context->blob_storage_controller()->AddFinishedBlob(
+ blob_url, blob_data);
+
+ FileSystemOperationInterface* write_operation = operation();
+ write_operation->Write(url_request_context, URLForPath(virtual_path_),
+ blob_url, 0, RecordWriteCallback());
+ write_operation->Cancel(RecordCancelCallback());
+ // We use RunAllPendings() instead of Run() here, because we won't dispatch
+ // callbacks after Cancel() is issued (so no chance to Quit) nor do we need
+ // to run another write cycle.
+ MessageLoop::current()->RunAllPending();
+
+ url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
+
+ // Issued Cancel() before receiving any response from Write(),
+ // so nothing should have happen.
+ EXPECT_EQ(0, bytes_written());
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status());
+ EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status());
+ EXPECT_TRUE(complete());
+}
+
+TEST_F(FileSystemOperationWriteTest, TestImmediateCancelFailingWrite) {
+ GURL blob_url("blob:writeinvalidfile");
+ scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
+ blob_data->AppendData("It\'ll not be written.");
+
+ scoped_refptr<TestURLRequestContext> url_request_context(
+ new TestURLRequestContext());
+ url_request_context->blob_storage_controller()->AddFinishedBlob(
+ blob_url, blob_data);
+
+ FileSystemOperationInterface* write_operation = operation();
+ write_operation->Write(url_request_context,
+ URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))),
+ blob_url, 0, RecordWriteCallback());
+ write_operation->Cancel(RecordCancelCallback());
+ // We use RunAllPendings() instead of Run() here, because we won't dispatch
+ // callbacks after Cancel() is issued (so no chance to Quit) nor do we need
+ // to run another write cycle.
+ MessageLoop::current()->RunAllPending();
+
+ url_request_context->blob_storage_controller()->RemoveBlob(blob_url);
+
+ // Issued Cancel() before receiving any response from Write(),
+ // so nothing should have happen.
+ EXPECT_EQ(0, bytes_written());
+ EXPECT_EQ(base::PLATFORM_FILE_ERROR_ABORT, status());
+ EXPECT_EQ(base::PLATFORM_FILE_OK, cancel_status());
+ EXPECT_TRUE(complete());
+}
+
+// TODO(ericu,dmikurube): Add more tests for Cancel.
} // namespace fileapi
« no previous file with comments | « webkit/fileapi/file_system_operation_unittest.cc ('k') | webkit/fileapi/file_system_quota_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698