blob: 6eb3538b61f937259e274e572ea03a4157c71d8b [file] [log] [blame]
// Copyright (c) 2011 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/file_system_test_helper.h"
#include "base/file_util.h"
#include "base/message_loop.h"
#include "base/message_loop_proxy.h"
#include "googleurl/src/gurl.h"
#include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/file_system_operation.h"
#include "webkit/fileapi/file_system_operation_context.h"
#include "webkit/fileapi/file_system_usage_cache.h"
#include "webkit/fileapi/file_system_util.h"
#include "webkit/fileapi/sandbox_mount_point_provider.h"
#include "webkit/quota/special_storage_policy.h"
namespace fileapi {
namespace {
class TestSpecialStoragePolicy : public quota::SpecialStoragePolicy {
public:
explicit TestSpecialStoragePolicy(bool unlimited_quota)
: unlimited_quota_(unlimited_quota) {}
virtual bool IsStorageProtected(const GURL& origin) {
return false;
}
virtual bool IsStorageUnlimited(const GURL& origin) {
return unlimited_quota_;
}
virtual bool IsFileHandler(const std::string& extension_id) {
return true;
}
private:
bool unlimited_quota_;
};
} // anonymous namespace
FileSystemTestOriginHelper::FileSystemTestOriginHelper(
const GURL& origin, FileSystemType type)
: origin_(origin), type_(type), file_util_(NULL) {
}
FileSystemTestOriginHelper::FileSystemTestOriginHelper()
: origin_(GURL("http://foo.com")),
type_(kFileSystemTypeTemporary),
file_util_(NULL) {
}
FileSystemTestOriginHelper::~FileSystemTestOriginHelper() {
}
void FileSystemTestOriginHelper::SetUp(
const FilePath& base_dir, FileSystemFileUtil* file_util) {
SetUp(base_dir, false, false, NULL, file_util);
}
void FileSystemTestOriginHelper::SetUp(
FileSystemContext* file_system_context,
FileSystemFileUtil* file_util) {
DCHECK(file_system_context->path_manager());
DCHECK(file_system_context->path_manager()->sandbox_provider());
file_util_ = file_util;
file_system_context_ = file_system_context;
if (!file_util_)
file_util_ = file_system_context->path_manager()->sandbox_provider()->
GetFileSystemFileUtil();
DCHECK(file_util_);
// Prepare the origin's root directory.
file_system_context_->path_manager()->
ValidateFileSystemRootAndGetPathOnFileThread(
origin_, type_, FilePath(), true /* create */);
// Initialize the usage cache file.
FilePath usage_cache_path = file_system_context_->path_manager()
->sandbox_provider()->GetUsageCachePathForOriginAndType(origin_, type_);
FileSystemUsageCache::UpdateUsage(usage_cache_path, 0);
}
void FileSystemTestOriginHelper::SetUp(
const FilePath& base_dir,
bool incognito_mode,
bool unlimited_quota,
quota::QuotaManagerProxy* quota_manager_proxy,
FileSystemFileUtil* file_util) {
file_util_ = file_util;
DCHECK(file_util_);
file_system_context_ = new FileSystemContext(
base::MessageLoopProxy::CreateForCurrentThread(),
base::MessageLoopProxy::CreateForCurrentThread(),
new TestSpecialStoragePolicy(unlimited_quota),
quota_manager_proxy,
base_dir,
incognito_mode,
true /* allow_file_access_from_files */,
unlimited_quota,
NULL);
DCHECK(file_system_context_->path_manager());
DCHECK(file_system_context_->path_manager()->sandbox_provider());
// Prepare the origin's root directory.
file_system_context_->path_manager()->
ValidateFileSystemRootAndGetPathOnFileThread(
origin_, type_, FilePath(), true /* create */);
// Initialize the usage cache file.
FilePath usage_cache_path = file_system_context_->path_manager()
->sandbox_provider()->GetUsageCachePathForOriginAndType(origin_, type_);
FileSystemUsageCache::UpdateUsage(usage_cache_path, 0);
// We expect the origin directory to be always empty, except for possibly
// the usage cache file. We record the initial usage file size here
// (it will be either 0 or kUsageFileSize) so that later we can compute
// how much the size of the origin directory has grown.
initial_usage_size_ = file_util::ComputeDirectorySize(
GetOriginRootPath());
FileSystemUsageCache::UpdateUsage(usage_cache_path, initial_usage_size_);
}
void FileSystemTestOriginHelper::TearDown() {
file_system_context_ = NULL;
MessageLoop::current()->RunAllPending();
}
FilePath FileSystemTestOriginHelper::GetOriginRootPath() const {
return file_system_context_->path_manager()->
ValidateFileSystemRootAndGetPathOnFileThread(
origin_, type_, FilePath(), false);
}
FilePath FileSystemTestOriginHelper::GetLocalPath(const FilePath& path) {
DCHECK(file_util_);
FilePath local_path;
scoped_ptr<FileSystemOperationContext> context(NewOperationContext());
file_util_->GetLocalFilePath(context.get(), path, &local_path);
return local_path;
}
FilePath FileSystemTestOriginHelper::GetLocalPathFromASCII(
const std::string& path) {
return GetLocalPath(FilePath().AppendASCII(path));
}
GURL FileSystemTestOriginHelper::GetURLForPath(const FilePath& path) const {
return GURL(GetFileSystemRootURI(origin_, type_).spec() +
path.MaybeAsASCII());
}
FilePath FileSystemTestOriginHelper::GetUsageCachePath() const {
return file_system_context_->path_manager()
->sandbox_provider()->GetUsageCachePathForOriginAndType(origin_, type_);
}
int64 FileSystemTestOriginHelper::GetCachedOriginUsage() const {
return FileSystemUsageCache::GetUsage(GetUsageCachePath());
}
int64 FileSystemTestOriginHelper::ComputeCurrentOriginUsage() const {
// Depending on the file_util GetOriginRootPath() may include usage
// cache file size or may not. Here we subtract the initial size to
// make it work for multiple file_utils.
return file_util::ComputeDirectorySize(GetOriginRootPath()) -
initial_usage_size_;
}
FileSystemOperation* FileSystemTestOriginHelper::NewOperation(
FileSystemCallbackDispatcher* callback_dispatcher) {
DCHECK(file_system_context_.get());
DCHECK(file_util_);
FileSystemOperation* operation =
new FileSystemOperation(callback_dispatcher,
base::MessageLoopProxy::CreateForCurrentThread(),
file_system_context_.get(),
file_util_);
InitializeOperationContext(operation->file_system_operation_context());
return operation;
}
FileSystemOperationContext* FileSystemTestOriginHelper::NewOperationContext() {
DCHECK(file_system_context_.get());
DCHECK(file_util_);
FileSystemOperationContext* context =
new FileSystemOperationContext(file_system_context_.get(), file_util_);
InitializeOperationContext(context);
return context;
}
void FileSystemTestOriginHelper::InitializeOperationContext(
FileSystemOperationContext* context) {
DCHECK(context);
context->set_src_origin_url(origin_);
context->set_src_type(type_);
context->set_dest_origin_url(origin_);
context->set_dest_type(type_);
}
} // namespace fileapi