1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/drive/resource_entry_conversion.h" 6 7#include "base/time/time.h" 8#include "chrome/browser/chromeos/drive/drive.pb.h" 9#include "chrome/browser/drive/drive_api_util.h" 10#include "google_apis/drive/drive_api_parser.h" 11#include "testing/gtest/include/gtest/gtest.h" 12 13namespace drive { 14 15namespace { 16 17base::Time GetTestTime() { 18 // 2011-12-14-T00:40:47.330Z 19 base::Time::Exploded exploded; 20 exploded.year = 2011; 21 exploded.month = 12; 22 exploded.day_of_month = 14; 23 exploded.day_of_week = 2; // Tuesday 24 exploded.hour = 0; 25 exploded.minute = 40; 26 exploded.second = 47; 27 exploded.millisecond = 330; 28 return base::Time::FromUTCExploded(exploded); 29} 30 31} // namespace 32 33TEST(ResourceEntryConversionTest, ConvertToResourceEntry_File) { 34 google_apis::FileResource file_resource; 35 file_resource.set_title("File 1.mp3"); 36 file_resource.set_file_id("resource_id"); 37 file_resource.set_created_date(GetTestTime()); 38 file_resource.set_modified_date( 39 GetTestTime() + base::TimeDelta::FromSeconds(10)); 40 file_resource.set_mime_type("audio/mpeg"); 41 file_resource.set_alternate_link(GURL("https://file_link_alternate")); 42 file_resource.set_file_size(892721); 43 file_resource.set_md5_checksum("3b4382ebefec6e743578c76bbd0575ce"); 44 45 ResourceEntry entry; 46 std::string parent_resource_id; 47 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 48 file_resource, &entry, &parent_resource_id)); 49 50 EXPECT_EQ(file_resource.title(), entry.title()); 51 EXPECT_EQ(file_resource.title(), entry.base_name()); 52 EXPECT_EQ(file_resource.file_id(), entry.resource_id()); 53 EXPECT_EQ("", parent_resource_id); 54 55 EXPECT_FALSE(entry.deleted()); 56 EXPECT_FALSE(entry.shared_with_me()); 57 EXPECT_FALSE(entry.shared()); 58 59 EXPECT_EQ(file_resource.modified_date().ToInternalValue(), 60 entry.file_info().last_modified()); 61 // Last accessed value equal to 0 means that the file has never been viewed. 62 EXPECT_EQ(0, entry.file_info().last_accessed()); 63 EXPECT_EQ(file_resource.created_date().ToInternalValue(), 64 entry.file_info().creation_time()); 65 66 EXPECT_EQ(file_resource.mime_type(), 67 entry.file_specific_info().content_mime_type()); 68 EXPECT_FALSE(entry.file_specific_info().is_hosted_document()); 69 EXPECT_EQ(file_resource.alternate_link().spec(), 70 entry.file_specific_info().alternate_url()); 71 72 // Regular file specific fields. 73 EXPECT_EQ(file_resource.file_size(), entry.file_info().size()); 74 EXPECT_EQ(file_resource.md5_checksum(), entry.file_specific_info().md5()); 75 EXPECT_FALSE(entry.file_info().is_directory()); 76} 77 78TEST(ResourceEntryConversionTest, 79 ConvertFileResourceToResourceEntry_HostedDocument) { 80 google_apis::FileResource file_resource; 81 file_resource.set_title("Document 1"); 82 file_resource.set_file_id("resource_id"); 83 file_resource.set_created_date(GetTestTime()); 84 file_resource.set_modified_date( 85 GetTestTime() + base::TimeDelta::FromSeconds(10)); 86 file_resource.set_last_viewed_by_me_date( 87 GetTestTime() + base::TimeDelta::FromSeconds(20)); 88 file_resource.set_mime_type(util::kGoogleDocumentMimeType); 89 file_resource.set_alternate_link(GURL("https://file_link_alternate")); 90 91 ResourceEntry entry; 92 std::string parent_resource_id; 93 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 94 file_resource, &entry, &parent_resource_id)); 95 96 EXPECT_EQ(file_resource.title(), entry.title()); 97 EXPECT_EQ(file_resource.title() + ".gdoc", 98 entry.base_name()); // The suffix added. 99 EXPECT_EQ(".gdoc", entry.file_specific_info().document_extension()); 100 EXPECT_EQ(file_resource.file_id(), entry.resource_id()); 101 EXPECT_EQ("", parent_resource_id); 102 103 EXPECT_FALSE(entry.deleted()); 104 EXPECT_FALSE(entry.shared_with_me()); 105 EXPECT_FALSE(entry.shared()); 106 107 EXPECT_EQ(file_resource.modified_date().ToInternalValue(), 108 entry.file_info().last_modified()); 109 EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), 110 entry.file_info().last_accessed()); 111 EXPECT_EQ(file_resource.created_date().ToInternalValue(), 112 entry.file_info().creation_time()); 113 114 EXPECT_EQ(file_resource.mime_type(), 115 entry.file_specific_info().content_mime_type()); 116 EXPECT_TRUE(entry.file_specific_info().is_hosted_document()); 117 EXPECT_EQ(file_resource.alternate_link().spec(), 118 entry.file_specific_info().alternate_url()); 119 120 // The size should be 0 for a hosted document. 121 EXPECT_EQ(0, entry.file_info().size()); 122 EXPECT_FALSE(entry.file_info().is_directory()); 123} 124 125TEST(ResourceEntryConversionTest, 126 ConvertFileResourceToResourceEntry_Directory) { 127 google_apis::FileResource file_resource; 128 file_resource.set_title("Folder"); 129 file_resource.set_file_id("resource_id"); 130 file_resource.set_created_date(GetTestTime()); 131 file_resource.set_modified_date( 132 GetTestTime() + base::TimeDelta::FromSeconds(10)); 133 file_resource.set_last_viewed_by_me_date( 134 GetTestTime() + base::TimeDelta::FromSeconds(20)); 135 file_resource.set_mime_type(util::kDriveFolderMimeType); 136 137 google_apis::ParentReference parent; 138 parent.set_file_id("parent_resource_id"); 139 file_resource.mutable_parents()->push_back(parent); 140 141 ResourceEntry entry; 142 std::string parent_resource_id; 143 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 144 file_resource, &entry, &parent_resource_id)); 145 146 EXPECT_EQ(file_resource.title(), entry.title()); 147 EXPECT_EQ(file_resource.title(), entry.base_name()); 148 EXPECT_EQ(file_resource.file_id(), entry.resource_id()); 149 // The parent resource ID should be obtained as this is a sub directory 150 // under a non-root directory. 151 EXPECT_EQ(parent.file_id(), parent_resource_id); 152 153 EXPECT_FALSE(entry.deleted()); 154 EXPECT_FALSE(entry.shared_with_me()); 155 EXPECT_FALSE(entry.shared()); 156 157 EXPECT_EQ(file_resource.modified_date().ToInternalValue(), 158 entry.file_info().last_modified()); 159 EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), 160 entry.file_info().last_accessed()); 161 EXPECT_EQ(file_resource.created_date().ToInternalValue(), 162 entry.file_info().creation_time()); 163 164 EXPECT_TRUE(entry.file_info().is_directory()); 165} 166 167TEST(ResourceEntryConversionTest, 168 ConvertFileResourceToResourceEntry_DeletedHostedDocument) { 169 google_apis::FileResource file_resource; 170 file_resource.set_title("Document 1"); 171 file_resource.set_file_id("resource_id"); 172 file_resource.set_created_date(GetTestTime()); 173 file_resource.set_modified_date( 174 GetTestTime() + base::TimeDelta::FromSeconds(10)); 175 file_resource.set_last_viewed_by_me_date( 176 GetTestTime() + base::TimeDelta::FromSeconds(20)); 177 file_resource.set_mime_type(util::kGoogleDocumentMimeType); 178 file_resource.set_alternate_link(GURL("https://file_link_alternate")); 179 file_resource.mutable_labels()->set_trashed(true); 180 181 ResourceEntry entry; 182 std::string parent_resource_id; 183 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 184 file_resource, &entry, &parent_resource_id)); 185 186 EXPECT_EQ(file_resource.title(), entry.title()); 187 EXPECT_EQ(file_resource.title() + ".gdoc", entry.base_name()); 188 EXPECT_EQ(file_resource.file_id(), entry.resource_id()); 189 EXPECT_EQ("", parent_resource_id); 190 191 EXPECT_TRUE(entry.deleted()); // The document was deleted. 192 EXPECT_FALSE(entry.shared_with_me()); 193 EXPECT_FALSE(entry.shared()); 194 195 EXPECT_EQ(file_resource.modified_date().ToInternalValue(), 196 entry.file_info().last_modified()); 197 EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(), 198 entry.file_info().last_accessed()); 199 EXPECT_EQ(file_resource.created_date().ToInternalValue(), 200 entry.file_info().creation_time()); 201 202 EXPECT_EQ(file_resource.mime_type(), 203 entry.file_specific_info().content_mime_type()); 204 EXPECT_TRUE(entry.file_specific_info().is_hosted_document()); 205 EXPECT_EQ(file_resource.alternate_link().spec(), 206 entry.file_specific_info().alternate_url()); 207 208 // The size should be 0 for a hosted document. 209 EXPECT_EQ(0, entry.file_info().size()); 210} 211 212TEST(ResourceEntryConversionTest, ConvertChangeResourceToResourceEntry) { 213 google_apis::ChangeResource change_resource; 214 change_resource.set_file(make_scoped_ptr(new google_apis::FileResource)); 215 change_resource.set_file_id("resource_id"); 216 change_resource.set_modification_date(GetTestTime()); 217 218 google_apis::FileResource* file_resource = change_resource.mutable_file(); 219 file_resource->set_title("File 1.mp3"); 220 file_resource->set_file_id("resource_id"); 221 222 ResourceEntry entry; 223 std::string parent_resource_id; 224 EXPECT_TRUE(ConvertChangeResourceToResourceEntry( 225 change_resource, &entry, &parent_resource_id)); 226 227 EXPECT_EQ(change_resource.file_id(), entry.resource_id()); 228 EXPECT_EQ(change_resource.modification_date().ToInternalValue(), 229 entry.modification_date()); 230 231 EXPECT_EQ(file_resource->title(), entry.title()); 232 EXPECT_EQ(file_resource->title(), entry.base_name()); 233 EXPECT_EQ("", parent_resource_id); 234 235 EXPECT_FALSE(entry.deleted()); 236} 237 238TEST(ResourceEntryConversionTest, 239 ConvertChangeResourceToResourceEntry_Trashed) { 240 google_apis::ChangeResource change_resource; 241 change_resource.set_file(make_scoped_ptr(new google_apis::FileResource)); 242 change_resource.set_file_id("resource_id"); 243 change_resource.set_modification_date(GetTestTime()); 244 245 google_apis::FileResource* file_resource = change_resource.mutable_file(); 246 file_resource->set_title("File 1.mp3"); 247 file_resource->set_file_id("resource_id"); 248 file_resource->mutable_labels()->set_trashed(true); 249 250 ResourceEntry entry; 251 std::string parent_resource_id; 252 EXPECT_TRUE(ConvertChangeResourceToResourceEntry( 253 change_resource, &entry, &parent_resource_id)); 254 255 EXPECT_EQ(change_resource.file_id(), entry.resource_id()); 256 EXPECT_EQ(change_resource.modification_date().ToInternalValue(), 257 entry.modification_date()); 258 259 EXPECT_EQ(file_resource->title(), entry.title()); 260 EXPECT_EQ(file_resource->title(), entry.base_name()); 261 EXPECT_EQ("", parent_resource_id); 262 263 EXPECT_TRUE(entry.deleted()); 264} 265 266TEST(ResourceEntryConversionTest, 267 ConvertChangeResourceToResourceEntry_Deleted) { 268 google_apis::ChangeResource change_resource; 269 change_resource.set_deleted(true); 270 change_resource.set_file_id("resource_id"); 271 change_resource.set_modification_date(GetTestTime()); 272 273 ResourceEntry entry; 274 std::string parent_resource_id; 275 EXPECT_TRUE(ConvertChangeResourceToResourceEntry( 276 change_resource, &entry, &parent_resource_id)); 277 278 EXPECT_EQ(change_resource.file_id(), entry.resource_id()); 279 EXPECT_EQ("", parent_resource_id); 280 281 EXPECT_TRUE(entry.deleted()); 282 283 EXPECT_EQ(change_resource.modification_date().ToInternalValue(), 284 entry.modification_date()); 285} 286 287TEST(ResourceEntryConversionTest, 288 ConvertFileResourceToResourceEntry_SharedWithMeEntry) { 289 google_apis::FileResource file_resource; 290 file_resource.set_shared(true); 291 file_resource.set_shared_with_me_date(GetTestTime()); 292 293 ResourceEntry entry; 294 std::string parent_resource_id; 295 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 296 file_resource, &entry, &parent_resource_id)); 297 EXPECT_TRUE(entry.shared_with_me()); 298 EXPECT_TRUE(entry.shared()); 299} 300 301TEST(ResourceEntryConversionTest, ToPlatformFileInfo) { 302 ResourceEntry entry; 303 entry.mutable_file_info()->set_size(12345); 304 entry.mutable_file_info()->set_is_directory(true); 305 entry.mutable_file_info()->set_is_symbolic_link(true); 306 entry.mutable_file_info()->set_creation_time(999); 307 entry.mutable_file_info()->set_last_modified(123456789); 308 entry.mutable_file_info()->set_last_accessed(987654321); 309 310 base::File::Info file_info; 311 ConvertResourceEntryToFileInfo(entry, &file_info); 312 EXPECT_EQ(entry.file_info().size(), file_info.size); 313 EXPECT_EQ(entry.file_info().is_directory(), file_info.is_directory); 314 EXPECT_EQ(entry.file_info().is_symbolic_link(), file_info.is_symbolic_link); 315 EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().creation_time()), 316 file_info.creation_time); 317 EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_modified()), 318 file_info.last_modified); 319 EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_accessed()), 320 file_info.last_accessed); 321} 322 323TEST(ResourceEntryConversionTest, 324 ConvertFileResourceToResourceEntry_ImageMediaMetadata) { 325 google_apis::FileResource entry_all_fields; 326 google_apis::FileResource entry_zero_fields; 327 google_apis::FileResource entry_no_fields; 328 329 entry_all_fields.mutable_image_media_metadata()->set_width(640); 330 entry_all_fields.mutable_image_media_metadata()->set_height(480); 331 entry_all_fields.mutable_image_media_metadata()->set_rotation(90); 332 333 entry_zero_fields.mutable_image_media_metadata()->set_width(0); 334 entry_zero_fields.mutable_image_media_metadata()->set_height(0); 335 entry_zero_fields.mutable_image_media_metadata()->set_rotation(0); 336 337 { 338 ResourceEntry entry; 339 std::string parent_resource_id; 340 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 341 entry_all_fields, &entry, &parent_resource_id)); 342 EXPECT_EQ(640, entry.file_specific_info().image_width()); 343 EXPECT_EQ(480, entry.file_specific_info().image_height()); 344 EXPECT_EQ(90, entry.file_specific_info().image_rotation()); 345 } 346 { 347 ResourceEntry entry; 348 std::string parent_resource_id; 349 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 350 entry_zero_fields, &entry, &parent_resource_id)); 351 EXPECT_TRUE(entry.file_specific_info().has_image_width()); 352 EXPECT_TRUE(entry.file_specific_info().has_image_height()); 353 EXPECT_TRUE(entry.file_specific_info().has_image_rotation()); 354 EXPECT_EQ(0, entry.file_specific_info().image_width()); 355 EXPECT_EQ(0, entry.file_specific_info().image_height()); 356 EXPECT_EQ(0, entry.file_specific_info().image_rotation()); 357 } 358 { 359 ResourceEntry entry; 360 std::string parent_resource_id; 361 EXPECT_TRUE(ConvertFileResourceToResourceEntry( 362 entry_no_fields, &entry, &parent_resource_id)); 363 EXPECT_FALSE(entry.file_specific_info().has_image_width()); 364 EXPECT_FALSE(entry.file_specific_info().has_image_height()); 365 EXPECT_FALSE(entry.file_specific_info().has_image_rotation()); 366 } 367} 368 369} // namespace drive 370