| Index: webkit/fileapi/file_writer_delegate_unittest.cc
|
| diff --git a/webkit/fileapi/file_writer_delegate_unittest.cc b/webkit/fileapi/file_writer_delegate_unittest.cc
|
| deleted file mode 100644
|
| index 7d4ffcbefcd84a4630f477f93638270549091e6f..0000000000000000000000000000000000000000
|
| --- a/webkit/fileapi/file_writer_delegate_unittest.cc
|
| +++ /dev/null
|
| @@ -1,465 +0,0 @@
|
| -// 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 <string>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/message_loop.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/url_request/url_request.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "net/url_request/url_request_job.h"
|
| -#include "net/url_request/url_request_status.h"
|
| -#include "testing/platform_test.h"
|
| -#include "webkit/browser/fileapi/file_system_file_util.h"
|
| -#include "webkit/browser/fileapi/file_system_quota_util.h"
|
| -#include "webkit/browser/fileapi/local_file_system_operation.h"
|
| -#include "webkit/browser/fileapi/mock_file_system_context.h"
|
| -#include "webkit/browser/fileapi/sandbox_file_stream_writer.h"
|
| -#include "webkit/fileapi/file_system_context.h"
|
| -#include "webkit/fileapi/file_system_operation_context.h"
|
| -#include "webkit/fileapi/file_writer_delegate.h"
|
| -
|
| -namespace fileapi {
|
| -
|
| -namespace {
|
| -
|
| -const GURL kOrigin("http://example.com");
|
| -const FileSystemType kFileSystemType = kFileSystemTypeTest;
|
| -
|
| -class Result {
|
| - public:
|
| - Result()
|
| - : status_(base::PLATFORM_FILE_OK),
|
| - bytes_written_(0),
|
| - write_status_(FileWriterDelegate::SUCCESS_IO_PENDING) {}
|
| -
|
| - base::PlatformFileError status() const { return status_; }
|
| - int64 bytes_written() const { return bytes_written_; }
|
| - FileWriterDelegate::WriteProgressStatus write_status() const {
|
| - return write_status_;
|
| - }
|
| -
|
| - void DidWrite(base::PlatformFileError status, int64 bytes,
|
| - FileWriterDelegate::WriteProgressStatus write_status) {
|
| - write_status_ = write_status;
|
| - if (status == base::PLATFORM_FILE_OK) {
|
| - bytes_written_ += bytes;
|
| - if (write_status_ != FileWriterDelegate::SUCCESS_IO_PENDING)
|
| - base::MessageLoop::current()->Quit();
|
| - } else {
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, status_);
|
| - status_ = status;
|
| - base::MessageLoop::current()->Quit();
|
| - }
|
| - }
|
| -
|
| - private:
|
| - // For post-operation status.
|
| - base::PlatformFileError status_;
|
| - int64 bytes_written_;
|
| - FileWriterDelegate::WriteProgressStatus write_status_;
|
| -};
|
| -
|
| -const char kData[] = "The quick brown fox jumps over the lazy dog.\n";
|
| -const int kDataSize = ARRAYSIZE_UNSAFE(kData) - 1;
|
| -
|
| -} // namespace (anonymous)
|
| -
|
| -class FileWriterDelegateTest : public PlatformTest {
|
| - public:
|
| - FileWriterDelegateTest()
|
| - : loop_(base::MessageLoop::TYPE_IO) {}
|
| -
|
| - protected:
|
| - virtual void SetUp() OVERRIDE;
|
| - virtual void TearDown() OVERRIDE;
|
| -
|
| - FileSystemFileUtil* file_util() {
|
| - return file_system_context_->GetFileUtil(kFileSystemType);
|
| - }
|
| -
|
| - int64 usage() {
|
| - return file_system_context_->GetQuotaUtil(kFileSystemType)->
|
| - GetOriginUsageOnFileThread(file_system_context_,
|
| - kOrigin,
|
| - kFileSystemType);
|
| - }
|
| -
|
| - int64 GetFileSizeOnDisk(const char* test_file_path) {
|
| - // There might be in-flight flush/write.
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE, base::Bind(&base::DoNothing));
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - FileSystemURL url = GetFileSystemURL(test_file_path);
|
| - base::PlatformFileInfo file_info;
|
| - base::FilePath platform_path;
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| - file_util()->GetFileInfo(NewOperationContext().get(), url,
|
| - &file_info, &platform_path));
|
| - return file_info.size;
|
| - }
|
| -
|
| - FileSystemURL GetFileSystemURL(const char* file_name) const {
|
| - return file_system_context_->CreateCrackedFileSystemURL(
|
| - kOrigin, kFileSystemType, base::FilePath().FromUTF8Unsafe(file_name));
|
| - }
|
| -
|
| - scoped_ptr<FileSystemOperationContext> NewOperationContext() {
|
| - FileSystemOperationContext* context =
|
| - new FileSystemOperationContext(file_system_context_);
|
| - context->set_update_observers(
|
| - *file_system_context_->GetUpdateObservers(kFileSystemType));
|
| - return make_scoped_ptr(context);
|
| - }
|
| -
|
| - FileWriterDelegate* CreateWriterDelegate(
|
| - const char* test_file_path,
|
| - int64 offset,
|
| - int64 allowed_growth,
|
| - Result* result) {
|
| - SandboxFileStreamWriter* writer = new SandboxFileStreamWriter(
|
| - file_system_context_,
|
| - GetFileSystemURL(test_file_path),
|
| - offset,
|
| - *file_system_context_->GetUpdateObservers(kFileSystemType));
|
| - writer->set_default_quota(allowed_growth);
|
| - return new FileWriterDelegate(
|
| - base::Bind(&Result::DidWrite, base::Unretained(result)),
|
| - scoped_ptr<FileStreamWriter>(writer));
|
| - }
|
| -
|
| - // Creates and sets up a FileWriterDelegate for writing the given |blob_url|,
|
| - // and creates a new FileWriterDelegate for the file.
|
| - void PrepareForWrite(const char* test_file_path,
|
| - const GURL& blob_url,
|
| - int64 offset,
|
| - int64 allowed_growth) {
|
| - result_.reset(new Result());
|
| - file_writer_delegate_.reset(
|
| - CreateWriterDelegate(test_file_path, offset, allowed_growth,
|
| - result_.get()));
|
| - request_.reset(empty_context_.CreateRequest(
|
| - blob_url, file_writer_delegate_.get()));
|
| - }
|
| -
|
| - static net::URLRequest::ProtocolFactory Factory;
|
| -
|
| - // This should be alive until the very end of this instance.
|
| - base::MessageLoop loop_;
|
| -
|
| - scoped_refptr<FileSystemContext> file_system_context_;
|
| -
|
| - net::URLRequestContext empty_context_;
|
| - scoped_ptr<FileWriterDelegate> file_writer_delegate_;
|
| - scoped_ptr<net::URLRequest> request_;
|
| - scoped_ptr<Result> result_;
|
| -
|
| - base::ScopedTempDir dir_;
|
| -
|
| - static const char* content_;
|
| -};
|
| -
|
| -const char* FileWriterDelegateTest::content_ = NULL;
|
| -
|
| -namespace {
|
| -
|
| -static std::string g_content;
|
| -
|
| -class FileWriterDelegateTestJob : public net::URLRequestJob {
|
| - public:
|
| - FileWriterDelegateTestJob(net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate,
|
| - const std::string& content)
|
| - : net::URLRequestJob(request, network_delegate),
|
| - content_(content),
|
| - remaining_bytes_(content.length()),
|
| - cursor_(0) {
|
| - }
|
| -
|
| - virtual void Start() OVERRIDE {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&FileWriterDelegateTestJob::NotifyHeadersComplete, this));
|
| - }
|
| -
|
| - virtual bool ReadRawData(net::IOBuffer* buf,
|
| - int buf_size,
|
| - int *bytes_read) OVERRIDE {
|
| - if (remaining_bytes_ < buf_size)
|
| - buf_size = static_cast<int>(remaining_bytes_);
|
| -
|
| - for (int i = 0; i < buf_size; ++i)
|
| - buf->data()[i] = content_[cursor_++];
|
| - remaining_bytes_ -= buf_size;
|
| -
|
| - SetStatus(net::URLRequestStatus());
|
| - *bytes_read = buf_size;
|
| - return true;
|
| - }
|
| -
|
| - virtual int GetResponseCode() const OVERRIDE {
|
| - return 200;
|
| - }
|
| -
|
| - protected:
|
| - virtual ~FileWriterDelegateTestJob() {}
|
| -
|
| - private:
|
| - std::string content_;
|
| - int remaining_bytes_;
|
| - int cursor_;
|
| -};
|
| -
|
| -} // namespace (anonymous)
|
| -
|
| -// static
|
| -net::URLRequestJob* FileWriterDelegateTest::Factory(
|
| - net::URLRequest* request,
|
| - net::NetworkDelegate* network_delegate,
|
| - const std::string& scheme) {
|
| - return new FileWriterDelegateTestJob(
|
| - request, network_delegate, FileWriterDelegateTest::content_);
|
| -}
|
| -
|
| -void FileWriterDelegateTest::SetUp() {
|
| - ASSERT_TRUE(dir_.CreateUniqueTempDir());
|
| -
|
| - file_system_context_ = CreateFileSystemContextForTesting(
|
| - NULL, dir_.path());
|
| -
|
| - bool created = false;
|
| - scoped_ptr<FileSystemOperationContext> context = NewOperationContext();
|
| - context->set_allowed_bytes_growth(kint64max);
|
| - base::PlatformFileError error = file_util()->EnsureFileExists(
|
| - context.get(),
|
| - GetFileSystemURL("test"),
|
| - &created);
|
| - ASSERT_EQ(base::PLATFORM_FILE_OK, error);
|
| - ASSERT_TRUE(created);
|
| - net::URLRequest::Deprecated::RegisterProtocolFactory("blob", &Factory);
|
| -}
|
| -
|
| -void FileWriterDelegateTest::TearDown() {
|
| - net::URLRequest::Deprecated::RegisterProtocolFactory("blob", NULL);
|
| - file_system_context_ = NULL;
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -}
|
| -
|
| -TEST_F(FileWriterDelegateTest, WriteSuccessWithoutQuotaLimit) {
|
| - const GURL kBlobURL("blob:nolimit");
|
| - content_ = kData;
|
| -
|
| - PrepareForWrite("test", kBlobURL, 0, kint64max);
|
| -
|
| - ASSERT_EQ(0, usage());
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| -
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - ASSERT_EQ(kDataSize, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| - EXPECT_EQ(kDataSize, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| -}
|
| -
|
| -TEST_F(FileWriterDelegateTest, WriteSuccessWithJustQuota) {
|
| - const GURL kBlobURL("blob:just");
|
| - content_ = kData;
|
| - const int64 kAllowedGrowth = kDataSize;
|
| - PrepareForWrite("test", kBlobURL, 0, kAllowedGrowth);
|
| -
|
| - ASSERT_EQ(0, usage());
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - ASSERT_EQ(kAllowedGrowth, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| -
|
| - EXPECT_EQ(kAllowedGrowth, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| -}
|
| -
|
| -TEST_F(FileWriterDelegateTest, DISABLED_WriteFailureByQuota) {
|
| - const GURL kBlobURL("blob:failure");
|
| - content_ = kData;
|
| - const int64 kAllowedGrowth = kDataSize - 1;
|
| - PrepareForWrite("test", kBlobURL, 0, kAllowedGrowth);
|
| -
|
| - ASSERT_EQ(0, usage());
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::ERROR_WRITE_STARTED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - ASSERT_EQ(kAllowedGrowth, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| -
|
| - EXPECT_EQ(kAllowedGrowth, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, result_->status());
|
| - ASSERT_EQ(FileWriterDelegate::ERROR_WRITE_STARTED, result_->write_status());
|
| -}
|
| -
|
| -TEST_F(FileWriterDelegateTest, WriteZeroBytesSuccessfullyWithZeroQuota) {
|
| - const GURL kBlobURL("blob:zero");
|
| - content_ = "";
|
| - int64 kAllowedGrowth = 0;
|
| - PrepareForWrite("test", kBlobURL, 0, kAllowedGrowth);
|
| -
|
| - ASSERT_EQ(0, usage());
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - ASSERT_EQ(kAllowedGrowth, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| -
|
| - EXPECT_EQ(kAllowedGrowth, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| -}
|
| -
|
| -TEST_F(FileWriterDelegateTest, WriteSuccessWithoutQuotaLimitConcurrent) {
|
| - scoped_ptr<FileWriterDelegate> file_writer_delegate2;
|
| - scoped_ptr<net::URLRequest> request2;
|
| - scoped_ptr<Result> result2;
|
| -
|
| - bool created = false;
|
| - file_util()->EnsureFileExists(NewOperationContext().get(),
|
| - GetFileSystemURL("test2"),
|
| - &created);
|
| - ASSERT_TRUE(created);
|
| -
|
| - const GURL kBlobURL("blob:nolimitconcurrent");
|
| - const GURL kBlobURL2("blob:nolimitconcurrent2");
|
| - content_ = kData;
|
| -
|
| - PrepareForWrite("test", kBlobURL, 0, kint64max);
|
| -
|
| - // Credate another FileWriterDelegate for concurrent write.
|
| - result2.reset(new Result());
|
| - file_writer_delegate2.reset(CreateWriterDelegate(
|
| - "test2", 0, kint64max, result2.get()));
|
| - request2.reset(empty_context_.CreateRequest(
|
| - kBlobURL2, file_writer_delegate2.get()));
|
| -
|
| - ASSERT_EQ(0, usage());
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - file_writer_delegate2->Start(request2.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - if (result_->write_status() == FileWriterDelegate::SUCCESS_IO_PENDING ||
|
| - result2->write_status() == FileWriterDelegate::SUCCESS_IO_PENDING)
|
| - base::MessageLoop::current()->Run();
|
| -
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result2->write_status());
|
| - file_writer_delegate_.reset();
|
| - file_writer_delegate2.reset();
|
| -
|
| - ASSERT_EQ(kDataSize * 2, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test") + GetFileSizeOnDisk("test2"), usage());
|
| -
|
| - EXPECT_EQ(kDataSize, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| - EXPECT_EQ(kDataSize, result2->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result2->status());
|
| -}
|
| -
|
| -TEST_F(FileWriterDelegateTest, WritesWithQuotaAndOffset) {
|
| - const GURL kBlobURL("blob:failure-with-updated-quota");
|
| - content_ = kData;
|
| -
|
| - // Writing kDataSize (=45) bytes data while allowed_growth is 100.
|
| - int64 offset = 0;
|
| - int64 allowed_growth = 100;
|
| - ASSERT_LT(kDataSize, allowed_growth);
|
| - PrepareForWrite("test", kBlobURL, offset, allowed_growth);
|
| -
|
| - ASSERT_EQ(0, usage());
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - ASSERT_EQ(kDataSize, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| - EXPECT_EQ(kDataSize, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| -
|
| - // Trying to overwrite kDataSize bytes data while allowed_growth is 20.
|
| - offset = 0;
|
| - allowed_growth = 20;
|
| - PrepareForWrite("test", kBlobURL, offset, allowed_growth);
|
| -
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - EXPECT_EQ(kDataSize, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| - EXPECT_EQ(kDataSize, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| -
|
| - // Trying to write kDataSize bytes data from offset 25 while
|
| - // allowed_growth is 55.
|
| - offset = 25;
|
| - allowed_growth = 55;
|
| - PrepareForWrite("test", kBlobURL, offset, allowed_growth);
|
| -
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - EXPECT_EQ(offset + kDataSize, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| - EXPECT_EQ(kDataSize, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| -
|
| - // Trying to overwrite 45 bytes data while allowed_growth is -20.
|
| - offset = 0;
|
| - allowed_growth = -20;
|
| - PrepareForWrite("test", kBlobURL, offset, allowed_growth);
|
| -
|
| - int64 pre_write_usage = GetFileSizeOnDisk("test");
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::SUCCESS_COMPLETED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - EXPECT_EQ(pre_write_usage, usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| - EXPECT_EQ(kDataSize, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, result_->status());
|
| -
|
| - // Trying to overwrite 45 bytes data with offset pre_write_usage - 20,
|
| - // while allowed_growth is 10.
|
| - const int kOverlap = 20;
|
| - offset = pre_write_usage - kOverlap;
|
| - allowed_growth = 10;
|
| - PrepareForWrite("test", kBlobURL, offset, allowed_growth);
|
| -
|
| - file_writer_delegate_->Start(request_.Pass());
|
| - base::MessageLoop::current()->Run();
|
| - ASSERT_EQ(FileWriterDelegate::ERROR_WRITE_STARTED, result_->write_status());
|
| - file_writer_delegate_.reset();
|
| -
|
| - EXPECT_EQ(pre_write_usage + allowed_growth,
|
| - usage());
|
| - EXPECT_EQ(GetFileSizeOnDisk("test"), usage());
|
| - EXPECT_EQ(kOverlap + allowed_growth, result_->bytes_written());
|
| - EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, result_->status());
|
| -}
|
| -
|
| -} // namespace fileapi
|
|
|