Skip to content

Commit

Permalink
Implement CannedSyncableFileSystem.Write for write testing
Browse files Browse the repository at this point in the history
Also factor out MockBlobURLRequestContext class so that we can easily
test writing with blob urls.

BUG=148897
TEST=LocalFileChangeTrackerTest.*
TBR=jam@chromium.org

Review URL: https://codereview.chromium.org/11146015

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@162078 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
kinuko@chromium.org committed Oct 16, 2012
1 parent b1b800c commit 169adeb
Show file tree
Hide file tree
Showing 8 changed files with 279 additions and 165 deletions.
2 changes: 2 additions & 0 deletions content/content_tests.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,8 @@
'../webkit/blob/blob_storage_controller_unittest.cc',
'../webkit/blob/blob_url_request_job_unittest.cc',
'../webkit/blob/local_file_stream_reader_unittest.cc',
'../webkit/blob/mock_blob_url_request_context.cc',
'../webkit/blob/mock_blob_url_request_context.h',
'../webkit/blob/shareable_file_reference_unittest.cc',
'../webkit/database/database_connections_unittest.cc',
'../webkit/database/database_quota_client_unittest.cc',
Expand Down
68 changes: 68 additions & 0 deletions webkit/blob/mock_blob_url_request_context.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright (c) 2012 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/blob/mock_blob_url_request_context.h"

#include "webkit/blob/blob_data.h"
#include "webkit/blob/blob_storage_controller.h"
#include "webkit/blob/blob_url_request_job.h"

namespace webkit_blob {

namespace {

class MockBlobProtocolHandler
: public net::URLRequestJobFactory::ProtocolHandler {
public:
explicit MockBlobProtocolHandler(
BlobStorageController* blob_storage_controller)
: blob_storage_controller_(blob_storage_controller) {}

virtual ~MockBlobProtocolHandler() {}

virtual net::URLRequestJob* MaybeCreateJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const OVERRIDE {
return new BlobURLRequestJob(
request,
network_delegate,
blob_storage_controller_->GetBlobDataFromUrl(request->url()),
base::MessageLoopProxy::current());
}

private:
webkit_blob::BlobStorageController* const blob_storage_controller_;

DISALLOW_COPY_AND_ASSIGN(MockBlobProtocolHandler);
};

} // namespace

MockBlobURLRequestContext::MockBlobURLRequestContext()
: blob_storage_controller_(new BlobStorageController) {
// Job factory owns the protocol handler.
job_factory_.SetProtocolHandler(
"blob", new MockBlobProtocolHandler(blob_storage_controller_.get()));
set_job_factory(&job_factory_);
}

MockBlobURLRequestContext::~MockBlobURLRequestContext() {}

ScopedTextBlob::ScopedTextBlob(
const MockBlobURLRequestContext& request_context,
const GURL& blob_url,
const std::string& data)
: blob_url_(blob_url),
blob_storage_controller_(request_context.blob_storage_controller()) {
DCHECK(blob_storage_controller_);
scoped_refptr<BlobData> blob_data(new BlobData());
blob_data->AppendData(data);
blob_storage_controller_->AddFinishedBlob(blob_url_, blob_data);
}

ScopedTextBlob::~ScopedTextBlob() {
blob_storage_controller_->RemoveBlob(blob_url_);
}

} // namespace webkit_blob
48 changes: 48 additions & 0 deletions webkit/blob/mock_blob_url_request_context.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright (c) 2012 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.

#ifndef WEBKIT_BLOB_MOCK_BLOB_URL_REQUEST_CONTEXT_H_
#define WEBKIT_BLOB_MOCK_BLOB_URL_REQUEST_CONTEXT_H_

#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_job.h"
#include "net/url_request/url_request_job_factory_impl.h"

namespace webkit_blob {

class BlobStorageController;

class MockBlobURLRequestContext : public net::URLRequestContext {
public:
MockBlobURLRequestContext();
virtual ~MockBlobURLRequestContext();

BlobStorageController* blob_storage_controller() const {
return blob_storage_controller_.get();
}

private:
net::URLRequestJobFactoryImpl job_factory_;
scoped_ptr<BlobStorageController> blob_storage_controller_;

DISALLOW_COPY_AND_ASSIGN(MockBlobURLRequestContext);
};

class ScopedTextBlob {
public:
ScopedTextBlob(const MockBlobURLRequestContext& request_context,
const GURL& blob_url,
const std::string& data);
~ScopedTextBlob();

private:
const GURL blob_url_;
BlobStorageController* blob_storage_controller_;

DISALLOW_COPY_AND_ASSIGN(ScopedTextBlob);
};

} // namespace webkit_blob

