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