| 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 return PP_OK; | 104 return PP_OK; |
| 105 } | 105 } |
| 106 | 106 |
| 107 } // namespace | 107 } // namespace |
| 108 | 108 |
| 109 bool TestFileIO::Init() { | 109 bool TestFileIO::Init() { |
| 110 return InitTestingInterface() && EnsureRunningOverHTTP(); | 110 return InitTestingInterface() && EnsureRunningOverHTTP(); |
| 111 } | 111 } |
| 112 | 112 |
| 113 void TestFileIO::RunTest() { | 113 void TestFileIO::RunTest() { |
| 114 RUN_TEST(Open); | 114 RUN_TEST_FORCEASYNC_AND_NOT(Open); |
| 115 RUN_TEST(ReadWriteSetLength); | 115 RUN_TEST_FORCEASYNC_AND_NOT(ReadWriteSetLength); |
| 116 RUN_TEST(TouchQuery); | 116 RUN_TEST_FORCEASYNC_AND_NOT(TouchQuery); |
| 117 RUN_TEST(AbortCalls); | 117 RUN_TEST_FORCEASYNC_AND_NOT(TouchQuery); |
| 118 RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls); |
| 119 RUN_TEST_FORCEASYNC_AND_NOT(AbortCalls); |
| 118 // TODO(viettrungluu): add tests: | 120 // TODO(viettrungluu): add tests: |
| 119 // - that PP_ERROR_PENDING is correctly returned | 121 // - that PP_ERROR_PENDING is correctly returned |
| 120 // - that operations respect the file open modes (flags) | 122 // - that operations respect the file open modes (flags) |
| 121 } | 123 } |
| 122 | 124 |
| 123 std::string TestFileIO::TestOpen() { | 125 std::string TestFileIO::TestOpen() { |
| 124 TestCompletionCallback callback(instance_->pp_instance()); | 126 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
| 125 | 127 |
| 126 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 128 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 127 pp::FileRef_Dev file_ref(file_system, "/file_open"); | 129 pp::FileRef_Dev file_ref(file_system, "/file_open"); |
| 128 int32_t rv = file_system.Open(1024, callback); | 130 int32_t rv = file_system.Open(1024, callback); |
| 131 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 132 return ReportError("FileSystem::Open force_async", rv); |
| 129 if (rv == PP_OK_COMPLETIONPENDING) | 133 if (rv == PP_OK_COMPLETIONPENDING) |
| 130 rv = callback.WaitForResult(); | 134 rv = callback.WaitForResult(); |
| 131 if (rv != PP_OK) | 135 if (rv != PP_OK) |
| 132 return ReportError("FileSystem::Open", rv); | 136 return ReportError("FileSystem::Open", rv); |
| 133 | 137 |
| 134 std::string result; | 138 std::string result; |
| 135 result = MatchOpenExpectations( | 139 result = MatchOpenExpectations( |
| 136 &file_system, | 140 &file_system, |
| 137 PP_FILEOPENFLAG_READ, | 141 PP_FILEOPENFLAG_READ, |
| 138 DONT_CREATE_IF_DOESNT_EXIST | OPEN_IF_EXISTS | DONT_TRUNCATE_IF_EXISTS); | 142 DONT_CREATE_IF_DOESNT_EXIST | OPEN_IF_EXISTS | DONT_TRUNCATE_IF_EXISTS); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 &file_system, | 214 &file_system, |
| 211 PP_FILEOPENFLAG_READ | PP_FILEOPENFLAG_TRUNCATE, | 215 PP_FILEOPENFLAG_READ | PP_FILEOPENFLAG_TRUNCATE, |
| 212 INVALID_FLAG_COMBINATION); | 216 INVALID_FLAG_COMBINATION); |
| 213 if (!result.empty()) | 217 if (!result.empty()) |
| 214 return result; | 218 return result; |
| 215 | 219 |
| 216 PASS(); | 220 PASS(); |
| 217 } | 221 } |
| 218 | 222 |
| 219 std::string TestFileIO::TestReadWriteSetLength() { | 223 std::string TestFileIO::TestReadWriteSetLength() { |
| 220 TestCompletionCallback callback(instance_->pp_instance()); | 224 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
| 221 | 225 |
| 222 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 226 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 223 pp::FileRef_Dev file_ref(file_system, "/file_read_write_setlength"); | 227 pp::FileRef_Dev file_ref(file_system, "/file_read_write_setlength"); |
| 224 int32_t rv = file_system.Open(1024, callback); | 228 int32_t rv = file_system.Open(1024, callback); |
| 229 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 230 return ReportError("FileSystem::Open force_async", rv); |
| 225 if (rv == PP_OK_COMPLETIONPENDING) | 231 if (rv == PP_OK_COMPLETIONPENDING) |
| 226 rv = callback.WaitForResult(); | 232 rv = callback.WaitForResult(); |
| 227 if (rv != PP_OK) | 233 if (rv != PP_OK) |
| 228 return ReportError("FileSystem::Open", rv); | 234 return ReportError("FileSystem::Open", rv); |
| 229 | 235 |
| 230 pp::FileIO_Dev file_io(instance_); | 236 pp::FileIO_Dev file_io(instance_); |
| 231 rv = file_io.Open(file_ref, | 237 rv = file_io.Open(file_ref, |
| 232 PP_FILEOPENFLAG_CREATE | | 238 PP_FILEOPENFLAG_CREATE | |
| 233 PP_FILEOPENFLAG_TRUNCATE | | 239 PP_FILEOPENFLAG_TRUNCATE | |
| 234 PP_FILEOPENFLAG_READ | | 240 PP_FILEOPENFLAG_READ | |
| 235 PP_FILEOPENFLAG_WRITE, | 241 PP_FILEOPENFLAG_WRITE, |
| 236 callback); | 242 callback); |
| 243 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 244 return ReportError("FileIO::Open force_async", rv); |
| 237 if (rv == PP_OK_COMPLETIONPENDING) | 245 if (rv == PP_OK_COMPLETIONPENDING) |
| 238 rv = callback.WaitForResult(); | 246 rv = callback.WaitForResult(); |
| 239 if (rv != PP_OK) | 247 if (rv != PP_OK) |
| 240 return ReportError("FileIO::Open", rv); | 248 return ReportError("FileIO::Open", rv); |
| 241 | 249 |
| 242 // Write something to the file. | 250 // Write something to the file. |
| 243 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, "test_test"); | 251 rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, "test_test"); |
| 244 if (rv != PP_OK) | 252 if (rv != PP_OK) |
| 245 return ReportError("FileIO::Write", rv); | 253 return ReportError("FileIO::Write", rv); |
| 246 | 254 |
| 247 // Read the entire file. | 255 // Read the entire file. |
| 248 std::string read_buffer; | 256 std::string read_buffer; |
| 249 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); | 257 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); |
| 250 if (rv != PP_OK) | 258 if (rv != PP_OK) |
| 251 return ReportError("FileIO::Read", rv); | 259 return ReportError("FileIO::Read", rv); |
| 252 if (read_buffer != "test_test") | 260 if (read_buffer != "test_test") |
| 253 return ReportMismatch("FileIO::Read", read_buffer, "test_test"); | 261 return ReportMismatch("FileIO::Read", read_buffer, "test_test"); |
| 254 | 262 |
| 255 // Truncate the file. | 263 // Truncate the file. |
| 256 rv = file_io.SetLength(4, callback); | 264 rv = file_io.SetLength(4, callback); |
| 265 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 266 return ReportError("FileIO::SetLength force_async", rv); |
| 257 if (rv == PP_OK_COMPLETIONPENDING) | 267 if (rv == PP_OK_COMPLETIONPENDING) |
| 258 rv = callback.WaitForResult(); | 268 rv = callback.WaitForResult(); |
| 259 if (rv != PP_OK) | 269 if (rv != PP_OK) |
| 260 return ReportError("FileIO::SetLength", rv); | 270 return ReportError("FileIO::SetLength", rv); |
| 261 | 271 |
| 262 // Check the file contents. | 272 // Check the file contents. |
| 263 read_buffer.clear(); | 273 read_buffer.clear(); |
| 264 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); | 274 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); |
| 265 if (rv != PP_OK) | 275 if (rv != PP_OK) |
| 266 return ReportError("FileIO::Read", rv); | 276 return ReportError("FileIO::Read", rv); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 284 read_buffer.clear(); | 294 read_buffer.clear(); |
| 285 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); | 295 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); |
| 286 if (rv != PP_OK) | 296 if (rv != PP_OK) |
| 287 return ReportError("FileIO::Read", rv); | 297 return ReportError("FileIO::Read", rv); |
| 288 if (read_buffer != std::string("test\0\0\0\0test", 12)) | 298 if (read_buffer != std::string("test\0\0\0\0test", 12)) |
| 289 return ReportMismatch("FileIO::Read", read_buffer, | 299 return ReportMismatch("FileIO::Read", read_buffer, |
| 290 std::string("test\0\0\0\0test", 12)); | 300 std::string("test\0\0\0\0test", 12)); |
| 291 | 301 |
| 292 // Extend the file. | 302 // Extend the file. |
| 293 rv = file_io.SetLength(16, callback); | 303 rv = file_io.SetLength(16, callback); |
| 304 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 305 return ReportError("FileIO::SetLength force_async", rv); |
| 294 if (rv == PP_OK_COMPLETIONPENDING) | 306 if (rv == PP_OK_COMPLETIONPENDING) |
| 295 rv = callback.WaitForResult(); | 307 rv = callback.WaitForResult(); |
| 296 if (rv != PP_OK) | 308 if (rv != PP_OK) |
| 297 return ReportError("FileIO::SetLength", rv); | 309 return ReportError("FileIO::SetLength", rv); |
| 298 | 310 |
| 299 // Check the contents of the file. | 311 // Check the contents of the file. |
| 300 read_buffer.clear(); | 312 read_buffer.clear(); |
| 301 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); | 313 rv = ReadEntireFile(instance_->pp_instance(), &file_io, 0, &read_buffer); |
| 302 if (rv != PP_OK) | 314 if (rv != PP_OK) |
| 303 return ReportError("FileIO::Read", rv); | 315 return ReportError("FileIO::Read", rv); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 325 if (rv != PP_OK) | 337 if (rv != PP_OK) |
| 326 return ReportError("FileIO::Read", rv); | 338 return ReportError("FileIO::Read", rv); |
| 327 if (read_buffer != std::string("testtest\0\0\0\0", 12)) | 339 if (read_buffer != std::string("testtest\0\0\0\0", 12)) |
| 328 return ReportMismatch("FileIO::Read", read_buffer, | 340 return ReportMismatch("FileIO::Read", read_buffer, |
| 329 std::string("testtest\0\0\0\0", 12)); | 341 std::string("testtest\0\0\0\0", 12)); |
| 330 | 342 |
| 331 PASS(); | 343 PASS(); |
| 332 } | 344 } |
| 333 | 345 |
| 334 std::string TestFileIO::TestTouchQuery() { | 346 std::string TestFileIO::TestTouchQuery() { |
| 335 TestCompletionCallback callback(instance_->pp_instance()); | 347 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
| 336 | 348 |
| 337 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 349 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 338 int32_t rv = file_system.Open(1024, callback); | 350 int32_t rv = file_system.Open(1024, callback); |
| 351 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 352 return ReportError("FileSystem::Open force_async", rv); |
| 339 if (rv == PP_OK_COMPLETIONPENDING) | 353 if (rv == PP_OK_COMPLETIONPENDING) |
| 340 rv = callback.WaitForResult(); | 354 rv = callback.WaitForResult(); |
| 341 if (rv != PP_OK) | 355 if (rv != PP_OK) |
| 342 return ReportError("FileSystem::Open", rv); | 356 return ReportError("FileSystem::Open", rv); |
| 343 | 357 |
| 344 pp::FileRef_Dev file_ref(file_system, "/file_touch"); | 358 pp::FileRef_Dev file_ref(file_system, "/file_touch"); |
| 345 pp::FileIO_Dev file_io(instance_); | 359 pp::FileIO_Dev file_io(instance_); |
| 346 rv = file_io.Open(file_ref, | 360 rv = file_io.Open(file_ref, |
| 347 PP_FILEOPENFLAG_CREATE | | 361 PP_FILEOPENFLAG_CREATE | |
| 348 PP_FILEOPENFLAG_TRUNCATE | | 362 PP_FILEOPENFLAG_TRUNCATE | |
| 349 PP_FILEOPENFLAG_WRITE, | 363 PP_FILEOPENFLAG_WRITE, |
| 350 callback); | 364 callback); |
| 365 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 366 return ReportError("FileIO::Open force_async", rv); |
| 351 if (rv == PP_OK_COMPLETIONPENDING) | 367 if (rv == PP_OK_COMPLETIONPENDING) |
| 352 rv = callback.WaitForResult(); | 368 rv = callback.WaitForResult(); |
| 353 if (rv != PP_OK) | 369 if (rv != PP_OK) |
| 354 return ReportError("FileIO::Open", rv); | 370 return ReportError("FileIO::Open", rv); |
| 355 | 371 |
| 356 // Write some data to have a non-zero file size. | 372 // Write some data to have a non-zero file size. |
| 357 rv = file_io.Write(0, "test", 4, callback); | 373 rv = file_io.Write(0, "test", 4, callback); |
| 374 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 375 return ReportError("FileIO::Write force_async", rv); |
| 358 if (rv == PP_OK_COMPLETIONPENDING) | 376 if (rv == PP_OK_COMPLETIONPENDING) |
| 359 rv = callback.WaitForResult(); | 377 rv = callback.WaitForResult(); |
| 360 if (rv != 4) | 378 if (rv != 4) |
| 361 return ReportError("FileIO::Write", rv); | 379 return ReportError("FileIO::Write", rv); |
| 362 | 380 |
| 363 // last_access_time's granularity is 1 day | 381 // last_access_time's granularity is 1 day |
| 364 // last_modified_time's granularity is 2 seconds | 382 // last_modified_time's granularity is 2 seconds |
| 365 const PP_Time last_access_time = 123 * 24 * 3600.0; | 383 const PP_Time last_access_time = 123 * 24 * 3600.0; |
| 366 const PP_Time last_modified_time = 246.0; | 384 const PP_Time last_modified_time = 246.0; |
| 367 rv = file_io.Touch(last_access_time, last_modified_time, callback); | 385 rv = file_io.Touch(last_access_time, last_modified_time, callback); |
| 386 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 387 return ReportError("FileIO::Touch force_async", rv); |
| 368 if (rv == PP_OK_COMPLETIONPENDING) | 388 if (rv == PP_OK_COMPLETIONPENDING) |
| 369 rv = callback.WaitForResult(); | 389 rv = callback.WaitForResult(); |
| 370 if (rv != PP_OK) | 390 if (rv != PP_OK) |
| 371 return ReportError("FileSystem::Touch", rv); | 391 return ReportError("FileIO::Touch", rv); |
| 372 | 392 |
| 373 PP_FileInfo_Dev info; | 393 PP_FileInfo_Dev info; |
| 374 rv = file_io.Query(&info, callback); | 394 rv = file_io.Query(&info, callback); |
| 395 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 396 return ReportError("FileIO::Query force_async", rv); |
| 375 if (rv == PP_OK_COMPLETIONPENDING) | 397 if (rv == PP_OK_COMPLETIONPENDING) |
| 376 rv = callback.WaitForResult(); | 398 rv = callback.WaitForResult(); |
| 377 if (rv != PP_OK) | 399 if (rv != PP_OK) |
| 378 return ReportError("FileSystem::Query", rv); | 400 return ReportError("FileIO::Query", rv); |
| 379 | 401 |
| 380 if ((info.size != 4) || | 402 if ((info.size != 4) || |
| 381 (info.type != PP_FILETYPE_REGULAR) || | 403 (info.type != PP_FILETYPE_REGULAR) || |
| 382 (info.system_type != PP_FILESYSTEMTYPE_LOCALTEMPORARY) || | 404 (info.system_type != PP_FILESYSTEMTYPE_LOCALTEMPORARY) || |
| 383 (info.last_access_time != last_access_time) || | 405 (info.last_access_time != last_access_time) || |
| 384 (info.last_modified_time != last_modified_time)) | 406 (info.last_modified_time != last_modified_time)) |
| 385 return "FileSystem::Query() has returned bad data."; | 407 return "FileIO::Query() has returned bad data."; |
| 386 | 408 |
| 387 // Call |Query()| again, to make sure it works a second time. | 409 // Call |Query()| again, to make sure it works a second time. |
| 388 rv = file_io.Query(&info, callback); | 410 rv = file_io.Query(&info, callback); |
| 411 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 412 return ReportError("FileIO::Query force_async", rv); |
| 389 if (rv == PP_OK_COMPLETIONPENDING) | 413 if (rv == PP_OK_COMPLETIONPENDING) |
| 390 rv = callback.WaitForResult(); | 414 rv = callback.WaitForResult(); |
| 391 if (rv != PP_OK) | 415 if (rv != PP_OK) |
| 392 return ReportError("FileSystem::Query", rv); | 416 return ReportError("FileIO::Query", rv); |
| 393 | 417 |
| 394 PASS(); | 418 PASS(); |
| 395 } | 419 } |
| 396 | 420 |
| 397 std::string TestFileIO::TestAbortCalls() { | 421 std::string TestFileIO::TestAbortCalls() { |
| 398 TestCompletionCallback callback(instance_->pp_instance()); | 422 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
| 399 | 423 |
| 400 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); | 424 pp::FileSystem_Dev file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); |
| 401 pp::FileRef_Dev file_ref(file_system, "/file_abort_calls"); | 425 pp::FileRef_Dev file_ref(file_system, "/file_abort_calls"); |
| 402 int32_t rv = file_system.Open(1024, callback); | 426 int32_t rv = file_system.Open(1024, callback); |
| 427 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 428 return ReportError("FileSystem::Open force_async", rv); |
| 403 if (rv == PP_OK_COMPLETIONPENDING) | 429 if (rv == PP_OK_COMPLETIONPENDING) |
| 404 rv = callback.WaitForResult(); | 430 rv = callback.WaitForResult(); |
| 405 if (rv != PP_OK) | 431 if (rv != PP_OK) |
| 406 return ReportError("FileSystem::Open", rv); | 432 return ReportError("FileSystem::Open", rv); |
| 407 | 433 |
| 408 // First, create a file which to do ops on. | 434 // First, create a file which to do ops on. |
| 409 { | 435 { |
| 410 pp::FileIO_Dev file_io(instance_); | 436 pp::FileIO_Dev file_io(instance_); |
| 411 rv = file_io.Open(file_ref, | 437 rv = file_io.Open(file_ref, |
| 412 PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, | 438 PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, |
| 413 callback); | 439 callback); |
| 440 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 441 return ReportError("FileIO::Open force_async", rv); |
| 414 if (rv == PP_OK_COMPLETIONPENDING) | 442 if (rv == PP_OK_COMPLETIONPENDING) |
| 415 rv = callback.WaitForResult(); | 443 rv = callback.WaitForResult(); |
| 416 if (rv != PP_OK) | 444 if (rv != PP_OK) |
| 417 return ReportError("FileIO::Open", rv); | 445 return ReportError("FileIO::Open", rv); |
| 418 | 446 |
| 419 // N.B.: Should write at least 3 bytes. | 447 // N.B.: Should write at least 3 bytes. |
| 420 rv = WriteEntireBuffer(instance_->pp_instance(), | 448 rv = WriteEntireBuffer(instance_->pp_instance(), |
| 421 &file_io, | 449 &file_io, |
| 422 0, | 450 0, |
| 423 "foobarbazquux"); | 451 "foobarbazquux"); |
| 424 if (rv != PP_OK) | 452 if (rv != PP_OK) |
| 425 return ReportError("FileIO::Write", rv); | 453 return ReportError("FileIO::Write", rv); |
| 426 } | 454 } |
| 427 | 455 |
| 428 // Abort |Open()|. | 456 // Abort |Open()|. |
| 429 { | 457 { |
| 430 callback.reset_run_count(); | 458 callback.reset_run_count(); |
| 431 rv = pp::FileIO_Dev(instance_) | 459 rv = pp::FileIO_Dev(instance_) |
| 432 .Open(file_ref, PP_FILEOPENFLAG_READ,callback); | 460 .Open(file_ref, PP_FILEOPENFLAG_READ,callback); |
| 461 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 462 return ReportError("FileIO::Open force_async", rv); |
| 433 if (callback.run_count() > 0) | 463 if (callback.run_count() > 0) |
| 434 return "FileIO::Open ran callback synchronously."; | 464 return "FileIO::Open ran callback synchronously."; |
| 435 if (rv == PP_OK_COMPLETIONPENDING) { | 465 if (rv == PP_OK_COMPLETIONPENDING) { |
| 436 rv = callback.WaitForResult(); | 466 rv = callback.WaitForResult(); |
| 437 if (rv != PP_ERROR_ABORTED) | 467 if (rv != PP_ERROR_ABORTED) |
| 438 return "FileIO::Open not aborted."; | 468 return "FileIO::Open not aborted."; |
| 439 } else if (rv != PP_OK) { | 469 } else if (rv != PP_OK) { |
| 440 return ReportError("FileIO::Open", rv); | 470 return ReportError("FileIO::Open", rv); |
| 441 } | 471 } |
| 442 } | 472 } |
| 443 | 473 |
| 444 // Abort |Query()|. | 474 // Abort |Query()|. |
| 445 { | 475 { |
| 446 PP_FileInfo_Dev info = { 0 }; | 476 PP_FileInfo_Dev info = { 0 }; |
| 447 { | 477 { |
| 448 pp::FileIO_Dev file_io(instance_); | 478 pp::FileIO_Dev file_io(instance_); |
| 449 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); | 479 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); |
| 480 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 481 return ReportError("FileIO::Open force_async", rv); |
| 450 if (rv == PP_OK_COMPLETIONPENDING) | 482 if (rv == PP_OK_COMPLETIONPENDING) |
| 451 rv = callback.WaitForResult(); | 483 rv = callback.WaitForResult(); |
| 452 if (rv != PP_OK) | 484 if (rv != PP_OK) |
| 453 return ReportError("FileIO::Open", rv); | 485 return ReportError("FileIO::Open", rv); |
| 454 | 486 |
| 455 callback.reset_run_count(); | 487 callback.reset_run_count(); |
| 456 rv = file_io.Query(&info, callback); | 488 rv = file_io.Query(&info, callback); |
| 489 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 490 return ReportError("FileIO::Query force_async", rv); |
| 457 } // Destroy |file_io|. | 491 } // Destroy |file_io|. |
| 458 if (rv == PP_OK_COMPLETIONPENDING) { | 492 if (rv == PP_OK_COMPLETIONPENDING) { |
| 459 // Save a copy and make sure |info| doesn't get written to. | 493 // Save a copy and make sure |info| doesn't get written to. |
| 460 PP_FileInfo_Dev info_copy; | 494 PP_FileInfo_Dev info_copy; |
| 461 memcpy(&info_copy, &info, sizeof(info)); | 495 memcpy(&info_copy, &info, sizeof(info)); |
| 462 rv = callback.WaitForResult(); | 496 rv = callback.WaitForResult(); |
| 463 if (rv != PP_ERROR_ABORTED) | 497 if (rv != PP_ERROR_ABORTED) |
| 464 return "FileIO::Query not aborted."; | 498 return "FileIO::Query not aborted."; |
| 465 if (memcmp(&info_copy, &info, sizeof(info)) != 0) | 499 if (memcmp(&info_copy, &info, sizeof(info)) != 0) |
| 466 return "FileIO::Query wrote data after resource destruction."; | 500 return "FileIO::Query wrote data after resource destruction."; |
| 467 } else if (rv != PP_OK) { | 501 } else if (rv != PP_OK) { |
| 468 return ReportError("FileIO::Query", rv); | 502 return ReportError("FileIO::Query", rv); |
| 469 } | 503 } |
| 470 } | 504 } |
| 471 | 505 |
| 472 // Abort |Touch()|. | 506 // Abort |Touch()|. |
| 473 { | 507 { |
| 474 { | 508 { |
| 475 pp::FileIO_Dev file_io(instance_); | 509 pp::FileIO_Dev file_io(instance_); |
| 476 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_WRITE, callback); | 510 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_WRITE, callback); |
| 511 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 512 return ReportError("FileIO::Open force_async", rv); |
| 477 if (rv == PP_OK_COMPLETIONPENDING) | 513 if (rv == PP_OK_COMPLETIONPENDING) |
| 478 rv = callback.WaitForResult(); | 514 rv = callback.WaitForResult(); |
| 479 if (rv != PP_OK) | 515 if (rv != PP_OK) |
| 480 return ReportError("FileIO::Open", rv); | 516 return ReportError("FileIO::Open", rv); |
| 481 | 517 |
| 482 callback.reset_run_count(); | 518 callback.reset_run_count(); |
| 483 rv = file_io.Touch(0, 0, callback); | 519 rv = file_io.Touch(0, 0, callback); |
| 520 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 521 return ReportError("FileIO::Touch force_async", rv); |
| 484 } // Destroy |file_io|. | 522 } // Destroy |file_io|. |
| 485 if (rv == PP_OK_COMPLETIONPENDING) { | 523 if (rv == PP_OK_COMPLETIONPENDING) { |
| 486 rv = callback.WaitForResult(); | 524 rv = callback.WaitForResult(); |
| 487 if (rv != PP_ERROR_ABORTED) | 525 if (rv != PP_ERROR_ABORTED) |
| 488 return "FileIO::Touch not aborted."; | 526 return "FileIO::Touch not aborted."; |
| 489 } else if (rv != PP_OK) { | 527 } else if (rv != PP_OK) { |
| 490 return ReportError("FileIO::Touch", rv); | 528 return ReportError("FileIO::Touch", rv); |
| 491 } | 529 } |
| 492 } | 530 } |
| 493 | 531 |
| 494 // Abort |Read()|. | 532 // Abort |Read()|. |
| 495 { | 533 { |
| 496 char buf[3] = { 0 }; | 534 char buf[3] = { 0 }; |
| 497 { | 535 { |
| 498 pp::FileIO_Dev file_io(instance_); | 536 pp::FileIO_Dev file_io(instance_); |
| 499 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); | 537 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); |
| 538 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 539 return ReportError("FileIO::Open force_async", rv); |
| 500 if (rv == PP_OK_COMPLETIONPENDING) | 540 if (rv == PP_OK_COMPLETIONPENDING) |
| 501 rv = callback.WaitForResult(); | 541 rv = callback.WaitForResult(); |
| 502 if (rv != PP_OK) | 542 if (rv != PP_OK) |
| 503 return ReportError("FileIO::Open", rv); | 543 return ReportError("FileIO::Open", rv); |
| 504 | 544 |
| 505 callback.reset_run_count(); | 545 callback.reset_run_count(); |
| 506 rv = file_io.Read(0, buf, sizeof(buf), callback); | 546 rv = file_io.Read(0, buf, sizeof(buf), callback); |
| 547 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 548 return ReportError("FileIO::Read force_async", rv); |
| 507 } // Destroy |file_io|. | 549 } // Destroy |file_io|. |
| 508 if (rv == PP_OK_COMPLETIONPENDING) { | 550 if (rv == PP_OK_COMPLETIONPENDING) { |
| 509 // Save a copy and make sure |buf| doesn't get written to. | 551 // Save a copy and make sure |buf| doesn't get written to. |
| 510 char buf_copy[3]; | 552 char buf_copy[3]; |
| 511 memcpy(&buf_copy, &buf, sizeof(buf)); | 553 memcpy(&buf_copy, &buf, sizeof(buf)); |
| 512 rv = callback.WaitForResult(); | 554 rv = callback.WaitForResult(); |
| 513 if (rv != PP_ERROR_ABORTED) | 555 if (rv != PP_ERROR_ABORTED) |
| 514 return "FileIO::Read not aborted."; | 556 return "FileIO::Read not aborted."; |
| 515 if (memcmp(&buf_copy, &buf, sizeof(buf)) != 0) | 557 if (memcmp(&buf_copy, &buf, sizeof(buf)) != 0) |
| 516 return "FileIO::Read wrote data after resource destruction."; | 558 return "FileIO::Read wrote data after resource destruction."; |
| 517 } else if (rv != PP_OK) { | 559 } else if (rv != PP_OK) { |
| 518 return ReportError("FileIO::Read", rv); | 560 return ReportError("FileIO::Read", rv); |
| 519 } | 561 } |
| 520 } | 562 } |
| 521 | 563 |
| 522 // Abort |Write()|. | 564 // Abort |Write()|. |
| 523 { | 565 { |
| 524 char buf[3] = { 0 }; | 566 char buf[3] = { 0 }; |
| 525 { | 567 { |
| 526 pp::FileIO_Dev file_io(instance_); | 568 pp::FileIO_Dev file_io(instance_); |
| 527 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); | 569 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); |
| 570 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 571 return ReportError("FileIO::Open force_async", rv); |
| 528 if (rv == PP_OK_COMPLETIONPENDING) | 572 if (rv == PP_OK_COMPLETIONPENDING) |
| 529 rv = callback.WaitForResult(); | 573 rv = callback.WaitForResult(); |
| 530 if (rv != PP_OK) | 574 if (rv != PP_OK) |
| 531 return ReportError("FileIO::Open", rv); | 575 return ReportError("FileIO::Open", rv); |
| 532 | 576 |
| 533 callback.reset_run_count(); | 577 callback.reset_run_count(); |
| 534 rv = file_io.Write(0, buf, sizeof(buf), callback); | 578 rv = file_io.Write(0, buf, sizeof(buf), callback); |
| 579 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 580 return ReportError("FileIO::Write force_async", rv); |
| 535 } // Destroy |file_io|. | 581 } // Destroy |file_io|. |
| 536 if (rv == PP_OK_COMPLETIONPENDING) { | 582 if (rv == PP_OK_COMPLETIONPENDING) { |
| 537 rv = callback.WaitForResult(); | 583 rv = callback.WaitForResult(); |
| 538 if (rv != PP_ERROR_ABORTED) | 584 if (rv != PP_ERROR_ABORTED) |
| 539 return "FileIO::Write not aborted."; | 585 return "FileIO::Write not aborted."; |
| 540 } else if (rv != PP_OK) { | 586 } else if (rv != PP_OK) { |
| 541 return ReportError("FileIO::Write", rv); | 587 return ReportError("FileIO::Write", rv); |
| 542 } | 588 } |
| 543 } | 589 } |
| 544 | 590 |
| 545 // Abort |SetLength()|. | 591 // Abort |SetLength()|. |
| 546 { | 592 { |
| 547 { | 593 { |
| 548 pp::FileIO_Dev file_io(instance_); | 594 pp::FileIO_Dev file_io(instance_); |
| 549 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); | 595 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); |
| 596 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 597 return ReportError("FileIO::Open force_async", rv); |
| 550 if (rv == PP_OK_COMPLETIONPENDING) | 598 if (rv == PP_OK_COMPLETIONPENDING) |
| 551 rv = callback.WaitForResult(); | 599 rv = callback.WaitForResult(); |
| 552 if (rv != PP_OK) | 600 if (rv != PP_OK) |
| 553 return ReportError("FileIO::Open", rv); | 601 return ReportError("FileIO::Open", rv); |
| 554 | 602 |
| 555 callback.reset_run_count(); | 603 callback.reset_run_count(); |
| 556 rv = file_io.SetLength(3, callback); | 604 rv = file_io.SetLength(3, callback); |
| 605 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 606 return ReportError("FileIO::SetLength force_async", rv); |
| 557 } // Destroy |file_io|. | 607 } // Destroy |file_io|. |
| 558 if (rv == PP_OK_COMPLETIONPENDING) { | 608 if (rv == PP_OK_COMPLETIONPENDING) { |
| 559 rv = callback.WaitForResult(); | 609 rv = callback.WaitForResult(); |
| 560 if (rv != PP_ERROR_ABORTED) | 610 if (rv != PP_ERROR_ABORTED) |
| 561 return "FileIO::SetLength not aborted."; | 611 return "FileIO::SetLength not aborted."; |
| 562 } else if (rv != PP_OK) { | 612 } else if (rv != PP_OK) { |
| 563 return ReportError("FileIO::SetLength", rv); | 613 return ReportError("FileIO::SetLength", rv); |
| 564 } | 614 } |
| 565 } | 615 } |
| 566 | 616 |
| 567 // Abort |Flush()|. | 617 // Abort |Flush()|. |
| 568 { | 618 { |
| 569 { | 619 { |
| 570 pp::FileIO_Dev file_io(instance_); | 620 pp::FileIO_Dev file_io(instance_); |
| 571 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); | 621 rv = file_io.Open(file_ref, PP_FILEOPENFLAG_READ, callback); |
| 622 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 623 return ReportError("FileIO::Open force_async", rv); |
| 572 if (rv == PP_OK_COMPLETIONPENDING) | 624 if (rv == PP_OK_COMPLETIONPENDING) |
| 573 rv = callback.WaitForResult(); | 625 rv = callback.WaitForResult(); |
| 574 if (rv != PP_OK) | 626 if (rv != PP_OK) |
| 575 return ReportError("FileIO::Open", rv); | 627 return ReportError("FileIO::Open", rv); |
| 576 | 628 |
| 577 callback.reset_run_count(); | 629 callback.reset_run_count(); |
| 578 rv = file_io.Flush(callback); | 630 rv = file_io.Flush(callback); |
| 631 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 632 return ReportError("FileIO::Flush force_async", rv); |
| 579 } // Destroy |file_io|. | 633 } // Destroy |file_io|. |
| 580 if (rv == PP_OK_COMPLETIONPENDING) { | 634 if (rv == PP_OK_COMPLETIONPENDING) { |
| 581 rv = callback.WaitForResult(); | 635 rv = callback.WaitForResult(); |
| 582 if (rv != PP_ERROR_ABORTED) | 636 if (rv != PP_ERROR_ABORTED) |
| 583 return "FileIO::Flush not aborted."; | 637 return "FileIO::Flush not aborted."; |
| 584 } else if (rv != PP_OK) { | 638 } else if (rv != PP_OK) { |
| 585 return ReportError("FileIO::Flush", rv); | 639 return ReportError("FileIO::Flush", rv); |
| 586 } | 640 } |
| 587 } | 641 } |
| 588 | 642 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 607 for (size_t remains = expectations, end = END_OF_OPEN_EXPECATION_PAIRS; | 661 for (size_t remains = expectations, end = END_OF_OPEN_EXPECATION_PAIRS; |
| 608 end != 0; remains >>= 2, end >>= 2) { | 662 end != 0; remains >>= 2, end >>= 2) { |
| 609 if (!!(remains & 1) == !!(remains & 2)) | 663 if (!!(remains & 1) == !!(remains & 2)) |
| 610 return bad_argument; | 664 return bad_argument; |
| 611 } | 665 } |
| 612 } | 666 } |
| 613 bool create_if_doesnt_exist = !!(expectations & CREATE_IF_DOESNT_EXIST); | 667 bool create_if_doesnt_exist = !!(expectations & CREATE_IF_DOESNT_EXIST); |
| 614 bool open_if_exists = !!(expectations & OPEN_IF_EXISTS); | 668 bool open_if_exists = !!(expectations & OPEN_IF_EXISTS); |
| 615 bool truncate_if_exists = !!(expectations & TRUNCATE_IF_EXISTS); | 669 bool truncate_if_exists = !!(expectations & TRUNCATE_IF_EXISTS); |
| 616 | 670 |
| 617 TestCompletionCallback callback(instance_->pp_instance()); | 671 TestCompletionCallback callback(instance_->pp_instance(), force_async_); |
| 618 pp::FileRef_Dev existent_file_ref( | 672 pp::FileRef_Dev existent_file_ref( |
| 619 *file_system, "/match_open_expectation_existent_non_empty_file"); | 673 *file_system, "/match_open_expectation_existent_non_empty_file"); |
| 620 pp::FileRef_Dev nonexistent_file_ref( | 674 pp::FileRef_Dev nonexistent_file_ref( |
| 621 *file_system, "/match_open_expectation_nonexistent_file"); | 675 *file_system, "/match_open_expectation_nonexistent_file"); |
| 622 | 676 |
| 623 // Setup files for test. | 677 // Setup files for test. |
| 624 { | 678 { |
| 625 int32_t rv = existent_file_ref.Delete(callback); | 679 int32_t rv = existent_file_ref.Delete(callback); |
| 680 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 681 return ReportError("FileRef::Delete force_async", rv); |
| 626 if (rv == PP_OK_COMPLETIONPENDING) | 682 if (rv == PP_OK_COMPLETIONPENDING) |
| 627 rv = callback.WaitForResult(); | 683 rv = callback.WaitForResult(); |
| 628 if (rv != PP_OK && rv != PP_ERROR_FILENOTFOUND) | 684 if (rv != PP_OK && rv != PP_ERROR_FILENOTFOUND) |
| 629 return ReportError("FileRef::Delete", rv); | 685 return ReportError("FileRef::Delete", rv); |
| 630 | 686 |
| 631 rv = nonexistent_file_ref.Delete(callback); | 687 rv = nonexistent_file_ref.Delete(callback); |
| 688 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 689 return ReportError("FileRef::Delete force_async", rv); |
| 632 if (rv == PP_OK_COMPLETIONPENDING) | 690 if (rv == PP_OK_COMPLETIONPENDING) |
| 633 rv = callback.WaitForResult(); | 691 rv = callback.WaitForResult(); |
| 634 if (rv != PP_OK && rv != PP_ERROR_FILENOTFOUND) | 692 if (rv != PP_OK && rv != PP_ERROR_FILENOTFOUND) |
| 635 return ReportError("FileRef::Delete", rv); | 693 return ReportError("FileRef::Delete", rv); |
| 636 | 694 |
| 637 pp::FileIO_Dev existent_file_io(instance_); | 695 pp::FileIO_Dev existent_file_io(instance_); |
| 638 rv = existent_file_io.Open(existent_file_ref, | 696 rv = existent_file_io.Open(existent_file_ref, |
| 639 PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, | 697 PP_FILEOPENFLAG_CREATE | PP_FILEOPENFLAG_WRITE, |
| 640 callback); | 698 callback); |
| 699 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 700 return ReportError("FileIO::Open force_async", rv); |
| 641 if (rv == PP_OK_COMPLETIONPENDING) | 701 if (rv == PP_OK_COMPLETIONPENDING) |
| 642 rv = callback.WaitForResult(); | 702 rv = callback.WaitForResult(); |
| 643 if (rv != PP_OK) | 703 if (rv != PP_OK) |
| 644 return ReportError("FileIO::Open", rv); | 704 return ReportError("FileIO::Open", rv); |
| 645 | 705 |
| 646 rv = WriteEntireBuffer(instance_->pp_instance(), &existent_file_io, 0, | 706 rv = WriteEntireBuffer(instance_->pp_instance(), &existent_file_io, 0, |
| 647 "foobar"); | 707 "foobar"); |
| 648 if (rv != PP_OK) | 708 if (rv != PP_OK) |
| 649 return ReportError("FileIO::Write", rv); | 709 return ReportError("FileIO::Write", rv); |
| 650 } | 710 } |
| 651 | 711 |
| 652 pp::FileIO_Dev existent_file_io(instance_); | 712 pp::FileIO_Dev existent_file_io(instance_); |
| 653 int32_t rv = existent_file_io.Open(existent_file_ref, open_flags, callback); | 713 int32_t rv = existent_file_io.Open(existent_file_ref, open_flags, callback); |
| 714 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 715 return ReportError("FileIO::Open force_async", rv); |
| 654 if (rv == PP_OK_COMPLETIONPENDING) | 716 if (rv == PP_OK_COMPLETIONPENDING) |
| 655 rv = callback.WaitForResult(); | 717 rv = callback.WaitForResult(); |
| 656 if ((invalid_combination && rv == PP_OK) || | 718 if ((invalid_combination && rv == PP_OK) || |
| 657 (!invalid_combination && ((rv == PP_OK) != open_if_exists))) { | 719 (!invalid_combination && ((rv == PP_OK) != open_if_exists))) { |
| 658 return ReportOpenError(open_flags); | 720 return ReportOpenError(open_flags); |
| 659 } | 721 } |
| 660 | 722 |
| 661 if (!invalid_combination && open_if_exists) { | 723 if (!invalid_combination && open_if_exists) { |
| 662 PP_FileInfo_Dev info; | 724 PP_FileInfo_Dev info; |
| 663 rv = existent_file_io.Query(&info, callback); | 725 rv = existent_file_io.Query(&info, callback); |
| 726 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 727 return ReportError("FileIO::Query force_async", rv); |
| 664 if (rv == PP_OK_COMPLETIONPENDING) | 728 if (rv == PP_OK_COMPLETIONPENDING) |
| 665 rv = callback.WaitForResult(); | 729 rv = callback.WaitForResult(); |
| 666 if (rv != PP_OK) | 730 if (rv != PP_OK) |
| 667 return ReportError("FileIO::Query", rv); | 731 return ReportError("FileIO::Query", rv); |
| 668 | 732 |
| 669 if (truncate_if_exists != (info.size == 0)) | 733 if (truncate_if_exists != (info.size == 0)) |
| 670 return ReportOpenError(open_flags); | 734 return ReportOpenError(open_flags); |
| 671 } | 735 } |
| 672 | 736 |
| 673 pp::FileIO_Dev nonexistent_file_io(instance_); | 737 pp::FileIO_Dev nonexistent_file_io(instance_); |
| 674 rv = nonexistent_file_io.Open(nonexistent_file_ref, open_flags, callback); | 738 rv = nonexistent_file_io.Open(nonexistent_file_ref, open_flags, callback); |
| 739 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) |
| 740 return ReportError("FileIO::Open force_async", rv); |
| 675 if (rv == PP_OK_COMPLETIONPENDING) | 741 if (rv == PP_OK_COMPLETIONPENDING) |
| 676 rv = callback.WaitForResult(); | 742 rv = callback.WaitForResult(); |
| 677 if ((invalid_combination && rv == PP_OK) || | 743 if ((invalid_combination && rv == PP_OK) || |
| 678 (!invalid_combination && ((rv == PP_OK) != create_if_doesnt_exist))) { | 744 (!invalid_combination && ((rv == PP_OK) != create_if_doesnt_exist))) { |
| 679 return ReportOpenError(open_flags); | 745 return ReportOpenError(open_flags); |
| 680 } | 746 } |
| 681 | 747 |
| 682 return std::string(); | 748 return std::string(); |
| 683 } | 749 } |
| 684 | 750 |
| 685 // TODO(viettrungluu): Test Close(). crbug.com/69457 | 751 // TODO(viettrungluu): Test Close(). crbug.com/69457 |
| OLD | NEW |