11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/profiles/profile_helper.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/test/test_file_system_options.h"
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_backend.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/isolated_context.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace drive {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace util {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Sets up ProfileManager for testing and marks the current thread as UI by
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TestBrowserThreadBundle. We need the thread since Profile objects must be
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// touched from UI and hence has CHECK/DCHECKs for it.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ProfileRelatedFileSystemUtilTest : public testing::Test {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProfileRelatedFileSystemUtilTest()
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(testing_profile_manager_.SetUp());
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestingProfileManager& testing_profile_manager() {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return testing_profile_manager_;
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestingProfileManager testing_profile_manager_;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ProfileRelatedFileSystemUtilTest, GetDriveMountPointPath) {
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = testing_profile_manager().CreateTestingProfile("user1");
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string user_id_hash =
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting("user1");
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::FilePath::FromUTF8Unsafe("/special/drive-" + user_id_hash),
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            GetDriveMountPointPath(profile));
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ProfileRelatedFileSystemUtilTest, ExtractProfileFromPath) {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile1 = testing_profile_manager().CreateTestingProfile("user1");
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile2 = testing_profile_manager().CreateTestingProfile("user2");
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string user1_id_hash =
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting("user1");
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string user2_id_hash =
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting("user2");
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(profile1,
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ExtractProfileFromPath(base::FilePath::FromUTF8Unsafe(
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "/special/drive-" + user1_id_hash)));
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(profile2,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ExtractProfileFromPath(base::FilePath::FromUTF8Unsafe(
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "/special/drive-" + user2_id_hash + "/root/xxx")));
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(NULL, ExtractProfileFromPath(
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/special/non-drive-path")));
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FileSystemUtilTest, IsUnderDriveMountPoint) {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(IsUnderDriveMountPoint(
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/wherever/foo.txt")));
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(IsUnderDriveMountPoint(
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/special/foo.txt")));
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(IsUnderDriveMountPoint(
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("special/drive/foo.txt")));
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsUnderDriveMountPoint(
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/special/drive")));
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsUnderDriveMountPoint(
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/special/drive/foo.txt")));
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsUnderDriveMountPoint(
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/special/drive/subdir/foo.txt")));
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(IsUnderDriveMountPoint(
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("/special/drive-xxx/foo.txt")));
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FileSystemUtilTest, ExtractDrivePath) {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::FilePath(),
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ExtractDrivePath(
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                base::FilePath::FromUTF8Unsafe("/wherever/foo.txt")));
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::FilePath(),
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ExtractDrivePath(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                base::FilePath::FromUTF8Unsafe("/special/foo.txt")));
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive"),
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ExtractDrivePath(
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                base::FilePath::FromUTF8Unsafe("/special/drive")));
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/foo.txt"),
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ExtractDrivePath(
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                base::FilePath::FromUTF8Unsafe("/special/drive/foo.txt")));
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/subdir/foo.txt"),
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ExtractDrivePath(base::FilePath::FromUTF8Unsafe(
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                "/special/drive/subdir/foo.txt")));
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/foo.txt"),
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            ExtractDrivePath(
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::FilePath::FromUTF8Unsafe("/special/drive-xxx/foo.txt")));
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FileSystemUtilTest, ExtractDrivePathFromFileSystemUrl) {
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestingProfile profile;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Set up file system context for testing.
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<storage::ExternalMountPoints> mount_points =
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::ExternalMountPoints::CreateRefCounted();
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<storage::FileSystemContext> context(
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new storage::FileSystemContext(
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          base::MessageLoopProxy::current().get(),
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          base::MessageLoopProxy::current().get(),
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          mount_points.get(),
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          NULL,  // special_storage_policy
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          NULL,  // quota_manager_proxy,
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ScopedVector<storage::FileSystemBackend>(),
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          std::vector<storage::URLRequestAutoMountHandler>(),
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          temp_dir_.path(),  // partition_path
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          content::CreateAllowFileAccessOptions()));
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Type:"external" + virtual_path:"drive/foo/bar" resolves to "drive/foo/bar".
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string& drive_mount_name =
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetDriveMountPointPath(&profile).BaseName().AsUTF8Unsafe();
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mount_points->RegisterFileSystem(drive_mount_name,
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::kFileSystemTypeDrive,
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::FileSystemMountOption(),
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   GetDriveMountPointPath(&profile));
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/foo/bar"),
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExtractDrivePathFromFileSystemUrl(context->CrackURL(GURL(
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "filesystem:chrome-extension://dummy-id/external/" +
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          drive_mount_name + "/foo/bar"))));
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Virtual mount name should not affect the extracted path.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mount_points->RevokeFileSystem(drive_mount_name);
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mount_points->RegisterFileSystem("drive2",
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::kFileSystemTypeDrive,
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::FileSystemMountOption(),
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   GetDriveMountPointPath(&profile));
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/foo/bar"),
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExtractDrivePathFromFileSystemUrl(context->CrackURL(GURL(
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "filesystem:chrome-extension://dummy-id/external/drive2/foo/bar"))));
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Type:"external" + virtual_path:"Downloads/foo" is not a Drive path.
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  mount_points->RegisterFileSystem("Downloads",
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::kFileSystemTypeNativeLocal,
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   storage::FileSystemMountOption(),
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   temp_dir_.path());
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(),
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExtractDrivePathFromFileSystemUrl(context->CrackURL(GURL(
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "filesystem:chrome-extension://dummy-id/external/Downloads/foo"))));
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Type:"isolated" + virtual_path:"isolated_id/name" mapped on a Drive path.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string isolated_name;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string isolated_id =
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::IsolatedContext::GetInstance()->RegisterFileSystemForPath(
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          storage::kFileSystemTypeNativeForPlatformApp,
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)          std::string(),
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          GetDriveMountPointPath(&profile).AppendASCII("bar/buz"),
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &isolated_name);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/bar/buz"),
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ExtractDrivePathFromFileSystemUrl(context->CrackURL(GURL(
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "filesystem:chrome-extension://dummy-id/isolated/" +
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          isolated_id + "/" + isolated_name))));
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FileSystemUtilTest, EscapeUnescapeCacheFileName) {
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kUnescapedFileName(
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "tmp:`~!@#$%^&*()-_=+[{|]}\\\\;\',<.>/?");
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string kEscapedFileName(
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "tmp:`~!@#$%25^&*()-_=+[{|]}\\\\;\',<%2E>%2F?");
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kEscapedFileName, EscapeCacheFileName(kUnescapedFileName));
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(kUnescapedFileName, UnescapeCacheFileName(kEscapedFileName));
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(FileSystemUtilTest, NormalizeFileName) {
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("", NormalizeFileName(""));
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("foo", NormalizeFileName("foo"));
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Slash
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("foo_zzz", NormalizeFileName("foo/zzz"));
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("___", NormalizeFileName("///"));
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Japanese hiragana "hi" + semi-voiced-mark is normalized to "pi".
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("\xE3\x81\xB4", NormalizeFileName("\xE3\x81\xB2\xE3\x82\x9A"));
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Dot
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("_", NormalizeFileName("."));
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("_", NormalizeFileName(".."));
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("_", NormalizeFileName("..."));
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(".bashrc", NormalizeFileName(".bashrc"));
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("._", NormalizeFileName("./"));
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(FileSystemUtilTest, GetCacheRootPath) {
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestingProfile profile;
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath profile_path = profile.GetPath();
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(profile_path.AppendASCII("GCache/v1"),
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            util::GetCacheRootPath(&profile));
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(FileSystemUtilTest, GDocFile) {
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::ScopedTempDir temp_dir;
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GURL url("https://docs.google.com/document/d/"
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           "1YsCnrMxxgp7LDdtlFDt-WdtEIth89vA9inrILtvK-Ug/edit");
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string resource_id("1YsCnrMxxgp7LDdtlFDt-WdtEIth89vA9inrILtvK-Ug");
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Read and write gdoc.
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::FilePath file = temp_dir.path().AppendASCII("test.gdoc");
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(CreateGDocFile(file, url, resource_id));
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(url, ReadUrlFromGDocFile(file));
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(resource_id, ReadResourceIdFromGDocFile(file));
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Read and write gsheet.
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  file = temp_dir.path().AppendASCII("test.gsheet");
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(CreateGDocFile(file, url, resource_id));
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(url, ReadUrlFromGDocFile(file));
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(resource_id, ReadResourceIdFromGDocFile(file));
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Read and write gslides.
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  file = temp_dir.path().AppendASCII("test.gslides");
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(CreateGDocFile(file, url, resource_id));
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(url, ReadUrlFromGDocFile(file));
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(resource_id, ReadResourceIdFromGDocFile(file));
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Read and write gdraw.
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  file = temp_dir.path().AppendASCII("test.gdraw");
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(CreateGDocFile(file, url, resource_id));
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(url, ReadUrlFromGDocFile(file));
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(resource_id, ReadResourceIdFromGDocFile(file));
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Read and write gtable.
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  file = temp_dir.path().AppendASCII("test.gtable");
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(CreateGDocFile(file, url, resource_id));
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(url, ReadUrlFromGDocFile(file));
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(resource_id, ReadResourceIdFromGDocFile(file));
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Non GDoc file.
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  file = temp_dir.path().AppendASCII("test.txt");
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string data = "Hello world!";
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(google_apis::test_util::WriteStringToFile(file, data));
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ReadUrlFromGDocFile(file).is_empty());
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ReadResourceIdFromGDocFile(file).empty());
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace util
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace drive
273