Home | History | Annotate | Download | only in drive
      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 
     13 namespace drive {
     14 
     15 namespace {
     16 
     17 base::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 
     33 TEST(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 
     78 TEST(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   // Do not set file size to represent a hosted document.
     91 
     92   ResourceEntry entry;
     93   std::string parent_resource_id;
     94   EXPECT_TRUE(ConvertFileResourceToResourceEntry(
     95       file_resource, &entry, &parent_resource_id));
     96 
     97   EXPECT_EQ(file_resource.title(), entry.title());
     98   EXPECT_EQ(file_resource.title() + ".gdoc",
     99             entry.base_name());  // The suffix added.
    100   EXPECT_EQ(".gdoc", entry.file_specific_info().document_extension());
    101   EXPECT_EQ(file_resource.file_id(), entry.resource_id());
    102   EXPECT_EQ("", parent_resource_id);
    103 
    104   EXPECT_FALSE(entry.deleted());
    105   EXPECT_FALSE(entry.shared_with_me());
    106   EXPECT_FALSE(entry.shared());
    107 
    108   EXPECT_EQ(file_resource.modified_date().ToInternalValue(),
    109             entry.file_info().last_modified());
    110   EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(),
    111             entry.file_info().last_accessed());
    112   EXPECT_EQ(file_resource.created_date().ToInternalValue(),
    113             entry.file_info().creation_time());
    114 
    115   EXPECT_EQ(file_resource.mime_type(),
    116             entry.file_specific_info().content_mime_type());
    117   EXPECT_TRUE(entry.file_specific_info().is_hosted_document());
    118   EXPECT_EQ(file_resource.alternate_link().spec(),
    119             entry.file_specific_info().alternate_url());
    120 
    121   // The size should be 0 for a hosted document.
    122   EXPECT_EQ(0, entry.file_info().size());
    123   EXPECT_FALSE(entry.file_info().is_directory());
    124 }
    125 
    126 TEST(ResourceEntryConversionTest,
    127      ConvertFileResourceToResourceEntry_Directory) {
    128   google_apis::FileResource file_resource;
    129   file_resource.set_title("Folder");
    130   file_resource.set_file_id("resource_id");
    131   file_resource.set_created_date(GetTestTime());
    132   file_resource.set_modified_date(
    133       GetTestTime() + base::TimeDelta::FromSeconds(10));
    134   file_resource.set_last_viewed_by_me_date(
    135       GetTestTime() + base::TimeDelta::FromSeconds(20));
    136   file_resource.set_mime_type(util::kDriveFolderMimeType);
    137 
    138   google_apis::ParentReference parent;
    139   parent.set_file_id("parent_resource_id");
    140   file_resource.mutable_parents()->push_back(parent);
    141 
    142   ResourceEntry entry;
    143   std::string parent_resource_id;
    144   EXPECT_TRUE(ConvertFileResourceToResourceEntry(
    145       file_resource, &entry, &parent_resource_id));
    146 
    147   EXPECT_EQ(file_resource.title(), entry.title());
    148   EXPECT_EQ(file_resource.title(), entry.base_name());
    149   EXPECT_EQ(file_resource.file_id(), entry.resource_id());
    150   // The parent resource ID should be obtained as this is a sub directory
    151   // under a non-root directory.
    152   EXPECT_EQ(parent.file_id(), parent_resource_id);
    153 
    154   EXPECT_FALSE(entry.deleted());
    155   EXPECT_FALSE(entry.shared_with_me());
    156   EXPECT_FALSE(entry.shared());
    157 
    158   EXPECT_EQ(file_resource.modified_date().ToInternalValue(),
    159             entry.file_info().last_modified());
    160   EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(),
    161             entry.file_info().last_accessed());
    162   EXPECT_EQ(file_resource.created_date().ToInternalValue(),
    163             entry.file_info().creation_time());
    164 
    165   EXPECT_TRUE(entry.file_info().is_directory());
    166 }
    167 
    168 TEST(ResourceEntryConversionTest,
    169      ConvertFileResourceToResourceEntry_DeletedHostedDocument) {
    170   google_apis::FileResource file_resource;
    171   file_resource.set_title("Document 1");
    172   file_resource.set_file_id("resource_id");
    173   file_resource.set_created_date(GetTestTime());
    174   file_resource.set_modified_date(
    175       GetTestTime() + base::TimeDelta::FromSeconds(10));
    176   file_resource.set_last_viewed_by_me_date(
    177       GetTestTime() + base::TimeDelta::FromSeconds(20));
    178   file_resource.set_mime_type(util::kGoogleDocumentMimeType);
    179   file_resource.set_alternate_link(GURL("https://file_link_alternate"));
    180   file_resource.mutable_labels()->set_trashed(true);
    181 
    182   ResourceEntry entry;
    183   std::string parent_resource_id;
    184   EXPECT_TRUE(ConvertFileResourceToResourceEntry(
    185       file_resource, &entry, &parent_resource_id));
    186 
    187   EXPECT_EQ(file_resource.title(), entry.title());
    188   EXPECT_EQ(file_resource.title() + ".gdoc", entry.base_name());
    189   EXPECT_EQ(file_resource.file_id(), entry.resource_id());
    190   EXPECT_EQ("", parent_resource_id);
    191 
    192   EXPECT_TRUE(entry.deleted());  // The document was deleted.
    193   EXPECT_FALSE(entry.shared_with_me());
    194   EXPECT_FALSE(entry.shared());
    195 
    196   EXPECT_EQ(file_resource.modified_date().ToInternalValue(),
    197             entry.file_info().last_modified());
    198   EXPECT_EQ(file_resource.last_viewed_by_me_date().ToInternalValue(),
    199             entry.file_info().last_accessed());
    200   EXPECT_EQ(file_resource.created_date().ToInternalValue(),
    201             entry.file_info().creation_time());
    202 
    203   EXPECT_EQ(file_resource.mime_type(),
    204             entry.file_specific_info().content_mime_type());
    205   EXPECT_TRUE(entry.file_specific_info().is_hosted_document());
    206   EXPECT_EQ(file_resource.alternate_link().spec(),
    207             entry.file_specific_info().alternate_url());
    208 
    209   // The size should be 0 for a hosted document.
    210   EXPECT_EQ(0, entry.file_info().size());
    211 }
    212 
    213 TEST(ResourceEntryConversionTest, ConvertChangeResourceToResourceEntry) {
    214   google_apis::ChangeResource change_resource;
    215   change_resource.set_file(make_scoped_ptr(new google_apis::FileResource));
    216   change_resource.set_file_id("resource_id");
    217   change_resource.set_modification_date(GetTestTime());
    218 
    219   google_apis::FileResource* file_resource = change_resource.mutable_file();
    220   file_resource->set_title("File 1.mp3");
    221   file_resource->set_file_id("resource_id");
    222   // Set dummy file size to declare that this is a regular file.
    223   file_resource->set_file_size(12345);
    224 
    225   ResourceEntry entry;
    226   std::string parent_resource_id;
    227   EXPECT_TRUE(ConvertChangeResourceToResourceEntry(
    228       change_resource, &entry, &parent_resource_id));
    229 
    230   EXPECT_EQ(change_resource.file_id(), entry.resource_id());
    231   EXPECT_EQ(change_resource.modification_date().ToInternalValue(),
    232             entry.modification_date());
    233 
    234   EXPECT_EQ(file_resource->title(), entry.title());
    235   EXPECT_EQ(file_resource->title(), entry.base_name());
    236   EXPECT_EQ("", parent_resource_id);
    237 
    238   EXPECT_FALSE(entry.deleted());
    239 }
    240 
    241 TEST(ResourceEntryConversionTest,
    242      ConvertChangeResourceToResourceEntry_Trashed) {
    243   google_apis::ChangeResource change_resource;
    244   change_resource.set_file(make_scoped_ptr(new google_apis::FileResource));
    245   change_resource.set_file_id("resource_id");
    246   change_resource.set_modification_date(GetTestTime());
    247 
    248   google_apis::FileResource* file_resource = change_resource.mutable_file();
    249   file_resource->set_title("File 1.mp3");
    250   file_resource->set_file_id("resource_id");
    251   // Set dummy file size to declare that this is a regular file.
    252   file_resource->set_file_size(12345);
    253   file_resource->mutable_labels()->set_trashed(true);
    254 
    255   ResourceEntry entry;
    256   std::string parent_resource_id;
    257   EXPECT_TRUE(ConvertChangeResourceToResourceEntry(
    258       change_resource, &entry, &parent_resource_id));
    259 
    260   EXPECT_EQ(change_resource.file_id(), entry.resource_id());
    261   EXPECT_EQ(change_resource.modification_date().ToInternalValue(),
    262             entry.modification_date());
    263 
    264   EXPECT_EQ(file_resource->title(), entry.title());
    265   EXPECT_EQ(file_resource->title(), entry.base_name());
    266   EXPECT_EQ("", parent_resource_id);
    267 
    268   EXPECT_TRUE(entry.deleted());
    269 }
    270 
    271 TEST(ResourceEntryConversionTest,
    272      ConvertChangeResourceToResourceEntry_Deleted) {
    273   google_apis::ChangeResource change_resource;
    274   change_resource.set_deleted(true);
    275   change_resource.set_file_id("resource_id");
    276   change_resource.set_modification_date(GetTestTime());
    277 
    278   ResourceEntry entry;
    279   std::string parent_resource_id;
    280   EXPECT_TRUE(ConvertChangeResourceToResourceEntry(
    281       change_resource, &entry, &parent_resource_id));
    282 
    283   EXPECT_EQ(change_resource.file_id(), entry.resource_id());
    284   EXPECT_EQ("", parent_resource_id);
    285 
    286   EXPECT_TRUE(entry.deleted());
    287 
    288   EXPECT_EQ(change_resource.modification_date().ToInternalValue(),
    289             entry.modification_date());
    290 }
    291 
    292 TEST(ResourceEntryConversionTest,
    293      ConvertFileResourceToResourceEntry_SharedWithMeEntry) {
    294   google_apis::FileResource file_resource;
    295   file_resource.set_shared(true);
    296   file_resource.set_shared_with_me_date(GetTestTime());
    297 
    298   ResourceEntry entry;
    299   std::string parent_resource_id;
    300   EXPECT_TRUE(ConvertFileResourceToResourceEntry(
    301       file_resource, &entry, &parent_resource_id));
    302   EXPECT_TRUE(entry.shared_with_me());
    303   EXPECT_TRUE(entry.shared());
    304 }
    305 
    306 TEST(ResourceEntryConversionTest, ToPlatformFileInfo) {
    307   ResourceEntry entry;
    308   entry.mutable_file_info()->set_size(12345);
    309   entry.mutable_file_info()->set_is_directory(true);
    310   entry.mutable_file_info()->set_is_symbolic_link(true);
    311   entry.mutable_file_info()->set_creation_time(999);
    312   entry.mutable_file_info()->set_last_modified(123456789);
    313   entry.mutable_file_info()->set_last_accessed(987654321);
    314 
    315   base::File::Info file_info;
    316   ConvertResourceEntryToFileInfo(entry, &file_info);
    317   EXPECT_EQ(entry.file_info().size(), file_info.size);
    318   EXPECT_EQ(entry.file_info().is_directory(), file_info.is_directory);
    319   EXPECT_EQ(entry.file_info().is_symbolic_link(), file_info.is_symbolic_link);
    320   EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().creation_time()),
    321             file_info.creation_time);
    322   EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_modified()),
    323             file_info.last_modified);
    324   EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_accessed()),
    325             file_info.last_accessed);
    326 }
    327 
    328 TEST(ResourceEntryConversionTest,
    329      ConvertFileResourceToResourceEntry_ImageMediaMetadata) {
    330   google_apis::FileResource entry_all_fields;
    331   google_apis::FileResource entry_zero_fields;
    332   google_apis::FileResource entry_no_fields;
    333 
    334   entry_all_fields.mutable_image_media_metadata()->set_width(640);
    335   entry_all_fields.mutable_image_media_metadata()->set_height(480);
    336   entry_all_fields.mutable_image_media_metadata()->set_rotation(90);
    337 
    338   entry_zero_fields.mutable_image_media_metadata()->set_width(0);
    339   entry_zero_fields.mutable_image_media_metadata()->set_height(0);
    340   entry_zero_fields.mutable_image_media_metadata()->set_rotation(0);
    341 
    342   {
    343     ResourceEntry entry;
    344     std::string parent_resource_id;
    345     EXPECT_TRUE(ConvertFileResourceToResourceEntry(
    346         entry_all_fields, &entry, &parent_resource_id));
    347     EXPECT_EQ(640, entry.file_specific_info().image_width());
    348     EXPECT_EQ(480, entry.file_specific_info().image_height());
    349     EXPECT_EQ(90, entry.file_specific_info().image_rotation());
    350   }
    351   {
    352     ResourceEntry entry;
    353     std::string parent_resource_id;
    354     EXPECT_TRUE(ConvertFileResourceToResourceEntry(
    355         entry_zero_fields, &entry, &parent_resource_id));
    356     EXPECT_TRUE(entry.file_specific_info().has_image_width());
    357     EXPECT_TRUE(entry.file_specific_info().has_image_height());
    358     EXPECT_TRUE(entry.file_specific_info().has_image_rotation());
    359     EXPECT_EQ(0, entry.file_specific_info().image_width());
    360     EXPECT_EQ(0, entry.file_specific_info().image_height());
    361     EXPECT_EQ(0, entry.file_specific_info().image_rotation());
    362   }
    363   {
    364     ResourceEntry entry;
    365     std::string parent_resource_id;
    366     EXPECT_TRUE(ConvertFileResourceToResourceEntry(
    367         entry_no_fields, &entry, &parent_resource_id));
    368     EXPECT_FALSE(entry.file_specific_info().has_image_width());
    369     EXPECT_FALSE(entry.file_specific_info().has_image_height());
    370     EXPECT_FALSE(entry.file_specific_info().has_image_rotation());
    371   }
    372 }
    373 
    374 }  // namespace drive
    375