10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <string> 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/files/file.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/scoped_ptr.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/service.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/service_factory.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/fake_user_manager.h" 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/profiles/profile.h" 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/testing_browser_process.h" 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/testing_profile.h" 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/testing_profile_manager.h" 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/keyed_service/core/keyed_service.h" 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/browser/browser_context.h" 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/test_browser_thread_bundle.h" 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/browser/extension_registry.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/isolated_context.h" 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace chromeos { 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace file_system_provider { 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace util { 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kFileSystemId[] = "File/System/Id"; 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kDisplayName[] = "Camera Pictures"; 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Creates a FileSystemURL for tests. 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemURL CreateFileSystemURL( 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ProvidedFileSystemInfo& file_system_info, 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& file_path) { 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string origin = 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string("chrome-extension://") + file_system_info.extension_id(); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath mount_path = file_system_info.mount_path(); 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::ExternalMountPoints* const mount_points = 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::ExternalMountPoints::GetSystemInstance(); 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(mount_points); 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(file_path.IsAbsolute()); 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath relative_path(file_path.value().substr(1)); 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return mount_points->CreateCrackedFileSystemURL( 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL(origin), 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::kFileSystemTypeExternal, 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath(mount_path.BaseName().Append(relative_path))); 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Creates a Service instance. Used to be able to destroy the service in 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// TearDown(). 600529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochKeyedService* CreateService(content::BrowserContext* context) { 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return new Service(Profile::FromBrowserContext(context), 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch extensions::ExtensionRegistry::Get(context)); 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass FileSystemProviderMountPathUtilTest : public testing::Test { 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected: 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FileSystemProviderMountPathUtilTest() {} 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~FileSystemProviderMountPathUtilTest() {} 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void SetUp() OVERRIDE { 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch profile_manager_.reset( 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new TestingProfileManager(TestingBrowserProcess::GetGlobal())); 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(profile_manager_->SetUp()); 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch profile_ = profile_manager_->CreateTestingProfile("testing-profile"); 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch user_manager_ = new FakeUserManager(); 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch user_manager_->AddUser(profile_->GetProfileName()); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ServiceFactory::GetInstance()->SetTestingFactory(profile_, &CreateService); 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch file_system_provider_service_ = Service::Get(profile_); 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_system_provider_service_->SetFileSystemFactoryForTesting( 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Bind(&FakeProvidedFileSystem::Create)); 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void TearDown() OVERRIDE { 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Setting the testing factory to NULL will destroy the created service 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // associated with the testing profile. 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ServiceFactory::GetInstance()->SetTestingFactory(profile_, NULL); 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::TestBrowserThreadBundle thread_bundle_; 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<TestingProfileManager> profile_manager_; 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestingProfile* profile_; // Owned by TestingProfileManager. 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FakeUserManager* user_manager_; 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Service* file_system_provider_service_; // Owned by its factory. 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1000529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderMountPathUtilTest, GetMountPath) { 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath result = 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetMountPath(profile_, kExtensionId, kFileSystemId); 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string expected = 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "/provided/mbflcebpggnecokmikipoihdbecnjfoj:" 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "File%2FSystem%2FId:testing-profile-hash"; 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(expected, result.AsUTF8Unsafe()); 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 109116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderMountPathUtilTest, IsFileSystemProviderLocalPath) { 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath mount_path = 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetMountPath(profile_, kExtensionId, kFileSystemId); 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath file_path = 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("/hello/world.txt"); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath local_file_path = 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mount_path.Append(base::FilePath(file_path.value().substr(1))); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(IsFileSystemProviderLocalPath(mount_path)); 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(IsFileSystemProviderLocalPath(local_file_path)); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(IsFileSystemProviderLocalPath( 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("provided/hello-world/test.txt"))); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(IsFileSystemProviderLocalPath( 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("/provided"))); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE( 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IsFileSystemProviderLocalPath(base::FilePath::FromUTF8Unsafe("/"))); 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(IsFileSystemProviderLocalPath(base::FilePath())); 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderMountPathUtilTest, Parser) { 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool result = file_system_provider_service_->MountFileSystem( 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kExtensionId, kFileSystemId, kDisplayName, false /* writable */); 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(result); 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ProvidedFileSystemInfo file_system_info = 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) file_system_provider_service_->GetProvidedFileSystem(kExtensionId, 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFileSystemId) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->GetFileSystemInfo(); 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::FilePath kFilePath = 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("/hello/world.txt"); 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL url = 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateFileSystemURL(profile_, file_system_info, kFilePath); 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(url.is_valid()); 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FileSystemURLParser parser(url); 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(parser.Parse()); 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ProvidedFileSystemInterface* file_system = parser.file_system(); 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(file_system); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kFileSystemId, file_system->GetFileSystemInfo().file_system_id()); 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(kFilePath.AsUTF8Unsafe(), parser.file_path().AsUTF8Unsafe()); 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1530529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderMountPathUtilTest, Parser_RootPath) { 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const bool result = file_system_provider_service_->MountFileSystem( 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kExtensionId, kFileSystemId, kDisplayName, false /* writable */); 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(result); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ProvidedFileSystemInfo file_system_info = 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) file_system_provider_service_->GetProvidedFileSystem(kExtensionId, 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFileSystemId) 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ->GetFileSystemInfo(); 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::FilePath kFilePath = base::FilePath::FromUTF8Unsafe("/"); 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL url = 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateFileSystemURL(profile_, file_system_info, kFilePath); 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(url.is_valid()); 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FileSystemURLParser parser(url); 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(parser.Parse()); 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ProvidedFileSystemInterface* file_system = parser.file_system(); 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(file_system); 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kFileSystemId, file_system->GetFileSystemInfo().file_system_id()); 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(kFilePath.AsUTF8Unsafe(), parser.file_path().AsUTF8Unsafe()); 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1760529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderMountPathUtilTest, Parser_WrongUrl) { 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ProvidedFileSystemInfo file_system_info( 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionId, 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kFileSystemId, 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kDisplayName, 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false /* writable */, 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetMountPath(profile_, kExtensionId, kFileSystemId)); 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = base::FilePath::FromUTF8Unsafe("/hello"); 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL url = 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateFileSystemURL(profile_, file_system_info, kFilePath); 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // It is impossible to create a cracked URL for a mount point which doesn't 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // exist, therefore is will always be invalid, and empty. 1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(url.is_valid()); 1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FileSystemURLParser parser(url); 1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(parser.Parse()); 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 195116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderMountPathUtilTest, Parser_IsolatedURL) { 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool result = file_system_provider_service_->MountFileSystem( 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kExtensionId, kFileSystemId, kDisplayName, false /* writable */); 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(result); 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProvidedFileSystemInfo file_system_info = 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch file_system_provider_service_->GetProvidedFileSystem(kExtensionId, 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFileSystemId) 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetFileSystemInfo(); 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("/hello/world.txt"); 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL url = 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateFileSystemURL(profile_, file_system_info, kFilePath); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(url.is_valid()); 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create an isolated URL for the original one. 21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::IsolatedContext* const isolated_context = 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::IsolatedContext::GetInstance(); 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string isolated_file_system_id = 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch isolated_context->RegisterFileSystemForPath( 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::kFileSystemTypeProvided, 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url.filesystem_id(), 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url.path(), 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NULL); 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath isolated_virtual_path = 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch isolated_context->CreateVirtualRootPath(isolated_file_system_id) 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .Append(kFilePath.BaseName().value()); 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL isolated_url = 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch isolated_context->CreateCrackedFileSystemURL( 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url.origin(), 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::kFileSystemTypeIsolated, 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch isolated_virtual_path); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(isolated_url.is_valid()); 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FileSystemURLParser parser(isolated_url); 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(parser.Parse()); 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProvidedFileSystemInterface* file_system = parser.file_system(); 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(file_system); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(kFileSystemId, file_system->GetFileSystemInfo().file_system_id()); 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(kFilePath.AsUTF8Unsafe(), parser.file_path().AsUTF8Unsafe()); 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 241116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderMountPathUtilTest, LocalPathParser) { 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool result = file_system_provider_service_->MountFileSystem( 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kExtensionId, kFileSystemId, kDisplayName, false /* writable */); 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(result); 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProvidedFileSystemInfo file_system_info = 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch file_system_provider_service_->GetProvidedFileSystem(kExtensionId, 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFileSystemId) 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetFileSystemInfo(); 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("/hello/world.txt"); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kLocalFilePath = file_system_info.mount_path().Append( 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath(kFilePath.value().substr(1))); 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << kLocalFilePath.value(); 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LocalPathParser parser(profile_, kLocalFilePath); 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(parser.Parse()); 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProvidedFileSystemInterface* file_system = parser.file_system(); 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(file_system); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(kFileSystemId, file_system->GetFileSystemInfo().file_system_id()); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(kFilePath.AsUTF8Unsafe(), parser.file_path().AsUTF8Unsafe()); 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 265116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderMountPathUtilTest, LocalPathParser_RootPath) { 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool result = file_system_provider_service_->MountFileSystem( 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kExtensionId, kFileSystemId, kDisplayName, false /* writable */); 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(result); 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ProvidedFileSystemInfo file_system_info = 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch file_system_provider_service_->GetProvidedFileSystem(kExtensionId, 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kFileSystemId) 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->GetFileSystemInfo(); 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = base::FilePath::FromUTF8Unsafe("/"); 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kLocalFilePath = file_system_info.mount_path(); 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LocalPathParser parser(profile_, kLocalFilePath); 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(parser.Parse()); 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ProvidedFileSystemInterface* file_system = parser.file_system(); 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_TRUE(file_system); 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(kFileSystemId, file_system->GetFileSystemInfo().file_system_id()); 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(kFilePath.AsUTF8Unsafe(), parser.file_path().AsUTF8Unsafe()); 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 286116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderMountPathUtilTest, LocalPathParser_WrongPath) { 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = base::FilePath::FromUTF8Unsafe("/hello"); 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LocalPathParser parser(profile_, kFilePath); 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(parser.Parse()); 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("/provided"); 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LocalPathParser parser(profile_, kFilePath); 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(parser.Parse()); 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath kFilePath = 302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath::FromUTF8Unsafe("provided/hello/world"); 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LocalPathParser parser(profile_, kFilePath); 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(parser.Parse()); 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace util 3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace file_system_provider 3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace chromeos 311