diff options
Diffstat (limited to 'chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc')
-rw-r--r-- | chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc b/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc new file mode 100644 index 0000000..0bef727 --- /dev/null +++ b/chrome/browser/chromeos/fileapi/file_system_backend_unittest.cc @@ -0,0 +1,273 @@ +// Copyright 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 "chrome/browser/chromeos/fileapi/file_system_backend.h" + +#include <set> + +#include "base/files/file_path.h" +#include "base/path_service.h" +#include "chromeos/dbus/cros_disks_client.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/url_util.h" +#include "webkit/browser/fileapi/external_mount_points.h" +#include "webkit/browser/fileapi/file_permission_policy.h" +#include "webkit/browser/fileapi/file_system_url.h" +#include "webkit/browser/fileapi/isolated_context.h" +#include "webkit/browser/quota/mock_special_storage_policy.h" + +#define FPL(x) FILE_PATH_LITERAL(x) + +using fileapi::ExternalMountPoints; +using fileapi::FileSystemURL; + +namespace { + +FileSystemURL CreateFileSystemURL(const std::string& extension, + const char* path, + ExternalMountPoints* mount_points) { + return mount_points->CreateCrackedFileSystemURL( + GURL("chrome-extension://" + extension + "/"), + fileapi::kFileSystemTypeExternal, + base::FilePath::FromUTF8Unsafe(path)); +} + +TEST(ChromeOSFileSystemBackendTest, DefaultMountPoints) { + scoped_refptr<quota::SpecialStoragePolicy> storage_policy = + new quota::MockSpecialStoragePolicy(); + scoped_refptr<fileapi::ExternalMountPoints> mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + chromeos::FileSystemBackend backend( + NULL, // drive_delegate + storage_policy, + mount_points.get(), + fileapi::ExternalMountPoints::GetSystemInstance()); + backend.AddSystemMountPoints(); + std::vector<base::FilePath> root_dirs = backend.GetRootDirectories(); + std::set<base::FilePath> root_dirs_set(root_dirs.begin(), root_dirs.end()); + + // By default there should be 4 mount points (in system mount points): + EXPECT_EQ(4u, root_dirs.size()); + base::FilePath home_path; + ASSERT_TRUE(PathService::Get(base::DIR_HOME, &home_path)); + + EXPECT_TRUE(root_dirs_set.count(home_path.AppendASCII("Downloads"))); + EXPECT_TRUE(root_dirs_set.count( + chromeos::CrosDisksClient::GetRemovableDiskMountPoint())); + EXPECT_TRUE(root_dirs_set.count( + chromeos::CrosDisksClient::GetArchiveMountPoint())); + EXPECT_TRUE(root_dirs_set.count(base::FilePath(FPL("/usr/share/oem")))); +} + +TEST(ChromeOSFileSystemBackendTest, GetRootDirectories) { + scoped_refptr<quota::SpecialStoragePolicy> storage_policy = + new quota::MockSpecialStoragePolicy(); + scoped_refptr<fileapi::ExternalMountPoints> mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + + scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + + chromeos::FileSystemBackend backend( + NULL, // drive_delegate + storage_policy, + mount_points.get(), + system_mount_points.get()); + + const size_t initial_root_dirs_size = backend.GetRootDirectories().size(); + + // Register 'local' test mount points. + mount_points->RegisterFileSystem("c", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/a/b/c"))); + mount_points->RegisterFileSystem("d", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/b/c/d"))); + + // Register system test mount points. + system_mount_points->RegisterFileSystem("d", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/g/c/d"))); + system_mount_points->RegisterFileSystem("e", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/g/d/e"))); + + std::vector<base::FilePath> root_dirs = backend.GetRootDirectories(); + std::set<base::FilePath> root_dirs_set(root_dirs.begin(), root_dirs.end()); + EXPECT_EQ(initial_root_dirs_size + 4, root_dirs.size()); + EXPECT_TRUE(root_dirs_set.count(base::FilePath(FPL("/a/b/c")))); + EXPECT_TRUE(root_dirs_set.count(base::FilePath(FPL("/b/c/d")))); + EXPECT_TRUE(root_dirs_set.count(base::FilePath(FPL("/g/c/d")))); + EXPECT_TRUE(root_dirs_set.count(base::FilePath(FPL("/g/d/e")))); +} + +TEST(ChromeOSFileSystemBackendTest, AccessPermissions) { + url_util::AddStandardScheme("chrome-extension"); + + scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy = + new quota::MockSpecialStoragePolicy(); + scoped_refptr<fileapi::ExternalMountPoints> mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + chromeos::FileSystemBackend backend( + NULL, // drive_delegate + storage_policy, + mount_points.get(), + system_mount_points.get()); + + std::string extension("ddammdhioacbehjngdmkjcjbnfginlla"); + + storage_policy->AddFileHandler(extension); + + // Initialize mount points. + ASSERT_TRUE(system_mount_points->RegisterFileSystem( + "system", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/g/system")))); + ASSERT_TRUE(mount_points->RegisterFileSystem( + "removable", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/media/removable")))); + ASSERT_TRUE(mount_points->RegisterFileSystem( + "oem", + fileapi::kFileSystemTypeRestrictedNativeLocal, + base::FilePath(FPL("/usr/share/oem")))); + + // Backend specific mount point access. + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "removable/foo", mount_points.get()))); + + backend.GrantFileAccessToExtension(extension, + base::FilePath(FPL("removable/foo"))); + EXPECT_TRUE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "removable/foo", mount_points.get()))); + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "removable/foo1", mount_points.get()))); + + // System mount point access. + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "system/foo", system_mount_points.get()))); + + backend.GrantFileAccessToExtension(extension, + base::FilePath(FPL("system/foo"))); + EXPECT_TRUE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "system/foo", system_mount_points.get()))); + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "system/foo1", + system_mount_points.get()))); + + // oem is restricted file system. + backend.GrantFileAccessToExtension( + extension, base::FilePath(FPL("oem/foo"))); + // The extension should not be able to access the file even if + // GrantFileAccessToExtension was called. + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "oem/foo", mount_points.get()))); + + backend.GrantFullAccessToExtension(extension); + // The extension should be able to access restricted file system after it was + // granted full access. + EXPECT_TRUE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "oem/foo", mount_points.get()))); + // The extension which was granted full access should be able to access any + // path on current file systems. + EXPECT_TRUE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "removable/foo1", mount_points.get()))); + EXPECT_TRUE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "system/foo1", + system_mount_points.get()))); + + // The extension cannot access new mount points. + // TODO(tbarzic): This should probably be changed. + ASSERT_TRUE(mount_points->RegisterFileSystem( + "test", + fileapi::kFileSystemTypeNativeLocal, + base::FilePath(FPL("/foo/test")))); + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "test_/foo", mount_points.get()))); + + backend.RevokeAccessForExtension(extension); + EXPECT_FALSE(backend.IsAccessAllowed( + CreateFileSystemURL(extension, "removable/foo", mount_points.get()))); + + fileapi::FileSystemURL internal_url = FileSystemURL::CreateForTest( + GURL("chrome://foo"), + fileapi::kFileSystemTypeExternal, + base::FilePath(FPL("removable/"))); + // Internal WebUI should have full access. + EXPECT_TRUE(backend.IsAccessAllowed(internal_url)); +} + +TEST(ChromeOSFileSystemBackendTest, GetVirtualPathConflictWithSystemPoints) { + scoped_refptr<quota::MockSpecialStoragePolicy> storage_policy = + new quota::MockSpecialStoragePolicy(); + scoped_refptr<fileapi::ExternalMountPoints> mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + scoped_refptr<fileapi::ExternalMountPoints> system_mount_points( + fileapi::ExternalMountPoints::CreateRefCounted()); + chromeos::FileSystemBackend backend( + NULL, // drive_delegate + storage_policy, + mount_points.get(), + system_mount_points.get()); + + const fileapi::FileSystemType type = fileapi::kFileSystemTypeNativeLocal; + + // Backend specific mount points. + ASSERT_TRUE( + mount_points->RegisterFileSystem("b", type, base::FilePath(FPL("/a/b")))); + ASSERT_TRUE( + mount_points->RegisterFileSystem("y", type, base::FilePath(FPL("/z/y")))); + ASSERT_TRUE( + mount_points->RegisterFileSystem("n", type, base::FilePath(FPL("/m/n")))); + + // System mount points + ASSERT_TRUE(system_mount_points->RegisterFileSystem( + "gb", type, base::FilePath(FPL("/a/b")))); + ASSERT_TRUE( + system_mount_points->RegisterFileSystem( + "gz", type, base::FilePath(FPL("/z")))); + ASSERT_TRUE(system_mount_points->RegisterFileSystem( + "gp", type, base::FilePath(FPL("/m/n/o/p")))); + + struct TestCase { + const base::FilePath::CharType* const local_path; + bool success; + const base::FilePath::CharType* const virtual_path; + }; + + const TestCase kTestCases[] = { + // Same paths in both mount points. + { FPL("/a/b/c/d"), true, FPL("b/c/d") }, + // System mount points path more specific. + { FPL("/m/n/o/p/r/s"), true, FPL("n/o/p/r/s") }, + // System mount points path less specific. + { FPL("/z/y/x"), true, FPL("y/x") }, + // Only system mount points path matches. + { FPL("/z/q/r/s"), true, FPL("gz/q/r/s") }, + // No match. + { FPL("/foo/xxx"), false, FPL("") }, + }; + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { + // Initialize virtual path with a value. + base::FilePath virtual_path(FPL("/mount")); + base::FilePath local_path(kTestCases[i].local_path); + EXPECT_EQ(kTestCases[i].success, + backend.GetVirtualPath(local_path, &virtual_path)) + << "Resolving " << kTestCases[i].local_path; + + // There are no guarantees for |virtual_path| value if |GetVirtualPath| + // fails. + if (!kTestCases[i].success) + continue; + + base::FilePath expected_virtual_path(kTestCases[i].virtual_path); + EXPECT_EQ(expected_virtual_path, virtual_path) + << "Resolving " << kTestCases[i].local_path; + } +} + +} // namespace |