From 35287ead0513c1bb66a01890113416c41ae94c7e Mon Sep 17 00:00:00 2001 From: "hashimoto@chromium.org" Date: Tue, 10 Jun 2014 21:48:29 +0000 Subject: [PATCH] drive: Directly convert FileResource and ChangeResource to ResourceEntry BUG=357038 TEST=unit_tests Review URL: https://codereview.chromium.org/322043006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276169 0039d316-1c4b-4281-b951-d872f2087c98 --- .../chromeos/drive/change_list_processor.cc | 9 +- .../chromeos/drive/fake_file_system.cc | 13 +- .../drive/file_system/copy_operation.cc | 6 +- .../drive/file_system/search_operation.cc | 6 +- .../drive/resource_entry_conversion.cc | 129 ++--- .../drive/resource_entry_conversion.h | 19 +- .../resource_entry_conversion_unittest.cc | 455 ++++++++---------- .../drive/sync/entry_revert_performer.cc | 6 +- .../chromeos/drive/sync/remove_performer.cc | 6 +- google_apis/drive/gdata_wapi_parser.cc | 5 +- google_apis/drive/gdata_wapi_parser.h | 2 +- 11 files changed, 307 insertions(+), 349 deletions(-) diff --git a/chrome/browser/chromeos/drive/change_list_processor.cc b/chrome/browser/chromeos/drive/change_list_processor.cc index 83a7d8b87cb403..310b3b21b669f6 100644 --- a/chrome/browser/chromeos/drive/change_list_processor.cc +++ b/chrome/browser/chromeos/drive/change_list_processor.cc @@ -12,7 +12,6 @@ #include "chrome/browser/chromeos/drive/resource_metadata.h" #include "chrome/browser/drive/drive_api_util.h" #include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/gdata_wapi_parser.h" namespace drive { namespace internal { @@ -81,8 +80,8 @@ ChangeList::ChangeList(const google_apis::ChangeList& change_list) parent_resource_ids_.resize(items.size()); size_t entries_index = 0; for (size_t i = 0; i < items.size(); ++i) { - if (ConvertToResourceEntry( - *util::ConvertChangeResourceToResourceEntry(*items[i]), + if (ConvertChangeResourceToResourceEntry( + *items[i], &entries_[entries_index], &parent_resource_ids_[entries_index])) { ++entries_index; @@ -100,8 +99,8 @@ ChangeList::ChangeList(const google_apis::FileList& file_list) parent_resource_ids_.resize(items.size()); size_t entries_index = 0; for (size_t i = 0; i < items.size(); ++i) { - if (ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*items[i]), + if (ConvertFileResourceToResourceEntry( + *items[i], &entries_[entries_index], &parent_resource_ids_[entries_index])) { ++entries_index; diff --git a/chrome/browser/chromeos/drive/fake_file_system.cc b/chrome/browser/chromeos/drive/fake_file_system.cc index 87a3a35d8e9b4c..faab75677dc1e2 100644 --- a/chrome/browser/chromeos/drive/fake_file_system.cc +++ b/chrome/browser/chromeos/drive/fake_file_system.cc @@ -14,12 +14,9 @@ #include "chrome/browser/chromeos/drive/file_errors.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" -#include "chrome/browser/drive/drive_api_util.h" #include "chrome/browser/drive/drive_service_interface.h" #include "content/public/browser/browser_thread.h" #include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/gdata_wapi_parser.h" -#include "testing/gtest/include/gtest/gtest.h" namespace drive { namespace test_util { @@ -283,9 +280,8 @@ void FakeFileSystem::GetFileContentAfterGetFileResource( scoped_ptr entry(new ResourceEntry); std::string parent_resource_id; - bool converted = ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*gdata_entry), - entry.get(), &parent_resource_id); + bool converted = ConvertFileResourceToResourceEntry( + *gdata_entry, entry.get(), &parent_resource_id); DCHECK(converted); entry->set_parent_local_id(parent_resource_id); @@ -376,9 +372,8 @@ void FakeFileSystem::GetResourceEntryAfterGetFileList( for (size_t i = 0; i < entries.size(); ++i) { scoped_ptr entry(new ResourceEntry); std::string parent_resource_id; - bool converted = ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*entries[i]), entry.get(), - &parent_resource_id); + bool converted = ConvertFileResourceToResourceEntry( + *entries[i], entry.get(), &parent_resource_id); DCHECK(converted); entry->set_parent_local_id(parent_resource_id); diff --git a/chrome/browser/chromeos/drive/file_system/copy_operation.cc b/chrome/browser/chromeos/drive/file_system/copy_operation.cc index 45154c657a31eb..08045398a4449d 100644 --- a/chrome/browser/chromeos/drive/file_system/copy_operation.cc +++ b/chrome/browser/chromeos/drive/file_system/copy_operation.cc @@ -19,7 +19,6 @@ #include "chrome/browser/drive/drive_api_util.h" #include "content/public/browser/browser_thread.h" #include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/gdata_wapi_parser.h" using content::BrowserThread; @@ -169,9 +168,8 @@ FileError UpdateLocalStateForServerSideOperation( ResourceEntry entry; std::string parent_resource_id; - if (!ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*file_resource), - &entry, &parent_resource_id) || + if (!ConvertFileResourceToResourceEntry(*file_resource, &entry, + &parent_resource_id) || parent_resource_id.empty()) return FILE_ERROR_NOT_A_FILE; diff --git a/chrome/browser/chromeos/drive/file_system/search_operation.cc b/chrome/browser/chromeos/drive/file_system/search_operation.cc index 3a600b6e5b299b..4341748e36e859 100644 --- a/chrome/browser/chromeos/drive/file_system/search_operation.cc +++ b/chrome/browser/chromeos/drive/file_system/search_operation.cc @@ -19,7 +19,6 @@ #include "chrome/browser/drive/drive_api_util.h" #include "content/public/browser/browser_thread.h" #include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/gdata_wapi_parser.h" #include "url/gurl.h" using content::BrowserThread; @@ -52,9 +51,8 @@ FileError ResolveSearchResultOnBlockingPool( if (error == FILE_ERROR_NOT_FOUND) { std::string original_parent_id; - if (!ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*entries[i]), - &entry, &original_parent_id)) + if (!ConvertFileResourceToResourceEntry(*entries[i], &entry, + &original_parent_id)) continue; // Skip non-file entries. // The result is absent in local resource metadata. This can happen if diff --git a/chrome/browser/chromeos/drive/resource_entry_conversion.cc b/chrome/browser/chromeos/drive/resource_entry_conversion.cc index f4de8e82054c2a..ebaaadb6d3115c 100644 --- a/chrome/browser/chromeos/drive/resource_entry_conversion.cc +++ b/chrome/browser/chromeos/drive/resource_entry_conversion.cc @@ -4,7 +4,6 @@ #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" -#include #include #include "base/logging.h" @@ -12,31 +11,40 @@ #include "chrome/browser/chromeos/drive/drive.pb.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/drive/drive_api_util.h" +#include "google_apis/drive/drive_api_parser.h" #include "google_apis/drive/gdata_wapi_parser.h" namespace drive { -namespace { +bool ConvertChangeResourceToResourceEntry( + const google_apis::ChangeResource& input, + ResourceEntry* out_entry, + std::string* out_parent_resource_id) { + DCHECK(out_entry); + DCHECK(out_parent_resource_id); -const char kSharedWithMeLabel[] = "shared-with-me"; -const char kSharedLabel[] = "shared"; + ResourceEntry converted; + std::string parent_resource_id; + if (input.file() && + !ConvertFileResourceToResourceEntry(*input.file(), &converted, + &parent_resource_id)) + return false; -// Checks if |entry| has a specified label. -bool HasLabel(const google_apis::ResourceEntry& entry, - const std::string& label) { - std::vector::const_iterator it = - std::find(entry.labels().begin(), entry.labels().end(), label); - return it != entry.labels().end(); -} + converted.set_resource_id(input.file_id()); + converted.set_deleted(converted.deleted() || input.is_deleted()); + converted.set_modification_date(input.modification_date().ToInternalValue()); -} // namespace + out_entry->Swap(&converted); + swap(*out_parent_resource_id, parent_resource_id); + return true; +} -bool ConvertToResourceEntry(const google_apis::ResourceEntry& input, - ResourceEntry* out_entry, - std::string* out_parent_resource_id) { +bool ConvertFileResourceToResourceEntry( + const google_apis::FileResource& input, + ResourceEntry* out_entry, + std::string* out_parent_resource_id) { DCHECK(out_entry); DCHECK(out_parent_resource_id); - ResourceEntry converted; // For regular files, the 'filename' and 'title' attribute in the metadata @@ -45,87 +53,86 @@ bool ConvertToResourceEntry(const google_apis::ResourceEntry& input, // 'filename', as the file name in the local snapshot. converted.set_title(input.title()); converted.set_base_name(util::NormalizeFileName(converted.title())); - converted.set_resource_id(input.resource_id()); - converted.set_modification_date(input.modification_date().ToInternalValue()); + converted.set_resource_id(input.file_id()); // Gets parent Resource ID. On drive.google.com, a file can have multiple // parents or no parent, but we are forcing a tree-shaped structure (i.e. no // multi-parent or zero-parent entries). Therefore the first found "parent" is - // used for the entry and if the entry has no parent, we assign a special ID - // which represents no-parent entries. Tracked in http://crbug.com/158904. + // used for the entry. Tracked in http://crbug.com/158904. std::string parent_resource_id; - const google_apis::Link* parent_link = - input.GetLinkByType(google_apis::Link::LINK_PARENT); - if (parent_link) - parent_resource_id = util::ExtractResourceIdFromUrl(parent_link->href()); + if (!input.parents().empty()) + parent_resource_id = input.parents()[0].file_id(); - converted.set_deleted(input.deleted()); - converted.set_shared_with_me(HasLabel(input, kSharedWithMeLabel)); - converted.set_shared(HasLabel(input, kSharedLabel)); + converted.set_deleted(input.labels().is_trashed()); + converted.set_shared_with_me(!input.shared_with_me_date().is_null()); + converted.set_shared(input.shared()); PlatformFileInfoProto* file_info = converted.mutable_file_info(); - file_info->set_last_modified(input.updated_time().ToInternalValue()); - // If the file has never been viewed (last_viewed_time().is_null() == true), - // then we will set the last_accessed field in the protocol buffer to 0. - file_info->set_last_accessed(input.last_viewed_time().ToInternalValue()); - file_info->set_creation_time(input.published_time().ToInternalValue()); - - if (input.is_file() || input.is_hosted_document()) { + file_info->set_last_modified(input.modified_date().ToInternalValue()); + // If the file has never been viewed (last_viewed_by_me_date().is_null() == + // true), then we will set the last_accessed field in the protocol buffer to + // 0. + file_info->set_last_accessed( + input.last_viewed_by_me_date().ToInternalValue()); + file_info->set_creation_time(input.created_date().ToInternalValue()); + + // TODO(hashimoto): Get rid of WAPI stuff. crbug.com/357038 + const google_apis::DriveEntryKind entry_kind = util::GetKind(input); + const int entry_kind_class = + google_apis::ResourceEntry::ClassifyEntryKind(entry_kind); + const bool is_file = entry_kind_class & + google_apis::ResourceEntry::KIND_OF_FILE; + const bool is_hosted_document = entry_kind_class & + google_apis::ResourceEntry::KIND_OF_HOSTED_DOCUMENT; + const bool is_folder = entry_kind_class & + google_apis::ResourceEntry::KIND_OF_FOLDER; + + if (is_file || is_hosted_document) { FileSpecificInfo* file_specific_info = converted.mutable_file_specific_info(); - if (input.is_file()) { + if (is_file) { file_info->set_size(input.file_size()); - file_specific_info->set_md5(input.file_md5()); - - // The resumable-edit-media link should only be present for regular - // files as hosted documents are not uploadable. - } else if (input.is_hosted_document()) { + file_specific_info->set_md5(input.md5_checksum()); + } else if (is_hosted_document) { // Attach .g extension to hosted documents so we can special // case their handling in UI. // TODO(satorux): Figure out better way how to pass input info like kind // to UI through the File API stack. - const std::string document_extension = input.GetHostedDocumentExtension(); + const std::string document_extension = + google_apis::ResourceEntry::GetHostedDocumentExtension(entry_kind); file_specific_info->set_document_extension(document_extension); converted.set_base_name( util::NormalizeFileName(converted.title() + document_extension)); // We don't know the size of hosted docs and it does not matter since - // is has no effect on the quota. + // it has no effect on the quota. file_info->set_size(0); } file_info->set_is_directory(false); - file_specific_info->set_content_mime_type(input.content_mime_type()); - file_specific_info->set_is_hosted_document(input.is_hosted_document()); + file_specific_info->set_content_mime_type(input.mime_type()); + file_specific_info->set_is_hosted_document(is_hosted_document); - const google_apis::Link* alternate_link = - input.GetLinkByType(google_apis::Link::LINK_ALTERNATE); - if (alternate_link) - file_specific_info->set_alternate_url(alternate_link->href().spec()); + if (!input.alternate_link().is_empty()) + file_specific_info->set_alternate_url(input.alternate_link().spec()); - const int64 image_width = input.image_width(); + const int64 image_width = input.image_media_metadata().width(); if (image_width != -1) file_specific_info->set_image_width(image_width); - const int64 image_height = input.image_height(); + const int64 image_height = input.image_media_metadata().height(); if (image_height != -1) file_specific_info->set_image_height(image_height); - const int64 image_rotation = input.image_rotation(); + const int64 image_rotation = input.image_media_metadata().rotation(); if (image_rotation != -1) file_specific_info->set_image_rotation(image_rotation); - } else if (input.is_folder()) { + } else if (is_folder) { file_info->set_is_directory(true); } else { - // There are two cases to reach here. - // * The entry is something that doesn't map into files (i.e. sites). - // We don't handle these kind of entries hence return false. - // * The entry is un-shared to you by other owner. In that case, we - // get an entry with only deleted() and resource_id() fields are - // filled. Since we want to delete such entries locally as well, - // in that case we need to return true to proceed. - if (!input.deleted()) - return false; + // The entry is something that doesn't map into files (i.e. sites). + // We don't handle these kind of entries hence return false. + return false; } out_entry->Swap(&converted); diff --git a/chrome/browser/chromeos/drive/resource_entry_conversion.h b/chrome/browser/chromeos/drive/resource_entry_conversion.h index 55f762a5d2683a..e9d62c4a14a665 100644 --- a/chrome/browser/chromeos/drive/resource_entry_conversion.h +++ b/chrome/browser/chromeos/drive/resource_entry_conversion.h @@ -10,14 +10,15 @@ #include "base/files/file.h" namespace google_apis { -class ResourceEntry; +class ChangeResource; +class FileResource; } namespace drive { class ResourceEntry; -// Converts a google_apis::ResourceEntry into a drive::ResourceEntry. +// Converts a google_apis::ChangeResource into a drive::ResourceEntry. // If the conversion succeeded, return true and sets the result to |out_entry|. // |out_parent_resource_id| will be set to the resource ID of the parent entry. // If failed, it returns false and keeps output arguments untouched. @@ -31,9 +32,17 @@ class ResourceEntry; // // 2) Entries with multiple parents are allowed on drive.google.com. For these // entries, the first parent is chosen. -bool ConvertToResourceEntry(const google_apis::ResourceEntry& input, - ResourceEntry* out_entry, - std::string* out_parent_resource_id); +bool ConvertChangeResourceToResourceEntry( + const google_apis::ChangeResource& input, + ResourceEntry* out_entry, + std::string* out_parent_resource_id); + +// Converts a google_apis::FileResource into a drive::ResourceEntry. +// Also see the comment for ConvertChangeResourceToResourceEntry above. +bool ConvertFileResourceToResourceEntry( + const google_apis::FileResource& input, + ResourceEntry* out_entry, + std::string* out_parent_resource_id); // Converts the resource entry to the platform file info. void ConvertResourceEntryToFileInfo(const ResourceEntry& entry, diff --git a/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc b/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc index 35d1153025afc3..33df3b509aca1c 100644 --- a/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc +++ b/chrome/browser/chromeos/drive/resource_entry_conversion_unittest.cc @@ -4,164 +4,117 @@ #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" -#include "base/files/file_path.h" #include "base/time/time.h" -#include "base/values.h" #include "chrome/browser/chromeos/drive/drive.pb.h" -#include "chrome/browser/chromeos/drive/test_util.h" -#include "google_apis/drive/gdata_wapi_parser.h" +#include "chrome/browser/drive/drive_api_util.h" +#include "google_apis/drive/drive_api_parser.h" #include "testing/gtest/include/gtest/gtest.h" namespace drive { -TEST(ResourceEntryConversionTest, ConvertToResourceEntry_File) { - scoped_ptr value = - google_apis::test_util::LoadJSONFile("gdata/file_entry.json"); - ASSERT_TRUE(value.get()); +namespace { - scoped_ptr gdata_resource_entry( - google_apis::ResourceEntry::ExtractAndParse(*value)); - ASSERT_TRUE(gdata_resource_entry.get()); +base::Time GetTestTime() { + // 2011-12-14-T00:40:47.330Z + base::Time::Exploded exploded; + exploded.year = 2011; + exploded.month = 12; + exploded.day_of_month = 14; + exploded.day_of_week = 2; // Tuesday + exploded.hour = 0; + exploded.minute = 40; + exploded.second = 47; + exploded.millisecond = 330; + return base::Time::FromUTCExploded(exploded); +} + +} // namespace + +TEST(ResourceEntryConversionTest, ConvertToResourceEntry_File) { + google_apis::FileResource file_resource; + file_resource.set_title("File 1.mp3"); + file_resource.set_file_id("resource_id"); + file_resource.set_created_date(GetTestTime()); + file_resource.set_modified_date( + GetTestTime() + base::TimeDelta::FromSeconds(10)); + file_resource.set_mime_type("audio/mpeg"); + file_resource.set_alternate_link(GURL("https://file_link_alternate")); + file_resource.set_file_size(892721); + file_resource.set_md5_checksum("3b4382ebefec6e743578c76bbd0575ce"); ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + file_resource, &entry, &parent_resource_id)); - EXPECT_EQ("File 1.mp3", entry.title()); - EXPECT_EQ("File 1.mp3", entry.base_name()); - EXPECT_EQ("file:2_file_resource_id", entry.resource_id()); + EXPECT_EQ(file_resource.title(), entry.title()); + EXPECT_EQ(file_resource.title(), entry.base_name()); + EXPECT_EQ(file_resource.file_id(), entry.resource_id()); EXPECT_EQ("", parent_resource_id); EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); EXPECT_FALSE(entry.shared()); - base::Time expected_creation_time; - base::Time expected_modified_time; - - { - // 2011-12-14T00:40:47.330Z - base::Time::Exploded exploded; - exploded.year = 2011; - exploded.month = 12; - exploded.day_of_month = 13; - exploded.day_of_week = 2; // Tuesday - exploded.hour = 0; - exploded.minute = 40; - exploded.second = 47; - exploded.millisecond = 330; - expected_creation_time = base::Time::FromUTCExploded(exploded); - } - - { - // 2011-12-13T00:40:47.330Z - base::Time::Exploded exploded; - exploded.year = 2011; - exploded.month = 12; - exploded.day_of_month = 14; - exploded.day_of_week = 3; // Wednesday - exploded.hour = 0; - exploded.minute = 40; - exploded.second = 47; - exploded.millisecond = 330; - expected_modified_time = base::Time::FromUTCExploded(exploded); - } - - EXPECT_EQ(expected_modified_time.ToInternalValue(), + EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); // Last accessed value equal to 0 means that the file has never been viewed. EXPECT_EQ(0, entry.file_info().last_accessed()); - EXPECT_EQ(expected_creation_time.ToInternalValue(), + EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); - EXPECT_EQ("audio/mpeg", + EXPECT_EQ(file_resource.mime_type(), entry.file_specific_info().content_mime_type()); EXPECT_FALSE(entry.file_specific_info().is_hosted_document()); - EXPECT_EQ("https://file_link_alternate/", + EXPECT_EQ(file_resource.alternate_link().spec(), entry.file_specific_info().alternate_url()); // Regular file specific fields. - EXPECT_EQ(892721, entry.file_info().size()); - EXPECT_EQ("3b4382ebefec6e743578c76bbd0575ce", - entry.file_specific_info().md5()); + EXPECT_EQ(file_resource.file_size(), entry.file_info().size()); + EXPECT_EQ(file_resource.md5_checksum(), entry.file_specific_info().md5()); EXPECT_FALSE(entry.file_info().is_directory()); } TEST(ResourceEntryConversionTest, - ConvertToResourceEntry_HostedDocument) { - scoped_ptr value = - google_apis::test_util::LoadJSONFile( - "gdata/hosted_document_entry.json"); - ASSERT_TRUE(value.get()); - - scoped_ptr gdata_resource_entry( - google_apis::ResourceEntry::ExtractAndParse(*value)); - ASSERT_TRUE(gdata_resource_entry.get()); + ConvertFileResourceToResourceEntry_HostedDocument) { + google_apis::FileResource file_resource; + file_resource.set_title("Document 1"); + file_resource.set_file_id("resource_id"); + file_resource.set_created_date(GetTestTime()); + file_resource.set_modified_date( + GetTestTime() + base::TimeDelta::FromSeconds(10)); + file_resource.set_last_viewed_by_me_date( + GetTestTime() + base::TimeDelta::FromSeconds(20)); + file_resource.set_mime_type(util::kGoogleDocumentMimeType); + file_resource.set_alternate_link(GURL("https://file_link_alternate")); ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + file_resource, &entry, &parent_resource_id)); - EXPECT_EQ("Document 1", entry.title()); - EXPECT_EQ("Document 1.gdoc", entry.base_name()); // The suffix added. + EXPECT_EQ(file_resource.title(), entry.title()); + EXPECT_EQ(file_resource.title() + ".gdoc", + entry.base_name()); // The suffix added. EXPECT_EQ(".gdoc", entry.file_specific_info().document_extension()); - EXPECT_EQ("document:5_document_resource_id", entry.resource_id()); + EXPECT_EQ(file_resource.file_id(), entry.resource_id()); EXPECT_EQ("", parent_resource_id); EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); EXPECT_FALSE(entry.shared()); - // 2011-12-12T23:28:52.783Z - base::Time::Exploded exploded; - exploded.year = 2011; - exploded.month = 12; - exploded.day_of_month = 12; - exploded.day_of_week = 1; // Monday - exploded.hour = 23; - exploded.minute = 28; - exploded.second = 52; - exploded.millisecond = 783; - const base::Time expected_last_modified_time = - base::Time::FromUTCExploded(exploded); - - // 2011-12-12T23:28:46.686Z - exploded.year = 2011; - exploded.month = 12; - exploded.day_of_month = 12; - exploded.day_of_week = 1; // Monday - exploded.hour = 23; - exploded.minute = 28; - exploded.second = 46; - exploded.millisecond = 686; - const base::Time expected_creation_time = - base::Time::FromUTCExploded(exploded); - - // 2011-12-13T02:12:18.527Z - exploded.year = 2011; - exploded.month = 12; - exploded.day_of_month = 13; - exploded.day_of_week = 2; // Tuesday - exploded.hour = 2; - exploded.minute = 12; - exploded.second = 18; - exploded.millisecond = 527; - const base::Time expected_last_accessed_time = - base::Time::FromUTCExploded(exploded); - - EXPECT_EQ(expected_last_modified_time.ToInternalValue(), + EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); - EXPECT_EQ(expected_last_accessed_time.ToInternalValue(), + EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), entry.file_info().last_accessed()); - EXPECT_EQ(expected_creation_time.ToInternalValue(), + EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); - EXPECT_EQ("text/html", + EXPECT_EQ(file_resource.mime_type(), entry.file_specific_info().content_mime_type()); EXPECT_TRUE(entry.file_specific_info().is_hosted_document()); - EXPECT_EQ("https://3_document_alternate_link/", + EXPECT_EQ(file_resource.alternate_link().spec(), entry.file_specific_info().alternate_url()); // The size should be 0 for a hosted document. @@ -170,172 +123,177 @@ TEST(ResourceEntryConversionTest, } TEST(ResourceEntryConversionTest, - ConvertToResourceEntry_Directory) { - scoped_ptr value = - google_apis::test_util::LoadJSONFile( - "gdata/directory_entry.json"); - ASSERT_TRUE(value.get()); - - scoped_ptr gdata_resource_entry( - google_apis::ResourceEntry::ExtractAndParse(*value)); - ASSERT_TRUE(gdata_resource_entry.get()); + ConvertFileResourceToResourceEntry_Directory) { + google_apis::FileResource file_resource; + file_resource.set_title("Folder"); + file_resource.set_file_id("resource_id"); + file_resource.set_created_date(GetTestTime()); + file_resource.set_modified_date( + GetTestTime() + base::TimeDelta::FromSeconds(10)); + file_resource.set_last_viewed_by_me_date( + GetTestTime() + base::TimeDelta::FromSeconds(20)); + file_resource.set_mime_type(util::kDriveFolderMimeType); + + google_apis::ParentReference parent; + parent.set_file_id("parent_resource_id"); + file_resource.mutable_parents()->push_back(parent); ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + file_resource, &entry, &parent_resource_id)); - EXPECT_EQ("Sub Directory Folder", entry.title()); - EXPECT_EQ("Sub Directory Folder", entry.base_name()); - EXPECT_EQ("folder:sub_dir_folder_resource_id", entry.resource_id()); + EXPECT_EQ(file_resource.title(), entry.title()); + EXPECT_EQ(file_resource.title(), entry.base_name()); + EXPECT_EQ(file_resource.file_id(), entry.resource_id()); // The parent resource ID should be obtained as this is a sub directory // under a non-root directory. - EXPECT_EQ("folder:1_folder_resource_id", parent_resource_id); + EXPECT_EQ(parent.file_id(), parent_resource_id); EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); EXPECT_FALSE(entry.shared()); - // 2011-04-01T18:34:08.234Z - base::Time::Exploded exploded; - exploded.year = 2011; - exploded.month = 04; - exploded.day_of_month = 01; - exploded.day_of_week = 5; // Friday - exploded.hour = 18; - exploded.minute = 34; - exploded.second = 8; - exploded.millisecond = 234; - const base::Time expected_last_modified_time = - base::Time::FromUTCExploded(exploded); - - // 2010-11-07T05:03:54.719Z - exploded.year = 2010; - exploded.month = 11; - exploded.day_of_month = 7; - exploded.day_of_week = 0; // Sunday - exploded.hour = 5; - exploded.minute = 3; - exploded.second = 54; - exploded.millisecond = 719; - const base::Time expected_creation_time = - base::Time::FromUTCExploded(exploded); - - // 2011-11-02T04:37:38.469Z - exploded.year = 2011; - exploded.month = 11; - exploded.day_of_month = 2; - exploded.day_of_week = 2; // Tuesday - exploded.hour = 4; - exploded.minute = 37; - exploded.second = 38; - exploded.millisecond = 469; - const base::Time expected_last_accessed_time = - base::Time::FromUTCExploded(exploded); - - EXPECT_EQ(expected_last_modified_time.ToInternalValue(), + EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); - EXPECT_EQ(expected_last_accessed_time.ToInternalValue(), + EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), entry.file_info().last_accessed()); - EXPECT_EQ(expected_creation_time.ToInternalValue(), + EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); EXPECT_TRUE(entry.file_info().is_directory()); } TEST(ResourceEntryConversionTest, - ConvertToResourceEntry_DeletedHostedDocument) { - scoped_ptr value = - google_apis::test_util::LoadJSONFile( - "gdata/deleted_hosted_document_entry.json"); - ASSERT_TRUE(value.get()); - - scoped_ptr gdata_resource_entry( - google_apis::ResourceEntry::ExtractAndParse(*value)); - ASSERT_TRUE(gdata_resource_entry.get()); + ConvertFileResourceToResourceEntry_DeletedHostedDocument) { + google_apis::FileResource file_resource; + file_resource.set_title("Document 1"); + file_resource.set_file_id("resource_id"); + file_resource.set_created_date(GetTestTime()); + file_resource.set_modified_date( + GetTestTime() + base::TimeDelta::FromSeconds(10)); + file_resource.set_last_viewed_by_me_date( + GetTestTime() + base::TimeDelta::FromSeconds(20)); + file_resource.set_mime_type(util::kGoogleDocumentMimeType); + file_resource.set_alternate_link(GURL("https://file_link_alternate")); + file_resource.mutable_labels()->set_trashed(true); ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + file_resource, &entry, &parent_resource_id)); - EXPECT_EQ("Deleted document", entry.title()); - EXPECT_EQ("Deleted document.gdoc", entry.base_name()); - EXPECT_EQ("document:deleted_in_root_id", entry.resource_id()); + EXPECT_EQ(file_resource.title(), entry.title()); + EXPECT_EQ(file_resource.title() + ".gdoc", entry.base_name()); + EXPECT_EQ(file_resource.file_id(), entry.resource_id()); EXPECT_EQ("", parent_resource_id); EXPECT_TRUE(entry.deleted()); // The document was deleted. EXPECT_FALSE(entry.shared_with_me()); EXPECT_FALSE(entry.shared()); - // 2012-04-10T22:50:55.797Z - base::Time::Exploded exploded; - exploded.year = 2012; - exploded.month = 04; - exploded.day_of_month = 10; - exploded.day_of_week = 2; // Tuesday - exploded.hour = 22; - exploded.minute = 50; - exploded.second = 55; - exploded.millisecond = 797; - const base::Time expected_last_modified_time = - base::Time::FromUTCExploded(exploded); - - // 2012-04-10T22:50:53.237Z - exploded.year = 2012; - exploded.month = 04; - exploded.day_of_month = 10; - exploded.day_of_week = 2; // Tuesday - exploded.hour = 22; - exploded.minute = 50; - exploded.second = 53; - exploded.millisecond = 237; - const base::Time expected_creation_time = - base::Time::FromUTCExploded(exploded); - - // 2012-04-10T22:50:55.797Z - exploded.year = 2012; - exploded.month = 04; - exploded.day_of_month = 10; - exploded.day_of_week = 2; // Tuesday - exploded.hour = 22; - exploded.minute = 50; - exploded.second = 55; - exploded.millisecond = 797; - const base::Time expected_last_accessed_time = - base::Time::FromUTCExploded(exploded); - - EXPECT_EQ(expected_last_modified_time.ToInternalValue(), + EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); - EXPECT_EQ(expected_last_accessed_time.ToInternalValue(), + EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), entry.file_info().last_accessed()); - EXPECT_EQ(expected_creation_time.ToInternalValue(), + EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); - EXPECT_EQ("text/html", + EXPECT_EQ(file_resource.mime_type(), entry.file_specific_info().content_mime_type()); EXPECT_TRUE(entry.file_specific_info().is_hosted_document()); - EXPECT_EQ("https://alternate/document%3Adeleted_in_root_id/edit", + EXPECT_EQ(file_resource.alternate_link().spec(), entry.file_specific_info().alternate_url()); // The size should be 0 for a hosted document. EXPECT_EQ(0, entry.file_info().size()); } +TEST(ResourceEntryConversionTest, ConvertChangeResourceToResourceEntry) { + google_apis::ChangeResource change_resource; + change_resource.set_file(make_scoped_ptr(new google_apis::FileResource)); + change_resource.set_file_id("resource_id"); + change_resource.set_modification_date(GetTestTime()); + + google_apis::FileResource* file_resource = change_resource.mutable_file(); + file_resource->set_title("File 1.mp3"); + file_resource->set_file_id("resource_id"); + + ResourceEntry entry; + std::string parent_resource_id; + EXPECT_TRUE(ConvertChangeResourceToResourceEntry( + change_resource, &entry, &parent_resource_id)); + + EXPECT_EQ(change_resource.file_id(), entry.resource_id()); + EXPECT_EQ(change_resource.modification_date().ToInternalValue(), + entry.modification_date()); + + EXPECT_EQ(file_resource->title(), entry.title()); + EXPECT_EQ(file_resource->title(), entry.base_name()); + EXPECT_EQ("", parent_resource_id); + + EXPECT_FALSE(entry.deleted()); +} + +TEST(ResourceEntryConversionTest, + ConvertChangeResourceToResourceEntry_Trashed) { + google_apis::ChangeResource change_resource; + change_resource.set_file(make_scoped_ptr(new google_apis::FileResource)); + change_resource.set_file_id("resource_id"); + change_resource.set_modification_date(GetTestTime()); + + google_apis::FileResource* file_resource = change_resource.mutable_file(); + file_resource->set_title("File 1.mp3"); + file_resource->set_file_id("resource_id"); + file_resource->mutable_labels()->set_trashed(true); + + ResourceEntry entry; + std::string parent_resource_id; + EXPECT_TRUE(ConvertChangeResourceToResourceEntry( + change_resource, &entry, &parent_resource_id)); + + EXPECT_EQ(change_resource.file_id(), entry.resource_id()); + EXPECT_EQ(change_resource.modification_date().ToInternalValue(), + entry.modification_date()); + + EXPECT_EQ(file_resource->title(), entry.title()); + EXPECT_EQ(file_resource->title(), entry.base_name()); + EXPECT_EQ("", parent_resource_id); + + EXPECT_TRUE(entry.deleted()); +} + TEST(ResourceEntryConversionTest, - ConvertToResourceEntry_SharedWithMeEntry) { - scoped_ptr value = google_apis::test_util::LoadJSONFile( - "gdata/shared_with_me_entry.json"); - ASSERT_TRUE(value.get()); + ConvertChangeResourceToResourceEntry_Deleted) { + google_apis::ChangeResource change_resource; + change_resource.set_deleted(true); + change_resource.set_file_id("resource_id"); + change_resource.set_modification_date(GetTestTime()); - scoped_ptr gdata_resource_entry( - google_apis::ResourceEntry::ExtractAndParse(*value)); - ASSERT_TRUE(gdata_resource_entry.get()); + ResourceEntry entry; + std::string parent_resource_id; + EXPECT_TRUE(ConvertChangeResourceToResourceEntry( + change_resource, &entry, &parent_resource_id)); + + EXPECT_EQ(change_resource.file_id(), entry.resource_id()); + EXPECT_EQ("", parent_resource_id); + + EXPECT_TRUE(entry.deleted()); + + EXPECT_EQ(change_resource.modification_date().ToInternalValue(), + entry.modification_date()); +} + +TEST(ResourceEntryConversionTest, + ConvertFileResourceToResourceEntry_SharedWithMeEntry) { + google_apis::FileResource file_resource; + file_resource.set_shared(true); + file_resource.set_shared_with_me_date(GetTestTime()); ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + file_resource, &entry, &parent_resource_id)); EXPECT_TRUE(entry.shared_with_me()); EXPECT_TRUE(entry.shared()); } @@ -362,28 +320,25 @@ TEST(ResourceEntryConversionTest, ToPlatformFileInfo) { file_info.last_accessed); } -TEST(ResourceEntryConversionTest, ConvertToResourceEntry_ImageMediaMetadata) { - google_apis::ResourceEntry entry_all_fields; - google_apis::ResourceEntry entry_zero_fields; - google_apis::ResourceEntry entry_no_fields; - - entry_all_fields.set_image_width(640); - entry_all_fields.set_image_height(480); - entry_all_fields.set_image_rotation(90); - entry_all_fields.set_kind(google_apis::ENTRY_KIND_FILE); +TEST(ResourceEntryConversionTest, + ConvertFileResourceToResourceEntry_ImageMediaMetadata) { + google_apis::FileResource entry_all_fields; + google_apis::FileResource entry_zero_fields; + google_apis::FileResource entry_no_fields; - entry_zero_fields.set_image_width(0); - entry_zero_fields.set_image_height(0); - entry_zero_fields.set_image_rotation(0); - entry_zero_fields.set_kind(google_apis::ENTRY_KIND_FILE); + entry_all_fields.mutable_image_media_metadata()->set_width(640); + entry_all_fields.mutable_image_media_metadata()->set_height(480); + entry_all_fields.mutable_image_media_metadata()->set_rotation(90); - entry_no_fields.set_kind(google_apis::ENTRY_KIND_FILE); + entry_zero_fields.mutable_image_media_metadata()->set_width(0); + entry_zero_fields.mutable_image_media_metadata()->set_height(0); + entry_zero_fields.mutable_image_media_metadata()->set_rotation(0); { ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(entry_all_fields, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + entry_all_fields, &entry, &parent_resource_id)); EXPECT_EQ(640, entry.file_specific_info().image_width()); EXPECT_EQ(480, entry.file_specific_info().image_height()); EXPECT_EQ(90, entry.file_specific_info().image_rotation()); @@ -391,8 +346,8 @@ TEST(ResourceEntryConversionTest, ConvertToResourceEntry_ImageMediaMetadata) { { ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(entry_zero_fields, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + entry_zero_fields, &entry, &parent_resource_id)); EXPECT_TRUE(entry.file_specific_info().has_image_width()); EXPECT_TRUE(entry.file_specific_info().has_image_height()); EXPECT_TRUE(entry.file_specific_info().has_image_rotation()); @@ -403,8 +358,8 @@ TEST(ResourceEntryConversionTest, ConvertToResourceEntry_ImageMediaMetadata) { { ResourceEntry entry; std::string parent_resource_id; - EXPECT_TRUE(ConvertToResourceEntry(entry_no_fields, &entry, - &parent_resource_id)); + EXPECT_TRUE(ConvertFileResourceToResourceEntry( + entry_no_fields, &entry, &parent_resource_id)); EXPECT_FALSE(entry.file_specific_info().has_image_width()); EXPECT_FALSE(entry.file_specific_info().has_image_height()); EXPECT_FALSE(entry.file_specific_info().has_image_rotation()); diff --git a/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc b/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc index 753804d005b254..2dc5d2fa710a25 100644 --- a/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc +++ b/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc @@ -13,7 +13,6 @@ #include "chrome/browser/drive/drive_api_util.h" #include "content/public/browser/browser_thread.h" #include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/gdata_wapi_parser.h" using content::BrowserThread; @@ -31,9 +30,8 @@ FileError FinishRevert(ResourceMetadata* metadata, FileError error = GDataToFileError(status); switch (error) { case FILE_ERROR_OK: - if (!ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*file_resource), - &entry, &parent_resource_id)) + if (!ConvertFileResourceToResourceEntry(*file_resource, &entry, + &parent_resource_id)) return FILE_ERROR_NOT_A_FILE; break; diff --git a/chrome/browser/chromeos/drive/sync/remove_performer.cc b/chrome/browser/chromeos/drive/sync/remove_performer.cc index 9e6d4be3777f9a..701c0d8ad4dd57 100644 --- a/chrome/browser/chromeos/drive/sync/remove_performer.cc +++ b/chrome/browser/chromeos/drive/sync/remove_performer.cc @@ -15,7 +15,6 @@ #include "chrome/browser/drive/drive_api_util.h" #include "content/public/browser/browser_thread.h" #include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/gdata_wapi_parser.h" using content::BrowserThread; @@ -208,9 +207,8 @@ void RemovePerformer::UnparentResourceAfterGetFileResource( ResourceEntry entry; std::string parent_resource_id; - if (!ConvertToResourceEntry( - *util::ConvertFileResourceToResourceEntry(*file_resource), - &entry, &parent_resource_id)) { + if (!ConvertFileResourceToResourceEntry(*file_resource, &entry, + &parent_resource_id)) { callback.Run(FILE_ERROR_NOT_A_FILE); return; } diff --git a/google_apis/drive/gdata_wapi_parser.cc b/google_apis/drive/gdata_wapi_parser.cc index 261eb15b16b748..9c50e5ab524316 100644 --- a/google_apis/drive/gdata_wapi_parser.cc +++ b/google_apis/drive/gdata_wapi_parser.cc @@ -438,9 +438,10 @@ void ResourceEntry::RegisterJSONConverter( // ImageMediaMetadata fields are not supported by WAPI. } -std::string ResourceEntry::GetHostedDocumentExtension() const { +// static +std::string ResourceEntry::GetHostedDocumentExtension(DriveEntryKind kind) { for (size_t i = 0; i < arraysize(kEntryKindMap); i++) { - if (kEntryKindMap[i].kind == kind_) { + if (kEntryKindMap[i].kind == kind) { if (kEntryKindMap[i].extension) return std::string(kEntryKindMap[i].extension); else diff --git a/google_apis/drive/gdata_wapi_parser.h b/google_apis/drive/gdata_wapi_parser.h index 7d6cae7ee932d4..1081dbcf9cf7b5 100644 --- a/google_apis/drive/gdata_wapi_parser.h +++ b/google_apis/drive/gdata_wapi_parser.h @@ -420,7 +420,7 @@ class ResourceEntry : public CommonMetadata { // Returns preferred file extension for hosted documents. If entry is not // a hosted document, this call returns an empty string. - std::string GetHostedDocumentExtension() const; + static std::string GetHostedDocumentExtension(DriveEntryKind kind); // True if resource entry is remotely hosted. bool is_hosted_document() const {