Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/tests/test_file_io.h" | 5 #include "ppapi/tests/test_file_io.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 std::string ReportMismatch(const std::string& method_name, | 25 std::string ReportMismatch(const std::string& method_name, |
| 26 const std::string& returned_result, | 26 const std::string& returned_result, |
| 27 const std::string& expected_result) { | 27 const std::string& expected_result) { |
| 28 return method_name + " returned '" + returned_result + "'; '" + | 28 return method_name + " returned '" + returned_result + "'; '" + |
| 29 expected_result + "' expected."; | 29 expected_result + "' expected."; |
| 30 } | 30 } |
| 31 | 31 |
| 32 std::string ReportOpenError(int32_t open_flags) { | |
| 33 static const char* kFlagNames[] = { | |
| 34 "PP_FILEOPENFLAG_READ", | |
| 35 "PP_FILEOPENFLAG_WRITE", | |
| 36 "PP_FILEOPENFLAG_CREATE", | |
| 37 "PP_FILEOPENFLAG_TRUNCATE", | |
| 38 "PP_FILEOPENFLAG_EXCLUSIVE" | |
| 39 }; | |
| 40 | |
| 41 std::string result = "FileIO:Open had unexpected behavior with flags: "; | |
| 42 bool first_flag = true; | |
| 43 for (int32_t mask = 1, index = 0; mask <= PP_FILEOPENFLAG_EXCLUSIVE; | |
| 44 mask <<= 1, ++index) { | |
| 45 if (mask & open_flags) { | |
| 46 if (first_flag) { | |
| 47 first_flag = false; | |
| 48 } else { | |
| 49 result += " | "; | |
| 50 } | |
| 51 result += kFlagNames[index]; | |
| 52 } | |
| 53 } | |
| 54 if (first_flag) | |
| 55 result += "[None]"; | |
| 56 | |
| 57 return result; | |
| 58 } | |
| 59 | |
| 32 int32_t ReadEntireFile(PP_Instance instance, | 60 int32_t ReadEntireFile(PP_Instance instance, |
| 33 pp::FileIO_Dev* file_io, | 61 pp::FileIO_Dev* file_io, |
| 34 int32_t offset, | 62 int32_t offset, |
| 35 std::string* data) { | 63 std::string* data) { |
| 36 TestCompletionCallback callback(instance); | 64 TestCompletionCallback callback(instance); |
| 37 char buf[256]; | 65 char buf[256]; |
| 38 int32_t read_offset = offset; | 66 int32_t read_offset = offset; |
| 39 | 67 |
| 40 for (;;) { | 68 for (;;) { |
| 41 int32_t rv = file_io->Read(read_offset, buf, sizeof(buf), callback); | 69 int32_t rv = file_io->Read(read_offset, buf, sizeof(buf), callback); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 TestCompletionCallback callback(instance_->pp_instance()); | 124 TestCompletionCallback callback(instance_->pp_instance()); |
| 97 | 125 |
| 98 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 126 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 99 pp::FileRef_Dev file_ref(file_system, "/file_open"); | 127 pp::FileRef_Dev file_ref(file_system, "/file_open"); |
| 100 int32_t rv = file_system.Open(1024, callback); | 128 int32_t rv = file_system.Open(1024, callback); |
| 101 if (rv == PP_OK_COMPLETIONPENDING) | 129 if (rv == PP_OK_COMPLETIONPENDING) |
| 102 rv = callback.WaitForResult(); | 130 rv = callback.WaitForResult(); |
| 103 if (rv != PP_OK) | 131 if (rv != PP_OK) |
| 104 return ReportError("FileSystem::Open", rv); | 132 return ReportError("FileSystem::Open", rv); |
| 105 | 133 |
| 106 pp::FileIO_Dev file_io(instance_); | 134 std::string result; |
| 107 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_CREATE, callback); | 135 result = MatchOpenExpectation(&file_system, PP_FILEOPENFLAG_READ, |
| 108 if (rv == PP_OK_COMPLETIONPENDING) | 136 false, // invalid_combination |
|
darin (slow to review)
2011/05/21 04:32:25
instead of writing these comments, i think it woul
yzshen1
2011/05/23 00:53:01
Done.
| |
| 109 rv = callback.WaitForResult(); | 137 false, // create_if_not_exist |
| 110 if (rv != PP_OK) | 138 true, // open_if_exist |
| 111 return ReportError("FileIO::Open", rv); | 139 false); // truncate_if_exist |
| 140 if (!result.empty()) | |
| 141 return result; | |
| 112 | 142 |
| 113 // Try opening a file that doesn't exist. | 143 // Test the behavior of the power set of |
| 114 pp::FileRef_Dev nonexistent_file_ref(file_system, "/nonexistent_file"); | 144 // { PP_FILEOPENFLAG_CREATE, |
| 115 pp::FileIO_Dev nonexistent_file_io(instance_); | 145 // PP_FILEOPENFLAG_TRUNCATE, |
| 116 rv = nonexistent_file_io.Open( | 146 // PP_FILEOPENFLAG_EXCLUSIVE }. |
| 117 nonexistent_file_ref, PP_FILEOPENFLAG_READ, callback); | 147 |
| 118 if (rv == PP_OK_COMPLETIONPENDING) | 148 // First of all, none of them are specificed. |
| 119 rv = callback.WaitForResult(); | 149 result = MatchOpenExpectation(&file_system, PP_FILEOPENFLAG_WRITE, |
| 120 if (rv != PP_ERROR_FILENOTFOUND) | 150 false, // invalid_combination |
| 121 return ReportError("FileIO::Open", rv); | 151 false, // create_if_not_exist |
| 152 true, // open_if_exist | |
| 153 false); // truncate_if_exist | |
| 154 if (!result.empty()) | |
| 155 return result; | |
| 156 | |
| 157 result = MatchOpenExpectation(&file_system, | |
| 158 PP_FILEOPENFLAG_WRITE | | |
| 159 PP_FILEOPENFLAG_CREATE, | |
| 160 false, // invalid_combination | |
| 161 true, // create_if_not_exist | |
| 162 true, // open_if_exist | |
| 163 false); // truncate_if_exist | |
| 164 if (!result.empty()) | |
| 165 return result; | |
| 166 | |
| 167 result = MatchOpenExpectation(&file_system, | |
| 168 PP_FILEOPENFLAG_WRITE | | |
| 169 PP_FILEOPENFLAG_EXCLUSIVE, | |
| 170 false, // invalid_combination | |
| 171 false, // create_if_not_exist | |
| 172 true, // open_if_exist | |
| 173 false); // truncate_if_exist | |
| 174 if (!result.empty()) | |
| 175 return result; | |
| 176 | |
| 177 result = MatchOpenExpectation(&file_system, | |
| 178 PP_FILEOPENFLAG_WRITE | | |
| 179 PP_FILEOPENFLAG_TRUNCATE, | |
| 180 false, // invalid_combination | |
| 181 false, // create_if_not_exist | |
| 182 true, // open_if_exist | |
| 183 true); // truncate_if_exist | |
| 184 if (!result.empty()) | |
| 185 return result; | |
| 186 | |
| 187 result = MatchOpenExpectation(&file_system, | |
| 188 PP_FILEOPENFLAG_WRITE | | |
| 189 PP_FILEOPENFLAG_CREATE | | |
| 190 PP_FILEOPENFLAG_EXCLUSIVE, | |
| 191 false, // invalid_combination | |
| 192 true, // create_if_not_exist | |
| 193 false, // open_if_exist | |
| 194 false); // truncate_if_exist | |
| 195 if (!result.empty()) | |
| 196 return result; | |
| 197 | |
| 198 result = MatchOpenExpectation(&file_system, | |
| 199 PP_FILEOPENFLAG_WRITE | | |
| 200 PP_FILEOPENFLAG_CREATE | | |
| 201 PP_FILEOPENFLAG_TRUNCATE, | |
| 202 false, // invalid_combination | |
| 203 true, // create_if_not_exist | |
| 204 true, // open_if_exist | |
| 205 true); // truncate_if_exist | |
| 206 if (!result.empty()) | |
| 207 return result; | |
| 208 | |
| 209 result = MatchOpenExpectation(&file_system, | |
| 210 PP_FILEOPENFLAG_WRITE | | |
| 211 PP_FILEOPENFLAG_EXCLUSIVE | | |
| 212 PP_FILEOPENFLAG_TRUNCATE, | |
| 213 false, // invalid_combination | |
| 214 false, // create_if_not_exist | |
| 215 true, // open_if_exist | |
| 216 true); // truncate_if_exist | |
| 217 if (!result.empty()) | |
| 218 return result; | |
| 219 | |
| 220 result = MatchOpenExpectation(&file_system, | |
| 221 PP_FILEOPENFLAG_WRITE | | |
| 222 PP_FILEOPENFLAG_CREATE | | |
| 223 PP_FILEOPENFLAG_EXCLUSIVE | | |
| 224 PP_FILEOPENFLAG_TRUNCATE, | |
| 225 false, // invalid_combination | |
| 226 true, // create_if_not_exist | |
| 227 false, // open_if_exist | |
| 228 false); // truncate_if_exist | |
| 229 if (!result.empty()) | |
| 230 return result; | |
| 231 | |
| 232 // Invalid combination: PP_FILEOPENFLAG_TRUNCATE without | |
| 233 // PP_FILEOPENFLAG_WRITE. | |
| 234 result = MatchOpenExpectation(&file_system, | |
| 235 PP_FILEOPENFLAG_READ | | |
| 236 PP_FILEOPENFLAG_TRUNCATE, | |
| 237 true, // invalid_combination | |
| 238 false, // create_if_not_exist | |
| 239 false, // open_if_exist | |
| 240 false); // truncate_if_exist | |
| 241 if (!result.empty()) | |
| 242 return result; | |
| 122 | 243 |
| 123 PASS(); | 244 PASS(); |
| 124 } | 245 } |
| 125 | 246 |
| 126 std::string TestFileIO::TestReadWriteSetLength() { | 247 std::string TestFileIO::TestReadWriteSetLength() { |
| 127 TestCompletionCallback callback(instance_->pp_instance()); | 248 TestCompletionCallback callback(instance_->pp_instance()); |
| 128 | 249 |
| 129 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 250 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 130 pp::FileRef_Dev file_ref(file_system, "/file_read_write_setlength"); | 251 pp::FileRef_Dev file_ref(file_system, "/file_read_write_setlength"); |
| 131 int32_t rv = file_system.Open(1024, callback); | 252 int32_t rv = file_system.Open(1024, callback); |
| 132 if (rv == PP_OK_COMPLETIONPENDING) | 253 if (rv == PP_OK_COMPLETIONPENDING) |
| 133 rv = callback.WaitForResult(); | 254 rv = callback.WaitForResult(); |
| 134 if (rv != PP_OK) | 255 if (rv != PP_OK) |
| 135 return ReportError("FileSystem::Open", rv); | 256 return ReportError("FileSystem::Open", rv); |
| 136 | 257 |
| 137 pp::FileIO_Dev file_io(instance_); | 258 pp::FileIO_Dev file_io(instance_); |
| 138 rv = file_io.Open(file_ref, | 259 rv = file_io.Open(file_ref, |
| 139 PP_FILEOPENFLAG_CREATE | | 260 PP_FILEOPENFLAG_CREATE | |
| 261 PP_FILEOPENFLAG_TRUNCATE | | |
| 140 PP_FILEOPENFLAG_READ | | 262 PP_FILEOPENFLAG_READ | |
| 141 PP_FILEOPENFLAG_WRITE, | 263 PP_FILEOPENFLAG_WRITE, |
| 142 callback); | 264 callback); |
| 143 if (rv == PP_OK_COMPLETIONPENDING) | 265 if (rv == PP_OK_COMPLETIONPENDING) |
| 144 rv = callback.WaitForResult(); | 266 rv = callback.WaitForResult(); |
| 145 if (rv != PP_OK) | 267 if (rv != PP_OK) |
| 146 return ReportError("FileIO::Open", rv); | 268 return ReportError("FileIO::Open", rv); |
| 147 | 269 |
| 148 // Write something to the file. | 270 // Write something to the file. |
| 149 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, "test_test"); | 271 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, "test_test"); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 365 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 244 int32_t rv = file_system.Open(1024, callback); | 366 int32_t rv = file_system.Open(1024, callback); |
| 245 if (rv == PP_OK_COMPLETIONPENDING) | 367 if (rv == PP_OK_COMPLETIONPENDING) |
| 246 rv = callback.WaitForResult(); | 368 rv = callback.WaitForResult(); |
| 247 if (rv != PP_OK) | 369 if (rv != PP_OK) |
| 248 return ReportError("FileSystem::Open", rv); | 370 return ReportError("FileSystem::Open", rv); |
| 249 | 371 |
| 250 pp::FileRef_Dev file_ref(file_system, "/file_touch"); | 372 pp::FileRef_Dev file_ref(file_system, "/file_touch"); |
| 251 pp::FileIO_Dev file_io(instance_); | 373 pp::FileIO_Dev file_io(instance_); |
| 252 rv = file_io.Open(file_ref, | 374 rv = file_io.Open(file_ref, |
| 253 PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, | 375 PP_FILEOPENFLAG_CREATE | |
| 376 PP_FILEOPENFLAG_TRUNCATE | | |
| 377 PP_FILEOPENFLAG_WRITE, | |
| 254 callback); | 378 callback); |
| 255 if (rv == PP_OK_COMPLETIONPENDING) | 379 if (rv == PP_OK_COMPLETIONPENDING) |
| 256 rv = callback.WaitForResult(); | 380 rv = callback.WaitForResult(); |
| 257 if (rv != PP_OK) | 381 if (rv != PP_OK) |
| 258 return ReportError("FileIO::Open", rv); | 382 return ReportError("FileIO::Open", rv); |
| 259 | 383 |
| 260 // Write some data to have a non-zero file size. | 384 // Write some data to have a non-zero file size. |
| 261 rv = file_io.Write(0, "test", 4, callback); | 385 rv = file_io.Write(0, "test", 4, callback); |
| 262 if (rv == PP_OK_COMPLETIONPENDING) | 386 if (rv == PP_OK_COMPLETIONPENDING) |
| 263 rv = callback.WaitForResult(); | 387 rv = callback.WaitForResult(); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 489 return ReportError("FileIO::Flush", rv); | 613 return ReportError("FileIO::Flush", rv); |
| 490 } | 614 } |
| 491 } | 615 } |
| 492 | 616 |
| 493 // TODO(viettrungluu): Also test that Close() aborts callbacks. | 617 // TODO(viettrungluu): Also test that Close() aborts callbacks. |
| 494 // crbug.com/69457 | 618 // crbug.com/69457 |
| 495 | 619 |
| 496 PASS(); | 620 PASS(); |
| 497 } | 621 } |
| 498 | 622 |
| 623 std::string TestFileIO::MatchOpenExpectation(pp::FileSystem_Dev* file_system, | |
| 624 size_t open_flags, | |
| 625 bool invalid_combination, | |
| 626 bool create_if_not_exist, | |
| 627 bool open_if_exist, | |
| 628 bool truncate_if_exist) { | |
| 629 TestCompletionCallback callback(instance_->pp_instance()); | |
| 630 | |
| 631 pp::FileRef_Dev existent_file_ref( | |
| 632 *file_system, "/match_open_expectation_existent_non_empty_file"); | |
| 633 pp::FileRef_Dev nonexistent_file_ref( | |
| 634 *file_system, "/match_open_expectation_nonexistent_file"); | |
| 635 | |
| 636 // Setup files for test. | |
| 637 { | |
| 638 int32_t rv = existent_file_ref.Delete(callback); | |
| 639 if (rv == PP_OK_COMPLETIONPENDING) | |
| 640 rv = callback.WaitForResult(); | |
| 641 if (rv != PP_OK && rv != PP_ERROR_FILENOTFOUND) | |
| 642 return ReportError("FileRef::Delete", rv); | |
| 643 | |
| 644 rv = nonexistent_file_ref.Delete(callback); | |
| 645 if (rv == PP_OK_COMPLETIONPENDING) | |
| 646 rv = callback.WaitForResult(); | |
| 647 if (rv != PP_OK && rv != PP_ERROR_FILENOTFOUND) | |
| 648 return ReportError("FileRef::Delete", rv); | |
| 649 | |
| 650 pp::FileIO_Dev existent_file_io(instance_); | |
| 651 rv = existent_file_io.Open(existent_file_ref, | |
| 652 PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, | |
| 653 callback); | |
| 654 if (rv == PP_OK_COMPLETIONPENDING) | |
| 655 rv = callback.WaitForResult(); | |
| 656 if (rv != PP_OK) | |
| 657 return ReportError("FileIO::Open", rv); | |
| 658 | |
| 659 rv = WriteEntireBuffer(instance_->pp_instance(), &existent_file_io, 0, | |
| 660 "foobar"); | |
| 661 if (rv != PP_OK) | |
| 662 return ReportError("FileIO::Write", rv); | |
| 663 } | |
| 664 | |
| 665 pp::FileIO_Dev existent_file_io(instance_); | |
| 666 int32_t rv = existent_file_io.Open(existent_file_ref, open_flags, callback); | |
| 667 if (rv == PP_OK_COMPLETIONPENDING) | |
| 668 rv = callback.WaitForResult(); | |
| 669 if ((invalid_combination && rv == PP_OK) || | |
| 670 (!invalid_combination && ((rv == PP_OK) != open_if_exist))) { | |
| 671 return ReportOpenError(open_flags); | |
| 672 } | |
| 673 | |
| 674 if (!invalid_combination && open_if_exist) { | |
| 675 PP_FileInfo_Dev info; | |
| 676 rv = existent_file_io.Query(&info, callback); | |
| 677 if (rv == PP_OK_COMPLETIONPENDING) | |
| 678 rv = callback.WaitForResult(); | |
| 679 if (rv != PP_OK) | |
| 680 return ReportError("FileIO::Query", rv); | |
| 681 | |
| 682 if (truncate_if_exist != (info.size == 0)) | |
| 683 return ReportOpenError(open_flags); | |
| 684 } | |
| 685 | |
| 686 pp::FileIO_Dev nonexistent_file_io(instance_); | |
| 687 rv = nonexistent_file_io.Open(nonexistent_file_ref, open_flags, callback); | |
| 688 if (rv == PP_OK_COMPLETIONPENDING) | |
| 689 rv = callback.WaitForResult(); | |
| 690 if ((invalid_combination && rv == PP_OK) || | |
| 691 (!invalid_combination && ((rv == PP_OK) != create_if_not_exist))) { | |
| 692 return ReportOpenError(open_flags); | |
| 693 } | |
| 694 | |
| 695 return std::string(); | |
| 696 } | |
| 697 | |
| 499 // TODO(viettrungluu): Test Close(). crbug.com/69457 | 698 // TODO(viettrungluu): Test Close(). crbug.com/69457 |
| OLD | NEW |