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