Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(523)

Side by Side Diff: components/filesystem/file_impl_unittest.cc

Issue 1147083002: mandoline: Fork the files service from the mojo repository. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: I think the problem was in the mandoline build.gn Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/filesystem/file_impl.cc ('k') | components/filesystem/files_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 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 <vector>
6
7 #include "components/filesystem/files_test_base.h"
8 #include "mojo/public/cpp/bindings/interface_request.h"
9 #include "mojo/public/cpp/bindings/type_converter.h"
10
11 namespace mojo {
12 namespace files {
13 namespace {
14
15 using FileImplTest = FilesTestBase;
16
17 TEST_F(FileImplTest, CreateWriteCloseRenameOpenRead) {
18 DirectoryPtr directory;
19 GetTemporaryRoot(&directory);
20 Error error;
21
22 {
23 // Create my_file.
24 FilePtr file;
25 error = ERROR_INTERNAL;
26 directory->OpenFile("my_file", GetProxy(&file),
27 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
28 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
29 EXPECT_EQ(ERROR_OK, error);
30
31 // Write to it.
32 std::vector<uint8_t> bytes_to_write;
33 bytes_to_write.push_back(static_cast<uint8_t>('h'));
34 bytes_to_write.push_back(static_cast<uint8_t>('e'));
35 bytes_to_write.push_back(static_cast<uint8_t>('l'));
36 bytes_to_write.push_back(static_cast<uint8_t>('l'));
37 bytes_to_write.push_back(static_cast<uint8_t>('o'));
38 error = ERROR_INTERNAL;
39 uint32_t num_bytes_written = 0;
40 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
41 Capture(&error, &num_bytes_written));
42 ASSERT_TRUE(file.WaitForIncomingMethodCall());
43 EXPECT_EQ(ERROR_OK, error);
44 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
45
46 // Close it.
47 error = ERROR_INTERNAL;
48 file->Close(Capture(&error));
49 ASSERT_TRUE(file.WaitForIncomingMethodCall());
50 EXPECT_EQ(ERROR_OK, error);
51 }
52
53 // Rename it.
54 error = ERROR_INTERNAL;
55 directory->Rename("my_file", "your_file", Capture(&error));
56 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
57 EXPECT_EQ(ERROR_OK, error);
58
59 {
60 // Open my_file again.
61 FilePtr file;
62 error = ERROR_INTERNAL;
63 directory->OpenFile("your_file", GetProxy(&file), kOpenFlagRead,
64 Capture(&error));
65 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
66 EXPECT_EQ(ERROR_OK, error);
67
68 // Read from it.
69 Array<uint8_t> bytes_read;
70 error = ERROR_INTERNAL;
71 file->Read(3, 1, WHENCE_FROM_START, Capture(&error, &bytes_read));
72 ASSERT_TRUE(file.WaitForIncomingMethodCall());
73 EXPECT_EQ(ERROR_OK, error);
74 ASSERT_EQ(3u, bytes_read.size());
75 EXPECT_EQ(static_cast<uint8_t>('e'), bytes_read[0]);
76 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[1]);
77 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[2]);
78 }
79
80 // TODO(vtl): Test read/write offset options.
81 }
82
83 TEST_F(FileImplTest, CantWriteInReadMode) {
84 DirectoryPtr directory;
85 GetTemporaryRoot(&directory);
86 Error error;
87
88 std::vector<uint8_t> bytes_to_write;
89 bytes_to_write.push_back(static_cast<uint8_t>('h'));
90 bytes_to_write.push_back(static_cast<uint8_t>('e'));
91 bytes_to_write.push_back(static_cast<uint8_t>('l'));
92 bytes_to_write.push_back(static_cast<uint8_t>('l'));
93 bytes_to_write.push_back(static_cast<uint8_t>('o'));
94
95 {
96 // Create my_file.
97 FilePtr file;
98 error = ERROR_INTERNAL;
99 directory->OpenFile("my_file", GetProxy(&file),
100 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
101 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
102 EXPECT_EQ(ERROR_OK, error);
103
104 // Write to it.
105 error = ERROR_INTERNAL;
106 uint32_t num_bytes_written = 0;
107 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
108 Capture(&error, &num_bytes_written));
109 ASSERT_TRUE(file.WaitForIncomingMethodCall());
110 EXPECT_EQ(ERROR_OK, error);
111 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
112
113 // Close it.
114 error = ERROR_INTERNAL;
115 file->Close(Capture(&error));
116 ASSERT_TRUE(file.WaitForIncomingMethodCall());
117 EXPECT_EQ(ERROR_OK, error);
118 }
119
120 {
121 // Open my_file again, this time with read only mode.
122 FilePtr file;
123 error = ERROR_INTERNAL;
124 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead,
125 Capture(&error));
126 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
127 EXPECT_EQ(ERROR_OK, error);
128
129 // Try to write in read mode; it should fail.
130 error = ERROR_INTERNAL;
131 uint32_t num_bytes_written = 0;
132 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
133 Capture(&error, &num_bytes_written));
134 ASSERT_TRUE(file.WaitForIncomingMethodCall());
135 EXPECT_EQ(ERROR_UNKNOWN, error);
136 EXPECT_EQ(0u, num_bytes_written);
137
138 // Close it.
139 error = ERROR_INTERNAL;
140 file->Close(Capture(&error));
141 ASSERT_TRUE(file.WaitForIncomingMethodCall());
142 EXPECT_EQ(ERROR_OK, error);
143 }
144 }
145
146 TEST_F(FileImplTest, OpenExclusive) {
147 DirectoryPtr directory;
148 GetTemporaryRoot(&directory);
149 Error error;
150
151 {
152 // Create my_file.
153 FilePtr file;
154 error = ERROR_INTERNAL;
155 directory->OpenFile("temp_file", GetProxy(&file),
156 kOpenFlagWrite | kOpenFlagCreate |kOpenFlagExclusive,
157 Capture(&error));
158 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
159 EXPECT_EQ(ERROR_OK, error);
160
161 // Close it.
162 error = ERROR_INTERNAL;
163 file->Close(Capture(&error));
164 ASSERT_TRUE(file.WaitForIncomingMethodCall());
165 EXPECT_EQ(ERROR_OK, error);
166 }
167
168 {
169 // Try to open my_file again in exclusive mode; it should fail.
170 FilePtr file;
171 error = ERROR_INTERNAL;
172 directory->OpenFile("temp_file", GetProxy(&file),
173 kOpenFlagWrite | kOpenFlagCreate | kOpenFlagExclusive,
174 Capture(&error));
175 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
176 EXPECT_EQ(ERROR_UNKNOWN, error);
177 }
178 }
179
180 TEST_F(FileImplTest, OpenInAppendMode) {
181 DirectoryPtr directory;
182 GetTemporaryRoot(&directory);
183 Error error;
184
185 {
186 // Create my_file.
187 FilePtr file;
188 error = ERROR_INTERNAL;
189 directory->OpenFile("my_file", GetProxy(&file),
190 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
191 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
192 EXPECT_EQ(ERROR_OK, error);
193
194 // Write to it.
195 std::vector<uint8_t> bytes_to_write;
196 bytes_to_write.push_back(static_cast<uint8_t>('h'));
197 bytes_to_write.push_back(static_cast<uint8_t>('e'));
198 bytes_to_write.push_back(static_cast<uint8_t>('l'));
199 bytes_to_write.push_back(static_cast<uint8_t>('l'));
200 bytes_to_write.push_back(static_cast<uint8_t>('o'));
201 error = ERROR_INTERNAL;
202 uint32_t num_bytes_written = 0;
203 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
204 Capture(&error, &num_bytes_written));
205 ASSERT_TRUE(file.WaitForIncomingMethodCall());
206 EXPECT_EQ(ERROR_OK, error);
207 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
208
209 // Close it.
210 error = ERROR_INTERNAL;
211 file->Close(Capture(&error));
212 ASSERT_TRUE(file.WaitForIncomingMethodCall());
213 EXPECT_EQ(ERROR_OK, error);
214 }
215
216 {
217 // Append to my_file.
218 FilePtr file;
219 error = ERROR_INTERNAL;
220 directory->OpenFile("my_file", GetProxy(&file),
221 kOpenFlagWrite | kOpenFlagAppend, Capture(&error));
222 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
223 EXPECT_EQ(ERROR_OK, error);
224
225 // Write to it.
226 std::vector<uint8_t> bytes_to_write;
227 bytes_to_write.push_back(static_cast<uint8_t>('g'));
228 bytes_to_write.push_back(static_cast<uint8_t>('o'));
229 bytes_to_write.push_back(static_cast<uint8_t>('o'));
230 bytes_to_write.push_back(static_cast<uint8_t>('d'));
231 bytes_to_write.push_back(static_cast<uint8_t>('b'));
232 bytes_to_write.push_back(static_cast<uint8_t>('y'));
233 bytes_to_write.push_back(static_cast<uint8_t>('e'));
234 error = ERROR_INTERNAL;
235 uint32_t num_bytes_written = 0;
236 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
237 Capture(&error, &num_bytes_written));
238 ASSERT_TRUE(file.WaitForIncomingMethodCall());
239 EXPECT_EQ(ERROR_OK, error);
240 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
241
242 // Close it.
243 error = ERROR_INTERNAL;
244 file->Close(Capture(&error));
245 ASSERT_TRUE(file.WaitForIncomingMethodCall());
246 EXPECT_EQ(ERROR_OK, error);
247 }
248
249 {
250 // Open my_file again.
251 FilePtr file;
252 error = ERROR_INTERNAL;
253 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead,
254 Capture(&error));
255 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
256 EXPECT_EQ(ERROR_OK, error);
257
258 // Read from it.
259 Array<uint8_t> bytes_read;
260 error = ERROR_INTERNAL;
261 file->Read(12, 0, WHENCE_FROM_START, Capture(&error, &bytes_read));
262 ASSERT_TRUE(file.WaitForIncomingMethodCall());
263 EXPECT_EQ(ERROR_OK, error);
264 ASSERT_EQ(12u, bytes_read.size());
265 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[3]);
266 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[4]);
267 EXPECT_EQ(static_cast<uint8_t>('g'), bytes_read[5]);
268 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[6]);
269 }
270 }
271
272 TEST_F(FileImplTest, OpenInTruncateMode) {
273 DirectoryPtr directory;
274 GetTemporaryRoot(&directory);
275 Error error;
276
277 {
278 // Create my_file.
279 FilePtr file;
280 error = ERROR_INTERNAL;
281 directory->OpenFile("my_file", GetProxy(&file),
282 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
283 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
284 EXPECT_EQ(ERROR_OK, error);
285
286 // Write to it.
287 std::vector<uint8_t> bytes_to_write;
288 bytes_to_write.push_back(static_cast<uint8_t>('h'));
289 bytes_to_write.push_back(static_cast<uint8_t>('e'));
290 bytes_to_write.push_back(static_cast<uint8_t>('l'));
291 bytes_to_write.push_back(static_cast<uint8_t>('l'));
292 bytes_to_write.push_back(static_cast<uint8_t>('o'));
293 error = ERROR_INTERNAL;
294 uint32_t num_bytes_written = 0;
295 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
296 Capture(&error, &num_bytes_written));
297 ASSERT_TRUE(file.WaitForIncomingMethodCall());
298 EXPECT_EQ(ERROR_OK, error);
299 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
300
301 // Close it.
302 error = ERROR_INTERNAL;
303 file->Close(Capture(&error));
304 ASSERT_TRUE(file.WaitForIncomingMethodCall());
305 EXPECT_EQ(ERROR_OK, error);
306 }
307
308 {
309 // Append to my_file.
310 FilePtr file;
311 error = ERROR_INTERNAL;
312 directory->OpenFile("my_file", GetProxy(&file),
313 kOpenFlagWrite | kOpenFlagTruncate, Capture(&error));
314 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
315 EXPECT_EQ(ERROR_OK, error);
316
317 // Write to it.
318 std::vector<uint8_t> bytes_to_write;
319 bytes_to_write.push_back(static_cast<uint8_t>('g'));
320 bytes_to_write.push_back(static_cast<uint8_t>('o'));
321 bytes_to_write.push_back(static_cast<uint8_t>('o'));
322 bytes_to_write.push_back(static_cast<uint8_t>('d'));
323 bytes_to_write.push_back(static_cast<uint8_t>('b'));
324 bytes_to_write.push_back(static_cast<uint8_t>('y'));
325 bytes_to_write.push_back(static_cast<uint8_t>('e'));
326 error = ERROR_INTERNAL;
327 uint32_t num_bytes_written = 0;
328 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
329 Capture(&error, &num_bytes_written));
330 ASSERT_TRUE(file.WaitForIncomingMethodCall());
331 EXPECT_EQ(ERROR_OK, error);
332 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
333
334 // Close it.
335 error = ERROR_INTERNAL;
336 file->Close(Capture(&error));
337 ASSERT_TRUE(file.WaitForIncomingMethodCall());
338 EXPECT_EQ(ERROR_OK, error);
339 }
340
341 {
342 // Open my_file again.
343 FilePtr file;
344 error = ERROR_INTERNAL;
345 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead,
346 Capture(&error));
347 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
348 EXPECT_EQ(ERROR_OK, error);
349
350 // Read from it.
351 Array<uint8_t> bytes_read;
352 error = ERROR_INTERNAL;
353 file->Read(7, 0, WHENCE_FROM_START, Capture(&error, &bytes_read));
354 ASSERT_TRUE(file.WaitForIncomingMethodCall());
355 EXPECT_EQ(ERROR_OK, error);
356 ASSERT_EQ(7u, bytes_read.size());
357 EXPECT_EQ(static_cast<uint8_t>('g'), bytes_read[0]);
358 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[1]);
359 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[2]);
360 EXPECT_EQ(static_cast<uint8_t>('d'), bytes_read[3]);
361 }
362 }
363
364 // Note: Ignore nanoseconds, since it may not always be supported. We expect at
365 // least second-resolution support though.
366 TEST_F(FileImplTest, StatTouch) {
367 DirectoryPtr directory;
368 GetTemporaryRoot(&directory);
369 Error error;
370
371 // Create my_file.
372 FilePtr file;
373 error = ERROR_INTERNAL;
374 directory->OpenFile("my_file", GetProxy(&file),
375 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
376 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
377 EXPECT_EQ(ERROR_OK, error);
378
379 // Stat it.
380 error = ERROR_INTERNAL;
381 FileInformationPtr file_info;
382 file->Stat(Capture(&error, &file_info));
383 ASSERT_TRUE(file.WaitForIncomingMethodCall());
384 EXPECT_EQ(ERROR_OK, error);
385 ASSERT_FALSE(file_info.is_null());
386 EXPECT_EQ(FILE_TYPE_REGULAR_FILE, file_info->type);
387 EXPECT_EQ(0, file_info->size);
388 ASSERT_FALSE(file_info->atime.is_null());
389 EXPECT_GT(file_info->atime->seconds, 0); // Expect that it's not 1970-01-01.
390 ASSERT_FALSE(file_info->mtime.is_null());
391 EXPECT_GT(file_info->mtime->seconds, 0);
392 int64_t first_mtime = file_info->mtime->seconds;
393
394 // Touch only the atime.
395 error = ERROR_INTERNAL;
396 TimespecOrNowPtr t(TimespecOrNow::New());
397 t->now = false;
398 t->timespec = Timespec::New();
399 const int64_t kPartyTime1 = 1234567890; // Party like it's 2009-02-13.
400 t->timespec->seconds = kPartyTime1;
401 file->Touch(t.Pass(), nullptr, Capture(&error));
402 ASSERT_TRUE(file.WaitForIncomingMethodCall());
403 EXPECT_EQ(ERROR_OK, error);
404
405 // Stat again.
406 error = ERROR_INTERNAL;
407 file_info.reset();
408 file->Stat(Capture(&error, &file_info));
409 ASSERT_TRUE(file.WaitForIncomingMethodCall());
410 EXPECT_EQ(ERROR_OK, error);
411 ASSERT_FALSE(file_info.is_null());
412 ASSERT_FALSE(file_info->atime.is_null());
413 EXPECT_EQ(kPartyTime1, file_info->atime->seconds);
414 ASSERT_FALSE(file_info->mtime.is_null());
415 EXPECT_EQ(first_mtime, file_info->mtime->seconds);
416
417 // Touch only the mtime.
418 t = TimespecOrNow::New();
419 t->now = false;
420 t->timespec = Timespec::New();
421 const int64_t kPartyTime2 = 1425059525; // No time like the present.
422 t->timespec->seconds = kPartyTime2;
423 file->Touch(nullptr, t.Pass(), Capture(&error));
424 ASSERT_TRUE(file.WaitForIncomingMethodCall());
425 EXPECT_EQ(ERROR_OK, error);
426
427 // Stat again.
428 error = ERROR_INTERNAL;
429 file_info.reset();
430 file->Stat(Capture(&error, &file_info));
431 ASSERT_TRUE(file.WaitForIncomingMethodCall());
432 EXPECT_EQ(ERROR_OK, error);
433 ASSERT_FALSE(file_info.is_null());
434 ASSERT_FALSE(file_info->atime.is_null());
435 EXPECT_EQ(kPartyTime1, file_info->atime->seconds);
436 ASSERT_FALSE(file_info->mtime.is_null());
437 EXPECT_EQ(kPartyTime2, file_info->mtime->seconds);
438
439 // TODO(vtl): Also test non-zero file size.
440 // TODO(vtl): Also test Touch() "now" options.
441 // TODO(vtl): Also test touching both atime and mtime.
442 }
443
444 TEST_F(FileImplTest, TellSeek) {
445 DirectoryPtr directory;
446 GetTemporaryRoot(&directory);
447 Error error;
448
449 // Create my_file.
450 FilePtr file;
451 error = ERROR_INTERNAL;
452 directory->OpenFile("my_file", GetProxy(&file),
453 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
454 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
455 EXPECT_EQ(ERROR_OK, error);
456
457 // Write to it.
458 std::vector<uint8_t> bytes_to_write(1000, '!');
459 error = ERROR_INTERNAL;
460 uint32_t num_bytes_written = 0;
461 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
462 Capture(&error, &num_bytes_written));
463 ASSERT_TRUE(file.WaitForIncomingMethodCall());
464 EXPECT_EQ(ERROR_OK, error);
465 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
466 const int size = static_cast<int>(num_bytes_written);
467
468 // Tell.
469 error = ERROR_INTERNAL;
470 int64_t position = -1;
471 file->Tell(Capture(&error, &position));
472 ASSERT_TRUE(file.WaitForIncomingMethodCall());
473 // Should be at the end.
474 EXPECT_EQ(ERROR_OK, error);
475 EXPECT_EQ(size, position);
476
477 // Seek back 100.
478 error = ERROR_INTERNAL;
479 position = -1;
480 file->Seek(-100, WHENCE_FROM_CURRENT, Capture(&error, &position));
481 ASSERT_TRUE(file.WaitForIncomingMethodCall());
482 EXPECT_EQ(ERROR_OK, error);
483 EXPECT_EQ(size - 100, position);
484
485 // Tell.
486 error = ERROR_INTERNAL;
487 position = -1;
488 file->Tell(Capture(&error, &position));
489 ASSERT_TRUE(file.WaitForIncomingMethodCall());
490 EXPECT_EQ(ERROR_OK, error);
491 EXPECT_EQ(size - 100, position);
492
493 // Seek to 123 from start.
494 error = ERROR_INTERNAL;
495 position = -1;
496 file->Seek(123, WHENCE_FROM_START, Capture(&error, &position));
497 ASSERT_TRUE(file.WaitForIncomingMethodCall());
498 EXPECT_EQ(ERROR_OK, error);
499 EXPECT_EQ(123, position);
500
501 // Tell.
502 error = ERROR_INTERNAL;
503 position = -1;
504 file->Tell(Capture(&error, &position));
505 ASSERT_TRUE(file.WaitForIncomingMethodCall());
506 EXPECT_EQ(ERROR_OK, error);
507 EXPECT_EQ(123, position);
508
509 // Seek to 123 back from end.
510 error = ERROR_INTERNAL;
511 position = -1;
512 file->Seek(-123, WHENCE_FROM_END, Capture(&error, &position));
513 ASSERT_TRUE(file.WaitForIncomingMethodCall());
514 EXPECT_EQ(ERROR_OK, error);
515 EXPECT_EQ(size - 123, position);
516
517 // Tell.
518 error = ERROR_INTERNAL;
519 position = -1;
520 file->Tell(Capture(&error, &position));
521 ASSERT_TRUE(file.WaitForIncomingMethodCall());
522 EXPECT_EQ(ERROR_OK, error);
523 EXPECT_EQ(size - 123, position);
524
525 // TODO(vtl): Check that seeking actually affects reading/writing.
526 // TODO(vtl): Check that seeking can extend the file?
527 }
528
529 TEST_F(FileImplTest, Dup) {
530 DirectoryPtr directory;
531 GetTemporaryRoot(&directory);
532 Error error;
533
534 // Create my_file.
535 FilePtr file1;
536 error = ERROR_INTERNAL;
537 directory->OpenFile("my_file", GetProxy(&file1),
538 kOpenFlagRead | kOpenFlagWrite | kOpenFlagCreate,
539 Capture(&error));
540 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
541 EXPECT_EQ(ERROR_OK, error);
542
543 // Write to it.
544 std::vector<uint8_t> bytes_to_write;
545 bytes_to_write.push_back(static_cast<uint8_t>('h'));
546 bytes_to_write.push_back(static_cast<uint8_t>('e'));
547 bytes_to_write.push_back(static_cast<uint8_t>('l'));
548 bytes_to_write.push_back(static_cast<uint8_t>('l'));
549 bytes_to_write.push_back(static_cast<uint8_t>('o'));
550 error = ERROR_INTERNAL;
551 uint32_t num_bytes_written = 0;
552 file1->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
553 Capture(&error, &num_bytes_written));
554 ASSERT_TRUE(file1.WaitForIncomingMethodCall());
555 EXPECT_EQ(ERROR_OK, error);
556 EXPECT_EQ(bytes_to_write.size(), num_bytes_written);
557 const int end_hello_pos = static_cast<int>(num_bytes_written);
558
559 // Dup it.
560 FilePtr file2;
561 error = ERROR_INTERNAL;
562 file1->Dup(GetProxy(&file2), Capture(&error));
563 ASSERT_TRUE(file1.WaitForIncomingMethodCall());
564 EXPECT_EQ(ERROR_OK, error);
565
566 // |file2| should have the same position.
567 error = ERROR_INTERNAL;
568 int64_t position = -1;
569 file2->Tell(Capture(&error, &position));
570 ASSERT_TRUE(file2.WaitForIncomingMethodCall());
571 EXPECT_EQ(ERROR_OK, error);
572 EXPECT_EQ(end_hello_pos, position);
573
574 // Write using |file2|.
575 std::vector<uint8_t> more_bytes_to_write;
576 more_bytes_to_write.push_back(static_cast<uint8_t>('w'));
577 more_bytes_to_write.push_back(static_cast<uint8_t>('o'));
578 more_bytes_to_write.push_back(static_cast<uint8_t>('r'));
579 more_bytes_to_write.push_back(static_cast<uint8_t>('l'));
580 more_bytes_to_write.push_back(static_cast<uint8_t>('d'));
581 error = ERROR_INTERNAL;
582 num_bytes_written = 0;
583 file2->Write(Array<uint8_t>::From(more_bytes_to_write), 0,
584 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written));
585 ASSERT_TRUE(file2.WaitForIncomingMethodCall());
586 EXPECT_EQ(ERROR_OK, error);
587 EXPECT_EQ(more_bytes_to_write.size(), num_bytes_written);
588 const int end_world_pos = end_hello_pos + static_cast<int>(num_bytes_written);
589
590 // |file1| should have the same position.
591 error = ERROR_INTERNAL;
592 position = -1;
593 file1->Tell(Capture(&error, &position));
594 ASSERT_TRUE(file1.WaitForIncomingMethodCall());
595 EXPECT_EQ(ERROR_OK, error);
596 EXPECT_EQ(end_world_pos, position);
597
598 // Close |file1|.
599 error = ERROR_INTERNAL;
600 file1->Close(Capture(&error));
601 ASSERT_TRUE(file1.WaitForIncomingMethodCall());
602 EXPECT_EQ(ERROR_OK, error);
603
604 // Read everything using |file2|.
605 Array<uint8_t> bytes_read;
606 error = ERROR_INTERNAL;
607 file2->Read(1000, 0, WHENCE_FROM_START, Capture(&error, &bytes_read));
608 ASSERT_TRUE(file2.WaitForIncomingMethodCall());
609 EXPECT_EQ(ERROR_OK, error);
610 ASSERT_EQ(static_cast<size_t>(end_world_pos), bytes_read.size());
611 // Just check the first and last bytes.
612 EXPECT_EQ(static_cast<uint8_t>('h'), bytes_read[0]);
613 EXPECT_EQ(static_cast<uint8_t>('d'), bytes_read[end_world_pos - 1]);
614
615 // TODO(vtl): Test that |file2| has the same open options as |file1|.
616 }
617
618 TEST_F(FileImplTest, Truncate) {
619 const uint32_t kInitialSize = 1000;
620 const uint32_t kTruncatedSize = 654;
621
622 DirectoryPtr directory;
623 GetTemporaryRoot(&directory);
624 Error error;
625
626 // Create my_file.
627 FilePtr file;
628 error = ERROR_INTERNAL;
629 directory->OpenFile("my_file", GetProxy(&file),
630 kOpenFlagWrite | kOpenFlagCreate, Capture(&error));
631 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
632 EXPECT_EQ(ERROR_OK, error);
633
634 // Write to it.
635 std::vector<uint8_t> bytes_to_write(kInitialSize, '!');
636 error = ERROR_INTERNAL;
637 uint32_t num_bytes_written = 0;
638 file->Write(Array<uint8_t>::From(bytes_to_write), 0, WHENCE_FROM_CURRENT,
639 Capture(&error, &num_bytes_written));
640 ASSERT_TRUE(file.WaitForIncomingMethodCall());
641 EXPECT_EQ(ERROR_OK, error);
642 EXPECT_EQ(kInitialSize, num_bytes_written);
643
644 // Stat it.
645 error = ERROR_INTERNAL;
646 FileInformationPtr file_info;
647 file->Stat(Capture(&error, &file_info));
648 ASSERT_TRUE(file.WaitForIncomingMethodCall());
649 EXPECT_EQ(ERROR_OK, error);
650 ASSERT_FALSE(file_info.is_null());
651 EXPECT_EQ(kInitialSize, file_info->size);
652
653 // Truncate it.
654 error = ERROR_INTERNAL;
655 file->Truncate(kTruncatedSize, Capture(&error));
656 ASSERT_TRUE(file.WaitForIncomingMethodCall());
657 EXPECT_EQ(ERROR_OK, error);
658
659 // Stat again.
660 error = ERROR_INTERNAL;
661 file_info.reset();
662 file->Stat(Capture(&error, &file_info));
663 ASSERT_TRUE(file.WaitForIncomingMethodCall());
664 EXPECT_EQ(ERROR_OK, error);
665 ASSERT_FALSE(file_info.is_null());
666 EXPECT_EQ(kTruncatedSize, file_info->size);
667 }
668
669 TEST_F(FileImplTest, Ioctl) {
670 DirectoryPtr directory;
671 GetTemporaryRoot(&directory);
672 Error error;
673
674 // Create my_file.
675 FilePtr file;
676 error = ERROR_INTERNAL;
677 directory->OpenFile("my_file", GetProxy(&file),
678 kOpenFlagRead | kOpenFlagWrite | kOpenFlagCreate,
679 Capture(&error));
680 ASSERT_TRUE(directory.WaitForIncomingMethodCall());
681 EXPECT_EQ(ERROR_OK, error);
682
683 // Normal files don't support any ioctls.
684 Array<uint32_t> out_values;
685 file->Ioctl(0, Array<uint32_t>(), Capture(&error, &out_values));
686 ASSERT_TRUE(file.WaitForIncomingMethodCall());
687 EXPECT_EQ(ERROR_UNAVAILABLE, error);
688 EXPECT_TRUE(out_values.is_null());
689 }
690
691 } // namespace
692 } // namespace files
693 } // namespace mojo
OLDNEW
« no previous file with comments | « components/filesystem/file_impl.cc ('k') | components/filesystem/files_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698