15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/stringprintf.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fake_free_disk_space_getter.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace internal { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The changestamp of the resource metadata used in 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ResourceMetadataTest. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int64 kTestChangestamp = 100; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the sorted base names from |entries|. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<std::string> GetSortedBaseNames( 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ResourceEntryVector& entries) { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> base_names; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_names.push_back(entries[i].base_name()); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::sort(base_names.begin(), base_names.end()); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base_names; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Creates a ResourceEntry for a directory with explicitly set resource_id. 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ResourceEntry CreateDirectoryEntryWithResourceId( 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& title, 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& resource_id, 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& parent_local_id) { 45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ResourceEntry entry; 46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) entry.set_title(title); 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) entry.set_resource_id(resource_id); 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) entry.set_parent_local_id(parent_local_id); 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.mutable_file_info()->set_is_directory(true); 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.mutable_directory_specific_info()->set_changestamp(kTestChangestamp); 51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return entry; 52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 53a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Creates a ResourceEntry for a directory. 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ResourceEntry CreateDirectoryEntry(const std::string& title, 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& parent_local_id) { 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CreateDirectoryEntryWithResourceId( 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) title, "id:" + title, parent_local_id); 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Creates a ResourceEntry for a file with explicitly set resource_id. 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ResourceEntry CreateFileEntryWithResourceId( 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& title, 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& resource_id, 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& parent_local_id) { 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.set_title(title); 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) entry.set_resource_id(resource_id); 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) entry.set_parent_local_id(parent_local_id); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.mutable_file_info()->set_is_directory(false); 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.mutable_file_info()->set_size(1024); 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.mutable_file_specific_info()->set_md5("md5:" + title); 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return entry; 74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Creates a ResourceEntry for a file. 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ResourceEntry CreateFileEntry(const std::string& title, 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& parent_local_id) { 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CreateFileEntryWithResourceId(title, "id:" + title, parent_local_id); 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Creates the following files/directories 83a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir1/ 84a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir2/ 85a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir1/dir3/ 86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir1/file4 87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir1/file5 88a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir2/file6 89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir2/file7 90a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir2/file8 91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir1/dir3/file9 92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// drive/root/dir1/dir3/file10 93a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void SetUpEntries(ResourceMetadata* resource_metadata) { 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::string local_id; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->GetIdByPath( 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) util::GetDriveMyDriveRootPath(), &local_id)); 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string root_local_id = local_id; 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir1", root_local_id), &local_id)); 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string local_id_dir1 = local_id; 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir2", root_local_id), &local_id)); 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string local_id_dir2 = local_id; 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir3", local_id_dir1), &local_id)); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string local_id_dir3 = local_id; 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file4", local_id_dir1), &local_id)); 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file5", local_id_dir1), &local_id)); 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file6", local_id_dir2), &local_id)); 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file7", local_id_dir2), &local_id)); 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file8", local_id_dir2), &local_id)); 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file9", local_id_dir3), &local_id)); 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata->AddEntry( 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateFileEntry("file10", local_id_dir3), &local_id)); 127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) resource_metadata->SetLargestChangestamp(kTestChangestamp)); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Tests for methods running on the blocking task runner. 135a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class ResourceMetadataTest : public testing::Test { 136a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected: 137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void SetUp() OVERRIDE { 138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_storage_.reset(new ResourceMetadataStorage( 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch temp_dir_.path(), base::MessageLoopProxy::current().get())); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(metadata_storage_->Initialize()); 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fake_free_disk_space_getter_.reset(new FakeFreeDiskSpaceGetter); 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cache_.reset(new FileCache(metadata_storage_.get(), 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) temp_dir_.path(), 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current().get(), 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fake_free_disk_space_getter_.get())); 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(cache_->Initialize()); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resource_metadata_.reset(new ResourceMetadata( 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata_storage_.get(), cache_.get(), 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current())); 154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->Initialize()); 156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) SetUpEntries(resource_metadata_.get()); 158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::ScopedTempDir temp_dir_; 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<ResourceMetadataStorage, test_util::DestroyHelperForTests> 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_storage_; 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_; 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_; 166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<ResourceMetadata, test_util::DestroyHelperForTests> 167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) resource_metadata_; 168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ResourceMetadataTest, LargestChangestamp) { 171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int64 kChangestamp = 123456; 172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resource_metadata_->SetLargestChangestamp(kChangestamp)); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 changestamp = 0; 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) resource_metadata_->GetLargestChangestamp(&changestamp)); 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(kChangestamp, changestamp); 178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ResourceMetadataTest, GetResourceEntryByPath) { 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Confirm that an existing file is found. 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntry entry; 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &entry)); 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ("file4", entry.base_name()); 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Confirm that a non existing file is not found. 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryByPath( 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/non_existing"), &entry)); 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Confirm that the root is found. 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive"), &entry)); 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Confirm that a non existing file is not found at the root level. 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryByPath( 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("non_existing"), &entry)); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Confirm that an entry is not found with a wrong root. 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryByPath( 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("non_existing/root"), &entry)); 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResourceMetadataTest, ReadDirectoryByPath) { 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Confirm that an existing directory is found. 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntryVector entries; 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->ReadDirectoryByPath( 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1"), &entries)); 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(3U, entries.size()); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The order is not guaranteed so we should sort the base names. 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> base_names = GetSortedBaseNames(entries); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("dir3", base_names[0]); 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("file4", base_names[1]); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("file5", base_names[2]); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Confirm that a non existing directory is not found. 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->ReadDirectoryByPath( 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/non_existing"), &entries)); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Confirm that reading a file results in FILE_ERROR_NOT_A_DIRECTORY. 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY, resource_metadata_->ReadDirectoryByPath( 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &entries)); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ResourceMetadataTest, RefreshEntry) { 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath drive_file_path; 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Get file9. 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string file_id; 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3/file9"), &file_id)); 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_metadata_->GetResourceEntryById(file_id, &entry)); 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("file9", entry.base_name()); 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(!entry.file_info().is_directory()); 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("md5:file9", entry.file_specific_info().md5()); 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Rename it. 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry file_entry(entry); 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_entry.set_title("file100"); 2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) resource_metadata_->RefreshEntry(file_entry)); 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath path; 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetFilePath(file_id, &path)); 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("drive/root/dir1/dir3/file100", path.AsUTF8Unsafe()); 248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.Clear(); 2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_metadata_->GetResourceEntryById(file_id, &entry)); 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("file100", entry.base_name()); 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(!entry.file_info().is_directory()); 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("md5:file9", entry.file_specific_info().md5()); 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Update the file md5. 256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string updated_md5("md5:updated"); 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_entry = entry; 258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_entry.mutable_file_specific_info()->set_md5(updated_md5); 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) resource_metadata_->RefreshEntry(file_entry)); 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetFilePath(file_id, &path)); 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("drive/root/dir1/dir3/file100", path.AsUTF8Unsafe()); 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.Clear(); 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_metadata_->GetResourceEntryById(file_id, &entry)); 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("file100", entry.base_name()); 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(!entry.file_info().is_directory()); 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(updated_md5, entry.file_specific_info().md5()); 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Make sure we get the same thing from GetResourceEntryByPath. 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.Clear(); 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3/file100"), &entry)); 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("file100", entry.base_name()); 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(!entry.file_info().is_directory()); 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(updated_md5, entry.file_specific_info().md5()); 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Get dir2. 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.Clear(); 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string dir_id; 2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir2"), &dir_id)); 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_metadata_->GetResourceEntryById(dir_id, &entry)); 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("dir2", entry.base_name()); 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(entry.file_info().is_directory()); 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Get dir3's ID. 2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string dir3_id; 2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3"), &dir3_id)); 2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Change the name to dir100 and change the parent to drive/dir1/dir3. 295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry dir_entry(entry); 296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dir_entry.set_title("dir100"); 2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dir_entry.set_parent_local_id(dir3_id); 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->RefreshEntry(dir_entry)); 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetFilePath(dir_id, &path)); 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("drive/root/dir1/dir3/dir100", path.AsUTF8Unsafe()); 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.Clear(); 3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) resource_metadata_->GetResourceEntryById(dir_id, &entry)); 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("dir100", entry.base_name()); 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry.file_info().is_directory()); 307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ("id:dir2", entry.resource_id()); 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Make sure the children have moved over. Test file6. 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.Clear(); 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3/dir100/file6"), 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &entry)); 314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("file6", entry.base_name()); 315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Make sure dir2 no longer exists. 317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryByPath( 318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir2"), &entry)); 319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Make sure that directory cannot move under a file. 3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) dir_entry.set_parent_local_id(file_id); 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY, 32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) resource_metadata_->RefreshEntry(dir_entry)); 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Cannot refresh root. 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dir_entry.Clear(); 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) dir_entry.set_local_id(util::kDriveGrandRootLocalId); 328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dir_entry.set_title("new-root-name"); 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dir_entry.set_parent_local_id(dir3_id); 33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_INVALID_OPERATION, 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) resource_metadata_->RefreshEntry(dir_entry)); 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ResourceMetadataTest, RefreshEntry_ResourceIDCheck) { 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Get an entry with a non-empty resource ID. 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry entry; 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1"), &entry)); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(entry.resource_id().empty()); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Add a new entry with an empty resource ID. 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry new_entry; 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_entry.set_parent_local_id(entry.local_id()); 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_entry.set_title("new entry"); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string local_id; 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry(new_entry, &local_id)); 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Try to refresh the new entry with a used resource ID. 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_entry.set_local_id(local_id); 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_entry.set_resource_id(entry.resource_id()); 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_INVALID_OPERATION, 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource_metadata_->RefreshEntry(new_entry)); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(ResourceMetadataTest, RefreshEntry_DoNotOverwriteCacheState) { 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResourceEntry entry; 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &entry)); 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try to set MD5 with RefreshEntry. 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entry.mutable_file_specific_info()->mutable_cache_state()->set_md5("md5"); 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->RefreshEntry(entry)); 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Cache state is unchanged. 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &entry)); 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().md5().empty()); 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Pin the file. 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(entry.local_id())); 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Try to clear the cache state with RefreshEntry. 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &entry)); 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entry.mutable_file_specific_info()->clear_cache_state(); 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->RefreshEntry(entry)); 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Cache state is not cleared. 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &entry)); 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().is_pinned()); 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ResourceMetadataTest, GetSubDirectoriesRecursively) { 3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::set<base::FilePath> sub_directories; 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // file9: not a directory, so no children. 3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string local_id; 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3/file9"), &local_id)); 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetSubDirectoriesRecursively( 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local_id, &sub_directories)); 3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(sub_directories.empty()); 394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir2: no child directories. 3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir2"), &local_id)); 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetSubDirectoriesRecursively( 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local_id, &sub_directories)); 4003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(sub_directories.empty()); 4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string dir2_id = local_id; 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir1: dir3 is the only child 4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1"), &local_id)); 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetSubDirectoriesRecursively( 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) local_id, &sub_directories)); 4083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1u, sub_directories.size()); 4093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1u, sub_directories.count( 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3"))); 4113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sub_directories.clear(); 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Add a few more directories to make sure deeper nesting works. 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir2/dir100 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir2/dir101 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir2/dir101/dir102 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir2/dir101/dir103 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir2/dir101/dir104 4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // dir2/dir101/dir104/dir105 4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // dir2/dir101/dir104/dir105/dir106 4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // dir2/dir101/dir104/dir105/dir106/dir107 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir100", dir2_id), &local_id)); 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir101", dir2_id), &local_id)); 4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string dir101_id = local_id; 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir102", dir101_id), &local_id)); 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir103", dir101_id), &local_id)); 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir104", dir101_id), &local_id)); 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir105", local_id), &local_id)); 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir106", local_id), &local_id)); 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("dir107", local_id), &local_id)); 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetSubDirectoriesRecursively( 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dir2_id, &sub_directories)); 4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(8u, sub_directories.size()); 4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1u, sub_directories.count(base::FilePath::FromUTF8Unsafe( 444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/dir2/dir101"))); 4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1u, sub_directories.count(base::FilePath::FromUTF8Unsafe( 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/dir2/dir101/dir104"))); 4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(1u, sub_directories.count(base::FilePath::FromUTF8Unsafe( 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "drive/root/dir2/dir101/dir104/dir105/dir106/dir107"))); 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 451424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(ResourceMetadataTest, AddEntry) { 452424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add a file to dir3. 453424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::string local_id; 4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3"), &local_id)); 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceEntry file_entry = CreateFileEntry("file100", local_id); 457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry(file_entry, &local_id)); 458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath path; 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetFilePath(local_id, &path)); 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("drive/root/dir1/dir3/file100", path.AsUTF8Unsafe()); 461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 462424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add a directory. 4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1"), &local_id)); 4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceEntry dir_entry = CreateDirectoryEntry("dir101", local_id); 466424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry(dir_entry, &local_id)); 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetFilePath(local_id, &path)); 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ("drive/root/dir1/dir101", path.AsUTF8Unsafe()); 469424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 470424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add to an invalid parent. 471424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResourceEntry file_entry3 = CreateFileEntry("file103", "id:invalid"); 472424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, 473424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) resource_metadata_->AddEntry(file_entry3, &local_id)); 474424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 475424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Add an existing file. 476424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_EXISTS, 477424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) resource_metadata_->AddEntry(file_entry, &local_id)); 478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 479424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ResourceMetadataTest, RemoveEntry) { 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Make sure file9 is found. 4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string file9_local_id; 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3/file9"), 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &file9_local_id)); 486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file9_local_id, &entry)); 489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("file9", entry.base_name()); 490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Remove file9. 4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->RemoveEntry(file9_local_id)); 493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // file9 should no longer exist. 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryById( 4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) file9_local_id, &entry)); 497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Look for dir3. 4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string dir3_local_id; 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/dir3"), &dir3_local_id)); 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dir3_local_id, &entry)); 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("dir3", entry.base_name()); 505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Remove dir3. 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->RemoveEntry(dir3_local_id)); 508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // dir3 should no longer exist. 510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryById( 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dir3_local_id, &entry)); 512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove unknown local_id using RemoveEntry. 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->RemoveEntry("foo")); 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Try removing root. This should fail. 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_ACCESS_DENIED, resource_metadata_->RemoveEntry( 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) util::kDriveGrandRootLocalId)); 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ResourceMetadataTest, GetResourceEntryById_RootDirectory) { 5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Look up the root directory by its ID. 5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceEntry entry; 5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) util::kDriveGrandRootLocalId, &entry)); 5268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ("drive", entry.base_name()); 5278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(ResourceMetadataTest, GetResourceEntryById) { 5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Get file4 by path. 5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string local_id; 5328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 5338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/dir1/file4"), &local_id)); 5348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Confirm that an existing file is found. 5368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceEntry entry; 5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 5388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) local_id, &entry)); 5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ("file4", entry.base_name()); 5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 5418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Confirm that a non existing file is not found. 5428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, resource_metadata_->GetResourceEntryById( 5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "non_existing", &entry)); 5448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 5458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 546a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(ResourceMetadataTest, Iterate) { 547a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<ResourceMetadata::Iterator> it = resource_metadata_->GetIterator(); 548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ASSERT_TRUE(it); 549a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) int file_count = 0, directory_count = 0; 551a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) for (; !it->IsAtEnd(); it->Advance()) { 5523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!it->GetValue().file_info().is_directory()) 553a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ++file_count; 554a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) else 555a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ++directory_count; 556a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 558a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(7, file_count); 559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(7, directory_count); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ResourceMetadataTest, DuplicatedNames) { 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string root_local_id; 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"), &root_local_id)); 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceEntry entry; 56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // When multiple entries with the same title are added in a single directory, 57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // their base_names are de-duped. 57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - drive/root/foo 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - drive/root/foo (1) 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string dir_id_0; 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CreateDirectoryEntryWithResourceId( 5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "foo", "foo0", root_local_id), &dir_id_0)); 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string dir_id_1; 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CreateDirectoryEntryWithResourceId( 5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "foo", "foo1", root_local_id), &dir_id_1)); 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dir_id_0, &entry)); 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("foo", entry.base_name()); 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dir_id_1, &entry)); 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("foo (1)", entry.base_name()); 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - drive/root/foo/bar.txt 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - drive/root/foo/bar (1).txt 59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - drive/root/foo/bar (2).txt 5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // ... 5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // - drive/root/foo/bar (99).txt 5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::vector<std::string> file_ids(100); 5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < file_ids.size(); ++i) { 5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CreateFileEntryWithResourceId( 5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "bar.txt", base::StringPrintf("bar%d", static_cast<int>(i)), 5995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dir_id_0), &file_ids[i])); 6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu file_ids[0], &entry)); 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("bar.txt", entry.base_name()); 6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 1; i < file_ids.size(); ++i) { 6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu file_ids[i], &entry)) << i; 6085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(base::StringPrintf("bar (%d).txt", static_cast<int>(i)), 6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu entry.base_name()); 6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Same name but different parent. No renaming. 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - drive/root/foo (1)/bar.txt 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string file_id_3; 61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CreateFileEntryWithResourceId( 6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu "bar.txt", "bar_different_parent", dir_id_1), &file_id_3)); 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) file_id_3, &entry)); 62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("bar.txt", entry.base_name()); 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the entries can be looked up by the de-duped paths. 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/foo/bar (2).txt"), &entry)); 62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("bar2", entry.resource_id()); 62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/foo (1)/bar.txt"), &entry)); 6295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ("bar_different_parent", entry.resource_id()); 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ResourceMetadataTest, EncodedNames) { 6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string root_local_id; 6344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetIdByPath( 6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"), &root_local_id)); 6364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ResourceEntry entry; 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string dir_id; 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateDirectoryEntry("\\(^o^)/", root_local_id), &dir_id)); 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dir_id, &entry)); 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ("\\(^o^)_", entry.base_name()); 64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string file_id; 64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( 64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CreateFileEntryWithResourceId("Slash /.txt", "myfile", dir_id), 64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &file_id)); 65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryById( 65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) file_id, &entry)); 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ("Slash _.txt", entry.base_name()); 65358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->GetResourceEntryByPath( 65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath::FromUTF8Unsafe( 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "drive/root/\\(^o^)_/Slash _.txt"), 65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &entry)); 65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ("myfile", entry.resource_id()); 65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 66058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ResourceMetadataTest, Reset) { 662d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The grand root has "root" which is not empty. 663d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<ResourceEntry> entries; 664d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 665d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resource_metadata_->ReadDirectoryByPath( 666d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"), &entries)); 667d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_FALSE(entries.empty()); 668d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 669d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Reset. 670d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->Reset()); 671d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // change stamp should be reset. 673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 changestamp = 0; 674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) resource_metadata_->GetLargestChangestamp(&changestamp)); 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, changestamp); 677d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 678d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // root should continue to exist. 679d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceEntry entry; 680d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resource_metadata_->GetResourceEntryByPath( 682d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive"), &entry)); 683d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ("drive", entry.base_name()); 684d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(entry.file_info().is_directory()); 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(util::kDriveGrandRootLocalId, entry.local_id()); 686d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // There are "other", "trash" and "root" under "drive". 688d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 689d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resource_metadata_->ReadDirectoryByPath( 690d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive"), &entries)); 6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(3U, entries.size()); 692d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 693d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The "other" directory should be empty. 694d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 695d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resource_metadata_->ReadDirectoryByPath( 696d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/other"), &entries)); 697d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(entries.empty()); 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The "trash" directory should be empty. 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resource_metadata_->ReadDirectoryByPath( 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/trash"), &entries)); 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(entries.empty()); 704d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 705d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace internal 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace drive 708