blob: e19836318542b7cf39566961329cf20a1c11e113 [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_usage_tracker.h"
#include "base/basictypes.h"
#include "base/file_util.h"
#include "base/memory/scoped_callback_factory.h"
#include "base/memory/scoped_temp_dir.h"
#include "base/message_loop.h"
#include "base/message_loop_proxy.h"
#include "base/platform_file.h"
#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/fileapi/file_system_types.h"
#include "webkit/fileapi/file_system_usage_cache.h"
#include "webkit/fileapi/sandbox_mount_point_provider.h"
using namespace fileapi;
namespace {
static const GURL kDummyURL1("http://www.dummy.org");
static const GURL kDummyURL2("http://www.example.com");
// Declared to shorten the variable names.
static const fileapi::FileSystemType kTemporary =
fileapi::kFileSystemTypeTemporary;
static const fileapi::FileSystemType kPersistent =
fileapi::kFileSystemTypePersistent;
static const int kUsageFileSize = FileSystemUsageCache::kUsageFileSize;
}
class FileSystemUsageTrackerTest : public testing::Test {
public:
FileSystemUsageTrackerTest()
: callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
}
void SetUp() {
ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
}
struct TestFile {
bool isDirectory;
const char* name;
int64 size;
GURL origin_url;
fileapi::FileSystemType type;
};
protected:
FileSystemUsageTracker* NewUsageTracker(bool is_incognito) {
return new FileSystemUsageTracker(
base::MessageLoopProxy::CreateForCurrentThread(),
data_dir_.path(), is_incognito);
}
int64 GetOriginUsage(FileSystemUsageTracker* tracker,
const GURL& origin_url,
fileapi::FileSystemType type) {
tracker->GetOriginUsage(origin_url, type,
callback_factory_.NewCallback(
&FileSystemUsageTrackerTest::OnGetUsage));
MessageLoop::current()->RunAllPending();
return usage_;
}
FilePath GetOriginBasePath(const GURL& origin_url,
fileapi::FileSystemType type) {
return
SandboxMountPointProvider::GetFileSystemBaseDirectoryForOriginAndType(
data_dir_.path().Append(
SandboxMountPointProvider::kFileSystemDirectory),
SandboxMountPointProvider::GetOriginIdentifierFromURL(origin_url),
type);
}
bool CreateFileSystemDirectory(const char* dir_name,
const GURL& origin_url,
fileapi::FileSystemType type) {
FilePath origin_base_path = GetOriginBasePath(origin_url, type);
FilePath dir_path;
if (dir_name != NULL)
dir_path = origin_base_path.AppendASCII(dir_name);
else
dir_path = origin_base_path;
if (dir_path.empty())
return false;
return file_util::CreateDirectory(dir_path);
}
bool CreateFileSystemFile(const char* file_name,
int64 file_size,
const GURL& origin_url,
fileapi::FileSystemType type) {
FilePath origin_base_path = GetOriginBasePath(origin_url, type);
FilePath file_path = origin_base_path.AppendASCII(file_name);
if (file_path.empty())
return false;
int file_flags = base::PLATFORM_FILE_CREATE_ALWAYS |
base::PLATFORM_FILE_WRITE;
base::PlatformFileError error_code;
base::PlatformFile file =
base::CreatePlatformFile(file_path, file_flags, NULL, &error_code);
if (error_code != base::PLATFORM_FILE_OK)
return false;
bool succeeded;
succeeded = base::TruncatePlatformFile(file, file_size);
succeeded = succeeded && base::ClosePlatformFile(file);
return succeeded;
}
void CreateFiles(const TestFile* files, int num_files) {
for (int i = 0; i < num_files; i++) {
if (files[i].isDirectory) {
ASSERT_TRUE(CreateFileSystemDirectory(
files[i].name, files[i].origin_url, files[i].type));
} else {
ASSERT_TRUE(CreateFileSystemFile(
files[i].name, files[i].size, files[i].origin_url, files[i].type));
}
}
}
private:
void OnGetUsage(int64 usage) {
usage_ = usage;
}
ScopedTempDir data_dir_;
base::ScopedCallbackFactory<FileSystemUsageTrackerTest> callback_factory_;
int64 usage_;
DISALLOW_COPY_AND_ASSIGN(FileSystemUsageTrackerTest);
};
TEST_F(FileSystemUsageTrackerTest, NoFileSystemTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
EXPECT_EQ(0,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
}
TEST_F(FileSystemUsageTrackerTest, NoFileTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
}
}
TEST_F(FileSystemUsageTrackerTest, OneFileTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
{false, "foo", 4921, kDummyURL1, kTemporary},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(4921 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
}
}
TEST_F(FileSystemUsageTrackerTest, TwoFilesTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
{false, "foo", 10310, kDummyURL1, kTemporary},
{false, "bar", 41, kDummyURL1, kTemporary},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(10310 + 41 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
}
}
TEST_F(FileSystemUsageTrackerTest, EmptyFilesTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
{false, "foo", 0, kDummyURL1, kTemporary},
{false, "bar", 0, kDummyURL1, kTemporary},
{false, "baz", 0, kDummyURL1, kTemporary},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
}
}
TEST_F(FileSystemUsageTrackerTest, SubDirectoryTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
{true, "dirtest", 0, kDummyURL1, kTemporary},
{false, "dirtest/foo", 11921, kDummyURL1, kTemporary},
{false, "bar", 4814, kDummyURL1, kTemporary},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(11921 + 4814 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
}
}
TEST_F(FileSystemUsageTrackerTest, MultiTypeTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
{true, "dirtest", 0, kDummyURL1, kTemporary},
{false, "dirtest/foo", 133, kDummyURL1, kTemporary},
{false, "bar", 14, kDummyURL1, kTemporary},
{true, NULL, 0, kDummyURL1, kPersistent},
{true, "dirtest", 0, kDummyURL1, kPersistent},
{false, "dirtest/foo", 193, kDummyURL1, kPersistent},
{false, "bar", 9, kDummyURL1, kPersistent},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(133 + 14 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
EXPECT_EQ(193 + 9 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kPersistent));
}
}
TEST_F(FileSystemUsageTrackerTest, MultiDomainTest) {
scoped_ptr<FileSystemUsageTracker> tracker(NewUsageTracker(false));
TestFile files[] = {
{true, NULL, 0, kDummyURL1, kTemporary},
{true, "dir1", 0, kDummyURL1, kTemporary},
{false, "dir1/foo", 1331, kDummyURL1, kTemporary},
{false, "bar", 134, kDummyURL1, kTemporary},
{true, NULL, 0, kDummyURL1, kPersistent},
{true, "dir2", 0, kDummyURL1, kPersistent},
{false, "dir2/foo", 1903, kDummyURL1, kPersistent},
{false, "bar", 19, kDummyURL1, kPersistent},
{true, NULL, 0, kDummyURL2, kTemporary},
{true, "dom", 0, kDummyURL2, kTemporary},
{false, "dom/fan", 1319, kDummyURL2, kTemporary},
{false, "bar", 113, kDummyURL2, kTemporary},
{true, NULL, 0, kDummyURL2, kPersistent},
{true, "dom", 0, kDummyURL2, kPersistent},
{false, "dom/fan", 2013, kDummyURL2, kPersistent},
{false, "baz", 18, kDummyURL2, kPersistent},
};
CreateFiles(files, ARRAYSIZE_UNSAFE(files));
for (int i = 0; i < 2; i++) {
EXPECT_EQ(1331 + 134 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kTemporary));
EXPECT_EQ(1903 + 19 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL1, kPersistent));
EXPECT_EQ(1319 + 113 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL2, kTemporary));
EXPECT_EQ(2013 + 18 + kUsageFileSize,
GetOriginUsage(tracker.get(), kDummyURL2, kPersistent));
}
}