#endif // WEBKIT_BLOB_MOCK_BLOB_URL_REQUEST_CONTEXT_H_
136 changes: 23 additions & 113 deletions webkit/fileapi/local_file_system_operation_write_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "webkit/blob/blob_data.h"
#include "webkit/blob/blob_storage_controller.h"
#include "webkit/blob/blob_url_request_job.h"
#include "webkit/blob/mock_blob_url_request_context.h"
#include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/file_system_file_util.h"
#include "webkit/fileapi/file_system_util.h"
Expand All @@ -28,6 +29,8 @@
#include "webkit/quota/quota_manager.h"

using quota::QuotaManager;
using webkit_blob::MockBlobURLRequestContext;
using webkit_blob::ScopedTextBlob;

namespace fileapi {

Expand Down Expand Up @@ -157,64 +160,15 @@ class LocalFileSystemOperationWriteTest
int64 bytes_written_;
bool complete_;

MockBlobURLRequestContext url_request_context_;

DISALLOW_COPY_AND_ASSIGN(LocalFileSystemOperationWriteTest);

private:
MockFileChangeObserver change_observer_;
ChangeObserverList change_observers_;
};

namespace {

class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
public:
explicit TestProtocolHandler(
webkit_blob::BlobStorageController* blob_storage_controller)
: blob_storage_controller_(blob_storage_controller) {}

virtual ~TestProtocolHandler() {}

virtual net::URLRequestJob* MaybeCreateJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const OVERRIDE {
return new webkit_blob::BlobURLRequestJob(
request,
network_delegate,
blob_storage_controller_->GetBlobDataFromUrl(request->url()),
base::MessageLoopProxy::current());
}

private:
webkit_blob::BlobStorageController* const blob_storage_controller_;

DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler);
};

class TestURLRequestContext : public net::URLRequestContext {
public:
TestURLRequestContext()
: blob_storage_controller_(new webkit_blob::BlobStorageController) {
// Job factory owns the protocol handler.
job_factory_.SetProtocolHandler(
"blob", new TestProtocolHandler(blob_storage_controller_.get()));
set_job_factory(&job_factory_);
}

virtual ~TestURLRequestContext() {}

webkit_blob::BlobStorageController* blob_storage_controller() const {
return blob_storage_controller_.get();
}

private:
net::URLRequestJobFactoryImpl job_factory_;
scoped_ptr<webkit_blob::BlobStorageController> blob_storage_controller_;

DISALLOW_COPY_AND_ASSIGN(TestURLRequestContext);
};

} // namespace (anonymous)

void LocalFileSystemOperationWriteTest::SetUp() {
ASSERT_TRUE(dir_.CreateUniqueTempDir());
FilePath base_dir = dir_.path().AppendASCII("filesystem");
Expand Down Expand Up @@ -243,20 +197,13 @@ LocalFileSystemOperation* LocalFileSystemOperationWriteTest::operation() {
}

TEST_F(LocalFileSystemOperationWriteTest, TestWriteSuccess) {
GURL blob_url("blob:success");
scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
blob_data->AppendData("Hello, world!\n");
const GURL blob_url("blob:success");
ScopedTextBlob blob(url_request_context_, blob_url, "Hello, world!\n");

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);

operation()->Write(&url_request_context, URLForPath(virtual_path_), blob_url,
operation()->Write(&url_request_context_, URLForPath(virtual_path_), blob_url,
0, RecordWriteCallback());
MessageLoop::current()->Run();

url_request_context.blob_storage_controller()->RemoveBlob(blob_url);

EXPECT_EQ(14, bytes_written());
EXPECT_EQ(base::PLATFORM_FILE_OK, status());
EXPECT_TRUE(complete());
Expand All @@ -268,15 +215,14 @@ TEST_F(LocalFileSystemOperationWriteTest, TestWriteZero) {
GURL blob_url("blob:zero");
scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
url_request_context_.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);

operation()->Write(&url_request_context, URLForPath(virtual_path_),
operation()->Write(&url_request_context_, URLForPath(virtual_path_),
blob_url, 0, RecordWriteCallback());
MessageLoop::current()->Run();

url_request_context.blob_storage_controller()->RemoveBlob(blob_url);
url_request_context_.blob_storage_controller()->RemoveBlob(blob_url);

EXPECT_EQ(0, bytes_written());
EXPECT_EQ(base::PLATFORM_FILE_OK, status());
Expand All @@ -286,9 +232,7 @@ TEST_F(LocalFileSystemOperationWriteTest, TestWriteZero) {
}

TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidBlobUrl) {
TestURLRequestContext url_request_context;

operation()->Write(&url_request_context, URLForPath(virtual_path_),
operation()->Write(&url_request_context_, URLForPath(virtual_path_),
GURL("blob:invalid"), 0, RecordWriteCallback());
MessageLoop::current()->Run();

Expand All @@ -301,20 +245,13 @@ TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidBlobUrl) {

TEST_F(LocalFileSystemOperationWriteTest, TestWriteInvalidFile) {
GURL blob_url("blob:writeinvalidfile");
scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
blob_data->AppendData("It\'ll not be written.");

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);
ScopedTextBlob blob(url_request_context_, blob_url, "It\'ll not be written.");

operation()->Write(&url_request_context,
operation()->Write(&url_request_context_,
URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))),
blob_url, 0, RecordWriteCallback());
MessageLoop::current()->Run();

url_request_context.blob_storage_controller()->RemoveBlob(blob_url);

EXPECT_EQ(0, bytes_written());
EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status());
EXPECT_TRUE(complete());
Expand All @@ -330,19 +267,13 @@ TEST_F(LocalFileSystemOperationWriteTest, TestWriteDir) {
base::Bind(&AssertStatusEq, base::PLATFORM_FILE_OK));

GURL blob_url("blob:writedir");
scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
blob_data->AppendData("It\'ll not be written, too.");

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);
ScopedTextBlob blob(url_request_context_, blob_url,
"It\'ll not be written, too.");

