| Index: webkit/fileapi/file_system_context_unittest.cc
|
| diff --git a/webkit/fileapi/file_system_context_unittest.cc b/webkit/fileapi/file_system_context_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5bd2ab8f97252771e733e7120986f6033afe698f
|
| --- /dev/null
|
| +++ b/webkit/fileapi/file_system_context_unittest.cc
|
| @@ -0,0 +1,191 @@
|
| +// Copyright (c) 2013 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_context.h"
|
| +
|
| +#include "base/files/scoped_temp_dir.h"
|
| +#include "base/message_loop.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "webkit/fileapi/external_mount_points.h"
|
| +#include "webkit/fileapi/file_system_task_runners.h"
|
| +#include "webkit/fileapi/isolated_context.h"
|
| +#include "webkit/fileapi/mock_file_system_options.h"
|
| +#include "webkit/quota/mock_quota_manager.h"
|
| +#include "webkit/quota/mock_special_storage_policy.h"
|
| +
|
| +#define FPL(x) FILE_PATH_LITERAL(x)
|
| +
|
| +#if defined(FILE_PATH_USES_DRIVE_LETTERS)
|
| +#define DRIVE FPL("C:")
|
| +#else
|
| +#define DRIVE
|
| +#endif
|
| +
|
| +namespace fileapi {
|
| +
|
| +namespace {
|
| +
|
| +class FileSystemContextTest : public testing::Test {
|
| + public:
|
| + FileSystemContextTest() {}
|
| +
|
| + void SetUp() {
|
| + ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
|
| +
|
| + scoped_refptr<quota::SpecialStoragePolicy> storage_policy(
|
| + new quota::MockSpecialStoragePolicy());
|
| +
|
| + mock_quota_manager_ = new quota::MockQuotaManager(
|
| + false /* is_incognito */,
|
| + data_dir_.path(),
|
| + base::MessageLoopProxy::current(),
|
| + base::MessageLoopProxy::current(),
|
| + storage_policy);
|
| +
|
| + file_system_context_ = new FileSystemContext(
|
| + FileSystemTaskRunners::CreateMockTaskRunners(),
|
| + storage_policy,
|
| + mock_quota_manager_->proxy(),
|
| + data_dir_.path(),
|
| + CreateAllowFileAccessOptions());
|
| + }
|
| +
|
| + protected:
|
| + FileSystemContext* file_system_context() {
|
| + return file_system_context_.get();
|
| + }
|
| +
|
| + private:
|
| + base::ScopedTempDir data_dir_;
|
| + MessageLoop message_loop_;
|
| + scoped_refptr<quota::MockQuotaManager> mock_quota_manager_;
|
| + scoped_refptr<FileSystemContext> file_system_context_;
|
| +};
|
| +
|
| +TEST_F(FileSystemContextTest, CrackFileSystemURL) {
|
| + // Register Isolated mount points.
|
| + std::string isolated_file_system_name = "root";
|
| + const std::string kIsolatedFileSystemID =
|
| + IsolatedContext::GetInstance()->RegisterFileSystemForPath(
|
| + kFileSystemTypeNativeLocal,
|
| + FilePath(DRIVE FPL("/test/isolated/root")),
|
| + &isolated_file_system_name);
|
| + // Register system external mount point.
|
| + ASSERT_TRUE(ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
|
| + "system",
|
| + kFileSystemTypeDrive,
|
| + FilePath(DRIVE FPL("/test/sys/"))));
|
| + // Register system external mount point that overrides registered isolated
|
| + // mount point.
|
| + ASSERT_TRUE(ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
|
| + kIsolatedFileSystemID,
|
| + kFileSystemTypeRestrictedNativeLocal,
|
| + FilePath(DRIVE FPL("/test/system/isolated"))));
|
| +
|
| + struct TestCase {
|
| + // Test case values.
|
| + std::string root;
|
| + FileSystemType type;
|
| + // Not NULL for test cases that test previously cracked URLs.
|
| + MountPoints* pre_test_cracker;
|
| +
|
| + // Expected test results.
|
| + bool expect_is_valid;
|
| + bool expect_is_cracked;
|
| + FileSystemType expect_type;
|
| + const FilePath::CharType* expect_path;
|
| + };
|
| +
|
| + // Test cracking invalid FileSystemURL ("foobar" is invalid type).
|
| + FileSystemURL invalid_cracked =file_system_context()->CrackFileSystemURL(
|
| + FileSystemURL(GURL("filesystem:http://c.org/foobar/file")));
|
| + EXPECT_FALSE(invalid_cracked.is_valid());
|
| + EXPECT_FALSE(invalid_cracked.is_cracked());
|
| +
|
| + const GURL kTestOrigin = GURL("http://chromium.org/");
|
| + const FilePath kVirtualPathNoRoot = FilePath(FPL("root/file"));
|
| +
|
| + const TestCase kTestCases[] = {
|
| + // Following should not be handled by url crackers:
|
| + { "pers_mount", kFileSystemTypePersistent, NULL,
|
| + true, false, kFileSystemTypePersistent, FPL("pers_mount/root/file") },
|
| + { "temp_mount", kFileSystemTypeTemporary, NULL,
|
| + true, false, kFileSystemTypeTemporary, FPL("temp_mount/root/file") },
|
| + { "system", kFileSystemTypeNativeLocal, NULL,
|
| + true, false, kFileSystemTypeNativeLocal, FPL("system/root/file") },
|
| + { "isolated", kFileSystemTypeNativeMedia, NULL,
|
| + true, false, kFileSystemTypeNativeMedia, FPL("isolated/root/file") },
|
| + // Should be cracked by isolated mount points:
|
| + { kIsolatedFileSystemID, kFileSystemTypeIsolated, NULL,
|
| + true, true, kFileSystemTypeNativeLocal,
|
| + DRIVE FPL("/test/isolated/root/file") },
|
| + // Should be cracked by system mount points:
|
| + { "system", kFileSystemTypeExternal, NULL,
|
| + true, true, kFileSystemTypeDrive,
|
| + DRIVE FPL("/test/sys/root/file") },
|
| + { kIsolatedFileSystemID, kFileSystemTypeExternal, NULL,
|
| + true, true, kFileSystemTypeRestrictedNativeLocal,
|
| + DRIVE FPL("/test/system/isolated/root/file") },
|
| + // Test for already cracked FielSystemURLs:
|
| + { "system", kFileSystemTypeExternal,
|
| + ExternalMountPoints::GetSystemInstance(),
|
| + true, true, kFileSystemTypeDrive,
|
| + DRIVE FPL("/test/sys/root/file") },
|
| + { kIsolatedFileSystemID, kFileSystemTypeIsolated,
|
| + IsolatedContext::GetInstance(),
|
| + true, true, kFileSystemTypeNativeLocal,
|
| + DRIVE FPL("/test/isolated/root/file") },
|
| + // In following two tests pre_test_cracker will create invalid
|
| + // FileSystemURL, so these test CrackFileSystem for invalid URL.
|
| + { "invalid", kFileSystemTypeExternal,
|
| + ExternalMountPoints::GetSystemInstance(),
|
| + false, false, kFileSystemTypeUnknown, FPL("") },
|
| + { "invalid", kFileSystemTypeIsolated,
|
| + IsolatedContext::GetInstance(),
|
| + false, false, kFileSystemTypeUnknown, FPL("") },
|
| + };
|
| +
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
|
| + const FilePath virtual_path =
|
| + FilePath::FromUTF8Unsafe(kTestCases[i].root).Append(kVirtualPathNoRoot);
|
| + SCOPED_TRACE(
|
| + testing::Message() << "Testing test case " << i << ": "
|
| + << "virtual_path: " << virtual_path.value()
|
| + << " file system type: " << kTestCases[i].type
|
| + << " cracked before test: "
|
| + << (kTestCases[i].pre_test_cracker != NULL));
|
| +
|
| + FileSystemURL url(kTestOrigin, kTestCases[i].type, virtual_path);
|
| + if (kTestCases[i].pre_test_cracker)
|
| + url = kTestCases[i].pre_test_cracker->CrackURL(url);
|
| +
|
| + FileSystemURL cracked = file_system_context()->CrackFileSystemURL(url);
|
| +
|
| + EXPECT_EQ(kTestCases[i].expect_is_valid, cracked.is_valid());
|
| + EXPECT_EQ(kTestCases[i].expect_is_cracked, cracked.is_cracked());
|
| +
|
| + if (!kTestCases[i].expect_is_valid)
|
| + continue;
|
| + EXPECT_EQ(kTestOrigin, cracked.origin());
|
| + EXPECT_EQ(kTestCases[i].expect_type, cracked.type());
|
| + EXPECT_EQ(kTestCases[i].type, cracked.mount_type());
|
| + EXPECT_EQ(FilePath(kTestCases[i].expect_path).NormalizePathSeparators(),
|
| + cracked.path());
|
| + EXPECT_EQ(virtual_path.NormalizePathSeparators(), cracked.virtual_path());
|
| + std::string expected_filesystem_id =
|
| + kTestCases[i].expect_is_cracked ? kTestCases[i].root : std::string();
|
| + EXPECT_EQ(expected_filesystem_id, cracked.filesystem_id());
|
| + }
|
| +
|
| + IsolatedContext::GetInstance()->RevokeFileSystemByPath(
|
| + FilePath(DRIVE FPL("/test/isolated/root")));
|
| + ExternalMountPoints::GetSystemInstance()->RevokeFileSystem("system");
|
| + ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(
|
| + kIsolatedFileSystemID);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace fileapi
|
| +
|
|
|