// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/drive/resource_entry_conversion.h" #include "base/time/time.h" #include "components/drive/drive.pb.h" #include "components/drive/drive_api_util.h" #include "google_apis/drive/drive_api_parser.h" #include "testing/gtest/include/gtest/gtest.h" namespace drive { namespace { 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(ConvertFileResourceToResourceEntry( file_resource, &entry, &parent_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()); 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(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); EXPECT_EQ(file_resource.mime_type(), entry.file_specific_info().content_mime_type()); EXPECT_FALSE(entry.file_specific_info().is_hosted_document()); EXPECT_EQ(file_resource.alternate_link().spec(), entry.file_specific_info().alternate_url()); // Regular file specific fields. 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, 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")); // Do not set file size to represent a hosted document. ResourceEntry entry; std::string parent_resource_id; EXPECT_TRUE(ConvertFileResourceToResourceEntry( file_resource, &entry, &parent_resource_id)); 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(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()); EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), entry.file_info().last_accessed()); EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); EXPECT_EQ(file_resource.mime_type(), entry.file_specific_info().content_mime_type()); EXPECT_TRUE(entry.file_specific_info().is_hosted_document()); 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()); EXPECT_FALSE(entry.file_info().is_directory()); } TEST(ResourceEntryConversionTest, 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(ConvertFileResourceToResourceEntry( file_resource, &entry, &parent_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(parent.file_id(), parent_resource_id); EXPECT_FALSE(entry.deleted()); EXPECT_FALSE(entry.shared_with_me()); EXPECT_FALSE(entry.shared()); EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), entry.file_info().last_accessed()); EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); EXPECT_TRUE(entry.file_info().is_directory()); } TEST(ResourceEntryConversionTest, 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(ConvertFileResourceToResourceEntry( file_resource, &entry, &parent_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()); EXPECT_EQ(file_resource.modified_date().ToInternalValue(), entry.file_info().last_modified()); EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), entry.file_info().last_accessed()); EXPECT_EQ(file_resource.created_date().ToInternalValue(), entry.file_info().creation_time()); EXPECT_EQ(file_resource.mime_type(), entry.file_specific_info().content_mime_type()); EXPECT_TRUE(entry.file_specific_info().is_hosted_document()); 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"); // Set dummy file size to declare that this is a regular file. file_resource->set_file_size(12345); 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"); // Set dummy file size to declare that this is a regular file. file_resource->set_file_size(12345); 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, 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()); 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(ConvertFileResourceToResourceEntry( file_resource, &entry, &parent_resource_id)); EXPECT_TRUE(entry.shared_with_me()); EXPECT_TRUE(entry.shared()); } TEST(ResourceEntryConversionTest, ToPlatformFileInfo) { ResourceEntry entry; entry.mutable_file_info()->set_size(12345); entry.mutable_file_info()->set_is_directory(true); entry.mutable_file_info()->set_is_symbolic_link(true); entry.mutable_file_info()->set_creation_time(999); entry.mutable_file_info()->set_last_modified(123456789); entry.mutable_file_info()->set_last_accessed(987654321); base::File::Info file_info; ConvertResourceEntryToFileInfo(entry, &file_info); EXPECT_EQ(entry.file_info().size(), file_info.size); EXPECT_EQ(entry.file_info().is_directory(), file_info.is_directory); EXPECT_EQ(entry.file_info().is_symbolic_link(), file_info.is_symbolic_link); EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().creation_time()), file_info.creation_time); EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_modified()), file_info.last_modified); EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_accessed()), file_info.last_accessed); } TEST(ResourceEntryConversionTest, ConvertFileResourceToResourceEntry_ImageMediaMetadata) { google_apis::FileResource entry_all_fields; google_apis::FileResource entry_zero_fields; google_apis::FileResource entry_no_fields; 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_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(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()); } { ResourceEntry entry; std::string 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()); EXPECT_EQ(0, entry.file_specific_info().image_width()); EXPECT_EQ(0, entry.file_specific_info().image_height()); EXPECT_EQ(0, entry.file_specific_info().image_rotation()); } { ResourceEntry entry; std::string 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()); } } } // namespace drive