change_list_processor_unittest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/google_apis/drive_api_parser.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/google_apis/gdata_wapi_parser.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/google_apis/test_util.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive { 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace internal { 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace { 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int64 kBaseResourceListChangestamp = 123; 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kBaseResourceListFile[] = "gdata/root_feed.json"; 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum FileOrDirectory { 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FILE, 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DIRECTORY, 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct EntryExpectation { 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string path; 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string id; 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string parent_id; 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileOrDirectory type; 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ChangeListProcessorTest : public testing::Test { 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetUp() OVERRIDE { 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_storage_.reset(new ResourceMetadataStorage( 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch temp_dir_.path(), base::MessageLoopProxy::current().get())); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(metadata_storage_->Initialize()); 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_.reset(new internal::ResourceMetadata( 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_storage_.get(), base::MessageLoopProxy::current())); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize()); 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Parses a json file at |test_data_path| relative to Chrome test directory 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // into a ScopedVector<drive::internal::ChangeList>. 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ScopedVector<ChangeList> ParseChangeList(const std::string& test_data_path) { 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ScopedVector<ChangeList> changes; 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) changes.push_back(new ChangeList( 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *google_apis::ResourceList::ExtractAndParse( 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *google_apis::test_util::LoadJSONFile( 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_data_path)))); 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return changes.Pass(); 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Applies the |changes| to |metadata_| as a full resource list of changestamp 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |kBaseResourceListChangestamp|. 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void ApplyFullResourceList(ScopedVector<ChangeList> changes) { 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<google_apis::AboutResource> about_resource( 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new google_apis::AboutResource); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) about_resource->set_largest_change_id(kBaseResourceListChangestamp); 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) about_resource->set_root_folder_id("fake_root"); 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor processor(metadata_.get()); 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) processor.Apply(about_resource.Pass(), 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) changes.Pass(), 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false /* is_delta_update */); 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Applies the |changes| to |metadata_| as a delta update. Delta changelists 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // should contain their changestamp in themselves. 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> ApplyChangeList(ScopedVector<ChangeList> changes) { 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor processor(metadata_.get()); 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) processor.Apply(scoped_ptr<google_apis::AboutResource>(), 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) changes.Pass(), 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) true /* is_delta_update */); 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return processor.changed_dirs(); 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Gets the resource entry for the path from |metadata_| synchronously. 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Returns null if the entry does not exist. 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ResourceEntry> GetResourceEntry(const std::string& path) { 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ResourceEntry> entry(new ResourceEntry); 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) FileError error = metadata_->GetResourceEntryByPath( 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath::FromUTF8Unsafe(path), entry.get()); 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (error != FILE_ERROR_OK) 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry.reset(); 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return entry.Pass(); 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ScopedTempDir temp_dir_; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<ResourceMetadataStorage, 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_util::DestroyHelperForTests> metadata_storage_; 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<ResourceMetadata, test_util::DestroyHelperForTests> metadata_; 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, ApplyFullResourceList) { 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const EntryExpectation kExpected[] = { 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Root files 114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root", 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "fake_root", util::kDriveGrandRootSpecialResourceId, DIRECTORY}, 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/File 1.txt", 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "file:2_file_resource_id", "fake_root", FILE}, 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Slash \xE2\x88\x95 in file 1.txt", 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "file:slash_file_resource_id", "fake_root", FILE}, 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Document 1 excludeDir-test.gdoc", 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "document:5_document_resource_id", "fake_root", FILE}, 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Subdirectory files 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Directory 1", 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:1_folder_resource_id", "fake_root", DIRECTORY}, 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Directory 1/SubDirectory File 1.txt", 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "file:subdirectory_file_1_id", "folder:1_folder_resource_id", FILE}, 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Directory 1/Shared To The Account Owner.txt", 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "file:subdirectory_unowned_file_1_id", 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:1_folder_resource_id", FILE}, 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Directory 2 excludeDir-test", 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:sub_dir_folder_2_self_link", "fake_root", DIRECTORY}, 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Slash \xE2\x88\x95 in directory", 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:slash_dir_folder_resource_id", "fake_root", DIRECTORY}, 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Slash \xE2\x88\x95 in directory/Slash SubDir File.txt", 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "file:slash_subdir_file", 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:slash_dir_folder_resource_id", FILE}, 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Deeper 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Directory 1/Sub Directory Folder", 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:sub_dir_folder_resource_id", 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:1_folder_resource_id", DIRECTORY}, 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/root/Directory 1/Sub Directory Folder/Sub Sub Directory Folder", 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:sub_sub_directory_folder_id", 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "folder:sub_dir_folder_resource_id", DIRECTORY}, 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Orphan 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) {"drive/other/Orphan File 1.txt", 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "file:1_orphanfile_resource_id", 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) util::kDriveOtherDirSpecialResourceId, FILE}, 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) }; 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kExpected); ++i) { 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ResourceEntry> entry = GetResourceEntry(kExpected[i].path); 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(entry) << "for path: " << kExpected[i].path; 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kExpected[i].id, entry->resource_id()); 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kExpected[i].parent_id, entry->parent_resource_id()); 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kExpected[i].type, 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry->file_info().is_directory() ? DIRECTORY : FILE); 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(kBaseResourceListChangestamp, metadata_->GetLargestChangestamp()); 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileAddedInNewDirectory) { 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJson[] = 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_added_in_new_directory.json"; 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJson), &entry_map, NULL); 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kRootId("fake_root"); 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kNewFolderId("folder:new_folder_resource_id"); 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kNewFileId("document:file_added_in_new_dir_id"); 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of parsed ResourceEntryMap. 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2U, entry_map.size()); 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kNewFolderId)); 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kNewFileId)); 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kRootId, entry_map[kNewFolderId].parent_resource_id()); 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kNewFolderId, entry_map[kNewFileId].parent_resource_id()); 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map[kNewFolderId].file_info().is_directory()); 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(entry_map[kNewFileId].file_info().is_directory()); 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("New Directory", entry_map[kNewFolderId].title()); 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("File in new dir", entry_map[kNewFileId].title()); 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply the changelist and check the effect. 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJson)); 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The value is written in kTestJson. 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16730, metadata_->GetLargestChangestamp()); 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry("drive/root/New Directory")); 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry( 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/New Directory/File in new dir.gdoc")); 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2U, changed_dirs.size()); 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/New Directory"))); 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaDirMovedFromRootToDirectory) { 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJson[] = 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_dir_moved_from_root_to_directory.json"; 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJson), &entry_map, NULL); 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kMovedId("folder:1_folder_resource_id"); 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kDestId("folder:sub_dir_folder_2_self_link"); 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of parsed ResourceEntryMap. 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2U, entry_map.size()); 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kMovedId)); 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kDestId)); 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kDestId, entry_map[kMovedId].parent_resource_id()); 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply the changelist and check the effect. 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJson)); 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The value is written in kTestJson. 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16809, metadata_->GetLargestChangestamp()); 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(GetResourceEntry("drive/root/Directory 1")); 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry( 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Directory 2 excludeDir-test/Directory 1")); 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(4U, changed_dirs.size()); 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/Directory 1"))); 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe( 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Directory 2 excludeDir-test"))); 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe( 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Directory 2 excludeDir-test/Directory 1"))); 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileMovedFromDirectoryToRoot) { 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJson[] = 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_moved_from_directory_to_root.json"; 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJson), &entry_map, NULL); 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kRootId("fake_root"); 25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kMovedId("file:subdirectory_file_1_id"); 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kSrcId("folder:1_folder_resource_id"); 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of parsed ResourceEntryMap. 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2U, entry_map.size()); 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kMovedId)); 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kSrcId)); 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kRootId, entry_map[kMovedId].parent_resource_id()); 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply the changelist and check the effect. 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJson)); 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The value is written in kTestJson. 2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16815, metadata_->GetLargestChangestamp()); 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(GetResourceEntry( 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Directory 1/SubDirectory File 1.txt")); 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry("drive/root/SubDirectory File 1.txt")); 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2U, changed_dirs.size()); 274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/Directory 1"))); 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaFileRenamedInDirectory) { 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJson[] = 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_renamed_in_directory.json"; 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJson), &entry_map, NULL); 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kRootId("fake_root"); 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kRenamedId("file:subdirectory_file_1_id"); 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string kParentId("folder:1_folder_resource_id"); 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of parsed ResourceEntryMap. 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2U, entry_map.size()); 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kRenamedId)); 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(entry_map.count(kParentId)); 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(kParentId, entry_map[kRenamedId].parent_resource_id()); 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("New SubDirectory File 1.txt", entry_map[kRenamedId].title()); 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply the changelist and check the effect. 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJson)); 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The value is written in kTestJson. 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16767, metadata_->GetLargestChangestamp()); 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(GetResourceEntry( 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Directory 1/SubDirectory File 1.txt")); 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry( 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Directory 1/New SubDirectory File 1.txt")); 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2U, changed_dirs.size()); 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/Directory 1"))); 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddAndDeleteFileInRoot) { 319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJsonAdd[] = 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_added_in_root.json"; 321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJsonDelete[] = 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_deleted_in_root.json"; 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kParentId("fake_root"); 325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kFileId("document:added_in_root_id"); 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of kTestJsonAdd. 330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJsonAdd), &entry_map, NULL); 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1U, entry_map.size()); 333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kFileId)); 334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kParentId, entry_map[kFileId].parent_resource_id()); 335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("Added file", entry_map[kFileId].title()); 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(entry_map[kFileId].deleted()); 337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply. 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJsonAdd)); 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16683, metadata_->GetLargestChangestamp()); 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry("drive/root/Added file.gdoc")); 344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1U, changed_dirs.size()); 345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of kTestJsonDelete. 349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry_map.clear(); 350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJsonDelete), &entry_map, NULL); 352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1U, entry_map.size()); 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kFileId)); 354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kParentId, entry_map[kFileId].parent_resource_id()); 355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("Added file", entry_map[kFileId].title()); 356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map[kFileId].deleted()); 357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply. 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) changed_dirs = ApplyChangeList(ParseChangeList(kTestJsonDelete)); 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16687, metadata_->GetLargestChangestamp()); 361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(GetResourceEntry("drive/root/Added file.gdoc")); 362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1U, changed_dirs.size()); 363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 364868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddAndDeleteFileFromExistingDirectory) { 369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJsonAdd[] = 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_added_in_directory.json"; 371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJsonDelete[] = 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_deleted_in_directory.json"; 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kParentId("folder:1_folder_resource_id"); 375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kFileId("document:added_in_root_id"); 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of kTestJsonAdd. 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJsonAdd), &entry_map, NULL); 382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2U, entry_map.size()); 383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kFileId)); 384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kParentId)); 385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kParentId, entry_map[kFileId].parent_resource_id()); 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("Added file", entry_map[kFileId].title()); 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(entry_map[kFileId].deleted()); 388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply. 390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJsonAdd)); 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16730, metadata_->GetLargestChangestamp()); 394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(GetResourceEntry("drive/root/Directory 1/Added file.gdoc")); 395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2U, changed_dirs.size()); 397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root"))); 399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/Directory 1"))); 401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of kTestJsonDelete. 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) entry_map.clear(); 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJsonDelete), &entry_map, NULL); 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1U, entry_map.size()); 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kFileId)); 408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kParentId, entry_map[kFileId].parent_resource_id()); 409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ("Added file", entry_map[kFileId].title()); 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map[kFileId].deleted()); 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply. 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) changed_dirs = ApplyChangeList(ParseChangeList(kTestJsonDelete)); 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16770, metadata_->GetLargestChangestamp()); 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(GetResourceEntry("drive/root/Directory 1/Added file.gdoc")); 416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1U, changed_dirs.size()); 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.count( 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath::FromUTF8Unsafe("drive/root/Directory 1"))); 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ChangeListProcessorTest, DeltaAddFileToNewButDeletedDirectory) { 423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This file contains the following updates: 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 1) A new PDF file is added to a new directory 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 2) but the new directory is marked "deleted" (i.e. moved to Trash) 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Hence, the PDF file should be just ignored. 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const char kTestJson[] = 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "gdata/delta_file_added_in_new_but_deleted_directory.json"; 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ResourceEntryMap entry_map; 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChangeListProcessor::ConvertToMap( 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ParseChangeList(kTestJson), &entry_map, NULL); 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kRootId("fake_root"); 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kDirId("folder:new_folder_resource_id"); 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string kFileId("pdf:file_added_in_deleted_dir_id"); 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 438868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Check the content of parsed ResourceEntryMap. 439868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(2U, entry_map.size()); 440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kDirId)); 441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map.count(kFileId)); 442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(kDirId, entry_map[kFileId].parent_resource_id()); 443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(entry_map[kDirId].deleted()); 444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Apply the changelist and check the effect. 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyFullResourceList(ParseChangeList(kBaseResourceListFile)); 447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::set<base::FilePath> changed_dirs = 448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ApplyChangeList(ParseChangeList(kTestJson)); 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The value is written in kTestJson. 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(16730, metadata_->GetLargestChangestamp()); 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(GetResourceEntry("drive/root/New Directory/new_pdf_file.pdf")); 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(changed_dirs.empty()); 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace internal 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace drive 459