diff options
author | ericu@chromium.org <ericu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-26 00:54:46 +0000 |
---|---|---|
committer | ericu@chromium.org <ericu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-26 00:54:46 +0000 |
commit | 81b7f6675d7296ab536db6bb5bf52d0ff949faad (patch) | |
tree | ea636365d46bfcbe49ff5e11fee09201c09211b3 /webkit/fileapi/file_system_file_util_unittest.cc | |
parent | 03b11bc8e4d4184b897a036ad4dd89c53499f79e (diff) | |
download | chromium_src-81b7f6675d7296ab536db6bb5bf52d0ff949faad.zip chromium_src-81b7f6675d7296ab536db6bb5bf52d0ff949faad.tar.gz chromium_src-81b7f6675d7296ab536db6bb5bf52d0ff949faad.tar.bz2 |
Enable cross-filesystem moves and copies.
BUG=none
TEST=unit tests included; I also tested locally with a cross-filesystem-sync-copy layout test [that I'll add to webkit later], both with and without obfuscation.
Review URL: http://codereview.chromium.org/7066033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86755 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/fileapi/file_system_file_util_unittest.cc')
-rw-r--r-- | webkit/fileapi/file_system_file_util_unittest.cc | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/webkit/fileapi/file_system_file_util_unittest.cc b/webkit/fileapi/file_system_file_util_unittest.cc new file mode 100644 index 0000000..056aa24 --- /dev/null +++ b/webkit/fileapi/file_system_file_util_unittest.cc @@ -0,0 +1,221 @@ +// 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 "base/file_path.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/platform_file.h" +#include "base/scoped_temp_dir.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "webkit/fileapi/file_system_context.h" +#include "webkit/fileapi/file_system_operation_context.h" +#include "webkit/fileapi/file_system_test_helper.h" +#include "webkit/fileapi/local_file_system_file_util.h" +#include "webkit/fileapi/obfuscated_file_system_file_util.h" + +using namespace fileapi; + +namespace { + +struct CopyMoveTestCaseRecord { + bool is_directory; + const FilePath::CharType path[64]; + int64 data_file_size; +}; + +const CopyMoveTestCaseRecord kCopyMoveTestCases[] = { + {true, FILE_PATH_LITERAL("dir a"), 0}, + {true, FILE_PATH_LITERAL("dir a/dir a"), 0}, + {true, FILE_PATH_LITERAL("dir a/dir d"), 0}, + {true, FILE_PATH_LITERAL("dir a/dir d/dir e"), 0}, + {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir f"), 0}, + {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g"), 0}, + {true, FILE_PATH_LITERAL("dir a/dir d/dir e/dir h"), 0}, + {true, FILE_PATH_LITERAL("dir b"), 0}, + {true, FILE_PATH_LITERAL("dir b/dir a"), 0}, + {true, FILE_PATH_LITERAL("dir c"), 0}, + {false, FILE_PATH_LITERAL("file 0"), 38}, + {false, FILE_PATH_LITERAL("file 2"), 60}, + {false, FILE_PATH_LITERAL("file 3"), 0}, + {false, FILE_PATH_LITERAL("dir a/file 0"), 39}, + {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 0"), 40}, + {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 1"), 41}, + {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 2"), 42}, + {false, FILE_PATH_LITERAL("dir a/dir d/dir e/dir g/file 3"), 50}, +}; + +} // namespace (anonymous) + +// This is not yet a full unit test for FileSystemFileUtil. TODO(ericu): Adapt +// the other subclasses' unit tests, as mentioned in the comments in +// ObfuscatedFileSystemFileUtil's unit test. +// Currently this is just a test of cross-filesystem copy and move, which +// actually exercises subclasses of FileSystemFileUtil as well as the class +// itself. We currently only test copies between obfuscated filesystems. +// TODO(ericu): Add a test for copying between obfuscated and local filesystems, +// and between different local filesystems. +class FileSystemFileUtilTest : public testing::Test { + public: + FileSystemFileUtilTest() { + } + + void SetUp() { + } + + FileSystemOperationContext* NewContext(FileSystemTestOriginHelper* helper) { + FileSystemOperationContext* context = helper->NewOperationContext(); + context->set_allowed_bytes_growth(1024 * 1024); + return context; + } + + void TestCrossFileSystemCopyMoveHelper( + const GURL& src_origin, fileapi::FileSystemType src_type, + const GURL& dest_origin, fileapi::FileSystemType dest_type, + bool copy) { + ScopedTempDir src_dir; + ASSERT_TRUE(src_dir.CreateUniqueTempDir()); + scoped_refptr<ObfuscatedFileSystemFileUtil> src_util( + new ObfuscatedFileSystemFileUtil(src_dir.path())); + FileSystemTestOriginHelper src_helper(src_origin, src_type); + src_helper.SetUp(src_dir.path(), + false, // incognito + false, // unlimited quota + NULL, // quota::QuotaManagerProxy + src_util.get()); + ScopedTempDir dest_dir; + ASSERT_TRUE(dest_dir.CreateUniqueTempDir()); + scoped_refptr<ObfuscatedFileSystemFileUtil> dest_util( + new ObfuscatedFileSystemFileUtil(dest_dir.path())); + FileSystemTestOriginHelper dest_helper(dest_origin, dest_type); + dest_helper.SetUp(dest_dir.path(), + false, // incognito + false, // unlimited quota + NULL, // quota::QuotaManagerProxy + dest_util.get()); + + // Set up all the source data. + scoped_ptr<FileSystemOperationContext> context; + FilePath test_root(FILE_PATH_LITERAL("root directory")); + for (size_t i = 0; i < arraysize(kCopyMoveTestCases); ++i) { + SCOPED_TRACE(testing::Message() << "Creating kCopyMoveTestCases " << i); + const CopyMoveTestCaseRecord& test_case = kCopyMoveTestCases[i]; + FilePath path = test_root.Append(test_case.path); + if (test_case.is_directory) { + context.reset(NewContext(&src_helper)); + ASSERT_EQ(base::PLATFORM_FILE_OK, + src_util->CreateDirectory(context.get(), path, true, true)); + } else { + context.reset(NewContext(&src_helper)); + bool created = false; + ASSERT_EQ(base::PLATFORM_FILE_OK, + src_util->EnsureFileExists(context.get(), path, &created)); + ASSERT_TRUE(created); + context.reset(NewContext(&src_helper)); + ASSERT_EQ(base::PLATFORM_FILE_OK, src_util->Truncate( + context.get(), path, test_case.data_file_size)); + } + } + + // Do the actual copy or move. + FileSystemContext* file_system_context = dest_helper.file_system_context(); + scoped_ptr<FileSystemOperationContext> copy_context( + new FileSystemOperationContext(file_system_context, NULL)); + copy_context->set_src_file_system_file_util(src_util); + copy_context->set_dest_file_system_file_util(dest_util); + copy_context->set_src_origin_url(src_helper.origin()); + copy_context->set_dest_origin_url(dest_helper.origin()); + copy_context->set_src_type(src_helper.type()); + copy_context->set_dest_type(dest_helper.type()); + copy_context->set_allowed_bytes_growth(1024 * 1024); + + if (copy) + ASSERT_EQ(base::PLATFORM_FILE_OK, + src_util->Copy(copy_context.get(), test_root, test_root)); + else + ASSERT_EQ(base::PLATFORM_FILE_OK, + src_util->Move(copy_context.get(), test_root, test_root)); + + // Validate that the destination paths are correct. + for (size_t i = 0; i < arraysize(kCopyMoveTestCases); ++i) { + SCOPED_TRACE(testing::Message() << "Validating kCopyMoveTestCases " << i); + const CopyMoveTestCaseRecord& test_case = kCopyMoveTestCases[i]; + FilePath path = test_root.Append(test_case.path); + SCOPED_TRACE(testing::Message() << "Path is " << test_case.path); + + base::PlatformFileInfo dest_file_info; + FilePath data_path; + context.reset(NewContext(&dest_helper)); + EXPECT_EQ(base::PLATFORM_FILE_OK, + dest_util->GetFileInfo( + context.get(), path, &dest_file_info, &data_path)); + if (test_case.is_directory) { + EXPECT_TRUE(dest_file_info.is_directory); + } else { + base::PlatformFileInfo platform_file_info; + ASSERT_TRUE(file_util::GetFileInfo(data_path, &platform_file_info)); + EXPECT_EQ(test_case.data_file_size, platform_file_info.size); + EXPECT_FALSE(platform_file_info.is_directory); + EXPECT_EQ(platform_file_info.size, dest_file_info.size); + EXPECT_FALSE(dest_file_info.is_directory); + } + } + + // Validate that the source paths are still there [for a copy] or gone [for + // a move]. + for (size_t i = 0; i < arraysize(kCopyMoveTestCases); ++i) { + SCOPED_TRACE(testing::Message() << "Validating kCopyMoveTestCases " << + i); + const CopyMoveTestCaseRecord& test_case = kCopyMoveTestCases[i]; + FilePath path = test_root.Append(test_case.path); + SCOPED_TRACE(testing::Message() << "Path is " << test_case.path); + + base::PlatformFileInfo src_file_info; + FilePath data_path; + context.reset(NewContext(&src_helper)); + base::PlatformFileError expected_result; + if (copy) + expected_result = base::PLATFORM_FILE_OK; + else + expected_result = base::PLATFORM_FILE_ERROR_NOT_FOUND; + EXPECT_EQ(expected_result, + src_util->GetFileInfo( + context.get(), path, &src_file_info, &data_path)); + } + } + + private: + DISALLOW_COPY_AND_ASSIGN(FileSystemFileUtilTest); +}; + +TEST_F(FileSystemFileUtilTest, TestCrossFileSystemCopyDifferentOrigins) { + GURL src_origin("http://www.example.com"); + fileapi::FileSystemType type = kFileSystemTypePersistent; + GURL dest_origin("http://www.not.the.same.domain.com"); + + TestCrossFileSystemCopyMoveHelper(src_origin, type, dest_origin, type, true); +} + +TEST_F(FileSystemFileUtilTest, TestCrossFileSystemCopySameOrigin) { + GURL origin("http://www.example.com"); + fileapi::FileSystemType src_type = kFileSystemTypePersistent; + fileapi::FileSystemType dest_type = kFileSystemTypeTemporary; + + TestCrossFileSystemCopyMoveHelper(origin, src_type, origin, dest_type, true); +} + +TEST_F(FileSystemFileUtilTest, TestCrossFileSystemMoveDifferentOrigins) { + GURL src_origin("http://www.example.com"); + fileapi::FileSystemType type = kFileSystemTypePersistent; + GURL dest_origin("http://www.not.the.same.domain.com"); + + TestCrossFileSystemCopyMoveHelper(src_origin, type, dest_origin, type, false); +} + +TEST_F(FileSystemFileUtilTest, TestCrossFileSystemMoveSameOrigin) { + GURL origin("http://www.example.com"); + fileapi::FileSystemType src_type = kFileSystemTypePersistent; + fileapi::FileSystemType dest_type = kFileSystemTypeTemporary; + + TestCrossFileSystemCopyMoveHelper(origin, src_type, origin, dest_type, false); +} |