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..c1ee85ccafa071815897983e4b259ae8bb5b74c7 |
--- /dev/null |
+++ b/webkit/fileapi/file_system_context_unittest.cc |
@@ -0,0 +1,219 @@ |
+// 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 "base/stringprintf.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 { |
+ |
+const char kTestOrigin[] = "http://chromium.org/"; |
+const FilePath::CharType kVirtualPathNoRoot[] = FPL("root/file"); |
+ |
+GURL CreateRawFileSystemURL(const std::string& type_str, |
+ const std::string& fs_id) { |
+ std::string url_str = base::StringPrintf( |
+ "filesystem:http://chromium.org/%s/%s/root/file", |
+ type_str.c_str(), |
+ fs_id.c_str()); |
+ return GURL(url_str); |
+} |
+ |
+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(); |
+ } |
+ |
+ // Verifies a *valid* filesystem url has expected values. |
+ void ExpectFileSystemURLMatches(const FileSystemURL& url, |
+ const GURL& expect_origin, |
+ FileSystemType expect_mount_type, |
+ FileSystemType expect_type, |
+ const FilePath& expect_path, |
+ const FilePath& expect_virtual_path, |
+ const std::string& expect_filesystem_id) { |
+ ASSERT_TRUE(url.is_valid()); |
+ |
+ EXPECT_EQ(expect_origin, url.origin()); |
+ EXPECT_EQ(expect_mount_type, url.mount_type()); |
+ EXPECT_EQ(expect_type, url.type()); |
+ EXPECT_EQ(expect_path, url.path()); |
+ EXPECT_EQ(expect_virtual_path, url.virtual_path()); |
+ EXPECT_EQ(expect_filesystem_id, url.filesystem_id()); |
+ } |
+ |
+ 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 an isolated mount point. |
+ 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 a system external mount point with the same name/id as the |
+ // 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; |
+ std::string type_str; |
+ |
+ // Expected test results. |
+ bool expect_is_valid; |
+ FileSystemType expect_mount_type; |
+ FileSystemType expect_type; |
+ const FilePath::CharType* expect_path; |
+ bool expect_virtual_path_empty; |
+ std::string expect_filesystem_id; |
+ }; |
+ |
+ const TestCase kTestCases[] = { |
+ // Following should not be handled by the url crackers: |
+ { |
+ "pers_mount", "persistent", true /* is_valid */, |
+ kFileSystemTypePersistent, kFileSystemTypePersistent, |
+ FPL("pers_mount/root/file"), true /* virtual path empty */, |
+ std::string() /* filesystem id */ |
+ }, |
+ { |
+ "temp_mount", "temporary", true /* is_valid */, |
+ kFileSystemTypeTemporary, kFileSystemTypeTemporary, |
+ FPL("temp_mount/root/file"), true /* virtual path empty */, |
+ std::string() /* filesystem id */ |
+ }, |
+ // Should be cracked by isolated mount points: |
+ { |
+ kIsolatedFileSystemID, "isolated", true /* is_valid */, |
+ kFileSystemTypeIsolated, kFileSystemTypeNativeLocal, |
+ DRIVE FPL("/test/isolated/root/file"), false /* virtual path empty */, |
+ kIsolatedFileSystemID |
+ }, |
+ // Should be cracked by system mount points: |
+ { |
+ "system", "external", true /* is_valid */, |
+ kFileSystemTypeExternal, kFileSystemTypeDrive, |
+ DRIVE FPL("/test/sys/root/file"), false /* virtual path empty */, |
+ "system" |
+ }, |
+ { |
+ kIsolatedFileSystemID, "external", true /* is_valid */, |
+ kFileSystemTypeExternal, kFileSystemTypeRestrictedNativeLocal, |
+ DRIVE FPL("/test/system/isolated/root/file"), |
+ false /* virtual path empty */, |
+ kIsolatedFileSystemID |
+ }, |
+ // Test for invalid filesystem url (made invalid by adding invalid |
+ // filesystem type). |
+ { |
+ "sytem", "external", false /* is_valid */, |
+ // The rest of values will be ignored. |
+ kFileSystemTypeUnknown, kFileSystemTypeUnknown, FPL(""), true, |
+ std::string() |
+ }, |
+ // Test for URL with non-existing filesystem id. |
+ { |
+ "invalid", "external", false /* is_valid */, |
+ // The rest of values will be ignored. |
+ kFileSystemTypeUnknown, kFileSystemTypeUnknown, FPL(""), true, |
+ std::string() |
+ }, |
+ }; |
+ |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { |
+ const FilePath virtual_path = |
+ FilePath::FromUTF8Unsafe(kTestCases[i].root).Append(kVirtualPathNoRoot); |
+ |
+ GURL raw_url = |
+ CreateRawFileSystemURL(kTestCases[i].type_str, kTestCases[i].root); |
+ FileSystemURL cracked_url = file_system_context()->CrackURL(raw_url); |
+ |
+ SCOPED_TRACE(testing::Message() << "Test case " << i << ": " |
+ << "Cracking URL: " << raw_url); |
+ |
+ EXPECT_EQ(kTestCases[i].expect_is_valid, cracked_url.is_valid()); |
+ if (!kTestCases[i].expect_is_valid) |
+ continue; |
+ |
+ ExpectFileSystemURLMatches( |
+ cracked_url, |
+ GURL(kTestOrigin), |
+ kTestCases[i].expect_mount_type, |
+ kTestCases[i].expect_type, |
+ FilePath(kTestCases[i].expect_path).NormalizePathSeparators(), |
+ kTestCases[i].expect_virtual_path_empty ? |
+ FilePath() : virtual_path.NormalizePathSeparators(), |
+ kTestCases[i].expect_filesystem_id); |
+ } |
+ |
+ IsolatedContext::GetInstance()->RevokeFileSystemByPath( |
+ FilePath(DRIVE FPL("/test/isolated/root"))); |
+ ExternalMountPoints::GetSystemInstance()->RevokeFileSystem("system"); |
+ ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( |
+ kIsolatedFileSystemID); |
+} |
+ |
+} // namespace |
+ |
+} // namespace fileapi |
+ |