Commit 127522e1 authored by kinuko@chromium.org's avatar kinuko@chromium.org

Re-implement IsolateFileUtil tests on top of new cross-fs operation architecture

Deprecate FileUtilHelper::{Copy,Move} and recursive file enumerator
in favor of AsyncFileTestHelper::{Copy,Move,ReadDirectory}

BUG=146215, 174576
TEST=IsolatedFileUtilTest.CopyOut*

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182455 0039d316-1c4b-4281-b951-d872f2087c98
parent 21de9cb2
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
#include <map> #include <map>
#include <queue>
#include <set> #include <set>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -14,11 +15,11 @@ ...@@ -14,11 +15,11 @@
#include "base/message_loop_proxy.h" #include "base/message_loop_proxy.h"
#include "base/time.h" #include "base/time.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "webkit/fileapi/async_file_test_helper.h"
#include "webkit/fileapi/external_mount_points.h" #include "webkit/fileapi/external_mount_points.h"
#include "webkit/fileapi/file_system_context.h" #include "webkit/fileapi/file_system_context.h"
#include "webkit/fileapi/file_system_operation_context.h" #include "webkit/fileapi/file_system_operation_context.h"
#include "webkit/fileapi/file_system_task_runners.h" #include "webkit/fileapi/file_system_task_runners.h"
#include "webkit/fileapi/file_util_helper.h"
#include "webkit/fileapi/isolated_context.h" #include "webkit/fileapi/isolated_context.h"
#include "webkit/fileapi/isolated_file_util.h" #include "webkit/fileapi/isolated_file_util.h"
#include "webkit/fileapi/local_file_system_operation.h" #include "webkit/fileapi/local_file_system_operation.h"
...@@ -35,6 +36,8 @@ namespace fileapi { ...@@ -35,6 +36,8 @@ namespace fileapi {
namespace { namespace {
typedef AsyncFileTestHelper::FileEntryList FileEntryList;
// Used in IsolatedFileUtilTest::SimulateDropFiles(). // Used in IsolatedFileUtilTest::SimulateDropFiles().
// Random root paths in which we create each file/directory of the // Random root paths in which we create each file/directory of the
// RegularTestCases (so that we can simulate a drop with files/directories // RegularTestCases (so that we can simulate a drop with files/directories
...@@ -51,12 +54,41 @@ base::FilePath GetTopLevelPath(const base::FilePath& path) { ...@@ -51,12 +54,41 @@ base::FilePath GetTopLevelPath(const base::FilePath& path) {
return base::FilePath(components[0]); return base::FilePath(components[0]);
} }
bool IsDirectoryEmpty(FileSystemOperationContext* context, bool IsDirectoryEmpty(FileSystemContext* context, const FileSystemURL& url) {
FileSystemFileUtil* file_util, FileEntryList entries;
EXPECT_EQ(base::PLATFORM_FILE_OK,
AsyncFileTestHelper::ReadDirectory(context, url, &entries));
return entries.empty();
}
FileSystemURL GetEntryURL(FileSystemContext* file_system_context,
const FileSystemURL& dir,
const FilePath::StringType& name) {
return file_system_context->CreateCrackedFileSystemURL(
dir.origin(),
dir.mount_type(),
dir.virtual_path().Append(name));
}
FilePath GetRelativeVirtualPath(const FileSystemURL& root,
const FileSystemURL& url) { const FileSystemURL& url) {
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum = if (root.virtual_path().empty())
file_util->CreateFileEnumerator(context, url, false /* recursive */); return url.virtual_path();
return file_enum->Next().empty(); FilePath relative;
const bool success = root.virtual_path().AppendRelativePath(
url.virtual_path(), &relative);
DCHECK(success);
return relative;
}
FileSystemURL GetOtherURL(FileSystemContext* file_system_context,
const FileSystemURL& root,
const FileSystemURL& other_root,
const FileSystemURL& url) {
return file_system_context->CreateCrackedFileSystemURL(
other_root.origin(),
other_root.mount_type(),
other_root.virtual_path().Append(GetRelativeVirtualPath(root, url)));
} }
} // namespace } // namespace
...@@ -65,8 +97,7 @@ bool IsDirectoryEmpty(FileSystemOperationContext* context, ...@@ -65,8 +97,7 @@ bool IsDirectoryEmpty(FileSystemOperationContext* context,
// IsolatedFileUtil. // IsolatedFileUtil.
class IsolatedFileUtilTest : public testing::Test { class IsolatedFileUtilTest : public testing::Test {
public: public:
IsolatedFileUtilTest() IsolatedFileUtilTest() {}
: other_file_util_helper_(GURL("http://foo/"), kFileSystemTypeTest) {}
virtual void SetUp() { virtual void SetUp() {
ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
...@@ -85,15 +116,11 @@ class IsolatedFileUtilTest : public testing::Test { ...@@ -85,15 +116,11 @@ class IsolatedFileUtilTest : public testing::Test {
partition_dir_.path(), partition_dir_.path(),
CreateAllowFileAccessOptions()); CreateAllowFileAccessOptions());
// For cross-FileUtil copy/move tests.
other_file_util_helper_.SetUp(file_system_context_);
isolated_context()->AddReference(filesystem_id_); isolated_context()->AddReference(filesystem_id_);
} }
virtual void TearDown() { virtual void TearDown() {
isolated_context()->RemoveReference(filesystem_id_); isolated_context()->RemoveReference(filesystem_id_);
other_file_util_helper_.TearDown();
} }
protected: protected:
...@@ -107,14 +134,12 @@ class IsolatedFileUtilTest : public testing::Test { ...@@ -107,14 +134,12 @@ class IsolatedFileUtilTest : public testing::Test {
return file_system_context_.get(); return file_system_context_.get();
} }
FileSystemFileUtil* file_util() const { return file_util_.get(); } FileSystemFileUtil* file_util() const { return file_util_.get(); }
FileSystemFileUtil* other_file_util() const {
return other_file_util_helper_.file_util();
}
std::string filesystem_id() const { return filesystem_id_; } std::string filesystem_id() const { return filesystem_id_; }
base::FilePath GetTestCasePlatformPath(const base::FilePath::StringType& path) { base::FilePath GetTestCasePlatformPath(
return toplevel_root_map_[GetTopLevelPath(base::FilePath(path))].Append(path). const base::FilePath::StringType& path) {
NormalizePathSeparators(); return toplevel_root_map_[GetTopLevelPath(base::FilePath(path))]
.Append(path).NormalizePathSeparators();
} }
base::FilePath GetTestCaseLocalPath(const base::FilePath& path) { base::FilePath GetTestCaseLocalPath(const base::FilePath& path) {
...@@ -133,31 +158,28 @@ class IsolatedFileUtilTest : public testing::Test { ...@@ -133,31 +158,28 @@ class IsolatedFileUtilTest : public testing::Test {
virtual_path); virtual_path);
} }
FileSystemURL GetOtherFileSystemURL(const base::FilePath& path) { FileSystemURL GetOtherFileSystemURL(const base::FilePath& path) const {
return other_file_util_helper_.CreateURL(GetTestCaseLocalPath(path)); return file_system_context()->CreateCrackedFileSystemURL(
GURL("http://example.com"),
kFileSystemTypeTemporary,
FilePath().AppendASCII("dest").Append(path));
} }
void VerifyFilesHaveSameContent(FileSystemFileUtil* file_util1, void VerifyFilesHaveSameContent(const FileSystemURL& url1,
FileSystemFileUtil* file_util2,
const FileSystemURL& url1,
const FileSystemURL& url2) { const FileSystemURL& url2) {
scoped_ptr<FileSystemOperationContext> context;
// Get the file info for url1. // Get the file info for url1.
base::PlatformFileInfo info1; base::PlatformFileInfo info1;
base::FilePath platform_path1; FilePath platform_path1;
context.reset(new FileSystemOperationContext(file_system_context()));
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
file_util1->GetFileInfo(context.get(), url1, AsyncFileTestHelper::GetMetadata(
&info1, &platform_path1)); file_system_context(), url1, &info1, &platform_path1));
// Get the file info for url2. // Get the file info for url2.
base::PlatformFileInfo info2; base::PlatformFileInfo info2;
base::FilePath platform_path2; base::FilePath platform_path2;
context.reset(new FileSystemOperationContext(file_system_context()));
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
file_util2->GetFileInfo(context.get(), url2, AsyncFileTestHelper::GetMetadata(
&info2, &platform_path2)); file_system_context(), url2, &info2, &platform_path2));
// See if file info matches with the other one. // See if file info matches with the other one.
EXPECT_EQ(info1.is_directory, info2.is_directory); EXPECT_EQ(info1.is_directory, info2.is_directory);
...@@ -171,48 +193,57 @@ class IsolatedFileUtilTest : public testing::Test { ...@@ -171,48 +193,57 @@ class IsolatedFileUtilTest : public testing::Test {
EXPECT_EQ(content1, content2); EXPECT_EQ(content1, content2);
} }
void VerifyDirectoriesHaveSameContent(FileSystemFileUtil* file_util1, void VerifyDirectoriesHaveSameContent(const FileSystemURL& root1,
FileSystemFileUtil* file_util2,
const FileSystemURL& root1,
const FileSystemURL& root2) { const FileSystemURL& root2) {
scoped_ptr<FileSystemOperationContext> context;
base::FilePath root_path1 = root1.path(); base::FilePath root_path1 = root1.path();
base::FilePath root_path2 = root2.path(); base::FilePath root_path2 = root2.path();
context.reset(new FileSystemOperationContext(file_system_context())); FileEntryList entries;
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum1 = std::queue<FileSystemURL> directories;
file_util1->CreateFileEnumerator(context.get(), root1,
true /* recursive */);
base::FilePath current; directories.push(root1);
std::set<base::FilePath> file_set1; std::set<base::FilePath> file_set1;
while (!(current = file_enum1->Next()).empty()) { while (!directories.empty()) {
if (file_enum1->IsDirectory()) FileSystemURL dir = directories.front();
directories.pop();
ASSERT_EQ(base::PLATFORM_FILE_OK,
AsyncFileTestHelper::ReadDirectory(
file_system_context(), dir, &entries));
for (size_t i = 0; i < entries.size(); ++i) {
FileSystemURL url = GetEntryURL(file_system_context(),
dir, entries[i].name);
if (entries[i].is_directory) {
directories.push(url);
continue; continue;
base::FilePath relative; }
root_path1.AppendRelativePath(current, &relative); file_set1.insert(GetRelativeVirtualPath(root1, url));
file_set1.insert(relative); }
} }
context.reset(new FileSystemOperationContext(file_system_context())); directories.push(root2);
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum2 = while (!directories.empty()) {
file_util2->CreateFileEnumerator(context.get(), root2, FileSystemURL dir = directories.front();
true /* recursive */); directories.pop();
while (!(current = file_enum2->Next()).empty()) { ASSERT_EQ(base::PLATFORM_FILE_OK,
base::FilePath relative; AsyncFileTestHelper::ReadDirectory(
root_path2.AppendRelativePath(current, &relative); file_system_context(), dir, &entries));
FileSystemURL url1 = root1.WithPath(root_path1.Append(relative)); for (size_t i = 0; i < entries.size(); ++i) {
FileSystemURL url2 = root2.WithPath(root_path2.Append(relative)); FileSystemURL url2 = GetEntryURL(file_system_context(),
if (file_enum2->IsDirectory()) { dir, entries[i].name);
FileSystemOperationContext context1(file_system_context()); FileSystemURL url1 = GetOtherURL(file_system_context(),
FileSystemOperationContext context2(file_system_context()); root2, root1, url2);
EXPECT_EQ(IsDirectoryEmpty(&context1, file_util1, url1), if (entries[i].is_directory) {
IsDirectoryEmpty(&context2, file_util2, url2)); directories.push(url2);
EXPECT_EQ(IsDirectoryEmpty(file_system_context(), url1),
IsDirectoryEmpty(file_system_context(), url2));
continue; continue;
} }
base::FilePath relative = GetRelativeVirtualPath(root2, url2);
EXPECT_TRUE(file_set1.find(relative) != file_set1.end()); EXPECT_TRUE(file_set1.find(relative) != file_set1.end());
VerifyFilesHaveSameContent(file_util1, file_util2, url1, url2); VerifyFilesHaveSameContent(url1, url2);
}
} }
} }
...@@ -255,7 +286,6 @@ class IsolatedFileUtilTest : public testing::Test { ...@@ -255,7 +286,6 @@ class IsolatedFileUtilTest : public testing::Test {
scoped_refptr<FileSystemContext> file_system_context_; scoped_refptr<FileSystemContext> file_system_context_;
std::map<base::FilePath, base::FilePath> toplevel_root_map_; std::map<base::FilePath, base::FilePath> toplevel_root_map_;
scoped_ptr<IsolatedFileUtil> file_util_; scoped_ptr<IsolatedFileUtil> file_util_;
LocalFileSystemTestOriginHelper other_file_util_helper_;
DISALLOW_COPY_AND_ASSIGN(IsolatedFileUtilTest); DISALLOW_COPY_AND_ASSIGN(IsolatedFileUtilTest);
}; };
...@@ -336,7 +366,8 @@ TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) { ...@@ -336,7 +366,8 @@ TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) {
<< ": " << test_case.path); << ": " << test_case.path);
// Read entries in the directory to construct the expected results map. // Read entries in the directory to construct the expected results map.
typedef std::map<base::FilePath::StringType, base::FileUtilProxy::Entry> EntryMap; typedef std::map<base::FilePath::StringType,
base::FileUtilProxy::Entry> EntryMap;
EntryMap expected_entry_map; EntryMap expected_entry_map;
FileEnumerator file_enum( FileEnumerator file_enum(
...@@ -356,11 +387,10 @@ TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) { ...@@ -356,11 +387,10 @@ TEST_F(IsolatedFileUtilTest, ReadDirectoryTest) {
// Perform ReadDirectory in the isolated filesystem. // Perform ReadDirectory in the isolated filesystem.
FileSystemURL url = GetFileSystemURL(base::FilePath(test_case.path)); FileSystemURL url = GetFileSystemURL(base::FilePath(test_case.path));
std::vector<base::FileUtilProxy::Entry> entries; FileEntryList entries;
FileSystemOperationContext context(file_system_context());
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
FileUtilHelper::ReadDirectory( AsyncFileTestHelper::ReadDirectory(
&context, file_util(), url, &entries)); file_system_context(), url, &entries));
EXPECT_EQ(expected_entry_map.size(), entries.size()); EXPECT_EQ(expected_entry_map.size(), entries.size());
for (size_t i = 0; i < entries.size(); ++i) { for (size_t i = 0; i < entries.size(); ++i) {
...@@ -392,82 +422,71 @@ TEST_F(IsolatedFileUtilTest, GetLocalFilePathTest) { ...@@ -392,82 +422,71 @@ TEST_F(IsolatedFileUtilTest, GetLocalFilePathTest) {
} }
TEST_F(IsolatedFileUtilTest, CopyOutFileTest) { TEST_F(IsolatedFileUtilTest, CopyOutFileTest) {
scoped_ptr<FileSystemOperationContext> context( FileSystemURL src_root = GetFileSystemURL(base::FilePath());
new FileSystemOperationContext(file_system_context())); FileSystemURL dest_root = GetOtherFileSystemURL(base::FilePath());
FileSystemURL root_url = GetFileSystemURL(base::FilePath());
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum(
file_util()->CreateFileEnumerator(context.get(),
root_url,
true /* recursive */));
base::FilePath current;
while (!(current = file_enum->Next()).empty()) {
if (file_enum->IsDirectory())
continue;
SCOPED_TRACE(testing::Message() << "Testing file copy " FileEntryList entries;
<< current.value()); std::queue<FileSystemURL> directories;
directories.push(src_root);
FileSystemURL src_url = root_url.WithPath(current); ASSERT_EQ(base::PLATFORM_FILE_OK,
FileSystemURL dest_url = GetOtherFileSystemURL(current); AsyncFileTestHelper::CreateDirectory(file_system_context(),
dest_root));
// Create the parent directory of the destination. while (!directories.empty()) {
context.reset(new FileSystemOperationContext(file_system_context())); FileSystemURL dir = directories.front();
directories.pop();
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
other_file_util()->CreateDirectory( AsyncFileTestHelper::ReadDirectory(file_system_context(),
context.get(), dir, &entries));
GetOtherFileSystemURL(current.DirName()), for (size_t i = 0; i < entries.size(); ++i) {
false /* exclusive */, FileSystemURL src_url = GetEntryURL(file_system_context(),
true /* recursive */)); dir, entries[i].name);
FileSystemURL dest_url = GetOtherURL(file_system_context(),
src_root, dest_root, src_url);
context.reset(new FileSystemOperationContext(file_system_context())); if (entries[i].is_directory) {
ASSERT_EQ(base::PLATFORM_FILE_OK,
AsyncFileTestHelper::CreateDirectory(file_system_context(),
dest_url));
directories.push(src_url);
continue;
}
SCOPED_TRACE(testing::Message() << "Testing file copy "
<< src_url.path().value());
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
FileUtilHelper::Copy( AsyncFileTestHelper::Copy(file_system_context(),
context.get(),
file_util(), other_file_util(),
src_url, dest_url)); src_url, dest_url));
VerifyFilesHaveSameContent(src_url, dest_url);
VerifyFilesHaveSameContent(file_util(), other_file_util(), }
src_url, dest_url);
} }
} }
TEST_F(IsolatedFileUtilTest, CopyOutDirectoryTest) { TEST_F(IsolatedFileUtilTest, CopyOutDirectoryTest) {
scoped_ptr<FileSystemOperationContext> context( FileSystemURL src_root = GetFileSystemURL(base::FilePath());
new FileSystemOperationContext(file_system_context())); FileSystemURL dest_root = GetOtherFileSystemURL(base::FilePath());
FileSystemURL root_url = GetFileSystemURL(base::FilePath());
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum(
file_util()->CreateFileEnumerator(context.get(),
root_url,
false /* recursive */));
base::FilePath current;
while (!(current = file_enum->Next()).empty()) {
if (!file_enum->IsDirectory())
continue;
SCOPED_TRACE(testing::Message() << "Testing directory copy "
<< current.value());
FileSystemURL src_url = root_url.WithPath(current);
FileSystemURL dest_url = GetOtherFileSystemURL(current);
// Create the parent directory of the destination.
context.reset(new FileSystemOperationContext(file_system_context()));
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
other_file_util()->CreateDirectory( AsyncFileTestHelper::CreateDirectory(file_system_context(),
context.get(), dest_root));
GetOtherFileSystemURL(current.DirName()),
false /* exclusive */,
true /* recursive */));
context.reset(new FileSystemOperationContext(file_system_context())); FileEntryList entries;
ASSERT_EQ(base::PLATFORM_FILE_OK, ASSERT_EQ(base::PLATFORM_FILE_OK,
FileUtilHelper::Copy( AsyncFileTestHelper::ReadDirectory(file_system_context(),
context.get(), src_root, &entries));
file_util(), other_file_util(), for (size_t i = 0; i < entries.size(); ++i) {
if (!entries[i].is_directory)
continue;
FileSystemURL src_url = GetEntryURL(file_system_context(),
src_root, entries[i].name);
FileSystemURL dest_url = GetOtherURL(file_system_context(),
src_root, dest_root, src_url);
SCOPED_TRACE(testing::Message() << "Testing file copy "
<< src_url.path().value());
ASSERT_EQ(base::PLATFORM_FILE_OK,
AsyncFileTestHelper::Copy(file_system_context(),
src_url, dest_url)); src_url, dest_url));
VerifyDirectoriesHaveSameContent(src_url, dest_url);
VerifyDirectoriesHaveSameContent(file_util(), other_file_util(),
src_url, dest_url);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment