1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright (c) 2012 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"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_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");
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  directory.set_resource_id("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");
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  directory.set_resource_id("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(
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "1_folder_resource_id");
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("Sub Sub Directory Folder");
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  directory.set_resource_id("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(
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "sub_dir_folder_resource_id");
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("Directory 2 excludeDir-test");
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  directory.set_resource_id("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");
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  file.set_resource_id("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");
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  file.set_resource_id("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(
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "1_folder_resource_id");
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_title("Orphan File 1.txt");
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  file.set_resource_id("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,
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            FileChange* changed_files) {
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 */);
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *changed_files = processor.changed_files();
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",
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "2_file_resource_id", kRootId, FILE},
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Subdirectory files
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1",
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "1_folder_resource_id", kRootId, DIRECTORY},
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1/SubDirectory File 1.txt",
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "subdirectory_file_1_id", "1_folder_resource_id", FILE},
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 2 excludeDir-test",
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "sub_dir_folder_2_self_link", kRootId, DIRECTORY},
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Deeper
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1/Sub Directory Folder",
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "sub_dir_folder_resource_id",
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "1_folder_resource_id", DIRECTORY},
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {"drive/root/Directory 1/Sub Directory Folder/Sub Sub Directory Folder",
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "sub_sub_directory_folder_id",
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          "sub_dir_folder_resource_id", DIRECTORY},
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Orphan
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      {"drive/other/Orphan File 1.txt", "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;
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_folder.set_resource_id("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;
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  new_file.set_resource_id("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()));
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16730, changestamp);
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry("drive/root/New Directory"));
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry(
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "drive/root/New Directory/File in new dir.txt"));
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2U, changed_files.size());
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(base::FilePath::FromUTF8Unsafe(
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "drive/root/New Directory/File in new dir.txt")));
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/New Directory")));
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaDirMovedFromRootToDirectory) {
2585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
2595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  entry.set_resource_id("1_folder_resource_id");
2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("Directory 1");
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.mutable_file_info()->set_is_directory(true);
2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "sub_dir_folder_2_self_link");
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16809);
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16809, changestamp);
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry("drive/root/Directory 1"));
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry(
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 2 excludeDir-test/Directory 1"));
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2U, changed_files.size());
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.CountDirectory(
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root")));
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1")));
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.CountDirectory(base::FilePath::FromUTF8Unsafe(
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "drive/root/Directory 2 excludeDir-test")));
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(base::FilePath::FromUTF8Unsafe(
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "drive/root/Directory 2 excludeDir-test/Directory 1")));
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileMovedFromDirectoryToRoot) {
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  entry.set_resource_id("subdirectory_file_1_id");
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("SubDirectory File 1.txt");
3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16815);
307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16815, changestamp);
317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry(
318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 1/SubDirectory File 1.txt"));
319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry("drive/root/SubDirectory File 1.txt"));
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2U, changed_files.size());
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe("drive/root/SubDirectory File 1.txt")));
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(base::FilePath::FromUTF8Unsafe(
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "drive/root/Directory 1/SubDirectory File 1.txt")));
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileRenamedInDirectory) {
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  entry.set_resource_id("subdirectory_file_1_id");
3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("New SubDirectory File 1.txt");
3355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "1_folder_resource_id");
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16767);
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16767, changestamp);
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry(
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 1/SubDirectory File 1.txt"));
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetResourceEntry(
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "drive/root/Directory 1/New SubDirectory File 1.txt"));
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2U, changed_files.size());
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(base::FilePath::FromUTF8Unsafe(
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "drive/root/Directory 1/SubDirectory File 1.txt")));
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(base::FilePath::FromUTF8Unsafe(
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "drive/root/Directory 1/New SubDirectory File 1.txt")));
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddAndDeleteFileInRoot) {
3635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to add a file.
3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  entry.set_resource_id("added_in_root_id");
3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("Added file.txt");
3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16683);
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
3765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16683, changestamp);
3845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GetResourceEntry("drive/root/Added file.txt"));
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, changed_files.size());
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe("drive/root/Added file.txt")));
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to delete the file.
3905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
3915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_deleted(true);
3935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
3945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
3955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16687);
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16687, changestamp);
4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(GetResourceEntry("drive/root/Added file.txt"));
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, changed_files.size());
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe("drive/root/Added file.txt")));
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddAndDeleteFileFromExistingDirectory) {
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to add a file.
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry entry;
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  entry.set_resource_id("added_in_root_id");
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_title("Added file.txt");
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "1_folder_resource_id");
4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16730);
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
4255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16730, changestamp);
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GetResourceEntry("drive/root/Directory 1/Added file.txt"));
433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, changed_files.size());
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1/Added file.txt")));
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create ChangeList to delete the file.
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  entry.set_deleted(true);
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(entry);
4435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "1_folder_resource_id");
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16770);
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply.
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16770, changestamp);
4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(GetResourceEntry("drive/root/Directory 1/Added file.txt"));
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, changed_files.size());
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.count(
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::FilePath::FromUTF8Unsafe("drive/root/Directory 1/Added file.txt")));
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddFileToNewButDeletedDirectory) {
4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Create a change which contains the following updates:
462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 1) A new PDF file is added to a new directory
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // 2) but the new directory is marked "deleted" (i.e. moved to Trash)
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Hence, the PDF file should be just ignored.
4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<ChangeList> change_lists;
4665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists.push_back(new ChangeList);
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry file;
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  file.set_resource_id("file_added_in_deleted_id");
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_title("new_pdf_file.pdf");
4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  file.set_deleted(true);
4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(file);
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "new_folder_resource_id");
4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ResourceEntry directory;
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  directory.set_resource_id("new_folder_resource_id");
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_title("New Directory");
4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.mutable_file_info()->set_is_directory(true);
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  directory.set_deleted(true);
4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_entries()->push_back(directory);
4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  change_lists[0]->set_largest_changestamp(16730);
485868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Apply the changelist and check the effect.
4875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 changestamp = 0;
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetLargestChangestamp(&changestamp));
494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(16730, changestamp);
495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetResourceEntry("drive/root/New Directory/new_pdf_file.pdf"));
496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(changed_files.empty());
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
49990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ChangeListProcessorTest, RefreshDirectory) {
5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Prepare metadata.
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
504effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create change list.
505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<ChangeList> change_list(new ChangeList);
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Add a new file to the change list.
5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry new_file;
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_title("new_file");
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_resource_id("new_file_id");
511effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_entries()->push_back(new_file);
512effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_parent_resource_ids()->push_back(kRootId);
5133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Add "Directory 1" to the map with a new name.
5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry dir1;
5163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII("Directory 1"), &dir1));
5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  dir1.set_title(dir1.title() + " (renamed)");
519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_entries()->push_back(dir1);
520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_parent_resource_ids()->push_back(kRootId);
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Update the directory with the map.
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry root;
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetDriveMyDriveRootPath(), &root));
5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int64 kNewChangestamp = 12345;
527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceEntryVector refreshed_entries;
5283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, ChangeListProcessor::RefreshDirectory(
5293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      metadata_.get(),
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DirectoryFetchInfo(root.local_id(), kRootId, kNewChangestamp),
531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      change_list.Pass(),
532effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &refreshed_entries));
5333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // "new_file" should be added.
535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceEntry entry;
5363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII(new_file.title()), &entry));
5383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // "Directory 1" should be renamed.
5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII(dir1.title()), &entry));
5423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(ChangeListProcessorTest, RefreshDirectory_WrongParentId) {
5453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Prepare metadata.
5465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
5473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create change list and add a new file to it.
549effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<ChangeList> change_list(new ChangeList);
5503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry new_file;
5513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_title("new_file");
5523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_file.set_resource_id("new_file_id");
5533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // This entry should not be added because the parent ID does not match.
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_parent_resource_ids()->push_back(
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "some-random-resource-id");
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  change_list->mutable_entries()->push_back(new_file);
5573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Update the directory.
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry root;
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetDriveMyDriveRootPath(), &root));
5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int64 kNewChangestamp = 12345;
564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceEntryVector refreshed_entries;
5653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, ChangeListProcessor::RefreshDirectory(
5663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      metadata_.get(),
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DirectoryFetchInfo(root.local_id(), kRootId, kNewChangestamp),
568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      change_list.Pass(),
569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      &refreshed_entries));
5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // "new_file" should not be added.
5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ResourceEntry entry;
5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_NOT_FOUND, metadata_->GetResourceEntryByPath(
5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      util::GetDriveMyDriveRootPath().AppendASCII(new_file.title()), &entry));
5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ChangeListProcessorTest, SharedFilesWithNoParentInFeed) {
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Prepare metadata.
5795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create change lists.
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<ChangeList> change_lists;
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists.push_back(new ChangeList);
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add a new file with non-existing parent resource id to the change lists.
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry new_file;
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_file.set_title("new_file");
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_file.set_resource_id("new_file_id");
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists[0]->mutable_entries()->push_back(new_file);
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists[0]->mutable_parent_resource_ids()->push_back("nonexisting");
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 1);
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // "new_file" should be added under drive/other.
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry entry;
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util::GetDriveGrandRootPath().AppendASCII("other/new_file"), &entry));
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6030529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(ChangeListProcessorTest, ModificationDate) {
6040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Prepare metadata.
6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(FILE_ERROR_OK, ApplyFullResourceList(CreateBaseChangeList()));
6060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Create change lists with a new file.
6080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedVector<ChangeList> change_lists;
6090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists.push_back(new ChangeList);
6100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const base::Time now = base::Time::Now();
6120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry new_file_remote;
6130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_remote.set_title("new_file_remote");
6140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_remote.set_resource_id("new_file_id");
6150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_remote.set_modification_date(now.ToInternalValue());
6160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists[0]->mutable_entries()->push_back(new_file_remote);
6180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists[0]->mutable_parent_resource_ids()->push_back(kRootId);
6190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  change_lists[0]->set_largest_changestamp(kBaseResourceListChangestamp + 1);
6200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Add the same file locally, but with a different name, a dirty metadata
6220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // state, and a newer modification date.
6230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry root;
6240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryByPath(
6250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      util::GetDriveMyDriveRootPath(), &root));
6260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry new_file_local;
6280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_resource_id(new_file_remote.resource_id());
6290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_parent_local_id(root.local_id());
6300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_title("new_file_local");
6310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_metadata_edit_state(ResourceEntry::DIRTY);
6320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  new_file_local.set_modification_date(
6330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      (now + base::TimeDelta::FromSeconds(1)).ToInternalValue());
6340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string local_id;
6350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, metadata_->AddEntry(new_file_local, &local_id));
6360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Apply the change.
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileChange changed_files;
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(FILE_ERROR_OK,
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            ApplyChangeList(change_lists.Pass(), &changed_files));
6410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The change is rejected due to the old modification date.
6430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ResourceEntry entry;
6440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryById(local_id, &entry));
6450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(new_file_local.title(), entry.title());
6460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
6470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
64890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace internal
64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace drive
650