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