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