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