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