190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/change_list_processor.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/values.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/drive/fake_free_disk_space_getter.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_wapi_parser.h"
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive {
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace internal {
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace {
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int64 kBaseResourceListChangestamp = 123;
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kRootId[] = "fake_root";
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum FileOrDirectory {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FILE,
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DIRECTORY,
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct EntryExpectation {
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string path;
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string id;
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string parent_id;
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FileOrDirectory type;
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Returns a basic change list which contains some files and directories.
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuScopedVector<ChangeList> CreateBaseChangeList() {
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Add directories to the change list.
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry directory;
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.mutable_file_info()->set_is_directory(true);
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("Directory 1");
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_resource_id("folder:1_folder_resource_id");
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(directory);
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("Sub Directory Folder");
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_resource_id("folder:sub_dir_folder_resource_id");
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(directory);
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:1_folder_resource_id");
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("Sub Sub Directory Folder");
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_resource_id("folder:sub_sub_directory_folder_id");
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(directory);
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:sub_dir_folder_resource_id");
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("Directory 2 excludeDir-test");
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_resource_id("folder:sub_dir_folder_2_self_link");
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(directory);
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Add files to the change list.
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry file;
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_title("File 1.txt");
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_resource_id("file:2_file_resource_id");
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(file);
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_title("SubDirectory File 1.txt");
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_resource_id("file:subdirectory_file_1_id");
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(file);
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:1_folder_resource_id");
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_title("Orphan File 1.txt");
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_resource_id("file:1_orphanfile_resource_id");
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(file);
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back("");
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp);
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return change_lists.Pass();
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ChangeListProcessorTest : public testing::Test {
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    metadata_storage_.reset(new ResourceMetadataStorage(
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        temp_dir_.path(), base::MessageLoopProxy::current().get()));
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(metadata_storage_->Initialize());
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    fake_free_disk_space_getter_.reset(new FakeFreeDiskSpaceGetter);
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cache_.reset(new FileCache(metadata_storage_.get(),
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               temp_dir_.path(),
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               base::MessageLoopProxy::current().get(),
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               fake_free_disk_space_getter_.get()));
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(cache_->Initialize());
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    metadata_.reset(new internal::ResourceMetadata(
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        metadata_storage_.get(), cache_.get(),
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::MessageLoopProxy::current()));
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize());
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Applies the |changes| to |metadata_| as a full resource list of changestamp
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // |kBaseResourceListChangestamp|.
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FileError ApplyFullResourceList(ScopedVector<ChangeList> changes) {
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<google_apis::AboutResource> about_resource(
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new google_apis::AboutResource);
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    about_resource->set_largest_change_id(kBaseResourceListChangestamp);
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    about_resource->set_root_folder_id(kRootId);
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ChangeListProcessor processor(metadata_.get());
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return processor.Apply(about_resource.Pass(),
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           changes.Pass(),
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           false /* is_delta_update */);
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Applies the |changes| to |metadata_| as a delta update. Delta changelists
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // should contain their changestamp in themselves.
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FileError ApplyChangeList(ScopedVector<ChangeList> changes,
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                            std::set<base::FilePath>* changed_dirs) {
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<google_apis::AboutResource> about_resource(
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        new google_apis::AboutResource);
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    about_resource->set_largest_change_id(kBaseResourceListChangestamp);
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    about_resource->set_root_folder_id(kRootId);
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ChangeListProcessor processor(metadata_.get());
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    FileError error = processor.Apply(about_resource.Pass(),
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                      changes.Pass(),
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                      true /* is_delta_update */);
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    *changed_dirs = processor.changed_dirs();
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return error;
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Gets the resource entry for the path from |metadata_| synchronously.
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Returns null if the entry does not exist.
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<ResourceEntry> GetResourceEntry(const std::string& path) {
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<ResourceEntry> entry(new ResourceEntry);
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    FileError error = metadata_->GetResourceEntryByPath(
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::FilePath::FromUTF8Unsafe(path), entry.get());
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (error != FILE_ERROR_OK)
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      entry.reset();
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return entry.Pass();
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ResourceMetadataStorage,
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             test_util::DestroyHelperForTests> metadata_storage_;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_;
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_;
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ResourceMetadata, test_util::DestroyHelperForTests> metadata_;
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, ApplyFullResourceList) {
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const EntryExpectation kExpected[] = {
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Root files
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      {"drive/root", kRootId, "", DIRECTORY},
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/File 1.txt",
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "file:2_file_resource_id", kRootId, FILE},
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Subdirectory files
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1",
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "folder:1_folder_resource_id", kRootId, DIRECTORY},
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1/SubDirectory File 1.txt",
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "file:subdirectory_file_1_id", "folder:1_folder_resource_id", FILE},
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 2 excludeDir-test",
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "folder:sub_dir_folder_2_self_link", kRootId, DIRECTORY},
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Deeper
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1/Sub Directory Folder",
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "folder:sub_dir_folder_resource_id",
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "folder:1_folder_resource_id", DIRECTORY},
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1/Sub Directory Folder/Sub Sub Directory Folder",
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "folder:sub_sub_directory_folder_id",
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "folder:sub_dir_folder_resource_id", DIRECTORY},
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Orphan
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      {"drive/other/Orphan File 1.txt", "file:1_orphanfile_resource_id",
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           "", FILE},
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kExpected); ++i) {
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<ResourceEntry> entry = GetResourceEntry(kExpected[i].path);
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(entry) << "for path: " << kExpected[i].path;
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kExpected[i].id, entry->resource_id());
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ResourceEntry parent_entry;
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryById(
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        entry->parent_local_id(), &parent_entry));
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(kExpected[i].parent_id, parent_entry.resource_id());
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kExpected[i].type,
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              entry->file_info().is_directory() ? DIRECTORY : FILE);
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kBaseResourceListChangestamp, changestamp);
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileAddedInNewDirectory) {
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry new_folder;
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  new_folder.set_resource_id("folder:new_folder_resource_id");
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  new_folder.set_title("New Directory");
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  new_folder.mutable_file_info()->set_is_directory(true);
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(new_folder);
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry new_file;
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  new_file.set_resource_id("document:file_added_in_new_dir_id");
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  new_file.set_title("File in new dir.txt");
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(new_file);
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new_folder.resource_id());
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16730);
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16730, changestamp);
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry("drive/root/New Directory"));
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry(
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "drive/root/New Directory/File in new dir.txt"));
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2U, changed_dirs.size());
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root")));
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/New Directory")));
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaDirMovedFromRootToDirectory) {
2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_resource_id("folder:1_folder_resource_id");
2615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("Directory 1");
2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.mutable_file_info()->set_is_directory(true);
2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:sub_dir_folder_2_self_link");
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16809);
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16809, changestamp);
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry("drive/root/Directory 1"));
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry(
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 2 excludeDir-test/Directory 1"));
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(4U, changed_dirs.size());
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root")));
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1")));
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe(
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "drive/root/Directory 2 excludeDir-test")));
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe(
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "drive/root/Directory 2 excludeDir-test/Directory 1")));
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileMovedFromDirectoryToRoot) {
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_resource_id("file:subdirectory_file_1_id");
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("SubDirectory File 1.txt");
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16815);
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16815, changestamp);
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry(
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 1/SubDirectory File 1.txt"));
316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry("drive/root/SubDirectory File 1.txt"));
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(2U, changed_dirs.size());
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root")));
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1")));
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileRenamedInDirectory) {
3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_resource_id("file:subdirectory_file_1_id");
3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("New SubDirectory File 1.txt");
3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:1_folder_resource_id");
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16767);
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16767, changestamp);
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry(
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 1/SubDirectory File 1.txt"));
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry(
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 1/New SubDirectory File 1.txt"));
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1U, changed_dirs.size());
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1")));
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddAndDeleteFileInRoot) {
3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to add a file.
3585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
3595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
3625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_resource_id("document:added_in_root_id");
3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("Added file.txt");
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16683);
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
37168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16683, changestamp);
3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GetResourceEntry("drive/root/Added file.txt"));
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, changed_dirs.size());
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root")));
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to delete the file.
3825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
3835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_deleted(true);
3855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16687);
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16687, changestamp);
3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(GetResourceEntry("drive/root/Added file.txt"));
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, changed_dirs.size());
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root")));
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddAndDeleteFileFromExistingDirectory) {
4025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to add a file.
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
4075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_resource_id("document:added_in_root_id");
4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("Added file.txt");
4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:1_folder_resource_id");
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16730);
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
41768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16730, changestamp);
4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GetResourceEntry("drive/root/Directory 1/Added file.txt"));
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1U, changed_dirs.size());
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1")));
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to delete the file.
4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
4305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_deleted(true);
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:1_folder_resource_id");
4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16770);
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16770, changestamp);
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(GetResourceEntry("drive/root/Directory 1/Added file.txt"));
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(1U, changed_dirs.size());
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.count(
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1")));
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddFileToNewButDeletedDirectory) {
4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create a change which contains the following updates:
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 1) A new PDF file is added to a new directory
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 2) but the new directory is marked "deleted" (i.e. moved to Trash)
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Hence, the PDF file should be just ignored.
4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
4555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry file;
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_resource_id("pdf:file_added_in_deleted_id");
4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_title("new_pdf_file.pdf");
4605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_deleted(true);
4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(file);
4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "folder:new_folder_resource_id");
4645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry directory;
4665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_resource_id("folder:new_folder_resource_id");
4675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("New Directory");
4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.mutable_file_info()->set_is_directory(true);
4695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_deleted(true);
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(directory);
4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16730);
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16730, changestamp);
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry("drive/root/New Directory/new_pdf_file.pdf"));
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(changed_dirs.empty());
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ChangeListProcessorTest, RefreshDirectory) {
4893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Prepare metadata.
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
492effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create change list.
493effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<ChangeList> change_list(new ChangeList);
4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Add a new file to the change list.
4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry new_file;
4973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_title("new_file");
4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_resource_id("new_file_id");
499effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_entries()->push_back(new_file);
500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_parent_resource_ids()->push_back(kRootId);
5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Add "Directory 1" to the map with a new name.
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry dir1;
5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII("Directory 1"), &dir1));
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  dir1.set_title(dir1.title() + " (renamed)");
507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_entries()->push_back(dir1);
508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_parent_resource_ids()->push_back(kRootId);
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Update the directory with the map.
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry root;
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetDriveMyDriveRootPath(), &root));
5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int64 kNewChangestamp = 12345;
515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceEntryVector refreshed_entries;
5163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, ChangeListProcessor::RefreshDirectory(
5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      metadata_.get(),
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DirectoryFetchInfo(root.local_id(), kRootId, kNewChangestamp),
519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      change_list.Pass(),
520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &refreshed_entries));
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // "new_file" should be added.
523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceEntry entry;
5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII(new_file.title()), &entry));
5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // "Directory 1" should be renamed.
5283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII(dir1.title()), &entry));
5303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ChangeListProcessorTest, RefreshDirectory_WrongParentId) {
5333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Prepare metadata.
5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
5353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
536effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create change list and add a new file to it.
537effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<ChangeList> change_list(new ChangeList);
5383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry new_file;
5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_title("new_file");
5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_resource_id("new_file_id");
5413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This entry should not be added because the parent ID does not match.
542effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_parent_resource_ids()->push_back(
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "some-random-resource-id");
544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_entries()->push_back(new_file);
5453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Update the directory.
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry root;
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetDriveMyDriveRootPath(), &root));
5513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int64 kNewChangestamp = 12345;
552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceEntryVector refreshed_entries;
5533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, ChangeListProcessor::RefreshDirectory(
5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      metadata_.get(),
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DirectoryFetchInfo(root.local_id(), kRootId, kNewChangestamp),
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      change_list.Pass(),
557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &refreshed_entries));
5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // "new_file" should not be added.
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry entry;
5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, metadata_->GetResourceEntryByPath(
5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII(new_file.title()), &entry));
5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ChangeListProcessorTest, SharedFilesWithNoParentInFeed) {
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Prepare metadata.
5675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create change lists.
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<ChangeList> change_lists;
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists.push_back(new ChangeList);
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add a new file with non-existing parent resource id to the change lists.
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry new_file;
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_file.set_title("new_file");
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_file.set_resource_id("new_file_id");
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists[0]->mutable_entries()->push_back(new_file);
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists[0]->mutable_parent_resource_ids()->push_back("nonexisting");
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 1);
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::set<base::FilePath> changed_dirs;
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // "new_file" should be added under drive/other.
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry entry;
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetDriveGrandRootPath().AppendASCII("other/new_file"), &entry));
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5900529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(ChangeListProcessorTest, ModificationDate) {
5910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Prepare metadata.
5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
5930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Create change lists with a new file.
5950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<ChangeList> change_lists;
5960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists.push_back(new ChangeList);
5970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const base::Time now = base::Time::Now();
5990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry new_file_remote;
6000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_remote.set_title("new_file_remote");
6010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_remote.set_resource_id("new_file_id");
6020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_remote.set_modification_date(now.ToInternalValue());
6030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists[0]->mutable_entries()->push_back(new_file_remote);
6050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
6060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 1);
6070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Add the same file locally, but with a different name, a dirty metadata
6090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // state, and a newer modification date.
6100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry root;
6110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
6120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      util::GetDriveMyDriveRootPath(), &root));
6130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry new_file_local;
6150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_resource_id(new_file_remote.resource_id());
6160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_parent_local_id(root.local_id());
6170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_title("new_file_local");
6180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_metadata_edit_state(ResourceEntry::DIRTY);
6190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_modification_date(
6200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      (now + base::TimeDelta::FromSeconds(1)).ToInternalValue());
6210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string local_id;
6220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, metadata_->AddEntry(new_file_local, &local_id));
6230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Apply the change.
6250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::set<base::FilePath> changed_dirs;
6260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, ApplyChangeList(change_lists.Pass(), &changed_dirs));
6270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The change is rejected due to the old modification date.
6290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry entry;
6300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryById(local_id, &entry));
6310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(new_file_local.title(), entry.title());
6320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
6330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
63490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace internal
63590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace drive
636