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