operation()->Write(&url_request_context, URLForPath(virtual_dir_path),
operation()->Write(&url_request_context_, URLForPath(virtual_dir_path),
blob_url, 0, RecordWriteCallback());
MessageLoop::current()->Run();

url_request_context.blob_storage_controller()->RemoveBlob(blob_url);

EXPECT_EQ(0, bytes_written());
// TODO(kinuko): This error code is platform- or fileutil- dependent
// right now. Make it return PLATFORM_FILE_ERROR_NOT_A_FILE in every case.
Expand All @@ -356,20 +287,13 @@ TEST_F(LocalFileSystemOperationWriteTest, TestWriteDir) {

TEST_F(LocalFileSystemOperationWriteTest, TestWriteFailureByQuota) {
GURL blob_url("blob:success");
scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
blob_data->AppendData("Hello, world!\n");

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);
ScopedTextBlob blob(url_request_context_, blob_url, "Hello, world!\n");

quota_manager_->set_quota(10);
operation()->Write(&url_request_context, URLForPath(virtual_path_), blob_url,
operation()->Write(&url_request_context_, URLForPath(virtual_path_), blob_url,
0, RecordWriteCallback());
MessageLoop::current()->Run();

url_request_context.blob_storage_controller()->RemoveBlob(blob_url);

EXPECT_EQ(10, bytes_written());
EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status());
EXPECT_TRUE(complete());
Expand All @@ -379,24 +303,17 @@ TEST_F(LocalFileSystemOperationWriteTest, TestWriteFailureByQuota) {

TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) {
GURL blob_url("blob:success");
scoped_refptr<webkit_blob::BlobData> blob_data(new webkit_blob::BlobData());
blob_data->AppendData("Hello, world!\n");

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);
ScopedTextBlob blob(url_request_context_, blob_url, "Hello, world!\n");

FileSystemOperation* write_operation = operation();
write_operation->Write(&url_request_context, URLForPath(virtual_path_),
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());
Expand All @@ -409,15 +326,10 @@ TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelSuccessfulWrite) {

TEST_F(LocalFileSystemOperationWriteTest, 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.");

TestURLRequestContext url_request_context;
url_request_context.blob_storage_controller()->AddFinishedBlob(
blob_url, blob_data);
ScopedTextBlob blob(url_request_context_, blob_url, "It\'ll not be written.");

FileSystemOperation* write_operation = operation();
write_operation->Write(&url_request_context,
write_operation->Write(&url_request_context_,
URLForPath(FilePath(FILE_PATH_LITERAL("nonexist"))),
blob_url, 0, RecordWriteCallback());
write_operation->Cancel(RecordCancelCallback());
Expand All @@ -426,8 +338,6 @@ TEST_F(LocalFileSystemOperationWriteTest, TestImmediateCancelFailingWrite) {
// 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());
Expand Down
Loading

0 comments on commit 169adeb

Please sign in to comment.