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.
5 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
7 #include "base/files/file_path.h"
8 #include "base/time/time.h"
9 #include "base/values.h"
10 #include "chrome/browser/chromeos/drive/drive.pb.h"
11 #include "chrome/browser/chromeos/drive/file_system_util.h"
12 #include "chrome/browser/chromeos/drive/test_util.h"
13 #include "chrome/browser/google_apis/gdata_wapi_parser.h"
14 #include "testing/gtest/include/gtest/gtest.h"
18 TEST(ResourceEntryConversionTest, ConvertToResourceEntry_File) {
19 scoped_ptr<base::Value> value =
20 google_apis::test_util::LoadJSONFile("gdata/file_entry.json");
21 ASSERT_TRUE(value.get());
23 scoped_ptr<google_apis::ResourceEntry> gdata_resource_entry(
24 google_apis::ResourceEntry::ExtractAndParse(*value));
25 ASSERT_TRUE(gdata_resource_entry.get());
28 std::string parent_resource_id;
29 EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry,
30 &parent_resource_id));
32 EXPECT_EQ("File 1.mp3", entry.title());
33 EXPECT_EQ("File 1.mp3", entry.base_name());
34 EXPECT_EQ("file:2_file_resource_id", entry.resource_id());
35 EXPECT_EQ(util::kDriveOtherDirSpecialResourceId, parent_resource_id);
37 EXPECT_FALSE(entry.deleted());
38 EXPECT_FALSE(entry.shared_with_me());
40 base::Time expected_creation_time;
41 base::Time expected_modified_time;
44 // 2011-12-14T00:40:47.330Z
45 base::Time::Exploded exploded;
48 exploded.day_of_month = 13;
49 exploded.day_of_week = 2; // Tuesday
53 exploded.millisecond = 330;
54 expected_creation_time = base::Time::FromUTCExploded(exploded);
58 // 2011-12-13T00:40:47.330Z
59 base::Time::Exploded exploded;
62 exploded.day_of_month = 14;
63 exploded.day_of_week = 3; // Wednesday
67 exploded.millisecond = 330;
68 expected_modified_time = base::Time::FromUTCExploded(exploded);
71 EXPECT_EQ(expected_modified_time.ToInternalValue(),
72 entry.file_info().last_modified());
73 // Last accessed value equal to 0 means that the file has never been viewed.
74 EXPECT_EQ(0, entry.file_info().last_accessed());
75 EXPECT_EQ(expected_creation_time.ToInternalValue(),
76 entry.file_info().creation_time());
78 EXPECT_EQ("audio/mpeg",
79 entry.file_specific_info().content_mime_type());
80 EXPECT_FALSE(entry.file_specific_info().is_hosted_document());
81 EXPECT_EQ("https://file_link_alternate/",
82 entry.file_specific_info().alternate_url());
84 // Regular file specific fields.
85 EXPECT_EQ(892721, entry.file_info().size());
86 EXPECT_EQ("3b4382ebefec6e743578c76bbd0575ce",
87 entry.file_specific_info().md5());
88 EXPECT_FALSE(entry.file_info().is_directory());
91 TEST(ResourceEntryConversionTest,
92 ConvertToResourceEntry_HostedDocument) {
93 scoped_ptr<base::Value> value =
94 google_apis::test_util::LoadJSONFile(
95 "gdata/hosted_document_entry.json");
96 ASSERT_TRUE(value.get());
98 scoped_ptr<google_apis::ResourceEntry> gdata_resource_entry(
99 google_apis::ResourceEntry::ExtractAndParse(*value));
100 ASSERT_TRUE(gdata_resource_entry.get());
103 std::string parent_resource_id;
104 EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry,
105 &parent_resource_id));
107 EXPECT_EQ("Document 1", entry.title());
108 EXPECT_EQ("Document 1.gdoc", entry.base_name()); // The suffix added.
109 EXPECT_EQ(".gdoc", entry.file_specific_info().document_extension());
110 EXPECT_EQ("document:5_document_resource_id", entry.resource_id());
111 EXPECT_EQ(util::kDriveOtherDirSpecialResourceId, parent_resource_id);
113 EXPECT_FALSE(entry.deleted());
114 EXPECT_FALSE(entry.shared_with_me());
116 // 2011-12-12T23:28:52.783Z
117 base::Time::Exploded exploded;
118 exploded.year = 2011;
120 exploded.day_of_month = 12;
121 exploded.day_of_week = 1; // Monday
123 exploded.minute = 28;
124 exploded.second = 52;
125 exploded.millisecond = 783;
126 const base::Time expected_last_modified_time =
127 base::Time::FromUTCExploded(exploded);
129 // 2011-12-12T23:28:46.686Z
130 exploded.year = 2011;
132 exploded.day_of_month = 12;
133 exploded.day_of_week = 1; // Monday
135 exploded.minute = 28;
136 exploded.second = 46;
137 exploded.millisecond = 686;
138 const base::Time expected_creation_time =
139 base::Time::FromUTCExploded(exploded);
141 // 2011-12-13T02:12:18.527Z
142 exploded.year = 2011;
144 exploded.day_of_month = 13;
145 exploded.day_of_week = 2; // Tuesday
147 exploded.minute = 12;
148 exploded.second = 18;
149 exploded.millisecond = 527;
150 const base::Time expected_last_accessed_time =
151 base::Time::FromUTCExploded(exploded);
153 EXPECT_EQ(expected_last_modified_time.ToInternalValue(),
154 entry.file_info().last_modified());
155 EXPECT_EQ(expected_last_accessed_time.ToInternalValue(),
156 entry.file_info().last_accessed());
157 EXPECT_EQ(expected_creation_time.ToInternalValue(),
158 entry.file_info().creation_time());
160 EXPECT_EQ("text/html",
161 entry.file_specific_info().content_mime_type());
162 EXPECT_TRUE(entry.file_specific_info().is_hosted_document());
163 EXPECT_EQ("https://3_document_alternate_link/",
164 entry.file_specific_info().alternate_url());
166 // The size should be 0 for a hosted document.
167 EXPECT_EQ(0, entry.file_info().size());
168 EXPECT_FALSE(entry.file_info().is_directory());
171 TEST(ResourceEntryConversionTest,
172 ConvertToResourceEntry_Directory) {
173 scoped_ptr<base::Value> value =
174 google_apis::test_util::LoadJSONFile(
175 "gdata/directory_entry.json");
176 ASSERT_TRUE(value.get());
178 scoped_ptr<google_apis::ResourceEntry> gdata_resource_entry(
179 google_apis::ResourceEntry::ExtractAndParse(*value));
180 ASSERT_TRUE(gdata_resource_entry.get());
183 std::string parent_resource_id;
184 EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry,
185 &parent_resource_id));
187 EXPECT_EQ("Sub Directory Folder", entry.title());
188 EXPECT_EQ("Sub Directory Folder", entry.base_name());
189 EXPECT_EQ("folder:sub_dir_folder_resource_id", entry.resource_id());
190 // The parent resource ID should be obtained as this is a sub directory
191 // under a non-root directory.
192 EXPECT_EQ("folder:1_folder_resource_id", parent_resource_id);
194 EXPECT_FALSE(entry.deleted());
195 EXPECT_FALSE(entry.shared_with_me());
197 // 2011-04-01T18:34:08.234Z
198 base::Time::Exploded exploded;
199 exploded.year = 2011;
201 exploded.day_of_month = 01;
202 exploded.day_of_week = 5; // Friday
204 exploded.minute = 34;
206 exploded.millisecond = 234;
207 const base::Time expected_last_modified_time =
208 base::Time::FromUTCExploded(exploded);
210 // 2010-11-07T05:03:54.719Z
211 exploded.year = 2010;
213 exploded.day_of_month = 7;
214 exploded.day_of_week = 0; // Sunday
217 exploded.second = 54;
218 exploded.millisecond = 719;
219 const base::Time expected_creation_time =
220 base::Time::FromUTCExploded(exploded);
222 // 2011-11-02T04:37:38.469Z
223 exploded.year = 2011;
225 exploded.day_of_month = 2;
226 exploded.day_of_week = 2; // Tuesday
228 exploded.minute = 37;
229 exploded.second = 38;
230 exploded.millisecond = 469;
231 const base::Time expected_last_accessed_time =
232 base::Time::FromUTCExploded(exploded);
234 EXPECT_EQ(expected_last_modified_time.ToInternalValue(),
235 entry.file_info().last_modified());
236 EXPECT_EQ(expected_last_accessed_time.ToInternalValue(),
237 entry.file_info().last_accessed());
238 EXPECT_EQ(expected_creation_time.ToInternalValue(),
239 entry.file_info().creation_time());
241 EXPECT_TRUE(entry.file_info().is_directory());
244 TEST(ResourceEntryConversionTest,
245 ConvertToResourceEntry_DeletedHostedDocument) {
246 scoped_ptr<base::Value> value =
247 google_apis::test_util::LoadJSONFile(
248 "gdata/deleted_hosted_document_entry.json");
249 ASSERT_TRUE(value.get());
251 scoped_ptr<google_apis::ResourceEntry> gdata_resource_entry(
252 google_apis::ResourceEntry::ExtractAndParse(*value));
253 ASSERT_TRUE(gdata_resource_entry.get());
256 std::string parent_resource_id;
257 EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry,
258 &parent_resource_id));
260 EXPECT_EQ("Deleted document", entry.title());
261 EXPECT_EQ("Deleted document.gdoc", entry.base_name());
262 EXPECT_EQ("document:deleted_in_root_id", entry.resource_id());
263 EXPECT_EQ(util::kDriveOtherDirSpecialResourceId, parent_resource_id);
265 EXPECT_TRUE(entry.deleted()); // The document was deleted.
266 EXPECT_FALSE(entry.shared_with_me());
268 // 2012-04-10T22:50:55.797Z
269 base::Time::Exploded exploded;
270 exploded.year = 2012;
272 exploded.day_of_month = 10;
273 exploded.day_of_week = 2; // Tuesday
275 exploded.minute = 50;
276 exploded.second = 55;
277 exploded.millisecond = 797;
278 const base::Time expected_last_modified_time =
279 base::Time::FromUTCExploded(exploded);
281 // 2012-04-10T22:50:53.237Z
282 exploded.year = 2012;
284 exploded.day_of_month = 10;
285 exploded.day_of_week = 2; // Tuesday
287 exploded.minute = 50;
288 exploded.second = 53;
289 exploded.millisecond = 237;
290 const base::Time expected_creation_time =
291 base::Time::FromUTCExploded(exploded);
293 // 2012-04-10T22:50:55.797Z
294 exploded.year = 2012;
296 exploded.day_of_month = 10;
297 exploded.day_of_week = 2; // Tuesday
299 exploded.minute = 50;
300 exploded.second = 55;
301 exploded.millisecond = 797;
302 const base::Time expected_last_accessed_time =
303 base::Time::FromUTCExploded(exploded);
305 EXPECT_EQ(expected_last_modified_time.ToInternalValue(),
306 entry.file_info().last_modified());
307 EXPECT_EQ(expected_last_accessed_time.ToInternalValue(),
308 entry.file_info().last_accessed());
309 EXPECT_EQ(expected_creation_time.ToInternalValue(),
310 entry.file_info().creation_time());
312 EXPECT_EQ("text/html",
313 entry.file_specific_info().content_mime_type());
314 EXPECT_TRUE(entry.file_specific_info().is_hosted_document());
315 EXPECT_EQ("https://alternate/document%3Adeleted_in_root_id/edit",
316 entry.file_specific_info().alternate_url());
318 // The size should be 0 for a hosted document.
319 EXPECT_EQ(0, entry.file_info().size());
322 TEST(ResourceEntryConversionTest,
323 ConvertToResourceEntry_SharedWithMeEntry) {
324 scoped_ptr<base::Value> value = google_apis::test_util::LoadJSONFile(
325 "gdata/shared_with_me_entry.json");
326 ASSERT_TRUE(value.get());
328 scoped_ptr<google_apis::ResourceEntry> gdata_resource_entry(
329 google_apis::ResourceEntry::ExtractAndParse(*value));
330 ASSERT_TRUE(gdata_resource_entry.get());
333 std::string parent_resource_id;
334 EXPECT_TRUE(ConvertToResourceEntry(*gdata_resource_entry, &entry,
335 &parent_resource_id));
336 EXPECT_TRUE(entry.shared_with_me());
339 TEST(ResourceEntryConversionTest, ToPlatformFileInfo) {
341 entry.mutable_file_info()->set_size(12345);
342 entry.mutable_file_info()->set_is_directory(true);
343 entry.mutable_file_info()->set_is_symbolic_link(true);
344 entry.mutable_file_info()->set_creation_time(999);
345 entry.mutable_file_info()->set_last_modified(123456789);
346 entry.mutable_file_info()->set_last_accessed(987654321);
348 base::PlatformFileInfo file_info;
349 ConvertResourceEntryToPlatformFileInfo(entry, &file_info);
350 EXPECT_EQ(entry.file_info().size(), file_info.size);
351 EXPECT_EQ(entry.file_info().is_directory(), file_info.is_directory);
352 EXPECT_EQ(entry.file_info().is_symbolic_link(), file_info.is_symbolic_link);
353 EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().creation_time()),
354 file_info.creation_time);
355 EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_modified()),
356 file_info.last_modified);
357 EXPECT_EQ(base::Time::FromInternalValue(entry.file_info().last_accessed()),
358 file_info.last_accessed);
361 TEST(ResourceEntryConversionTest, FromPlatformFileInfo) {
362 base::PlatformFileInfo file_info;
363 file_info.size = 12345;
364 file_info.is_directory = true;
365 file_info.is_symbolic_link = true;
366 file_info.last_modified =
367 base::Time::UnixEpoch() + base::TimeDelta::FromDays(999);
368 file_info.last_accessed =
369 base::Time::UnixEpoch() + base::TimeDelta::FromDays(12345);
370 file_info.creation_time =
371 base::Time::UnixEpoch() + base::TimeDelta::FromDays(54321);
374 SetPlatformFileInfoToResourceEntry(file_info, &entry);
376 EXPECT_EQ(file_info.size, entry.file_info().size());
377 EXPECT_EQ(file_info.is_directory, entry.file_info().is_directory());
378 EXPECT_EQ(file_info.is_symbolic_link, entry.file_info().is_symbolic_link());
379 EXPECT_EQ(file_info.creation_time,
380 base::Time::FromInternalValue(entry.file_info().creation_time()));
381 EXPECT_EQ(file_info.last_modified,
382 base::Time::FromInternalValue(entry.file_info().last_modified()));
383 EXPECT_EQ(file_info.last_accessed,
384 base::Time::FromInternalValue(entry.file_info().last_accessed()));
387 TEST(ResourceEntryConversionTest, ConvertToResourceEntry_ImageMediaMetadata) {
388 google_apis::ResourceEntry entry_all_fields;
389 google_apis::ResourceEntry entry_zero_fields;
390 google_apis::ResourceEntry entry_no_fields;
392 entry_all_fields.set_image_width(640);
393 entry_all_fields.set_image_height(480);
394 entry_all_fields.set_image_rotation(90);
395 entry_all_fields.set_kind(google_apis::ENTRY_KIND_FILE);
397 entry_zero_fields.set_image_width(0);
398 entry_zero_fields.set_image_height(0);
399 entry_zero_fields.set_image_rotation(0);
400 entry_zero_fields.set_kind(google_apis::ENTRY_KIND_FILE);
402 entry_no_fields.set_kind(google_apis::ENTRY_KIND_FILE);
406 std::string parent_resource_id;
407 EXPECT_TRUE(ConvertToResourceEntry(entry_all_fields, &entry,
408 &parent_resource_id));
409 EXPECT_EQ(640, entry.file_specific_info().image_width());
410 EXPECT_EQ(480, entry.file_specific_info().image_height());
411 EXPECT_EQ(90, entry.file_specific_info().image_rotation());
415 std::string parent_resource_id;
416 EXPECT_TRUE(ConvertToResourceEntry(entry_zero_fields, &entry,
417 &parent_resource_id));
418 EXPECT_TRUE(entry.file_specific_info().has_image_width());
419 EXPECT_TRUE(entry.file_specific_info().has_image_height());
420 EXPECT_TRUE(entry.file_specific_info().has_image_rotation());
421 EXPECT_EQ(0, entry.file_specific_info().image_width());
422 EXPECT_EQ(0, entry.file_specific_info().image_height());
423 EXPECT_EQ(0, entry.file_specific_info().image_rotation());
427 std::string parent_resource_id;
428 EXPECT_TRUE(ConvertToResourceEntry(entry_no_fields, &entry,
429 &parent_resource_id));
430 EXPECT_FALSE(entry.file_specific_info().has_image_width());
431 EXPECT_FALSE(entry.file_specific_info().has_image_height());
432 EXPECT_FALSE(entry.file_specific_info().has_image_rotation());